diff --git a/.gitignore b/.gitignore index 8a1de9a..f105172 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.css.d.ts .rpt2_cache +node_modules diff --git a/dist/pinch-zoom-min.js b/dist/pinch-zoom-min.js index c2eb976..0e7260c 100644 --- a/dist/pinch-zoom-min.js +++ b/dist/pinch-zoom-min.js @@ -1 +1 @@ -!function(){"use strict";!function(){class t{constructor(t){this.id=-1,this.nativePointer=t,this.pageX=t.pageX,this.pageY=t.pageY,this.clientX=t.clientX,this.clientY=t.clientY,self.Touch&&t instanceof Touch?this.id=t.identifier:e(t)&&(this.id=t.pointerId)}getCoalesced(){return"getCoalescedEvents"in this.nativePointer?this.nativePointer.getCoalescedEvents().map(e=>new t(e)):[this]}}const e=t=>self.PointerEvent&&t instanceof PointerEvent,n=()=>{};class i{constructor(t,e){this._element=t,this.startPointers=[],this.currentPointers=[];const{start:i=(()=>!0),move:s=n,end:r=n}=e;this._startCallback=i,this._moveCallback=s,this._endCallback=r,this._pointerStart=this._pointerStart.bind(this),this._touchStart=this._touchStart.bind(this),this._move=this._move.bind(this),this._triggerPointerEnd=this._triggerPointerEnd.bind(this),this._pointerEnd=this._pointerEnd.bind(this),this._touchEnd=this._touchEnd.bind(this),self.PointerEvent?this._element.addEventListener("pointerdown",this._pointerStart):(this._element.addEventListener("mousedown",this._pointerStart),this._element.addEventListener("touchstart",this._touchStart),this._element.addEventListener("touchmove",this._move),this._element.addEventListener("touchend",this._touchEnd))}_triggerPointerStart(t,e){return!!this._startCallback(t,e)&&(this.currentPointers.push(t),this.startPointers.push(t),!0)}_pointerStart(n){0===n.button&&this._triggerPointerStart(new t(n),n)&&(e(n)?(this._element.setPointerCapture(n.pointerId),this._element.addEventListener("pointermove",this._move),this._element.addEventListener("pointerup",this._pointerEnd)):(window.addEventListener("mousemove",this._move),window.addEventListener("mouseup",this._pointerEnd)))}_touchStart(e){for(const n of Array.from(e.changedTouches))this._triggerPointerStart(new t(n),e)}_move(e){const n=this.currentPointers.slice(),i="changedTouches"in e?Array.from(e.changedTouches).map(e=>new t(e)):[new t(e)],s=[];for(const t of i){const e=this.currentPointers.findIndex(e=>e.id===t.id);-1!==e&&(s.push(t),this.currentPointers[e]=t)}0!==s.length&&this._moveCallback(n,s,e)}_triggerPointerEnd(t,e){const n=this.currentPointers.findIndex(e=>e.id===t.id);return-1!==n&&(this.currentPointers.splice(n,1),this.startPointers.splice(n,1),this._endCallback(t,e),!0)}_pointerEnd(n){if(this._triggerPointerEnd(new t(n),n))if(e(n)){if(this.currentPointers.length)return;this._element.removeEventListener("pointermove",this._move),this._element.removeEventListener("pointerup",this._pointerEnd)}else window.removeEventListener("mousemove",this._move),window.removeEventListener("mouseup",this._pointerEnd)}_touchEnd(e){for(const n of Array.from(e.changedTouches))this._triggerPointerEnd(new t(n),e)}}!function(t,e){void 0===e&&(e={});var n=e.insertAt;if(t&&"undefined"!=typeof document){var i=document.head||document.getElementsByTagName("head")[0],s=document.createElement("style");s.type="text/css","top"===n&&i.firstChild?i.insertBefore(s,i.firstChild):i.appendChild(s),s.styleSheet?s.styleSheet.cssText=t:s.appendChild(document.createTextNode(t))}}("pinch-zoom {\n display: block;\n overflow: hidden;\n touch-action: none;\n --scale: 1;\n --x: 0;\n --y: 0;\n}\n\npinch-zoom > * {\n transform: translate(var(--x), var(--y)) scale(var(--scale));\n transform-origin: 0 0;\n will-change: transform;\n}\n");const s="min-scale",r="allow-pan-min-scale",o="reset-to-min-scale-limit",a="reach-min-scale-strategy",h="stop-propagate-handled",l="none";function c(t,e){return e?Math.sqrt((e.clientX-t.clientX)**2+(e.clientY-t.clientY)**2):0}function d(t,e){return e?{clientX:(t.clientX+e.clientX)/2,clientY:(t.clientY+e.clientY)/2}:t}function u(t,e){return"number"==typeof t?t:t.trimRight().endsWith("%")?e*parseFloat(t)/100:parseFloat(t)}let g;function p(){return g||(g=document.createElementNS("http://www.w3.org/2000/svg","svg"))}function m(){return p().createSVGMatrix()}function _(){return p().createSVGPoint()}const f=.01,v=-1,E=-1,P=0,y=(t,e)=>Math.round(100*t)-Math.round(100*e);class w extends HTMLElement{constructor(){super(),this._transform=m(),new MutationObserver(()=>this._stageElChange()).observe(this,{childList:!0});const t=new i(this,{start:(e,n)=>{if(2===t.currentPointers.length||!this._positioningEl)return!1;const i=t.currentPointers.length+1===1;return!(i&&!this._allowPan())&&(this._maybeStopPropagate(n),i||this._maybeEmitCancel([e,...t.currentPointers])),n.preventDefault(),!0},move:(e,n,i)=>{this._onPointerMove(e,t.currentPointers,i)},end:(e,n)=>{this._onPointerEnd(e,t.currentPointers,n)}});this.addEventListener("wheel",t=>this._onWheel(t)),this.addEventListener("click",e=>this._onClick(e,t))}static get observedAttributes(){return[s]}attributeChangedCallback(t,e,n){t===s&&this.scaler.width?i+=r.width-a.x:h.x<0&&(i+=-h.x),a.y>r.height?s+=r.height-a.y:h.y<0&&(s+=-h.y),this._updateTransform(e,i,s,n)}_updateTransform(t,e,n,i){if(t1&&console.warn(" must not have more than one child."),this.setTransform({allowChangeEvent:!0}))}_onWheel(t){if(!this._positioningEl)return;t.preventDefault();const e=this._positioningEl.getBoundingClientRect();let{deltaY:n}=t;const{ctrlKey:i,deltaMode:s}=t;1===s&&(n*=15);const r=1-n/(i?100:300),o=r<1;this._applyChange({scaleDiff:r,originX:t.clientX-e.left,originY:t.clientY-e.top,allowChangeEvent:!0}),o&&this._maybeResetScale()}_onPointerMove(t,e,n){if(!this._positioningEl)return;if(t.length<2&&!this._allowPan())return;const i=this._positioningEl.getBoundingClientRect(),s=d(t[0],t[1]),r=d(e[0],e[1]),o=s.clientX-i.left,a=s.clientY-i.top,h=c(t[0],t[1]),l=c(e[0],e[1]),u=h?l/h:1;this._applyChange({originX:o,originY:a,scaleDiff:u,panX:r.clientX-s.clientX,panY:r.clientY-s.clientY,allowChangeEvent:!0}),this._maybeStopPropagate(n)}_maybeResetScale(){y(this.scale,this.resetToMinScaleLimit)<=0&&this._resetToMinScale()}_onPointerEnd(t,e,n){if(!this._positioningEl)return;const i=1+e.length,s=1==i;i>=2&&this._maybeResetScale(),s&&!this._allowPan()||this._maybeStopPropagate(n)}_resetToMinScale(){"reset"===this.reachMinScaleStrategy?this.setTransform({scale:this.minScale,x:0,y:0}):this.setTransform({scale:this.minScale})}_applyChange(t={}){const{panX:e=0,panY:n=0,originX:i=0,originY:s=0,scaleDiff:r=1,allowChangeEvent:o=!1}=t,a=m().translate(e,n).translate(i,s).translate(this.x,this.y).scale(r).translate(-i,-s).scale(this.scale);this.setTransform({allowChangeEvent:o,scale:a.a,x:a.e,y:a.f})}_maybeStopPropagate(t){this.stopPropagateHandled&&t.stopPropagation()}_allowPan(){return this.allowPanMinScale>0&&y(this.scale,this.allowPanMinScale)>0}_maybeEmitCancel(t){this.stopPropagateHandled&&t.forEach(t=>{this.parentElement&&"function"==typeof this.parentElement.dispatchEvent&&this.parentElement.dispatchEvent((t=>new PointerEvent("pointercancel",{pointerId:t.id,clientX:t.clientX,clientY:t.clientY}))(t))})}_onClick(t,e){if(t.button!==P)return;!(0===e.currentPointers.length&&!this._allowPan())&&this._maybeStopPropagate(t)}}customElements.define("pinch-zoom",w)}()}(); +!function(){"use strict";!function(){class t{constructor(t){this.id=-1,this.nativePointer=t,this.pageX=t.pageX,this.pageY=t.pageY,this.clientX=t.clientX,this.clientY=t.clientY,self.Touch&&t instanceof Touch?this.id=t.identifier:e(t)&&(this.id=t.pointerId)}getCoalesced(){return"getCoalescedEvents"in this.nativePointer?this.nativePointer.getCoalescedEvents().map(e=>new t(e)):[this]}}const e=t=>self.PointerEvent&&t instanceof PointerEvent,i=()=>{};class n{constructor(t,e){this._element=t,this.startPointers=[],this.currentPointers=[];const{start:n=(()=>!0),move:s=i,end:r=i}=e;this._startCallback=n,this._moveCallback=s,this._endCallback=r,this._pointerStart=this._pointerStart.bind(this),this._touchStart=this._touchStart.bind(this),this._move=this._move.bind(this),this._triggerPointerEnd=this._triggerPointerEnd.bind(this),this._pointerEnd=this._pointerEnd.bind(this),this._touchEnd=this._touchEnd.bind(this),self.PointerEvent?this._element.addEventListener("pointerdown",this._pointerStart):(this._element.addEventListener("mousedown",this._pointerStart),this._element.addEventListener("touchstart",this._touchStart),this._element.addEventListener("touchmove",this._move),this._element.addEventListener("touchend",this._touchEnd))}_triggerPointerStart(t,e){return!!this._startCallback(t,e)&&(this.currentPointers.push(t),this.startPointers.push(t),!0)}_pointerStart(i){0===i.button&&this._triggerPointerStart(new t(i),i)&&(e(i)?(this._element.setPointerCapture(i.pointerId),this._element.addEventListener("pointermove",this._move),this._element.addEventListener("pointerup",this._pointerEnd)):(window.addEventListener("mousemove",this._move),window.addEventListener("mouseup",this._pointerEnd)))}_touchStart(e){for(const i of Array.from(e.changedTouches))this._triggerPointerStart(new t(i),e)}_move(e){const i=this.currentPointers.slice(),n="changedTouches"in e?Array.from(e.changedTouches).map(e=>new t(e)):[new t(e)],s=[];for(const t of n){const e=this.currentPointers.findIndex(e=>e.id===t.id);-1!==e&&(s.push(t),this.currentPointers[e]=t)}0!==s.length&&this._moveCallback(i,s,e)}_triggerPointerEnd(t,e){const i=this.currentPointers.findIndex(e=>e.id===t.id);return-1!==i&&(this.currentPointers.splice(i,1),this.startPointers.splice(i,1),this._endCallback(t,e),!0)}_pointerEnd(i){if(this._triggerPointerEnd(new t(i),i))if(e(i)){if(this.currentPointers.length)return;this._element.removeEventListener("pointermove",this._move),this._element.removeEventListener("pointerup",this._pointerEnd)}else window.removeEventListener("mousemove",this._move),window.removeEventListener("mouseup",this._pointerEnd)}_touchEnd(e){for(const i of Array.from(e.changedTouches))this._triggerPointerEnd(new t(i),e)}}const s="min-scale",r="allow-pan-min-scale",o="reset-to-min-scale-limit",a="reach-min-scale-strategy",h="stop-propagate-handled",l="none";function c(t,e){return e?Math.sqrt((e.clientX-t.clientX)**2+(e.clientY-t.clientY)**2):0}function g(t,e){return e?{clientX:(t.clientX+e.clientX)/2,clientY:(t.clientY+e.clientY)/2}:t}function d(t,e){return"number"==typeof t?t:t.trimRight().endsWith("%")?e*parseFloat(t)/100:parseFloat(t)}let u;function p(){return u||(u=document.createElementNS("http://www.w3.org/2000/svg","svg"))}function m(){return p().createSVGMatrix()}function _(){return p().createSVGPoint()}const f=.01,E=-1,v=-1,P=0,w=(t,e)=>Math.round(100*t)-Math.round(100*e);class b extends HTMLElement{constructor(){super(),this._transform=m(),new MutationObserver(()=>this._stageElChange()).observe(this,{childList:!0});const t=new n(this,{start:(e,i)=>{if(2===t.currentPointers.length||!this._positioningEl)return!1;const n=t.currentPointers.length+1===1;return!(n&&!this._allowPan())&&(this._maybeStopPropagate(i),n||this._maybeEmitCancel([e,...t.currentPointers])),i.preventDefault(),!0},move:(e,i,n)=>{this._onPointerMove(e,t.currentPointers,n)},end:(e,i)=>{this._onPointerEnd(e,t.currentPointers,i)}});this.addEventListener("wheel",t=>this._onWheel(t)),this.addEventListener("click",e=>this._onClick(e,t))}static get observedAttributes(){return[s]}attributeChangedCallback(t,e,i){t===s&&this.scaler.width?n+=r.width-a.x:h.x<0&&(n+=-h.x),a.y>r.height?s+=r.height-a.y:h.y<0&&(s+=-h.y),this._updateTransform(e,n,s,i)}_updateTransform(t,e,i,n){if(t1&&console.warn(" must not have more than one child."),this.setTransform({allowChangeEvent:!0}))}_onWheel(t){if(!this._positioningEl)return;t.preventDefault();const e=this._positioningEl.getBoundingClientRect();let{deltaY:i}=t;const{ctrlKey:n,deltaMode:s}=t;1===s&&(i*=15);const r=1-i/(n?100:300),o=r<1;this._applyChange({scaleDiff:r,originX:t.clientX-e.left,originY:t.clientY-e.top,allowChangeEvent:!0}),o&&this._maybeResetScale()}_onPointerMove(t,e,i){if(!this._positioningEl)return;if(t.length<2&&!this._allowPan())return;const n=this._positioningEl.getBoundingClientRect(),s=g(t[0],t[1]),r=g(e[0],e[1]),o=s.clientX-n.left,a=s.clientY-n.top,h=c(t[0],t[1]),l=c(e[0],e[1]),d=h?l/h:1;this._applyChange({originX:o,originY:a,scaleDiff:d,panX:r.clientX-s.clientX,panY:r.clientY-s.clientY,allowChangeEvent:!0}),this._maybeStopPropagate(i)}_maybeResetScale(){w(this.scale,this.resetToMinScaleLimit)<=0&&this._resetToMinScale()}_onPointerEnd(t,e,i){if(!this._positioningEl)return;const n=1+e.length,s=1==n;n>=2&&this._maybeResetScale(),s&&!this._allowPan()||this._maybeStopPropagate(i)}_resetToMinScale(){"reset"===this.reachMinScaleStrategy?this.setTransform({scale:this.minScale,x:0,y:0}):this.setTransform({scale:this.minScale})}_applyChange(t={}){const{panX:e=0,panY:i=0,originX:n=0,originY:s=0,scaleDiff:r=1,allowChangeEvent:o=!1}=t,a=m().translate(e,i).translate(n,s).translate(this.x,this.y).scale(r).translate(-n,-s).scale(this.scale);this.setTransform({allowChangeEvent:o,scale:a.a,x:a.e,y:a.f})}_maybeStopPropagate(t){this.stopPropagateHandled&&t.stopPropagation()}_allowPan(){return this.allowPanMinScale>0&&w(this.scale,this.allowPanMinScale)>0}_maybeEmitCancel(t){this.stopPropagateHandled&&t.forEach(t=>{this.parentElement&&"function"==typeof this.parentElement.dispatchEvent&&this.parentElement.dispatchEvent((t=>new PointerEvent("pointercancel",{pointerId:t.id,clientX:t.clientX,clientY:t.clientY}))(t))})}_onClick(t,e){if(t.button!==P)return;!(0===e.currentPointers.length&&!this._allowPan())&&this._maybeStopPropagate(t)}}customElements.define("pinch-zoom",b)}()}(); diff --git a/dist/pinch-zoom.css b/dist/pinch-zoom.css new file mode 100644 index 0000000..83668f1 --- /dev/null +++ b/dist/pinch-zoom.css @@ -0,0 +1,14 @@ +pinch-zoom { + display: block; + overflow: hidden; + touch-action: none; + --scale: 1; + --x: 0; + --y: 0; +} + +pinch-zoom > * { + transform: translate(var(--x), var(--y)) scale(var(--scale)); + transform-origin: 0 0; + will-change: transform; +} diff --git a/dist/pinch-zoom.js b/dist/pinch-zoom.js index 5213e14..6a78145 100644 --- a/dist/pinch-zoom.js +++ b/dist/pinch-zoom.js @@ -185,36 +185,6 @@ var PinchZoom = (function () { } } - function styleInject(css, ref) { - if ( ref === void 0 ) ref = {}; - var insertAt = ref.insertAt; - - if (!css || typeof document === 'undefined') { return; } - - var head = document.head || document.getElementsByTagName('head')[0]; - var style = document.createElement('style'); - style.type = 'text/css'; - - if (insertAt === 'top') { - if (head.firstChild) { - head.insertBefore(style, head.firstChild); - } else { - head.appendChild(style); - } - } else { - head.appendChild(style); - } - - if (style.styleSheet) { - style.styleSheet.cssText = css; - } else { - style.appendChild(document.createTextNode(css)); - } - } - - var css = "pinch-zoom {\n display: block;\n overflow: hidden;\n touch-action: none;\n --scale: 1;\n --x: 0;\n --y: 0;\n}\n\npinch-zoom > * {\n transform: translate(var(--x), var(--y)) scale(var(--scale));\n transform-origin: 0 0;\n will-change: transform;\n}\n"; - styleInject(css); - const minScaleAttr = 'min-scale'; const allowPanMinScaleAttr = 'allow-pan-min-scale'; const resetToMinScaleLimitAttr = 'reset-to-min-scale-limit'; diff --git a/dist/pinch-zoom.mjs b/dist/pinch-zoom.mjs index 8f9fe93..389fb28 100644 --- a/dist/pinch-zoom.mjs +++ b/dist/pinch-zoom.mjs @@ -1,35 +1,5 @@ import PointerTracker from 'pointer-tracker'; -function styleInject(css, ref) { - if ( ref === void 0 ) ref = {}; - var insertAt = ref.insertAt; - - if (!css || typeof document === 'undefined') { return; } - - var head = document.head || document.getElementsByTagName('head')[0]; - var style = document.createElement('style'); - style.type = 'text/css'; - - if (insertAt === 'top') { - if (head.firstChild) { - head.insertBefore(style, head.firstChild); - } else { - head.appendChild(style); - } - } else { - head.appendChild(style); - } - - if (style.styleSheet) { - style.styleSheet.cssText = css; - } else { - style.appendChild(document.createTextNode(css)); - } -} - -var css = "pinch-zoom {\n display: block;\n overflow: hidden;\n touch-action: none;\n --scale: 1;\n --x: 0;\n --y: 0;\n}\n\npinch-zoom > * {\n transform: translate(var(--x), var(--y)) scale(var(--scale));\n transform-origin: 0 0;\n will-change: transform;\n}\n"; -styleInject(css); - const minScaleAttr = 'min-scale'; const allowPanMinScaleAttr = 'allow-pan-min-scale'; const resetToMinScaleLimitAttr = 'reset-to-min-scale-limit'; diff --git a/rollup.config.js b/rollup.config.js index 2bbce20..fe2e18a 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -7,7 +7,7 @@ import { dependencies } from './package.json'; const mjs = { plugins: [ typescript({ useTsconfigDeclarationDir: false }), - postcss() + postcss({ extract: 'dist/pinch-zoom.css' }) ], external: Object.keys(dependencies), input: 'lib/index.ts',