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.
- package/LICENSE +21 -0
- package/README.md +971 -0
- package/dist/pointrix-drag.cjs +1 -0
- package/dist/pointrix-drag.d.cts +189 -0
- package/dist/pointrix-drag.d.mts +189 -0
- package/dist/pointrix-drag.mjs +2 -0
- package/dist/pointrix-dropzone.cjs +1 -0
- package/dist/pointrix-dropzone.d.cts +99 -0
- package/dist/pointrix-dropzone.d.mts +99 -0
- package/dist/pointrix-dropzone.mjs +2 -0
- package/dist/pointrix-gesture.cjs +1 -0
- package/dist/pointrix-gesture.d.cts +119 -0
- package/dist/pointrix-gesture.d.mts +119 -0
- package/dist/pointrix-gesture.mjs +2 -0
- package/dist/pointrix-modifiers.cjs +1 -0
- package/dist/pointrix-modifiers.d.cts +334 -0
- package/dist/pointrix-modifiers.d.mts +334 -0
- package/dist/pointrix-modifiers.mjs +2 -0
- package/dist/pointrix-nano.cjs +1 -0
- package/dist/pointrix-nano.d.cts +82 -0
- package/dist/pointrix-nano.d.mts +82 -0
- package/dist/pointrix-nano.mjs +2 -0
- package/dist/pointrix-react.cjs +1 -0
- package/dist/pointrix-react.d.cts +537 -0
- package/dist/pointrix-react.d.mts +537 -0
- package/dist/pointrix-react.mjs +2 -0
- package/dist/pointrix-resize.cjs +1 -0
- package/dist/pointrix-resize.d.cts +193 -0
- package/dist/pointrix-resize.d.mts +193 -0
- package/dist/pointrix-resize.mjs +2 -0
- package/dist/pointrix-sortable.cjs +1 -0
- package/dist/pointrix-sortable.d.cts +89 -0
- package/dist/pointrix-sortable.d.mts +89 -0
- package/dist/pointrix-sortable.mjs +2 -0
- package/dist/pointrix-vue.cjs +1 -0
- package/dist/pointrix-vue.d.cts +485 -0
- package/dist/pointrix-vue.d.mts +485 -0
- package/dist/pointrix-vue.mjs +2 -0
- package/dist/pointrix.cjs +1 -0
- package/dist/pointrix.d.cts +784 -0
- package/dist/pointrix.d.mts +784 -0
- package/dist/pointrix.mjs +2 -0
- 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
|