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 +12 -21
- package/dist/{index.js → index.js.js} +1 -1
- package/dist/index.js.js.map +1 -0
- package/package.json +4 -2
- package/dist/index.cjs +0 -2
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<br>
|
|
6
6
|
</h1>
|
|
7
7
|
|
|
8
|
-
<h4 align="center">
|
|
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
|
|
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
|
|
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
|
|
128
|
-
|
|
|
129
|
-
| Written in TypeScript?
|
|
130
|
-
| Tree-shakeable?
|
|
131
|
-
| Bundle Size (Minified + Gzipped)
|
|
132
|
-
| Last Updated
|
|
133
|
-
| Features
|
|
134
|
-
| Robust? (See [Testing](
|
|
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.
|
|
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.
|
|
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
|
package/dist/index.cjs.map
DELETED
|
@@ -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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"}
|