pointeract 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  <br>
6
6
  </h1>
7
7
 
8
- <h4 align="center"> Modern, lightweight, robust and extensible user interaction resolver </h4>
8
+ <h4 align="center"> modern, lightweight, robust and extensible user gesture recognizer </h4>
9
9
 
10
10
  <p align="center">
11
11
  <a href="https://github.com/hesprs/pointeract/actions">
@@ -72,26 +72,17 @@ $ pnpm add pointeract
72
72
 
73
73
  # yarn
74
74
  $ yarn add pointeract
75
-
76
- # bun
77
- $ bun add pointeract
78
75
  ```
79
76
 
80
77
  Or include the following lines directly in your HTML file:
81
78
 
82
79
  ```html
83
80
  <script type="module">
84
- import { Pointeract } from 'https://unpkg.com/pointeract/dist/index.js';
81
+ import { Pointeract } from 'https://unpkg.com/pointeract';
85
82
  </script>
86
83
  ```
87
84
 
88
- This link ships the latest ESM version by default, to access CJS version or earlier versions, try using a different URL like:
89
-
90
- ```html
91
- <script src="https://unpkg.com/pointeract@1.0.1/dist/index.cjs"></script>
92
- ```
93
-
94
- The link above ships version 1.0.1 in CJS.
85
+ This link ships the latest ESM version by default.
95
86
 
96
87
  Then simply grab the core class and a module:
97
88
 
@@ -124,15 +115,15 @@ Missing your desired interaction? [Write your own module](https://pointeract.con
124
115
 
125
116
  There're already plenty of interaction libraries out there, most famous ones are `Interact.js` and `Hammer.js`, but Pointeract is different.
126
117
 
127
- | Criteria | Pointeract | [Hammer.js](https://hammerjs.github.io) | [Interact.js](https://interactjs.io) |
128
- | :--------------------------------------------------------------------------------------- | :---------------------------------------------------: | :----------------------------------------------: | :-------------------------------------------------: |
129
- | Written in TypeScript? | ✅ | ❌ | ✅ |
130
- | Tree-shakeable? | [✅](https://bundlephobia.com/package/pointeract) | [❌](https://bundlephobia.com/package/hammerjs) | [❌](https://bundlephobia.com/package/interactjs) |
131
- | Bundle Size (Minified + Gzipped) | 👑 [3KB](https://bundlephobia.com/package/pointeract) | [7KB](https://bundlephobia.com/package/hammerjs) | [28KB](https://bundlephobia.com/package/interactjs) |
132
- | Last Updated | 👑 Actively Maintained | 2015 | 2023 |
133
- | Features | Pointer and Wheel Related | Pointer Related | 👑 Pointer and Wheel Related + Comprehensive Utils |
134
- | Robust? (See [Testing](https://pointeract.consensia.cc/development/testing#monkey-test)) | ✅ | ❌ Element Jerks | ❌ Element Ignores the Second Touch |
135
- | Extensible? | ✅ | ❌ | ❌ |
118
+ | Criteria | Pointeract | [Hammer.js](https://hammerjs.github.io) | [Interact.js](https://interactjs.io) |
119
+ | :-------------------------------------------------------- | :---------------------------------------------------: | :----------------------------------------------: | :-------------------------------------------------: |
120
+ | Written in TypeScript? | ✅ | ❌ | ✅ |
121
+ | Tree-shakeable? | [✅](https://bundlephobia.com/package/pointeract) | [❌](https://bundlephobia.com/package/hammerjs) | [❌](https://bundlephobia.com/package/interactjs) |
122
+ | Total Bundle Size (Minified + Gzipped) | 👑 [3KB](https://bundlephobia.com/package/pointeract) | [7KB](https://bundlephobia.com/package/hammerjs) | [28KB](https://bundlephobia.com/package/interactjs) |
123
+ | Last Updated | 👑 Actively Maintained | 2015 | 2023 |
124
+ | Features | Pointer and Wheel Related + Some Utils | Pointer Related | 👑 Pointer and Wheel Related + Comprehensive Utils |
125
+ | Robust? (See [Testing](/development/testing#monkey-test)) | ✅ | ❌ Element Jerks | ❌ Element Ignores the Second Touch |
126
+ | Extensible? | ✅ | ❌ | ❌ |
136
127
 
137
128
  ## Get Involved
138
129
 
@@ -1,2 +1,2 @@
1
1
  class t{constructor(t,e,i,s,o){this.window=e,this.pointers=i,this.element=s,this.getNthPointer=t.getNthPointer,this.toTargetCoords=t.toTargetCoords,this.augment=t.augment,this.dispatch=t.dispatch,this.options=o}getNthPointer;toTargetCoords;augment;dispatch;options;onPointerDown;onPointerUp;onPointerMove;onWheel;onStart;onStop;dispose;modifiers}function e(t,e=0){return t[t.length-1-e]}function i(t){return Array.isArray(t)?t:[t]}class s extends t{#t=-1/0;#e=0;onPointerDown=(t,e,i)=>{if(2===i.size){this.getNthPointer(0).interrupted=!0,e.interrupted=!0}};onPointerUp=(t,i)=>{if(i.interrupted)return;const s=this.options.moveThreshold??5;if(Math.abs(i.records[0].x-t.clientX)>=s||Math.abs(i.records[0].y-t.clientY)>=s)return;const o=e(i.records).timestamp,n=this.options.clickPreserveTime??400;o-this.#t<=n?this.#e++:this.#e=1,this.#t=o;const r=this.toTargetCoords({x:t.clientX,y:t.clientY});this.dispatch("trueClick",{...r,target:i.target,streak:this.#e})}}class o extends t{onPointerMove=(t,i,s)=>{const o=e(i.records,1);if(1===s.size){const e=t.clientX-o.x,i=t.clientY-o.y;this.dispatch("drag",{deltaX:e,deltaY:i,x:t.clientX,y:t.clientY})}}}class n extends t{#i={lastDistance:0,lastMidpoint:{x:0,y:0}};#s(){const t=e(this.getNthPointer(0).records),i=e(this.getNthPointer(1).records),s=t.x-i.x,o=t.y-i.y;return Math.sqrt(s*s+o*o)}#o(){const t=e(this.getNthPointer(0).records),i=e(this.getNthPointer(1).records);return{x:(t.x+i.x)/2,y:(t.y+i.y)/2}}onPointerDown=(t,e,i)=>{2===i.size&&(this.#i.lastDistance=this.#s(),this.#i.lastMidpoint=this.toTargetCoords(this.#o()))};onPointerMove=(t,e,i)=>{if(2===i.size){const t=this.#s(),e=this.#o(),i=t/this.#i.lastDistance;this.#i.lastDistance=t;const s=this.toTargetCoords(e),o=s.x-this.#i.lastMidpoint.x,n=s.y-this.#i.lastMidpoint.y;this.#i.lastMidpoint=s,this.#n({deltaX:o,deltaY:n}),this.#r(i,s)}};#r(t,e){this.dispatch("zoom",{x:e.x,y:e.y,factor:t})}#n(t){this.dispatch("pan",t)}}class r extends t{onWheel=t=>t.preventDefault();#a=t=>t.preventDefault();onStart=()=>{this.element.style.touchAction="none",this.element.addEventListener("gesturestart",this.#a,{passive:!1}),this.element.addEventListener("gesturechange",this.#a,{passive:!1})};onStop=()=>{this.element.style.touchAction="",this.element.removeEventListener("gesturestart",this.#a),this.element.removeEventListener("gesturechange",this.#a)};dispose=this.onStop}class a extends t{constructor(...t){super(...t),function(t,e){for(const[i,s]of Object.entries(t))i in e||(e[i]=s)}({proControlSchema:!1,zoomFactor:.1,lockControlSchema:!1},this.options)}onWheel=t=>{const e=this.options;if(e.proControlSchema||e.lockControlSchema||!(t.ctrlKey||t.shiftKey||Math.abs(t.deltaX)>Math.abs(t.deltaY))||(e.proControlSchema=!0),e.proControlSchema)if(t.ctrlKey){const i=1-e.zoomFactor*t.deltaY,s=this.toTargetCoords({x:t.clientX,y:t.clientY});this.#r(i,s)}else t.shiftKey&&Math.abs(t.deltaX)<=Math.abs(t.deltaY)?this.#n({deltaX:-t.deltaY,deltaY:-t.deltaX}):this.#n({deltaX:-t.deltaX,deltaY:-t.deltaY});else{const i=1-e.zoomFactor/20*t.deltaY,s=this.toTargetCoords({x:t.clientX,y:t.clientY});this.#r(i,s)}};#r(t,e){this.dispatch("zoom",{x:e.x,y:e.y,factor:t})}#n(t){this.dispatch("pan",t)}}class h extends t{#h={};#c=null;constructor(...t){super(...t);const e=this.options.lubricator;e&&Object.entries(e).forEach(([t,e])=>{const i={sample:{},fields:{}};Object.keys(e.fields).forEach(t=>{i.fields[t]={catch:1,release:1}}),this.#h[t]=i,this.modifiers[t]=this.#d(i,e)})}onStart=()=>{this.#c=requestAnimationFrame(this.#l)};onStop=()=>{this.#c&&cancelAnimationFrame(this.#c),this.#c=null,Object.values(this.#h).forEach(t=>{Object.values(t.fields).forEach(t=>{t.release=1,t.catch=1})})};#d=(t,e)=>i=>!!i.lubricated||(t.sample=i,this.#p(t.fields,e.fields,i),!1);#p=(t,e,i)=>{Object.entries(t).forEach(([t,s])=>{if("number"!=typeof i[t])return;const o=e[t].countType;"sum"===o?s.catch+=i[t]:"product"===o&&(s.catch*=i[t])})};#l=()=>{const t=this.#h,e=this.options.lubricator;e&&(Object.entries(t).forEach(([t,i])=>{const s=i.sample;s.lubricated=!0;let o=!1;for(const[n,r]of Object.entries(i.fields)){if(1===r.catch)continue;const i=e[t].fields[n].countType;let a,h,c;("sum"===i?(h=r.catch-r.release,a=Math.abs(h)):(h=r.catch/r.release,a=this.#u(h)-1),a<=e[t].fields[n].diminishBoundary)?(o||(o=!0),s[n]=h,r.release=1,r.catch=1):("sum"===i?(c=h*e[t].decayFactor,r.release+=c):(c=Math.pow(h,e[t].decayFactor),r.release*=c),s[n]=c,o=!0)}o&&this.dispatch(t,s)}),this.#c=requestAnimationFrame(this.#l))};#u=t=>t>1?t:1/t;modifiers={}}const c={decayFactor:.25,fields:{deltaX:{countType:"sum",diminishBoundary:.5},deltaY:{countType:"sum",diminishBoundary:.5}}},d=c,l={decayFactor:.25,fields:{factor:{countType:"product",diminishBoundary:.01}}};class p{#m;#f=/* @__PURE__ */new Map;#v={};#w={};#g;#y={};options;get#P(){if(!this.#g)throw new Error("[Pointeract] Window is not defined.");return this.#g}constructor(t,e){const s=i(e||[]);this.#g=t.element.ownerDocument.defaultView,this.#m=t.element,t.coordinateOutput||(t.coordinateOutput="relative"),this.options=t,s.forEach(e=>{const i=new e(this.moduleUtils,this.#P,this.#f,this.#m,this.options);Object.assign(i,{options:t}),this.#v[e.name]=i})}on=(t,e)=>(this.#y[t]||(this.#y[t]=/* @__PURE__ */new Set),this.#y[t]?.add(e),this);off(t,e){return this.#y[t]?.delete(e),this}moduleUtils={getNthPointer:t=>{const e=new Error("[Pointeract] Invalid pointer index.");if(t<0||t>=this.#f.size)throw e;let i=0;for(const s of this.#f.values()){if(i===t)return s;i++}throw e},toTargetCoords:t=>{if("absolute"===this.options.coordinateOutput)return t;const e=this.#m.getBoundingClientRect();return t.x-=e.left,t.y-=e.top,"relative"===this.options.coordinateOutput||(t.x/=e.width,t.y/=e.height),t},dispatch:(...t)=>{const e=t[0],i=t[1];let s,o=!0;for(const n of Object.values(this.#v))if(n.modifiers&&e in n.modifiers&&(o=void 0===i?n.modifiers[e]():n.modifiers[e](i),!1===o))return;s=!0===o?i:o,this.#y[e]?.forEach(t=>t(s))},augment:t=>{Object.entries(t).forEach(([t,e])=>this[t]=e)}};dispatch=this.moduleUtils.dispatch;#b(t,...e){Object.values(this.#v).forEach(i=>{const s=i[t];s&&s(...e)})}#E=t=>{if(this.#f.size>=2)return;t.isPrimary&&this.#f.clear();const e={records:[{x:t.clientX,y:t.clientY,timestamp:Date.now()}],target:t.target};this.#f.set(t.pointerId,e),this.#b("onPointerDown",t,e,this.#f)};#S=t=>{const e=this.#f.get(t.pointerId);e&&(e.records.push({x:t.clientX,y:t.clientY,timestamp:Date.now()}),this.#b("onPointerMove",t,e,this.#f))};#x=t=>{const e=this.#f.get(t.pointerId);e&&(this.#f.delete(t.pointerId),this.#b("onPointerUp",t,e,this.#f))};#M=t=>this.#b("onWheel",t);stop=t=>{const e=t=>{if(!(t.name in this.#v))return;const e=this.#v[t.name];e.onStop&&e.onStop(),this.#w[t.name]=e,delete this.#v[t.name]};return t?i(t).forEach(t=>{e(t)}):(()=>{this.#m.removeEventListener("pointerdown",this.#E),this.#P.removeEventListener("pointermove",this.#S),this.#P.removeEventListener("pointerup",this.#x),this.#m.removeEventListener("wheel",this.#M),this.#b("onStop")})(),this};start=t=>{const e=t=>{if(!(t.name in this.#w))return;const e=this.#w[t.name];e.onStart&&e.onStart(),this.#v[t.name]=e,delete this.#w[t.name]};return t?i(t).forEach(t=>{e(t)}):(()=>{this.#m.addEventListener("pointerdown",this.#E),this.#P.addEventListener("pointermove",this.#S),this.#P.addEventListener("pointerup",this.#x),this.#m.addEventListener("wheel",this.#M,{passive:!1}),this.#b("onStart")})(),this};dispose=()=>{this.stop(),this.#g=null,this.#b("dispose"),this.#y={}}}export{t as BaseModule,s as Click,o as Drag,h as Lubricator,n as MultitouchPanZoom,p as Pointeract,r as PreventDefault,a as WheelPanZoom,d as dragPreset,c as panPreset,l as zoomPreset};
2
- //# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js.js","sources":["../src/baseModule.ts","../src/utils.ts","../src/modules/click.ts","../src/modules/drag.ts","../src/modules/multitouchPanZoom.ts","../src/modules/preventDefault.ts","../src/modules/wheelPanZoom.ts","../src/modules/lubricator.ts","../src/pointeract.ts"],"sourcesContent":["import type {\n\tBaseOptions,\n\tGeneralObject,\n\tPointer,\n\tPointers,\n\tStdEvents,\n\tConstrain,\n} from '@/declarations';\nimport type { Pointeract, PointeractInterface } from '@/pointeract';\n\nexport type HookKeys =\n\t| 'onPointerDown'\n\t| 'onPointerUp'\n\t| 'onPointerMove'\n\t| 'onWheel'\n\t| 'onStart'\n\t| 'onStop'\n\t| 'dispose';\n\nexport type BaseArgs = [\n\tPointeract<[]>['moduleUtils'],\n\tWindow,\n\tPointers,\n\tHTMLElement,\n\tGeneralObject,\n];\n\nexport default class BaseModule<\n\tO extends BaseOptions = BaseOptions,\n\tE extends StdEvents = StdEvents,\n\tA extends {} = {},\n> {\n\tdeclare private static readonly _BaseModuleBrand: unique symbol; // Nominal marker\n\tdeclare readonly _Events: E;\n\tdeclare readonly _Augmentation: A;\n\tprotected getNthPointer: Pointeract<[]>['moduleUtils']['getNthPointer'];\n\tprotected toTargetCoords: Pointeract<[]>['moduleUtils']['toTargetCoords'];\n\tprotected augment: (augmentation: A) => void;\n\tprotected dispatch: <K extends keyof Constrain<E>>(\n\t\t...arg: undefined extends E[K] ? [K] : [K, E[K]]\n\t) => void;\n\toptions: O;\n\tconstructor(\n\t\tutils: PointeractInterface['moduleUtils'],\n\t\tprotected window: Window,\n\t\tprotected pointers: Pointers,\n\t\tprotected element: HTMLElement,\n\t\toptions: GeneralObject,\n\t) {\n\t\tthis.getNthPointer = utils.getNthPointer;\n\t\tthis.toTargetCoords = utils.toTargetCoords;\n\t\tthis.augment = utils.augment;\n\t\tthis.dispatch = utils.dispatch as typeof this.dispatch;\n\t\tthis.options = options;\n\t}\n\n\tonPointerDown?: (...args: [event: PointerEvent, pointer: Pointer, pointers: Pointers]) => void;\n\tonPointerUp?: (...args: [event: PointerEvent, pointer: Pointer, pointers: Pointers]) => void;\n\tonPointerMove?: (...args: [event: PointerEvent, pointer: Pointer, pointers: Pointers]) => void;\n\tonWheel?: (...args: [event: WheelEvent]) => void;\n\tonStart?: () => void;\n\tonStop?: () => void;\n\tdispose?: () => void;\n\tmodifiers?: {\n\t\t[K in keyof Constrain<E>]?: (event: E[K]) => boolean | E[K];\n\t};\n}\n","import { GeneralObject } from '@/declarations';\n\nexport function getLast<T>(arr: Array<T>, num: number = 0) {\n\treturn arr[arr.length - 1 - num];\n}\n\nexport function fillIn(patch: GeneralObject, target: GeneralObject) {\n\tfor (const [k, v] of Object.entries(patch)) if (!(k in target)) target[k] = v;\n}\n\nexport function toArray<T>(toTrans: T | Array<T>) {\n\treturn Array.isArray(toTrans) ? toTrans : [toTrans];\n}\n","import type { BaseOptions, Pointer, Pointers } from '@/declarations';\n\nimport BaseModule from '@/baseModule';\nimport { getLast } from '@/utils';\n\ninterface Options extends BaseOptions {\n\tclickPreserveTime?: number;\n\tmoveThreshold?: number;\n}\n\nexport default class Click extends BaseModule<Options> {\n\t#lastClickTime = -Infinity;\n\t#clickSteak = 0;\n\n\tonPointerDown = (_e: PointerEvent, pointer: Pointer, pointers: Pointers) => {\n\t\tif (pointers.size === 2) {\n\t\t\tconst pointer0 = this.getNthPointer(0);\n\t\t\t/*\n interrupted means that when a pointer is moving on the screen while another pointer is down, possibly for zooming, both pointers will be seen as \"interrupted\" so that they won't be used for triggering a real click.\n */\n\t\t\tpointer0.interrupted = true;\n\t\t\tpointer.interrupted = true;\n\t\t}\n\t};\n\n\tonPointerUp = (e: PointerEvent, pointer: Pointer) => {\n\t\tif (pointer.interrupted) return;\n\t\tconst threshold = this.options.moveThreshold ?? 5;\n\t\tif (\n\t\t\tMath.abs(pointer.records[0].x - e.clientX) >= threshold ||\n\t\t\tMath.abs(pointer.records[0].y - e.clientY) >= threshold\n\t\t)\n\t\t\treturn;\n\t\tconst newLast = getLast(pointer.records).timestamp;\n\t\tconst time = this.options.clickPreserveTime ?? 400;\n\t\tif (newLast - this.#lastClickTime <= time) this.#clickSteak++;\n\t\telse this.#clickSteak = 1;\n\t\tthis.#lastClickTime = newLast;\n\t\tconst coords = this.toTargetCoords({ x: e.clientX, y: e.clientY });\n\t\tthis.dispatch('trueClick', {\n\t\t\t...coords,\n\t\t\ttarget: pointer.target,\n\t\t\tstreak: this.#clickSteak,\n\t\t});\n\t};\n}\n","import type { Pointer, Pointers } from '@/declarations';\n\nimport BaseModule from '@/baseModule';\nimport { getLast } from '@/utils';\n\nexport default class Drag extends BaseModule {\n\tonPointerMove = (e: PointerEvent, pointer: Pointer, pointers: Pointers) => {\n\t\tconst last = getLast(pointer.records, 1);\n\t\tif (pointers.size === 1) {\n\t\t\tconst dx = e.clientX - last.x;\n\t\t\tconst dy = e.clientY - last.y;\n\t\t\tthis.dispatch('drag', { deltaX: dx, deltaY: dy, x: e.clientX, y: e.clientY });\n\t\t}\n\t};\n}\n","import type { Coordinates, Pointer, Pointers } from '@/declarations';\n\nimport BaseModule from '@/baseModule';\nimport { getLast } from '@/utils';\n\nexport default class MultitouchPanZoom extends BaseModule {\n\t#pinchZoomState = {\n\t\tlastDistance: 0,\n\t\tlastMidpoint: { x: 0, y: 0 },\n\t};\n\n\t#getPointerDistance() {\n\t\tconst pointer0Coords = getLast(this.getNthPointer(0).records);\n\t\tconst pointer1Coords = getLast(this.getNthPointer(1).records);\n\t\tconst dx = pointer0Coords.x - pointer1Coords.x;\n\t\tconst dy = pointer0Coords.y - pointer1Coords.y;\n\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t}\n\n\t// output screen coords\n\t#getPointerMidpoint() {\n\t\tconst pointer0Coords = getLast(this.getNthPointer(0).records);\n\t\tconst pointer1Coords = getLast(this.getNthPointer(1).records);\n\t\treturn {\n\t\t\tx: (pointer0Coords.x + pointer1Coords.x) / 2,\n\t\t\ty: (pointer0Coords.y + pointer1Coords.y) / 2,\n\t\t};\n\t}\n\n\tonPointerDown = (_e: PointerEvent, _pointer: Pointer, pointers: Pointers) => {\n\t\tif (pointers.size === 2) {\n\t\t\tthis.#pinchZoomState.lastDistance = this.#getPointerDistance();\n\t\t\tthis.#pinchZoomState.lastMidpoint = this.toTargetCoords(this.#getPointerMidpoint());\n\t\t}\n\t};\n\n\tonPointerMove = (_e: PointerEvent, _pointer: Pointer, pointers: Pointers) => {\n\t\tif (pointers.size === 2) {\n\t\t\tconst newDistance = this.#getPointerDistance();\n\t\t\tconst newMidpointOnScreen = this.#getPointerMidpoint();\n\t\t\tconst zoomFactor = newDistance / this.#pinchZoomState.lastDistance;\n\t\t\tthis.#pinchZoomState.lastDistance = newDistance;\n\t\t\tconst newMidpoint = this.toTargetCoords(newMidpointOnScreen);\n\t\t\tconst dx = newMidpoint.x - this.#pinchZoomState.lastMidpoint.x;\n\t\t\tconst dy = newMidpoint.y - this.#pinchZoomState.lastMidpoint.y;\n\t\t\tthis.#pinchZoomState.lastMidpoint = newMidpoint;\n\t\t\tthis.#dispatchPanEvent({ deltaX: dx, deltaY: dy });\n\t\t\tthis.#dispatchZoomEvent(zoomFactor, newMidpoint);\n\t\t}\n\t};\n\n\t#dispatchZoomEvent(factor: number, origin: Coordinates) {\n\t\tthis.dispatch('zoom', { x: origin.x, y: origin.y, factor });\n\t}\n\n\t#dispatchPanEvent(diff: { deltaX: number; deltaY: number }) {\n\t\tthis.dispatch('pan', diff);\n\t}\n}\n","import BaseModule from '@/baseModule';\n\nexport default class PreventDefault extends BaseModule {\n\tonWheel = (e: WheelEvent) => e.preventDefault();\n\t#preventDefaultFunction = (e: Event) => e.preventDefault();\n\n\tonStart = () => {\n\t\tthis.element.style.touchAction = 'none';\n\t\tthis.element.addEventListener('gesturestart', this.#preventDefaultFunction, {\n\t\t\tpassive: false,\n\t\t});\n\t\tthis.element.addEventListener('gesturechange', this.#preventDefaultFunction, {\n\t\t\tpassive: false,\n\t\t});\n\t};\n\n\tonStop = () => {\n\t\tthis.element.style.touchAction = '';\n\t\tthis.element.removeEventListener('gesturestart', this.#preventDefaultFunction);\n\t\tthis.element.removeEventListener('gesturechange', this.#preventDefaultFunction);\n\t};\n\n\tdispose = this.onStop;\n}\n","import type { Coordinates, BaseOptions } from '@/declarations';\n\nimport BaseModule, { BaseArgs } from '@/baseModule';\nimport { fillIn } from '@/utils';\n\n/*\nto normal computer users:\n\n# normal schema\ndiff y > 0 => zooms in => zoom factor < 1\ndiff y < 0 => zooms out => zoom factor > 1\n\n# professional schema\ndiff y > 0 => pan up => pan y < 0\ndiff y < 0 => pan down => pan y > 0\ndiff x > 0 => pan left => pan x < 0\ndiff y < 0 => pan right => pan y > 0\n*/\n\ninterface Options extends BaseOptions {\n\tproControlSchema?: boolean;\n\tzoomFactor?: number;\n\tlockControlSchema?: boolean;\n}\n\nexport default class wheelPanZoom extends BaseModule<Options> {\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tfillIn(\n\t\t\t{ proControlSchema: false, zoomFactor: 0.1, lockControlSchema: false },\n\t\t\tthis.options,\n\t\t);\n\t}\n\n\tonWheel = (e: WheelEvent) => {\n\t\tconst options = this.options as Required<Options>;\n\t\tif (\n\t\t\t!options.proControlSchema &&\n\t\t\t!options.lockControlSchema &&\n\t\t\t(e.ctrlKey || e.shiftKey || Math.abs(e.deltaX) > Math.abs(e.deltaY))\n\t\t)\n\t\t\toptions.proControlSchema = true;\n\t\tif (options.proControlSchema) {\n\t\t\tif (e.ctrlKey) {\n\t\t\t\tconst scaleFactor = 1 - options.zoomFactor * e.deltaY;\n\t\t\t\tconst origin = this.toTargetCoords({ x: e.clientX, y: e.clientY });\n\t\t\t\tthis.#dispatchZoomEvent(scaleFactor, origin);\n\t\t\t} else if (e.shiftKey && Math.abs(e.deltaX) <= Math.abs(e.deltaY))\n\t\t\t\tthis.#dispatchPanEvent({ deltaX: -e.deltaY, deltaY: -e.deltaX });\n\t\t\telse this.#dispatchPanEvent({ deltaX: -e.deltaX, deltaY: -e.deltaY });\n\t\t} else {\n\t\t\tconst scaleFactor = 1 - (options.zoomFactor / 20) * e.deltaY;\n\t\t\tconst origin = this.toTargetCoords({ x: e.clientX, y: e.clientY });\n\t\t\tthis.#dispatchZoomEvent(scaleFactor, origin);\n\t\t}\n\t};\n\n\t#dispatchZoomEvent(factor: number, origin: Coordinates) {\n\t\tthis.dispatch('zoom', { x: origin.x, y: origin.y, factor });\n\t}\n\n\t#dispatchPanEvent(diff: { deltaX: number; deltaY: number }) {\n\t\tthis.dispatch('pan', diff);\n\t}\n}\n","import BaseModule, { BaseArgs } from '@/baseModule';\nimport { BaseOptions, Events, GeneralObject } from '@/declarations';\n\ninterface Options extends BaseOptions {\n\tlubricator?: Record<string, PerEventOption>;\n}\n\ntype PerEventOption = {\n\tdecayFactor: number;\n\tfields: Record<string, { countType: 'sum' | 'product'; diminishBoundary: number }>;\n};\n\ntype PerEventStates = {\n\tsample: GeneralObject;\n\tfields: Record<\n\t\tstring,\n\t\t{\n\t\t\tcatch: number;\n\t\t\trelease: number;\n\t\t}\n\t>;\n};\n\nexport default class Lubricator extends BaseModule<Options> {\n\t#states: Record<string, PerEventStates> = {};\n\t#animationId: number | null = null;\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst lubricatee = this.options.lubricator;\n\t\tif (!lubricatee) return;\n\t\tObject.entries(lubricatee).forEach(([key, value]) => {\n\t\t\t// per event scope\n\t\t\tconst states = {\n\t\t\t\tsample: {},\n\t\t\t\tfields: {},\n\t\t\t} as PerEventStates;\n\t\t\tObject.keys(value.fields).forEach((field) => {\n\t\t\t\tstates.fields[field] = {\n\t\t\t\t\tcatch: 1,\n\t\t\t\t\trelease: 1,\n\t\t\t\t};\n\t\t\t});\n\t\t\tthis.#states[key] = states;\n\t\t\tthis.modifiers[key] = this.#makeLubricate(states, value);\n\t\t});\n\t}\n\n\tonStart = () => {\n\t\tthis.#animationId = requestAnimationFrame(this.#perFrame);\n\t};\n\n\tonStop = () => {\n\t\tif (this.#animationId) cancelAnimationFrame(this.#animationId);\n\t\tthis.#animationId = null;\n\t\tObject.values(this.#states).forEach((value) => {\n\t\t\t// per event scope\n\t\t\tObject.values(value.fields).forEach((value) => {\n\t\t\t\t// per field scope\n\t\t\t\tvalue.release = 1;\n\t\t\t\tvalue.catch = 1;\n\t\t\t});\n\t\t});\n\t};\n\n\t#makeLubricate =\n\t\t(states: PerEventStates, options: PerEventOption) => (detail: GeneralObject) => {\n\t\t\tif (detail.lubricated) return true;\n\t\t\tstates.sample = detail;\n\t\t\tthis.#accumulate(states.fields, options.fields, detail);\n\t\t\treturn false;\n\t\t};\n\n\t#accumulate = (\n\t\tstateFields: PerEventStates['fields'],\n\t\toptionsFields: PerEventOption['fields'],\n\t\tdetail: GeneralObject,\n\t) => {\n\t\tObject.entries(stateFields).forEach(([key, value]) => {\n\t\t\tif (typeof detail[key] !== 'number') return;\n\t\t\tconst config = optionsFields[key].countType;\n\t\t\tif (config === 'sum') {\n\t\t\t\tvalue.catch += detail[key];\n\t\t\t} else if (config === 'product') value.catch *= detail[key];\n\t\t});\n\t};\n\n\t#perFrame = () => {\n\t\tconst states = this.#states;\n\t\tconst options = this.options.lubricator;\n\t\tif (!options) return;\n\t\tObject.entries(states).forEach(([event, perEventStates]) => {\n\t\t\t// per event scope\n\t\t\tconst detail = perEventStates.sample;\n\t\t\tdetail.lubricated = true;\n\t\t\tlet needEmit = false;\n\t\t\tfor (const [field, value] of Object.entries(perEventStates.fields)) {\n\t\t\t\t// per field scope\n\t\t\t\tif (value.catch === 1) continue;\n\t\t\t\tconst type = options[event].fields[field].countType;\n\n\t\t\t\tlet absDiff: number, diff: number;\n\t\t\t\tif (type === 'sum') {\n\t\t\t\t\tdiff = value.catch - value.release;\n\t\t\t\t\tabsDiff = Math.abs(diff);\n\t\t\t\t} else {\n\t\t\t\t\tdiff = value.catch / value.release;\n\t\t\t\t\tabsDiff = this.#reciprocalAbs(diff) - 1;\n\t\t\t\t}\n\n\t\t\t\tif (absDiff <= options[event].fields[field].diminishBoundary) {\n\t\t\t\t\tif (!needEmit) needEmit = true;\n\t\t\t\t\tdetail[field] = diff;\n\t\t\t\t\tvalue.release = 1;\n\t\t\t\t\tvalue.catch = 1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// more to interpolate\n\t\t\t\tlet delta: number;\n\t\t\t\tif (type === 'sum') {\n\t\t\t\t\tdelta = diff * options[event].decayFactor;\n\t\t\t\t\tvalue.release += delta;\n\t\t\t\t} else {\n\t\t\t\t\tdelta = Math.pow(diff, options[event].decayFactor);\n\t\t\t\t\tvalue.release *= delta;\n\t\t\t\t}\n\t\t\t\tdetail[field] = delta;\n\t\t\t\tneedEmit = true;\n\t\t\t}\n\t\t\tif (needEmit) this.dispatch(event as keyof Events, detail as never);\n\t\t});\n\t\tthis.#animationId = requestAnimationFrame(this.#perFrame);\n\t};\n\n\t// in: positive number; out: positive number > 1\n\t#reciprocalAbs = (num: number) => (num > 1 ? num : 1 / num);\n\n\t// oxlint-disable-next-line typescript/no-explicit-any\n\tmodifiers: Record<string, any> = {};\n}\n\nexport const panPreset = {\n\tdecayFactor: 0.25,\n\tfields: {\n\t\tdeltaX: {\n\t\t\tcountType: 'sum',\n\t\t\tdiminishBoundary: 0.5,\n\t\t},\n\t\tdeltaY: {\n\t\t\tcountType: 'sum',\n\t\t\tdiminishBoundary: 0.5,\n\t\t},\n\t},\n} satisfies PerEventOption;\n\nexport const dragPreset = panPreset;\n\nexport const zoomPreset = {\n\tdecayFactor: 0.25,\n\tfields: {\n\t\tfactor: {\n\t\t\tcountType: 'product',\n\t\t\tdiminishBoundary: 0.01,\n\t\t},\n\t},\n} satisfies PerEventOption;\n","import type BaseModule from '@/baseModule';\nimport type {\n\tAugmentation,\n\tCoordinates,\n\tEvents,\n\tGeneralObject,\n\tModuleCtor,\n\tModuleInput,\n\tModuleInputCtor,\n\tOptions,\n\tPointers,\n\tReloadable,\n} from '@/declarations';\n\nimport { HookKeys } from '@/baseModule';\nimport { toArray } from '@/utils';\n\nexport class Pointeract<T extends ModuleInputCtor = []> {\n\t#element: HTMLElement;\n\t#pointers: Pointers = new Map();\n\t#modules: Record<string, BaseModule> = {};\n\t#pausedModules: Record<string, BaseModule> = {};\n\t#_window: Window | null;\n\t#subscribers: { [K in keyof Events<T>]?: Set<(event: Events<T>[K]) => void> } = {};\n\toptions: Options<T>;\n\tdeclare private _augmentSlot: unknown;\n\n\tget #window() {\n\t\tif (!this.#_window) throw new Error('[Pointeract] Window is not defined.');\n\t\treturn this.#_window;\n\t}\n\n\tconstructor(options: Options<T>, _modules?: T) {\n\t\tconst modules = toArray(_modules ? _modules : ([] as Array<ModuleCtor>));\n\t\tthis.#_window = options.element.ownerDocument.defaultView;\n\t\tthis.#element = options.element;\n\t\tif (!options.coordinateOutput) options.coordinateOutput = 'relative';\n\t\tthis.options = options;\n\t\tmodules.forEach((module) => {\n\t\t\tconst instance = new module(\n\t\t\t\tthis.moduleUtils as PointeractInterface['moduleUtils'],\n\t\t\t\tthis.#window,\n\t\t\t\tthis.#pointers,\n\t\t\t\tthis.#element,\n\t\t\t\tthis.options,\n\t\t\t);\n\t\t\tObject.assign(instance, { options });\n\t\t\tthis.#modules[module.name] = instance;\n\t\t});\n\t}\n\n\ton = <K extends keyof Events<T>>(type: K, listener: (event: Events<T>[K]) => void) => {\n\t\tif (!this.#subscribers[type]) this.#subscribers[type] = new Set();\n\t\tthis.#subscribers[type]?.add(listener);\n\t\treturn this;\n\t};\n\toff<K extends keyof Events<T>>(type: K, listener: (event: Events<T>[K]) => void) {\n\t\tthis.#subscribers[type]?.delete(listener);\n\t\treturn this;\n\t}\n\n\tprivate moduleUtils = {\n\t\tgetNthPointer: (n: number) => {\n\t\t\tconst error = new Error('[Pointeract] Invalid pointer index.');\n\t\t\tif (n < 0 || n >= this.#pointers.size) throw error;\n\t\t\tlet i = 0;\n\t\t\tfor (const value of this.#pointers.values()) {\n\t\t\t\tif (i === n) return value;\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tthrow error;\n\t\t},\n\n\t\t// Screen to Container\n\t\ttoTargetCoords: (raw: Coordinates) => {\n\t\t\tif (this.options.coordinateOutput === 'absolute') return raw;\n\t\t\tconst rect = this.#element.getBoundingClientRect();\n\t\t\traw.x -= rect.left;\n\t\t\traw.y -= rect.top;\n\t\t\tif (this.options.coordinateOutput === 'relative') return raw;\n\t\t\traw.x /= rect.width;\n\t\t\traw.y /= rect.height;\n\t\t\treturn raw;\n\t\t},\n\n\t\tdispatch: <N extends keyof Events<T>>(\n\t\t\t...args: undefined extends Events<T>[N] ? [N] : [N, Events<T>[N]]\n\t\t) => {\n\t\t\tconst name = args[0];\n\t\t\tconst e = args[1];\n\t\t\tlet lastResult: boolean | Events<T>[N] = true;\n\t\t\tfor (const value of Object.values(this.#modules)) {\n\t\t\t\tif (!value.modifiers || !(name in value.modifiers)) continue;\n\t\t\t\tlastResult =\n\t\t\t\t\te === undefined\n\t\t\t\t\t\t? (value.modifiers[name] as () => boolean)()\n\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\tvalue.modifiers[name] as (\n\t\t\t\t\t\t\t\t\tdetail?: Events<T>[N],\n\t\t\t\t\t\t\t\t) => boolean | Events<T>[N]\n\t\t\t\t\t\t\t)(e);\n\t\t\t\tif (lastResult === false) return;\n\t\t\t}\n\t\t\tlet event: Events<T>[N];\n\t\t\tif (lastResult === true) event = e as Events<T>[N];\n\t\t\telse event = lastResult;\n\t\t\tthis.#subscribers[name]?.forEach((listener) => listener(event));\n\t\t},\n\n\t\taugment: (aug: GeneralObject) => {\n\t\t\tObject.entries(aug).forEach(([key, value]) => (this[key as '_augmentSlot'] = value));\n\t\t},\n\t};\n\n\tdispatch = this.moduleUtils.dispatch;\n\n\t#runHooks<K extends HookKeys>(field: K, ...args: Parameters<Required<BaseModule>[K]>) {\n\t\tObject.values(this.#modules).forEach((module) => {\n\t\t\tconst hook = module[field];\n\t\t\t// oxlint-disable-next-line typescript/no-explicit-any\n\t\t\tif (hook) hook(...(args as any));\n\t\t});\n\t}\n\n\t#onPointerDown = (e: PointerEvent) => {\n\t\tif (this.#pointers.size >= 2) return;\n\t\tif (e.isPrimary) this.#pointers.clear();\n\t\tconst pointer = {\n\t\t\trecords: [{ x: e.clientX, y: e.clientY, timestamp: Date.now() }],\n\t\t\ttarget: e.target,\n\t\t};\n\t\tthis.#pointers.set(e.pointerId, pointer);\n\t\tthis.#runHooks('onPointerDown', e, pointer, this.#pointers);\n\t};\n\n\t#onPointerMove = (e: PointerEvent) => {\n\t\tconst pointer = this.#pointers.get(e.pointerId);\n\t\tif (!pointer) return;\n\t\tpointer.records.push({ x: e.clientX, y: e.clientY, timestamp: Date.now() });\n\t\tthis.#runHooks('onPointerMove', e, pointer, this.#pointers);\n\t};\n\n\t#onPointerUp = (e: PointerEvent) => {\n\t\tconst pointer = this.#pointers.get(e.pointerId);\n\t\tif (!pointer) return;\n\t\tthis.#pointers.delete(e.pointerId);\n\t\tthis.#runHooks('onPointerUp', e, pointer, this.#pointers);\n\t};\n\n\t#onWheel = (e: WheelEvent) => this.#runHooks('onWheel', e);\n\n\tstop = (_toStop?: Reloadable<T>) => {\n\t\tconst stopPointeract = () => {\n\t\t\tthis.#element.removeEventListener('pointerdown', this.#onPointerDown);\n\t\t\tthis.#window.removeEventListener('pointermove', this.#onPointerMove);\n\t\t\tthis.#window.removeEventListener('pointerup', this.#onPointerUp);\n\t\t\tthis.#element.removeEventListener('wheel', this.#onWheel);\n\t\t\tthis.#runHooks('onStop');\n\t\t};\n\t\tconst stopModule = (moduleCtor: ModuleCtor) => {\n\t\t\tif (!(moduleCtor.name in this.#modules)) return;\n\t\t\tconst module = this.#modules[moduleCtor.name];\n\t\t\tif (module.onStop) module.onStop();\n\t\t\tthis.#pausedModules[moduleCtor.name] = module;\n\t\t\tdelete this.#modules[moduleCtor.name];\n\t\t};\n\t\tif (!_toStop) stopPointeract();\n\t\telse\n\t\t\ttoArray(_toStop).forEach((module) => {\n\t\t\t\tstopModule(module);\n\t\t\t});\n\t\treturn this;\n\t};\n\n\tstart = (_toStart?: Reloadable<T>) => {\n\t\tconst startPointeract = () => {\n\t\t\tthis.#element.addEventListener('pointerdown', this.#onPointerDown);\n\t\t\tthis.#window.addEventListener('pointermove', this.#onPointerMove);\n\t\t\tthis.#window.addEventListener('pointerup', this.#onPointerUp);\n\t\t\tthis.#element.addEventListener('wheel', this.#onWheel, { passive: false });\n\t\t\tthis.#runHooks('onStart');\n\t\t};\n\t\tconst startModule = (moduleCtor: ModuleCtor) => {\n\t\t\tif (!(moduleCtor.name in this.#pausedModules)) return;\n\t\t\tconst module = this.#pausedModules[moduleCtor.name];\n\t\t\tif (module.onStart) module.onStart();\n\t\t\tthis.#modules[moduleCtor.name] = module;\n\t\t\tdelete this.#pausedModules[moduleCtor.name];\n\t\t};\n\t\tif (!_toStart) startPointeract();\n\t\telse\n\t\t\ttoArray(_toStart).forEach((module) => {\n\t\t\t\tstartModule(module);\n\t\t\t});\n\t\treturn this;\n\t};\n\n\tdispose = () => {\n\t\tthis.stop();\n\t\tthis.#_window = null;\n\t\tthis.#runHooks('dispose');\n\t\tthis.#subscribers = {};\n\t};\n}\n\ntype PointeractType = new <M extends ModuleInputCtor = []>(\n\t...args: ConstructorParameters<typeof Pointeract<M>>\n) => Pointeract<M> & Augmentation<M>;\n\nexport type PointeractInterface<M extends ModuleInput = []> = Pointeract<never> & Augmentation<M>;\n\nexport default Pointeract as PointeractType;\n"],"names":["BaseModule","constructor","utils","window","pointers","element","options","this","getNthPointer","toTargetCoords","augment","dispatch","onPointerDown","onPointerUp","onPointerMove","onWheel","onStart","onStop","dispose","modifiers","getLast","arr","num","length","toArray","toTrans","Array","isArray","Click","lastClickTime","Infinity","clickSteak","_e","pointer","size","interrupted","e","threshold","moveThreshold","Math","abs","records","x","clientX","y","clientY","newLast","timestamp","time","clickPreserveTime","coords","target","streak","Drag","last","dx","dy","deltaX","deltaY","MultitouchPanZoom","pinchZoomState","lastDistance","lastMidpoint","getPointerDistance","pointer0Coords","pointer1Coords","sqrt","getPointerMidpoint","_pointer","newDistance","newMidpointOnScreen","zoomFactor","newMidpoint","dispatchPanEvent","dispatchZoomEvent","factor","origin","diff","PreventDefault","preventDefault","preventDefaultFunction","style","touchAction","addEventListener","passive","removeEventListener","wheelPanZoom","args","super","patch","k","v","Object","entries","fillIn","proControlSchema","lockControlSchema","ctrlKey","shiftKey","scaleFactor","Lubricator","states","animationId","lubricatee","lubricator","forEach","key","value","sample","fields","keys","field","catch","release","makeLubricate","requestAnimationFrame","perFrame","cancelAnimationFrame","values","detail","lubricated","accumulate","stateFields","optionsFields","config","countType","event","perEventStates","needEmit","type","absDiff","delta","reciprocalAbs","diminishBoundary","decayFactor","pow","panPreset","dragPreset","zoomPreset","Pointeract","Map","modules","pausedModules","_window","subscribers","Error","_modules","ownerDocument","defaultView","coordinateOutput","module","instance","moduleUtils","assign","name","on","listener","Set","add","off","delete","n","error","i","raw","rect","getBoundingClientRect","left","top","width","height","lastResult","aug","runHooks","hook","isPrimary","clear","Date","now","set","pointerId","get","push","stop","_toStop","stopModule","moduleCtor","stopPointeract","start","_toStart","startModule","startPointeract"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pointeract",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Modern, lightweight, robust and extensible user gesture recognizer.",
5
5
  "keywords": [
6
6
  "frontend",
@@ -26,9 +26,11 @@
26
26
  ],
27
27
  "type": "module",
28
28
  "sideEffects": false,
29
- "main": "./dist/index.cjs",
29
+ "main": "./dist/index.js",
30
30
  "module": "./dist/index.js",
31
31
  "types": "./dist/types/index.d.ts",
32
+ "unpkg": "./dist/index.js",
33
+ "jsdelivr": "./dist/index.js",
32
34
  "publishConfig": {
33
35
  "access": "public",
34
36
  "provenance": true
package/dist/index.cjs DELETED
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class t{constructor(t,e,s,i,o){this.window=e,this.pointers=s,this.element=i,this.getNthPointer=t.getNthPointer,this.toTargetCoords=t.toTargetCoords,this.augment=t.augment,this.dispatch=t.dispatch,this.options=o}getNthPointer;toTargetCoords;augment;dispatch;options;onPointerDown;onPointerUp;onPointerMove;onWheel;onStart;onStop;dispose;modifiers}function e(t,e=0){return t[t.length-1-e]}function s(t){return Array.isArray(t)?t:[t]}const i={decayFactor:.25,fields:{deltaX:{countType:"sum",diminishBoundary:.5},deltaY:{countType:"sum",diminishBoundary:.5}}},o=i;exports.BaseModule=t,exports.Click=class extends t{#t=-1/0;#e=0;onPointerDown=(t,e,s)=>{if(2===s.size){this.getNthPointer(0).interrupted=!0,e.interrupted=!0}};onPointerUp=(t,s)=>{if(s.interrupted)return;const i=this.options.moveThreshold??5;if(Math.abs(s.records[0].x-t.clientX)>=i||Math.abs(s.records[0].y-t.clientY)>=i)return;const o=e(s.records).timestamp,n=this.options.clickPreserveTime??400;o-this.#t<=n?this.#e++:this.#e=1,this.#t=o;const r=this.toTargetCoords({x:t.clientX,y:t.clientY});this.dispatch("trueClick",{...r,target:s.target,streak:this.#e})}},exports.Drag=class extends t{onPointerMove=(t,s,i)=>{const o=e(s.records,1);if(1===i.size){const e=t.clientX-o.x,s=t.clientY-o.y;this.dispatch("drag",{deltaX:e,deltaY:s,x:t.clientX,y:t.clientY})}}},exports.Lubricator=class extends t{#s={};#i=null;constructor(...t){super(...t);const e=this.options.lubricator;e&&Object.entries(e).forEach(([t,e])=>{const s={sample:{},fields:{}};Object.keys(e.fields).forEach(t=>{s.fields[t]={catch:1,release:1}}),this.#s[t]=s,this.modifiers[t]=this.#o(s,e)})}onStart=()=>{this.#i=requestAnimationFrame(this.#n)};onStop=()=>{this.#i&&cancelAnimationFrame(this.#i),this.#i=null,Object.values(this.#s).forEach(t=>{Object.values(t.fields).forEach(t=>{t.release=1,t.catch=1})})};#o=(t,e)=>s=>!!s.lubricated||(t.sample=s,this.#r(t.fields,e.fields,s),!1);#r=(t,e,s)=>{Object.entries(t).forEach(([t,i])=>{if("number"!=typeof s[t])return;const o=e[t].countType;"sum"===o?i.catch+=s[t]:"product"===o&&(i.catch*=s[t])})};#n=()=>{const t=this.#s,e=this.options.lubricator;e&&(Object.entries(t).forEach(([t,s])=>{const i=s.sample;i.lubricated=!0;let o=!1;for(const[n,r]of Object.entries(s.fields)){if(1===r.catch)continue;const s=e[t].fields[n].countType;let a,h,c;("sum"===s?(h=r.catch-r.release,a=Math.abs(h)):(h=r.catch/r.release,a=this.#a(h)-1),a<=e[t].fields[n].diminishBoundary)?(o||(o=!0),i[n]=h,r.release=1,r.catch=1):("sum"===s?(c=h*e[t].decayFactor,r.release+=c):(c=Math.pow(h,e[t].decayFactor),r.release*=c),i[n]=c,o=!0)}o&&this.dispatch(t,i)}),this.#i=requestAnimationFrame(this.#n))};#a=t=>t>1?t:1/t;modifiers={}},exports.MultitouchPanZoom=class extends t{#h={lastDistance:0,lastMidpoint:{x:0,y:0}};#c(){const t=e(this.getNthPointer(0).records),s=e(this.getNthPointer(1).records),i=t.x-s.x,o=t.y-s.y;return Math.sqrt(i*i+o*o)}#d(){const t=e(this.getNthPointer(0).records),s=e(this.getNthPointer(1).records);return{x:(t.x+s.x)/2,y:(t.y+s.y)/2}}onPointerDown=(t,e,s)=>{2===s.size&&(this.#h.lastDistance=this.#c(),this.#h.lastMidpoint=this.toTargetCoords(this.#d()))};onPointerMove=(t,e,s)=>{if(2===s.size){const t=this.#c(),e=this.#d(),s=t/this.#h.lastDistance;this.#h.lastDistance=t;const i=this.toTargetCoords(e),o=i.x-this.#h.lastMidpoint.x,n=i.y-this.#h.lastMidpoint.y;this.#h.lastMidpoint=i,this.#l({deltaX:o,deltaY:n}),this.#p(s,i)}};#p(t,e){this.dispatch("zoom",{x:e.x,y:e.y,factor:t})}#l(t){this.dispatch("pan",t)}},exports.Pointeract=class{#u;#m=new Map;#f={};#v={};#P;#g={};options;get#w(){if(!this.#P)throw new Error("[Pointeract] Window is not defined.");return this.#P}constructor(t,e){const i=s(e||[]);this.#P=t.element.ownerDocument.defaultView,this.#u=t.element,t.coordinateOutput||(t.coordinateOutput="relative"),this.options=t,i.forEach(e=>{const s=new e(this.moduleUtils,this.#w,this.#m,this.#u,this.options);Object.assign(s,{options:t}),this.#f[e.name]=s})}on=(t,e)=>(this.#g[t]||(this.#g[t]=new Set),this.#g[t]?.add(e),this);off(t,e){return this.#g[t]?.delete(e),this}moduleUtils={getNthPointer:t=>{const e=new Error("[Pointeract] Invalid pointer index.");if(t<0||t>=this.#m.size)throw e;let s=0;for(const i of this.#m.values()){if(s===t)return i;s++}throw e},toTargetCoords:t=>{if("absolute"===this.options.coordinateOutput)return t;const e=this.#u.getBoundingClientRect();return t.x-=e.left,t.y-=e.top,"relative"===this.options.coordinateOutput||(t.x/=e.width,t.y/=e.height),t},dispatch:(...t)=>{const e=t[0],s=t[1];let i,o=!0;for(const n of Object.values(this.#f))if(n.modifiers&&e in n.modifiers&&(o=void 0===s?n.modifiers[e]():n.modifiers[e](s),!1===o))return;i=!0===o?s:o,this.#g[e]?.forEach(t=>t(i))},augment:t=>{Object.entries(t).forEach(([t,e])=>this[t]=e)}};dispatch=this.moduleUtils.dispatch;#y(t,...e){Object.values(this.#f).forEach(s=>{const i=s[t];i&&i(...e)})}#b=t=>{if(this.#m.size>=2)return;t.isPrimary&&this.#m.clear();const e={records:[{x:t.clientX,y:t.clientY,timestamp:Date.now()}],target:t.target};this.#m.set(t.pointerId,e),this.#y("onPointerDown",t,e,this.#m)};#x=t=>{const e=this.#m.get(t.pointerId);e&&(e.records.push({x:t.clientX,y:t.clientY,timestamp:Date.now()}),this.#y("onPointerMove",t,e,this.#m))};#E=t=>{const e=this.#m.get(t.pointerId);e&&(this.#m.delete(t.pointerId),this.#y("onPointerUp",t,e,this.#m))};#S=t=>this.#y("onWheel",t);stop=t=>{const e=t=>{if(!(t.name in this.#f))return;const e=this.#f[t.name];e.onStop&&e.onStop(),this.#v[t.name]=e,delete this.#f[t.name]};return t?s(t).forEach(t=>{e(t)}):(()=>{this.#u.removeEventListener("pointerdown",this.#b),this.#w.removeEventListener("pointermove",this.#x),this.#w.removeEventListener("pointerup",this.#E),this.#u.removeEventListener("wheel",this.#S),this.#y("onStop")})(),this};start=t=>{const e=t=>{if(!(t.name in this.#v))return;const e=this.#v[t.name];e.onStart&&e.onStart(),this.#f[t.name]=e,delete this.#v[t.name]};return t?s(t).forEach(t=>{e(t)}):(()=>{this.#u.addEventListener("pointerdown",this.#b),this.#w.addEventListener("pointermove",this.#x),this.#w.addEventListener("pointerup",this.#E),this.#u.addEventListener("wheel",this.#S,{passive:!1}),this.#y("onStart")})(),this};dispose=()=>{this.stop(),this.#P=null,this.#y("dispose"),this.#g={}}},exports.PreventDefault=class extends t{onWheel=t=>t.preventDefault();#M=t=>t.preventDefault();onStart=()=>{this.element.style.touchAction="none",this.element.addEventListener("gesturestart",this.#M,{passive:!1}),this.element.addEventListener("gesturechange",this.#M,{passive:!1})};onStop=()=>{this.element.style.touchAction="",this.element.removeEventListener("gesturestart",this.#M),this.element.removeEventListener("gesturechange",this.#M)};dispose=this.onStop},exports.WheelPanZoom=class extends t{constructor(...t){super(...t),function(t,e){for(const[s,i]of Object.entries(t))s in e||(e[s]=i)}({proControlSchema:!1,zoomFactor:.1,lockControlSchema:!1},this.options)}onWheel=t=>{const e=this.options;if(e.proControlSchema||e.lockControlSchema||!(t.ctrlKey||t.shiftKey||Math.abs(t.deltaX)>Math.abs(t.deltaY))||(e.proControlSchema=!0),e.proControlSchema)if(t.ctrlKey){const s=1-e.zoomFactor*t.deltaY,i=this.toTargetCoords({x:t.clientX,y:t.clientY});this.#p(s,i)}else t.shiftKey&&Math.abs(t.deltaX)<=Math.abs(t.deltaY)?this.#l({deltaX:-t.deltaY,deltaY:-t.deltaX}):this.#l({deltaX:-t.deltaX,deltaY:-t.deltaY});else{const s=1-e.zoomFactor/20*t.deltaY,i=this.toTargetCoords({x:t.clientX,y:t.clientY});this.#p(s,i)}};#p(t,e){this.dispatch("zoom",{x:e.x,y:e.y,factor:t})}#l(t){this.dispatch("pan",t)}},exports.dragPreset=o,exports.panPreset=i,exports.zoomPreset={decayFactor:.25,fields:{factor:{countType:"product",diminishBoundary:.01}}};
2
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/baseModule.ts","../src/utils.ts","../src/modules/lubricator.ts","../src/modules/click.ts","../src/modules/drag.ts","../src/modules/multitouchPanZoom.ts","../src/pointeract.ts","../src/modules/preventDefault.ts","../src/modules/wheelPanZoom.ts"],"sourcesContent":["import type {\n\tBaseOptions,\n\tGeneralObject,\n\tPointer,\n\tPointers,\n\tStdEvents,\n\tConstrain,\n} from '@/declarations';\nimport type { Pointeract, PointeractInterface } from '@/pointeract';\n\nexport type HookKeys =\n\t| 'onPointerDown'\n\t| 'onPointerUp'\n\t| 'onPointerMove'\n\t| 'onWheel'\n\t| 'onStart'\n\t| 'onStop'\n\t| 'dispose';\n\nexport type BaseArgs = [\n\tPointeract<[]>['moduleUtils'],\n\tWindow,\n\tPointers,\n\tHTMLElement,\n\tGeneralObject,\n];\n\nexport default class BaseModule<\n\tO extends BaseOptions = BaseOptions,\n\tE extends StdEvents = StdEvents,\n\tA extends {} = {},\n> {\n\tdeclare private static readonly _BaseModuleBrand: unique symbol; // Nominal marker\n\tdeclare readonly _Events: E;\n\tdeclare readonly _Augmentation: A;\n\tprotected getNthPointer: Pointeract<[]>['moduleUtils']['getNthPointer'];\n\tprotected toTargetCoords: Pointeract<[]>['moduleUtils']['toTargetCoords'];\n\tprotected augment: (augmentation: A) => void;\n\tprotected dispatch: <K extends keyof Constrain<E>>(\n\t\t...arg: undefined extends E[K] ? [K] : [K, E[K]]\n\t) => void;\n\toptions: O;\n\tconstructor(\n\t\tutils: PointeractInterface['moduleUtils'],\n\t\tprotected window: Window,\n\t\tprotected pointers: Pointers,\n\t\tprotected element: HTMLElement,\n\t\toptions: GeneralObject,\n\t) {\n\t\tthis.getNthPointer = utils.getNthPointer;\n\t\tthis.toTargetCoords = utils.toTargetCoords;\n\t\tthis.augment = utils.augment;\n\t\tthis.dispatch = utils.dispatch as typeof this.dispatch;\n\t\tthis.options = options;\n\t}\n\n\tonPointerDown?: (...args: [event: PointerEvent, pointer: Pointer, pointers: Pointers]) => void;\n\tonPointerUp?: (...args: [event: PointerEvent, pointer: Pointer, pointers: Pointers]) => void;\n\tonPointerMove?: (...args: [event: PointerEvent, pointer: Pointer, pointers: Pointers]) => void;\n\tonWheel?: (...args: [event: WheelEvent]) => void;\n\tonStart?: () => void;\n\tonStop?: () => void;\n\tdispose?: () => void;\n\tmodifiers?: {\n\t\t[K in keyof Constrain<E>]?: (event: E[K]) => boolean | E[K];\n\t};\n}\n","import { GeneralObject } from '@/declarations';\n\nexport function getLast<T>(arr: Array<T>, num: number = 0) {\n\treturn arr[arr.length - 1 - num];\n}\n\nexport function fillIn(patch: GeneralObject, target: GeneralObject) {\n\tfor (const [k, v] of Object.entries(patch)) if (!(k in target)) target[k] = v;\n}\n\nexport function toArray<T>(toTrans: T | Array<T>) {\n\treturn Array.isArray(toTrans) ? toTrans : [toTrans];\n}\n","import BaseModule, { BaseArgs } from '@/baseModule';\nimport { BaseOptions, Events, GeneralObject } from '@/declarations';\n\ninterface Options extends BaseOptions {\n\tlubricator?: Record<string, PerEventOption>;\n}\n\ntype PerEventOption = {\n\tdecayFactor: number;\n\tfields: Record<string, { countType: 'sum' | 'product'; diminishBoundary: number }>;\n};\n\ntype PerEventStates = {\n\tsample: GeneralObject;\n\tfields: Record<\n\t\tstring,\n\t\t{\n\t\t\tcatch: number;\n\t\t\trelease: number;\n\t\t}\n\t>;\n};\n\nexport default class Lubricator extends BaseModule<Options> {\n\t#states: Record<string, PerEventStates> = {};\n\t#animationId: number | null = null;\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst lubricatee = this.options.lubricator;\n\t\tif (!lubricatee) return;\n\t\tObject.entries(lubricatee).forEach(([key, value]) => {\n\t\t\t// per event scope\n\t\t\tconst states = {\n\t\t\t\tsample: {},\n\t\t\t\tfields: {},\n\t\t\t} as PerEventStates;\n\t\t\tObject.keys(value.fields).forEach((field) => {\n\t\t\t\tstates.fields[field] = {\n\t\t\t\t\tcatch: 1,\n\t\t\t\t\trelease: 1,\n\t\t\t\t};\n\t\t\t});\n\t\t\tthis.#states[key] = states;\n\t\t\tthis.modifiers[key] = this.#makeLubricate(states, value);\n\t\t});\n\t}\n\n\tonStart = () => {\n\t\tthis.#animationId = requestAnimationFrame(this.#perFrame);\n\t};\n\n\tonStop = () => {\n\t\tif (this.#animationId) cancelAnimationFrame(this.#animationId);\n\t\tthis.#animationId = null;\n\t\tObject.values(this.#states).forEach((value) => {\n\t\t\t// per event scope\n\t\t\tObject.values(value.fields).forEach((value) => {\n\t\t\t\t// per field scope\n\t\t\t\tvalue.release = 1;\n\t\t\t\tvalue.catch = 1;\n\t\t\t});\n\t\t});\n\t};\n\n\t#makeLubricate =\n\t\t(states: PerEventStates, options: PerEventOption) => (detail: GeneralObject) => {\n\t\t\tif (detail.lubricated) return true;\n\t\t\tstates.sample = detail;\n\t\t\tthis.#accumulate(states.fields, options.fields, detail);\n\t\t\treturn false;\n\t\t};\n\n\t#accumulate = (\n\t\tstateFields: PerEventStates['fields'],\n\t\toptionsFields: PerEventOption['fields'],\n\t\tdetail: GeneralObject,\n\t) => {\n\t\tObject.entries(stateFields).forEach(([key, value]) => {\n\t\t\tif (typeof detail[key] !== 'number') return;\n\t\t\tconst config = optionsFields[key].countType;\n\t\t\tif (config === 'sum') {\n\t\t\t\tvalue.catch += detail[key];\n\t\t\t} else if (config === 'product') value.catch *= detail[key];\n\t\t});\n\t};\n\n\t#perFrame = () => {\n\t\tconst states = this.#states;\n\t\tconst options = this.options.lubricator;\n\t\tif (!options) return;\n\t\tObject.entries(states).forEach(([event, perEventStates]) => {\n\t\t\t// per event scope\n\t\t\tconst detail = perEventStates.sample;\n\t\t\tdetail.lubricated = true;\n\t\t\tlet needEmit = false;\n\t\t\tfor (const [field, value] of Object.entries(perEventStates.fields)) {\n\t\t\t\t// per field scope\n\t\t\t\tif (value.catch === 1) continue;\n\t\t\t\tconst type = options[event].fields[field].countType;\n\n\t\t\t\tlet absDiff: number, diff: number;\n\t\t\t\tif (type === 'sum') {\n\t\t\t\t\tdiff = value.catch - value.release;\n\t\t\t\t\tabsDiff = Math.abs(diff);\n\t\t\t\t} else {\n\t\t\t\t\tdiff = value.catch / value.release;\n\t\t\t\t\tabsDiff = this.#reciprocalAbs(diff) - 1;\n\t\t\t\t}\n\n\t\t\t\tif (absDiff <= options[event].fields[field].diminishBoundary) {\n\t\t\t\t\tif (!needEmit) needEmit = true;\n\t\t\t\t\tdetail[field] = diff;\n\t\t\t\t\tvalue.release = 1;\n\t\t\t\t\tvalue.catch = 1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// more to interpolate\n\t\t\t\tlet delta: number;\n\t\t\t\tif (type === 'sum') {\n\t\t\t\t\tdelta = diff * options[event].decayFactor;\n\t\t\t\t\tvalue.release += delta;\n\t\t\t\t} else {\n\t\t\t\t\tdelta = Math.pow(diff, options[event].decayFactor);\n\t\t\t\t\tvalue.release *= delta;\n\t\t\t\t}\n\t\t\t\tdetail[field] = delta;\n\t\t\t\tneedEmit = true;\n\t\t\t}\n\t\t\tif (needEmit) this.dispatch(event as keyof Events, detail as never);\n\t\t});\n\t\tthis.#animationId = requestAnimationFrame(this.#perFrame);\n\t};\n\n\t// in: positive number; out: positive number > 1\n\t#reciprocalAbs = (num: number) => (num > 1 ? num : 1 / num);\n\n\t// oxlint-disable-next-line typescript/no-explicit-any\n\tmodifiers: Record<string, any> = {};\n}\n\nexport const panPreset = {\n\tdecayFactor: 0.25,\n\tfields: {\n\t\tdeltaX: {\n\t\t\tcountType: 'sum',\n\t\t\tdiminishBoundary: 0.5,\n\t\t},\n\t\tdeltaY: {\n\t\t\tcountType: 'sum',\n\t\t\tdiminishBoundary: 0.5,\n\t\t},\n\t},\n} satisfies PerEventOption;\n\nexport const dragPreset = panPreset;\n\nexport const zoomPreset = {\n\tdecayFactor: 0.25,\n\tfields: {\n\t\tfactor: {\n\t\t\tcountType: 'product',\n\t\t\tdiminishBoundary: 0.01,\n\t\t},\n\t},\n} satisfies PerEventOption;\n","import type { BaseOptions, Pointer, Pointers } from '@/declarations';\n\nimport BaseModule from '@/baseModule';\nimport { getLast } from '@/utils';\n\ninterface Options extends BaseOptions {\n\tclickPreserveTime?: number;\n\tmoveThreshold?: number;\n}\n\nexport default class Click extends BaseModule<Options> {\n\t#lastClickTime = -Infinity;\n\t#clickSteak = 0;\n\n\tonPointerDown = (_e: PointerEvent, pointer: Pointer, pointers: Pointers) => {\n\t\tif (pointers.size === 2) {\n\t\t\tconst pointer0 = this.getNthPointer(0);\n\t\t\t/*\n interrupted means that when a pointer is moving on the screen while another pointer is down, possibly for zooming, both pointers will be seen as \"interrupted\" so that they won't be used for triggering a real click.\n */\n\t\t\tpointer0.interrupted = true;\n\t\t\tpointer.interrupted = true;\n\t\t}\n\t};\n\n\tonPointerUp = (e: PointerEvent, pointer: Pointer) => {\n\t\tif (pointer.interrupted) return;\n\t\tconst threshold = this.options.moveThreshold ?? 5;\n\t\tif (\n\t\t\tMath.abs(pointer.records[0].x - e.clientX) >= threshold ||\n\t\t\tMath.abs(pointer.records[0].y - e.clientY) >= threshold\n\t\t)\n\t\t\treturn;\n\t\tconst newLast = getLast(pointer.records).timestamp;\n\t\tconst time = this.options.clickPreserveTime ?? 400;\n\t\tif (newLast - this.#lastClickTime <= time) this.#clickSteak++;\n\t\telse this.#clickSteak = 1;\n\t\tthis.#lastClickTime = newLast;\n\t\tconst coords = this.toTargetCoords({ x: e.clientX, y: e.clientY });\n\t\tthis.dispatch('trueClick', {\n\t\t\t...coords,\n\t\t\ttarget: pointer.target,\n\t\t\tstreak: this.#clickSteak,\n\t\t});\n\t};\n}\n","import type { Pointer, Pointers } from '@/declarations';\n\nimport BaseModule from '@/baseModule';\nimport { getLast } from '@/utils';\n\nexport default class Drag extends BaseModule {\n\tonPointerMove = (e: PointerEvent, pointer: Pointer, pointers: Pointers) => {\n\t\tconst last = getLast(pointer.records, 1);\n\t\tif (pointers.size === 1) {\n\t\t\tconst dx = e.clientX - last.x;\n\t\t\tconst dy = e.clientY - last.y;\n\t\t\tthis.dispatch('drag', { deltaX: dx, deltaY: dy, x: e.clientX, y: e.clientY });\n\t\t}\n\t};\n}\n","import type { Coordinates, Pointer, Pointers } from '@/declarations';\n\nimport BaseModule from '@/baseModule';\nimport { getLast } from '@/utils';\n\nexport default class MultitouchPanZoom extends BaseModule {\n\t#pinchZoomState = {\n\t\tlastDistance: 0,\n\t\tlastMidpoint: { x: 0, y: 0 },\n\t};\n\n\t#getPointerDistance() {\n\t\tconst pointer0Coords = getLast(this.getNthPointer(0).records);\n\t\tconst pointer1Coords = getLast(this.getNthPointer(1).records);\n\t\tconst dx = pointer0Coords.x - pointer1Coords.x;\n\t\tconst dy = pointer0Coords.y - pointer1Coords.y;\n\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t}\n\n\t// output screen coords\n\t#getPointerMidpoint() {\n\t\tconst pointer0Coords = getLast(this.getNthPointer(0).records);\n\t\tconst pointer1Coords = getLast(this.getNthPointer(1).records);\n\t\treturn {\n\t\t\tx: (pointer0Coords.x + pointer1Coords.x) / 2,\n\t\t\ty: (pointer0Coords.y + pointer1Coords.y) / 2,\n\t\t};\n\t}\n\n\tonPointerDown = (_e: PointerEvent, _pointer: Pointer, pointers: Pointers) => {\n\t\tif (pointers.size === 2) {\n\t\t\tthis.#pinchZoomState.lastDistance = this.#getPointerDistance();\n\t\t\tthis.#pinchZoomState.lastMidpoint = this.toTargetCoords(this.#getPointerMidpoint());\n\t\t}\n\t};\n\n\tonPointerMove = (_e: PointerEvent, _pointer: Pointer, pointers: Pointers) => {\n\t\tif (pointers.size === 2) {\n\t\t\tconst newDistance = this.#getPointerDistance();\n\t\t\tconst newMidpointOnScreen = this.#getPointerMidpoint();\n\t\t\tconst zoomFactor = newDistance / this.#pinchZoomState.lastDistance;\n\t\t\tthis.#pinchZoomState.lastDistance = newDistance;\n\t\t\tconst newMidpoint = this.toTargetCoords(newMidpointOnScreen);\n\t\t\tconst dx = newMidpoint.x - this.#pinchZoomState.lastMidpoint.x;\n\t\t\tconst dy = newMidpoint.y - this.#pinchZoomState.lastMidpoint.y;\n\t\t\tthis.#pinchZoomState.lastMidpoint = newMidpoint;\n\t\t\tthis.#dispatchPanEvent({ deltaX: dx, deltaY: dy });\n\t\t\tthis.#dispatchZoomEvent(zoomFactor, newMidpoint);\n\t\t}\n\t};\n\n\t#dispatchZoomEvent(factor: number, origin: Coordinates) {\n\t\tthis.dispatch('zoom', { x: origin.x, y: origin.y, factor });\n\t}\n\n\t#dispatchPanEvent(diff: { deltaX: number; deltaY: number }) {\n\t\tthis.dispatch('pan', diff);\n\t}\n}\n","import type BaseModule from '@/baseModule';\nimport type {\n\tAugmentation,\n\tCoordinates,\n\tEvents,\n\tGeneralObject,\n\tModuleCtor,\n\tModuleInput,\n\tModuleInputCtor,\n\tOptions,\n\tPointers,\n\tReloadable,\n} from '@/declarations';\n\nimport { HookKeys } from '@/baseModule';\nimport { toArray } from '@/utils';\n\nexport class Pointeract<T extends ModuleInputCtor = []> {\n\t#element: HTMLElement;\n\t#pointers: Pointers = new Map();\n\t#modules: Record<string, BaseModule> = {};\n\t#pausedModules: Record<string, BaseModule> = {};\n\t#_window: Window | null;\n\t#subscribers: { [K in keyof Events<T>]?: Set<(event: Events<T>[K]) => void> } = {};\n\toptions: Options<T>;\n\tdeclare private _augmentSlot: unknown;\n\n\tget #window() {\n\t\tif (!this.#_window) throw new Error('[Pointeract] Window is not defined.');\n\t\treturn this.#_window;\n\t}\n\n\tconstructor(options: Options<T>, _modules?: T) {\n\t\tconst modules = toArray(_modules ? _modules : ([] as Array<ModuleCtor>));\n\t\tthis.#_window = options.element.ownerDocument.defaultView;\n\t\tthis.#element = options.element;\n\t\tif (!options.coordinateOutput) options.coordinateOutput = 'relative';\n\t\tthis.options = options;\n\t\tmodules.forEach((module) => {\n\t\t\tconst instance = new module(\n\t\t\t\tthis.moduleUtils as PointeractInterface['moduleUtils'],\n\t\t\t\tthis.#window,\n\t\t\t\tthis.#pointers,\n\t\t\t\tthis.#element,\n\t\t\t\tthis.options,\n\t\t\t);\n\t\t\tObject.assign(instance, { options });\n\t\t\tthis.#modules[module.name] = instance;\n\t\t});\n\t}\n\n\ton = <K extends keyof Events<T>>(type: K, listener: (event: Events<T>[K]) => void) => {\n\t\tif (!this.#subscribers[type]) this.#subscribers[type] = new Set();\n\t\tthis.#subscribers[type]?.add(listener);\n\t\treturn this;\n\t};\n\toff<K extends keyof Events<T>>(type: K, listener: (event: Events<T>[K]) => void) {\n\t\tthis.#subscribers[type]?.delete(listener);\n\t\treturn this;\n\t}\n\n\tprivate moduleUtils = {\n\t\tgetNthPointer: (n: number) => {\n\t\t\tconst error = new Error('[Pointeract] Invalid pointer index.');\n\t\t\tif (n < 0 || n >= this.#pointers.size) throw error;\n\t\t\tlet i = 0;\n\t\t\tfor (const value of this.#pointers.values()) {\n\t\t\t\tif (i === n) return value;\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tthrow error;\n\t\t},\n\n\t\t// Screen to Container\n\t\ttoTargetCoords: (raw: Coordinates) => {\n\t\t\tif (this.options.coordinateOutput === 'absolute') return raw;\n\t\t\tconst rect = this.#element.getBoundingClientRect();\n\t\t\traw.x -= rect.left;\n\t\t\traw.y -= rect.top;\n\t\t\tif (this.options.coordinateOutput === 'relative') return raw;\n\t\t\traw.x /= rect.width;\n\t\t\traw.y /= rect.height;\n\t\t\treturn raw;\n\t\t},\n\n\t\tdispatch: <N extends keyof Events<T>>(\n\t\t\t...args: undefined extends Events<T>[N] ? [N] : [N, Events<T>[N]]\n\t\t) => {\n\t\t\tconst name = args[0];\n\t\t\tconst e = args[1];\n\t\t\tlet lastResult: boolean | Events<T>[N] = true;\n\t\t\tfor (const value of Object.values(this.#modules)) {\n\t\t\t\tif (!value.modifiers || !(name in value.modifiers)) continue;\n\t\t\t\tlastResult =\n\t\t\t\t\te === undefined\n\t\t\t\t\t\t? (value.modifiers[name] as () => boolean)()\n\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\tvalue.modifiers[name] as (\n\t\t\t\t\t\t\t\t\tdetail?: Events<T>[N],\n\t\t\t\t\t\t\t\t) => boolean | Events<T>[N]\n\t\t\t\t\t\t\t)(e);\n\t\t\t\tif (lastResult === false) return;\n\t\t\t}\n\t\t\tlet event: Events<T>[N];\n\t\t\tif (lastResult === true) event = e as Events<T>[N];\n\t\t\telse event = lastResult;\n\t\t\tthis.#subscribers[name]?.forEach((listener) => listener(event));\n\t\t},\n\n\t\taugment: (aug: GeneralObject) => {\n\t\t\tObject.entries(aug).forEach(([key, value]) => (this[key as '_augmentSlot'] = value));\n\t\t},\n\t};\n\n\tdispatch = this.moduleUtils.dispatch;\n\n\t#runHooks<K extends HookKeys>(field: K, ...args: Parameters<Required<BaseModule>[K]>) {\n\t\tObject.values(this.#modules).forEach((module) => {\n\t\t\tconst hook = module[field];\n\t\t\t// oxlint-disable-next-line typescript/no-explicit-any\n\t\t\tif (hook) hook(...(args as any));\n\t\t});\n\t}\n\n\t#onPointerDown = (e: PointerEvent) => {\n\t\tif (this.#pointers.size >= 2) return;\n\t\tif (e.isPrimary) this.#pointers.clear();\n\t\tconst pointer = {\n\t\t\trecords: [{ x: e.clientX, y: e.clientY, timestamp: Date.now() }],\n\t\t\ttarget: e.target,\n\t\t};\n\t\tthis.#pointers.set(e.pointerId, pointer);\n\t\tthis.#runHooks('onPointerDown', e, pointer, this.#pointers);\n\t};\n\n\t#onPointerMove = (e: PointerEvent) => {\n\t\tconst pointer = this.#pointers.get(e.pointerId);\n\t\tif (!pointer) return;\n\t\tpointer.records.push({ x: e.clientX, y: e.clientY, timestamp: Date.now() });\n\t\tthis.#runHooks('onPointerMove', e, pointer, this.#pointers);\n\t};\n\n\t#onPointerUp = (e: PointerEvent) => {\n\t\tconst pointer = this.#pointers.get(e.pointerId);\n\t\tif (!pointer) return;\n\t\tthis.#pointers.delete(e.pointerId);\n\t\tthis.#runHooks('onPointerUp', e, pointer, this.#pointers);\n\t};\n\n\t#onWheel = (e: WheelEvent) => this.#runHooks('onWheel', e);\n\n\tstop = (_toStop?: Reloadable<T>) => {\n\t\tconst stopPointeract = () => {\n\t\t\tthis.#element.removeEventListener('pointerdown', this.#onPointerDown);\n\t\t\tthis.#window.removeEventListener('pointermove', this.#onPointerMove);\n\t\t\tthis.#window.removeEventListener('pointerup', this.#onPointerUp);\n\t\t\tthis.#element.removeEventListener('wheel', this.#onWheel);\n\t\t\tthis.#runHooks('onStop');\n\t\t};\n\t\tconst stopModule = (moduleCtor: ModuleCtor) => {\n\t\t\tif (!(moduleCtor.name in this.#modules)) return;\n\t\t\tconst module = this.#modules[moduleCtor.name];\n\t\t\tif (module.onStop) module.onStop();\n\t\t\tthis.#pausedModules[moduleCtor.name] = module;\n\t\t\tdelete this.#modules[moduleCtor.name];\n\t\t};\n\t\tif (!_toStop) stopPointeract();\n\t\telse\n\t\t\ttoArray(_toStop).forEach((module) => {\n\t\t\t\tstopModule(module);\n\t\t\t});\n\t\treturn this;\n\t};\n\n\tstart = (_toStart?: Reloadable<T>) => {\n\t\tconst startPointeract = () => {\n\t\t\tthis.#element.addEventListener('pointerdown', this.#onPointerDown);\n\t\t\tthis.#window.addEventListener('pointermove', this.#onPointerMove);\n\t\t\tthis.#window.addEventListener('pointerup', this.#onPointerUp);\n\t\t\tthis.#element.addEventListener('wheel', this.#onWheel, { passive: false });\n\t\t\tthis.#runHooks('onStart');\n\t\t};\n\t\tconst startModule = (moduleCtor: ModuleCtor) => {\n\t\t\tif (!(moduleCtor.name in this.#pausedModules)) return;\n\t\t\tconst module = this.#pausedModules[moduleCtor.name];\n\t\t\tif (module.onStart) module.onStart();\n\t\t\tthis.#modules[moduleCtor.name] = module;\n\t\t\tdelete this.#pausedModules[moduleCtor.name];\n\t\t};\n\t\tif (!_toStart) startPointeract();\n\t\telse\n\t\t\ttoArray(_toStart).forEach((module) => {\n\t\t\t\tstartModule(module);\n\t\t\t});\n\t\treturn this;\n\t};\n\n\tdispose = () => {\n\t\tthis.stop();\n\t\tthis.#_window = null;\n\t\tthis.#runHooks('dispose');\n\t\tthis.#subscribers = {};\n\t};\n}\n\ntype PointeractType = new <M extends ModuleInputCtor = []>(\n\t...args: ConstructorParameters<typeof Pointeract<M>>\n) => Pointeract<M> & Augmentation<M>;\n\nexport type PointeractInterface<M extends ModuleInput = []> = Pointeract<never> & Augmentation<M>;\n\nexport default Pointeract as PointeractType;\n","import BaseModule from '@/baseModule';\n\nexport default class PreventDefault extends BaseModule {\n\tonWheel = (e: WheelEvent) => e.preventDefault();\n\t#preventDefaultFunction = (e: Event) => e.preventDefault();\n\n\tonStart = () => {\n\t\tthis.element.style.touchAction = 'none';\n\t\tthis.element.addEventListener('gesturestart', this.#preventDefaultFunction, {\n\t\t\tpassive: false,\n\t\t});\n\t\tthis.element.addEventListener('gesturechange', this.#preventDefaultFunction, {\n\t\t\tpassive: false,\n\t\t});\n\t};\n\n\tonStop = () => {\n\t\tthis.element.style.touchAction = '';\n\t\tthis.element.removeEventListener('gesturestart', this.#preventDefaultFunction);\n\t\tthis.element.removeEventListener('gesturechange', this.#preventDefaultFunction);\n\t};\n\n\tdispose = this.onStop;\n}\n","import type { Coordinates, BaseOptions } from '@/declarations';\n\nimport BaseModule, { BaseArgs } from '@/baseModule';\nimport { fillIn } from '@/utils';\n\n/*\nto normal computer users:\n\n# normal schema\ndiff y > 0 => zooms in => zoom factor < 1\ndiff y < 0 => zooms out => zoom factor > 1\n\n# professional schema\ndiff y > 0 => pan up => pan y < 0\ndiff y < 0 => pan down => pan y > 0\ndiff x > 0 => pan left => pan x < 0\ndiff y < 0 => pan right => pan y > 0\n*/\n\ninterface Options extends BaseOptions {\n\tproControlSchema?: boolean;\n\tzoomFactor?: number;\n\tlockControlSchema?: boolean;\n}\n\nexport default class wheelPanZoom extends BaseModule<Options> {\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tfillIn(\n\t\t\t{ proControlSchema: false, zoomFactor: 0.1, lockControlSchema: false },\n\t\t\tthis.options,\n\t\t);\n\t}\n\n\tonWheel = (e: WheelEvent) => {\n\t\tconst options = this.options as Required<Options>;\n\t\tif (\n\t\t\t!options.proControlSchema &&\n\t\t\t!options.lockControlSchema &&\n\t\t\t(e.ctrlKey || e.shiftKey || Math.abs(e.deltaX) > Math.abs(e.deltaY))\n\t\t)\n\t\t\toptions.proControlSchema = true;\n\t\tif (options.proControlSchema) {\n\t\t\tif (e.ctrlKey) {\n\t\t\t\tconst scaleFactor = 1 - options.zoomFactor * e.deltaY;\n\t\t\t\tconst origin = this.toTargetCoords({ x: e.clientX, y: e.clientY });\n\t\t\t\tthis.#dispatchZoomEvent(scaleFactor, origin);\n\t\t\t} else if (e.shiftKey && Math.abs(e.deltaX) <= Math.abs(e.deltaY))\n\t\t\t\tthis.#dispatchPanEvent({ deltaX: -e.deltaY, deltaY: -e.deltaX });\n\t\t\telse this.#dispatchPanEvent({ deltaX: -e.deltaX, deltaY: -e.deltaY });\n\t\t} else {\n\t\t\tconst scaleFactor = 1 - (options.zoomFactor / 20) * e.deltaY;\n\t\t\tconst origin = this.toTargetCoords({ x: e.clientX, y: e.clientY });\n\t\t\tthis.#dispatchZoomEvent(scaleFactor, origin);\n\t\t}\n\t};\n\n\t#dispatchZoomEvent(factor: number, origin: Coordinates) {\n\t\tthis.dispatch('zoom', { x: origin.x, y: origin.y, factor });\n\t}\n\n\t#dispatchPanEvent(diff: { deltaX: number; deltaY: number }) {\n\t\tthis.dispatch('pan', diff);\n\t}\n}\n"],"names":["BaseModule","constructor","utils","window","pointers","element","options","this","getNthPointer","toTargetCoords","augment","dispatch","onPointerDown","onPointerUp","onPointerMove","onWheel","onStart","onStop","dispose","modifiers","getLast","arr","num","length","toArray","toTrans","Array","isArray","panPreset","decayFactor","fields","deltaX","countType","diminishBoundary","deltaY","dragPreset","lastClickTime","Infinity","clickSteak","_e","pointer","size","interrupted","e","threshold","moveThreshold","Math","abs","records","x","clientX","y","clientY","newLast","timestamp","time","clickPreserveTime","coords","target","streak","last","dx","dy","states","animationId","args","super","lubricatee","lubricator","Object","entries","forEach","key","value","sample","keys","field","catch","release","makeLubricate","requestAnimationFrame","perFrame","cancelAnimationFrame","values","detail","lubricated","accumulate","stateFields","optionsFields","config","event","perEventStates","needEmit","type","absDiff","diff","delta","reciprocalAbs","pow","pinchZoomState","lastDistance","lastMidpoint","getPointerDistance","pointer0Coords","pointer1Coords","sqrt","getPointerMidpoint","_pointer","newDistance","newMidpointOnScreen","zoomFactor","newMidpoint","dispatchPanEvent","dispatchZoomEvent","factor","origin","Map","modules","pausedModules","_window","subscribers","Error","_modules","ownerDocument","defaultView","coordinateOutput","module","instance","moduleUtils","assign","name","on","listener","Set","add","off","delete","n","error","i","raw","rect","getBoundingClientRect","left","top","width","height","lastResult","aug","runHooks","hook","isPrimary","clear","Date","now","set","pointerId","get","push","stop","_toStop","stopModule","moduleCtor","removeEventListener","stopPointeract","start","_toStart","startModule","addEventListener","passive","startPointeract","preventDefault","preventDefaultFunction","style","touchAction","patch","k","v","fillIn","proControlSchema","lockControlSchema","ctrlKey","shiftKey","scaleFactor"],"mappings":"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"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/baseModule.ts","../src/utils.ts","../src/modules/click.ts","../src/modules/drag.ts","../src/modules/multitouchPanZoom.ts","../src/modules/preventDefault.ts","../src/modules/wheelPanZoom.ts","../src/modules/lubricator.ts","../src/pointeract.ts"],"sourcesContent":["import type {\n\tBaseOptions,\n\tGeneralObject,\n\tPointer,\n\tPointers,\n\tStdEvents,\n\tConstrain,\n} from '@/declarations';\nimport type { Pointeract, PointeractInterface } from '@/pointeract';\n\nexport type HookKeys =\n\t| 'onPointerDown'\n\t| 'onPointerUp'\n\t| 'onPointerMove'\n\t| 'onWheel'\n\t| 'onStart'\n\t| 'onStop'\n\t| 'dispose';\n\nexport type BaseArgs = [\n\tPointeract<[]>['moduleUtils'],\n\tWindow,\n\tPointers,\n\tHTMLElement,\n\tGeneralObject,\n];\n\nexport default class BaseModule<\n\tO extends BaseOptions = BaseOptions,\n\tE extends StdEvents = StdEvents,\n\tA extends {} = {},\n> {\n\tdeclare private static readonly _BaseModuleBrand: unique symbol; // Nominal marker\n\tdeclare readonly _Events: E;\n\tdeclare readonly _Augmentation: A;\n\tprotected getNthPointer: Pointeract<[]>['moduleUtils']['getNthPointer'];\n\tprotected toTargetCoords: Pointeract<[]>['moduleUtils']['toTargetCoords'];\n\tprotected augment: (augmentation: A) => void;\n\tprotected dispatch: <K extends keyof Constrain<E>>(\n\t\t...arg: undefined extends E[K] ? [K] : [K, E[K]]\n\t) => void;\n\toptions: O;\n\tconstructor(\n\t\tutils: PointeractInterface['moduleUtils'],\n\t\tprotected window: Window,\n\t\tprotected pointers: Pointers,\n\t\tprotected element: HTMLElement,\n\t\toptions: GeneralObject,\n\t) {\n\t\tthis.getNthPointer = utils.getNthPointer;\n\t\tthis.toTargetCoords = utils.toTargetCoords;\n\t\tthis.augment = utils.augment;\n\t\tthis.dispatch = utils.dispatch as typeof this.dispatch;\n\t\tthis.options = options;\n\t}\n\n\tonPointerDown?: (...args: [event: PointerEvent, pointer: Pointer, pointers: Pointers]) => void;\n\tonPointerUp?: (...args: [event: PointerEvent, pointer: Pointer, pointers: Pointers]) => void;\n\tonPointerMove?: (...args: [event: PointerEvent, pointer: Pointer, pointers: Pointers]) => void;\n\tonWheel?: (...args: [event: WheelEvent]) => void;\n\tonStart?: () => void;\n\tonStop?: () => void;\n\tdispose?: () => void;\n\tmodifiers?: {\n\t\t[K in keyof Constrain<E>]?: (event: E[K]) => boolean | E[K];\n\t};\n}\n","import { GeneralObject } from '@/declarations';\n\nexport function getLast<T>(arr: Array<T>, num: number = 0) {\n\treturn arr[arr.length - 1 - num];\n}\n\nexport function fillIn(patch: GeneralObject, target: GeneralObject) {\n\tfor (const [k, v] of Object.entries(patch)) if (!(k in target)) target[k] = v;\n}\n\nexport function toArray<T>(toTrans: T | Array<T>) {\n\treturn Array.isArray(toTrans) ? toTrans : [toTrans];\n}\n","import type { BaseOptions, Pointer, Pointers } from '@/declarations';\n\nimport BaseModule from '@/baseModule';\nimport { getLast } from '@/utils';\n\ninterface Options extends BaseOptions {\n\tclickPreserveTime?: number;\n\tmoveThreshold?: number;\n}\n\nexport default class Click extends BaseModule<Options> {\n\t#lastClickTime = -Infinity;\n\t#clickSteak = 0;\n\n\tonPointerDown = (_e: PointerEvent, pointer: Pointer, pointers: Pointers) => {\n\t\tif (pointers.size === 2) {\n\t\t\tconst pointer0 = this.getNthPointer(0);\n\t\t\t/*\n interrupted means that when a pointer is moving on the screen while another pointer is down, possibly for zooming, both pointers will be seen as \"interrupted\" so that they won't be used for triggering a real click.\n */\n\t\t\tpointer0.interrupted = true;\n\t\t\tpointer.interrupted = true;\n\t\t}\n\t};\n\n\tonPointerUp = (e: PointerEvent, pointer: Pointer) => {\n\t\tif (pointer.interrupted) return;\n\t\tconst threshold = this.options.moveThreshold ?? 5;\n\t\tif (\n\t\t\tMath.abs(pointer.records[0].x - e.clientX) >= threshold ||\n\t\t\tMath.abs(pointer.records[0].y - e.clientY) >= threshold\n\t\t)\n\t\t\treturn;\n\t\tconst newLast = getLast(pointer.records).timestamp;\n\t\tconst time = this.options.clickPreserveTime ?? 400;\n\t\tif (newLast - this.#lastClickTime <= time) this.#clickSteak++;\n\t\telse this.#clickSteak = 1;\n\t\tthis.#lastClickTime = newLast;\n\t\tconst coords = this.toTargetCoords({ x: e.clientX, y: e.clientY });\n\t\tthis.dispatch('trueClick', {\n\t\t\t...coords,\n\t\t\ttarget: pointer.target,\n\t\t\tstreak: this.#clickSteak,\n\t\t});\n\t};\n}\n","import type { Pointer, Pointers } from '@/declarations';\n\nimport BaseModule from '@/baseModule';\nimport { getLast } from '@/utils';\n\nexport default class Drag extends BaseModule {\n\tonPointerMove = (e: PointerEvent, pointer: Pointer, pointers: Pointers) => {\n\t\tconst last = getLast(pointer.records, 1);\n\t\tif (pointers.size === 1) {\n\t\t\tconst dx = e.clientX - last.x;\n\t\t\tconst dy = e.clientY - last.y;\n\t\t\tthis.dispatch('drag', { deltaX: dx, deltaY: dy, x: e.clientX, y: e.clientY });\n\t\t}\n\t};\n}\n","import type { Coordinates, Pointer, Pointers } from '@/declarations';\n\nimport BaseModule from '@/baseModule';\nimport { getLast } from '@/utils';\n\nexport default class MultitouchPanZoom extends BaseModule {\n\t#pinchZoomState = {\n\t\tlastDistance: 0,\n\t\tlastMidpoint: { x: 0, y: 0 },\n\t};\n\n\t#getPointerDistance() {\n\t\tconst pointer0Coords = getLast(this.getNthPointer(0).records);\n\t\tconst pointer1Coords = getLast(this.getNthPointer(1).records);\n\t\tconst dx = pointer0Coords.x - pointer1Coords.x;\n\t\tconst dy = pointer0Coords.y - pointer1Coords.y;\n\t\treturn Math.sqrt(dx * dx + dy * dy);\n\t}\n\n\t// output screen coords\n\t#getPointerMidpoint() {\n\t\tconst pointer0Coords = getLast(this.getNthPointer(0).records);\n\t\tconst pointer1Coords = getLast(this.getNthPointer(1).records);\n\t\treturn {\n\t\t\tx: (pointer0Coords.x + pointer1Coords.x) / 2,\n\t\t\ty: (pointer0Coords.y + pointer1Coords.y) / 2,\n\t\t};\n\t}\n\n\tonPointerDown = (_e: PointerEvent, _pointer: Pointer, pointers: Pointers) => {\n\t\tif (pointers.size === 2) {\n\t\t\tthis.#pinchZoomState.lastDistance = this.#getPointerDistance();\n\t\t\tthis.#pinchZoomState.lastMidpoint = this.toTargetCoords(this.#getPointerMidpoint());\n\t\t}\n\t};\n\n\tonPointerMove = (_e: PointerEvent, _pointer: Pointer, pointers: Pointers) => {\n\t\tif (pointers.size === 2) {\n\t\t\tconst newDistance = this.#getPointerDistance();\n\t\t\tconst newMidpointOnScreen = this.#getPointerMidpoint();\n\t\t\tconst zoomFactor = newDistance / this.#pinchZoomState.lastDistance;\n\t\t\tthis.#pinchZoomState.lastDistance = newDistance;\n\t\t\tconst newMidpoint = this.toTargetCoords(newMidpointOnScreen);\n\t\t\tconst dx = newMidpoint.x - this.#pinchZoomState.lastMidpoint.x;\n\t\t\tconst dy = newMidpoint.y - this.#pinchZoomState.lastMidpoint.y;\n\t\t\tthis.#pinchZoomState.lastMidpoint = newMidpoint;\n\t\t\tthis.#dispatchPanEvent({ deltaX: dx, deltaY: dy });\n\t\t\tthis.#dispatchZoomEvent(zoomFactor, newMidpoint);\n\t\t}\n\t};\n\n\t#dispatchZoomEvent(factor: number, origin: Coordinates) {\n\t\tthis.dispatch('zoom', { x: origin.x, y: origin.y, factor });\n\t}\n\n\t#dispatchPanEvent(diff: { deltaX: number; deltaY: number }) {\n\t\tthis.dispatch('pan', diff);\n\t}\n}\n","import BaseModule from '@/baseModule';\n\nexport default class PreventDefault extends BaseModule {\n\tonWheel = (e: WheelEvent) => e.preventDefault();\n\t#preventDefaultFunction = (e: Event) => e.preventDefault();\n\n\tonStart = () => {\n\t\tthis.element.style.touchAction = 'none';\n\t\tthis.element.addEventListener('gesturestart', this.#preventDefaultFunction, {\n\t\t\tpassive: false,\n\t\t});\n\t\tthis.element.addEventListener('gesturechange', this.#preventDefaultFunction, {\n\t\t\tpassive: false,\n\t\t});\n\t};\n\n\tonStop = () => {\n\t\tthis.element.style.touchAction = '';\n\t\tthis.element.removeEventListener('gesturestart', this.#preventDefaultFunction);\n\t\tthis.element.removeEventListener('gesturechange', this.#preventDefaultFunction);\n\t};\n\n\tdispose = this.onStop;\n}\n","import type { Coordinates, BaseOptions } from '@/declarations';\n\nimport BaseModule, { BaseArgs } from '@/baseModule';\nimport { fillIn } from '@/utils';\n\n/*\nto normal computer users:\n\n# normal schema\ndiff y > 0 => zooms in => zoom factor < 1\ndiff y < 0 => zooms out => zoom factor > 1\n\n# professional schema\ndiff y > 0 => pan up => pan y < 0\ndiff y < 0 => pan down => pan y > 0\ndiff x > 0 => pan left => pan x < 0\ndiff y < 0 => pan right => pan y > 0\n*/\n\ninterface Options extends BaseOptions {\n\tproControlSchema?: boolean;\n\tzoomFactor?: number;\n\tlockControlSchema?: boolean;\n}\n\nexport default class wheelPanZoom extends BaseModule<Options> {\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tfillIn(\n\t\t\t{ proControlSchema: false, zoomFactor: 0.1, lockControlSchema: false },\n\t\t\tthis.options,\n\t\t);\n\t}\n\n\tonWheel = (e: WheelEvent) => {\n\t\tconst options = this.options as Required<Options>;\n\t\tif (\n\t\t\t!options.proControlSchema &&\n\t\t\t!options.lockControlSchema &&\n\t\t\t(e.ctrlKey || e.shiftKey || Math.abs(e.deltaX) > Math.abs(e.deltaY))\n\t\t)\n\t\t\toptions.proControlSchema = true;\n\t\tif (options.proControlSchema) {\n\t\t\tif (e.ctrlKey) {\n\t\t\t\tconst scaleFactor = 1 - options.zoomFactor * e.deltaY;\n\t\t\t\tconst origin = this.toTargetCoords({ x: e.clientX, y: e.clientY });\n\t\t\t\tthis.#dispatchZoomEvent(scaleFactor, origin);\n\t\t\t} else if (e.shiftKey && Math.abs(e.deltaX) <= Math.abs(e.deltaY))\n\t\t\t\tthis.#dispatchPanEvent({ deltaX: -e.deltaY, deltaY: -e.deltaX });\n\t\t\telse this.#dispatchPanEvent({ deltaX: -e.deltaX, deltaY: -e.deltaY });\n\t\t} else {\n\t\t\tconst scaleFactor = 1 - (options.zoomFactor / 20) * e.deltaY;\n\t\t\tconst origin = this.toTargetCoords({ x: e.clientX, y: e.clientY });\n\t\t\tthis.#dispatchZoomEvent(scaleFactor, origin);\n\t\t}\n\t};\n\n\t#dispatchZoomEvent(factor: number, origin: Coordinates) {\n\t\tthis.dispatch('zoom', { x: origin.x, y: origin.y, factor });\n\t}\n\n\t#dispatchPanEvent(diff: { deltaX: number; deltaY: number }) {\n\t\tthis.dispatch('pan', diff);\n\t}\n}\n","import BaseModule, { BaseArgs } from '@/baseModule';\nimport { BaseOptions, Events, GeneralObject } from '@/declarations';\n\ninterface Options extends BaseOptions {\n\tlubricator?: Record<string, PerEventOption>;\n}\n\ntype PerEventOption = {\n\tdecayFactor: number;\n\tfields: Record<string, { countType: 'sum' | 'product'; diminishBoundary: number }>;\n};\n\ntype PerEventStates = {\n\tsample: GeneralObject;\n\tfields: Record<\n\t\tstring,\n\t\t{\n\t\t\tcatch: number;\n\t\t\trelease: number;\n\t\t}\n\t>;\n};\n\nexport default class Lubricator extends BaseModule<Options> {\n\t#states: Record<string, PerEventStates> = {};\n\t#animationId: number | null = null;\n\n\tconstructor(...args: BaseArgs) {\n\t\tsuper(...args);\n\t\tconst lubricatee = this.options.lubricator;\n\t\tif (!lubricatee) return;\n\t\tObject.entries(lubricatee).forEach(([key, value]) => {\n\t\t\t// per event scope\n\t\t\tconst states = {\n\t\t\t\tsample: {},\n\t\t\t\tfields: {},\n\t\t\t} as PerEventStates;\n\t\t\tObject.keys(value.fields).forEach((field) => {\n\t\t\t\tstates.fields[field] = {\n\t\t\t\t\tcatch: 1,\n\t\t\t\t\trelease: 1,\n\t\t\t\t};\n\t\t\t});\n\t\t\tthis.#states[key] = states;\n\t\t\tthis.modifiers[key] = this.#makeLubricate(states, value);\n\t\t});\n\t}\n\n\tonStart = () => {\n\t\tthis.#animationId = requestAnimationFrame(this.#perFrame);\n\t};\n\n\tonStop = () => {\n\t\tif (this.#animationId) cancelAnimationFrame(this.#animationId);\n\t\tthis.#animationId = null;\n\t\tObject.values(this.#states).forEach((value) => {\n\t\t\t// per event scope\n\t\t\tObject.values(value.fields).forEach((value) => {\n\t\t\t\t// per field scope\n\t\t\t\tvalue.release = 1;\n\t\t\t\tvalue.catch = 1;\n\t\t\t});\n\t\t});\n\t};\n\n\t#makeLubricate =\n\t\t(states: PerEventStates, options: PerEventOption) => (detail: GeneralObject) => {\n\t\t\tif (detail.lubricated) return true;\n\t\t\tstates.sample = detail;\n\t\t\tthis.#accumulate(states.fields, options.fields, detail);\n\t\t\treturn false;\n\t\t};\n\n\t#accumulate = (\n\t\tstateFields: PerEventStates['fields'],\n\t\toptionsFields: PerEventOption['fields'],\n\t\tdetail: GeneralObject,\n\t) => {\n\t\tObject.entries(stateFields).forEach(([key, value]) => {\n\t\t\tif (typeof detail[key] !== 'number') return;\n\t\t\tconst config = optionsFields[key].countType;\n\t\t\tif (config === 'sum') {\n\t\t\t\tvalue.catch += detail[key];\n\t\t\t} else if (config === 'product') value.catch *= detail[key];\n\t\t});\n\t};\n\n\t#perFrame = () => {\n\t\tconst states = this.#states;\n\t\tconst options = this.options.lubricator;\n\t\tif (!options) return;\n\t\tObject.entries(states).forEach(([event, perEventStates]) => {\n\t\t\t// per event scope\n\t\t\tconst detail = perEventStates.sample;\n\t\t\tdetail.lubricated = true;\n\t\t\tlet needEmit = false;\n\t\t\tfor (const [field, value] of Object.entries(perEventStates.fields)) {\n\t\t\t\t// per field scope\n\t\t\t\tif (value.catch === 1) continue;\n\t\t\t\tconst type = options[event].fields[field].countType;\n\n\t\t\t\tlet absDiff: number, diff: number;\n\t\t\t\tif (type === 'sum') {\n\t\t\t\t\tdiff = value.catch - value.release;\n\t\t\t\t\tabsDiff = Math.abs(diff);\n\t\t\t\t} else {\n\t\t\t\t\tdiff = value.catch / value.release;\n\t\t\t\t\tabsDiff = this.#reciprocalAbs(diff) - 1;\n\t\t\t\t}\n\n\t\t\t\tif (absDiff <= options[event].fields[field].diminishBoundary) {\n\t\t\t\t\tif (!needEmit) needEmit = true;\n\t\t\t\t\tdetail[field] = diff;\n\t\t\t\t\tvalue.release = 1;\n\t\t\t\t\tvalue.catch = 1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// more to interpolate\n\t\t\t\tlet delta: number;\n\t\t\t\tif (type === 'sum') {\n\t\t\t\t\tdelta = diff * options[event].decayFactor;\n\t\t\t\t\tvalue.release += delta;\n\t\t\t\t} else {\n\t\t\t\t\tdelta = Math.pow(diff, options[event].decayFactor);\n\t\t\t\t\tvalue.release *= delta;\n\t\t\t\t}\n\t\t\t\tdetail[field] = delta;\n\t\t\t\tneedEmit = true;\n\t\t\t}\n\t\t\tif (needEmit) this.dispatch(event as keyof Events, detail as never);\n\t\t});\n\t\tthis.#animationId = requestAnimationFrame(this.#perFrame);\n\t};\n\n\t// in: positive number; out: positive number > 1\n\t#reciprocalAbs = (num: number) => (num > 1 ? num : 1 / num);\n\n\t// oxlint-disable-next-line typescript/no-explicit-any\n\tmodifiers: Record<string, any> = {};\n}\n\nexport const panPreset = {\n\tdecayFactor: 0.25,\n\tfields: {\n\t\tdeltaX: {\n\t\t\tcountType: 'sum',\n\t\t\tdiminishBoundary: 0.5,\n\t\t},\n\t\tdeltaY: {\n\t\t\tcountType: 'sum',\n\t\t\tdiminishBoundary: 0.5,\n\t\t},\n\t},\n} satisfies PerEventOption;\n\nexport const dragPreset = panPreset;\n\nexport const zoomPreset = {\n\tdecayFactor: 0.25,\n\tfields: {\n\t\tfactor: {\n\t\t\tcountType: 'product',\n\t\t\tdiminishBoundary: 0.01,\n\t\t},\n\t},\n} satisfies PerEventOption;\n","import type BaseModule from '@/baseModule';\nimport type {\n\tAugmentation,\n\tCoordinates,\n\tEvents,\n\tGeneralObject,\n\tModuleCtor,\n\tModuleInput,\n\tModuleInputCtor,\n\tOptions,\n\tPointers,\n\tReloadable,\n} from '@/declarations';\n\nimport { HookKeys } from '@/baseModule';\nimport { toArray } from '@/utils';\n\nexport class Pointeract<T extends ModuleInputCtor = []> {\n\t#element: HTMLElement;\n\t#pointers: Pointers = new Map();\n\t#modules: Record<string, BaseModule> = {};\n\t#pausedModules: Record<string, BaseModule> = {};\n\t#_window: Window | null;\n\t#subscribers: { [K in keyof Events<T>]?: Set<(event: Events<T>[K]) => void> } = {};\n\toptions: Options<T>;\n\tdeclare private _augmentSlot: unknown;\n\n\tget #window() {\n\t\tif (!this.#_window) throw new Error('[Pointeract] Window is not defined.');\n\t\treturn this.#_window;\n\t}\n\n\tconstructor(options: Options<T>, _modules?: T) {\n\t\tconst modules = toArray(_modules ? _modules : ([] as Array<ModuleCtor>));\n\t\tthis.#_window = options.element.ownerDocument.defaultView;\n\t\tthis.#element = options.element;\n\t\tif (!options.coordinateOutput) options.coordinateOutput = 'relative';\n\t\tthis.options = options;\n\t\tmodules.forEach((module) => {\n\t\t\tconst instance = new module(\n\t\t\t\tthis.moduleUtils as PointeractInterface['moduleUtils'],\n\t\t\t\tthis.#window,\n\t\t\t\tthis.#pointers,\n\t\t\t\tthis.#element,\n\t\t\t\tthis.options,\n\t\t\t);\n\t\t\tObject.assign(instance, { options });\n\t\t\tthis.#modules[module.name] = instance;\n\t\t});\n\t}\n\n\ton = <K extends keyof Events<T>>(type: K, listener: (event: Events<T>[K]) => void) => {\n\t\tif (!this.#subscribers[type]) this.#subscribers[type] = new Set();\n\t\tthis.#subscribers[type]?.add(listener);\n\t\treturn this;\n\t};\n\toff<K extends keyof Events<T>>(type: K, listener: (event: Events<T>[K]) => void) {\n\t\tthis.#subscribers[type]?.delete(listener);\n\t\treturn this;\n\t}\n\n\tprivate moduleUtils = {\n\t\tgetNthPointer: (n: number) => {\n\t\t\tconst error = new Error('[Pointeract] Invalid pointer index.');\n\t\t\tif (n < 0 || n >= this.#pointers.size) throw error;\n\t\t\tlet i = 0;\n\t\t\tfor (const value of this.#pointers.values()) {\n\t\t\t\tif (i === n) return value;\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tthrow error;\n\t\t},\n\n\t\t// Screen to Container\n\t\ttoTargetCoords: (raw: Coordinates) => {\n\t\t\tif (this.options.coordinateOutput === 'absolute') return raw;\n\t\t\tconst rect = this.#element.getBoundingClientRect();\n\t\t\traw.x -= rect.left;\n\t\t\traw.y -= rect.top;\n\t\t\tif (this.options.coordinateOutput === 'relative') return raw;\n\t\t\traw.x /= rect.width;\n\t\t\traw.y /= rect.height;\n\t\t\treturn raw;\n\t\t},\n\n\t\tdispatch: <N extends keyof Events<T>>(\n\t\t\t...args: undefined extends Events<T>[N] ? [N] : [N, Events<T>[N]]\n\t\t) => {\n\t\t\tconst name = args[0];\n\t\t\tconst e = args[1];\n\t\t\tlet lastResult: boolean | Events<T>[N] = true;\n\t\t\tfor (const value of Object.values(this.#modules)) {\n\t\t\t\tif (!value.modifiers || !(name in value.modifiers)) continue;\n\t\t\t\tlastResult =\n\t\t\t\t\te === undefined\n\t\t\t\t\t\t? (value.modifiers[name] as () => boolean)()\n\t\t\t\t\t\t: (\n\t\t\t\t\t\t\t\tvalue.modifiers[name] as (\n\t\t\t\t\t\t\t\t\tdetail?: Events<T>[N],\n\t\t\t\t\t\t\t\t) => boolean | Events<T>[N]\n\t\t\t\t\t\t\t)(e);\n\t\t\t\tif (lastResult === false) return;\n\t\t\t}\n\t\t\tlet event: Events<T>[N];\n\t\t\tif (lastResult === true) event = e as Events<T>[N];\n\t\t\telse event = lastResult;\n\t\t\tthis.#subscribers[name]?.forEach((listener) => listener(event));\n\t\t},\n\n\t\taugment: (aug: GeneralObject) => {\n\t\t\tObject.entries(aug).forEach(([key, value]) => (this[key as '_augmentSlot'] = value));\n\t\t},\n\t};\n\n\tdispatch = this.moduleUtils.dispatch;\n\n\t#runHooks<K extends HookKeys>(field: K, ...args: Parameters<Required<BaseModule>[K]>) {\n\t\tObject.values(this.#modules).forEach((module) => {\n\t\t\tconst hook = module[field];\n\t\t\t// oxlint-disable-next-line typescript/no-explicit-any\n\t\t\tif (hook) hook(...(args as any));\n\t\t});\n\t}\n\n\t#onPointerDown = (e: PointerEvent) => {\n\t\tif (this.#pointers.size >= 2) return;\n\t\tif (e.isPrimary) this.#pointers.clear();\n\t\tconst pointer = {\n\t\t\trecords: [{ x: e.clientX, y: e.clientY, timestamp: Date.now() }],\n\t\t\ttarget: e.target,\n\t\t};\n\t\tthis.#pointers.set(e.pointerId, pointer);\n\t\tthis.#runHooks('onPointerDown', e, pointer, this.#pointers);\n\t};\n\n\t#onPointerMove = (e: PointerEvent) => {\n\t\tconst pointer = this.#pointers.get(e.pointerId);\n\t\tif (!pointer) return;\n\t\tpointer.records.push({ x: e.clientX, y: e.clientY, timestamp: Date.now() });\n\t\tthis.#runHooks('onPointerMove', e, pointer, this.#pointers);\n\t};\n\n\t#onPointerUp = (e: PointerEvent) => {\n\t\tconst pointer = this.#pointers.get(e.pointerId);\n\t\tif (!pointer) return;\n\t\tthis.#pointers.delete(e.pointerId);\n\t\tthis.#runHooks('onPointerUp', e, pointer, this.#pointers);\n\t};\n\n\t#onWheel = (e: WheelEvent) => this.#runHooks('onWheel', e);\n\n\tstop = (_toStop?: Reloadable<T>) => {\n\t\tconst stopPointeract = () => {\n\t\t\tthis.#element.removeEventListener('pointerdown', this.#onPointerDown);\n\t\t\tthis.#window.removeEventListener('pointermove', this.#onPointerMove);\n\t\t\tthis.#window.removeEventListener('pointerup', this.#onPointerUp);\n\t\t\tthis.#element.removeEventListener('wheel', this.#onWheel);\n\t\t\tthis.#runHooks('onStop');\n\t\t};\n\t\tconst stopModule = (moduleCtor: ModuleCtor) => {\n\t\t\tif (!(moduleCtor.name in this.#modules)) return;\n\t\t\tconst module = this.#modules[moduleCtor.name];\n\t\t\tif (module.onStop) module.onStop();\n\t\t\tthis.#pausedModules[moduleCtor.name] = module;\n\t\t\tdelete this.#modules[moduleCtor.name];\n\t\t};\n\t\tif (!_toStop) stopPointeract();\n\t\telse\n\t\t\ttoArray(_toStop).forEach((module) => {\n\t\t\t\tstopModule(module);\n\t\t\t});\n\t\treturn this;\n\t};\n\n\tstart = (_toStart?: Reloadable<T>) => {\n\t\tconst startPointeract = () => {\n\t\t\tthis.#element.addEventListener('pointerdown', this.#onPointerDown);\n\t\t\tthis.#window.addEventListener('pointermove', this.#onPointerMove);\n\t\t\tthis.#window.addEventListener('pointerup', this.#onPointerUp);\n\t\t\tthis.#element.addEventListener('wheel', this.#onWheel, { passive: false });\n\t\t\tthis.#runHooks('onStart');\n\t\t};\n\t\tconst startModule = (moduleCtor: ModuleCtor) => {\n\t\t\tif (!(moduleCtor.name in this.#pausedModules)) return;\n\t\t\tconst module = this.#pausedModules[moduleCtor.name];\n\t\t\tif (module.onStart) module.onStart();\n\t\t\tthis.#modules[moduleCtor.name] = module;\n\t\t\tdelete this.#pausedModules[moduleCtor.name];\n\t\t};\n\t\tif (!_toStart) startPointeract();\n\t\telse\n\t\t\ttoArray(_toStart).forEach((module) => {\n\t\t\t\tstartModule(module);\n\t\t\t});\n\t\treturn this;\n\t};\n\n\tdispose = () => {\n\t\tthis.stop();\n\t\tthis.#_window = null;\n\t\tthis.#runHooks('dispose');\n\t\tthis.#subscribers = {};\n\t};\n}\n\ntype PointeractType = new <M extends ModuleInputCtor = []>(\n\t...args: ConstructorParameters<typeof Pointeract<M>>\n) => Pointeract<M> & Augmentation<M>;\n\nexport type PointeractInterface<M extends ModuleInput = []> = Pointeract<never> & Augmentation<M>;\n\nexport default Pointeract as PointeractType;\n"],"names":["BaseModule","constructor","utils","window","pointers","element","options","this","getNthPointer","toTargetCoords","augment","dispatch","onPointerDown","onPointerUp","onPointerMove","onWheel","onStart","onStop","dispose","modifiers","getLast","arr","num","length","toArray","toTrans","Array","isArray","Click","lastClickTime","Infinity","clickSteak","_e","pointer","size","interrupted","e","threshold","moveThreshold","Math","abs","records","x","clientX","y","clientY","newLast","timestamp","time","clickPreserveTime","coords","target","streak","Drag","last","dx","dy","deltaX","deltaY","MultitouchPanZoom","pinchZoomState","lastDistance","lastMidpoint","getPointerDistance","pointer0Coords","pointer1Coords","sqrt","getPointerMidpoint","_pointer","newDistance","newMidpointOnScreen","zoomFactor","newMidpoint","dispatchPanEvent","dispatchZoomEvent","factor","origin","diff","PreventDefault","preventDefault","preventDefaultFunction","style","touchAction","addEventListener","passive","removeEventListener","wheelPanZoom","args","super","patch","k","v","Object","entries","fillIn","proControlSchema","lockControlSchema","ctrlKey","shiftKey","scaleFactor","Lubricator","states","animationId","lubricatee","lubricator","forEach","key","value","sample","fields","keys","field","catch","release","makeLubricate","requestAnimationFrame","perFrame","cancelAnimationFrame","values","detail","lubricated","accumulate","stateFields","optionsFields","config","countType","event","perEventStates","needEmit","type","absDiff","delta","reciprocalAbs","diminishBoundary","decayFactor","pow","panPreset","dragPreset","zoomPreset","Pointeract","Map","modules","pausedModules","_window","subscribers","Error","_modules","ownerDocument","defaultView","coordinateOutput","module","instance","moduleUtils","assign","name","on","listener","Set","add","off","delete","n","error","i","raw","rect","getBoundingClientRect","left","top","width","height","lastResult","aug","runHooks","hook","isPrimary","clear","Date","now","set","pointerId","get","push","stop","_toStop","stopModule","moduleCtor","stopPointeract","start","_toStart","startModule","startPointeract"],"mappings":"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"}