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=[]}};function s(e,t){let n=t.position.x,r=t.position.y,i=t.velocity.x,a=t.velocity.y,o=t.size?.width,s=t.size?.height;for(let c of e){t.position.x=n,t.position.y=r,t.velocity.x=i,t.velocity.y=a,t.size&&o!==void 0&&s!==void 0&&(t.size.width=o,t.size.height=s);let e=c.modify(t);n=e.position.x,r=e.position.y,i=e.velocity.x,a=e.velocity.y,e.size&&(o=e.size.width,s=e.size.height)}return{position:{x:n,y:r},velocity:{x:i,y:a},size:o!==void 0&&s!==void 0?{width:o,height:s}:void 0}}let c={instructions:`Press Space or Enter to pick up. Use arrow keys to move. Press Space or Enter to drop. Press Escape to cancel.`,pickedUp:(e,t,n)=>`Picked up ${e}, position ${t} of ${n}`,movedTo:(e,t)=>`Moved to position ${e} of ${t}`,dropped:(e,t,n)=>`Dropped ${e} in position ${t} of ${n}`,dragPickedUp:`Picked up`,dragDropped:`Dropped`};function l(){return c}let u=null;function d(){return u&&u.isConnected?u:(u=document.createElement(`div`),u.setAttribute(`aria-live`,`assertive`),u.setAttribute(`aria-atomic`,`true`),u.setAttribute(`role`,`status`),u.style.cssText=`position:fixed;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0`,document.body.appendChild(u),u)}function f(e){let t=d();t.textContent=``,requestAnimationFrame(()=>{t.textContent=e})}let p=null;const m=`grip-instructions`;function h(){return p&&p.isConnected?(p.textContent=c.instructions,m):(p=document.createElement(`div`),p.id=m,p.style.cssText=`position:fixed;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0`,p.textContent=c.instructions,document.body.appendChild(p),m)}function g(e){e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`0`),e.hasAttribute(`role`)||e.setAttribute(`role`,`button`),e.setAttribute(`aria-roledescription`,`draggable`),e.setAttribute(`aria-describedby`,h())}function _(e,t){e.setAttribute(`aria-grabbed`,String(t))}function v(e){e.removeAttribute(`aria-roledescription`),e.removeAttribute(`aria-grabbed`),e.removeAttribute(`aria-describedby`)}const y=new class{constructor(){this.zones=new Set}register(e){this.zones.add(e)}unregister(e){this.zones.delete(e)}onDragStart(e){for(let t of this.zones)t.accepts(e)&&t.activate(e)}onDragMove(e,t,n){for(let r of this.zones){if(!r.isActive)continue;let i=r.checkOverlap(e,t);i>0?(r.isOver||r.enter(e,i,n),r.over(e,i,n)):r.isOver&&r.leave(e,n)}}onDragEnd(e,t,n){for(let r of this.zones)if(r.isActive){if(r.isOver){let i=r.checkOverlap(e,t);r.drop(e,i>0?i:1,n)}r.deactivate(e)}}getActiveZones(){let e=[];for(let t of this.zones)t.isActive&&e.push(t);return e}getHoveredZones(){let e=[];for(let t of this.zones)t.isOver&&e.push(t);return e}};var b=class extends o{constructor(e,t={}){super(e,{...t,onStart:e=>{this.handleDragStart(e),t.onStart?.(e)},onMove:e=>{this.handleDragMove(e),t.onMove?.(e)},onEnd:e=>{this.handleDragEnd(e),t.onEnd?.(e)}}),this.transform={x:0,y:0},this.startTransform={x:0,y:0},this.bounds=null,this.momentum={vx:0,vy:0,active:!1},this.transformNormalized=!1,this.detectedAxis=null,this.startAxisConfirmed=!1,this.cachedSize={width:0,height:0},this.modifierContext={position:{x:0,y:0},velocity:{x:0,y:0},element:null,startPosition:{x:0,y:0},delta:{x:0,y:0},size:{width:0,height:0}},this.cachedDragEvent={target:null,originalEvent:null,pointers:[],isPrimary:!0,dx:0,dy:0,totalX:0,totalY:0,velocityX:0,velocityY:0},this.dragOptions=t,this.priority=5,t.styleCursor!==!1&&(e.style.cursor=t.cursorChecker?t.cursorChecker(`idle`):`grab`),t.aria!==!1&&g(e)}shouldHandleEvent(e){if(!this.dragOptions.handle)return!0;let t=null;return t=typeof this.dragOptions.handle==`string`?this.element.querySelector(this.dragOptions.handle):this.dragOptions.handle,t?t.contains(e.target):!1}readCurrentTransform(e){let t=window.getComputedStyle(e).transform;if(t&&t!==`none`){let e=t.match(/matrix.*\((.+)\)/);if(e){let t=e[1].split(`, `);this.transform.x=parseFloat(t[4])||0,this.transform.y=parseFloat(t[5])||0}}else this.transformNormalized||(this.transform.x=0,this.transform.y=0);this.transformNormalized||=(e.style.transform=`translate3d(${this.transform.x}px, ${this.transform.y}px, 0)`,!0)}handleDragStart(e){let t=e.target;if(this.dragOptions.aria!==!1&&(_(t,!0),f(l().dragPickedUp)),this.detectedAxis=null,this.startAxisConfirmed=!1,this.readCurrentTransform(t),this.dragOptions.styleCursor!==!1&&(t.style.cursor=this.dragOptions.cursorChecker?this.dragOptions.cursorChecker(`grabbing`):`grabbing`),t.style.willChange=`transform`,this.startTransform={...this.transform},this.dragOptions.bounds){let e=t.getBoundingClientRect(),n=this.startTransform.x,r=this.startTransform.y,i;if(this.dragOptions.bounds===`parent`){let e=(t.offsetParent||document.body).getBoundingClientRect();i={left:e.left,top:e.top,right:e.right,bottom:e.bottom}}else if(this.dragOptions.bounds instanceof HTMLElement){let e=this.dragOptions.bounds.getBoundingClientRect();i={left:e.left,top:e.top,right:e.right,bottom:e.bottom}}else{let e=this.dragOptions.bounds;i={left:e.left??-1/0,top:e.top??-1/0,right:e.right??1/0,bottom:e.bottom??1/0}}let a=i.left-e.left+n,o=i.top-e.top+r,s=i.right-e.right+n,c=i.bottom-e.bottom+r;this.bounds=new DOMRect(a,o,s-a,c-o)}this.momentum.active=!1;let n=e.target.getBoundingClientRect();if(this.cachedSize.width=n.width,this.cachedSize.height=n.height,this.dragOptions.modifiers?.length){let t=this.modifierContext;t.position.x=this.startTransform.x,t.position.y=this.startTransform.y,t.velocity.x=0,t.velocity.y=0,t.element=e.target,t.startPosition.x=this.startTransform.x,t.startPosition.y=this.startTransform.y,t.delta.x=0,t.delta.y=0,t.size.width=this.cachedSize.width,t.size.height=this.cachedSize.height;for(let e of this.dragOptions.modifiers)e.onStart?.(t)}let r=this.createDragEvent(e,0,0);this.dragOptions.onDragStart&&this.dragOptions.onDragStart(r),this.emit(`dragstart`,r),this.dragOptions.droppable&&y.onDragStart(e.target)}handleDragMove(e){let t=e.pointers[0],n=t.total.x,r=t.total.y;if(this.dragOptions.startAxis&&!this.startAxisConfirmed){let e=Math.abs(n),t=Math.abs(r);if(this.dragOptions.startAxis===`x`&&t>e||this.dragOptions.startAxis===`y`&&e>t)return;this.startAxisConfirmed=!0}if(this.dragOptions.axis===`start`&&this.detectedAxis===null){let e=Math.abs(n),t=Math.abs(r);(e>0||t>0)&&(this.detectedAxis=e>t?`x`:`y`)}let i=this.dragOptions.axis===`start`?this.detectedAxis:this.dragOptions.axis;i===`x`?r=0:i===`y`&&(n=0);let a=this.startTransform.x+n,o=this.startTransform.y+r;if(this.dragOptions.grid&&(a=Math.round(a/this.dragOptions.grid.x)*this.dragOptions.grid.x,o=Math.round(o/this.dragOptions.grid.y)*this.dragOptions.grid.y),this.bounds&&(a=Math.max(this.bounds.left,Math.min(a,this.bounds.right)),o=Math.max(this.bounds.top,Math.min(o,this.bounds.bottom))),this.dragOptions.modifiers?.length){let n=this.modifierContext;n.position.x=a,n.position.y=o,n.velocity.x=t.velocity.x,n.velocity.y=t.velocity.y,n.element=e.target,n.startPosition.x=this.startTransform.x,n.startPosition.y=this.startTransform.y,n.delta.x=t.delta.x,n.delta.y=t.delta.y,n.size.width=this.cachedSize.width,n.size.height=this.cachedSize.height;let r=s(this.dragOptions.modifiers,n);a=r.position.x,o=r.position.y}this.transform={x:a,y:o},this.applyTransform(e.target),this.dragOptions.momentum&&(this.momentum.vx=t.velocity.x,this.momentum.vy=t.velocity.y);let c=this.createDragEvent(e,n,r);this.dragOptions.onDragMove&&this.dragOptions.onDragMove(c),this.emit(`dragmove`,c),this.dragOptions.droppable&&y.onDragMove(e.target,t.current,c)}handleDragEnd(e){let t=e.target;this.dragOptions.aria!==!1&&(_(t,!1),f(l().dragDropped)),this.dragOptions.styleCursor!==!1&&(t.style.cursor=this.dragOptions.cursorChecker?this.dragOptions.cursorChecker(`grab`):`grab`);let n=this.transform.x-this.startTransform.x,r=this.transform.y-this.startTransform.y;if(this.dragOptions.momentum&&(Math.abs(this.momentum.vx)>10||Math.abs(this.momentum.vy)>10)?this.startMomentum():t.style.willChange=``,this.dragOptions.modifiers?.length){let i=e.pointers[0],a={...this.transform},o={position:a,velocity:i?.velocity??{x:0,y:0},element:e.target,startPosition:{...this.startTransform},delta:{x:n,y:r}};for(let e of this.dragOptions.modifiers){let t=e.onEnd?.(o);t&&(a=t.position,o.position=a)}if(a.x!==this.transform.x||a.y!==this.transform.y){this.transform=a,t.style.transition=`transform 300ms cubic-bezier(0.25, 1, 0.5, 1)`,this.applyTransform(t);let e=()=>{t.style.transition=``,t.removeEventListener(`transitionend`,e)};t.addEventListener(`transitionend`,e)}}if(this.dragOptions.droppable){let t=e.pointers[0]?.current??{x:0,y:0};y.onDragEnd(e.target,t,this.createDragEvent(e,n,r))}let i=this.createDragEvent(e,n,r);this.dragOptions.onDragEnd&&this.dragOptions.onDragEnd(i),this.emit(`dragend`,i)}startMomentum(){this.momentum.active=!0;let e=typeof this.dragOptions.momentum==`object`&&this.dragOptions.momentum.friction||.95,t=typeof this.dragOptions.momentum==`object`&&this.dragOptions.momentum.minSpeed||.1,n=()=>{if(this.momentum.active){if(this.momentum.vx*=e,this.momentum.vy*=e,Math.abs(this.momentum.vx)<t&&Math.abs(this.momentum.vy)<t){this.momentum.active=!1,this.element.style.willChange=``;return}this.transform.x+=this.momentum.vx*.016,this.transform.y+=this.momentum.vy*.016,this.bounds&&((this.transform.x<this.bounds.left||this.transform.x>this.bounds.right)&&(this.momentum.vx*=-.5,this.transform.x=Math.max(this.bounds.left,Math.min(this.transform.x,this.bounds.right))),(this.transform.y<this.bounds.top||this.transform.y>this.bounds.bottom)&&(this.momentum.vy*=-.5,this.transform.y=Math.max(this.bounds.top,Math.min(this.transform.y,this.bounds.bottom)))),this.applyTransform(this.element),requestAnimationFrame(n)}};requestAnimationFrame(n)}applyTransform(e){e.style.transform=`translate3d(${this.transform.x}px, ${this.transform.y}px, 0)`}createDragEvent(e,t,n){let r=e.pointers[0],i=this.cachedDragEvent;return i.target=e.target,i.originalEvent=e.originalEvent,i.pointers=e.pointers,i.isPrimary=e.isPrimary,i.dx=r?.delta.x||0,i.dy=r?.delta.y||0,i.totalX=t,i.totalY=n,i.velocityX=r?.velocity.x||0,i.velocityY=r?.velocity.y||0,i}setPosition(e,t){this.transform={x:e,y:t},this.applyTransform(this.element)}getPosition(){return{...this.transform}}destroy(){super.destroy(),this.element.style.cursor=``,this.element.style.willChange=``,this.momentum.active=!1,this.dragOptions.aria!==!1&&v(this.element)}};function x(e,t){let n=typeof e==`string`?document.querySelector(e):e;if(!n)throw Error(`Element not found: ${e}`);return new b(n,t)}exports.Draggable=b,exports.default=x,exports.draggable=x;
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
//#region src/nano.d.ts
|
|
2
|
+
interface Point$1 {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
}
|
|
6
|
+
interface PointerState {
|
|
7
|
+
id: number;
|
|
8
|
+
start: Point$1;
|
|
9
|
+
current: Point$1;
|
|
10
|
+
previous: Point$1;
|
|
11
|
+
delta: Point$1;
|
|
12
|
+
total: Point$1;
|
|
13
|
+
velocity: Point$1;
|
|
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/types.d.ts
|
|
81
|
+
interface Point {
|
|
82
|
+
x: number;
|
|
83
|
+
y: number;
|
|
84
|
+
}
|
|
85
|
+
interface ActiveEdges {
|
|
86
|
+
top: boolean;
|
|
87
|
+
right: boolean;
|
|
88
|
+
bottom: boolean;
|
|
89
|
+
left: boolean;
|
|
90
|
+
}
|
|
91
|
+
interface ModifierContext {
|
|
92
|
+
position: Point;
|
|
93
|
+
velocity: Point;
|
|
94
|
+
element: HTMLElement;
|
|
95
|
+
startPosition: Point;
|
|
96
|
+
delta: Point;
|
|
97
|
+
edges?: ActiveEdges;
|
|
98
|
+
size?: {
|
|
99
|
+
width: number;
|
|
100
|
+
height: number;
|
|
101
|
+
};
|
|
102
|
+
startSize?: {
|
|
103
|
+
width: number;
|
|
104
|
+
height: number;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
interface ModifierResult {
|
|
108
|
+
position: Point;
|
|
109
|
+
velocity: Point;
|
|
110
|
+
size?: {
|
|
111
|
+
width: number;
|
|
112
|
+
height: number;
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
interface Modifier {
|
|
116
|
+
name: string;
|
|
117
|
+
onStart?(context: ModifierContext): void;
|
|
118
|
+
modify(context: ModifierContext): ModifierResult;
|
|
119
|
+
onEnd?(context: ModifierContext): ModifierResult | void;
|
|
120
|
+
}
|
|
121
|
+
//#endregion
|
|
122
|
+
//#region src/drag.d.ts
|
|
123
|
+
interface DragOptions extends GripOptions {
|
|
124
|
+
/** Enable ARIA attributes for accessibility (default: true) */
|
|
125
|
+
aria?: boolean;
|
|
126
|
+
axis?: 'x' | 'y' | 'xy' | 'start';
|
|
127
|
+
startAxis?: 'x' | 'y';
|
|
128
|
+
handle?: string | HTMLElement;
|
|
129
|
+
bounds?: 'parent' | HTMLElement | {
|
|
130
|
+
left?: number;
|
|
131
|
+
top?: number;
|
|
132
|
+
right?: number;
|
|
133
|
+
bottom?: number;
|
|
134
|
+
};
|
|
135
|
+
grid?: {
|
|
136
|
+
x: number;
|
|
137
|
+
y: number;
|
|
138
|
+
};
|
|
139
|
+
momentum?: boolean | {
|
|
140
|
+
friction?: number;
|
|
141
|
+
minSpeed?: number;
|
|
142
|
+
};
|
|
143
|
+
modifiers?: Modifier[];
|
|
144
|
+
droppable?: boolean;
|
|
145
|
+
cursorChecker?: (action: 'idle' | 'grab' | 'grabbing') => string;
|
|
146
|
+
onDragStart?: (event: DragEvent) => void;
|
|
147
|
+
onDragMove?: (event: DragEvent) => void;
|
|
148
|
+
onDragEnd?: (event: DragEvent) => void;
|
|
149
|
+
}
|
|
150
|
+
interface DragEvent extends InteractionEvent {
|
|
151
|
+
dx: number;
|
|
152
|
+
dy: number;
|
|
153
|
+
totalX: number;
|
|
154
|
+
totalY: number;
|
|
155
|
+
velocityX: number;
|
|
156
|
+
velocityY: number;
|
|
157
|
+
}
|
|
158
|
+
declare class Draggable extends Grip {
|
|
159
|
+
private dragOptions;
|
|
160
|
+
private transform;
|
|
161
|
+
private startTransform;
|
|
162
|
+
private bounds;
|
|
163
|
+
private momentum;
|
|
164
|
+
private transformNormalized;
|
|
165
|
+
private detectedAxis;
|
|
166
|
+
private startAxisConfirmed;
|
|
167
|
+
private cachedSize;
|
|
168
|
+
private modifierContext;
|
|
169
|
+
private cachedDragEvent;
|
|
170
|
+
constructor(element: HTMLElement, options?: DragOptions);
|
|
171
|
+
protected shouldHandleEvent(e: PointerEvent): boolean;
|
|
172
|
+
private readCurrentTransform;
|
|
173
|
+
private handleDragStart;
|
|
174
|
+
private handleDragMove;
|
|
175
|
+
private handleDragEnd;
|
|
176
|
+
private startMomentum;
|
|
177
|
+
private applyTransform;
|
|
178
|
+
private createDragEvent;
|
|
179
|
+
setPosition(x: number, y: number): void;
|
|
180
|
+
getPosition(): {
|
|
181
|
+
x: number;
|
|
182
|
+
y: number;
|
|
183
|
+
};
|
|
184
|
+
destroy(): void;
|
|
185
|
+
}
|
|
186
|
+
declare function draggable(element: HTMLElement | string, options?: DragOptions): Draggable;
|
|
187
|
+
//#endregion
|
|
188
|
+
export { DragEvent, DragOptions, Draggable, draggable as default, draggable };
|
|
189
|
+
//# sourceMappingURL=pointrix-drag.d.cts.map
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
//#region src/nano.d.ts
|
|
2
|
+
interface Point$1 {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
}
|
|
6
|
+
interface PointerState {
|
|
7
|
+
id: number;
|
|
8
|
+
start: Point$1;
|
|
9
|
+
current: Point$1;
|
|
10
|
+
previous: Point$1;
|
|
11
|
+
delta: Point$1;
|
|
12
|
+
total: Point$1;
|
|
13
|
+
velocity: Point$1;
|
|
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/types.d.ts
|
|
81
|
+
interface Point {
|
|
82
|
+
x: number;
|
|
83
|
+
y: number;
|
|
84
|
+
}
|
|
85
|
+
interface ActiveEdges {
|
|
86
|
+
top: boolean;
|
|
87
|
+
right: boolean;
|
|
88
|
+
bottom: boolean;
|
|
89
|
+
left: boolean;
|
|
90
|
+
}
|
|
91
|
+
interface ModifierContext {
|
|
92
|
+
position: Point;
|
|
93
|
+
velocity: Point;
|
|
94
|
+
element: HTMLElement;
|
|
95
|
+
startPosition: Point;
|
|
96
|
+
delta: Point;
|
|
97
|
+
edges?: ActiveEdges;
|
|
98
|
+
size?: {
|
|
99
|
+
width: number;
|
|
100
|
+
height: number;
|
|
101
|
+
};
|
|
102
|
+
startSize?: {
|
|
103
|
+
width: number;
|
|
104
|
+
height: number;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
interface ModifierResult {
|
|
108
|
+
position: Point;
|
|
109
|
+
velocity: Point;
|
|
110
|
+
size?: {
|
|
111
|
+
width: number;
|
|
112
|
+
height: number;
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
interface Modifier {
|
|
116
|
+
name: string;
|
|
117
|
+
onStart?(context: ModifierContext): void;
|
|
118
|
+
modify(context: ModifierContext): ModifierResult;
|
|
119
|
+
onEnd?(context: ModifierContext): ModifierResult | void;
|
|
120
|
+
}
|
|
121
|
+
//#endregion
|
|
122
|
+
//#region src/drag.d.ts
|
|
123
|
+
interface DragOptions extends GripOptions {
|
|
124
|
+
/** Enable ARIA attributes for accessibility (default: true) */
|
|
125
|
+
aria?: boolean;
|
|
126
|
+
axis?: 'x' | 'y' | 'xy' | 'start';
|
|
127
|
+
startAxis?: 'x' | 'y';
|
|
128
|
+
handle?: string | HTMLElement;
|
|
129
|
+
bounds?: 'parent' | HTMLElement | {
|
|
130
|
+
left?: number;
|
|
131
|
+
top?: number;
|
|
132
|
+
right?: number;
|
|
133
|
+
bottom?: number;
|
|
134
|
+
};
|
|
135
|
+
grid?: {
|
|
136
|
+
x: number;
|
|
137
|
+
y: number;
|
|
138
|
+
};
|
|
139
|
+
momentum?: boolean | {
|
|
140
|
+
friction?: number;
|
|
141
|
+
minSpeed?: number;
|
|
142
|
+
};
|
|
143
|
+
modifiers?: Modifier[];
|
|
144
|
+
droppable?: boolean;
|
|
145
|
+
cursorChecker?: (action: 'idle' | 'grab' | 'grabbing') => string;
|
|
146
|
+
onDragStart?: (event: DragEvent) => void;
|
|
147
|
+
onDragMove?: (event: DragEvent) => void;
|
|
148
|
+
onDragEnd?: (event: DragEvent) => void;
|
|
149
|
+
}
|
|
150
|
+
interface DragEvent extends InteractionEvent {
|
|
151
|
+
dx: number;
|
|
152
|
+
dy: number;
|
|
153
|
+
totalX: number;
|
|
154
|
+
totalY: number;
|
|
155
|
+
velocityX: number;
|
|
156
|
+
velocityY: number;
|
|
157
|
+
}
|
|
158
|
+
declare class Draggable extends Grip {
|
|
159
|
+
private dragOptions;
|
|
160
|
+
private transform;
|
|
161
|
+
private startTransform;
|
|
162
|
+
private bounds;
|
|
163
|
+
private momentum;
|
|
164
|
+
private transformNormalized;
|
|
165
|
+
private detectedAxis;
|
|
166
|
+
private startAxisConfirmed;
|
|
167
|
+
private cachedSize;
|
|
168
|
+
private modifierContext;
|
|
169
|
+
private cachedDragEvent;
|
|
170
|
+
constructor(element: HTMLElement, options?: DragOptions);
|
|
171
|
+
protected shouldHandleEvent(e: PointerEvent): boolean;
|
|
172
|
+
private readCurrentTransform;
|
|
173
|
+
private handleDragStart;
|
|
174
|
+
private handleDragMove;
|
|
175
|
+
private handleDragEnd;
|
|
176
|
+
private startMomentum;
|
|
177
|
+
private applyTransform;
|
|
178
|
+
private createDragEvent;
|
|
179
|
+
setPosition(x: number, y: number): void;
|
|
180
|
+
getPosition(): {
|
|
181
|
+
x: number;
|
|
182
|
+
y: number;
|
|
183
|
+
};
|
|
184
|
+
destroy(): void;
|
|
185
|
+
}
|
|
186
|
+
declare function draggable(element: HTMLElement | string, options?: DragOptions): Draggable;
|
|
187
|
+
//#endregion
|
|
188
|
+
export { DragEvent, DragOptions, Draggable, draggable as default, draggable };
|
|
189
|
+
//# sourceMappingURL=pointrix-drag.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=[]}};function s(e,t){let n=t.position.x,r=t.position.y,i=t.velocity.x,a=t.velocity.y,o=t.size?.width,s=t.size?.height;for(let c of e){t.position.x=n,t.position.y=r,t.velocity.x=i,t.velocity.y=a,t.size&&o!==void 0&&s!==void 0&&(t.size.width=o,t.size.height=s);let e=c.modify(t);n=e.position.x,r=e.position.y,i=e.velocity.x,a=e.velocity.y,e.size&&(o=e.size.width,s=e.size.height)}return{position:{x:n,y:r},velocity:{x:i,y:a},size:o!==void 0&&s!==void 0?{width:o,height:s}:void 0}}let c={instructions:`Press Space or Enter to pick up. Use arrow keys to move. Press Space or Enter to drop. Press Escape to cancel.`,pickedUp:(e,t,n)=>`Picked up ${e}, position ${t} of ${n}`,movedTo:(e,t)=>`Moved to position ${e} of ${t}`,dropped:(e,t,n)=>`Dropped ${e} in position ${t} of ${n}`,dragPickedUp:`Picked up`,dragDropped:`Dropped`};function l(){return c}let u=null;function d(){return u&&u.isConnected?u:(u=document.createElement(`div`),u.setAttribute(`aria-live`,`assertive`),u.setAttribute(`aria-atomic`,`true`),u.setAttribute(`role`,`status`),u.style.cssText=`position:fixed;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0`,document.body.appendChild(u),u)}function f(e){let t=d();t.textContent=``,requestAnimationFrame(()=>{t.textContent=e})}let p=null;const m=`grip-instructions`;function h(){return p&&p.isConnected?(p.textContent=c.instructions,m):(p=document.createElement(`div`),p.id=m,p.style.cssText=`position:fixed;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0`,p.textContent=c.instructions,document.body.appendChild(p),m)}function g(e){e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`0`),e.hasAttribute(`role`)||e.setAttribute(`role`,`button`),e.setAttribute(`aria-roledescription`,`draggable`),e.setAttribute(`aria-describedby`,h())}function _(e,t){e.setAttribute(`aria-grabbed`,String(t))}function v(e){e.removeAttribute(`aria-roledescription`),e.removeAttribute(`aria-grabbed`),e.removeAttribute(`aria-describedby`)}const y=new class{constructor(){this.zones=new Set}register(e){this.zones.add(e)}unregister(e){this.zones.delete(e)}onDragStart(e){for(let t of this.zones)t.accepts(e)&&t.activate(e)}onDragMove(e,t,n){for(let r of this.zones){if(!r.isActive)continue;let i=r.checkOverlap(e,t);i>0?(r.isOver||r.enter(e,i,n),r.over(e,i,n)):r.isOver&&r.leave(e,n)}}onDragEnd(e,t,n){for(let r of this.zones)if(r.isActive){if(r.isOver){let i=r.checkOverlap(e,t);r.drop(e,i>0?i:1,n)}r.deactivate(e)}}getActiveZones(){let e=[];for(let t of this.zones)t.isActive&&e.push(t);return e}getHoveredZones(){let e=[];for(let t of this.zones)t.isOver&&e.push(t);return e}};var b=class extends o{constructor(e,t={}){super(e,{...t,onStart:e=>{this.handleDragStart(e),t.onStart?.(e)},onMove:e=>{this.handleDragMove(e),t.onMove?.(e)},onEnd:e=>{this.handleDragEnd(e),t.onEnd?.(e)}}),this.transform={x:0,y:0},this.startTransform={x:0,y:0},this.bounds=null,this.momentum={vx:0,vy:0,active:!1},this.transformNormalized=!1,this.detectedAxis=null,this.startAxisConfirmed=!1,this.cachedSize={width:0,height:0},this.modifierContext={position:{x:0,y:0},velocity:{x:0,y:0},element:null,startPosition:{x:0,y:0},delta:{x:0,y:0},size:{width:0,height:0}},this.cachedDragEvent={target:null,originalEvent:null,pointers:[],isPrimary:!0,dx:0,dy:0,totalX:0,totalY:0,velocityX:0,velocityY:0},this.dragOptions=t,this.priority=5,t.styleCursor!==!1&&(e.style.cursor=t.cursorChecker?t.cursorChecker(`idle`):`grab`),t.aria!==!1&&g(e)}shouldHandleEvent(e){if(!this.dragOptions.handle)return!0;let t=null;return t=typeof this.dragOptions.handle==`string`?this.element.querySelector(this.dragOptions.handle):this.dragOptions.handle,t?t.contains(e.target):!1}readCurrentTransform(e){let t=window.getComputedStyle(e).transform;if(t&&t!==`none`){let e=t.match(/matrix.*\((.+)\)/);if(e){let t=e[1].split(`, `);this.transform.x=parseFloat(t[4])||0,this.transform.y=parseFloat(t[5])||0}}else this.transformNormalized||(this.transform.x=0,this.transform.y=0);this.transformNormalized||=(e.style.transform=`translate3d(${this.transform.x}px, ${this.transform.y}px, 0)`,!0)}handleDragStart(e){let t=e.target;if(this.dragOptions.aria!==!1&&(_(t,!0),f(l().dragPickedUp)),this.detectedAxis=null,this.startAxisConfirmed=!1,this.readCurrentTransform(t),this.dragOptions.styleCursor!==!1&&(t.style.cursor=this.dragOptions.cursorChecker?this.dragOptions.cursorChecker(`grabbing`):`grabbing`),t.style.willChange=`transform`,this.startTransform={...this.transform},this.dragOptions.bounds){let e=t.getBoundingClientRect(),n=this.startTransform.x,r=this.startTransform.y,i;if(this.dragOptions.bounds===`parent`){let e=(t.offsetParent||document.body).getBoundingClientRect();i={left:e.left,top:e.top,right:e.right,bottom:e.bottom}}else if(this.dragOptions.bounds instanceof HTMLElement){let e=this.dragOptions.bounds.getBoundingClientRect();i={left:e.left,top:e.top,right:e.right,bottom:e.bottom}}else{let e=this.dragOptions.bounds;i={left:e.left??-1/0,top:e.top??-1/0,right:e.right??1/0,bottom:e.bottom??1/0}}let a=i.left-e.left+n,o=i.top-e.top+r,s=i.right-e.right+n,c=i.bottom-e.bottom+r;this.bounds=new DOMRect(a,o,s-a,c-o)}this.momentum.active=!1;let n=e.target.getBoundingClientRect();if(this.cachedSize.width=n.width,this.cachedSize.height=n.height,this.dragOptions.modifiers?.length){let t=this.modifierContext;t.position.x=this.startTransform.x,t.position.y=this.startTransform.y,t.velocity.x=0,t.velocity.y=0,t.element=e.target,t.startPosition.x=this.startTransform.x,t.startPosition.y=this.startTransform.y,t.delta.x=0,t.delta.y=0,t.size.width=this.cachedSize.width,t.size.height=this.cachedSize.height;for(let e of this.dragOptions.modifiers)e.onStart?.(t)}let r=this.createDragEvent(e,0,0);this.dragOptions.onDragStart&&this.dragOptions.onDragStart(r),this.emit(`dragstart`,r),this.dragOptions.droppable&&y.onDragStart(e.target)}handleDragMove(e){let t=e.pointers[0],n=t.total.x,r=t.total.y;if(this.dragOptions.startAxis&&!this.startAxisConfirmed){let e=Math.abs(n),t=Math.abs(r);if(this.dragOptions.startAxis===`x`&&t>e||this.dragOptions.startAxis===`y`&&e>t)return;this.startAxisConfirmed=!0}if(this.dragOptions.axis===`start`&&this.detectedAxis===null){let e=Math.abs(n),t=Math.abs(r);(e>0||t>0)&&(this.detectedAxis=e>t?`x`:`y`)}let i=this.dragOptions.axis===`start`?this.detectedAxis:this.dragOptions.axis;i===`x`?r=0:i===`y`&&(n=0);let a=this.startTransform.x+n,o=this.startTransform.y+r;if(this.dragOptions.grid&&(a=Math.round(a/this.dragOptions.grid.x)*this.dragOptions.grid.x,o=Math.round(o/this.dragOptions.grid.y)*this.dragOptions.grid.y),this.bounds&&(a=Math.max(this.bounds.left,Math.min(a,this.bounds.right)),o=Math.max(this.bounds.top,Math.min(o,this.bounds.bottom))),this.dragOptions.modifiers?.length){let n=this.modifierContext;n.position.x=a,n.position.y=o,n.velocity.x=t.velocity.x,n.velocity.y=t.velocity.y,n.element=e.target,n.startPosition.x=this.startTransform.x,n.startPosition.y=this.startTransform.y,n.delta.x=t.delta.x,n.delta.y=t.delta.y,n.size.width=this.cachedSize.width,n.size.height=this.cachedSize.height;let r=s(this.dragOptions.modifiers,n);a=r.position.x,o=r.position.y}this.transform={x:a,y:o},this.applyTransform(e.target),this.dragOptions.momentum&&(this.momentum.vx=t.velocity.x,this.momentum.vy=t.velocity.y);let c=this.createDragEvent(e,n,r);this.dragOptions.onDragMove&&this.dragOptions.onDragMove(c),this.emit(`dragmove`,c),this.dragOptions.droppable&&y.onDragMove(e.target,t.current,c)}handleDragEnd(e){let t=e.target;this.dragOptions.aria!==!1&&(_(t,!1),f(l().dragDropped)),this.dragOptions.styleCursor!==!1&&(t.style.cursor=this.dragOptions.cursorChecker?this.dragOptions.cursorChecker(`grab`):`grab`);let n=this.transform.x-this.startTransform.x,r=this.transform.y-this.startTransform.y;if(this.dragOptions.momentum&&(Math.abs(this.momentum.vx)>10||Math.abs(this.momentum.vy)>10)?this.startMomentum():t.style.willChange=``,this.dragOptions.modifiers?.length){let i=e.pointers[0],a={...this.transform},o={position:a,velocity:i?.velocity??{x:0,y:0},element:e.target,startPosition:{...this.startTransform},delta:{x:n,y:r}};for(let e of this.dragOptions.modifiers){let t=e.onEnd?.(o);t&&(a=t.position,o.position=a)}if(a.x!==this.transform.x||a.y!==this.transform.y){this.transform=a,t.style.transition=`transform 300ms cubic-bezier(0.25, 1, 0.5, 1)`,this.applyTransform(t);let e=()=>{t.style.transition=``,t.removeEventListener(`transitionend`,e)};t.addEventListener(`transitionend`,e)}}if(this.dragOptions.droppable){let t=e.pointers[0]?.current??{x:0,y:0};y.onDragEnd(e.target,t,this.createDragEvent(e,n,r))}let i=this.createDragEvent(e,n,r);this.dragOptions.onDragEnd&&this.dragOptions.onDragEnd(i),this.emit(`dragend`,i)}startMomentum(){this.momentum.active=!0;let e=typeof this.dragOptions.momentum==`object`&&this.dragOptions.momentum.friction||.95,t=typeof this.dragOptions.momentum==`object`&&this.dragOptions.momentum.minSpeed||.1,n=()=>{if(this.momentum.active){if(this.momentum.vx*=e,this.momentum.vy*=e,Math.abs(this.momentum.vx)<t&&Math.abs(this.momentum.vy)<t){this.momentum.active=!1,this.element.style.willChange=``;return}this.transform.x+=this.momentum.vx*.016,this.transform.y+=this.momentum.vy*.016,this.bounds&&((this.transform.x<this.bounds.left||this.transform.x>this.bounds.right)&&(this.momentum.vx*=-.5,this.transform.x=Math.max(this.bounds.left,Math.min(this.transform.x,this.bounds.right))),(this.transform.y<this.bounds.top||this.transform.y>this.bounds.bottom)&&(this.momentum.vy*=-.5,this.transform.y=Math.max(this.bounds.top,Math.min(this.transform.y,this.bounds.bottom)))),this.applyTransform(this.element),requestAnimationFrame(n)}};requestAnimationFrame(n)}applyTransform(e){e.style.transform=`translate3d(${this.transform.x}px, ${this.transform.y}px, 0)`}createDragEvent(e,t,n){let r=e.pointers[0],i=this.cachedDragEvent;return i.target=e.target,i.originalEvent=e.originalEvent,i.pointers=e.pointers,i.isPrimary=e.isPrimary,i.dx=r?.delta.x||0,i.dy=r?.delta.y||0,i.totalX=t,i.totalY=n,i.velocityX=r?.velocity.x||0,i.velocityY=r?.velocity.y||0,i}setPosition(e,t){this.transform={x:e,y:t},this.applyTransform(this.element)}getPosition(){return{...this.transform}}destroy(){super.destroy(),this.element.style.cursor=``,this.element.style.willChange=``,this.momentum.active=!1,this.dragOptions.aria!==!1&&v(this.element)}};function x(e,t){let n=typeof e==`string`?document.querySelector(e):e;if(!n)throw Error(`Element not found: ${e}`);return new b(n,t)}export{b as Draggable,x as default,x as draggable};
|
|
2
|
+
//# sourceMappingURL=pointrix-drag.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});function e(e){e.setAttribute(`aria-dropeffect`,`move`)}function t(e,t){e.setAttribute(`aria-dropeffect`,t?`move`:`none`)}function n(e){e.removeAttribute(`aria-dropeffect`)}function r(e,t){return t.x>=e.left&&t.x<=e.right&&t.y>=e.top&&t.y<=e.bottom}function i(e,t){let n=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left))*Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)),r=e.width*e.height;return r>0?n/r:0}var a=class{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(e){this._enabled=e}constructor(t,n={}){this._isOver=!1,this._isActive=!1,this._enabled=!0,this.listeners=new Map,this.element=t,this.options={overlap:`pointer`,aria:!0,...n},o.register(this),this.options.aria!==!1&&e(t)}get isOver(){return this._isOver}get isActive(){return this._isActive}accepts(e){if(!this._enabled)return!1;let{accept:t}=this.options;return t?typeof t==`function`?t(e):e.matches(t):!0}checkOverlap(e,t){let n=this.element.getBoundingClientRect(),a=this.options.overlap??`pointer`;if(a===`pointer`)return r(n,t)?1:0;let o=e.getBoundingClientRect();if(a===`center`)return r(n,{x:o.left+o.width/2,y:o.top+o.height/2})?1:0;let s=i(o,n);return s>=a?s:0}activate(e){if(this._isActive)return;this._isActive=!0,this.options.activeClass&&this.element.classList.add(this.options.activeClass),this.options.aria!==!1&&t(this.element,!0);let n=this.createEvent(e,0);this.options.onActivate?.(n),this.emit(`activate`,n)}deactivate(e){if(!this._isActive)return;this._isOver&&this.leave(e),this._isActive=!1,this.options.activeClass&&this.element.classList.remove(this.options.activeClass),this.options.aria!==!1&&t(this.element,!1);let n=this.createEvent(e,0);this.options.onDeactivate?.(n),this.emit(`deactivate`,n)}enter(e,t,n){if(this._isOver)return;this._isOver=!0,this.options.hoverClass&&this.element.classList.add(this.options.hoverClass);let r=this.createEvent(e,t,n);this.options.onDragEnter?.(r),this.emit(`dragenter`,r)}leave(e,t){if(!this._isOver)return;this._isOver=!1,this.options.hoverClass&&this.element.classList.remove(this.options.hoverClass);let n=this.createEvent(e,0,t);this.options.onDragLeave?.(n),this.emit(`dragleave`,n)}over(e,t,n){let r=this.createEvent(e,t,n);this.options.onDragOver?.(r),this.emit(`dragover`,r)}drop(e,t,n){let r=this.createEvent(e,t,n);this.options.onDrop?.(r),this.emit(`drop`,r)}createEvent(e,t,n){return{target:this.element,draggable:e,dragEvent:n,overlap:t}}updateOptions(e){this.options={...this.options,...e}}destroy(){this._isOver=!1,this._isActive=!1,this.options.activeClass&&this.element.classList.remove(this.options.activeClass),this.options.hoverClass&&this.element.classList.remove(this.options.hoverClass),this.options.aria!==!1&&n(this.element),o.unregister(this)}};const o=new class{constructor(){this.zones=new Set}register(e){this.zones.add(e)}unregister(e){this.zones.delete(e)}onDragStart(e){for(let t of this.zones)t.accepts(e)&&t.activate(e)}onDragMove(e,t,n){for(let r of this.zones){if(!r.isActive)continue;let i=r.checkOverlap(e,t);i>0?(r.isOver||r.enter(e,i,n),r.over(e,i,n)):r.isOver&&r.leave(e,n)}}onDragEnd(e,t,n){for(let r of this.zones)if(r.isActive){if(r.isOver){let i=r.checkOverlap(e,t);r.drop(e,i>0?i:1,n)}r.deactivate(e)}}getActiveZones(){let e=[];for(let t of this.zones)t.isActive&&e.push(t);return e}getHoveredZones(){let e=[];for(let t of this.zones)t.isOver&&e.push(t);return e}};function s(e,t){let n=typeof e==`string`?document.querySelector(e):e;if(!n)throw Error(`Element not found: ${e}`);return new a(n,t)}exports.Dropzone=a,exports.DropzoneManager=o,exports.default=s,exports.dropzone=s;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
//#region src/nano.d.ts
|
|
2
|
+
interface Point$1 {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
}
|
|
6
|
+
interface PointerState {
|
|
7
|
+
id: number;
|
|
8
|
+
start: Point$1;
|
|
9
|
+
current: Point$1;
|
|
10
|
+
previous: Point$1;
|
|
11
|
+
delta: Point$1;
|
|
12
|
+
total: Point$1;
|
|
13
|
+
velocity: Point$1;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
}
|
|
16
|
+
interface InteractionEvent {
|
|
17
|
+
target: HTMLElement;
|
|
18
|
+
pointers: PointerState[];
|
|
19
|
+
isPrimary: boolean;
|
|
20
|
+
originalEvent: PointerEvent;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/drag.d.ts
|
|
24
|
+
interface DragEvent extends InteractionEvent {
|
|
25
|
+
dx: number;
|
|
26
|
+
dy: number;
|
|
27
|
+
totalX: number;
|
|
28
|
+
totalY: number;
|
|
29
|
+
velocityX: number;
|
|
30
|
+
velocityY: number;
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/dropzone.d.ts
|
|
34
|
+
interface DropEvent {
|
|
35
|
+
target: HTMLElement;
|
|
36
|
+
draggable: HTMLElement;
|
|
37
|
+
dragEvent?: DragEvent;
|
|
38
|
+
overlap: number;
|
|
39
|
+
}
|
|
40
|
+
interface DropzoneOptions {
|
|
41
|
+
accept?: string | ((draggable: HTMLElement) => boolean);
|
|
42
|
+
overlap?: 'pointer' | 'center' | number;
|
|
43
|
+
activeClass?: string;
|
|
44
|
+
hoverClass?: string;
|
|
45
|
+
/** Enable ARIA attributes (default: true) */
|
|
46
|
+
aria?: boolean;
|
|
47
|
+
onActivate?: (event: DropEvent) => void;
|
|
48
|
+
onDeactivate?: (event: DropEvent) => void;
|
|
49
|
+
onDragEnter?: (event: DropEvent) => void;
|
|
50
|
+
onDragLeave?: (event: DropEvent) => void;
|
|
51
|
+
onDragOver?: (event: DropEvent) => void;
|
|
52
|
+
onDrop?: (event: DropEvent) => void;
|
|
53
|
+
}
|
|
54
|
+
interface Point {
|
|
55
|
+
x: number;
|
|
56
|
+
y: number;
|
|
57
|
+
}
|
|
58
|
+
declare class Dropzone {
|
|
59
|
+
readonly element: HTMLElement;
|
|
60
|
+
private options;
|
|
61
|
+
private _isOver;
|
|
62
|
+
private _isActive;
|
|
63
|
+
private _enabled;
|
|
64
|
+
private listeners;
|
|
65
|
+
on(event: string, handler: Function): this;
|
|
66
|
+
off(event: string, handler: Function): this;
|
|
67
|
+
private emit;
|
|
68
|
+
get enabled(): boolean;
|
|
69
|
+
set enabled(value: boolean);
|
|
70
|
+
constructor(element: HTMLElement, options?: DropzoneOptions);
|
|
71
|
+
get isOver(): boolean;
|
|
72
|
+
get isActive(): boolean;
|
|
73
|
+
accepts(draggableEl: HTMLElement): boolean;
|
|
74
|
+
checkOverlap(draggableEl: HTMLElement, pointerPos: Point): number;
|
|
75
|
+
activate(draggableEl: HTMLElement): void;
|
|
76
|
+
deactivate(draggableEl: HTMLElement): void;
|
|
77
|
+
enter(draggableEl: HTMLElement, overlap: number, dragEvent?: DragEvent): void;
|
|
78
|
+
leave(draggableEl: HTMLElement, dragEvent?: DragEvent): void;
|
|
79
|
+
over(draggableEl: HTMLElement, overlap: number, dragEvent?: DragEvent): void;
|
|
80
|
+
drop(draggableEl: HTMLElement, overlap: number, dragEvent?: DragEvent): void;
|
|
81
|
+
private createEvent;
|
|
82
|
+
updateOptions(options: Partial<DropzoneOptions>): void;
|
|
83
|
+
destroy(): void;
|
|
84
|
+
}
|
|
85
|
+
declare class DropzoneManagerSingleton {
|
|
86
|
+
private zones;
|
|
87
|
+
register(zone: Dropzone): void;
|
|
88
|
+
unregister(zone: Dropzone): void;
|
|
89
|
+
onDragStart(draggableEl: HTMLElement): void;
|
|
90
|
+
onDragMove(draggableEl: HTMLElement, pointerPos: Point, dragEvent?: DragEvent): void;
|
|
91
|
+
onDragEnd(draggableEl: HTMLElement, pointerPos: Point, dragEvent?: DragEvent): void;
|
|
92
|
+
getActiveZones(): Dropzone[];
|
|
93
|
+
getHoveredZones(): Dropzone[];
|
|
94
|
+
}
|
|
95
|
+
declare const DropzoneManager: DropzoneManagerSingleton;
|
|
96
|
+
declare function dropzone(element: HTMLElement | string, options?: DropzoneOptions): Dropzone;
|
|
97
|
+
//#endregion
|
|
98
|
+
export { DropEvent, Dropzone, DropzoneManager, DropzoneOptions, dropzone as default, dropzone };
|
|
99
|
+
//# sourceMappingURL=pointrix-dropzone.d.cts.map
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
//#region src/nano.d.ts
|
|
2
|
+
interface Point$1 {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
}
|
|
6
|
+
interface PointerState {
|
|
7
|
+
id: number;
|
|
8
|
+
start: Point$1;
|
|
9
|
+
current: Point$1;
|
|
10
|
+
previous: Point$1;
|
|
11
|
+
delta: Point$1;
|
|
12
|
+
total: Point$1;
|
|
13
|
+
velocity: Point$1;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
}
|
|
16
|
+
interface InteractionEvent {
|
|
17
|
+
target: HTMLElement;
|
|
18
|
+
pointers: PointerState[];
|
|
19
|
+
isPrimary: boolean;
|
|
20
|
+
originalEvent: PointerEvent;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/drag.d.ts
|
|
24
|
+
interface DragEvent extends InteractionEvent {
|
|
25
|
+
dx: number;
|
|
26
|
+
dy: number;
|
|
27
|
+
totalX: number;
|
|
28
|
+
totalY: number;
|
|
29
|
+
velocityX: number;
|
|
30
|
+
velocityY: number;
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/dropzone.d.ts
|
|
34
|
+
interface DropEvent {
|
|
35
|
+
target: HTMLElement;
|
|
36
|
+
draggable: HTMLElement;
|
|
37
|
+
dragEvent?: DragEvent;
|
|
38
|
+
overlap: number;
|
|
39
|
+
}
|
|
40
|
+
interface DropzoneOptions {
|
|
41
|
+
accept?: string | ((draggable: HTMLElement) => boolean);
|
|
42
|
+
overlap?: 'pointer' | 'center' | number;
|
|
43
|
+
activeClass?: string;
|
|
44
|
+
hoverClass?: string;
|
|
45
|
+
/** Enable ARIA attributes (default: true) */
|
|
46
|
+
aria?: boolean;
|
|
47
|
+
onActivate?: (event: DropEvent) => void;
|
|
48
|
+
onDeactivate?: (event: DropEvent) => void;
|
|
49
|
+
onDragEnter?: (event: DropEvent) => void;
|
|
50
|
+
onDragLeave?: (event: DropEvent) => void;
|
|
51
|
+
onDragOver?: (event: DropEvent) => void;
|
|
52
|
+
onDrop?: (event: DropEvent) => void;
|
|
53
|
+
}
|
|
54
|
+
interface Point {
|
|
55
|
+
x: number;
|
|
56
|
+
y: number;
|
|
57
|
+
}
|
|
58
|
+
declare class Dropzone {
|
|
59
|
+
readonly element: HTMLElement;
|
|
60
|
+
private options;
|
|
61
|
+
private _isOver;
|
|
62
|
+
private _isActive;
|
|
63
|
+
private _enabled;
|
|
64
|
+
private listeners;
|
|
65
|
+
on(event: string, handler: Function): this;
|
|
66
|
+
off(event: string, handler: Function): this;
|
|
67
|
+
private emit;
|
|
68
|
+
get enabled(): boolean;
|
|
69
|
+
set enabled(value: boolean);
|
|
70
|
+
constructor(element: HTMLElement, options?: DropzoneOptions);
|
|
71
|
+
get isOver(): boolean;
|
|
72
|
+
get isActive(): boolean;
|
|
73
|
+
accepts(draggableEl: HTMLElement): boolean;
|
|
74
|
+
checkOverlap(draggableEl: HTMLElement, pointerPos: Point): number;
|
|
75
|
+
activate(draggableEl: HTMLElement): void;
|
|
76
|
+
deactivate(draggableEl: HTMLElement): void;
|
|
77
|
+
enter(draggableEl: HTMLElement, overlap: number, dragEvent?: DragEvent): void;
|
|
78
|
+
leave(draggableEl: HTMLElement, dragEvent?: DragEvent): void;
|
|
79
|
+
over(draggableEl: HTMLElement, overlap: number, dragEvent?: DragEvent): void;
|
|
80
|
+
drop(draggableEl: HTMLElement, overlap: number, dragEvent?: DragEvent): void;
|
|
81
|
+
private createEvent;
|
|
82
|
+
updateOptions(options: Partial<DropzoneOptions>): void;
|
|
83
|
+
destroy(): void;
|
|
84
|
+
}
|
|
85
|
+
declare class DropzoneManagerSingleton {
|
|
86
|
+
private zones;
|
|
87
|
+
register(zone: Dropzone): void;
|
|
88
|
+
unregister(zone: Dropzone): void;
|
|
89
|
+
onDragStart(draggableEl: HTMLElement): void;
|
|
90
|
+
onDragMove(draggableEl: HTMLElement, pointerPos: Point, dragEvent?: DragEvent): void;
|
|
91
|
+
onDragEnd(draggableEl: HTMLElement, pointerPos: Point, dragEvent?: DragEvent): void;
|
|
92
|
+
getActiveZones(): Dropzone[];
|
|
93
|
+
getHoveredZones(): Dropzone[];
|
|
94
|
+
}
|
|
95
|
+
declare const DropzoneManager: DropzoneManagerSingleton;
|
|
96
|
+
declare function dropzone(element: HTMLElement | string, options?: DropzoneOptions): Dropzone;
|
|
97
|
+
//#endregion
|
|
98
|
+
export { DropEvent, Dropzone, DropzoneManager, DropzoneOptions, dropzone as default, dropzone };
|
|
99
|
+
//# sourceMappingURL=pointrix-dropzone.d.mts.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){e.setAttribute(`aria-dropeffect`,`move`)}function t(e,t){e.setAttribute(`aria-dropeffect`,t?`move`:`none`)}function n(e){e.removeAttribute(`aria-dropeffect`)}function r(e,t){return t.x>=e.left&&t.x<=e.right&&t.y>=e.top&&t.y<=e.bottom}function i(e,t){let n=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left))*Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)),r=e.width*e.height;return r>0?n/r:0}var a=class{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(e){this._enabled=e}constructor(t,n={}){this._isOver=!1,this._isActive=!1,this._enabled=!0,this.listeners=new Map,this.element=t,this.options={overlap:`pointer`,aria:!0,...n},o.register(this),this.options.aria!==!1&&e(t)}get isOver(){return this._isOver}get isActive(){return this._isActive}accepts(e){if(!this._enabled)return!1;let{accept:t}=this.options;return t?typeof t==`function`?t(e):e.matches(t):!0}checkOverlap(e,t){let n=this.element.getBoundingClientRect(),a=this.options.overlap??`pointer`;if(a===`pointer`)return r(n,t)?1:0;let o=e.getBoundingClientRect();if(a===`center`)return r(n,{x:o.left+o.width/2,y:o.top+o.height/2})?1:0;let s=i(o,n);return s>=a?s:0}activate(e){if(this._isActive)return;this._isActive=!0,this.options.activeClass&&this.element.classList.add(this.options.activeClass),this.options.aria!==!1&&t(this.element,!0);let n=this.createEvent(e,0);this.options.onActivate?.(n),this.emit(`activate`,n)}deactivate(e){if(!this._isActive)return;this._isOver&&this.leave(e),this._isActive=!1,this.options.activeClass&&this.element.classList.remove(this.options.activeClass),this.options.aria!==!1&&t(this.element,!1);let n=this.createEvent(e,0);this.options.onDeactivate?.(n),this.emit(`deactivate`,n)}enter(e,t,n){if(this._isOver)return;this._isOver=!0,this.options.hoverClass&&this.element.classList.add(this.options.hoverClass);let r=this.createEvent(e,t,n);this.options.onDragEnter?.(r),this.emit(`dragenter`,r)}leave(e,t){if(!this._isOver)return;this._isOver=!1,this.options.hoverClass&&this.element.classList.remove(this.options.hoverClass);let n=this.createEvent(e,0,t);this.options.onDragLeave?.(n),this.emit(`dragleave`,n)}over(e,t,n){let r=this.createEvent(e,t,n);this.options.onDragOver?.(r),this.emit(`dragover`,r)}drop(e,t,n){let r=this.createEvent(e,t,n);this.options.onDrop?.(r),this.emit(`drop`,r)}createEvent(e,t,n){return{target:this.element,draggable:e,dragEvent:n,overlap:t}}updateOptions(e){this.options={...this.options,...e}}destroy(){this._isOver=!1,this._isActive=!1,this.options.activeClass&&this.element.classList.remove(this.options.activeClass),this.options.hoverClass&&this.element.classList.remove(this.options.hoverClass),this.options.aria!==!1&&n(this.element),o.unregister(this)}};const o=new class{constructor(){this.zones=new Set}register(e){this.zones.add(e)}unregister(e){this.zones.delete(e)}onDragStart(e){for(let t of this.zones)t.accepts(e)&&t.activate(e)}onDragMove(e,t,n){for(let r of this.zones){if(!r.isActive)continue;let i=r.checkOverlap(e,t);i>0?(r.isOver||r.enter(e,i,n),r.over(e,i,n)):r.isOver&&r.leave(e,n)}}onDragEnd(e,t,n){for(let r of this.zones)if(r.isActive){if(r.isOver){let i=r.checkOverlap(e,t);r.drop(e,i>0?i:1,n)}r.deactivate(e)}}getActiveZones(){let e=[];for(let t of this.zones)t.isActive&&e.push(t);return e}getHoveredZones(){let e=[];for(let t of this.zones)t.isOver&&e.push(t);return e}};function s(e,t){let n=typeof e==`string`?document.querySelector(e):e;if(!n)throw Error(`Element not found: ${e}`);return new a(n,t)}export{a as Dropzone,o as DropzoneManager,s as default,s as dropzone};
|
|
2
|
+
//# sourceMappingURL=pointrix-dropzone.mjs.map
|