pointrix 1.0.0

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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +971 -0
  3. package/dist/pointrix-drag.cjs +1 -0
  4. package/dist/pointrix-drag.d.cts +189 -0
  5. package/dist/pointrix-drag.d.mts +189 -0
  6. package/dist/pointrix-drag.mjs +2 -0
  7. package/dist/pointrix-dropzone.cjs +1 -0
  8. package/dist/pointrix-dropzone.d.cts +99 -0
  9. package/dist/pointrix-dropzone.d.mts +99 -0
  10. package/dist/pointrix-dropzone.mjs +2 -0
  11. package/dist/pointrix-gesture.cjs +1 -0
  12. package/dist/pointrix-gesture.d.cts +119 -0
  13. package/dist/pointrix-gesture.d.mts +119 -0
  14. package/dist/pointrix-gesture.mjs +2 -0
  15. package/dist/pointrix-modifiers.cjs +1 -0
  16. package/dist/pointrix-modifiers.d.cts +334 -0
  17. package/dist/pointrix-modifiers.d.mts +334 -0
  18. package/dist/pointrix-modifiers.mjs +2 -0
  19. package/dist/pointrix-nano.cjs +1 -0
  20. package/dist/pointrix-nano.d.cts +82 -0
  21. package/dist/pointrix-nano.d.mts +82 -0
  22. package/dist/pointrix-nano.mjs +2 -0
  23. package/dist/pointrix-react.cjs +1 -0
  24. package/dist/pointrix-react.d.cts +537 -0
  25. package/dist/pointrix-react.d.mts +537 -0
  26. package/dist/pointrix-react.mjs +2 -0
  27. package/dist/pointrix-resize.cjs +1 -0
  28. package/dist/pointrix-resize.d.cts +193 -0
  29. package/dist/pointrix-resize.d.mts +193 -0
  30. package/dist/pointrix-resize.mjs +2 -0
  31. package/dist/pointrix-sortable.cjs +1 -0
  32. package/dist/pointrix-sortable.d.cts +89 -0
  33. package/dist/pointrix-sortable.d.mts +89 -0
  34. package/dist/pointrix-sortable.mjs +2 -0
  35. package/dist/pointrix-vue.cjs +1 -0
  36. package/dist/pointrix-vue.d.cts +485 -0
  37. package/dist/pointrix-vue.d.mts +485 -0
  38. package/dist/pointrix-vue.mjs +2 -0
  39. package/dist/pointrix.cjs +1 -0
  40. package/dist/pointrix.d.cts +784 -0
  41. package/dist/pointrix.d.mts +784 -0
  42. package/dist/pointrix.mjs +2 -0
  43. package/package.json +144 -0
@@ -0,0 +1 @@
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});let e=null,t=new Set,n=new Set,r=null;function i(){return!r&&typeof PointerEvent<`u`&&(r=new PointerEvent(`pointermove`)),r}function a(){e===null&&(e=requestAnimationFrame(()=>{e=null;for(let e of n)e.update();if(n.clear(),t.size>0){let e=!1;for(let n of t)if(n.hasActivePointers()){e=!0;break}e&&a()}}))}var o=class e{on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),this}off(e,t){return this.listeners.get(e)?.delete(t),this}emit(e,t){let n=this.listeners.get(e);if(n)for(let e of n)e(t)}get enabled(){return this._enabled}set enabled(r){this._enabled=r,!r&&this.isActive&&(this.pointers.clear(),this.pointersCache=[],this.isActive=!1,t.delete(this),n.delete(this),e.activeInstance.get(this.element)===this&&e.activeInstance.set(this.element,null),document.removeEventListener(`pointermove`,this.onPointerMove),document.removeEventListener(`pointerup`,this.onPointerUp),document.removeEventListener(`pointercancel`,this.onPointerUp))}get interacting(){return this.isActive}static{this.elementInstances=new WeakMap}static{this.activeInstance=new WeakMap}static{this.elementListeners=new WeakMap}constructor(t,n={}){this.pointers=new Map,this.pointersCache=[],this.isActive=!1,this.lastUpdate=0,this.priority=0,this._enabled=!0,this.holdTimer=null,this.holdEventTimer=null,this.lastTapTime=0,this.lastTapTarget=null,this.listeners=new Map,this.element=t,this.options={threshold:3,preventScroll:!0,styleCursor:!0,...n},this.registerInstance();let r=e.elementInstances.get(t);if(r&&r.length===1&&(t.style.touchAction=this.options.touchAction??`none`,t.style.userSelect=`none`,t.style.webkitUserSelect=`none`),this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),r&&r.length===1){let n=n=>e.handleElementPointerDown(t,n);e.elementListeners.set(t,n),t.addEventListener(`pointerdown`,n)}}registerInstance(){let t=e.elementInstances.get(this.element);t?t.push(this):e.elementInstances.set(this.element,[this])}unregisterInstance(){let t=e.elementInstances.get(this.element);if(!t)return;let n=t.indexOf(this);n>=0&&(t.splice(n,1),t.length===0?(e.elementInstances.delete(this.element),e.activeInstance.delete(this.element),e.elementListeners.delete(this.element)):e.elementInstances.set(this.element,t))}shouldHandleEvent(e){return!0}checkEventFilters(e){let t=e.target;return t?!(this.options.ignoreFrom&&t.closest(this.options.ignoreFrom)||this.options.allowFrom&&!t.closest(this.options.allowFrom)):!0}static handleElementPointerDown(t,n){let r=e.elementInstances.get(t);if(!r)return;let i=e.activeInstance.get(t);if(i){i.onPointerDown(n);return}let a=null,o=-1;for(let e of r)e.checkEventFilters(n)&&e.shouldHandleEvent(n)&&e.enabled&&e.priority>o&&(a=e,o=e.priority);a&&(e.activeInstance.set(t,a),a.handlePointerDown(n))}onPointerDown(e){this.handlePointerDown(e)}handlePointerDown(e){if(this.options.mouseButtons&&!(e.buttons&this.options.mouseButtons))return;this.options.preventScroll&&e.preventDefault();let t={x:e.clientX,y:e.clientY},n={id:e.pointerId,start:{...t},current:{...t},previous:{...t},delta:{x:0,y:0},total:{x:0,y:0},velocity:{x:0,y:0},timestamp:e.timeStamp};this.pointers.set(e.pointerId,n),this.pointersCache=Array.from(this.pointers.values()),this.pointers.size===1&&(document.addEventListener(`pointermove`,this.onPointerMove,{passive:!1}),document.addEventListener(`pointerup`,this.onPointerUp),document.addEventListener(`pointercancel`,this.onPointerUp)),this.options.onHold&&(this.holdEventTimer&&clearTimeout(this.holdEventTimer),this.holdEventTimer=setTimeout(()=>{this.holdEventTimer=null,this.pointers.size>0&&!this.isActive&&this.options.onHold(this.createEvent(e))},this.options.holdDuration??600));let r=this.options.holdDelay??0;r>0?(this.holdTimer&&clearTimeout(this.holdTimer),this.holdTimer=setTimeout(()=>{this.holdTimer=null,!this.isActive&&this.pointers.size>0&&this.start(e)},r)):this.options.threshold===0&&this.start(e)}onPointerMove(e){let r=this.pointers.get(e.pointerId);if(!r)return;let i=e.clientX,o=e.clientY;if(r.current.x!==i||r.current.y!==o){if(r.current.x=i,r.current.y=o,!this.isActive){let t=r.current.x-r.start.x,n=r.current.y-r.start.y;Math.sqrt(t*t+n*n)>=(this.options.threshold||3)&&(this.holdTimer&&=(clearTimeout(this.holdTimer),null),this.holdEventTimer&&=(clearTimeout(this.holdEventTimer),null),this.start(e))}this.isActive&&(this.options.preventScroll&&e.preventDefault(),t.add(this),n.add(this),a())}}onPointerUp(e){if(this.pointers.get(e.pointerId)&&(this.pointers.delete(e.pointerId),this.pointersCache=Array.from(this.pointers.values()),this.holdTimer&&=(clearTimeout(this.holdTimer),null),this.holdEventTimer&&=(clearTimeout(this.holdEventTimer),null),this.pointers.size===0))if(document.removeEventListener(`pointermove`,this.onPointerMove),document.removeEventListener(`pointerup`,this.onPointerUp),document.removeEventListener(`pointercancel`,this.onPointerUp),this.isActive)this.end(e);else{let t=this.createEvent(e);this.options.onTap&&this.options.onTap(t),this.emit(`tap`,t);let n=e.timeStamp;this.options.onDoubleTap&&n-this.lastTapTime<300&&this.lastTapTarget===e.target&&this.options.onDoubleTap(t),this.lastTapTime=n,this.lastTapTarget=e.target}}start(e){this.isActive=!0,t.add(this);let n=this.createEvent(e);this.options.onStart&&this.options.onStart(n),this.emit(`start`,n)}end(r){this.isActive=!1,t.delete(this),n.delete(this),e.activeInstance.get(this.element)===this&&e.activeInstance.set(this.element,null);let i=this.createEvent(r);this.options.onEnd&&this.options.onEnd(i),this.emit(`end`,i)}update(){if(!this.isActive||this.pointers.size===0)return;let e=performance.now(),t=e-this.lastUpdate;this.lastUpdate=e;let r=!1,a=!1;if(this.pointers.forEach(e=>{let n=e.current.x-e.previous.x,i=e.current.y-e.previous.y;if(n!==0||i!==0){if(r=!0,e.delta.x=n,e.delta.y=i,e.total.x=e.current.x-e.start.x,e.total.y=e.current.y-e.start.y,t>0){let r=n/t*1e3,a=i/t*1e3;e.velocity.x=e.velocity.x*.7+r*.3,e.velocity.y=e.velocity.y*.7+a*.3}e.previous.x=e.current.x,e.previous.y=e.current.y}(Math.abs(e.velocity.x)>.1||Math.abs(e.velocity.y)>.1)&&(a=!0)}),r){let e=i(),t=this.createEvent(e);this.options.onMove&&this.options.onMove(t),this.emit(`move`,t)}a&&n.add(this)}hasActivePointers(){if(!this.isActive||this.pointers.size===0)return!1;for(let e of this.pointers.values())if(Math.abs(e.velocity.x)>.1||Math.abs(e.velocity.y)>.1)return!0;return this.pointers.size>0}createEvent(e){return{target:this.element,pointers:this.pointersCache,isPrimary:e.isPrimary,originalEvent:e}}destroy(){this.holdTimer&&=(clearTimeout(this.holdTimer),null),this.holdEventTimer&&=(clearTimeout(this.holdEventTimer),null),this.unregisterInstance();let n=e.elementInstances.get(this.element);if(!n||n.length===0){let t=e.elementListeners.get(this.element);t&&(this.element.removeEventListener(`pointerdown`,t),e.elementListeners.delete(this.element)),this.element.style.touchAction=``,this.element.style.userSelect=``,this.element.style.webkitUserSelect=``}this.pointers.size>0&&(document.removeEventListener(`pointermove`,this.onPointerMove),document.removeEventListener(`pointerup`,this.onPointerUp),document.removeEventListener(`pointercancel`,this.onPointerUp)),t.delete(this),this.pointers.clear(),this.pointersCache=[]}},s=class extends o{constructor(e,t={}){super(e,{...t,threshold:0}),this.gestureActive=!1,this.startDistance=0,this.startAngle=0,this.prevScale=1,this.prevAngle=0,this.gestureOptions=t,this.minPointers=t.minPointers??2,this.priority=15}shouldHandleEvent(e){return!0}getTwoPointers(){if(this.pointers.size<2)return null;let e=this.pointers.values(),t=e.next().value,n=e.next().value;return[t.current,n.current]}computeDistance(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.sqrt(n*n+r*r)}computeAngle(e,t){return Math.atan2(t.y-e.y,t.x-e.x)*180/Math.PI}computeCenter(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}normalizeAngleDelta(e){for(;e>180;)e-=360;for(;e<-180;)e+=360;return e}createGestureEvent(e,t){return{...e,scale:t.scale??1,rotation:t.rotation??0,distance:t.distance??0,angle:t.angle??0,center:t.center??{x:0,y:0},deltaScale:t.deltaScale??0,deltaAngle:t.deltaAngle??0}}update(){if(!this.isActive||this.pointers.size===0)return;let e=this.getTwoPointers();if(!this.gestureActive&&e&&this.pointers.size>=this.minPointers){this.gestureActive=!0;let[t,n]=e;this.startDistance=this.computeDistance(t,n),this.startAngle=this.computeAngle(t,n),this.prevScale=1,this.prevAngle=0;let r={target:this.element,pointers:Array.from(this.pointers.values()),isPrimary:!1,originalEvent:new PointerEvent(`pointermove`)},i=this.createGestureEvent(r,{scale:1,rotation:0,distance:this.startDistance,angle:this.startAngle,center:this.computeCenter(t,n),deltaScale:0,deltaAngle:0});this.gestureOptions.onGestureStart&&this.gestureOptions.onGestureStart(i),this.emit(`gesturestart`,i);return}if(this.gestureActive&&this.pointers.size<this.minPointers){this.endGesture(),super.update();return}if(this.gestureActive&&e){let[t,n]=e,r=this.computeDistance(t,n),i=this.computeAngle(t,n),a=this.computeCenter(t,n),o=this.startDistance>0?r/this.startDistance:1,s=this.normalizeAngleDelta(i-this.startAngle),c=o-this.prevScale,l=this.normalizeAngleDelta(s-this.prevAngle);this.prevScale=o,this.prevAngle=s;let u={target:this.element,pointers:Array.from(this.pointers.values()),isPrimary:!1,originalEvent:new PointerEvent(`pointermove`)},d=this.createGestureEvent(u,{scale:o,rotation:s,distance:r,angle:i,center:a,deltaScale:c,deltaAngle:l});this.gestureOptions.onGestureMove&&this.gestureOptions.onGestureMove(d),this.emit(`gesturemove`,d)}super.update()}endGesture(){if(!this.gestureActive)return;this.gestureActive=!1;let e={target:this.element,pointers:Array.from(this.pointers.values()),isPrimary:!1,originalEvent:new PointerEvent(`pointerup`)},t=this.getTwoPointers(),n=t?this.computeDistance(t[0],t[1]):0,r=t?this.computeAngle(t[0],t[1]):0,i=t?this.computeCenter(t[0],t[1]):{x:0,y:0},a=this.startDistance>0&&n>0?n/this.startDistance:this.prevScale,o=this.createGestureEvent(e,{scale:a,rotation:this.prevAngle,distance:n,angle:r,center:i,deltaScale:0,deltaAngle:0});this.gestureOptions.onGestureEnd&&this.gestureOptions.onGestureEnd(o),this.emit(`gestureend`,o)}destroy(){this.gestureActive&&this.endGesture(),super.destroy()}};function c(e,t){let n=typeof e==`string`?document.querySelector(e):e;if(!n)throw Error(`Element not found: ${e}`);return new s(n,t)}exports.Gesturable=s,exports.default=c,exports.gesturable=c;
@@ -0,0 +1,119 @@
1
+ //#region src/nano.d.ts
2
+ interface Point {
3
+ x: number;
4
+ y: number;
5
+ }
6
+ interface PointerState {
7
+ id: number;
8
+ start: Point;
9
+ current: Point;
10
+ previous: Point;
11
+ delta: Point;
12
+ total: Point;
13
+ velocity: Point;
14
+ timestamp: number;
15
+ }
16
+ interface InteractionEvent {
17
+ target: HTMLElement;
18
+ pointers: PointerState[];
19
+ isPrimary: boolean;
20
+ originalEvent: PointerEvent;
21
+ }
22
+ interface GripOptions {
23
+ onStart?: (event: InteractionEvent) => void;
24
+ onMove?: (event: InteractionEvent) => void;
25
+ onEnd?: (event: InteractionEvent) => void;
26
+ onTap?: (event: InteractionEvent) => void;
27
+ onDoubleTap?: (event: InteractionEvent) => void;
28
+ onHold?: (event: InteractionEvent) => void;
29
+ threshold?: number;
30
+ preventScroll?: boolean;
31
+ holdDelay?: number;
32
+ holdDuration?: number;
33
+ mouseButtons?: number;
34
+ allowFrom?: string;
35
+ ignoreFrom?: string;
36
+ touchAction?: string;
37
+ styleCursor?: boolean;
38
+ }
39
+ declare class Grip {
40
+ protected element: HTMLElement;
41
+ protected options: GripOptions;
42
+ protected pointers: Map<number, PointerState>;
43
+ private pointersCache;
44
+ protected isActive: boolean;
45
+ protected lastUpdate: number;
46
+ protected priority: number;
47
+ private _enabled;
48
+ private holdTimer;
49
+ private holdEventTimer;
50
+ private lastTapTime;
51
+ private lastTapTarget;
52
+ private listeners;
53
+ on(event: string, handler: Function): this;
54
+ off(event: string, handler: Function): this;
55
+ protected emit(event: string, data: any): void;
56
+ get enabled(): boolean;
57
+ set enabled(value: boolean);
58
+ get interacting(): boolean;
59
+ private static elementInstances;
60
+ private static activeInstance;
61
+ private static elementListeners;
62
+ constructor(element: HTMLElement, options?: GripOptions);
63
+ private registerInstance;
64
+ private unregisterInstance;
65
+ protected shouldHandleEvent(_e: PointerEvent): boolean;
66
+ private checkEventFilters;
67
+ private static handleElementPointerDown;
68
+ private onPointerDown;
69
+ private handlePointerDown;
70
+ private onPointerMove;
71
+ private onPointerUp;
72
+ private start;
73
+ private end;
74
+ update(): void;
75
+ hasActivePointers(): boolean;
76
+ private createEvent;
77
+ destroy(): void;
78
+ }
79
+ //#endregion
80
+ //#region src/gesture.d.ts
81
+ interface GestureEvent extends InteractionEvent {
82
+ scale: number;
83
+ rotation: number;
84
+ distance: number;
85
+ angle: number;
86
+ center: Point;
87
+ deltaScale: number;
88
+ deltaAngle: number;
89
+ }
90
+ interface GestureOptions extends GripOptions {
91
+ minPointers?: number;
92
+ onGestureStart?: (event: GestureEvent) => void;
93
+ onGestureMove?: (event: GestureEvent) => void;
94
+ onGestureEnd?: (event: GestureEvent) => void;
95
+ }
96
+ declare class Gesturable extends Grip {
97
+ private gestureOptions;
98
+ private gestureActive;
99
+ private startDistance;
100
+ private startAngle;
101
+ private prevScale;
102
+ private prevAngle;
103
+ private minPointers;
104
+ constructor(element: HTMLElement, options?: GestureOptions);
105
+ protected shouldHandleEvent(_e: PointerEvent): boolean;
106
+ private getTwoPointers;
107
+ private computeDistance;
108
+ private computeAngle;
109
+ private computeCenter;
110
+ private normalizeAngleDelta;
111
+ private createGestureEvent;
112
+ update(): void;
113
+ private endGesture;
114
+ destroy(): void;
115
+ }
116
+ declare function gesturable(element: HTMLElement | string, options?: GestureOptions): Gesturable;
117
+ //#endregion
118
+ export { Gesturable, GestureEvent, GestureOptions, gesturable as default, gesturable };
119
+ //# sourceMappingURL=pointrix-gesture.d.cts.map
@@ -0,0 +1,119 @@
1
+ //#region src/nano.d.ts
2
+ interface Point {
3
+ x: number;
4
+ y: number;
5
+ }
6
+ interface PointerState {
7
+ id: number;
8
+ start: Point;
9
+ current: Point;
10
+ previous: Point;
11
+ delta: Point;
12
+ total: Point;
13
+ velocity: Point;
14
+ timestamp: number;
15
+ }
16
+ interface InteractionEvent {
17
+ target: HTMLElement;
18
+ pointers: PointerState[];
19
+ isPrimary: boolean;
20
+ originalEvent: PointerEvent;
21
+ }
22
+ interface GripOptions {
23
+ onStart?: (event: InteractionEvent) => void;
24
+ onMove?: (event: InteractionEvent) => void;
25
+ onEnd?: (event: InteractionEvent) => void;
26
+ onTap?: (event: InteractionEvent) => void;
27
+ onDoubleTap?: (event: InteractionEvent) => void;
28
+ onHold?: (event: InteractionEvent) => void;
29
+ threshold?: number;
30
+ preventScroll?: boolean;
31
+ holdDelay?: number;
32
+ holdDuration?: number;
33
+ mouseButtons?: number;
34
+ allowFrom?: string;
35
+ ignoreFrom?: string;
36
+ touchAction?: string;
37
+ styleCursor?: boolean;
38
+ }
39
+ declare class Grip {
40
+ protected element: HTMLElement;
41
+ protected options: GripOptions;
42
+ protected pointers: Map<number, PointerState>;
43
+ private pointersCache;
44
+ protected isActive: boolean;
45
+ protected lastUpdate: number;
46
+ protected priority: number;
47
+ private _enabled;
48
+ private holdTimer;
49
+ private holdEventTimer;
50
+ private lastTapTime;
51
+ private lastTapTarget;
52
+ private listeners;
53
+ on(event: string, handler: Function): this;
54
+ off(event: string, handler: Function): this;
55
+ protected emit(event: string, data: any): void;
56
+ get enabled(): boolean;
57
+ set enabled(value: boolean);
58
+ get interacting(): boolean;
59
+ private static elementInstances;
60
+ private static activeInstance;
61
+ private static elementListeners;
62
+ constructor(element: HTMLElement, options?: GripOptions);
63
+ private registerInstance;
64
+ private unregisterInstance;
65
+ protected shouldHandleEvent(_e: PointerEvent): boolean;
66
+ private checkEventFilters;
67
+ private static handleElementPointerDown;
68
+ private onPointerDown;
69
+ private handlePointerDown;
70
+ private onPointerMove;
71
+ private onPointerUp;
72
+ private start;
73
+ private end;
74
+ update(): void;
75
+ hasActivePointers(): boolean;
76
+ private createEvent;
77
+ destroy(): void;
78
+ }
79
+ //#endregion
80
+ //#region src/gesture.d.ts
81
+ interface GestureEvent extends InteractionEvent {
82
+ scale: number;
83
+ rotation: number;
84
+ distance: number;
85
+ angle: number;
86
+ center: Point;
87
+ deltaScale: number;
88
+ deltaAngle: number;
89
+ }
90
+ interface GestureOptions extends GripOptions {
91
+ minPointers?: number;
92
+ onGestureStart?: (event: GestureEvent) => void;
93
+ onGestureMove?: (event: GestureEvent) => void;
94
+ onGestureEnd?: (event: GestureEvent) => void;
95
+ }
96
+ declare class Gesturable extends Grip {
97
+ private gestureOptions;
98
+ private gestureActive;
99
+ private startDistance;
100
+ private startAngle;
101
+ private prevScale;
102
+ private prevAngle;
103
+ private minPointers;
104
+ constructor(element: HTMLElement, options?: GestureOptions);
105
+ protected shouldHandleEvent(_e: PointerEvent): boolean;
106
+ private getTwoPointers;
107
+ private computeDistance;
108
+ private computeAngle;
109
+ private computeCenter;
110
+ private normalizeAngleDelta;
111
+ private createGestureEvent;
112
+ update(): void;
113
+ private endGesture;
114
+ destroy(): void;
115
+ }
116
+ declare function gesturable(element: HTMLElement | string, options?: GestureOptions): Gesturable;
117
+ //#endregion
118
+ export { Gesturable, GestureEvent, GestureOptions, gesturable as default, gesturable };
119
+ //# sourceMappingURL=pointrix-gesture.d.mts.map
@@ -0,0 +1,2 @@
1
+ let e=null,t=new Set,n=new Set,r=null;function i(){return!r&&typeof PointerEvent<`u`&&(r=new PointerEvent(`pointermove`)),r}function a(){e===null&&(e=requestAnimationFrame(()=>{e=null;for(let e of n)e.update();if(n.clear(),t.size>0){let e=!1;for(let n of t)if(n.hasActivePointers()){e=!0;break}e&&a()}}))}var o=class e{on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),this}off(e,t){return this.listeners.get(e)?.delete(t),this}emit(e,t){let n=this.listeners.get(e);if(n)for(let e of n)e(t)}get enabled(){return this._enabled}set enabled(r){this._enabled=r,!r&&this.isActive&&(this.pointers.clear(),this.pointersCache=[],this.isActive=!1,t.delete(this),n.delete(this),e.activeInstance.get(this.element)===this&&e.activeInstance.set(this.element,null),document.removeEventListener(`pointermove`,this.onPointerMove),document.removeEventListener(`pointerup`,this.onPointerUp),document.removeEventListener(`pointercancel`,this.onPointerUp))}get interacting(){return this.isActive}static{this.elementInstances=new WeakMap}static{this.activeInstance=new WeakMap}static{this.elementListeners=new WeakMap}constructor(t,n={}){this.pointers=new Map,this.pointersCache=[],this.isActive=!1,this.lastUpdate=0,this.priority=0,this._enabled=!0,this.holdTimer=null,this.holdEventTimer=null,this.lastTapTime=0,this.lastTapTarget=null,this.listeners=new Map,this.element=t,this.options={threshold:3,preventScroll:!0,styleCursor:!0,...n},this.registerInstance();let r=e.elementInstances.get(t);if(r&&r.length===1&&(t.style.touchAction=this.options.touchAction??`none`,t.style.userSelect=`none`,t.style.webkitUserSelect=`none`),this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),r&&r.length===1){let n=n=>e.handleElementPointerDown(t,n);e.elementListeners.set(t,n),t.addEventListener(`pointerdown`,n)}}registerInstance(){let t=e.elementInstances.get(this.element);t?t.push(this):e.elementInstances.set(this.element,[this])}unregisterInstance(){let t=e.elementInstances.get(this.element);if(!t)return;let n=t.indexOf(this);n>=0&&(t.splice(n,1),t.length===0?(e.elementInstances.delete(this.element),e.activeInstance.delete(this.element),e.elementListeners.delete(this.element)):e.elementInstances.set(this.element,t))}shouldHandleEvent(e){return!0}checkEventFilters(e){let t=e.target;return t?!(this.options.ignoreFrom&&t.closest(this.options.ignoreFrom)||this.options.allowFrom&&!t.closest(this.options.allowFrom)):!0}static handleElementPointerDown(t,n){let r=e.elementInstances.get(t);if(!r)return;let i=e.activeInstance.get(t);if(i){i.onPointerDown(n);return}let a=null,o=-1;for(let e of r)e.checkEventFilters(n)&&e.shouldHandleEvent(n)&&e.enabled&&e.priority>o&&(a=e,o=e.priority);a&&(e.activeInstance.set(t,a),a.handlePointerDown(n))}onPointerDown(e){this.handlePointerDown(e)}handlePointerDown(e){if(this.options.mouseButtons&&!(e.buttons&this.options.mouseButtons))return;this.options.preventScroll&&e.preventDefault();let t={x:e.clientX,y:e.clientY},n={id:e.pointerId,start:{...t},current:{...t},previous:{...t},delta:{x:0,y:0},total:{x:0,y:0},velocity:{x:0,y:0},timestamp:e.timeStamp};this.pointers.set(e.pointerId,n),this.pointersCache=Array.from(this.pointers.values()),this.pointers.size===1&&(document.addEventListener(`pointermove`,this.onPointerMove,{passive:!1}),document.addEventListener(`pointerup`,this.onPointerUp),document.addEventListener(`pointercancel`,this.onPointerUp)),this.options.onHold&&(this.holdEventTimer&&clearTimeout(this.holdEventTimer),this.holdEventTimer=setTimeout(()=>{this.holdEventTimer=null,this.pointers.size>0&&!this.isActive&&this.options.onHold(this.createEvent(e))},this.options.holdDuration??600));let r=this.options.holdDelay??0;r>0?(this.holdTimer&&clearTimeout(this.holdTimer),this.holdTimer=setTimeout(()=>{this.holdTimer=null,!this.isActive&&this.pointers.size>0&&this.start(e)},r)):this.options.threshold===0&&this.start(e)}onPointerMove(e){let r=this.pointers.get(e.pointerId);if(!r)return;let i=e.clientX,o=e.clientY;if(r.current.x!==i||r.current.y!==o){if(r.current.x=i,r.current.y=o,!this.isActive){let t=r.current.x-r.start.x,n=r.current.y-r.start.y;Math.sqrt(t*t+n*n)>=(this.options.threshold||3)&&(this.holdTimer&&=(clearTimeout(this.holdTimer),null),this.holdEventTimer&&=(clearTimeout(this.holdEventTimer),null),this.start(e))}this.isActive&&(this.options.preventScroll&&e.preventDefault(),t.add(this),n.add(this),a())}}onPointerUp(e){if(this.pointers.get(e.pointerId)&&(this.pointers.delete(e.pointerId),this.pointersCache=Array.from(this.pointers.values()),this.holdTimer&&=(clearTimeout(this.holdTimer),null),this.holdEventTimer&&=(clearTimeout(this.holdEventTimer),null),this.pointers.size===0))if(document.removeEventListener(`pointermove`,this.onPointerMove),document.removeEventListener(`pointerup`,this.onPointerUp),document.removeEventListener(`pointercancel`,this.onPointerUp),this.isActive)this.end(e);else{let t=this.createEvent(e);this.options.onTap&&this.options.onTap(t),this.emit(`tap`,t);let n=e.timeStamp;this.options.onDoubleTap&&n-this.lastTapTime<300&&this.lastTapTarget===e.target&&this.options.onDoubleTap(t),this.lastTapTime=n,this.lastTapTarget=e.target}}start(e){this.isActive=!0,t.add(this);let n=this.createEvent(e);this.options.onStart&&this.options.onStart(n),this.emit(`start`,n)}end(r){this.isActive=!1,t.delete(this),n.delete(this),e.activeInstance.get(this.element)===this&&e.activeInstance.set(this.element,null);let i=this.createEvent(r);this.options.onEnd&&this.options.onEnd(i),this.emit(`end`,i)}update(){if(!this.isActive||this.pointers.size===0)return;let e=performance.now(),t=e-this.lastUpdate;this.lastUpdate=e;let r=!1,a=!1;if(this.pointers.forEach(e=>{let n=e.current.x-e.previous.x,i=e.current.y-e.previous.y;if(n!==0||i!==0){if(r=!0,e.delta.x=n,e.delta.y=i,e.total.x=e.current.x-e.start.x,e.total.y=e.current.y-e.start.y,t>0){let r=n/t*1e3,a=i/t*1e3;e.velocity.x=e.velocity.x*.7+r*.3,e.velocity.y=e.velocity.y*.7+a*.3}e.previous.x=e.current.x,e.previous.y=e.current.y}(Math.abs(e.velocity.x)>.1||Math.abs(e.velocity.y)>.1)&&(a=!0)}),r){let e=i(),t=this.createEvent(e);this.options.onMove&&this.options.onMove(t),this.emit(`move`,t)}a&&n.add(this)}hasActivePointers(){if(!this.isActive||this.pointers.size===0)return!1;for(let e of this.pointers.values())if(Math.abs(e.velocity.x)>.1||Math.abs(e.velocity.y)>.1)return!0;return this.pointers.size>0}createEvent(e){return{target:this.element,pointers:this.pointersCache,isPrimary:e.isPrimary,originalEvent:e}}destroy(){this.holdTimer&&=(clearTimeout(this.holdTimer),null),this.holdEventTimer&&=(clearTimeout(this.holdEventTimer),null),this.unregisterInstance();let n=e.elementInstances.get(this.element);if(!n||n.length===0){let t=e.elementListeners.get(this.element);t&&(this.element.removeEventListener(`pointerdown`,t),e.elementListeners.delete(this.element)),this.element.style.touchAction=``,this.element.style.userSelect=``,this.element.style.webkitUserSelect=``}this.pointers.size>0&&(document.removeEventListener(`pointermove`,this.onPointerMove),document.removeEventListener(`pointerup`,this.onPointerUp),document.removeEventListener(`pointercancel`,this.onPointerUp)),t.delete(this),this.pointers.clear(),this.pointersCache=[]}},s=class extends o{constructor(e,t={}){super(e,{...t,threshold:0}),this.gestureActive=!1,this.startDistance=0,this.startAngle=0,this.prevScale=1,this.prevAngle=0,this.gestureOptions=t,this.minPointers=t.minPointers??2,this.priority=15}shouldHandleEvent(e){return!0}getTwoPointers(){if(this.pointers.size<2)return null;let e=this.pointers.values(),t=e.next().value,n=e.next().value;return[t.current,n.current]}computeDistance(e,t){let n=t.x-e.x,r=t.y-e.y;return Math.sqrt(n*n+r*r)}computeAngle(e,t){return Math.atan2(t.y-e.y,t.x-e.x)*180/Math.PI}computeCenter(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}normalizeAngleDelta(e){for(;e>180;)e-=360;for(;e<-180;)e+=360;return e}createGestureEvent(e,t){return{...e,scale:t.scale??1,rotation:t.rotation??0,distance:t.distance??0,angle:t.angle??0,center:t.center??{x:0,y:0},deltaScale:t.deltaScale??0,deltaAngle:t.deltaAngle??0}}update(){if(!this.isActive||this.pointers.size===0)return;let e=this.getTwoPointers();if(!this.gestureActive&&e&&this.pointers.size>=this.minPointers){this.gestureActive=!0;let[t,n]=e;this.startDistance=this.computeDistance(t,n),this.startAngle=this.computeAngle(t,n),this.prevScale=1,this.prevAngle=0;let r={target:this.element,pointers:Array.from(this.pointers.values()),isPrimary:!1,originalEvent:new PointerEvent(`pointermove`)},i=this.createGestureEvent(r,{scale:1,rotation:0,distance:this.startDistance,angle:this.startAngle,center:this.computeCenter(t,n),deltaScale:0,deltaAngle:0});this.gestureOptions.onGestureStart&&this.gestureOptions.onGestureStart(i),this.emit(`gesturestart`,i);return}if(this.gestureActive&&this.pointers.size<this.minPointers){this.endGesture(),super.update();return}if(this.gestureActive&&e){let[t,n]=e,r=this.computeDistance(t,n),i=this.computeAngle(t,n),a=this.computeCenter(t,n),o=this.startDistance>0?r/this.startDistance:1,s=this.normalizeAngleDelta(i-this.startAngle),c=o-this.prevScale,l=this.normalizeAngleDelta(s-this.prevAngle);this.prevScale=o,this.prevAngle=s;let u={target:this.element,pointers:Array.from(this.pointers.values()),isPrimary:!1,originalEvent:new PointerEvent(`pointermove`)},d=this.createGestureEvent(u,{scale:o,rotation:s,distance:r,angle:i,center:a,deltaScale:c,deltaAngle:l});this.gestureOptions.onGestureMove&&this.gestureOptions.onGestureMove(d),this.emit(`gesturemove`,d)}super.update()}endGesture(){if(!this.gestureActive)return;this.gestureActive=!1;let e={target:this.element,pointers:Array.from(this.pointers.values()),isPrimary:!1,originalEvent:new PointerEvent(`pointerup`)},t=this.getTwoPointers(),n=t?this.computeDistance(t[0],t[1]):0,r=t?this.computeAngle(t[0],t[1]):0,i=t?this.computeCenter(t[0],t[1]):{x:0,y:0},a=this.startDistance>0&&n>0?n/this.startDistance:this.prevScale,o=this.createGestureEvent(e,{scale:a,rotation:this.prevAngle,distance:n,angle:r,center:i,deltaScale:0,deltaAngle:0});this.gestureOptions.onGestureEnd&&this.gestureOptions.onGestureEnd(o),this.emit(`gestureend`,o)}destroy(){this.gestureActive&&this.endGesture(),super.destroy()}};function c(e,t){let n=typeof e==`string`?document.querySelector(e):e;if(!n)throw Error(`Element not found: ${e}`);return new s(n,t)}export{s as Gesturable,c as default,c as gesturable};
2
+ //# sourceMappingURL=pointrix-gesture.mjs.map
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=class{constructor(e){this.name=`restrict`,this.transformBounds=null,this.options=e}onStart(e){this.transformBounds=this.resolveTransformBounds(e.element,e.startPosition,e.size)}modify(e){return this.transformBounds||this.resolveAndCache(e),this.options.endOnly?{position:e.position,velocity:e.velocity,size:e.size}:this.applyRestriction(e)}onEnd(e){return this.transformBounds||this.resolveAndCache(e),this.applyRestriction(e)}resolveAndCache(e){this.transformBounds=this.resolveTransformBounds(e.element,e.startPosition,e.size)}applyRestriction(e){let t=this.transformBounds;if(!t)return{position:e.position,velocity:e.velocity,size:e.size};let n=e.position.x,r=e.position.y;return t.left!==void 0&&(n=Math.max(n,t.left)),t.top!==void 0&&(r=Math.max(r,t.top)),t.right!==void 0&&(n=Math.min(n,t.right)),t.bottom!==void 0&&(r=Math.min(r,t.bottom)),{position:{x:n,y:r},velocity:e.velocity,size:e.size}}resolveTransformBounds(e,t,n){let{bounds:r}=this.options;if(!r)return null;let i;if(r===`parent`){let t=e.parentElement;if(!t)return null;let n=t.getBoundingClientRect();i={left:n.left,top:n.top,right:n.right,bottom:n.bottom}}else if(r instanceof HTMLElement){let e=r.getBoundingClientRect();i={left:e.left,top:e.top,right:e.right,bottom:e.bottom}}else return r;let a=e.getBoundingClientRect(),o=a.left-t.x,s=a.top-t.y,c=n?.width??a.width,l=n?.height??a.height,u=this.options.elementRect;return u?{left:i.left===void 0?void 0:i.left-o-c*u.left,top:i.top===void 0?void 0:i.top-s-l*u.top,right:i.right===void 0?void 0:i.right-o-c*u.right,bottom:i.bottom===void 0?void 0:i.bottom-s-l*u.bottom}:{left:i.left===void 0?void 0:i.left-o,top:i.top===void 0?void 0:i.top-s,right:i.right===void 0?void 0:i.right-o-c,bottom:i.bottom===void 0?void 0:i.bottom-s-l}}};function t(t){return new e(t)}var n=class{constructor(e){this.name=`snap-grid`,this.options=e}modify(e){let{x:t,y:n,offset:r,limits:i}=this.options,a=r?.x??0,o=r?.y??0,s=Math.round((e.position.x-a)/t)*t+a,c=Math.round((e.position.y-o)/n)*n+o;return i&&(i.left!==void 0&&(s=Math.max(s,i.left)),i.right!==void 0&&(s=Math.min(s,i.right)),i.top!==void 0&&(c=Math.max(c,i.top)),i.bottom!==void 0&&(c=Math.min(c,i.bottom))),{position:{x:s,y:c},velocity:e.velocity,size:e.size}}};function r(e){return new n(e)}const i={"top-left":{x:0,y:0},top:{x:.5,y:0},"top-right":{x:1,y:0},left:{x:0,y:.5},center:{x:.5,y:.5},right:{x:1,y:.5},"bottom-left":{x:0,y:1},bottom:{x:.5,y:1},"bottom-right":{x:1,y:1}};function a(e){return typeof e==`string`?i[e]??i[`top-left`]:e}var o=class{constructor(e){this.name=`snap-targets`,this.parentOffset=null,this._snappedTarget=null,this._snappedIndex=-1,this.resolvedPivots=[],this.options=e,this.resolvedPivots=e.relativePoints?.length?e.relativePoints.map(a):[{x:0,y:0}]}get snappedTarget(){return this._snappedTarget}get snappedIndex(){return this._snappedIndex}get isSnapped(){return this._snappedTarget!==null}onStart(e){if(this.options.coordinateMode===`parent`){let t=e.element,n=t.offsetParent||t.parentElement;if(n){let r=n.getBoundingClientRect(),i=t.getBoundingClientRect();this.parentOffset={x:i.left-r.left-e.startPosition.x,y:i.top-r.top-e.startPosition.y}}else this.parentOffset={x:0,y:0}}this._snappedTarget=null,this._snappedIndex=-1}modify(e){let{targets:t,range:n=50}=this.options,r=this.resolvedPivots,i=this.options.coordinateMode===`parent`,a=1/0,o={x:0,y:0},s=-1;for(let c of r){let r=e.position.x+(e.size?e.size.width*c.x:0),l=e.position.y+(e.size?e.size.height*c.y:0);for(let e=0;e<t.length;e++){let c=t[e],u=c.range??n,d=c.x,f=c.y;i&&this.parentOffset&&(d!==void 0&&(d-=this.parentOffset.x),f!==void 0&&(f-=this.parentOffset.y));let p=0,m=0,h=0;if(d!==void 0&&f!==void 0)p=d-r,m=f-l,h=Math.sqrt(p*p+m*m);else if(d!==void 0)p=d-r,h=Math.abs(p);else if(f!==void 0)m=f-l,h=Math.abs(m);else continue;h<=u&&h<a&&(a=h,o={x:p,y:m},s=e)}}return s>=0?(this._snappedTarget=t[s],this._snappedIndex=s,{position:{x:e.position.x+o.x,y:e.position.y+o.y},velocity:e.velocity,size:e.size}):(this._snappedTarget=null,this._snappedIndex=-1,{position:e.position,velocity:e.velocity,size:e.size})}};function s(e){return new o(e)}var c=class{constructor(e){this.name=`magnetic-snap`,this.currentTarget=null,this.options={targets:e.targets,distance:e.distance??30,strength:e.strength??.5,onSnap:e.onSnap??(()=>{}),onUnsnap:e.onUnsnap??(()=>{})},this.targetMap=new Map(e.targets.map(e=>[e.id,e]))}updateTargets(e){this.options.targets=e,this.targetMap=new Map(e.map(e=>[e.id,e]))}addTarget(e){this.options.targets.push(e),this.targetMap.set(e.id,e)}removeTarget(e){this.options.targets=this.options.targets.filter(t=>t.id!==e),this.targetMap.delete(e),this.currentTarget?.id===e&&(this.options.onUnsnap&&this.options.onUnsnap(this.currentTarget),this.currentTarget=null)}modify(e){let{position:t}=e,n=e.size?.width??0,r=e.size?.height??0,i={x:t.x+n/2,y:t.y+r/2},a=null,o=1/0;for(let e of this.options.targets){let t={x:e.x+(e.width??0)/2,y:e.y+(e.height??0)/2},n=this.getDistance(i,t);n<this.options.distance&&n<o&&(o=n,a=e)}if(a){let n={x:a.x+(a.width??0)/2,y:a.y+(a.height??0)/2},r=(a.strength??this.options.strength)*(1-o/this.options.distance),s={x:t.x+(n.x-i.x)*r,y:t.y+(n.y-i.y)*r};return o<this.options.distance*.3&&(s.x=a.x,s.y=a.y),this.currentTarget?.id!==a.id&&(this.currentTarget&&this.options.onUnsnap&&this.options.onUnsnap(this.currentTarget),this.currentTarget=a,this.options.onSnap&&this.options.onSnap(a)),{position:s,velocity:e.velocity,size:e.size}}else this.currentTarget&&=(this.options.onUnsnap&&this.options.onUnsnap(this.currentTarget),null);return{position:e.position,velocity:e.velocity,size:e.size}}getDistance(e,t){let n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}getCurrentTarget(){return this.currentTarget}isSnapped(){return this.currentTarget!==null}};function l(e){return new c(e)}var u=class{constructor(e){this.name=`inertia`,this.state=null,this.options={resistance:e?.resistance??10,minSpeed:e?.minSpeed??10,endSpeed:e?.endSpeed??100,smoothEnd:e?.smoothEnd??!1,smoothEndDuration:e?.smoothEndDuration??300}}onStart(){this.state=null}modify(e){if(!this.state||!this.state.active)return{position:e.position,velocity:e.velocity,size:e.size};let{v0:t,lambda:n,startTime:r,startPosition:i}=this.state,a=(performance.now()-r)/1e3,o=Math.exp(-n*a),s=t.x*o,c=t.y*o,l=i.x+t.x/n*(1-o),u=i.y+t.y/n*(1-o);return Math.sqrt(s*s+c*c)<this.options.minSpeed&&(this.state.active=!1),{position:{x:l,y:u},velocity:{x:s,y:c},size:e.size}}onEnd(e){if(Math.sqrt(e.velocity.x**2+e.velocity.y**2)<this.options.endSpeed)return this.options.smoothEnd?this.computeSmoothEnd(e):void 0;let t=this.options.resistance,n={...e.velocity};return this.state={v0:n,lambda:t,startTime:performance.now(),active:!0,startPosition:{...e.position}},{position:{x:e.position.x+n.x/t,y:e.position.y+n.y/t},velocity:{x:0,y:0},size:e.size}}computeSmoothEnd(e){return{position:e.position,velocity:{x:0,y:0},size:e.size}}isActive(){return this.state?.active??!1}};function d(e){return new u(e)}var f=class{constructor(e){this.name=`auto-scroll`,this.animationFrame=null,this.cachedContainer=null,this.cachedContainerRect=null,this.options={container:e?.container??window,speed:e?.speed??10,margin:e?.margin??50,acceleration:e?.acceleration??5}}onStart(e){this.animationFrame=null,this.cachedContainer=this.resolveContainer(e.element),this.cachedContainer===window||this.cachedContainer instanceof Window?this.cachedContainerRect={left:0,top:0,right:window.innerWidth,bottom:window.innerHeight}:this.cachedContainerRect=null}modify(e){let t=this.cachedContainer??this.resolveContainer(e.element),n=this.cachedContainerRect??this.getContainerRect(t),{margin:r,speed:i,acceleration:a}=this.options,o=e.position.x+e.delta.x,s=e.position.y+e.delta.y,c=0,l=0,u=n.right-o;if(u<r&&u>0){let e=1-u/r;c=Math.min(i,e*a*i)}let d=o-n.left;if(d<r&&d>0){let e=1-d/r;c=-Math.min(i,e*a*i)}let f=n.bottom-s;if(f<r&&f>0){let e=1-f/r;l=Math.min(i,e*a*i)}let p=s-n.top;if(p<r&&p>0){let e=1-p/r;l=-Math.min(i,e*a*i)}return(c!==0||l!==0)&&this.performScroll(t,c,l),{position:e.position,velocity:e.velocity,size:e.size}}onEnd(){this.animationFrame!==null&&(cancelAnimationFrame(this.animationFrame),this.animationFrame=null),this.cachedContainer=null,this.cachedContainerRect=null}resolveContainer(e){if(this.options.container!==window)return this.options.container;let t=e.parentElement;for(;t;){let e=getComputedStyle(t),n=e.overflow+e.overflowX+e.overflowY;if(/auto|scroll/.test(n))return t;t=t.parentElement}return window}getContainerRect(e){if(e===window||e instanceof Window)return{left:0,top:0,right:window.innerWidth,bottom:window.innerHeight};let t=e.getBoundingClientRect();return{left:t.left,top:t.top,right:t.right,bottom:t.bottom}}performScroll(e,t,n){e===window||e instanceof Window?window.scrollBy(t,n):(e.scrollLeft+=t,e.scrollTop+=n)}};function p(e){return new f(e)}var m=class{constructor(e){this.name=`rubberband`,this.transformBounds=null,this.options=e}onStart(e){this.transformBounds=this.resolveTransformBounds(e.element,e.startPosition)}modify(e){this.transformBounds||=this.resolveTransformBounds(e.element,e.startPosition);let t=this.transformBounds,n=this.options.resistance??.15,r=this.options.maxOvershoot??100,i={...e.position};if(t){if(t.left!==void 0&&i.x<t.left){let e=(i.x-t.left)*n;i.x=t.left+Math.max(e,-r)}if(t.right!==void 0&&i.x>t.right){let e=(i.x-t.right)*n;i.x=t.right+Math.min(e,r)}if(t.top!==void 0&&i.y<t.top){let e=(i.y-t.top)*n;i.y=t.top+Math.max(e,-r)}if(t.bottom!==void 0&&i.y>t.bottom){let e=(i.y-t.bottom)*n;i.y=t.bottom+Math.min(e,r)}}return{position:i,velocity:e.velocity,size:e.size}}onEnd(e){this.transformBounds||=this.resolveTransformBounds(e.element,e.startPosition);let t=this.transformBounds,n={...e.position};return t&&(t.left!==void 0&&(n.x=Math.max(n.x,t.left)),t.right!==void 0&&(n.x=Math.min(n.x,t.right)),t.top!==void 0&&(n.y=Math.max(n.y,t.top)),t.bottom!==void 0&&(n.y=Math.min(n.y,t.bottom))),{position:n,velocity:e.velocity,size:e.size}}resolveTransformBounds(e,t){let{bounds:n}=this.options,r;if(n===`parent`){let t=e.parentElement;if(!t)return null;let n=t.getBoundingClientRect();r={left:n.left,top:n.top,right:n.right,bottom:n.bottom}}else r=n;let i=e.getBoundingClientRect(),a=i.left-t.x,o=i.top-t.y,s=i.width,c=i.height;return{left:r.left===void 0?void 0:r.left-a,top:r.top===void 0?void 0:r.top-o,right:r.right===void 0?void 0:r.right-a-s,bottom:r.bottom===void 0?void 0:r.bottom-o-c}}};function h(e){return new m(e)}var g=class{constructor(e){this.name=`restrictSize`,this.options=e}modify(e){if(e.size){let{min:t,max:n}=this.options;t?.width!==void 0&&(e.size.width=Math.max(e.size.width,t.width)),t?.height!==void 0&&(e.size.height=Math.max(e.size.height,t.height)),n?.width!==void 0&&(e.size.width=Math.min(e.size.width,n.width)),n?.height!==void 0&&(e.size.height=Math.min(e.size.height,n.height))}return{position:e.position,velocity:e.velocity,size:e.size}}};function _(e){return new g(e)}var v=class{constructor(e){this.name=`restrictEdges`,this.options=e}modify(e){let t=e.position,n=e.size,r=e.edges,{outer:i,inner:a}=this.options;if(r&&n){let e=t.x,o=t.y,s=t.x+n.width,c=t.y+n.height;i&&(r.left&&i.left!==void 0&&(e=Math.max(e,i.left)),r.top&&i.top!==void 0&&(o=Math.max(o,i.top)),r.right&&i.right!==void 0&&(s=Math.min(s,i.right)),r.bottom&&i.bottom!==void 0&&(c=Math.min(c,i.bottom))),a&&(r.left&&a.left!==void 0&&(e=Math.min(e,a.left)),r.top&&a.top!==void 0&&(o=Math.min(o,a.top)),r.right&&a.right!==void 0&&(s=Math.max(s,a.right)),r.bottom&&a.bottom!==void 0&&(c=Math.max(c,a.bottom))),r.left&&(t.x=e,n.width=s-e),r.top&&(t.y=o,n.height=c-o),r.right&&(n.width=s-t.x),r.bottom&&(n.height=c-t.y)}return{position:t,velocity:e.velocity,size:n}}};function y(e){return new v(e)}var b=class{constructor(e){this.name=`snapSize`,this.options=e}modify(e){if(e.size){let{width:t,height:n,offset:r}=this.options,i=r?.width??0,a=r?.height??0;t&&t>0&&(e.size.width=Math.round((e.size.width-i)/t)*t+i),n&&n>0&&(e.size.height=Math.round((e.size.height-a)/n)*n+a)}return{position:e.position,velocity:e.velocity,size:e.size}}};function x(e){return new b(e)}var S=class{constructor(e){this.name=`snapEdges`,this.options=e}modify(e){let t=e.position,n=e.size,r=e.edges,i=this.options.range??20;if(r&&n){let e=t.x,a=t.y,o=t.x+n.width,s=t.y+n.height;for(let c of this.options.targets){let l=c.range??i;if(r.left&&c.left!==void 0&&Math.abs(e-c.left)<=l){let r=c.left-e;e=c.left,t.x=e,n.width-=r}if(r.top&&c.top!==void 0&&Math.abs(a-c.top)<=l){let e=c.top-a;a=c.top,t.y=a,n.height-=e}r.right&&c.right!==void 0&&Math.abs(o-c.right)<=l&&(o=c.right,n.width=o-t.x),r.bottom&&c.bottom!==void 0&&Math.abs(s-c.bottom)<=l&&(s=c.bottom,n.height=s-t.y)}}return{position:t,velocity:e.velocity,size:n}}};function C(e){return new S(e)}exports.autoScroll=p,exports.inertia=d,exports.magneticSnap=l,exports.restrict=t,exports.restrictEdges=y,exports.restrictSize=_,exports.rubberband=h,exports.snapEdges=C,exports.snapGrid=r,exports.snapSize=x,exports.snapTargets=s;
@@ -0,0 +1,334 @@
1
+ //#region src/types.d.ts
2
+ interface Point {
3
+ x: number;
4
+ y: number;
5
+ }
6
+ interface ActiveEdges {
7
+ top: boolean;
8
+ right: boolean;
9
+ bottom: boolean;
10
+ left: boolean;
11
+ }
12
+ interface ModifierContext {
13
+ position: Point;
14
+ velocity: Point;
15
+ element: HTMLElement;
16
+ startPosition: Point;
17
+ delta: Point;
18
+ edges?: ActiveEdges;
19
+ size?: {
20
+ width: number;
21
+ height: number;
22
+ };
23
+ startSize?: {
24
+ width: number;
25
+ height: number;
26
+ };
27
+ }
28
+ interface ModifierResult {
29
+ position: Point;
30
+ velocity: Point;
31
+ size?: {
32
+ width: number;
33
+ height: number;
34
+ };
35
+ }
36
+ interface Modifier {
37
+ name: string;
38
+ onStart?(context: ModifierContext): void;
39
+ modify(context: ModifierContext): ModifierResult;
40
+ onEnd?(context: ModifierContext): ModifierResult | void;
41
+ }
42
+ //#endregion
43
+ //#region src/modifiers/restrict.d.ts
44
+ interface RestrictOptions {
45
+ bounds?: 'parent' | HTMLElement | {
46
+ left?: number;
47
+ top?: number;
48
+ right?: number;
49
+ bottom?: number;
50
+ };
51
+ elementRect?: {
52
+ left: number;
53
+ top: number;
54
+ right: number;
55
+ bottom: number;
56
+ };
57
+ endOnly?: boolean;
58
+ }
59
+ declare class RestrictModifier implements Modifier {
60
+ name: string;
61
+ private options;
62
+ private transformBounds;
63
+ constructor(options: RestrictOptions);
64
+ onStart(context: ModifierContext): void;
65
+ modify(context: ModifierContext): ModifierResult;
66
+ onEnd(context: ModifierContext): ModifierResult;
67
+ private resolveAndCache;
68
+ private applyRestriction;
69
+ private resolveTransformBounds;
70
+ }
71
+ declare function restrict(options: RestrictOptions): RestrictModifier;
72
+ //#endregion
73
+ //#region src/modifiers/snap-grid.d.ts
74
+ interface SnapGridOptions {
75
+ x: number;
76
+ y: number;
77
+ offset?: {
78
+ x: number;
79
+ y: number;
80
+ };
81
+ limits?: {
82
+ top?: number;
83
+ left?: number;
84
+ bottom?: number;
85
+ right?: number;
86
+ };
87
+ }
88
+ declare class SnapGridModifier implements Modifier {
89
+ name: string;
90
+ private options;
91
+ constructor(options: SnapGridOptions);
92
+ modify(context: ModifierContext): ModifierResult;
93
+ }
94
+ declare function snapGrid(options: SnapGridOptions): SnapGridModifier;
95
+ //#endregion
96
+ //#region src/modifiers/snap-targets.d.ts
97
+ interface SnapTarget {
98
+ /** X coordinate of the target */
99
+ x?: number;
100
+ /** Y coordinate of the target */
101
+ y?: number;
102
+ /** Snap range in pixels (default: global range) */
103
+ range?: number;
104
+ }
105
+ /** Preset pivot positions */
106
+ type PivotPreset = 'top-left' | 'top' | 'top-right' | 'left' | 'center' | 'right' | 'bottom-left' | 'bottom' | 'bottom-right';
107
+ interface SnapTargetsOptions {
108
+ /** Array of snap target positions */
109
+ targets: SnapTarget[];
110
+ /** Default snap range in pixels (default: 50) */
111
+ range?: number;
112
+ /**
113
+ * Pivot point(s) on the element to check for snapping.
114
+ * Accepts preset strings or {x,y} where 0-1 maps to element dimensions.
115
+ *
116
+ * Presets: 'top-left', 'top', 'top-right', 'left', 'center', 'right',
117
+ * 'bottom-left', 'bottom', 'bottom-right'
118
+ *
119
+ * Default: 'top-left'
120
+ */
121
+ relativePoints?: Array<PivotPreset | {
122
+ x: number;
123
+ y: number;
124
+ }>;
125
+ /**
126
+ * Coordinate mode:
127
+ * - 'offset' (default): targets are transform offsets
128
+ * - 'parent': targets are positions relative to the parent element's top-left
129
+ */
130
+ coordinateMode?: 'offset' | 'parent';
131
+ }
132
+ declare class SnapTargetsModifier implements Modifier {
133
+ name: string;
134
+ private options;
135
+ private parentOffset;
136
+ private _snappedTarget;
137
+ private _snappedIndex;
138
+ private resolvedPivots;
139
+ constructor(options: SnapTargetsOptions);
140
+ /** The target the element is currently snapped to, or null */
141
+ get snappedTarget(): SnapTarget | null;
142
+ /** The index of the snapped target in the targets array, or -1 */
143
+ get snappedIndex(): number;
144
+ /** Whether the element is currently snapped to any target */
145
+ get isSnapped(): boolean;
146
+ onStart(context: ModifierContext): void;
147
+ modify(context: ModifierContext): ModifierResult;
148
+ }
149
+ declare function snapTargets(options: SnapTargetsOptions): SnapTargetsModifier;
150
+ //#endregion
151
+ //#region src/modifiers/magnetic-snap.d.ts
152
+ interface MagneticTarget {
153
+ id: string;
154
+ x: number;
155
+ y: number;
156
+ width?: number;
157
+ height?: number;
158
+ strength?: number;
159
+ }
160
+ interface MagneticSnapOptions {
161
+ targets: MagneticTarget[];
162
+ distance?: number;
163
+ strength?: number;
164
+ onSnap?: (target: MagneticTarget) => void;
165
+ onUnsnap?: (target: MagneticTarget) => void;
166
+ }
167
+ declare class MagneticSnapModifier implements Modifier {
168
+ name: string;
169
+ private options;
170
+ private currentTarget;
171
+ private targetMap;
172
+ constructor(options: MagneticSnapOptions);
173
+ updateTargets(targets: MagneticTarget[]): void;
174
+ addTarget(target: MagneticTarget): void;
175
+ removeTarget(id: string): void;
176
+ modify(context: ModifierContext): ModifierResult;
177
+ private getDistance;
178
+ getCurrentTarget(): MagneticTarget | null;
179
+ isSnapped(): boolean;
180
+ }
181
+ declare function magneticSnap(options: MagneticSnapOptions): MagneticSnapModifier;
182
+ //#endregion
183
+ //#region src/modifiers/inertia.d.ts
184
+ interface InertiaOptions {
185
+ resistance?: number;
186
+ minSpeed?: number;
187
+ endSpeed?: number;
188
+ smoothEnd?: boolean;
189
+ smoothEndDuration?: number;
190
+ }
191
+ declare class InertiaModifier implements Modifier {
192
+ name: string;
193
+ private options;
194
+ private state;
195
+ constructor(options?: InertiaOptions);
196
+ onStart(): void;
197
+ modify(context: ModifierContext): ModifierResult;
198
+ onEnd(context: ModifierContext): ModifierResult | void;
199
+ private computeSmoothEnd;
200
+ isActive(): boolean;
201
+ }
202
+ declare function inertia(options?: InertiaOptions): InertiaModifier;
203
+ //#endregion
204
+ //#region src/modifiers/auto-scroll.d.ts
205
+ interface AutoScrollOptions {
206
+ container?: HTMLElement | Window;
207
+ speed?: number;
208
+ margin?: number;
209
+ acceleration?: number;
210
+ }
211
+ declare class AutoScrollModifier implements Modifier {
212
+ name: string;
213
+ private options;
214
+ private animationFrame;
215
+ private cachedContainer;
216
+ private cachedContainerRect;
217
+ constructor(options?: AutoScrollOptions);
218
+ onStart(context: ModifierContext): void;
219
+ modify(context: ModifierContext): ModifierResult;
220
+ onEnd(): void;
221
+ private resolveContainer;
222
+ private getContainerRect;
223
+ private performScroll;
224
+ }
225
+ declare function autoScroll(options?: AutoScrollOptions): AutoScrollModifier;
226
+ //#endregion
227
+ //#region src/modifiers/rubberband.d.ts
228
+ interface RubberbandOptions {
229
+ bounds: {
230
+ left?: number;
231
+ top?: number;
232
+ right?: number;
233
+ bottom?: number;
234
+ } | 'parent';
235
+ /** Resistance factor 0-1 (default: 0.15). Lower = more resistance. */
236
+ resistance?: number;
237
+ /** Max overshoot in pixels (default: 100) */
238
+ maxOvershoot?: number;
239
+ }
240
+ declare class RubberbandModifier implements Modifier {
241
+ name: string;
242
+ private options;
243
+ private transformBounds;
244
+ constructor(options: RubberbandOptions);
245
+ onStart(context: ModifierContext): void;
246
+ modify(context: ModifierContext): ModifierResult;
247
+ onEnd(context: ModifierContext): ModifierResult;
248
+ private resolveTransformBounds;
249
+ }
250
+ declare function rubberband(options: RubberbandOptions): RubberbandModifier;
251
+ //#endregion
252
+ //#region src/modifiers/restrict-size.d.ts
253
+ interface RestrictSizeOptions {
254
+ min?: {
255
+ width?: number;
256
+ height?: number;
257
+ };
258
+ max?: {
259
+ width?: number;
260
+ height?: number;
261
+ };
262
+ }
263
+ declare class RestrictSizeModifier implements Modifier {
264
+ name: string;
265
+ private options;
266
+ constructor(options: RestrictSizeOptions);
267
+ modify(context: ModifierContext): ModifierResult;
268
+ }
269
+ declare function restrictSize(options: RestrictSizeOptions): RestrictSizeModifier;
270
+ //#endregion
271
+ //#region src/modifiers/restrict-edges.d.ts
272
+ interface RestrictEdgesOptions {
273
+ /** Restriction bounds for each edge — edges can't go beyond these values */
274
+ outer?: {
275
+ left?: number;
276
+ top?: number;
277
+ right?: number;
278
+ bottom?: number;
279
+ };
280
+ /** Edges must stay within these values (can't pass toward center) */
281
+ inner?: {
282
+ left?: number;
283
+ top?: number;
284
+ right?: number;
285
+ bottom?: number;
286
+ };
287
+ }
288
+ declare class RestrictEdgesModifier implements Modifier {
289
+ name: string;
290
+ private options;
291
+ constructor(options: RestrictEdgesOptions);
292
+ modify(context: ModifierContext): ModifierResult;
293
+ }
294
+ declare function restrictEdges(options: RestrictEdgesOptions): RestrictEdgesModifier;
295
+ //#endregion
296
+ //#region src/modifiers/snap-size.d.ts
297
+ interface SnapSizeOptions {
298
+ width?: number;
299
+ height?: number;
300
+ offset?: {
301
+ width?: number;
302
+ height?: number;
303
+ };
304
+ }
305
+ declare class SnapSizeModifier implements Modifier {
306
+ name: string;
307
+ private options;
308
+ constructor(options: SnapSizeOptions);
309
+ modify(context: ModifierContext): ModifierResult;
310
+ }
311
+ declare function snapSize(options: SnapSizeOptions): SnapSizeModifier;
312
+ //#endregion
313
+ //#region src/modifiers/snap-edges.d.ts
314
+ interface SnapEdgeTarget {
315
+ left?: number;
316
+ top?: number;
317
+ right?: number;
318
+ bottom?: number;
319
+ range?: number;
320
+ }
321
+ interface SnapEdgesOptions {
322
+ targets: SnapEdgeTarget[];
323
+ range?: number;
324
+ }
325
+ declare class SnapEdgesModifier implements Modifier {
326
+ name: string;
327
+ private options;
328
+ constructor(options: SnapEdgesOptions);
329
+ modify(context: ModifierContext): ModifierResult;
330
+ }
331
+ declare function snapEdges(options: SnapEdgesOptions): SnapEdgesModifier;
332
+ //#endregion
333
+ export { type Modifier, type ModifierContext, type ModifierResult, autoScroll, inertia, magneticSnap, restrict, restrictEdges, restrictSize, rubberband, snapEdges, snapGrid, snapSize, snapTargets };
334
+ //# sourceMappingURL=pointrix-modifiers.d.cts.map