@domphy/dnd 0.8.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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026-present Huu Khanh Nguyen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # @domphy/dnd
2
+
3
+ Drag & drop and sortable lists for Domphy: reorder, transfer between lists, multi-drag, keyboard accessibility, and drop animations.
4
+
5
+ Unlike the other `@domphy/*` data packages (which are byte-identical TanStack core ports), drag-and-drop has no portable framework-agnostic core to copy — so this package **depends on** [`@formkit/drag-and-drop`](https://drag-and-drop.formkit.com) (MIT, zero-dependency, framework-agnostic) and adds a thin Domphy adapter. That is exactly how FormKit's own React/Vue/Solid adapters work; `@domphy/dnd` is the Domphy adapter. The full FormKit API is re-exported.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @domphy/dnd @domphy/core
11
+ ```
12
+
13
+ `@domphy/core` is a peer dependency.
14
+
15
+ ## Usage
16
+
17
+ Apply `dragDrop(state, config?)` to the list container via `$`, and render the children reactively from the **same** state with a stable `_key` per item:
18
+
19
+ ```ts
20
+ import { toState, type DomphyElement } from "@domphy/core"
21
+ import { dragDrop } from "@domphy/dnd"
22
+
23
+ const items = toState([
24
+ { id: 1, label: "Write docs" },
25
+ { id: 2, label: "Ship it" },
26
+ { id: 3, label: "Celebrate" },
27
+ ])
28
+
29
+ const App: DomphyElement<"ul"> = {
30
+ ul: (l) =>
31
+ items.get(l).map((item) => ({
32
+ li: item.label,
33
+ _key: item.id, // stable identity is required for reorder
34
+ })),
35
+ $: [dragDrop(items)],
36
+ }
37
+ ```
38
+
39
+ Dragging reorders the DOM, calls FormKit's `setValues` → updates `items` → Domphy re-renders the keyed children in the new order.
40
+
41
+ ## Config & plugins
42
+
43
+ `dragDrop(state, config)` forwards `config` to FormKit's `ParentConfig` — and the whole FormKit API (plugins like `animations`, `insert`, `dropOrSwap`, group transfer, sensors) is re-exported from `@domphy/dnd`:
44
+
45
+ ```ts
46
+ import { dragDrop, animations } from "@domphy/dnd"
47
+
48
+ { ul: (l) => ..., $: [dragDrop(items, { plugins: [animations()], group: "todos" })] }
49
+ ```
50
+
51
+ Transfer between lists: give two lists the same `group`. Reorder/transfer behaviour, accessibility and touch handling come from FormKit — see the [FormKit DnD docs](https://drag-and-drop.formkit.com).
52
+
53
+ ## Cleanup
54
+
55
+ The adapter tears down FormKit's listeners on `_onRemove` automatically.
@@ -0,0 +1,2 @@
1
+ "use strict";var Domphy=(()=>{var J=Object.defineProperty,Nn=Object.defineProperties,xn=Object.getOwnPropertyDescriptor,bn=Object.getOwnPropertyDescriptors,yn=Object.getOwnPropertyNames,Ne=Object.getOwnPropertySymbols;var be=Object.prototype.hasOwnProperty,Sn=Object.prototype.propertyIsEnumerable;var xe=(e,n,t)=>n in e?J(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,I=(e,n)=>{for(var t in n||(n={}))be.call(n,t)&&xe(e,t,n[t]);if(Ne)for(var t of Ne(n))Sn.call(n,t)&&xe(e,t,n[t]);return e},j=(e,n)=>Nn(e,bn(n));var ye=(e,n)=>{for(var t in n)J(e,t,{get:n[t],enumerable:!0})},wn=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of yn(n))!be.call(e,a)&&a!==t&&J(e,a,{get:()=>n[a],enumerable:!(r=xn(n,a))||r.enumerable});return e};var En=e=>wn(J({},"__esModule",{value:!0}),e);var vt={};ye(vt,{dnd:()=>ae});var ae={};ye(ae,{addClass:()=>W,addEvents:()=>M,addNodeClass:()=>Z,addParentClass:()=>vn,animations:()=>Tn,dragAndDrop:()=>ne,dragDrop:()=>mn,dragStateProps:()=>Pe,dragValues:()=>nt,dragstartClasses:()=>Ge,dropOrSwap:()=>Fn,getElFromPoint:()=>hn,handleClickNode:()=>ct,handleClickParent:()=>st,handleDragend:()=>on,handleDragstart:()=>Je,handleEnd:()=>dn,handleLongPress:()=>sn,handleNodeBlur:()=>an,handleNodeDragover:()=>fn,handleNodeDrop:()=>tn,handleNodeFocus:()=>rn,handleNodeKeydown:()=>en,handleNodePointerdown:()=>Ue,handleNodePointerover:()=>nn,handleNodePointerup:()=>cn,handleParentDragover:()=>un,handleParentDrop:()=>Be,handleParentFocus:()=>ze,handleParentPointerover:()=>pn,handlePointercancel:()=>ln,initDrag:()=>Qe,insert:()=>On,isBrowser:()=>fe,isDragState:()=>S,isNode:()=>q,isSynthDragState:()=>y,nodeEventData:()=>O,nodes:()=>V,parentEventData:()=>_,parentValues:()=>E,parents:()=>x,performSort:()=>Me,performTransfer:()=>$e,preventSortOnScroll:()=>gt,remapFinished:()=>Ke,remapNodes:()=>B,removeClass:()=>b,resetState:()=>ue,setAttrs:()=>at,setDragState:()=>pe,setParentValues:()=>w,setupNode:()=>We,setupNodeRemap:()=>ve,sort:()=>De,state:()=>i,synthMove:()=>ce,tearDown:()=>te,tearDownNode:()=>_e,tearDownNodeRemap:()=>je,transfer:()=>K,updateConfig:()=>tt,validateDragHandle:()=>he,validateDragstart:()=>qe,validateSort:()=>Pn,validateTransfer:()=>me});function C(e){e.preventDefault()}function z(e){e.stopPropagation()}function Ve(){let e=new Map;return[function(r,a){e.get(r)&&e.get(r).forEach(o=>{o(a)})},function(r,a){var l;let o=(l=e.get(r))!=null?l:[];o.push(a),e.set(r,o)}]}var[Re,ke]=Ve();function Cn(e,n){return e.source===n.source&&e.flags.split("").sort().join("")===n.flags.split("").sort().join("")}function k(e,n,t=!0,r=["__key"]){if(e===n)return!0;if(typeof n=="object"&&typeof e=="object"&&e!==null&&n!==null){if(e instanceof Map||e instanceof Set)return!1;if(e instanceof Date&&n instanceof Date)return e.getTime()===n.getTime();if(e instanceof RegExp&&n instanceof RegExp)return Cn(e,n);if(e===null||n===null)return!1;let a=e,o=n;if(Object.keys(a).length!==Object.keys(o).length)return!1;for(let l of r)if((l in a||l in o)&&a[l]!==o[l])return!1;for(let l in a)if(!(l in o)||a[l]!==o[l]&&!t||t&&!k(a[l],o[l],t,r))return!1;return!0}return!1}function He(e){return e.split(" ").filter(n=>n)}function $(e){return{x:e.clientX,y:e.clientY}}function Tn(e={}){let n=[{transform:`translateY(${e.yScale||50}%)`},{transform:`translateY(${e.yScale||0}%)`}],t=[{transform:`translateY(-${e.yScale||50}%)`},{transform:`translateY(${e.yScale||0}%)`}],r=[{transform:`translateX(${e.xScale||50}%)`},{transform:`translateX(${e.xScale||0}%)`}],a=[{transform:`translateX(-${e.xScale||50}%)`},{transform:`translateX(${e.xScale||0}%)`}];return o=>{if(x.get(o))return{setup(){document.head.querySelector("[data-drag-and-drop]")},setupNodeRemap(d){if(!S(i))return;let c=e.duration||150,s=e.easing||"ease-in-out";if(d.node.data.value===i.draggedNode.data.value){switch(i.incomingDirection){case"below":R(d.node.el,n,c,s);break;case"above":R(d.node.el,t,c,s);break;case"left":R(d.node.el,a,c,s);break;case"right":R(d.node.el,r,c,s);break}return}if(!i.affectedNodes.map(h=>h.data.value).includes(d.node.data.value))return;let g=d.node.el.getBoundingClientRect(),f=i.affectedNodes.findIndex(h=>h.data.value===d.node.data.value),P=i.draggedNode.data.index>=i.targetIndex,D;if(P?D=i.affectedNodes[f+1]?i.affectedNodes[f+1]:i.affectedNodes[f-1]:D=i.affectedNodes[f-1]?i.affectedNodes[f-1]:i.affectedNodes[f+1],D){let h=Math.abs(g.x-D.el.getBoundingClientRect().x),v=Math.abs(g.y-D.el.getBoundingClientRect().y);h>v&&P?R(d.node.el,a,c,s):h>v&&!P&&R(d.node.el,r,c,s)}else switch(i.incomingDirection){case"below":R(d.node.el,t,c,s);break;case"above":R(d.node.el,n,c,s);break;case"left":R(d.node.el,r,c,s);break;case"right":R(d.node.el,a,c,s);break}}}}}function R(e,n,t,r){i&&(i.preventEnter=!0,e.animate(n,{duration:t,easing:r}),setTimeout(()=>{i&&(i.preventEnter=!1)},t))}var p={draggedOverNodes:[],draggedOverParent:null,targetIndex:0,ascending:!1,insertPoint:null,dragging:!1},U;function On(e){return n=>{let t=x.get(n);if(!t)return;let r=j(I({},t.config),{insertConfig:e});return{teardown(){t.abortControllers.root&&t.abortControllers.root.abort()},setup(){r.handleNodeDragover=e.handleNodeDragover||Vn,r.handleParentPointerover=e.handleParentPointerover||Ee,r.handleNodePointerover=e.handleNodePointerover||Ee,r.handleParentDragover=e.handleParentDragover||Rn;let a=r.handleEnd;r.handleEnd=l=>{Yn(l),a(l)},t.on("dragStarted",()=>{U=M(document,{dragover:Se,pointermove:Se})}),t.on("dragEnded",()=>{U==null||U.abort()}),t.config=r,i.on("dragStarted",()=>{G(n)}),i.on("scrollStarted",()=>{p.insertPoint&&(p.insertPoint.el.style.display="none")}),i.on("scrollEnded",()=>{G(n)});let o=In(n);o&&o.addEventListener("scroll",G.bind(null,n)),window.addEventListener("resize",G.bind(null,n))}}}}function In(e){let n=e.parentElement;for(;n;){let{overflow:t,overflowY:r,overflowX:a}=getComputedStyle(n),o=t!=="visible"||r!=="visible"||a!=="visible",l=n.scrollHeight>n.clientHeight||n.scrollWidth>n.clientWidth,d=n.scrollTop>0||n.scrollLeft>0;if(o&&(l||d))return n;n=n.parentElement}return null}function Ze(e,n){if(e.el===n.initialParent.el)return!0;let t=e.data.config;return n.draggedNode.el.contains(e.el)||t.dropZone===!1?!1:t.accepts?t.accepts(e,n.initialParent,n.currentParent,n):!!t.group&&t.group===n.initialParent.data.config.group}function Se(e){var a;if(!S(i))return;let n=document.elementFromPoint(e.clientX,e.clientY);if(!(n instanceof HTMLElement)||n===((a=p.insertPoint)==null?void 0:a.el))return;let t=!1,r=n;for(;r;){let o=x.get(r);if(o&&Ze({el:r,data:o},i)){t=!0;break}if(r===document.body)break;r=r.parentElement}t||(p.insertPoint&&(p.insertPoint.el.style.display="none"),p.draggedOverParent&&b([p.draggedOverParent.el],p.draggedOverParent.data.config.dropZoneClass),p.draggedOverNodes=[],p.draggedOverParent=null,i.currentParent=i.initialParent)}function we(e,n,t){let r=e.top+e.height/2;if(!n){let c=e.height/2+10;return{y:t?[r,r+c]:[r-c,r],x:[e.left,e.right],vertical:!0}}let a=t?n.top:n.bottom,o=t?e.bottom:e.top,l,d;return t?(l=o+(a-o)/2,d=[r,l]):(l=a+(o-a)/2,d=[l,r]),{y:d,x:[e.left,e.right],vertical:!0}}function F(e,n,t,r=!1){let a=e.left+e.width/2;if(!n)return t?{x:[a,a+e.width],y:[e.top,e.bottom],vertical:!1}:{x:[e.left-10,a],y:[e.top,e.bottom],vertical:!1};if(t&&r)return{x:[a,e.right+10],y:[e.top,e.bottom],vertical:!1};if(t){let o=n.left+n.width/2;return{x:[a,a+Math.abs(a-o)/2],y:[e.top,e.bottom],vertical:!1}}else return{x:[n.right+Math.abs(n.right-e.left)/2,a],y:[e.top,e.bottom],vertical:!1}}function oe(e){let{top:n,bottom:t,left:r,right:a,height:o,width:l}=e.getBoundingClientRect(),d=window.scrollX||document.documentElement.scrollLeft,c=window.scrollY||document.documentElement.scrollTop;return{top:n+c,bottom:t+c,left:r+d,right:a+d,height:o,width:l}}function G(e){if(!S(i)&&!y(i))return;let n=x.get(e);if(!n)return;let t=n.enabledNodes;t.forEach((r,a)=>{r.data.range={};let o=t[a-1],l=t[a+1],d=oe(r.el),c=o?oe(o.el):void 0,s=l?oe(l.el):void 0,g=c&&(d.top>c.bottom||d.bottom<c.top),f=s&&(d.top>s.bottom||d.bottom<s.top);e.getBoundingClientRect().width*.8<d.width?(r.data.range.ascending=we(d,s,!0),r.data.range.descending=we(d,c,!1)):f&&!g?(r.data.range.ascending=F(d,s,!0,!0),r.data.range.descending=F(d,c,!1)):!g&&!f?(r.data.range.ascending=F(d,s,!0),r.data.range.descending=F(d,c,!1)):g&&!s?r.data.range.ascending=F(d,void 0,!0):g&&!f&&(r.data.range.ascending=F(d,s,!0),r.data.range.descending=F(d,void 0,!1))})}function Vn(e){e.targetData.parent.data.config.nativeDrag&&e.e.preventDefault()}function Xe(e,n,t,r=!1){var u;if(C(e),r&&e instanceof PointerEvent)return;let{x:a,y:o}=$(e),l=a,d=o,c=window.scrollX||document.documentElement.scrollLeft,s=window.scrollY||document.documentElement.scrollTop;t.coordinates.x=l+c,t.coordinates.y=d+s;let g=n.parent.data.nestedParent,f=n.parent;if(g){let P=g.el.getBoundingClientRect();t.coordinates.y>P.top&&t.coordinates.y<P.bottom&&(f=g)}f.el===((u=t.currentParent)==null?void 0:u.el)?kn(f,t):Hn(f,t)&&(t.currentParent=f)}function Rn(e,n){Xe(e.e,e.targetData,n,!0)}function Ee(e){let{detail:n}=e,{state:t,targetData:r}=n;t.scrolling||Xe(n.e,r,t)}function kn(e,n){var a,o;if(e.data.config.sortable===!1||e.el===((a=p.draggedOverParent)==null?void 0:a.el)&&p.draggedOverParent.data.getValues(e.el).length===0)return;(o=p.draggedOverParent)!=null&&o.el&&(b([p.draggedOverParent.el],p.draggedOverParent.data.config.dropZoneClass),p.draggedOverParent=null);let t=Ye(e.data.enabledNodes,n);if(!t)return;let r=t[1];if(t){let l=t[0].data.range?t[0].data.range[r]:void 0;l&&Fe(e,l,t[1]==="ascending",t[0],p)}}function Hn(e,n){if(e.el===n.currentParent.el||!Ze(e,n))return!1;let t=e.data.config;if(e.data.getValues(e.el).length){b([n.currentParent.el],t.dropZoneClass);let a=e.data.enabledNodes,o=Ye(a,n);if(!o)return!0;let l=o[1],d=o[0].data.range?o[0].data.range[l]:void 0;d&&Fe(e,d,o[1]==="ascending",o[0],p)}else{vn([e.el],t.dropZoneClass),p.draggedOverParent=e;let a=p.insertPoint;a&&(a.el.style.display="none")}return!0}function Ye(e,n){let t=null;for(let r=0;r<e.length;r++)if(!(!n||!e[r].data.range)){if(e[r].data.range.ascending&&n.coordinates.y>e[r].data.range.ascending.y[0]&&n.coordinates.y<e[r].data.range.ascending.y[1]&&n.coordinates.x>e[r].data.range.ascending.x[0]&&n.coordinates.x<e[r].data.range.ascending.x[1])return t=[e[r],"ascending"],t;if(e[r].data.range.descending&&n.coordinates.y>e[r].data.range.descending.y[0]&&n.coordinates.y<e[r].data.range.descending.y[1]&&n.coordinates.x>e[r].data.range.descending.x[0]&&n.coordinates.x<e[r].data.range.descending.x[1])return t=[e[r],"descending"],t}}function Zn(e,n){var r;let t=(r=e.data.config.insertConfig)==null?void 0:r.insertPoint({el:e.el,data:e.data});if(!t)throw new Error("Insert point not found",{cause:e});n.insertPoint={parent:e,el:t},document.body.appendChild(t),Object.assign(t.style,{position:"absolute",display:"none"})}function Xn(e){var n;(n=e.insertPoint)!=null&&n.el&&e.insertPoint.el.remove(),e.insertPoint=null}function Fe(e,n,t,r,a){var o;if(((o=a.insertPoint)==null?void 0:o.el)!==e.el&&(Xn(a),Zn(e,a)),a.draggedOverNodes=[r],!!a.insertPoint){if(a.insertPoint.el.style.display="block",n.vertical){let l=a.insertPoint.el.getBoundingClientRect().height,c=n.y[t?1:0]-l/2;Object.assign(a.insertPoint.el.style,{top:`${c}px`,left:`${n.x[0]}px`,right:`${n.x[1]}px`,width:`${n.x[1]-n.x[0]}px`})}else{let l=n.x[t?1:0]-a.insertPoint.el.getBoundingClientRect().width/2;a.insertPoint.el.style.left=`${l}px`,Object.assign(a.insertPoint.el.style,{top:`${n.y[0]}px`,bottom:`${n.y[1]}px`,height:`${n.y[1]-n.y[0]}px`})}a.targetIndex=r.data.index,a.ascending=t}}function Yn(e){var a,o,l,d,c;if(!S(e)&&!y(e))return;let n=p.insertPoint;if(p.draggedOverParent){if(p.draggedOverParent){if(e.currentParent.el.contains(e.initialParent.el)){let f=[...E(e.initialParent.el,e.initialParent.data).filter(h=>!P.some(v=>k(h,v)))];w(e.initialParent.el,e.initialParent.data,[...f]);let u=E(p.draggedOverParent.el,p.draggedOverParent.data),P=e.draggedNodes.map(h=>h.data.value),D=(o=e.initialParent.data.config.insertConfig)!=null&&o.dynamicValues?e.initialParent.data.config.insertConfig.dynamicValues({sourceParent:e.initialParent,targetParent:e.currentParent,draggedNodes:e.draggedNodes,targetNodes:p.draggedOverNodes}):P;u.push(...D),w(p.draggedOverParent.el,p.draggedOverParent.data,[...u])}else{let g=e.draggedNodes.map(h=>h.data.value),f=E(p.draggedOverParent.el,p.draggedOverParent.data),u=(l=e.initialParent.data.config.insertConfig)!=null&&l.dynamicValues?e.initialParent.data.config.insertConfig.dynamicValues({sourceParent:e.initialParent,targetParent:e.currentParent,draggedNodes:e.draggedNodes,targetNodes:p.draggedOverNodes}):g;f.push(...u),w(p.draggedOverParent.el,p.draggedOverParent.data,[...f]);let D=[...E(e.initialParent.el,e.initialParent.data).filter(h=>!g.some(v=>k(h,v)))];w(e.initialParent.el,e.initialParent.data,[...D])}let s={sourceParent:e.initialParent,targetParent:e.currentParent,draggedNodes:e.draggedNodes,targetNodes:p.draggedOverNodes,state:e};(d=e.initialParent.data.config.insertConfig)!=null&&d.insertEvent&&e.initialParent.data.config.insertConfig.insertEvent(s),(c=e.currentParent.data.config.insertConfig)!=null&&c.insertEvent&&e.currentParent.data.config.insertConfig.insertEvent(s),b([p.draggedOverParent.el],p.draggedOverParent.data.config.dropZoneClass)}}else{let s=E(e.initialParent.el,e.initialParent.data),g=e.initialParent.el!==e.currentParent.el;B(e.initialParent.el);let f=e.draggedNodes.map(h=>h.data.value),u=[...e.initialParent.data.enabledNodes],P=e.draggedNodes[0].data.index,D=p.targetIndex;if(!g&&p.draggedOverNodes[0]&&p.draggedOverNodes[0].el!==e.draggedNodes[0].el){let h=[...s.filter(m=>!f.some(N=>k(m,N)))],v=p.draggedOverNodes[0].data.index;if(p.targetIndex>e.draggedNodes[0].data.index&&!p.ascending?v--:p.targetIndex<e.draggedNodes[0].data.index&&p.ascending&&v++,h.splice(v,0,...f),w(e.initialParent.el,e.initialParent.data,[...h]),e.initialParent.data.config.onSort){let m={parent:{el:e.initialParent.el,data:e.initialParent.data},previousValues:[...s],previousNodes:[...u],nodes:[...e.initialParent.data.enabledNodes],values:[...h],draggedNodes:e.draggedNodes,targetNodes:p.draggedOverNodes,previousPosition:P,position:v,state:e};e.initialParent.data.config.onSort(m)}}else if(g&&p.draggedOverNodes.length){let h=E(e.initialParent.el,e.initialParent.data),v=p.draggedOverNodes[0].data.index||0;p.ascending&&v++;let m=(a=e.initialParent.data.config.insertConfig)!=null&&a.dynamicValues?e.initialParent.data.config.insertConfig.dynamicValues({sourceParent:e.initialParent,targetParent:e.currentParent,draggedNodes:e.draggedNodes,targetNodes:p.draggedOverNodes,targetIndex:v}):f,N=[...h.filter(Y=>!f.some(Dn=>k(Y,Dn)))];if(e.currentParent.el.contains(e.initialParent.el)){w(e.initialParent.el,e.initialParent.data,[...N]);let Y=E(e.currentParent.el,e.currentParent.data);Y.splice(v,0,...m),w(e.currentParent.el,e.currentParent.data,[...Y])}else{w(e.initialParent.el,e.initialParent.data,[...N]);let Y=E(e.currentParent.el,e.currentParent.data);Y.splice(v,0,...m),w(e.currentParent.el,e.currentParent.data,[...Y])}let H={sourceParent:e.initialParent,targetParent:e.currentParent,initialParent:e.initialParent,draggedNodes:e.draggedNodes,targetIndex:D,targetNodes:p.draggedOverNodes,state:e};e.initialParent.data.config.onTransfer&&e.initialParent.data.config.onTransfer(H),e.currentParent.data.config.onTransfer&&e.currentParent.data.config.onTransfer(H)}}n&&(n.el.style.display="none");let t=y(e)?e.initialParent.data.config.synthDropZoneClass:e.initialParent.data.config.dropZoneClass;b(p.draggedOverNodes.map(s=>s.el),t);let r=e.initialParent.data.config.dragPlaceholderClass;b(e.draggedNodes.map(s=>s.el),r),p.draggedOverNodes=[],p.draggedOverParent=null}var T={draggedOverNodes:Array(),initialDraggedIndex:void 0,transferred:!1,dragging:!1},Q;function Fn(e={}){return n=>{let t=x.get(n);if(!t)return;let r=j(I({},t.config),{dropSwapConfig:e});return{setup(){r.handleNodeDragover=e.handleNodeDragover||Mn,r.handleParentDragover=e.handleParentDragover||zn,r.handleNodePointerover=e.handleNodePointerover||Bn,r.handleParentPointerover=e.handleParentPointerover||$n;let a=r.handleEnd;r.handleEnd=o=>{Wn(o),a(o)},t.on("dragStarted",()=>{Q=M(document,{dragover:An,handleRootPointerover:Ln})}),t.on("dragEnded",()=>{Q==null||Q.abort()}),t.config=r}}}}function An(e){S(i)&&(b([i.currentParent.el],i.currentParent.data.config.dropZoneParentClass),i.currentParent=i.initialParent)}function Ln(e){y(i)&&(b([i.currentParent.el],i.currentParent.data.config.synthDropZoneParentClass),i.currentParent=i.initialParent)}function se(e,n){return e.el===n.currentParent.el||e.el===n.initialParent.el?!0:me({currentParent:n.currentParent,targetParent:e,initialParent:n.initialParent,draggedNodes:n.draggedNodes,state:n})}function ge(e){let n=e.currentParent.data.config,t=y(e);b(T.draggedOverNodes.map(r=>r.el),t?n.synthDropZoneClass:n.dropZoneClass),b([e.currentParent.el],t?n.synthDropZoneParentClass:n.dropZoneParentClass),T.draggedOverNodes=[],e.currentTargetValue=void 0,e.currentParent=e.initialParent}function Ae(e,n){let t="detail"in e?e.detail.targetData:e.targetData;if(!se(t.parent,n)){ge(n);return}let r=t.parent.data.config,a=y(n)?r.synthDropZoneClass:r.dropZoneClass;b(T.draggedOverNodes.map(l=>l.el),a);let o=t.parent.data.enabledNodes;o&&(T.draggedOverNodes=o.slice(t.node.data.index,t.node.data.index+n.draggedNodes.length),Z(T.draggedOverNodes.map(l=>l.el),a,!0),n.currentTargetValue=t.node.data.value,n.currentParent=t.parent,W(n.currentParent.el,y(n)?r.synthDropZoneParentClass:r.dropZoneParentClass,n.currentParent.data,!0))}function Mn(e,n){e.e.preventDefault(),e.e.stopPropagation(),Ae(e,n)}function zn(e,n){if(e.e.preventDefault(),e.e.stopPropagation(),!se(e.targetData.parent,n)){ge(n);return}let t=n.currentParent.data.config;b(T.draggedOverNodes.map(a=>a.el),t.dropZoneClass),b([n.currentParent.el],t.dropZoneParentClass);let r=e.targetData.parent.data.config;W(e.targetData.parent.el,r.dropZoneParentClass,e.targetData.parent.data,!0),T.draggedOverNodes=[],n.currentParent=e.targetData.parent}function $n(e){if(!se(e.detail.targetData.parent,e.detail.state)){ge(e.detail.state);return}let n=e.detail.state.currentParent.data.config;b(T.draggedOverNodes.map(r=>r.el),n.synthDropZoneClass),b([e.detail.state.currentParent.el],n.synthDropZoneParentClass);let t=e.detail.targetData.parent.data.config;W(e.detail.targetData.parent.el,t.synthDropZoneParentClass,e.detail.targetData.parent.data,!0),T.draggedOverNodes=[],e.detail.state.currentParent=e.detail.targetData.parent}function Bn(e){y(e.detail.state)&&Ae(e,e.detail.state)}function Ce(e,n,t,r){let a=Array.isArray(t)?t:[t];if(n===null){let o=a.map(d=>e[d]),l=e[r];return e.splice(r,1,...o),a.forEach((d,c)=>{e[d]=c===0?l:void 0}),e.filter(d=>d!==void 0)}else{let o=a.map(d=>e[d]),l=n[r];return n.splice(r,1,...o),a.forEach((d,c)=>{e[d]=c===0?l:void 0}),[e.filter(d=>d!==void 0),n]}}function Wn(e){var g,f;let n=y(e);b([e.currentParent.el],n?e.currentParent.data.config.synthDropZoneParentClass:e.currentParent.data.config.dropZoneParentClass),b(T.draggedOverNodes.map(u=>u.el),n?e.currentParent.data.config.synthDropZoneClass:e.currentParent.data.config.dropZoneClass);let t=E(e.currentParent.el,e.currentParent.data),r=e.draggedNodes.map(u=>u.data.value),a=t.filter(u=>!r.includes(u)),o=(g=T.draggedOverNodes[0])==null?void 0:g.data.index,l=e.draggedNodes[0].data.index,d=E(e.initialParent.el,e.initialParent.data);if(o===void 0){if(e.initialParent.el===e.currentParent.el)return;let u=d.filter(P=>!r.includes(P));w(e.initialParent.el,e.initialParent.data,u),w(e.currentParent.el,e.currentParent.data,t.concat(r));return}let c=!1,s=(f=e.initialParent.data.config.dropSwapConfig)==null?void 0:f.shouldSwap;if(s&&(c=s({sourceParent:e.initialParent,targetParent:e.currentParent,draggedNodes:e.draggedNodes,targetNodes:T.draggedOverNodes,state:e})),e.initialParent.el===e.currentParent.el)a.splice(o,0,...r),w(e.currentParent.el,e.currentParent.data,c?Ce(t,null,l,o):a),e.initialParent.data.config.onSort&&e.initialParent.data.config.onSort({parent:{el:e.initialParent.el,data:e.initialParent.data},previousValues:[...d],previousNodes:[...e.initialParent.data.enabledNodes],nodes:[...e.initialParent.data.enabledNodes],values:[...a],draggedNodes:e.draggedNodes,previousPosition:l,position:o,targetNodes:T.draggedOverNodes,state:e});else if(c){let u=Ce(d,a,e.initialIndex,o);w(e.initialParent.el,e.initialParent.data,u[0]),w(e.currentParent.el,e.currentParent.data,u[1])}else{let u=d.filter(P=>!r.includes(P));w(e.initialParent.el,e.initialParent.data,u),a.splice(o,0,...r),w(e.currentParent.el,e.currentParent.data,a)}e.currentParent.data.config.onTransfer&&e.currentParent.data.config.onTransfer({sourceParent:e.currentParent,targetParent:e.initialParent,initialParent:e.initialParent,draggedNodes:e.draggedNodes,targetIndex:o,state:e,targetNodes:T.draggedOverNodes}),e.initialParent.data.config.onTransfer&&e.initialParent.data.config.onTransfer({sourceParent:e.initialParent,targetParent:e.currentParent,initialParent:e.initialParent,draggedNodes:e.draggedNodes,targetIndex:o,state:e,targetNodes:T.draggedOverNodes})}var fe=typeof window!="undefined",x=new WeakMap,V=new WeakMap;function Le(){if(!fe)return!1;if("userAgentData"in navigator)return navigator.userAgentData.mobile===!0;let e=navigator.userAgent,n=/android|iphone|ipod/i.test(e),t=/iPad/.test(e)||e.includes("Macintosh")&&navigator.maxTouchPoints>1;return n||t}var jn={affectedNodes:[],coordinates:{x:0,y:0},currentTargetValue:void 0,on:ke,emit:Re,originalZIndex:void 0,pointerSelection:!1,preventEnter:!1,rootUserSelect:void 0,nodePointerdown:void 0,longPress:!1,scrolling:!1,longPressTimeout:void 0,remapJustFinished:!1,selectedNodes:[],selectedParent:void 0,preventSynthDrag:!1,pointerDown:void 0,lastScrollContainerX:null,lastScrollContainerY:null,rootScrollWidth:void 0,rootScrollHeight:void 0,dragItemRect:void 0,windowScrollX:void 0,windowScrollY:void 0,lastScrollDirectionX:void 0,lastScrollDirectionY:void 0,scrollDebounceTimeout:void 0,frameIdX:void 0,frameIdY:void 0},i=jn,X=!1,Te,ie;function ue(){i.scrollDebounceTimeout&&clearTimeout(i.scrollDebounceTimeout),i.longPressTimeout&&clearTimeout(i.longPressTimeout),i.frameIdX!==void 0&&cancelAnimationFrame(i.frameIdX),i.frameIdY!==void 0&&cancelAnimationFrame(i.frameIdY),i=I({},{affectedNodes:[],coordinates:{x:0,y:0},on:ke,emit:Re,currentTargetValue:void 0,originalZIndex:void 0,pointerId:void 0,preventEnter:!1,remapJustFinished:!1,selectedNodes:[],nodePointerdown:void 0,rootUserSelect:void 0,preventSynthDrag:!1,scrolling:!1,selectedParent:void 0,pointerSelection:!1,synthScrollDirection:void 0,draggedNodeDisplay:void 0,synthDragScrolling:!1,longPress:!1,pointerDown:void 0,longPressTimeout:void 0,lastScrollContainerX:null,lastScrollContainerY:null,rootScrollWidth:void 0,rootScrollHeight:void 0,dragItemRect:void 0,windowScrollX:void 0,windowScrollY:void 0,lastScrollDirectionX:void 0,lastScrollDirectionY:void 0,scrollDebounceTimeout:void 0,frameIdX:void 0,frameIdY:void 0})}function pe(e){return Object.assign(i,e),e.initialParent.data.emit("dragStarted",i),X=!1,i.emit("dragStarted",i),i}var le=new WeakSet;function _n(e){le.has(e)||(i.activeState&&L(i.activeState.parent,void 0,i),i.selectedState&&A(i.selectedState.nodes,i.selectedState.parent,i),i.selectedState=i.activeState=void 0)}function Kn(){if(i.pointerDown&&(i.pointerDown.node.el.draggable=!i.pointerDown.parent.data.config.dragHandle),i.pointerDown=void 0,!y(i))return;let e=i.currentParent.data.config;y(i)&&e.handleEnd(i)}function qn(e){e.key==="Escape"&&(i.selectedState&&A(i.selectedState.nodes,i.selectedState.parent,i),i.activeState&&L(i.activeState.parent,void 0,i),i.selectedState=i.activeState=void 0)}function Jn(e){if(!S(i))return;X=!0;let n=i.initialParent.data.config.handleEnd;n(i)}function Un(e){if(!S(i))return;C(e);let{x:n,y:t}=$(e);S(i)&&re({x:n,y:t},e,i)}function Gn(e){if(!i.pointerDown||!i.pointerDown.validated)return;let n=i.pointerDown.parent.data.config;if(!(e.pointerType==="mouse"&&!Le()))if(y(i))y(i)&&ce(e,i);else{if(C(e),n.longPress&&!i.longPress){clearTimeout(i.longPressTimeout),i.longPress=!1;return}let t=n.draggedNodes(i.pointerDown);n.dragstartClasses(i.pointerDown.node,t,n,!0);let r=i.pointerDown.node.el.getBoundingClientRect(),a=ft(i.pointerDown.node,i.pointerDown.parent,e,i,t,r);ce(e,a,!0)}}function Qn(e){S(i)&&e.cancelable&&C(e)}function et(e){y(i)&&C(e)}function ne({parent:e,getValues:n,setValues:t,config:r={}}){var c,s,g,f,u,P,D,h;if(!fe)return;Te||(Te=M(document,{dragover:Un,pointerdown:_n,pointerup:Kn,keydown:qn,drop:Jn,pointermove:Gn,pointercancel:O(r.handlePointercancel),touchmove:Qn,contextmenu:et})),te(e);let[a,o]=Ve(),l={getValues:n,setValues:t,config:I({dragDropEffect:(c=r.dragDropEffect)!=null?c:"move",dragEffectAllowed:(s=r.dragEffectAllowed)!=null?s:"move",draggedNodes:lt,dragstartClasses:Ge,handleNodeKeydown:en,handleDragstart:Je,handleNodeDragover:fn,handleParentDragover:un,handleNodeDrop:tn,handleNodeFocus:rn,handleNodeBlur:an,handlePointercancel:ln,handleEnd:dn,handleDragend:on,handleParentFocus:ze,handleNodePointerup:cn,handleNodePointerover:nn,handleParentPointerover:pn,handleParentScroll:dt,handleNodePointerdown:Ue,handleNodeDragenter:ut,handleNodeDragleave:pt,handleParentDrop:Be,multiDrag:(g=r.multiDrag)!=null?g:!1,nativeDrag:(f=r.nativeDrag)!=null?f:!0,performSort:Me,performTransfer:$e,root:(u=r.root)!=null?u:document,setupNode:We,setupNodeRemap:ve,reapplyDragClasses:ot,tearDownNode:_e,tearDownNodeRemap:je,remapFinished:Ke,threshold:{horizontal:0,vertical:0}},r),enabledNodes:[],abortControllers:{},privateClasses:[],on:o,emit:a};new MutationObserver(it).observe(e,{childList:!0}),x.set(e,l),(P=r.plugins)==null||P.forEach(v=>{var m,N;(N=(m=v(e))==null?void 0:m.tearDown)==null||N.call(m)}),(D=r.plugins)==null||D.forEach(v=>{var m,N;(N=(m=v(e))==null?void 0:m.tearDown)==null||N.call(m)}),(h=r.plugins)==null||h.forEach(v=>{var m,N;(N=(m=v(e))==null?void 0:m.setup)==null||N.call(m)}),rt(e,l),B(e,!0)}function Pe(e,n,t,r,a,o){var s,g,f;let{x:l,y:d}=$(t),c=e.el.getBoundingClientRect();return{affectedNodes:[],ascendingDirection:!1,clonedDraggedEls:[],coordinates:{x:l,y:d},draggedNode:{el:e.el,data:e.data},draggedNodes:r,incomingDirection:void 0,initialIndex:e.data.index,initialParent:{el:n.el,data:n.data},currentParent:{el:n.el,data:n.data},longPress:(s=n.data.config.longPress)!=null?s:!1,longPressTimeout:void 0,currentTargetValue:e.data.value,scrollEls:[],startLeft:a||l-((g=c==null?void 0:c.left)!=null?g:0),startTop:o||d-((f=c==null?void 0:c.top)!=null?f:0),targetIndex:e.data.index,transferred:!1}}function Me({parent:e,draggedNodes:n,targetNodes:t}){B(e.el);let r=n.map(c=>c.data.value),a=E(e.el,e.data),o=n[0].data.index,l=[...e.data.enabledNodes],d=[...a.filter(c=>!r.some(s=>k(c,s)))];d.splice(t[0].data.index,0,...r),"draggedNode"in i&&(i.currentTargetValue=t[0].data.value),w(e.el,e.data,[...d]),e.data.config.onSort&&e.data.config.onSort({parent:{el:e.el,data:e.data},previousValues:[...a],previousNodes:[...l],nodes:[...e.data.enabledNodes],values:[...d],draggedNodes:n,previousPosition:o,position:t[0].data.index,targetNodes:t,state:i})}function L(e,n,t){if(!n){t.activeState=void 0;return}t.activeState={node:n,parent:e}}function A(e,n,t){let r=n.data.config.selectedClass;if(!t.selectedState)return;let a=Array.from(e);b(e.map(o=>o.el),r);for(let o of a){o.el.setAttribute("aria-selected","false");let l=t.selectedState.nodes.findIndex(d=>d.el===o.el);l!==-1&&t.selectedState.nodes.splice(l,1)}}function ee(e,n,t,r,a=!1){r.pointerSelection=a;for(let o of n)o.el.setAttribute("aria-selected","true"),Z([o.el],e.data.config.selectedClass,!0);r.selectedState={nodes:n,parent:e},L(e,t,r)}function ze(e,n){let t=e.targetData.parent.data.enabledNodes[0];t&&(n.selectedState&&n.selectedState.parent.el!==e.targetData.parent.el?L(e.targetData.parent,t,n):n.selectedState||L(e.targetData.parent,t,n))}function $e({currentParent:e,targetParent:n,initialParent:t,draggedNodes:r,initialIndex:a,targetNodes:o,state:l}){B(t.el);let d=r.map(u=>u.data.value),c=[...E(e.el,e.data).filter(u=>!d.some(P=>k(u,P)))],s=E(n.el,n.data),g=t.el===n.el&&n.data.config.sortable===!1,f;o.length?(g?f=a:n.data.config.sortable===!1?f=n.data.enabledNodes.length:f=o[0].data.index,s.splice(f,0,...d)):(f=g?a:n.data.enabledNodes.length,s.splice(f,0,...d)),w(e.el,e.data,c),w(n.el,n.data,s),n.data.config.onTransfer&&n.data.config.onTransfer({sourceParent:e,targetParent:n,initialParent:t,draggedNodes:r,targetIndex:f,state:l,targetNodes:o}),e.data.config.onTransfer&&e.data.config.onTransfer({sourceParent:e,targetParent:n,initialParent:t,draggedNodes:r,targetIndex:f,state:l,targetNodes:o||[]})}function E(e,n){return[...n.getValues(e)]}function w(e,n,t){n.setValues(t,e)}function nt(e){return[...e.draggedNodes.map(n=>n.data.value)]}function tt(e,n){let t=x.get(e);t&&(x.set(e,j(I({},t),{config:I(I({},t.config),n)})),ne({parent:e,getValues:t.getValues,setValues:t.setValues,config:n}))}function Be(e,n){z(e.e),X=!0;let t=n.initialParent.data.config.handleEnd;t(n)}function te(e){var t,r;let n=x.get(e);n&&(((t=i.pointerDown)==null?void 0:t.parent.el)===e&&(i.longPressTimeout&&clearTimeout(i.longPressTimeout),i.pointerDown=void 0),S(i)&&(i.initialParent.el===e||i.currentParent.el===e)&&(y(i)&&((r=i.clonedDraggedNode)==null||r.remove()),ue()),n.abortControllers.mainParent&&n.abortControllers.mainParent.abort())}function S(e){return"draggedNode"in e&&!!e.draggedNode}function y(e){return"synthDragging"in e&&!!e.synthDragging}function rt(e,n){n.abortControllers.mainParent=M(e,{dragover:_(n.config.handleParentDragover),handleParentPointerover:n.config.handleParentPointerover,scroll:_(n.config.handleParentScroll),drop:_(n.config.handleParentDrop),hasNestedParent:t=>{let r=x.get(t.target);r&&(r.nestedParent=t.detail.parent)},focus:_(n.config.handleParentFocus)}),n.config.externalDragHandle&&n.config.externalDragHandle.el&&n.config.externalDragHandle.callback&&(n.abortControllers.externalDragHandle=M(n.config.externalDragHandle.el,{pointerdown:t=>{if(!n.config.externalDragHandle||!n.config.externalDragHandle.callback)return;let r=n.config.externalDragHandle.callback();if(!q(r)){console.warn("No draggable item found from external drag handle callback");return}let a=V.get(r);if(!a)return;let o=r.parentNode;if(!(o instanceof HTMLElement))return;let l=x.get(o);l&&(i.pointerDown={parent:{el:o,data:l},node:{el:r,data:a},validated:!0},r.draggable=!0)}}))}function at(e,n){for(let t in n)e.setAttribute(t,n[t])}function We(e){var t;let n=e.parent.data.config;e.node.data.abortControllers.mainNode=M(e.node.el,{keydown:O(n.handleNodeKeydown),dragstart:O(n.handleDragstart),dragover:O(n.handleNodeDragover),dragenter:O(n.handleNodeDragenter),dragleave:O(n.handleNodeDragleave),dragend:O(n.handleDragend),drop:O(n.handleNodeDrop),focus:O(n.handleNodeFocus),blur:O(n.handleNodeBlur),pointerup:O(n.handleNodePointerup),pointercancel:O(n.handlePointercancel),pointerdown:O(n.handleNodePointerdown),handleNodePointerover:n.handleNodePointerover,touchmove:r=>{S(i)&&r.cancelable&&C(r)},contextmenu:r=>{y(i)&&C(r)}}),e.node.el.draggable=!n.dragHandle,n.reapplyDragClasses(e.node.el,e.parent.data),(t=e.parent.data.config.plugins)==null||t.forEach(r=>{var a,o;(o=(a=r(e.parent.el))==null?void 0:a.setupNode)==null||o.call(a,e)})}function ve(e){var n;V.set(e.node.el,e.node.data),(n=e.parent.data.config.plugins)==null||n.forEach(t=>{var r,a;(a=(r=t(e.parent.el))==null?void 0:r.setupNodeRemap)==null||a.call(r,e)})}function ot(e,n){if(!S(i))return;let t=y(i)?n.config.synthDropZoneClass:n.config.dropZoneClass;i.draggedNode.el===e&&Z([e],t,!0)}function je(e){var n;(n=e.parent.data.config.plugins)==null||n.forEach(t=>{var r,a;(a=(r=t(e.parent.el))==null?void 0:r.tearDownNodeRemap)==null||a.call(r,e)})}function _e(e){var n,t,r,a,o;(n=e.parent.data.config.plugins)==null||n.forEach(l=>{var d,c;(c=(d=l(e.parent.el))==null?void 0:d.tearDownNode)==null||c.call(d,e)}),e.node.el.draggable=!1,(r=(t=e.node.data)==null?void 0:t.abortControllers)!=null&&r.mainNode&&((o=(a=e.node.data)==null?void 0:a.abortControllers)==null||o.mainNode.abort())}function it(e){if(e.length===1&&e[0].addedNodes.length===1&&!(e[0].addedNodes[0]instanceof HTMLElement))return;let n=e[0].target;!(n instanceof HTMLElement)||!x.get(n)||B(n)}function B(e,n){var c;let t=x.get(e);if(!t)return;t.privateClasses=Array.from(e.classList);let r=[],a=t.config;for(let s=0;s<e.children.length;s++){let g=e.children[s];if(!q(g)||g.id==="dnd-dragged-node-clone")continue;let f=V.get(g);(n||!f)&&a.tearDownNode({parent:{el:e,data:t},node:{el:g,data:f}}),!a.disabled&&(!a.draggable||a.draggable&&a.draggable(g)?r.push(g):g.draggable=!1)}let o=t.getValues(e);if(r.length!==o.length&&!a.disabled){console.warn(`The number of draggable items (${r.length}) defined in the parent element does not match the number of values (${o.length}). This may cause unexpected behavior.`);return}let l=[],d=null;if(S(i)){d=[];let s=new Array(o.length).fill(!1);for(let g=0;g<r.length;g++){let f=V.get(r[g]),u=-1;if(f){for(let P=0;P<o.length;P++)if(!s[P]&&k(o[P],f.value)){u=P;break}}if(u===-1){d=null;break}s[u]=!0,d.push(u)}}for(let s=0;s<r.length;s++){let g=r[s],f=V.get(g),u=d?d[s]:s;if(a.draggableValue&&!a.draggableValue(o[u]))continue;let P=Object.assign(f!=null?f:{privateClasses:[],abortControllers:{}},{value:o[u],index:u});if(!S(i)&&i.activeState&&k(i.activeState.node.data.value,P.value)&&L({data:t,el:e},{el:g,data:P},i),S(i)&&k(i.draggedNode.data.value,P.value)){i.draggedNode.data=P,i.draggedNode.el=g;let D=i.draggedNodes.find(h=>h.data.value===P.value);D&&(D.el=g)}l.push({el:g,data:P}),(n||!f)&&a.setupNode({parent:{el:e,data:t},node:{el:g,data:P}}),ve({parent:{el:e,data:t},node:{el:g,data:P}})}x.set(e,j(I({},t),{enabledNodes:l})),a.remapFinished(t),(c=t.config.plugins)==null||c.forEach(s=>{var g,f;(f=(g=s(e))==null?void 0:g.remapFinished)==null||f.call(g)})}function Ke(){i.remapJustFinished=!0,"draggedNode"in i&&(i.affectedNodes=[])}function qe(e){return!!e.targetData.parent.data.config.nativeDrag}function lt(e){var n;if(e.parent.data.config.multiDrag){if(i.selectedState)return[e.node,...(n=i.selectedState)==null?void 0:n.nodes.filter(t=>t.el!==e.node.el)]}else return[e.node];return[]}function dt(e){S(i)&&(i.emit("scrollStarted",i),!y(i)&&(i.preventEnter=!0,ie&&clearTimeout(ie),ie=setTimeout(()=>{i.preventEnter=!1,i.emit("scrollEnded",i)},100)))}function Je(e,n){let t=e.targetData.parent.data.config,r=n.pointerDown&&n.pointerDown.node.el===e.targetData.node.el?n.pointerDown.validated:he({e:e.e,node:e.targetData.node,config:t});if(!t.nativeDrag||!qe(e)||!r){C(e.e);return}let a=t.draggedNodes({parent:e.targetData.parent,node:e.targetData.node});a.length===0&&(a=[e.targetData.node]),t.dragstartClasses(e.targetData.node,a,t);let o=Qe(e,a);if(t.onDragstart){let l={parent:e.targetData.parent,values:E(e.targetData.parent.el,e.targetData.parent.data),draggedNode:o.draggedNode,draggedNodes:o.draggedNodes,position:o.initialIndex,state:o};t.onDragstart(l)}}function Ue(e,n){var d,c;if(le.has(e.e)||(le.add(e.e),n.pointerDown={parent:e.targetData.parent,node:e.targetData.node,validated:!1},!he({e:e.e,node:e.targetData.node,config:e.targetData.parent.data.config})))return;n.pointerDown.validated=!0,e.targetData.parent.data.config.dragHandle&&(e.targetData.node.el.draggable=!0),sn(e,n,e.targetData.node);let t=e.targetData.parent.data,r=[e.targetData.node],a=e.e.ctrlKey||e.e.metaKey,o=e.e.shiftKey,l=e.targetData.node;if(a&&t.config.multiDrag){n.selectedState?n.selectedState.nodes.findIndex(g=>g.el===l.el)===-1?r=[...n.selectedState.nodes,l]:r=n.selectedState.nodes.filter(g=>g.el!==l.el):r=[l],ee(e.targetData.parent,r,e.targetData.node,n,!0);return}if(o&&t.config.multiDrag){let s=e.targetData.parent.data.enabledNodes;if(n.selectedState&&n.activeState)if(n.selectedState.parent.el!==e.targetData.parent.el){A(n.selectedState.nodes,n.selectedState.parent,n),n.selectedState=void 0;for(let g=0;g<=l.data.index;g++)r.push(s[g])}else{let[g,f]=n.activeState.node.data.index<e.targetData.node.data.index?[n.activeState.node.data.index,e.targetData.node.data.index]:[e.targetData.node.data.index,n.activeState.node.data.index];r=s.slice(g,f+1)}else for(let g=0;g<=l.data.index;g++)r.push(s[g]);ee(e.targetData.parent,r,e.targetData.node,n,!0);return}(c=(d=n.selectedState)==null?void 0:d.nodes)!=null&&c.length?n.selectedState.nodes.findIndex(g=>g.el===e.targetData.node.el)===-1&&(n.selectedState.parent.el!==e.targetData.parent.el?A(n.selectedState.nodes,e.targetData.parent,n):t.config.multiDrag&&Le()?r.push(...n.selectedState.nodes):A(n.selectedState.nodes,e.targetData.parent,n),ee(e.targetData.parent,r,e.targetData.node,n,!0)):ee(e.targetData.parent,[e.targetData.node],e.targetData.node,n,!0)}function Ge(e,n,t,r=!1){Z(n.map(a=>a.el),r?t.synthDraggingClass:t.draggingClass),setTimeout(()=>{b(n.map(a=>a.el),r?t.synthDraggingClass:t.draggingClass),Z(n.map(a=>a.el),r?t.synthDragPlaceholderClass:t.dragPlaceholderClass),Z(n.map(a=>a.el),r?t.synthDropZoneClass:t.dropZoneClass),b(n.map(a=>a.el),t.selectedClass)})}function Qe(e,n){z(e.e);let t=pe(Pe(e.targetData.node,e.targetData.parent,e.e,n));if(e.e.dataTransfer){let r=e.targetData.parent.data.config;e.e.dataTransfer.dropEffect=r.dragDropEffect,e.e.dataTransfer.effectAllowed=r.dragEffectAllowed;let a;if(e.e.dataTransfer.setData("text/plain",""),r.dragImage)a=r.dragImage(e,n);else{if(!r.multiDrag||n.length===1)return t.originalZIndex=e.targetData.node.el.style.zIndex,e.targetData.node.el.style.zIndex="9999",e.targetData.node.el.style.boxSizing="border-box",e.e.dataTransfer.setDragImage(e.targetData.node.el,e.e.offsetX,e.e.offsetY),t;{let o=document.createElement("div");o.setAttribute("id","dnd-dragged-node-clone"),o.setAttribute("popover","manual");for(let d of n){let c=d.el.cloneNode(!0);c.id=d.el.id+"-clone",c.style.pointerEvents="none",o.appendChild(c)}let{width:l}=n[0].el.getBoundingClientRect();Object.assign(o.style,{display:"flex",flexDirection:"column",width:`${l}px`,position:"absolute",pointerEvents:"none",zIndex:"9999",left:"-9999px",boxSizing:"border-box",background:"transparent",overflow:"hidden"}),e.targetData.parent.el.appendChild(o),o.isConnected&&o.showPopover(),o.getBoundingClientRect(),a=o,e.e.dataTransfer.setDragImage(a,e.e.offsetX,e.e.offsetY)}}setTimeout(()=>{a==null||a.remove()})}return t}function he({e,node:n,config:t}){if(t.externalDragHandle)return!1;if(!t.dragHandle)return!0;let r=e.composedPath(),a=r.indexOf(n.el);for(let d of a===-1?[]:r.slice(0,a))if(d instanceof Element&&d.matches(t.dragHandle))return!0;let o=n.el.querySelectorAll(t.dragHandle),l=t.root.elementFromPoint(e.clientX,e.clientY);if(!l)return!1;for(let d of Array.from(o))if(l===d||d.contains(l))return!0;return!1}function ct(e){}function st(e){}function en(e){}function gt(){let e;return()=>{clearTimeout(e),i&&(i.preventEnter=!0),e=setTimeout(()=>{i&&(i.preventEnter=!1)},100)}}function nn(e){e.detail.targetData.parent.el===e.detail.state.currentParent.el?De(e.detail,e.detail.state):K(e.detail,e.detail.state)}function tn(e,n){let t=e.targetData.parent.data.config;t.nativeDrag&&(z(e.e),X=!0,t.handleEnd(n))}function rn(e){e.e.target!==e.e.currentTarget&&i.pointerDown&&(i.pointerDown.node.el.draggable=!1)}function an(e){e.e.target!==e.e.currentTarget&&i.pointerDown&&(i.pointerDown.node.el.draggable=!i.pointerDown.parent.data.config.dragHandle)}function on(e,n){let t=e.targetData.parent.data.config;if(t.nativeDrag){if(C(e.e),z(e.e),X){X=!1;return}t.handleEnd(n)}}function ln(e,n){var r;if(!y(n))return;if(C(e.e),X){X=!1;return}let t=(r=x.get(n.initialParent.el))==null?void 0:r.config;t!=null&&t.onDragend&&t.onDragend({parent:n.currentParent,values:E(n.currentParent.el,n.currentParent.data),draggedNode:n.draggedNode,draggedNodes:n.draggedNodes,state:n}),t==null||t.handleEnd(n)}function dn(e){var g,f,u,P,D;e.draggedNode&&(e.draggedNode.el.draggable=!e.currentParent.data.config.dragHandle);let n=e.draggedNodes.map(h=>h.el),t=e.initialParent.data,r=y(e),a=(g=x.get(e.initialParent.el))==null?void 0:g.config,o=r?a==null?void 0:a.synthDropZoneClass:a==null?void 0:a.dropZoneClass,l=(f=t==null?void 0:t.config)==null?void 0:f.longPressClass,d=r?(u=t==null?void 0:t.config)==null?void 0:u.synthDragPlaceholderClass:(P=t==null?void 0:t.config)==null?void 0:P.dragPlaceholderClass,c=e.originalZIndex;y(e)&&(e.clonedDraggedNode&&e.clonedDraggedNode.remove(),e.longPressTimeout&&clearTimeout(e.longPressTimeout)),de(e),e.lastScrollDirectionX=void 0,e.lastScrollDirectionY=void 0,e.preventEnter=!1,e.scrollDebounceTimeout&&(clearTimeout(e.scrollDebounceTimeout),e.scrollDebounceTimeout=void 0),c!==void 0&&e.draggedNode&&(e.draggedNode.el.style.zIndex=c),requestAnimationFrame(()=>{b(n,o),b(n,l),b(n,d)}),A(e.draggedNodes,e.currentParent,e),L(e.currentParent,void 0,e);let s=I({},e);(D=a==null?void 0:a.onDragend)==null||D.call(a,{parent:s.currentParent,values:E(s.currentParent.el,s.currentParent.data),draggedNode:s.draggedNode,draggedNodes:s.draggedNodes,state:s}),e.emit("dragEnded",s),ue()}function cn(e,n){z(e.e),!n.pointerSelection&&n.selectedState&&A(n.selectedState.nodes,e.targetData.parent,n);let t=e.targetData.parent.data.config;n.pointerSelection=!1,"longPressTimeout"in n&&n.longPressTimeout&&clearTimeout(n.longPressTimeout),n.longPress=!1,b(e.targetData.parent.data.enabledNodes.map(r=>r.el),t.longPressClass),n.pointerDown&&n.pointerDown.parent.data.config.dragHandle&&(n.pointerDown.node.el.draggable=!1),S(n)&&t.handleEnd(n)}function ft(e,n,t,r,a,o){var D,h;let l=n.data.config,d,c,s=["display","flexDirection","alignItems","justifyContent","padding","paddingTop","margin","marginTop","marginBottom","marginLeft","marginRight","paddingBottom","paddingLeft","paddingRight","border","borderRadius","background","backgroundColor","boxShadow","font","color","lineHeight","gap","width","height","boxSizing","overflow"],g=(v,m)=>{let N=window.getComputedStyle(v);s.forEach(H=>{m.style[H]=N[H]})},f=(v,m={})=>{Object.assign(v.style,I({position:"absolute",zIndex:"9999",pointerEvents:"none",willChange:"transform",boxSizing:"border-box",opacity:"0",overflow:"hidden",width:`${o.width}px`,height:`${o.height}px`},m))};if(l.synthDragImage)c=l.synthDragImage(e,n,t,a),d=c.dragImage,d.setAttribute("popover","manual"),f(d);else if(!l.multiDrag||a.length===1)d=e.el.cloneNode(!0),g(e.el,d),d.setAttribute("popover","manual"),f(d);else{let v=document.createElement("div");v.setAttribute("popover","manual"),a.forEach(m=>{let N=m.el.cloneNode(!0);g(m.el,N),N.style.pointerEvents="none",N.style.margin="0",v.append(N)}),v.style.display="flex",v.style.flexDirection="column",v.style.padding="0",v.style.margin="0",v.style.position="absolute",v.style.zIndex="9999",v.style.pointerEvents="none",d=v}d.id="dnd-dragged-node-clone",n.el.appendChild(d),d.isConnected&&d.showPopover();let u={clonedDraggedEls:[],clonedDraggedNode:d,synthDragScrolling:!1,synthDragging:!0,rootScrollWidth:(D=document.scrollingElement)==null?void 0:D.scrollWidth,rootScrollHeight:(h=document.scrollingElement)==null?void 0:h.scrollHeight};return pe(I(I({},Pe(e,n,t,a,c==null?void 0:c.offsetX,c==null?void 0:c.offsetY)),u))}function sn(e,n,t){let r=e.targetData.parent.data.config;r.longPress&&(n.longPressTimeout=setTimeout(()=>{n&&(n.longPress=!0,r.longPressClass&&e.e.cancelable&&Z([t.el],r.longPressClass),C(e.e))},r.longPressDuration||1e3))}function de(e,n=!0,t=!0){n&&(e.frameIdX!==void 0&&(cancelAnimationFrame(e.frameIdX),e.frameIdX=void 0),e.lastScrollDirectionX=void 0),t&&(e.frameIdY!==void 0&&(cancelAnimationFrame(e.frameIdY),e.frameIdY=void 0),e.lastScrollDirectionY=void 0),!e.frameIdX&&!e.frameIdY&&(e.preventEnter=!1)}function gn(e,n=!1){var g,f,u,P,D;let{x:t,y:r}=e.coordinates,a=(g=e.startLeft)!=null?g:0,o=(f=e.startTop)!=null?f:0,l=(u=window.scrollX)!=null?u:0,d=(P=window.scrollY)!=null?P:0,c=t-a+l,s=r-o+d;e.clonedDraggedNode.style.transform=`translate3d(${c}px, ${s}px, 0px)`,n&&(e.clonedDraggedNode.style.opacity="1",b(e.draggedNodes.map(h=>h.el),(D=e.initialParent.data.config)==null?void 0:D.longPressClass))}function ce(e,n,t=!1){let r=$(e);n.coordinates.x=r.x,n.coordinates.y=r.y,gn(n,t),n.scrollDebounceTimeout&&(clearTimeout(n.scrollDebounceTimeout),n.scrollDebounceTimeout=void 0),n.scrollDebounceTimeout=setTimeout(()=>{y(n)&&re(n.coordinates,e,n)},16);let a=hn(r);if(!a){document.dispatchEvent(new CustomEvent("handleRootPointerover",{detail:{e,state:n}}));return}let o={e,targetData:a,state:n};"node"in a?a.node.el.dispatchEvent(new CustomEvent("handleNodePointerover",{detail:o})):a.parent.el.dispatchEvent(new CustomEvent("handleParentPointerover",{detail:o}))}function fn(e,n){var o;if(!e.targetData.parent.data.config.nativeDrag)return;let{x:r,y:a}=$(e.e);n.coordinates.y=a,n.coordinates.x=r,C(e.e),z(e.e),S(n)&&re({x:r,y:a},e.e,n),e.targetData.parent.el===((o=n.currentParent)==null?void 0:o.el)?De(e,n):K(e,n)}function un(e,n){if(!e.targetData.parent.data.config.nativeDrag)return;C(e.e),z(e.e);let{x:r,y:a}=$(e.e);S(n)&&re({x:r,y:a},e.e,n),K(e,n)}function pn(e){e.detail.targetData.parent.el!==e.detail.state.currentParent.el&&K(e.detail,e.detail.state)}function me({currentParent:e,targetParent:n,initialParent:t,draggedNodes:r,state:a}){if(!n||!e||n.el===e.el)return!1;let o=n.data.config;if(r[0].el.contains(n.el)||o.dropZone===!1)return!1;let l=t.data.config;return o.accepts?o.accepts(n,t,e,a):!(!o.group||o.group!==l.group)}function ut(e,n){C(e.e)}function pt(e,n){C(e.e)}function Pn(e,n,t,r){var g;if(n.affectedNodes.map(f=>f.data.value).includes(e.targetData.node.data.value))return!1;if(n.remapJustFinished)return n.remapJustFinished=!1,(e.targetData.node.data.value===n.currentTargetValue||n.draggedNodes.map(f=>f.el).includes(e.targetData.node.el))&&(n.currentTargetValue=e.targetData.node.data.value),!1;if(n.preventEnter)return!1;if(n.draggedNodes.map(f=>f.el).includes(e.targetData.node.el))return n.currentTargetValue=void 0,!1;if(e.targetData.node.data.value===n.currentTargetValue||e.targetData.parent.el!==((g=n.currentParent)==null?void 0:g.el)||e.targetData.parent.data.config.sortable===!1||e.targetData.node.el.contains(n.draggedNodes[0].el))return!1;let a=e.targetData.node.el.getBoundingClientRect(),o=n.draggedNode.el.getBoundingClientRect(),l=a.y-o.y,d=a.x-o.x,c;Math.abs(l)>Math.abs(d)?c=l>0?"above":"below":c=d>0?"left":"right";let s=n.currentParent.data.config.threshold;switch(c){case"left":if(t>a.x+a.width*s.horizontal)return n.incomingDirection="left",!0;break;case"right":if(t<a.x+a.width*(1-s.horizontal))return n.incomingDirection="right",!0;break;case"above":if(r>a.y+a.height*s.vertical)return n.incomingDirection="above",!0;break;case"below":if(r<a.y+a.height*(1-s.vertical))return n.incomingDirection="below",!0;break;default:break}return!1}function De(e,n){let{x:t,y:r}=$(e.e);if(!Pn(e,n,t,r))return;let a=n.draggedNode.data.index>e.targetData.node.data.index?[e.targetData.node.data.index,n.draggedNode.data.index]:[n.draggedNode.data.index,e.targetData.node.data.index];n.targetIndex=e.targetData.node.data.index,n.affectedNodes=e.targetData.parent.data.enabledNodes.filter(o=>a[0]<=o.data.index&&o.data.index<=a[1]&&o.el!==n.draggedNode.el),e.targetData.parent.data.config.performSort({parent:e.targetData.parent,draggedNodes:n.draggedNodes,targetNodes:[e.targetData.node]})}function O(e){function n(t){let r=V.get(t);if(!r)return;let a=x.get(t.parentNode);if(a)return{node:{el:t,data:r},parent:{el:t.parentNode,data:a}}}return t=>{let r=n(t.currentTarget);if(r)return e({e:t,targetData:r},i)}}function K(e,n){C(e.e),me({currentParent:n.currentParent,targetParent:e.targetData.parent,initialParent:n.initialParent,draggedNodes:n.draggedNodes,state:n})&&(e.targetData.parent.data.config.performTransfer({currentParent:n.currentParent,targetParent:e.targetData.parent,initialParent:n.initialParent,draggedNodes:n.draggedNodes,initialIndex:n.initialIndex,state:n,targetNodes:"node"in e.targetData?[e.targetData.node]:[]}),n.currentParent=e.targetData.parent,n.transferred=!0)}function _(e){function n(t){let r=x.get(t);if(r)return{parent:{el:t,data:r}}}return t=>{let r=n(t.currentTarget);if(r)return e({e:t,targetData:r},i)}}function Z(e,n,t=!1){function r(a,o){V.set(a,o)}for(let a of e){let o=V.get(a),l=W(a,n,o,t);l&&r(a,l)}}function vn(e,n,t=!1){function r(a,o){x.set(a,o)}for(let a of e){let o=x.get(a),l=W(a,n,o,t);l&&r(a,l)}}function W(e,n,t,r=!1){if(!n)return;let a=He(n);if(!a.length)return;if(!t){e.classList.add(...a);return}let o=[];for(let l of a)e.classList.contains(l)?e.classList.contains(l)&&r===!1&&o.push(l):e.classList.add(l);return t.privateClasses=o,t}function b(e,n){if(!n)return;let t=He(n);if(t.length)for(let r of e){if(!q(r)){r.classList.remove(...t);continue}let a=V.get(r)||x.get(r);if(a)for(let o of t)a.privateClasses.includes(o)||r.classList.remove(o)}}function Oe(e,n,t,r,a){let l=a.axis==="x",d=e===document.scrollingElement,c=l?"scrollLeft":"scrollTop",s=l?"clientWidth":"clientHeight",g=l?"offsetWidth":"offsetHeight",f=l?"scrollWidth":"scrollHeight",u=l?n.clientX:n.clientY,P=l?r.left:r.top,D=l?t.overflowX:t.overflowY;if(d){let h=e[c],v=e[s],m=h>0,N=h+v<(l?a.state.rootScrollWidth||0:e[f]);return l?{left:m&&u<v*.075,right:N&&u>v*(1-.075)}:{up:m&&u<v*.075,down:N&&u>v*(1-.075)}}if((D==="auto"||D==="scroll")&&e!==document.body&&e!==document.documentElement){let h=e[f],v=e[g],m=e[c],N=m>0,H=m<h-v;return l?{left:N&&u<P+v*.075,right:H&&u>P+v*(1-.075)}:{up:N&&u<P+v*.075,down:H&&u>P+v*(1-.075)}}return l?{left:!1,right:!1}:{up:!1,down:!1}}function Pt(e,n,t,r){if(!S(t)||!t.draggedNode)return;t.preventEnter=!0;let a=r.axis==="x",o=r.direction==="positive"?1:-1,l=20,d=a?"lastScrollDirectionX":"lastScrollDirectionY",c=a?"frameIdX":"frameIdY";t[c]!==void 0&&(cancelAnimationFrame(t[c]),t[c]=void 0),t[d]=r.direction;let s=()=>{if(!S(t)||!t.draggedNode){t[c]!==void 0&&(cancelAnimationFrame(t[c]),t[c]=void 0);return}let g=a?"scrollLeft":"scrollTop",f=a?"clientWidth":"clientHeight",u=a?"scrollWidth":"scrollHeight",P=e[g],D=e[f],h=e[u];if(!(o>0?P+D<h:P>0)){t[c]=void 0,t[d]=void 0;return}e[g]+=l*o,y(t)&&gn(t),t[c]=requestAnimationFrame(s)};t[c]=requestAnimationFrame(s)}function Ie(e,n,t){let r=e.getBoundingClientRect();return n>=r.left&&n<=r.right&&t>=r.top&&t<=r.bottom}function re(e,n,t){if(!S(t)||!t.draggedNode)return;de(t);let{x:r,y:a}=e,o=!1,l=(c,s,g)=>{Pt(g,n,t,{axis:c,direction:s}),o=!0},d=c=>{let s=window.getComputedStyle(c),g=c.getBoundingClientRect(),f=Oe(c,n,s,g,{axis:"x",state:t}),u=Oe(c,n,s,g,{axis:"y"});(f.left||f.right)&&(t.lastScrollContainerX=c,l("x",f.right?"positive":"negative",c)),(u.up||u.down)&&(t.lastScrollContainerY=c,l("y",u.down?"positive":"negative",c))};if(t.lastScrollContainerX&&Ie(t.lastScrollContainerX,r,a)&&d(t.lastScrollContainerX),!o&&t.lastScrollContainerY&&Ie(t.lastScrollContainerY,r,a)&&d(t.lastScrollContainerY),!o){let c=document.elementFromPoint(r,a);for(;c&&!(o&&t.lastScrollContainerX&&t.lastScrollContainerY);)c instanceof HTMLElement&&d(c),c=c.parentElement}if(!o){let c=document.scrollingElement;c instanceof HTMLElement&&d(c)}o||de(t)}function hn(e){let n=document.elementFromPoint(e.x,e.y);if(!q(n))return;let t,r=!0;for(;n&&r;){if(V.has(n)||x.has(n)){r=!1,t=x.has(n);break}n=n.parentNode}if(t){let a=x.get(n);return a?{parent:{el:n,data:a}}:void 0}else{let a=V.get(n);if(!a)return;let o=x.get(n.parentNode);return o?{node:{el:n,data:a},parent:{el:n.parentNode,data:o}}:void 0}}function q(e){return e instanceof HTMLElement&&e.parentNode instanceof HTMLElement}function M(e,n){let t=new AbortController;for(let r in n){let a=n[r];e.addEventListener(r,a,{signal:t.signal,passive:!1,capture:r==="focus"||r==="blur"})}return t}function mn(e,n={}){return{_onMount:t=>{let r=t.domElement;r&&ne({parent:r,getValues:()=>e.get(),setValues:a=>e.set(a),config:n})},_onRemove:t=>{let r=t.domElement;r&&te(r)}}}return En(vt);})();
2
+ //# sourceMappingURL=dnd.global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/global.ts","../src/index.ts","../../../node_modules/.pnpm/@formkit+drag-and-drop@0.6.0/node_modules/@formkit/src/utils.ts","../../../node_modules/.pnpm/@formkit+drag-and-drop@0.6.0/node_modules/@formkit/src/plugins/animations/index.ts","../../../node_modules/.pnpm/@formkit+drag-and-drop@0.6.0/node_modules/@formkit/src/plugins/insert/index.ts","../../../node_modules/.pnpm/@formkit+drag-and-drop@0.6.0/node_modules/@formkit/src/plugins/drop-or-swap/index.ts","../../../node_modules/.pnpm/@formkit+drag-and-drop@0.6.0/node_modules/@formkit/src/index.ts","../src/dragDrop.ts"],"sourcesContent":["export * as dnd from \"./index\";\n","// @domphy/dnd — drag & drop for Domphy. Re-exports the framework-agnostic\n// @formkit/drag-and-drop engine and adds the Domphy adapter `dragDrop`.\nexport * from \"@formkit/drag-and-drop\";\nexport { dragDrop } from \"./dragDrop.js\";\n","/**\n * Function to prevent default behavior of an event.\n *\n * @param {Event} e - The event to prevent default behavior of.\n */\nexport function pd(e: Event) {\n e.preventDefault();\n}\n\n/**\n * Function to stop propagation of an event.\n *\n * @param {Event} e - The event to stop propagation of.\n */\nexport function sp(e: Event) {\n e.stopPropagation();\n}\n\n/**\n * Function to get the bounding client rect of an element.\n *\n * @param {HTMLElement} el - The element to get the bounding client rect of.\n *\n * @returns {ClientRect} The bounding client rect of the element.\n */\nexport function rect(el: HTMLElement): ClientRect {\n return el.getBoundingClientRect();\n}\n\n/**\n * Function to create an emitter.\n *\n * @returns {[Function, Function]} A tuple containing emit and on functions\n */\nexport function createEmitter<T>() {\n const callbacks = new Map<string, Array<(data: T) => void>>();\n\n const emit = function (eventName: string, data: T) {\n if (!callbacks.get(eventName)) return;\n\n callbacks.get(eventName)!.forEach((cb) => {\n cb(data);\n });\n };\n\n const on = function (eventName: string, callback: (data: T) => void) {\n const cbs = callbacks.get(eventName) ?? [];\n\n cbs.push(callback);\n\n callbacks.set(eventName, cbs);\n };\n\n return [emit, on] as const;\n}\n\n/**\n * The emit and on functions for drag and drop.\n *\n * @type {[Function, Function]}\n */\nexport const [emit, on] = createEmitter();\n\n/**\n * A regular expression to test for a valid date string.\n *\n * @param x - A RegExp to compare.\n * @param y - A RegExp to compare.\n * @public\n */\nexport function eqRegExp(x: RegExp, y: RegExp): boolean {\n return (\n x.source === y.source &&\n x.flags.split(\"\").sort().join(\"\") === y.flags.split(\"\").sort().join(\"\")\n );\n}\n\n/**\n * Compare two values for equality, optionally at depth.\n *\n * @param valA - First value.\n * @param valB - Second value.\n * @param deep - If it will compare deeply if it's an object.\n * @param explicit - An array of keys to explicity check.\n *\n * @returns `boolean`\n *\n * @public\n */\nexport function eq(\n valA: unknown,\n valB: unknown,\n deep = true,\n explicit: string[] = [\"__key\"]\n): boolean {\n if (valA === valB) return true;\n\n if (\n typeof valB === \"object\" &&\n typeof valA === \"object\" &&\n valA !== null &&\n valB !== null\n ) {\n if (valA instanceof Map) return false;\n if (valA instanceof Set) return false;\n if (valA instanceof Date && valB instanceof Date)\n return valA.getTime() === valB.getTime();\n if (valA instanceof RegExp && valB instanceof RegExp)\n return eqRegExp(valA, valB);\n if (valA === null || valB === null) return false;\n\n const objA = valA as Record<string, unknown>;\n const objB = valB as Record<string, unknown>;\n\n if (Object.keys(objA).length !== Object.keys(objB).length) return false;\n\n for (const k of explicit) {\n if ((k in objA || k in objB) && objA[k] !== objB[k]) return false;\n }\n\n for (const key in objA) {\n if (!(key in objB)) return false;\n if (objA[key] !== objB[key] && !deep) return false;\n if (deep && !eq(objA[key], objB[key], deep, explicit)) return false;\n }\n return true;\n }\n return false;\n}\n\n/**\n * Split a class name into an array of class names.\n *\n * @param className - The class name to split.\n *\n * @returns An array of class names.\n */\nexport function splitClass(className: string): Array<string> {\n return className.split(\" \").filter((x) => x);\n}\n\nexport function getRealCoords(el: HTMLElement): {\n top: number;\n bottom: number;\n left: number;\n right: number;\n height: number;\n width: number;\n} {\n const { top, bottom, left, right, height, width } =\n el.getBoundingClientRect();\n\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n return {\n top: top + scrollTop,\n bottom: bottom + scrollTop,\n left: left + scrollLeft,\n right: right + scrollLeft,\n height,\n width,\n };\n}\n\nexport function eventCoordinates(data: DragEvent | PointerEvent) {\n return { x: data.clientX, y: data.clientY };\n}\n","import type { SetupNodeData, Node } from \"../../types\";\nimport type { AnimationsConfig } from \"./types\";\nimport { state, parents, isDragState } from \"../../index\";\n\nexport function animations(animationsConfig: Partial<AnimationsConfig> = {}) {\n const slideUp = [\n {\n transform: `translateY(${animationsConfig.yScale || 50}%)`,\n },\n {\n transform: `translateY(${animationsConfig.yScale || 0}%)`,\n },\n ];\n\n const slideDown = [\n {\n transform: `translateY(-${animationsConfig.yScale || 50}%)`,\n },\n {\n transform: `translateY(${animationsConfig.yScale || 0}%)`,\n },\n ];\n\n const slideLeft = [\n {\n transform: `translateX(${animationsConfig.xScale || 50}%)`,\n },\n {\n transform: `translateX(${animationsConfig.xScale || 0}%)`,\n },\n ];\n\n const slideRight = [\n {\n transform: `translateX(-${animationsConfig.xScale || 50}%)`,\n },\n {\n transform: `translateX(${animationsConfig.xScale || 0}%)`,\n },\n ];\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n return {\n setup() {\n if (document.head.querySelector(\"[data-drag-and-drop]\")) return;\n },\n\n setupNodeRemap<T>(data: SetupNodeData<T>) {\n if (!isDragState(state)) return;\n\n const duration = animationsConfig.duration || 150;\n\n const easing = animationsConfig.easing || \"ease-in-out\";\n\n if (data.node.data.value === state.draggedNode.data.value) {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node.el, slideUp, duration, easing);\n\n break;\n case \"above\":\n animate(data.node.el, slideDown, duration, easing);\n\n break;\n case \"left\":\n animate(data.node.el, slideRight, duration, easing);\n\n break;\n case \"right\":\n animate(data.node.el, slideLeft, duration, easing);\n\n break;\n }\n\n return;\n }\n\n if (\n !state.affectedNodes\n .map((x) => x.data.value)\n .includes(data.node.data.value)\n )\n return;\n\n const nodeRect = data.node.el.getBoundingClientRect();\n\n const nodeIndex = state.affectedNodes.findIndex(\n (x) => x.data.value === data.node.data.value\n );\n\n const draggedNodeIndex = state.draggedNode.data.index;\n\n const ascendingDirection = draggedNodeIndex >= state.targetIndex;\n\n let adjacentNode;\n\n if (ascendingDirection) {\n adjacentNode = state.affectedNodes[nodeIndex + 1]\n ? state.affectedNodes[nodeIndex + 1]\n : state.affectedNodes[nodeIndex - 1];\n } else {\n adjacentNode = state.affectedNodes[nodeIndex - 1]\n ? state.affectedNodes[nodeIndex - 1]\n : state.affectedNodes[nodeIndex + 1];\n }\n\n if (adjacentNode) {\n const xDiff = Math.abs(\n nodeRect.x - adjacentNode.el.getBoundingClientRect().x\n );\n\n const yDiff = Math.abs(\n nodeRect.y - adjacentNode.el.getBoundingClientRect().y\n );\n\n if (xDiff > yDiff && ascendingDirection) {\n animate(data.node.el, slideRight, duration, easing);\n } else if (xDiff > yDiff && !ascendingDirection) {\n animate(data.node.el, slideLeft, duration, easing);\n }\n } else {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node.el, slideDown, duration, easing);\n\n break;\n case \"above\":\n animate(data.node.el, slideUp, duration, easing);\n\n break;\n case \"left\":\n animate(data.node.el, slideLeft, duration, easing);\n\n break;\n case \"right\":\n animate(data.node.el, slideRight, duration, easing);\n\n break;\n }\n }\n },\n };\n };\n}\n\nfunction animate(\n node: Node,\n animation: Keyframe[] | PropertyIndexedKeyframes,\n duration: number,\n easing: string\n) {\n if (!state) return;\n\n state.preventEnter = true;\n\n node.animate(animation, {\n duration: duration,\n easing,\n });\n\n setTimeout(() => {\n if (!state) return;\n\n state.preventEnter = false;\n }, duration);\n}\n","import type { InsertConfig } from \"../../types\";\nimport type {\n DragState,\n NodeDragEventData,\n NodeRecord,\n ParentEventData,\n PointeroverParentEvent,\n ParentRecord,\n SynthDragState,\n InsertEvent,\n BaseDragState,\n InsertState,\n Coordinates,\n} from \"../../types\";\n\nimport {\n parents,\n parentValues,\n setParentValues,\n state,\n addParentClass,\n isDragState,\n isSynthDragState,\n removeClass,\n addEvents,\n remapNodes,\n} from \"../../index\";\n\nimport { eq, pd, eventCoordinates } from \"../../utils\";\n\nexport const insertState: InsertState<unknown> = {\n draggedOverNodes: [],\n draggedOverParent: null,\n targetIndex: 0,\n ascending: false,\n insertPoint: null,\n dragging: false,\n};\n\nlet documentController: AbortController | undefined;\n\n// WIP: This is a work in progress and not yet fully functional\nexport function insert<T>(insertConfig: InsertConfig<T>) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n const insertParentConfig = {\n ...parentData.config,\n insertConfig,\n };\n\n return {\n teardown() {\n if (parentData.abortControllers.root) {\n parentData.abortControllers.root.abort();\n }\n },\n setup() {\n insertParentConfig.handleNodeDragover =\n insertConfig.handleNodeDragover || handleNodeDragover;\n\n insertParentConfig.handleParentPointerover =\n insertConfig.handleParentPointerover || handleParentPointerover;\n\n insertParentConfig.handleNodePointerover =\n insertConfig.handleNodePointerover || handleParentPointerover;\n\n insertParentConfig.handleParentDragover =\n insertConfig.handleParentDragover || handleParentDragover;\n\n const originalHandleend = insertParentConfig.handleEnd;\n\n insertParentConfig.handleEnd = (\n state: DragState<T> | SynthDragState<T>\n ) => {\n handleEnd(state);\n\n originalHandleend(state);\n };\n\n parentData.on(\"dragStarted\", () => {\n documentController = addEvents(document, {\n dragover: checkPosition,\n pointermove: checkPosition,\n });\n });\n\n parentData.on(\"dragEnded\", () => {\n documentController?.abort();\n });\n\n parentData.config = insertParentConfig;\n\n state.on(\"dragStarted\", () => {\n defineRanges(parent);\n });\n\n state.on(\"scrollStarted\", () => {\n if (insertState.insertPoint)\n insertState.insertPoint.el.style.display = \"none\";\n });\n\n state.on(\"scrollEnded\", () => {\n defineRanges(parent);\n });\n\n const firstScrollableParent = findFirstOverflowingParent(parent);\n\n if (firstScrollableParent) {\n firstScrollableParent.addEventListener(\n \"scroll\",\n defineRanges.bind(null, parent)\n );\n }\n\n window.addEventListener(\"resize\", defineRanges.bind(null, parent));\n },\n };\n };\n}\n\nfunction findFirstOverflowingParent(element: HTMLElement): HTMLElement | null {\n let parent = element.parentElement;\n\n while (parent) {\n const { overflow, overflowY, overflowX } = getComputedStyle(parent);\n\n // Check if the overflow property is set to scroll, auto, or hidden (anything other than visible)\n const isOverflowSet =\n overflow !== \"visible\" ||\n overflowY !== \"visible\" ||\n overflowX !== \"visible\";\n\n // Check if there is actual overflow (scrolling)\n const isOverflowing =\n parent.scrollHeight > parent.clientHeight ||\n parent.scrollWidth > parent.clientWidth;\n const hasScrollPosition = parent.scrollTop > 0 || parent.scrollLeft > 0;\n\n if (isOverflowSet && (isOverflowing || hasScrollPosition)) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return null; // No overflowing parent found\n}\n\n/**\n * Whether the dragged nodes may be dropped into the given parent. Mirrors the\n * core validateTransfer() semantics: the initial parent is always valid, and\n * any other parent must opt in via accepts() or share the initial parent's\n * group.\n */\nfunction isValidDropTarget<T>(\n target: ParentRecord<T>,\n state: DragState<T>\n): boolean {\n if (target.el === state.initialParent.el) return true;\n\n const targetConfig = target.data.config;\n\n if (state.draggedNode.el.contains(target.el)) return false;\n\n if (targetConfig.dropZone === false) return false;\n\n if (targetConfig.accepts) {\n return targetConfig.accepts(\n target,\n state.initialParent,\n state.currentParent,\n state\n );\n }\n\n return (\n !!targetConfig.group &&\n targetConfig.group === state.initialParent.data.config.group\n );\n}\n\nfunction checkPosition(e: DragEvent | PointerEvent) {\n if (!isDragState(state)) return;\n\n const el = document.elementFromPoint(e.clientX, e.clientY);\n\n // 1. If the element is not an HTMLElement or is the insert point itself, do nothing.\n if (!(el instanceof HTMLElement) || el === insertState.insertPoint?.el) {\n return;\n }\n\n // 2. Traverse up the DOM from the element under the cursor looking for a\n // registered parent that can actually receive the dragged nodes. The\n // walk continues past registered parents that fail validation so that\n // nested lists with different groups don't mask a valid ancestor (e.g.\n // dragging a column while hovering the cards list inside it).\n let isWithinAParent = false;\n let current: HTMLElement | null = el;\n while (current) {\n const parentData = parents.get(current);\n if (\n parentData &&\n isValidDropTarget({ el: current, data: parentData }, state)\n ) {\n isWithinAParent = true;\n break; // Found a valid registered parent ancestor\n }\n if (current === document.body) break; // Stop if we reach the body\n current = current.parentElement;\n }\n\n // 3. If the cursor is NOT within a registered parent that can receive the\n // dragged nodes...\n if (!isWithinAParent) {\n // Hide the insert point if it exists\n if (insertState.insertPoint) {\n insertState.insertPoint.el.style.display = \"none\";\n }\n\n // Remove drop zone class if a parent was previously being dragged over\n if (insertState.draggedOverParent) {\n removeClass(\n [insertState.draggedOverParent.el],\n insertState.draggedOverParent.data.config.dropZoneClass\n );\n }\n\n // Reset insert state related to dragged over elements\n insertState.draggedOverNodes = [];\n insertState.draggedOverParent = null;\n\n // Reset current parent in the main state back to the initial one\n state.currentParent = state.initialParent;\n }\n // 4. If the cursor IS within a registered parent, do nothing in this function.\n // Other event handlers will manage the insertion point positioning.\n}\n\ninterface Range {\n x: [number, number];\n y: [number, number];\n vertical: boolean;\n}\n\nfunction createVerticalRange(\n nodeCoords: Coordinates,\n otherCoords: Coordinates | undefined,\n isAscending: boolean\n): Range {\n const center = nodeCoords.top + nodeCoords.height / 2;\n\n if (!otherCoords) {\n const offset = nodeCoords.height / 2 + 10;\n return {\n y: isAscending ? [center, center + offset] : [center - offset, center],\n x: [nodeCoords.left, nodeCoords.right],\n vertical: true,\n };\n }\n\n const otherEdge = isAscending ? otherCoords.top : otherCoords.bottom;\n const nodeEdge = isAscending ? nodeCoords.bottom : nodeCoords.top;\n\n let midpoint: number;\n let range: [number, number];\n\n if (isAscending) {\n // Midpoint between current node's bottom and next node's top\n midpoint = nodeEdge + (otherEdge - nodeEdge) / 2; // nodeCoords.bottom + (otherCoords.top - nodeCoords.bottom) / 2\n range = [center, midpoint]; // Range from node center down to midpoint\n } else {\n // Midpoint between previous node's bottom and current node's top\n midpoint = otherEdge + (nodeEdge - otherEdge) / 2; // otherCoords.bottom + (nodeCoords.top - otherCoords.bottom) / 2\n range = [midpoint, center]; // Range from midpoint down to node center\n }\n\n return {\n y: range,\n x: [nodeCoords.left, nodeCoords.right],\n vertical: true,\n };\n}\n\nfunction createHorizontalRange(\n nodeCoords: Coordinates,\n otherCoords: Coordinates | undefined,\n isAscending: boolean,\n lastInRow = false\n): Range {\n const center = nodeCoords.left + nodeCoords.width / 2;\n\n if (!otherCoords) {\n if (isAscending) {\n return {\n x: [center, center + nodeCoords.width],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n } else {\n return {\n x: [nodeCoords.left - 10, center],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n }\n }\n\n if (isAscending && lastInRow) {\n return {\n x: [center, nodeCoords.right + 10],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n }\n\n if (isAscending) {\n const nextNodeCenter = otherCoords.left + otherCoords.width / 2;\n return {\n x: [center, center + Math.abs(center - nextNodeCenter) / 2],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n } else {\n return {\n x: [\n otherCoords.right + Math.abs(otherCoords.right - nodeCoords.left) / 2,\n center,\n ],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n }\n}\n\nfunction getRealCoords(el: HTMLElement): Coordinates {\n const { top, bottom, left, right, height, width } =\n el.getBoundingClientRect();\n\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n return {\n top: top + scrollTop,\n bottom: bottom + scrollTop,\n left: left + scrollLeft,\n right: right + scrollLeft,\n height,\n width,\n };\n}\n\nfunction defineRanges(parent: HTMLElement) {\n if (!isDragState(state) && !isSynthDragState(state)) return;\n\n const parentData = parents.get(parent);\n if (!parentData) return;\n\n const enabledNodes = parentData.enabledNodes;\n\n enabledNodes.forEach((node, index) => {\n node.data.range = {};\n\n const prevNode = enabledNodes[index - 1];\n const nextNode = enabledNodes[index + 1];\n const nodeCoords = getRealCoords(node.el);\n const prevNodeCoords = prevNode ? getRealCoords(prevNode.el) : undefined;\n const nextNodeCoords = nextNode ? getRealCoords(nextNode.el) : undefined;\n\n const aboveOrBelowPrevious =\n prevNodeCoords &&\n (nodeCoords.top > prevNodeCoords.bottom ||\n nodeCoords.bottom < prevNodeCoords.top);\n\n const aboveOrBelowAfter =\n nextNodeCoords &&\n (nodeCoords.top > nextNodeCoords.bottom ||\n nodeCoords.bottom < nextNodeCoords.top);\n\n const fullishWidth =\n parent.getBoundingClientRect().width * 0.8 < nodeCoords.width;\n\n if (fullishWidth) {\n node.data.range.ascending = createVerticalRange(\n nodeCoords,\n nextNodeCoords,\n true\n );\n node.data.range.descending = createVerticalRange(\n nodeCoords,\n prevNodeCoords,\n false\n );\n } else if (aboveOrBelowAfter && !aboveOrBelowPrevious) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n nextNodeCoords,\n true,\n true\n );\n node.data.range.descending = createHorizontalRange(\n nodeCoords,\n prevNodeCoords,\n false\n );\n } else if (!aboveOrBelowPrevious && !aboveOrBelowAfter) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n nextNodeCoords,\n true\n );\n node.data.range.descending = createHorizontalRange(\n nodeCoords,\n prevNodeCoords,\n false\n );\n } else if (aboveOrBelowPrevious && !nextNodeCoords) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n undefined,\n true\n );\n } else if (aboveOrBelowPrevious && !aboveOrBelowAfter) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n nextNodeCoords,\n true\n );\n node.data.range.descending = createHorizontalRange(\n nodeCoords,\n undefined,\n false\n );\n }\n });\n}\n\nexport function handleNodeDragover<T>(data: NodeDragEventData<T>) {\n const config = data.targetData.parent.data.config;\n\n if (!config.nativeDrag) return;\n\n data.e.preventDefault();\n}\n\nfunction processParentDragEvent<T>(\n e: DragEvent | PointerEvent,\n targetData: ParentEventData<T>[\"targetData\"],\n state: DragState<T>,\n nativeDrag = false\n) {\n pd(e);\n\n if (nativeDrag && e instanceof PointerEvent) return;\n\n const { x, y } = eventCoordinates(e);\n\n // Calculate global coordinates\n const clientX = x;\n const clientY = y;\n\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n state.coordinates.x = clientX + scrollLeft;\n state.coordinates.y = clientY + scrollTop;\n\n const nestedParent = targetData.parent.data.nestedParent;\n\n let realTargetParent = targetData.parent;\n\n if (nestedParent) {\n const rect = nestedParent.el.getBoundingClientRect();\n\n if (state.coordinates.y > rect.top && state.coordinates.y < rect.bottom)\n realTargetParent = nestedParent;\n }\n\n if (realTargetParent.el === state.currentParent?.el) {\n moveBetween(realTargetParent, state);\n } else if (moveOutside(realTargetParent, state)) {\n // Only adopt the hovered parent as the current parent when it can\n // actually receive the dragged nodes — otherwise handleEnd would\n // transfer values into a list whose group/accepts rules reject them.\n state.currentParent = realTargetParent;\n }\n}\n\nexport function handleParentDragover<T>(\n data: ParentEventData<T>,\n state: DragState<T>\n) {\n processParentDragEvent(data.e as DragEvent, data.targetData, state, true);\n}\n\nexport function handleParentPointerover<T>(data: PointeroverParentEvent<T>) {\n const { detail } = data;\n\n const { state, targetData } = detail;\n\n if (state.scrolling) return;\n\n processParentDragEvent(detail.e, targetData, state);\n}\n\nexport function moveBetween<T>(data: ParentRecord<T>, state: DragState<T>) {\n if (data.data.config.sortable === false) return;\n\n if (\n data.el === insertState.draggedOverParent?.el &&\n insertState.draggedOverParent.data.getValues(data.el).length === 0\n ) {\n return;\n } else if (insertState.draggedOverParent?.el) {\n removeClass(\n [insertState.draggedOverParent.el],\n insertState.draggedOverParent.data.config.dropZoneClass\n );\n insertState.draggedOverParent = null;\n }\n\n const foundRange = findClosest(data.data.enabledNodes, state);\n\n if (!foundRange) return;\n\n const key = foundRange[1] as \"ascending\" | \"descending\";\n\n if (foundRange) {\n const position = foundRange[0].data.range\n ? foundRange[0].data.range[key]\n : undefined;\n\n if (position)\n positionInsertPoint(\n data,\n position,\n foundRange[1] === \"ascending\",\n foundRange[0],\n insertState as InsertState<T>\n );\n }\n}\n\nfunction moveOutside<T>(data: ParentRecord<T>, state: DragState<T>): boolean {\n if (data.el === state.currentParent.el) return false;\n\n if (!isValidDropTarget(data, state)) return false;\n\n const targetConfig = data.data.config;\n\n const values = data.data.getValues(data.el);\n\n if (!values.length) {\n addParentClass([data.el], targetConfig.dropZoneClass);\n\n insertState.draggedOverParent = data as ParentRecord<unknown>;\n\n const insertPoint = insertState.insertPoint;\n\n if (insertPoint) insertPoint.el.style.display = \"none\";\n } else {\n removeClass([state.currentParent.el], targetConfig.dropZoneClass);\n\n const enabledNodes = data.data.enabledNodes;\n\n const foundRange = findClosest(enabledNodes, state);\n\n if (!foundRange) return true;\n\n const key = foundRange[1] as \"ascending\" | \"descending\";\n\n const position = foundRange[0].data.range\n ? foundRange[0].data.range[key]\n : undefined;\n\n if (position)\n positionInsertPoint(\n data,\n position,\n foundRange[1] === \"ascending\",\n foundRange[0],\n insertState as InsertState<T>\n );\n }\n\n return true;\n}\n\nfunction findClosest<T>(enabledNodes: NodeRecord<T>[], state: DragState<T>) {\n let foundRange: [NodeRecord<T>, string] | null = null;\n\n for (let x = 0; x < enabledNodes.length; x++) {\n if (!state || !enabledNodes[x].data.range) continue;\n\n if (enabledNodes[x].data.range!.ascending) {\n if (\n state.coordinates.y > enabledNodes[x].data.range!.ascending!.y[0] &&\n state.coordinates.y < enabledNodes[x].data.range!.ascending!.y[1] &&\n state.coordinates.x > enabledNodes[x].data.range!.ascending!.x[0] &&\n state.coordinates.x < enabledNodes[x].data.range!.ascending!.x[1]\n ) {\n foundRange = [enabledNodes[x], \"ascending\"];\n\n return foundRange;\n }\n }\n\n if (enabledNodes[x].data.range!.descending) {\n if (\n state.coordinates.y > enabledNodes[x].data.range!.descending!.y[0] &&\n state.coordinates.y < enabledNodes[x].data.range!.descending!.y[1] &&\n state.coordinates.x > enabledNodes[x].data.range!.descending!.x[0] &&\n state.coordinates.x < enabledNodes[x].data.range!.descending!.x[1]\n ) {\n foundRange = [enabledNodes[x], \"descending\"];\n\n return foundRange;\n }\n }\n }\n}\n\nfunction createInsertPoint<T>(\n parent: ParentRecord<T>,\n insertState: InsertState<T>\n) {\n const insertPoint = parent.data.config.insertConfig?.insertPoint({\n el: parent.el,\n data: parent.data,\n });\n\n if (!insertPoint)\n throw new Error(\"Insert point not found\", { cause: parent });\n\n insertState.insertPoint = {\n parent,\n el: insertPoint,\n };\n\n document.body.appendChild(insertPoint);\n\n Object.assign(insertPoint.style, {\n position: \"absolute\",\n display: \"none\",\n });\n}\n\nfunction removeInsertPoint<T>(insertState: InsertState<T>) {\n if (insertState.insertPoint?.el) insertState.insertPoint.el.remove();\n\n insertState.insertPoint = null;\n}\n\nfunction positionInsertPoint<T>(\n parent: ParentRecord<T>,\n position: { x: number[]; y: number[]; vertical: boolean },\n ascending: boolean,\n node: NodeRecord<T>,\n insertState: InsertState<T>\n) {\n if (insertState.insertPoint?.el !== parent.el) {\n removeInsertPoint(insertState);\n\n createInsertPoint(parent, insertState);\n }\n\n insertState.draggedOverNodes = [node];\n\n if (!insertState.insertPoint) return;\n\n insertState.insertPoint.el.style.display = \"block\";\n\n if (position.vertical) {\n const insertPointHeight =\n insertState.insertPoint.el.getBoundingClientRect().height;\n const targetY = position.y[ascending ? 1 : 0];\n const topPosition = targetY - insertPointHeight / 2;\n\n Object.assign(insertState.insertPoint.el.style, {\n top: `${topPosition}px`,\n left: `${position.x[0]}px`,\n right: `${position.x[1]}px`,\n width: `${position.x[1] - position.x[0]}px`,\n });\n } else {\n const leftPosition =\n position.x[ascending ? 1 : 0] -\n insertState.insertPoint.el.getBoundingClientRect().width / 2;\n insertState.insertPoint.el.style.left = `${leftPosition}px`;\n\n Object.assign(insertState.insertPoint.el.style, {\n top: `${position.y[0]}px`,\n bottom: `${position.y[1]}px`,\n height: `${position.y[1] - position.y[0]}px`,\n });\n }\n\n insertState.targetIndex = node.data.index;\n\n insertState.ascending = ascending;\n}\n\nexport function handleParentDrop<T>(_data: NodeDragEventData<T>) {}\n\n/**\n * Performs the actual insertion of the dragged nodes into the target parent.\n *\n * @param state - The current drag state.\n */\nexport function handleEnd<T>(\n state: DragState<T> | SynthDragState<T> | BaseDragState<T>\n) {\n if (!isDragState(state) && !isSynthDragState(state)) return;\n\n const insertPoint = insertState.insertPoint;\n\n if (!insertState.draggedOverParent) {\n const draggedParentValues = parentValues(\n state.initialParent.el,\n state.initialParent.data\n );\n\n const transferred = state.initialParent.el !== state.currentParent.el;\n\n remapNodes(state.initialParent.el);\n\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n const enabledNodes = [...state.initialParent.data.enabledNodes];\n\n const originalIndex = state.draggedNodes[0].data.index;\n\n const targetIndex = insertState.targetIndex;\n\n if (\n !transferred &&\n insertState.draggedOverNodes[0] &&\n insertState.draggedOverNodes[0].el !== state.draggedNodes[0].el\n ) {\n const newParentValues = [\n ...draggedParentValues.filter(\n (x) => !draggedValues.some((y) => eq(x, y))\n ),\n ];\n\n let index = insertState.draggedOverNodes[0].data.index;\n\n if (\n insertState.targetIndex > state.draggedNodes[0].data.index &&\n !insertState.ascending\n ) {\n index--;\n } else if (\n insertState.targetIndex < state.draggedNodes[0].data.index &&\n insertState.ascending\n ) {\n index++;\n }\n\n newParentValues.splice(index, 0, ...draggedValues);\n\n setParentValues(state.initialParent.el, state.initialParent.data, [\n ...newParentValues,\n ]);\n\n if (state.initialParent.data.config.onSort) {\n const sortEventData = {\n parent: {\n el: state.initialParent.el,\n data: state.initialParent.data,\n } as ParentRecord<T>,\n previousValues: [...draggedParentValues],\n previousNodes: [...enabledNodes],\n nodes: [...state.initialParent.data.enabledNodes],\n values: [...newParentValues],\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes as Array<NodeRecord<T>>,\n previousPosition: originalIndex,\n position: index,\n state: state as DragState<T>,\n };\n\n state.initialParent.data.config.onSort(sortEventData);\n }\n } else if (transferred && insertState.draggedOverNodes.length) {\n const draggedParentValues = parentValues(\n state.initialParent.el,\n state.initialParent.data\n );\n\n // For the time being, we will not be remoing the value of the original dragged parent.\n let index = insertState.draggedOverNodes[0].data.index || 0;\n\n if (insertState.ascending) index++;\n\n const insertValues = state.initialParent.data.config.insertConfig\n ?.dynamicValues\n ? state.initialParent.data.config.insertConfig.dynamicValues({\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes as NodeRecord<T>[],\n targetIndex: index,\n })\n : draggedValues;\n\n const newParentValues = [\n ...draggedParentValues.filter(\n (x) => !draggedValues.some((y) => eq(x, y))\n ),\n ];\n\n if (state.currentParent.el.contains(state.initialParent.el)) {\n // Update initial parent values first\n setParentValues(state.initialParent.el, state.initialParent.data, [\n ...newParentValues,\n ]);\n\n // Now get the target parent values.\n const targetParentValues = parentValues(\n state.currentParent.el,\n state.currentParent.data\n );\n\n targetParentValues.splice(index, 0, ...insertValues);\n\n setParentValues(state.currentParent.el, state.currentParent.data, [\n ...targetParentValues,\n ]);\n } else {\n setParentValues(state.initialParent.el, state.initialParent.data, [\n ...newParentValues,\n ]);\n\n const targetParentValues = parentValues(\n state.currentParent.el,\n state.currentParent.data\n );\n\n targetParentValues.splice(index, 0, ...insertValues);\n\n setParentValues(state.currentParent.el, state.currentParent.data, [\n ...targetParentValues,\n ]);\n }\n\n const data = {\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n targetIndex,\n targetNodes: insertState.draggedOverNodes as NodeRecord<T>[],\n state,\n };\n\n if (state.initialParent.data.config.onTransfer)\n state.initialParent.data.config.onTransfer(data);\n if (state.currentParent.data.config.onTransfer)\n state.currentParent.data.config.onTransfer(data);\n }\n } else if (insertState.draggedOverParent) {\n if (state.currentParent.el.contains(state.initialParent.el)) {\n const draggedParentValues = parentValues(\n state.initialParent.el,\n state.initialParent.data\n );\n\n const newParentValues = [\n ...draggedParentValues.filter(\n (x) => !draggedValues.some((y) => eq(x, y))\n ),\n ];\n\n setParentValues(state.initialParent.el, state.initialParent.data, [\n ...newParentValues,\n ]);\n\n const draggedOverParentValues = parentValues(\n insertState.draggedOverParent.el,\n insertState.draggedOverParent.data\n );\n\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n const insertValues = state.initialParent.data.config.insertConfig\n ?.dynamicValues\n ? state.initialParent.data.config.insertConfig.dynamicValues({\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes as NodeRecord<T>[],\n })\n : draggedValues;\n\n draggedOverParentValues.push(...insertValues);\n\n setParentValues(\n insertState.draggedOverParent.el,\n insertState.draggedOverParent.data,\n [...draggedOverParentValues]\n );\n } else {\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n const draggedOverParentValues = parentValues(\n insertState.draggedOverParent.el,\n insertState.draggedOverParent.data\n );\n\n const insertValues = state.initialParent.data.config.insertConfig\n ?.dynamicValues\n ? state.initialParent.data.config.insertConfig.dynamicValues({\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes as NodeRecord<T>[],\n })\n : draggedValues;\n\n draggedOverParentValues.push(...insertValues);\n\n setParentValues(\n insertState.draggedOverParent.el,\n insertState.draggedOverParent.data,\n [...draggedOverParentValues]\n );\n\n const draggedParentValues = parentValues(\n state.initialParent.el,\n state.initialParent.data\n );\n\n const newParentValues = [\n ...draggedParentValues.filter(\n (x) => !draggedValues.some((y) => eq(x, y))\n ),\n ];\n\n setParentValues(state.initialParent.el, state.initialParent.data, [\n ...newParentValues,\n ]);\n }\n\n const data: InsertEvent<T> = {\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes as NodeRecord<T>[],\n state,\n };\n\n if (state.initialParent.data.config.insertConfig?.insertEvent)\n state.initialParent.data.config.insertConfig.insertEvent(data);\n if (state.currentParent.data.config.insertConfig?.insertEvent)\n state.currentParent.data.config.insertConfig.insertEvent(data);\n\n removeClass(\n [insertState.draggedOverParent.el],\n insertState.draggedOverParent.data.config.dropZoneClass\n );\n }\n\n if (insertPoint) insertPoint.el.style.display = \"none\";\n\n const dropZoneClass = isSynthDragState(state)\n ? state.initialParent.data.config.synthDropZoneClass\n : state.initialParent.data.config.dropZoneClass;\n\n removeClass(\n insertState.draggedOverNodes.map((node) => node.el),\n dropZoneClass\n );\n\n const dragPlaceholderClass =\n state.initialParent.data.config.dragPlaceholderClass;\n\n removeClass(\n state.draggedNodes.map((node) => node.el),\n dragPlaceholderClass\n );\n\n insertState.draggedOverNodes = [];\n\n insertState.draggedOverParent = null;\n}\n","import type {\n DropSwapConfig,\n NodeDragEventData,\n DragState,\n SynthDragState,\n NodeRecord,\n PointeroverNodeEvent,\n ParentDragEventData,\n PointeroverParentEvent,\n DropSwapState,\n ParentRecord,\n BaseDragState,\n} from \"../../types\";\nimport {\n parents,\n parentValues,\n setParentValues,\n addNodeClass,\n isSynthDragState,\n removeClass,\n addClass,\n state,\n addEvents,\n isDragState,\n validateTransfer,\n} from \"../../index\";\n\nexport const dropSwapState: DropSwapState<unknown> = {\n draggedOverNodes: Array<NodeRecord<unknown>>(),\n initialDraggedIndex: undefined,\n transferred: false,\n dragging: false,\n};\n\n/**\n * Abort controller for the document.\n */\nlet documentController: AbortController | undefined;\n\nexport function dropOrSwap<T>(dropSwapConfig: DropSwapConfig<T> = {}) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n const dropSwapParentConfig = {\n ...parentData.config,\n dropSwapConfig,\n };\n\n return {\n setup() {\n dropSwapParentConfig.handleNodeDragover =\n dropSwapConfig.handleNodeDragover || handleNodeDragover;\n\n dropSwapParentConfig.handleParentDragover =\n dropSwapConfig.handleParentDragover || handleParentDragover;\n\n dropSwapParentConfig.handleNodePointerover =\n dropSwapConfig.handleNodePointerover || handleNodePointerover;\n\n dropSwapParentConfig.handleParentPointerover =\n dropSwapConfig.handleParentPointerover || handeParentPointerover;\n\n const originalHandleend = dropSwapParentConfig.handleEnd;\n\n dropSwapParentConfig.handleEnd = (\n state: DragState<T> | SynthDragState<T>\n ) => {\n handleEnd(state);\n\n originalHandleend(state);\n };\n\n parentData.on(\"dragStarted\", () => {\n documentController = addEvents(document, {\n dragover: rootDragover,\n handleRootPointerover: rootPointerover,\n });\n });\n\n parentData.on(\"dragEnded\", () => {\n documentController?.abort();\n });\n\n parentData.config = dropSwapParentConfig;\n },\n };\n };\n}\n\nfunction rootDragover(_e: DragEvent) {\n if (!isDragState(state)) return;\n\n removeClass(\n [state.currentParent.el],\n state.currentParent.data.config.dropZoneParentClass\n );\n\n state.currentParent = state.initialParent;\n}\n\nfunction rootPointerover(_e: CustomEvent) {\n if (!isSynthDragState(state)) return;\n\n removeClass(\n [state.currentParent.el],\n state.currentParent.data.config.synthDropZoneParentClass\n );\n\n state.currentParent = state.initialParent;\n}\n\n/**\n * Whether the dragged nodes may be dropped into the given parent. Hovering\n * the parent the drag is currently over (or started from) is always allowed;\n * everything else must pass the core transfer rules (group/accepts/dropZone).\n */\nfunction canTransferTo<T>(\n targetParent: ParentRecord<T>,\n state: DragState<T> | SynthDragState<T>\n): boolean {\n if (targetParent.el === state.currentParent.el) return true;\n\n if (targetParent.el === state.initialParent.el) return true;\n\n return validateTransfer({\n currentParent: state.currentParent,\n targetParent,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n state,\n });\n}\n\n/**\n * Clears any hover targeting so a drop over an invalid parent is a no-op:\n * handleEnd returns early when no nodes are targeted and the current parent\n * is back to the initial one.\n */\nfunction resetDraggedOverNodes<T>(state: DragState<T> | SynthDragState<T>) {\n const config = state.currentParent.data.config;\n\n const isSynth = isSynthDragState(state);\n\n removeClass(\n dropSwapState.draggedOverNodes.map((node) => node.el),\n isSynth ? config.synthDropZoneClass : config.dropZoneClass\n );\n\n removeClass(\n [state.currentParent.el],\n isSynth ? config.synthDropZoneParentClass : config.dropZoneParentClass\n );\n\n dropSwapState.draggedOverNodes = [];\n\n state.currentTargetValue = undefined;\n\n state.currentParent = state.initialParent;\n}\n\nfunction updateDraggedOverNodes<T>(\n data: PointeroverNodeEvent<T> | NodeDragEventData<T>,\n state: DragState<T> | SynthDragState<T>\n) {\n const targetData =\n \"detail\" in data ? data.detail.targetData : data.targetData;\n\n if (!canTransferTo(targetData.parent, state)) {\n resetDraggedOverNodes(state);\n\n return;\n }\n\n const config = targetData.parent.data.config;\n\n const dropZoneClass = isSynthDragState(state)\n ? config.synthDropZoneClass\n : config.dropZoneClass;\n\n removeClass(\n dropSwapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass\n );\n\n const enabledNodes = targetData.parent.data.enabledNodes;\n\n if (!enabledNodes) return;\n\n dropSwapState.draggedOverNodes = enabledNodes.slice(\n targetData.node.data.index,\n targetData.node.data.index + state.draggedNodes.length\n );\n\n addNodeClass(\n dropSwapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass,\n true\n );\n\n state.currentTargetValue = targetData.node.data.value;\n\n state.currentParent = targetData.parent;\n\n addClass(\n state.currentParent.el,\n isSynthDragState(state)\n ? config.synthDropZoneParentClass\n : config.dropZoneParentClass,\n state.currentParent.data,\n true\n );\n}\n\nfunction handleNodeDragover<T>(\n data: NodeDragEventData<T>,\n state: DragState<T>\n) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\n\n updateDraggedOverNodes(data, state);\n}\n\nexport function handleParentDragover<T>(\n data: ParentDragEventData<T>,\n state: DragState<T>\n) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\n\n if (!canTransferTo(data.targetData.parent, state)) {\n resetDraggedOverNodes(state);\n\n return;\n }\n\n const currentConfig = state.currentParent.data.config;\n\n removeClass(\n dropSwapState.draggedOverNodes.map((node) => node.el),\n currentConfig.dropZoneClass\n );\n\n removeClass([state.currentParent.el], currentConfig.dropZoneParentClass);\n\n const config = data.targetData.parent.data.config;\n\n addClass(\n data.targetData.parent.el,\n config.dropZoneParentClass,\n data.targetData.parent.data,\n true\n );\n\n dropSwapState.draggedOverNodes = [];\n\n state.currentParent = data.targetData.parent;\n}\n\nexport function handeParentPointerover<T>(data: PointeroverParentEvent<T>) {\n if (!canTransferTo(data.detail.targetData.parent, data.detail.state)) {\n resetDraggedOverNodes(data.detail.state);\n\n return;\n }\n\n const currentConfig = data.detail.state.currentParent.data.config;\n\n removeClass(\n dropSwapState.draggedOverNodes.map((node) => node.el),\n currentConfig.synthDropZoneClass\n );\n\n removeClass(\n [data.detail.state.currentParent.el],\n currentConfig.synthDropZoneParentClass\n );\n\n const config = data.detail.targetData.parent.data.config;\n\n addClass(\n data.detail.targetData.parent.el,\n config.synthDropZoneParentClass,\n data.detail.targetData.parent.data,\n true\n );\n\n dropSwapState.draggedOverNodes = [];\n\n data.detail.state.currentParent = data.detail.targetData.parent;\n}\n\nfunction handleNodePointerover<T>(data: PointeroverNodeEvent<T>) {\n if (!isSynthDragState(data.detail.state)) return;\n\n updateDraggedOverNodes(data, data.detail.state);\n}\n\nfunction swapElements<T>(\n arr1: T[],\n arr2: T[] | null,\n index1: number | number[],\n index2: number\n): T[] | [T[], T[]] {\n const indices1 = Array.isArray(index1) ? index1 : [index1];\n\n if (arr2 === null) {\n const elementsFromArr1 = indices1.map((i) => arr1[i]);\n\n const elementFromArr2 = arr1[index2];\n\n arr1.splice(index2, 1, ...elementsFromArr1);\n\n indices1.forEach((i, idx) => {\n arr1[i] = idx === 0 ? elementFromArr2 : (undefined as unknown as T);\n });\n\n return arr1.filter((el) => el !== undefined);\n } else {\n const elementsFromArr1 = indices1.map((i) => arr1[i]);\n\n const elementFromArr2 = arr2[index2];\n\n arr2.splice(index2, 1, ...elementsFromArr1);\n\n indices1.forEach((i, idx) => {\n arr1[i] = idx === 0 ? elementFromArr2 : (undefined as unknown as T);\n });\n\n return [arr1.filter((el) => el !== undefined), arr2];\n }\n}\n\nfunction handleEnd<T>(state: DragState<T> | SynthDragState<T>) {\n const isSynth = isSynthDragState(state);\n\n removeClass(\n [state.currentParent.el],\n isSynth\n ? state.currentParent.data.config.synthDropZoneParentClass\n : state.currentParent.data.config.dropZoneParentClass\n );\n\n removeClass(\n dropSwapState.draggedOverNodes.map((node) => node.el),\n isSynth\n ? state.currentParent.data.config.synthDropZoneClass\n : state.currentParent.data.config.dropZoneClass\n );\n\n const values = parentValues(state.currentParent.el, state.currentParent.data);\n\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n const newValues = values.filter((x) => !draggedValues.includes(x));\n\n const targetIndex = dropSwapState.draggedOverNodes[0]?.data.index;\n\n const draggedIndex = state.draggedNodes[0].data.index;\n\n const initialParentValues = parentValues(\n state.initialParent.el,\n state.initialParent.data\n );\n\n if (targetIndex === undefined) {\n if (state.initialParent.el === state.currentParent.el) return;\n\n const newInitialValues = initialParentValues.filter(\n (x) => !draggedValues.includes(x)\n );\n\n setParentValues(\n state.initialParent.el,\n state.initialParent.data,\n newInitialValues\n );\n\n setParentValues(\n state.currentParent.el,\n state.currentParent.data,\n values.concat(draggedValues)\n );\n\n return;\n }\n\n let swap = false;\n\n const shouldSwap = state.initialParent.data.config.dropSwapConfig?.shouldSwap;\n\n if (shouldSwap)\n swap = shouldSwap({\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n draggedNodes: state.draggedNodes,\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord<T>[],\n state,\n });\n\n if (state.initialParent.el === state.currentParent.el) {\n newValues.splice(targetIndex, 0, ...draggedValues);\n\n setParentValues(\n state.currentParent.el,\n state.currentParent.data,\n swap ? swapElements(values, null, draggedIndex, targetIndex) : newValues\n );\n\n if (state.initialParent.data.config.onSort) {\n state.initialParent.data.config.onSort({\n parent: {\n el: state.initialParent.el,\n data: state.initialParent.data,\n } as ParentRecord<T>,\n previousValues: [...initialParentValues],\n previousNodes: [...state.initialParent.data.enabledNodes],\n nodes: [...state.initialParent.data.enabledNodes],\n values: [...newValues],\n draggedNodes: state.draggedNodes,\n previousPosition: draggedIndex,\n position: targetIndex,\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord<T>[],\n state: state as BaseDragState<T>,\n });\n }\n } else {\n if (swap) {\n const res = swapElements(\n initialParentValues,\n newValues,\n state.initialIndex,\n targetIndex\n );\n\n setParentValues(\n state.initialParent.el,\n state.initialParent.data,\n res[0] as T[]\n );\n\n setParentValues(\n state.currentParent.el,\n state.currentParent.data,\n res[1] as T[]\n );\n } else {\n const newInitialValues = initialParentValues.filter(\n (x) => !draggedValues.includes(x)\n );\n\n setParentValues(\n state.initialParent.el,\n state.initialParent.data,\n newInitialValues\n );\n\n newValues.splice(targetIndex, 0, ...draggedValues);\n\n setParentValues(\n state.currentParent.el,\n state.currentParent.data,\n newValues\n );\n }\n }\n\n if (state.currentParent.data.config.onTransfer) {\n state.currentParent.data.config.onTransfer({\n sourceParent: state.currentParent,\n targetParent: state.initialParent,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n targetIndex,\n state,\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord<T>[],\n });\n }\n\n if (state.initialParent.data.config.onTransfer) {\n state.initialParent.data.config.onTransfer({\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n targetIndex,\n state,\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord<T>[],\n });\n }\n}\n","import type {\n DNDPlugin,\n DragAndDrop,\n DragState,\n DragStateProps,\n Node,\n NodeData,\n NodeDragEventData,\n NodeEventData,\n NodePointerEventData,\n NodeRecord,\n NodeTargetData,\n NodesData,\n ParentConfig,\n ParentData,\n ParentEventData,\n ParentTargetData,\n ParentsData,\n PointeroverNodeEvent,\n PointeroverParentEvent,\n SetupNodeData,\n TearDownNodeData,\n BaseDragState,\n SynthDragState,\n SynthDragStateProps,\n ParentRecord,\n EventHandlers,\n NodeFromPoint,\n ParentFromPoint,\n ParentDragEventData,\n DragstartEventData,\n} from \"./types\";\n\nimport {\n pd,\n sp,\n on,\n emit,\n createEmitter,\n eq,\n splitClass,\n eventCoordinates,\n} from \"./utils\";\n\nexport * from \"./types\";\nexport { animations } from \"./plugins/animations\";\nexport { insert } from \"./plugins/insert\";\nexport { dropOrSwap } from \"./plugins/drop-or-swap\";\n\n/**\n * Check to see if code is running in a browser.\n */\nexport const isBrowser = typeof window !== \"undefined\";\n\n/**\n * Parents or \"lists\" are the containers that nodes or \"draggable items\" can be\n * dragged from and into.\n *\n * @type {WeakMap<HTMLElement, ParentData<unknown>>}\n */\nexport const parents: ParentsData<any> = new WeakMap<\n HTMLElement,\n ParentData<unknown>\n>();\n\n/**\n * Nodes are the draggable items and the direct descendants of the parents.\n *\n * @type {WeakMap<Node, NodeData<unknown>>}\n */\nexport const nodes: NodesData<any> = new WeakMap<Node, NodeData<unknown>>();\n\nfunction isMobilePlatform() {\n if (!isBrowser) return false;\n\n if (\"userAgentData\" in navigator) {\n return (navigator.userAgentData as { mobile: boolean }).mobile === true;\n }\n\n const ua = navigator.userAgent;\n\n const isMobileUA = /android|iphone|ipod/i.test(ua);\n\n const isIpad =\n /iPad/.test(ua) ||\n (ua.includes(\"Macintosh\") && navigator.maxTouchPoints > 1);\n\n return isMobileUA || isIpad;\n}\n\n/**\n * The base drag state.\n *\n * @type {BaseDragState<unknown>}\n */\nconst baseDragState = {\n affectedNodes: [],\n coordinates: {\n x: 0,\n y: 0,\n },\n currentTargetValue: undefined,\n on,\n emit,\n originalZIndex: undefined,\n pointerSelection: false,\n preventEnter: false,\n rootUserSelect: undefined,\n nodePointerdown: undefined,\n longPress: false,\n scrolling: false,\n longPressTimeout: undefined,\n remapJustFinished: false,\n selectedNodes: [],\n selectedParent: undefined,\n preventSynthDrag: false,\n pointerDown: undefined,\n lastScrollContainerX: null,\n lastScrollContainerY: null,\n rootScrollWidth: undefined,\n rootScrollHeight: undefined,\n dragItemRect: undefined,\n windowScrollX: undefined,\n windowScrollY: undefined,\n lastScrollDirectionX: undefined,\n lastScrollDirectionY: undefined,\n scrollDebounceTimeout: undefined,\n frameIdX: undefined,\n frameIdY: undefined,\n};\n\n/**\n * The state of the drag and drop.\n *\n * @type {BaseDragState<unknown>}\n */\nexport let state: BaseDragState<unknown> = baseDragState;\n\n/**\n * Variable to check if the drop has occurred.\n */\nlet dropped = false;\n\n/**\n * Abort controller for the document.\n */\nlet documentController: AbortController | undefined;\n\n/**\n * Timeout for the scroll.\n */\nlet scrollTimeout: ReturnType<typeof setTimeout>;\n\nexport function resetState() {\n // Clear any existing timeouts to prevent stale references\n if (state.scrollDebounceTimeout) {\n clearTimeout(state.scrollDebounceTimeout);\n }\n\n if (state.longPressTimeout) {\n clearTimeout(state.longPressTimeout);\n }\n\n // Cancel any animation frames\n if (state.frameIdX !== undefined) {\n cancelAnimationFrame(state.frameIdX);\n }\n\n if (state.frameIdY !== undefined) {\n cancelAnimationFrame(state.frameIdY);\n }\n\n const baseDragState = {\n affectedNodes: [],\n coordinates: {\n x: 0,\n y: 0,\n },\n on,\n emit,\n currentTargetValue: undefined,\n originalZIndex: undefined,\n pointerId: undefined,\n preventEnter: false,\n remapJustFinished: false,\n selectedNodes: [],\n nodePointerdown: undefined,\n rootUserSelect: undefined,\n preventSynthDrag: false,\n scrolling: false,\n selectedParent: undefined,\n pointerSelection: false,\n synthScrollDirection: undefined,\n draggedNodeDisplay: undefined,\n synthDragScrolling: false,\n longPress: false,\n pointerDown: undefined,\n longPressTimeout: undefined,\n lastScrollContainerX: null,\n lastScrollContainerY: null,\n rootScrollWidth: undefined,\n rootScrollHeight: undefined,\n dragItemRect: undefined,\n windowScrollX: undefined,\n windowScrollY: undefined,\n lastScrollDirectionX: undefined,\n lastScrollDirectionY: undefined,\n scrollDebounceTimeout: undefined,\n frameIdX: undefined,\n frameIdY: undefined,\n };\n\n state = { ...baseDragState } as BaseDragState<unknown>;\n}\n\n/**\n * @param {DragStateProps} dragStateProps - Attributes to update state with.\n *\n * @mutation - Updates state with node values.\n *\n * @returns void\n */\nexport function setDragState<T>(\n dragStateProps: (SynthDragStateProps & DragStateProps<T>) | DragStateProps<T>\n): DragState<T> | SynthDragState<T> {\n Object.assign(state, dragStateProps);\n\n dragStateProps.initialParent.data.emit(\"dragStarted\", state);\n\n dropped = false;\n\n state.emit(\"dragStarted\", state);\n\n return state as DragState<T> | SynthDragState<T>;\n}\n\n/**\n * Pointerdown events already handled by a draggable node. The node handlers\n * no longer stop propagation (so framework-delegated listeners still fire);\n * instead, ancestor nodes and the root handler skip claimed events.\n */\nconst claimedPointerdowns = new WeakSet<Event>();\n\nfunction handleRootPointerdown(e: PointerEvent) {\n if (claimedPointerdowns.has(e)) return;\n\n if (state.activeState) setActive(state.activeState.parent, undefined, state);\n\n if (state.selectedState)\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n state.selectedState = state.activeState = undefined;\n}\n\nfunction handleRootPointerup() {\n if (state.pointerDown)\n state.pointerDown.node.el.draggable =\n !state.pointerDown.parent.data.config.dragHandle;\n\n state.pointerDown = undefined;\n\n if (!isSynthDragState(state)) return;\n\n const config = state.currentParent.data.config;\n\n if (isSynthDragState(state)) config.handleEnd(state);\n}\n\n/**\n * Handles the keydown event on the root element.\n *\n * @param {KeyboardEvent} e - The keyboard event.\n */\nfunction handleRootKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n if (state.selectedState)\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n if (state.activeState)\n setActive(state.activeState.parent, undefined, state);\n\n state.selectedState = state.activeState = undefined;\n }\n}\n\nfunction handleRootDrop(_e: DragEvent) {\n if (!isDragState(state)) return;\n\n dropped = true;\n\n const handleEnd = state.initialParent.data.config.handleEnd;\n\n handleEnd(state);\n}\n\nfunction handleRootDragover(e: DragEvent) {\n if (!isDragState(state)) return;\n\n pd(e);\n\n const { x, y } = eventCoordinates(e);\n\n if (isDragState(state)) {\n handleSynthScroll({ x, y }, e, state);\n }\n}\n\nfunction handleRootPointermove(e: PointerEvent) {\n if (!state.pointerDown || !state.pointerDown.validated) return;\n\n const config = state.pointerDown.parent.data.config;\n\n if (e.pointerType === \"mouse\" && !isMobilePlatform()) {\n return;\n }\n\n if (!isSynthDragState(state)) {\n pd(e);\n\n if (config.longPress && !state.longPress) {\n clearTimeout(state.longPressTimeout);\n\n state.longPress = false;\n\n return;\n }\n\n const nodes = config.draggedNodes(state.pointerDown);\n\n config.dragstartClasses(state.pointerDown.node, nodes, config, true);\n\n const rect = state.pointerDown.node.el.getBoundingClientRect();\n\n const synthDragState = initSynthDrag(\n state.pointerDown.node,\n state.pointerDown.parent,\n e,\n state,\n nodes,\n rect\n );\n\n synthMove(e, synthDragState, true);\n } else if (isSynthDragState(state)) {\n synthMove(e, state);\n }\n}\n\nfunction handleTouchmove(e: TouchEvent) {\n if (isDragState(state) && e.cancelable) pd(e);\n}\n\nfunction handleContextmenu(e: Event) {\n if (isSynthDragState(state)) pd(e);\n}\n\n/**\n * Initializes the drag and drop functionality for a given parent.\n *\n * @param {DragAndDrop} dragAndDrop - The drag and drop configuration.\n *\n * @returns void\n */\nexport function dragAndDrop<T>({\n parent,\n getValues,\n setValues,\n config = {},\n}: DragAndDrop<T>): void {\n if (!isBrowser) return;\n\n if (!documentController) {\n documentController = addEvents(document, {\n dragover: handleRootDragover,\n pointerdown: handleRootPointerdown,\n pointerup: handleRootPointerup,\n keydown: handleRootKeydown,\n drop: handleRootDrop,\n pointermove: handleRootPointermove,\n pointercancel: nodeEventData(config.handlePointercancel),\n touchmove: handleTouchmove,\n contextmenu: handleContextmenu,\n });\n }\n\n tearDown(parent);\n\n const [emit, on] = createEmitter();\n\n const parentData: ParentData<T> = {\n getValues,\n setValues,\n config: {\n dragDropEffect: config.dragDropEffect ?? \"move\",\n dragEffectAllowed: config.dragEffectAllowed ?? \"move\",\n draggedNodes,\n dragstartClasses,\n handleNodeKeydown,\n handleDragstart,\n handleNodeDragover,\n handleParentDragover,\n handleNodeDrop,\n handleNodeFocus,\n handleNodeBlur,\n handlePointercancel,\n handleEnd,\n handleDragend,\n handleParentFocus,\n handleNodePointerup,\n handleNodePointerover,\n handleParentPointerover,\n handleParentScroll,\n handleNodePointerdown,\n handleNodeDragenter,\n handleNodeDragleave,\n handleParentDrop,\n multiDrag: config.multiDrag ?? false,\n nativeDrag: config.nativeDrag ?? true,\n performSort,\n performTransfer,\n root: config.root ?? document,\n setupNode,\n setupNodeRemap,\n reapplyDragClasses,\n tearDownNode,\n tearDownNodeRemap,\n remapFinished,\n threshold: {\n horizontal: 0,\n vertical: 0,\n },\n ...config,\n },\n enabledNodes: [],\n abortControllers: {},\n privateClasses: [],\n on,\n emit,\n };\n\n const nodesObserver = new MutationObserver(nodesMutated);\n\n nodesObserver.observe(parent, { childList: true });\n\n parents.set(parent, parentData);\n\n config.plugins?.forEach((plugin) => {\n plugin(parent)?.tearDown?.();\n });\n\n config.plugins?.forEach((plugin) => {\n plugin(parent)?.tearDown?.();\n });\n\n config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(parent)?.setup?.();\n });\n\n setup(parent, parentData);\n\n remapNodes(parent, true);\n}\n\nexport function dragStateProps<T>(\n node: NodeRecord<T>,\n parent: ParentRecord<T>,\n e: PointerEvent | DragEvent,\n draggedNodes: Array<NodeRecord<T>>,\n offsetX?: number,\n offsetY?: number\n): DragStateProps<T> {\n const { x, y } = eventCoordinates(e);\n\n const rect = node.el.getBoundingClientRect();\n\n return {\n affectedNodes: [],\n ascendingDirection: false,\n clonedDraggedEls: [],\n coordinates: {\n x,\n y,\n },\n draggedNode: {\n el: node.el,\n data: node.data,\n },\n draggedNodes,\n incomingDirection: undefined,\n initialIndex: node.data.index,\n initialParent: {\n el: parent.el,\n data: parent.data,\n },\n currentParent: {\n el: parent.el,\n data: parent.data,\n },\n longPress: parent.data.config.longPress ?? false,\n longPressTimeout: undefined,\n currentTargetValue: node.data.value,\n scrollEls: [],\n startLeft: offsetX ? offsetX : x - (rect?.left ?? 0),\n startTop: offsetY ? offsetY : y - (rect?.top ?? 0),\n targetIndex: node.data.index,\n transferred: false,\n };\n}\n\n/**\n * Perform the sort of the nodes.\n *\n * @param {ParentRecord<T>} parent - The parent record.\n * @param {Array<NodeRecord<T>>} draggedNodes - The dragged nodes.\n * @param {Array<NodeRecord<T>>} targetNodes - The target nodes.\n *\n * @returns void\n */\nexport function performSort<T>({\n parent,\n draggedNodes,\n targetNodes,\n}: {\n parent: ParentRecord<T>;\n draggedNodes: Array<NodeRecord<T>>;\n targetNodes: Array<NodeRecord<T>>;\n}) {\n remapNodes(parent.el);\n\n const draggedValues = draggedNodes.map((x) => x.data.value);\n\n const targetParentValues = parentValues(parent.el, parent.data);\n\n const originalIndex = draggedNodes[0].data.index;\n\n const enabledNodes = [...parent.data.enabledNodes];\n\n const newParentValues = [\n ...targetParentValues.filter((x) => !draggedValues.some((y) => eq(x, y))),\n ];\n newParentValues.splice(targetNodes[0].data.index, 0, ...draggedValues);\n\n if (\"draggedNode\" in state)\n state.currentTargetValue = targetNodes[0].data.value;\n\n setParentValues(parent.el, parent.data, [...newParentValues]);\n\n if (parent.data.config.onSort) {\n parent.data.config.onSort({\n parent: {\n el: parent.el,\n data: parent.data,\n } as ParentRecord<T>,\n previousValues: [...targetParentValues],\n previousNodes: [...enabledNodes],\n nodes: [...parent.data.enabledNodes],\n values: [...newParentValues],\n draggedNodes: draggedNodes,\n previousPosition: originalIndex,\n position: targetNodes[0].data.index,\n targetNodes,\n state: state as BaseDragState<T>,\n });\n }\n}\n\n/**\n * This function sets the active node as well as removing any classes or\n * attribute set.\n *\n * @param {ParentEventData} data - The parent event data.\n * @param {NodeRecord} newActiveNode - The new active node.\n * @param {BaseDragState} state - The current drag state.\n */\nfunction setActive<T>(\n parent: ParentRecord<T>,\n newActiveNode: NodeRecord<T> | undefined,\n state: BaseDragState<T>\n) {\n if (!newActiveNode) {\n state.activeState = undefined;\n\n return;\n }\n\n state.activeState = {\n node: newActiveNode,\n parent,\n };\n}\n\n/**\n * This function deselects the nodes. This will clean the prior selected state\n * as well as removing any classes or attributes set.\n *\n * @param {Array<NodeRecord<T>>} nodes - The nodes to deselect.\n * @param {ParentRecord<T>} parent - The parent record.\n * @param {BaseDragState<T>} state - The current drag state.\n */\nfunction deselect<T>(\n nodes: Array<NodeRecord<T>>,\n parent: ParentRecord<T>,\n state: BaseDragState<T>\n) {\n const selectedClass = parent.data.config.selectedClass;\n\n if (!state.selectedState) return;\n\n const iterativeNodes = Array.from(nodes);\n\n removeClass(\n nodes.map((x) => x.el),\n selectedClass\n );\n\n for (const node of iterativeNodes) {\n node.el.setAttribute(\"aria-selected\", \"false\");\n\n const index = state.selectedState.nodes.findIndex((x) => x.el === node.el);\n\n if (index === -1) continue;\n\n state.selectedState.nodes.splice(index, 1);\n }\n}\n\n/**\n * This function sets the selected nodes. This will clean the prior selected\n * state as well as removing any classes or attributes set.\n *\n * @param {ParentRecord<T>} parent - The parent record.\n * @param {Array<NodeRecord<T>>} selectedNodes - The nodes to select.\n * @param {NodeRecord<T> | undefined} newActiveNode - The new active node.\n * @param {BaseDragState<T>} state - The current drag state.\n * @param {boolean} pointerdown - Whether the pointerdown event was triggered.\n */\nfunction setSelected<T>(\n parent: ParentRecord<T>,\n selectedNodes: Array<NodeRecord<T>>,\n newActiveNode: NodeRecord<T> | undefined,\n state: BaseDragState<T>,\n pointerdown = false\n) {\n state.pointerSelection = pointerdown;\n\n for (const node of selectedNodes) {\n node.el.setAttribute(\"aria-selected\", \"true\");\n\n addNodeClass([node.el], parent.data.config.selectedClass, true);\n }\n\n state.selectedState = {\n nodes: selectedNodes,\n parent,\n };\n\n setActive(parent, newActiveNode, state);\n}\n\n/**\n * Handle the parent focus event.\n *\n * @param {ParentEventData<T>} data - The parent event data.\n * @param {BaseDragState<T> | DragState<T> | SynthDragState<T>} state - The drag state.\n *\n * @returns void\n */\nexport function handleParentFocus<T>(\n data: ParentEventData<T>,\n state: BaseDragState<T> | DragState<T> | SynthDragState<T>\n) {\n const firstEnabledNode = data.targetData.parent.data.enabledNodes[0];\n\n if (!firstEnabledNode) return;\n\n if (\n state.selectedState &&\n state.selectedState.parent.el !== data.targetData.parent.el\n ) {\n setActive(data.targetData.parent, firstEnabledNode, state);\n } else if (!state.selectedState) {\n setActive(data.targetData.parent, firstEnabledNode, state);\n }\n}\n\n/**\n * Perform the transfer of the nodes.\n *\n * @param data - The transfer data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function performTransfer<T>({\n currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n initialIndex,\n targetNodes,\n state,\n}: {\n currentParent: ParentRecord<T>;\n targetParent: ParentRecord<T>;\n initialParent: ParentRecord<T>;\n draggedNodes: Array<NodeRecord<T>>;\n initialIndex: number;\n state: BaseDragState<T> | DragState<T> | SynthDragState<T>;\n targetNodes: Array<NodeRecord<T>>;\n}) {\n remapNodes(initialParent.el);\n\n const draggedValues = draggedNodes.map((x) => x.data.value);\n\n const currentParentValues = [\n ...parentValues(currentParent.el, currentParent.data).filter(\n (x) => !draggedValues.some((y) => eq(x, y))\n ),\n ];\n\n const targetParentValues = parentValues(targetParent.el, targetParent.data);\n\n const reset =\n initialParent.el === targetParent.el &&\n targetParent.data.config.sortable === false;\n\n let targetIndex: number;\n\n if (targetNodes.length) {\n if (reset) {\n targetIndex = initialIndex;\n } else if (targetParent.data.config.sortable === false) {\n targetIndex = targetParent.data.enabledNodes.length;\n } else {\n targetIndex = targetNodes[0].data.index;\n }\n\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\n } else {\n targetIndex = reset ? initialIndex : targetParent.data.enabledNodes.length;\n\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\n }\n\n setParentValues(currentParent.el, currentParent.data, currentParentValues);\n\n setParentValues(targetParent.el, targetParent.data, targetParentValues);\n\n if (targetParent.data.config.onTransfer) {\n targetParent.data.config.onTransfer({\n sourceParent: currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n targetIndex,\n state,\n targetNodes,\n });\n }\n\n if (currentParent.data.config.onTransfer) {\n currentParent.data.config.onTransfer({\n sourceParent: currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n targetIndex,\n state,\n targetNodes: targetNodes ? targetNodes : [],\n });\n }\n}\n\n/**\n * Get the values of the parent.\n *\n * @param parent - The parent element.\n * @param parentData - The parent data.\n *\n * @returns The values of the parent.\n */\nexport function parentValues<T>(\n parent: HTMLElement,\n parentData: ParentData<T>\n): Array<T> {\n return [...parentData.getValues(parent)];\n}\n\n/**\n * Set the values of the parent.\n *\n * @param parent - The parent element.\n * @param parentData - The parent data.\n * @param values - The values to set.\n *\n * @returns void\n */\nexport function setParentValues<T>(\n parent: HTMLElement,\n parentData: ParentData<T>,\n values: Array<any>\n): void {\n parentData.setValues(values, parent);\n}\n\n/**\n * Get the values of the dragged nodes.\n *\n * @param state - The drag state.\n *\n * @returns The values of the dragged nodes.\n */\nexport function dragValues<T>(state: DragState<T>): Array<T> {\n return [...state.draggedNodes.map((x) => x.data.value)];\n}\n\n/**\n * Utility function to update parent config.\n *\n * @param parent - The parent element.\n * @param config - The config to update.\n *\n * @returns void\n */\nexport function updateConfig<T>(\n parent: HTMLElement,\n config: Partial<ParentConfig<T>>\n) {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n parents.set(parent, {\n ...parentData,\n config: { ...parentData.config, ...config },\n });\n\n dragAndDrop({\n parent,\n getValues: parentData.getValues,\n setValues: parentData.setValues,\n config,\n });\n}\n\n/**\n * Handle the parent drop event.\n *\n * @param data - The parent event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleParentDrop<T>(\n data: ParentEventData<T>,\n state: DragState<T>\n) {\n sp(data.e);\n\n dropped = true;\n\n const handleEnd = state.initialParent.data.config.handleEnd;\n\n handleEnd(state);\n}\n\n/**\n * Tear down the parent.\n *\n * @param parent - The parent element.\n *\n * @returns void\n */\nexport function tearDown(parent: HTMLElement) {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n // Cancel interaction state tied to this parent so pending timers and the\n // document-level drag handlers don't fire against unmounted elements\n // (#145).\n if (state.pointerDown?.parent.el === parent) {\n if (state.longPressTimeout) clearTimeout(state.longPressTimeout);\n\n state.pointerDown = undefined;\n }\n\n if (\n isDragState(state) &&\n (state.initialParent.el === parent || state.currentParent.el === parent)\n ) {\n if (isSynthDragState(state)) state.clonedDraggedNode?.remove();\n\n resetState();\n }\n\n if (parentData.abortControllers.mainParent)\n parentData.abortControllers.mainParent.abort();\n}\n\n/**\n * Check if the state is a drag state.\n *\n * @param state - The state to check.\n *\n * @returns Whether the state is a drag state.\n */\nexport function isDragState<T>(\n state: BaseDragState<T>\n): state is DragState<T> | SynthDragState<T> {\n return \"draggedNode\" in state && !!state.draggedNode;\n}\n\n/**\n * Check if the state is a synth drag state.\n *\n * @param state - The state to check.\n *\n * @returns Whether the state is a synth drag state.\n */\nexport function isSynthDragState<T>(\n state: BaseDragState<T>\n): state is SynthDragState<T> {\n return \"synthDragging\" in state && !!state.synthDragging;\n}\n\n/**\n * Setup the parent.\n *\n * @param parent - The parent element.\n * @param parentData - The parent data.\n *\n * @returns void\n */\nfunction setup<T>(parent: HTMLElement, parentData: ParentData<T>): void {\n parentData.abortControllers.mainParent = addEvents(parent, {\n dragover: parentEventData(parentData.config.handleParentDragover),\n handleParentPointerover: parentData.config.handleParentPointerover,\n scroll: parentEventData(parentData.config.handleParentScroll),\n drop: parentEventData(parentData.config.handleParentDrop),\n hasNestedParent: (e: CustomEvent) => {\n const parent = parents.get(e.target as HTMLElement);\n\n if (!parent) return;\n\n parent.nestedParent = e.detail.parent;\n },\n focus: parentEventData(parentData.config.handleParentFocus),\n });\n\n if (\n parentData.config.externalDragHandle &&\n parentData.config.externalDragHandle.el &&\n parentData.config.externalDragHandle.callback\n ) {\n parentData.abortControllers.externalDragHandle = addEvents(\n parentData.config.externalDragHandle.el,\n {\n pointerdown: (_e: PointerEvent) => {\n if (\n !parentData.config.externalDragHandle ||\n !parentData.config.externalDragHandle.callback\n )\n return;\n\n const draggableItem = parentData.config.externalDragHandle.callback();\n\n if (!isNode(draggableItem)) {\n console.warn(\n \"No draggable item found from external drag handle callback\"\n );\n\n return;\n }\n\n const nodeData = nodes.get(draggableItem);\n\n if (!nodeData) return;\n\n const parentNode = draggableItem.parentNode;\n\n if (!(parentNode instanceof HTMLElement)) return;\n\n const parent = parents.get(parentNode);\n\n if (!parent) return;\n\n state.pointerDown = {\n parent: {\n el: parentNode,\n data: parent,\n },\n node: {\n el: draggableItem,\n data: nodeData,\n },\n validated: true,\n };\n\n draggableItem.draggable = true;\n },\n }\n );\n }\n}\n\n/**\n * Set the attributes of the element.\n *\n * @param el - The element.\n * @param attrs - The attributes to set.\n *\n * @returns void\n */\nexport function setAttrs(el: HTMLElement, attrs: Record<string, string>) {\n for (const key in attrs) el.setAttribute(key, attrs[key]);\n}\n\n/**\n * Setup the node.\n *\n * @param data - The setup node data.\n *\n * @returns void\n */\nexport function setupNode<T>(data: SetupNodeData<T>) {\n const config = data.parent.data.config;\n\n data.node.data.abortControllers.mainNode = addEvents(data.node.el, {\n keydown: nodeEventData(config.handleNodeKeydown),\n dragstart: nodeEventData(config.handleDragstart),\n dragover: nodeEventData(config.handleNodeDragover),\n dragenter: nodeEventData(config.handleNodeDragenter),\n dragleave: nodeEventData(config.handleNodeDragleave),\n dragend: nodeEventData(config.handleDragend),\n drop: nodeEventData(config.handleNodeDrop),\n focus: nodeEventData(config.handleNodeFocus),\n blur: nodeEventData(config.handleNodeBlur),\n pointerup: nodeEventData(config.handleNodePointerup),\n pointercancel: nodeEventData(config.handlePointercancel),\n pointerdown: nodeEventData(config.handleNodePointerdown),\n handleNodePointerover: config.handleNodePointerover,\n touchmove: (e: TouchEvent) => {\n if (isDragState(state) && e.cancelable) pd(e);\n },\n contextmenu: (e: Event) => {\n if (isSynthDragState(state)) pd(e);\n },\n });\n\n // With a drag handle configured, the node only becomes draggable once a\n // pointerdown on the handle validates — otherwise draggable=\"true\" would\n // disable text selection everywhere inside the item (#139).\n data.node.el.draggable = !config.dragHandle;\n\n config.reapplyDragClasses(data.node.el, data.parent.data);\n\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent.el)?.setupNode?.(data);\n });\n}\n\n/**\n * Setup the node remap.\n *\n * @param data - The setup node data.\n *\n * @returns void\n */\nexport function setupNodeRemap<T>(data: SetupNodeData<T>) {\n nodes.set(data.node.el, data.node.data);\n\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent.el)?.setupNodeRemap?.(data);\n });\n}\n\n/**\n * Reapply the drag classes to the node.\n *\n * @param node - The node.\n * @param parentData - The parent data.\n *\n * @returns void\n */\nfunction reapplyDragClasses<T>(node: Node, parentData: ParentData<T>) {\n if (!isDragState(state)) return;\n\n const dropZoneClass = isSynthDragState(state)\n ? parentData.config.synthDropZoneClass\n : parentData.config.dropZoneClass;\n\n if (state.draggedNode.el !== node) return;\n\n addNodeClass([node], dropZoneClass, true);\n}\n\n/**\n * Tear down the node remap.\n *\n * @param data - The tear down node data.\n *\n * @returns void\n */\nexport function tearDownNodeRemap<T>(data: TearDownNodeData<T>) {\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent.el)?.tearDownNodeRemap?.(data);\n });\n}\n\n/**\n * Tear down the node.\n *\n * @param data - The tear down node data.\n *\n * @returns void\n */\nexport function tearDownNode<T>(data: TearDownNodeData<T>) {\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent.el)?.tearDownNode?.(data);\n });\n\n data.node.el.draggable = false;\n\n if (data.node.data?.abortControllers?.mainNode)\n data.node.data?.abortControllers?.mainNode.abort();\n}\n\n/**\n * Called when the nodes of a given parent element are mutated.\n *\n * @param mutationList - The list of mutations.\n *\n * @returns void\n *\n * @internal\n */\nfunction nodesMutated(mutationList: MutationRecord[]) {\n // TODO: This could be better, but using it as a way to ignore comments and text\n if (\n mutationList.length === 1 &&\n mutationList[0].addedNodes.length === 1 &&\n !(mutationList[0].addedNodes[0] instanceof HTMLElement)\n )\n return;\n\n const parentEl = mutationList[0].target;\n\n if (!(parentEl instanceof HTMLElement)) return;\n\n const parentData = parents.get(parentEl);\n\n if (!parentData) return;\n\n remapNodes(parentEl);\n}\n\n/**\n * Remaps the data of the parent element's children.\n *\n * @param parent - The parent element.\n *\n * @returns void\n *\n * @internal\n */\nexport function remapNodes<T>(parent: HTMLElement, force?: boolean) {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n parentData.privateClasses = Array.from(parent.classList);\n\n const enabledNodes: Array<Node> = [];\n\n const config = parentData.config;\n\n for (let x = 0; x < parent.children.length; x++) {\n const node = parent.children[x];\n\n if (!isNode(node) || node.id === \"dnd-dragged-node-clone\") continue;\n\n const nodeData = nodes.get(node);\n\n // Only tear down the node if we have explicitly called dragAndDrop\n if (force || !nodeData)\n config.tearDownNode({\n parent: {\n el: parent,\n data: parentData,\n },\n node: {\n el: node,\n data: nodeData,\n },\n });\n\n if (config.disabled) continue;\n\n if (!config.draggable || (config.draggable && config.draggable(node))) {\n enabledNodes.push(node);\n } else {\n // Keep the DOM attribute in sync so elements excluded by the\n // draggable callback cannot start native drags (#96).\n node.draggable = false;\n }\n }\n\n const values = parentData.getValues(parent);\n\n if (enabledNodes.length !== values.length && !config.disabled) {\n console.warn(\n `The number of draggable items (${enabledNodes.length}) defined in the parent element does not match the number of values (${values.length}). This may cause unexpected behavior.`\n );\n\n return;\n }\n\n const enabledNodeRecords: Array<NodeRecord<T>> = [];\n\n // During an active drag the DOM can lag behind the values array, because\n // framework renders are asynchronous (React especially, #169). Pairing\n // values to nodes positionally would then reassign node identities —\n // attaching the wrong value/index to elements and corrupting every\n // subsequent sort. While dragging, pair each known node to its existing\n // value instead and derive its index from the values array. Falls back to\n // positional pairing whenever existing node values can't be matched 1:1\n // onto the current values (initial setup, transfers committing, replaced\n // arrays).\n let identityIndexes: Array<number> | null = null;\n\n if (isDragState(state)) {\n identityIndexes = [];\n\n const consumed = new Array(values.length).fill(false);\n\n for (let x = 0; x < enabledNodes.length; x++) {\n const prevNodeData = nodes.get(enabledNodes[x]);\n\n let found = -1;\n\n if (prevNodeData) {\n for (let i = 0; i < values.length; i++) {\n if (!consumed[i] && eq(values[i], prevNodeData.value)) {\n found = i;\n\n break;\n }\n }\n }\n\n if (found === -1) {\n identityIndexes = null;\n\n break;\n }\n\n consumed[found] = true;\n\n identityIndexes.push(found);\n }\n }\n\n for (let x = 0; x < enabledNodes.length; x++) {\n const node = enabledNodes[x];\n\n const prevNodeData = nodes.get(node);\n\n const valueIndex = identityIndexes ? identityIndexes[x] : x;\n\n if (config.draggableValue && !config.draggableValue(values[valueIndex]))\n continue;\n\n const nodeData = Object.assign(\n prevNodeData ?? {\n privateClasses: [],\n abortControllers: {},\n },\n {\n value: values[valueIndex],\n index: valueIndex,\n }\n );\n\n if (\n !isDragState(state) &&\n state.activeState &&\n eq(state.activeState.node.data.value, nodeData.value)\n ) {\n setActive(\n {\n data: parentData,\n el: parent,\n },\n {\n el: node,\n data: nodeData,\n },\n state\n );\n }\n\n if (\n isDragState(state) &&\n eq(state.draggedNode.data.value, nodeData.value)\n ) {\n state.draggedNode.data = nodeData;\n\n state.draggedNode.el = node;\n\n const draggedNode = state.draggedNodes.find(\n (x) => x.data.value === nodeData.value\n );\n\n if (draggedNode) draggedNode.el = node;\n }\n\n enabledNodeRecords.push({\n el: node,\n data: nodeData,\n });\n\n if (force || !prevNodeData)\n config.setupNode({\n parent: {\n el: parent,\n data: parentData,\n },\n node: {\n el: node,\n data: nodeData,\n },\n });\n\n setupNodeRemap({\n parent: {\n el: parent,\n data: parentData,\n },\n node: {\n el: node,\n data: nodeData,\n },\n });\n }\n\n parents.set(parent, { ...parentData, enabledNodes: enabledNodeRecords });\n\n config.remapFinished(parentData);\n\n parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(parent)?.remapFinished?.();\n });\n}\n\n/**\n * Set the remap just finished flag.\n *\n * @returns void\n */\nexport function remapFinished() {\n state.remapJustFinished = true;\n\n if (\"draggedNode\" in state) state.affectedNodes = [];\n}\n\n/**\n * Validate the drag start.\n *\n * @param data - The node event data.\n *\n * @returns Whether the drag start is valid.\n */\nexport function validateDragstart(data: NodeEventData<any>): boolean {\n return !!data.targetData.parent.data.config.nativeDrag;\n}\n\n/**\n * Get the dragged nodes.\n *\n * @param pointerDown - The pointer down data.\n *\n * @returns The dragged nodes.\n */\nfunction draggedNodes<T>(pointerDown: {\n parent: ParentRecord<T>;\n node: NodeRecord<T>;\n}): Array<NodeRecord<T>> {\n if (!pointerDown.parent.data.config.multiDrag) {\n return [pointerDown.node];\n } else if (state.selectedState) {\n return [\n pointerDown.node,\n ...(state.selectedState?.nodes.filter(\n (x) => x.el !== pointerDown.node.el\n ) as Array<NodeRecord<T>>),\n ];\n }\n\n return [];\n}\n\n/**\n * Handle the parent scroll.\n *\n * @param data - The parent event data.\n *\n * @returns void\n */\nfunction handleParentScroll<T>(_data: ParentEventData<T>) {\n if (!isDragState(state)) return;\n\n state.emit(\"scrollStarted\", state);\n\n if (isSynthDragState(state)) return;\n\n state.preventEnter = true;\n\n if (scrollTimeout) clearTimeout(scrollTimeout);\n\n scrollTimeout = setTimeout(() => {\n state.preventEnter = false;\n\n state.emit(\"scrollEnded\", state);\n }, 100);\n}\n\n/**\n * Responsible for assigning dragstart classes to the dragged nodes.\n */\nexport function handleDragstart<T>(\n data: NodeDragEventData<T>,\n state: BaseDragState<T>\n) {\n const config = data.targetData.parent.data.config;\n\n // Native dragstart fires on the draggable node itself, so a handle inside\n // a shadow root is never part of this event's path. Reuse the validation\n // performed on pointerdown (whose composed path does include the handle)\n // when it refers to the same node; fall back to validating this event\n // directly (e.g. Safari, where pointerdown may not have fired).\n const validated =\n state.pointerDown && state.pointerDown.node.el === data.targetData.node.el\n ? state.pointerDown.validated\n : validateDragHandle({\n e: data.e,\n node: data.targetData.node,\n config,\n });\n\n if (!config.nativeDrag || !validateDragstart(data) || !validated) {\n pd(data.e);\n\n return;\n }\n\n let nodes = config.draggedNodes({\n parent: data.targetData.parent,\n node: data.targetData.node,\n });\n\n // On Safari, pointerdown can sometimes not fire before the dragstart event.\n if (nodes.length === 0) {\n nodes = [data.targetData.node];\n }\n\n config.dragstartClasses(data.targetData.node, nodes, config);\n\n const dragState = initDrag(data, nodes);\n\n if (config.onDragstart) {\n const dragstartData: DragstartEventData<T> = {\n parent: data.targetData.parent,\n values: parentValues(\n data.targetData.parent.el,\n data.targetData.parent.data\n ),\n draggedNode: dragState.draggedNode,\n draggedNodes: dragState.draggedNodes,\n position: dragState.initialIndex,\n state: dragState,\n };\n config.onDragstart(dragstartData);\n }\n}\n\nexport function handleNodePointerdown<T>(\n data: NodePointerEventData<T>,\n state: BaseDragState<T>\n) {\n // Claim the event for the innermost draggable node instead of stopping\n // propagation: frameworks like React attach delegated listeners at the\n // root, which stopPropagation silenced entirely (consumer onPointerDown\n // handlers inside items never fired). Ancestor nodes and the root\n // pointerdown handler skip events already claimed here.\n if (claimedPointerdowns.has(data.e)) return;\n\n claimedPointerdowns.add(data.e);\n\n state.pointerDown = {\n parent: data.targetData.parent,\n node: data.targetData.node,\n validated: false,\n };\n\n if (\n !validateDragHandle({\n e: data.e,\n node: data.targetData.node,\n config: data.targetData.parent.data.config,\n })\n )\n return;\n\n state.pointerDown.validated = true;\n\n // The pointer is on the drag handle: enable native dragging for the\n // imminent dragstart (#139).\n if (data.targetData.parent.data.config.dragHandle)\n data.targetData.node.el.draggable = true;\n\n handleLongPress(data, state, data.targetData.node);\n\n const parentData = data.targetData.parent.data;\n\n let selectedNodes = [data.targetData.node];\n\n const commandKey = data.e.ctrlKey || data.e.metaKey;\n\n const shiftKey = data.e.shiftKey;\n\n const targetNode = data.targetData.node;\n\n if (commandKey && parentData.config.multiDrag) {\n if (state.selectedState) {\n const idx = state.selectedState.nodes.findIndex(\n (x) => x.el === targetNode.el\n );\n\n if (idx === -1) {\n selectedNodes = [...state.selectedState.nodes, targetNode];\n } else {\n selectedNodes = state.selectedState.nodes.filter(\n (x) => x.el !== targetNode.el\n );\n }\n } else {\n selectedNodes = [targetNode];\n }\n\n setSelected(\n data.targetData.parent,\n selectedNodes,\n data.targetData.node,\n state,\n true\n );\n\n return;\n }\n\n if (shiftKey && parentData.config.multiDrag) {\n const nodes = data.targetData.parent.data.enabledNodes;\n\n if (state.selectedState && state.activeState) {\n if (state.selectedState.parent.el !== data.targetData.parent.el) {\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n state.selectedState = undefined;\n\n for (let x = 0; x <= targetNode.data.index; x++)\n selectedNodes.push(nodes[x]);\n } else {\n const [minIndex, maxIndex] =\n state.activeState.node.data.index < data.targetData.node.data.index\n ? [\n state.activeState.node.data.index,\n data.targetData.node.data.index,\n ]\n : [\n data.targetData.node.data.index,\n state.activeState.node.data.index,\n ];\n\n selectedNodes = nodes.slice(minIndex, maxIndex + 1);\n }\n } else {\n for (let x = 0; x <= targetNode.data.index; x++)\n selectedNodes.push(nodes[x]);\n }\n\n setSelected(\n data.targetData.parent,\n selectedNodes,\n data.targetData.node,\n state,\n true\n );\n\n return;\n }\n\n if (state.selectedState?.nodes?.length) {\n const idx = state.selectedState.nodes.findIndex(\n (x) => x.el === data.targetData.node.el\n );\n\n if (idx === -1) {\n if (state.selectedState.parent.el !== data.targetData.parent.el) {\n deselect(state.selectedState.nodes, data.targetData.parent, state);\n } else if (parentData.config.multiDrag && isMobilePlatform()) {\n selectedNodes.push(...state.selectedState.nodes);\n } else {\n deselect(state.selectedState.nodes, data.targetData.parent, state);\n }\n\n setSelected(\n data.targetData.parent,\n selectedNodes,\n data.targetData.node,\n state,\n true\n );\n }\n } else {\n setSelected(\n data.targetData.parent,\n [data.targetData.node],\n data.targetData.node,\n state,\n true\n );\n }\n}\n\n/**\n * Add dragstart classes to the nodes.\n *\n * @param node - The node.\n * @param nodes - The nodes.\n * @param config - The parent config.\n * @param isSynth - Whether the drag is synthetic.\n *\n * @returns void\n */\nexport function dragstartClasses<T>(\n _node: NodeRecord<T>,\n nodes: Array<NodeRecord<T>>,\n config: ParentConfig<T>,\n isSynth = false\n) {\n addNodeClass(\n nodes.map((x) => x.el),\n isSynth ? config.synthDraggingClass : config.draggingClass\n );\n\n setTimeout(() => {\n removeClass(\n nodes.map((x) => x.el),\n isSynth ? config.synthDraggingClass : config.draggingClass\n );\n\n addNodeClass(\n nodes.map((x) => x.el),\n isSynth ? config.synthDragPlaceholderClass : config.dragPlaceholderClass\n );\n\n addNodeClass(\n nodes.map((x) => x.el),\n isSynth ? config.synthDropZoneClass : config.dropZoneClass\n );\n\n removeClass(\n nodes.map((x) => x.el),\n config.selectedClass\n );\n });\n}\n\nexport function initDrag<T>(\n data: NodeDragEventData<T>,\n draggedNodes: Array<NodeRecord<T>>\n): DragState<T> {\n sp(data.e);\n\n const dragState = setDragState(\n dragStateProps(\n data.targetData.node,\n data.targetData.parent,\n data.e,\n draggedNodes\n )\n );\n\n if (data.e.dataTransfer) {\n const config = data.targetData.parent.data.config;\n\n data.e.dataTransfer.dropEffect = config.dragDropEffect;\n data.e.dataTransfer.effectAllowed = config.dragEffectAllowed;\n\n let dragImage: HTMLElement | undefined;\n\n data.e.dataTransfer.setData(\"text/plain\", \"\");\n\n if (config.dragImage) {\n dragImage = config.dragImage(data, draggedNodes);\n } else {\n if (!config.multiDrag || draggedNodes.length === 1) {\n // Capture the original inline z-index before elevating the node so\n // handleEnd restores the user's value instead of the temporary 9999.\n dragState.originalZIndex = data.targetData.node.el.style.zIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n data.targetData.node.el.style.boxSizing = \"border-box\";\n\n data.e.dataTransfer.setDragImage(\n data.targetData.node.el,\n data.e.offsetX,\n data.e.offsetY\n );\n\n return dragState;\n } else {\n const wrapper = document.createElement(\"div\");\n\n wrapper.setAttribute(\"id\", \"dnd-dragged-node-clone\");\n\n wrapper.setAttribute(\"popover\", \"manual\");\n\n for (const node of draggedNodes) {\n const clone = node.el.cloneNode(true) as HTMLElement;\n\n clone.id = node.el.id + \"-clone\";\n\n clone.style.pointerEvents = \"none\";\n\n wrapper.appendChild(clone);\n }\n\n const { width } = draggedNodes[0].el.getBoundingClientRect();\n\n Object.assign(wrapper.style, {\n display: \"flex\",\n flexDirection: \"column\",\n width: `${width}px`,\n position: \"absolute\",\n pointerEvents: \"none\",\n zIndex: \"9999\",\n left: \"-9999px\",\n boxSizing: \"border-box\",\n background: \"transparent\",\n overflow: \"hidden\",\n });\n\n data.targetData.parent.el.appendChild(wrapper);\n\n // showPopover throws on disconnected elements (e.g. the parent was\n // unmounted mid-interaction, #145).\n if (wrapper.isConnected) wrapper.showPopover();\n\n wrapper.getBoundingClientRect(); // ← forces layout\n\n dragImage = wrapper;\n\n data.e.dataTransfer.setDragImage(\n dragImage,\n data.e.offsetX,\n data.e.offsetY\n );\n }\n }\n\n setTimeout(() => {\n dragImage?.remove();\n });\n }\n\n return dragState;\n}\n\nexport function validateDragHandle<T>({\n e,\n node,\n config,\n}: {\n e: PointerEvent | DragEvent;\n node: NodeRecord<T>;\n config: ParentConfig<T>;\n}): boolean {\n if (config.externalDragHandle) return false;\n\n if (!config.dragHandle) return true;\n\n // Events that originate inside a shadow root are retargeted to the host\n // element, so querySelectorAll/elementFromPoint can never see the handle.\n // composedPath() exposes the real path; only elements between the event\n // origin and the draggable node itself can count as the node's handle.\n const path = e.composedPath();\n\n const nodeIndex = path.indexOf(node.el);\n\n for (const target of nodeIndex === -1 ? [] : path.slice(0, nodeIndex)) {\n if (target instanceof Element && target.matches(config.dragHandle))\n return true;\n }\n\n // Fallback for events that fire on the draggable node itself (native\n // dragstart targets the draggable element, not the handle): hit-test the\n // handle from the event coordinates.\n const dragHandles = node.el.querySelectorAll(config.dragHandle);\n\n const elFromPoint = config.root.elementFromPoint(e.clientX, e.clientY);\n\n if (!elFromPoint) return false;\n\n for (const handle of Array.from(dragHandles))\n if (elFromPoint === handle || handle.contains(elFromPoint)) return true;\n\n return false;\n}\n\nexport function handleClickNode<T>(_data: NodeEventData<T>) {}\n\nexport function handleClickParent<T>(_data: ParentEventData<T>) {}\n\nexport function handleNodeKeydown<T>(_data: NodeEventData<T>) {}\n\n/**\n * Prevent the sort on scroll.\n *\n * @returns A function to prevent the sort on scroll.\n */\nexport function preventSortOnScroll() {\n let scrollTimeout: ReturnType<typeof setTimeout>;\n\n return () => {\n clearTimeout(scrollTimeout);\n\n if (state) state.preventEnter = true;\n\n scrollTimeout = setTimeout(() => {\n if (state) state.preventEnter = false;\n }, 100);\n };\n}\n\n/**\n * Handle the node pointer over.\n *\n * @param e - The node pointer over event.\n *\n * @returns void\n */\nexport function handleNodePointerover<T>(e: PointeroverNodeEvent<T>) {\n if (e.detail.targetData.parent.el === e.detail.state.currentParent.el)\n sort(e.detail, e.detail.state);\n else transfer(e.detail, e.detail.state);\n}\n\n/**\n * Handle the node drop.\n *\n * @param data - The node drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleNodeDrop<T>(\n data: NodeDragEventData<T>,\n state: DragState<T> | SynthDragState<T>\n) {\n const config = data.targetData.parent.data.config;\n\n if (!config.nativeDrag) return;\n\n sp(data.e);\n\n dropped = true;\n\n config.handleEnd(state);\n}\n\nexport function handleNodeFocus<T>(data: NodeEventData<T>) {\n if (data.e.target === data.e.currentTarget) return;\n\n if (state.pointerDown) state.pointerDown.node.el.draggable = false;\n}\n\nexport function handleNodeBlur<T>(data: NodeEventData<T>) {\n if (data.e.target === data.e.currentTarget) return;\n\n if (state.pointerDown)\n state.pointerDown.node.el.draggable =\n !state.pointerDown.parent.data.config.dragHandle;\n}\n\n/**\n * Handle the drag end.\n *\n * @param data - The node drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleDragend<T>(\n data: NodeDragEventData<T>,\n state: DragState<T>\n) {\n const config = data.targetData.parent.data.config;\n\n if (!config.nativeDrag) return;\n\n pd(data.e);\n\n sp(data.e);\n\n if (dropped) {\n dropped = false;\n\n return;\n }\n\n config.handleEnd(state);\n}\n\n/**\n * Handle the pointer cancel.\n *\n * @param data - The node event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handlePointercancel<T>(\n data: NodeEventData<T>,\n state: DragState<T> | SynthDragState<T> | BaseDragState<T>\n) {\n if (!isSynthDragState(state)) return;\n\n pd(data.e);\n\n if (dropped) {\n dropped = false;\n\n return;\n }\n\n const config = parents.get(state.initialParent.el)?.config;\n\n if (config?.onDragend) {\n config.onDragend({\n parent: state.currentParent,\n values: parentValues(state.currentParent.el, state.currentParent.data),\n draggedNode: state.draggedNode,\n draggedNodes: state.draggedNodes,\n state,\n });\n }\n\n config?.handleEnd(state);\n}\n\n/**\n * Handle the drag end.\n *\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleEnd<T>(state: DragState<T> | SynthDragState<T>) {\n if (state.draggedNode)\n state.draggedNode.el.draggable =\n !state.currentParent.data.config.dragHandle;\n\n // --- Capture necessary data BEFORE resetState might affect it ---\n const nodesToClean = state.draggedNodes.map((x) => x.el);\n const initialParentData = state.initialParent.data;\n const isSynth = isSynthDragState(state);\n const config = parents.get(state.initialParent.el)?.config;\n const dropZoneClass = isSynth\n ? config?.synthDropZoneClass\n : config?.dropZoneClass;\n const longPressClass = initialParentData?.config?.longPressClass;\n const placeholderClass = isSynth\n ? initialParentData?.config?.synthDragPlaceholderClass // Corrected potential typo: used initialParentData\n : initialParentData?.config?.dragPlaceholderClass;\n const originalZIndex = state.originalZIndex;\n // --- End data capture ---\n\n if (isSynthDragState(state)) {\n // Ensure cloned node removal happens reasonably quickly\n if (state.clonedDraggedNode) {\n // Check if it exists\n state.clonedDraggedNode.remove();\n }\n if (state.longPressTimeout) {\n // Check if timeout exists\n clearTimeout(state.longPressTimeout);\n }\n }\n\n // Ensure scrolling is properly cancelled (needs state, do before reset)\n cancelSynthScroll(state);\n\n // Clear any lingering scroll directions and timeouts (needs state, do before reset)\n state.lastScrollDirectionX = undefined;\n state.lastScrollDirectionY = undefined;\n state.preventEnter = false;\n if (state.scrollDebounceTimeout) {\n clearTimeout(state.scrollDebounceTimeout);\n state.scrollDebounceTimeout = undefined; // Ensure it's marked as cleared\n }\n\n // Apply z-index change synchronously if needed\n if (originalZIndex !== undefined && state.draggedNode) {\n state.draggedNode.el.style.zIndex = originalZIndex;\n }\n\n // Use single rAF with captured data for class removal\n requestAnimationFrame(() => {\n // Use the captured data, not the potentially reset global state\n removeClass(nodesToClean, dropZoneClass);\n removeClass(nodesToClean, longPressClass);\n removeClass(nodesToClean, placeholderClass);\n });\n\n // Deselect and reset active state (needs state, do before reset)\n deselect(state.draggedNodes, state.currentParent, state);\n setActive(state.currentParent, undefined, state);\n\n // Prepare data for callback/event *before* resetState\n const finalStateForCallback = { ...state }; // Shallow copy for safety\n\n // Call onDragend callback *before* resetState\n config?.onDragend?.({\n parent: finalStateForCallback.currentParent,\n values: parentValues(\n finalStateForCallback.currentParent.el,\n finalStateForCallback.currentParent.data\n ),\n draggedNode: finalStateForCallback.draggedNode,\n draggedNodes: finalStateForCallback.draggedNodes,\n state: finalStateForCallback,\n });\n\n // Emit event *before* resetState\n state.emit(\"dragEnded\", finalStateForCallback); // Emit with the final state representation\n\n // Reset global state LAST\n resetState();\n\n // No need to set state.selectedState = undefined; resetState handles it.\n}\n\n/**\n * Handle the node pointer up.\n *\n * @param data - The node pointer event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleNodePointerup<T>(\n data: NodePointerEventData<T>,\n state: DragState<T> | SynthDragState<T> | BaseDragState<T>\n) {\n sp(data.e);\n\n if (!state.pointerSelection && state.selectedState)\n deselect(state.selectedState.nodes, data.targetData.parent, state);\n\n const config = data.targetData.parent.data.config;\n\n state.pointerSelection = false;\n\n if (\"longPressTimeout\" in state && state.longPressTimeout)\n clearTimeout(state.longPressTimeout);\n\n state.longPress = false;\n\n removeClass(\n data.targetData.parent.data.enabledNodes.map((x) => x.el),\n config.longPressClass\n );\n\n // This handler stops propagation, so handleRootPointerup never sees\n // releases over a node — disarm handle-gated dragging here (#139).\n // pointerDown itself stays set: the focus/blur handlers rely on it to\n // manage draggable while editing inner inputs (#142).\n if (state.pointerDown && state.pointerDown.parent.data.config.dragHandle)\n state.pointerDown.node.el.draggable = false;\n\n if (!isDragState(state)) return;\n\n config.handleEnd(state as DragState<T> | SynthDragState<T>);\n}\n\n/**\n * Initialize the synth drag.\n *\n * @param node - The node.\n * @param parent - The parent.\n * @param e - The pointer event.\n * @param _state - The drag state.\n * @param draggedNodes - The dragged nodes.\n * @param rect - The bounding rect of the original element\n *\n * @returns The synth drag state.\n */\nfunction initSynthDrag<T>(\n node: NodeRecord<T>,\n parent: ParentRecord<T>,\n e: PointerEvent,\n _state: BaseDragState<T>,\n draggedNodes: Array<NodeRecord<T>>,\n rect: DOMRect\n): SynthDragState<T> {\n const config = parent.data.config;\n\n let dragImage: HTMLElement;\n\n let result:\n | { dragImage: HTMLElement; offsetX?: number; offsetY?: number }\n | undefined;\n\n const criticalStyleProps = [\n \"display\",\n \"flexDirection\",\n \"alignItems\",\n \"justifyContent\",\n \"padding\",\n \"paddingTop\",\n \"margin\",\n \"marginTop\",\n \"marginBottom\",\n \"marginLeft\",\n \"marginRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"paddingRight\",\n \"border\",\n \"borderRadius\",\n \"background\",\n \"backgroundColor\",\n \"boxShadow\",\n \"font\",\n \"color\",\n \"lineHeight\",\n \"gap\",\n \"width\",\n \"height\",\n \"boxSizing\",\n \"overflow\",\n ] as const;\n\n const copyCriticalStyles = (src: HTMLElement, dest: HTMLElement) => {\n const computed = window.getComputedStyle(src);\n criticalStyleProps.forEach((prop) => {\n dest.style[prop] = computed[prop]!;\n });\n };\n\n // Helper to style the drag image\n const applyBaseStyles = (\n el: HTMLElement,\n extraStyles: Partial<CSSStyleDeclaration> = {}\n ) => {\n Object.assign(el.style, {\n position: \"absolute\",\n zIndex: \"9999\",\n pointerEvents: \"none\",\n willChange: \"transform\",\n boxSizing: \"border-box\",\n opacity: \"0\",\n overflow: \"hidden\",\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n ...extraStyles,\n });\n };\n\n // Custom drag image\n if (config.synthDragImage) {\n result = config.synthDragImage(node, parent, e, draggedNodes);\n dragImage = result.dragImage;\n dragImage.setAttribute(\"popover\", \"manual\");\n applyBaseStyles(dragImage);\n }\n\n // Single drag\n else if (!config.multiDrag || draggedNodes.length === 1) {\n dragImage = node.el.cloneNode(true) as HTMLElement;\n copyCriticalStyles(node.el as HTMLElement, dragImage);\n dragImage.setAttribute(\"popover\", \"manual\");\n applyBaseStyles(dragImage);\n }\n\n // Multi-drag\n else {\n const wrapper = document.createElement(\"div\");\n\n wrapper.setAttribute(\"popover\", \"manual\");\n\n draggedNodes.forEach((dragged) => {\n const clone = dragged.el.cloneNode(true) as HTMLElement;\n\n copyCriticalStyles(dragged.el as HTMLElement, clone);\n\n clone.style.pointerEvents = \"none\";\n\n clone.style.margin = \"0\";\n\n wrapper.append(clone);\n });\n\n wrapper.style.display = \"flex\";\n wrapper.style.flexDirection = \"column\";\n wrapper.style.padding = \"0\";\n wrapper.style.margin = \"0\";\n wrapper.style.position = \"absolute\";\n wrapper.style.zIndex = \"9999\";\n wrapper.style.pointerEvents = \"none\";\n\n dragImage = wrapper;\n }\n\n dragImage.id = \"dnd-dragged-node-clone\";\n\n parent.el.appendChild(dragImage);\n\n // showPopover throws on disconnected elements (e.g. the parent was\n // unmounted mid-interaction, #145).\n if (dragImage.isConnected) dragImage.showPopover();\n\n const synthDragStateProps = {\n clonedDraggedEls: [],\n clonedDraggedNode: dragImage,\n synthDragScrolling: false,\n synthDragging: true,\n rootScrollWidth: document.scrollingElement?.scrollWidth,\n rootScrollHeight: document.scrollingElement?.scrollHeight,\n };\n\n const synthDragState = setDragState({\n ...dragStateProps(\n node,\n parent,\n e,\n draggedNodes,\n result?.offsetX,\n result?.offsetY\n ),\n ...synthDragStateProps,\n }) as SynthDragState<T>;\n\n return synthDragState;\n}\n\n/**\n * Handle the long press.\n *\n * @param data - The node pointer event data.\n * @param state - The drag state.\n * @param node - The node.\n *\n * @returns void\n */\nexport function handleLongPress<T>(\n data: NodePointerEventData<T>,\n state: BaseDragState<T>,\n node: NodeRecord<T>\n) {\n const config = data.targetData.parent.data.config;\n\n // Long press is opt-in. Without it, a press-and-hold is simply a pointer\n // that has not moved yet — scheduling the timeout anyway mutated drag state\n // and preventDefault-ed a stale event one second into every touch hold.\n if (!config.longPress) return;\n\n state.longPressTimeout = setTimeout(() => {\n if (!state) return;\n\n state.longPress = true;\n\n if (config.longPressClass && data.e.cancelable)\n addNodeClass([node.el], config.longPressClass);\n\n pd(data.e);\n }, config.longPressDuration || 1000);\n}\n\nfunction cancelSynthScroll<T>(\n state: DragState<T>,\n cancelX = true,\n cancelY = true\n) {\n if (cancelX) {\n if (state.frameIdX !== undefined) {\n cancelAnimationFrame(state.frameIdX);\n state.frameIdX = undefined;\n }\n state.lastScrollDirectionX = undefined;\n }\n\n if (cancelY) {\n if (state.frameIdY !== undefined) {\n cancelAnimationFrame(state.frameIdY);\n state.frameIdY = undefined;\n }\n state.lastScrollDirectionY = undefined;\n }\n\n if (!state.frameIdX && !state.frameIdY) {\n state.preventEnter = false;\n }\n}\n\nfunction moveNode<T>(state: SynthDragState<T>, justStarted = false) {\n const { x, y } = state.coordinates;\n\n const startLeft = state.startLeft ?? 0;\n const startTop = state.startTop ?? 0;\n\n const currentScrollX = window.scrollX ?? 0;\n const currentScrollY = window.scrollY ?? 0;\n\n const translateX = x - startLeft + currentScrollX;\n const translateY = y - startTop + currentScrollY;\n\n state.clonedDraggedNode.style.transform = `translate3d(${translateX}px, ${translateY}px, 0px)`;\n\n if (justStarted) {\n state.clonedDraggedNode.style.opacity = \"1\";\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n state.initialParent.data.config?.longPressClass\n );\n }\n}\n\nexport function synthMove<T>(\n e: PointerEvent,\n state: SynthDragState<T>,\n justStarted = false\n) {\n const coordinates = eventCoordinates(e);\n state.coordinates.x = coordinates.x;\n state.coordinates.y = coordinates.y;\n\n moveNode(state, justStarted); // Pass only state now\n\n // Clear any existing timeout to avoid multiple concurrent timeouts\n if (state.scrollDebounceTimeout) {\n clearTimeout(state.scrollDebounceTimeout);\n state.scrollDebounceTimeout = undefined;\n }\n\n // Only set a new timeout if we're still in a valid drag state\n state.scrollDebounceTimeout = setTimeout(() => {\n // Only process if the drag state is still active\n if (isSynthDragState(state)) {\n handleSynthScroll(state.coordinates, e, state);\n }\n }, 16); // ~1 frame (60fps)\n\n const elFromPoint = getElFromPoint(coordinates);\n\n if (!elFromPoint) {\n document.dispatchEvent(\n new CustomEvent(\"handleRootPointerover\", {\n detail: {\n e,\n state,\n },\n })\n );\n\n return;\n }\n\n const pointerMoveEventData = {\n e,\n targetData: elFromPoint,\n state,\n };\n\n if (\"node\" in elFromPoint) {\n elFromPoint.node.el.dispatchEvent(\n new CustomEvent(\"handleNodePointerover\", {\n detail: pointerMoveEventData,\n })\n );\n } else {\n elFromPoint.parent.el.dispatchEvent(\n new CustomEvent(\"handleParentPointerover\", {\n detail: pointerMoveEventData,\n })\n );\n }\n}\n\n/**\n * Handle the node drag over.\n *\n * @param data - The node drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleNodeDragover<T>(\n data: NodeDragEventData<T>,\n state: DragState<T>\n) {\n const config = data.targetData.parent.data.config;\n\n if (!config.nativeDrag) return;\n\n const { x, y } = eventCoordinates(data.e);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n pd(data.e);\n\n sp(data.e);\n\n if (isDragState(state)) {\n handleSynthScroll({ x, y }, data.e, state);\n }\n\n data.targetData.parent.el === state.currentParent?.el\n ? sort(data, state)\n : transfer(data, state);\n}\n\n/**\n * Handle the parent drag over.\n *\n * @param data - The parent drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleParentDragover<T>(\n data: ParentDragEventData<T>,\n state: DragState<T>\n) {\n const config = data.targetData.parent.data.config;\n\n if (!config.nativeDrag) return;\n\n pd(data.e);\n\n sp(data.e);\n\n const { x, y } = eventCoordinates(data.e);\n\n if (isDragState(state)) {\n handleSynthScroll({ x, y }, data.e, state);\n }\n\n transfer(data, state);\n}\n\n/**\n * Handle the parent pointer over.\n *\n * @param e - The parent pointer over event.\n *\n * @returns void\n */\nexport function handleParentPointerover<T>(e: PointeroverParentEvent<T>) {\n if (e.detail.targetData.parent.el !== e.detail.state.currentParent.el)\n transfer(e.detail, e.detail.state);\n}\n\n/**\n * Validate the transfer.\n *\n * @param data - The transfer data.\n *\n * @returns Whether the transfer is valid.\n */\nexport function validateTransfer<T>({\n currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n state,\n}: {\n currentParent: ParentRecord<T>;\n targetParent: ParentRecord<T>;\n initialParent: ParentRecord<T>;\n draggedNodes: Array<NodeRecord<T>>;\n state: BaseDragState<T>;\n}) {\n // A `dragover` can fire when there is no valid target/current parent (e.g.\n // hovering the source list of a transfer setup). Without this guard the\n // first `targetParent.el` access throws an uncaught TypeError and breaks the\n // drag interaction. No valid parent means the transfer is simply not valid.\n if (!targetParent || !currentParent) return false;\n\n if (targetParent.el === currentParent.el) return false;\n\n const targetConfig = targetParent.data.config;\n\n if (draggedNodes[0].el.contains(targetParent.el)) return false;\n\n if (targetConfig.dropZone === false) return false;\n\n const initialParentConfig = initialParent.data.config;\n\n if (targetConfig.accepts) {\n return targetConfig.accepts(\n targetParent,\n initialParent,\n currentParent,\n state\n );\n } else if (\n !targetConfig.group ||\n targetConfig.group !== initialParentConfig.group\n ) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Handle the node drag enter.\n *\n * @param data - The node drag event data.\n * @param _state - The drag state.\n *\n * @returns void\n */\nfunction handleNodeDragenter<T>(\n data: NodeDragEventData<T>,\n _state: DragState<T>\n) {\n pd(data.e);\n}\n\n/**\n * Handle the node drag leave.\n *\n * @param data - The node drag event data.\n * @param _state - The drag state.\n *\n * @returns void\n */\nfunction handleNodeDragleave<T>(\n data: NodeDragEventData<T>,\n _state: DragState<T>\n) {\n pd(data.e);\n}\n\n/**\n * Validate the sort.\n *\n * @param data - The node drag event data or node pointer event data.\n * @param state - The drag state.\n * @param x - The x coordinate.\n * @param y - The y coordinate.\n *\n * @returns Whether the sort is valid.\n */\nexport function validateSort<T>(\n data: NodeDragEventData<T> | NodePointerEventData<T>,\n state: DragState<T>,\n x: number,\n y: number\n): boolean {\n if (\n state.affectedNodes\n .map((x) => x.data.value)\n .includes(data.targetData.node.data.value)\n ) {\n return false;\n }\n\n if (state.remapJustFinished) {\n state.remapJustFinished = false;\n\n if (\n data.targetData.node.data.value === state.currentTargetValue ||\n state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)\n ) {\n state.currentTargetValue = data.targetData.node.data.value;\n }\n\n return false;\n }\n\n if (state.preventEnter) return false;\n\n if (state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)) {\n state.currentTargetValue = undefined;\n\n return false;\n }\n\n if (data.targetData.node.data.value === state.currentTargetValue)\n return false;\n\n if (\n data.targetData.parent.el !== state.currentParent?.el ||\n data.targetData.parent.data.config.sortable === false\n )\n return false;\n\n if (data.targetData.node.el.contains(state.draggedNodes[0].el)) return false;\n\n const targetRect = data.targetData.node.el.getBoundingClientRect();\n\n const dragRect = state.draggedNode.el.getBoundingClientRect();\n\n const yDiff = targetRect.y - dragRect.y;\n\n const xDiff = targetRect.x - dragRect.x;\n\n let incomingDirection: \"above\" | \"below\" | \"left\" | \"right\";\n\n if (Math.abs(yDiff) > Math.abs(xDiff)) {\n incomingDirection = yDiff > 0 ? \"above\" : \"below\";\n } else {\n incomingDirection = xDiff > 0 ? \"left\" : \"right\";\n }\n\n const threshold = state.currentParent.data.config.threshold;\n\n switch (incomingDirection) {\n case \"left\":\n if (x > targetRect.x + targetRect.width * threshold.horizontal) {\n state.incomingDirection = \"left\";\n\n return true;\n }\n break;\n\n case \"right\":\n if (x < targetRect.x + targetRect.width * (1 - threshold.horizontal)) {\n state.incomingDirection = \"right\";\n\n return true;\n }\n break;\n\n case \"above\":\n if (y > targetRect.y + targetRect.height * threshold.vertical) {\n state.incomingDirection = \"above\";\n\n return true;\n }\n break;\n\n case \"below\":\n if (y < targetRect.y + targetRect.height * (1 - threshold.vertical)) {\n state.incomingDirection = \"below\";\n\n return true;\n }\n break;\n\n default:\n break;\n }\n\n return false;\n}\n\n/**\n * Sort the nodes.\n *\n * @param data - The node drag event data or node pointer event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function sort<T>(\n data: NodeDragEventData<T> | NodePointerEventData<T>,\n state: DragState<T>\n) {\n const { x, y } = eventCoordinates(data.e);\n\n if (!validateSort(data, state, x, y)) {\n return;\n }\n\n const range =\n state.draggedNode.data.index > data.targetData.node.data.index\n ? [data.targetData.node.data.index, state.draggedNode.data.index]\n : [state.draggedNode.data.index, data.targetData.node.data.index];\n\n state.targetIndex = data.targetData.node.data.index;\n\n state.affectedNodes = data.targetData.parent.data.enabledNodes.filter(\n (node) => {\n return (\n range[0] <= node.data.index &&\n node.data.index <= range[1] &&\n node.el !== state.draggedNode.el\n );\n }\n );\n\n data.targetData.parent.data.config.performSort({\n parent: data.targetData.parent,\n draggedNodes: state.draggedNodes,\n targetNodes: [data.targetData.node],\n });\n}\n\n/**\n * Event listener used for all nodes.\n *\n * @param e - The event.\n *\n */\nexport function nodeEventData<T>(\n callback: any\n): (e: Event) => NodeEventData<T> | undefined {\n function nodeTargetData(node: Node): NodeTargetData<T> | undefined {\n const nodeData = nodes.get(node);\n\n if (!nodeData) return;\n\n const parentData = parents.get(node.parentNode);\n\n if (!parentData) return;\n\n return {\n node: {\n el: node,\n data: nodeData,\n },\n parent: {\n el: node.parentNode,\n data: parentData,\n },\n };\n }\n\n return (e: Event) => {\n const targetData = nodeTargetData(e.currentTarget as Node);\n\n if (!targetData) return;\n\n return callback(\n {\n e,\n targetData,\n },\n state\n );\n };\n}\n\n/**\n * Transfer the nodes.\n *\n * @param data - The node event data or parent event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function transfer<T>(\n data: NodeEventData<T> | ParentEventData<T>,\n state: DragState<T>\n): void {\n pd(data.e);\n\n if (\n !validateTransfer({\n currentParent: state.currentParent,\n targetParent: data.targetData.parent as any,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n state,\n })\n )\n return;\n\n data.targetData.parent.data.config.performTransfer({\n currentParent: state.currentParent,\n targetParent: data.targetData.parent,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n initialIndex: state.initialIndex,\n state,\n targetNodes: \"node\" in data.targetData ? [data.targetData.node] : [],\n });\n\n state.currentParent = data.targetData.parent;\n\n state.transferred = true;\n}\n\n/**\n * Event listener used for all parents.\n *\n * @param callback - The callback.\n *\n * @returns A function to get the parent event data.\n */\nexport function parentEventData<T>(\n callback: any\n): (e: Event) => NodeEventData<T> | undefined {\n function parentTargetData(\n parent: HTMLElement\n ): ParentTargetData<T> | undefined {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n return {\n parent: {\n el: parent,\n data: parentData as ParentData<T>,\n },\n };\n }\n\n return (e: Event) => {\n const targetData = parentTargetData(e.currentTarget as HTMLElement);\n\n if (!targetData) return;\n\n return callback(\n {\n e,\n targetData,\n },\n state\n );\n };\n}\n\n/**\n * Add class to the node.\n *\n * @param els - The nodes.\n * @param className - The class name.\n * @param omitAppendPrivateClass - Whether to omit append private class.\n *\n * @returns void\n */\nexport function addNodeClass<T>(\n els: Array<Node | HTMLElement | Element>,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n function nodeSetter<T>(node: Node, nodeData: NodeData<T>) {\n nodes.set(node, nodeData);\n }\n\n for (const el of els) {\n const nodeData = nodes.get(el as Node);\n\n const newData = addClass(el, className, nodeData, omitAppendPrivateClass);\n\n if (!newData) continue;\n\n nodeSetter(el as Node, newData as NodeData<T>);\n }\n}\n\n/**\n * Add class to the parent.\n *\n * @param els - The parents.\n * @param className - The class name.\n * @param omitAppendPrivateClass - Whether to omit append private class.\n *\n * @returns void\n */\nexport function addParentClass<T>(\n els: Array<HTMLElement>,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n function parentSetter<T>(parent: HTMLElement, parentData: ParentData<T>) {\n parents.set(parent, parentData);\n }\n\n for (const el of els) {\n const parentData = parents.get(el);\n\n const newData = addClass(el, className, parentData, omitAppendPrivateClass);\n\n if (!newData) continue;\n\n parentSetter(el, newData as ParentData<T>);\n }\n}\n\n/**\n * Add class to the node.\n *\n * @param el - The node.\n * @param className - The class name.\n * @param data - The node data.\n * @param omitAppendPrivateClass - Whether to omit append private class.\n *\n * @returns void\n */\nexport function addClass(\n el: Node | HTMLElement | Element,\n className: string | undefined,\n data: NodeData<any> | ParentData<any> | undefined,\n omitAppendPrivateClass = false\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n if (!data) {\n el.classList.add(...classNames);\n return;\n }\n // Revert to original logic: Initialize privateClasses as empty for this call.\n const privateClasses = [];\n\n for (const currentClassName of classNames) {\n if (!el.classList.contains(currentClassName)) {\n el.classList.add(currentClassName);\n } else if (\n // Only add to privateClasses if the element already had the class\n // AND omitAppendPrivateClass is specifically false for THIS call.\n el.classList.contains(currentClassName) &&\n omitAppendPrivateClass === false\n ) {\n privateClasses.push(currentClassName);\n }\n }\n // Assign the newly computed privateClasses, overwriting any previous value.\n data.privateClasses = privateClasses;\n return data;\n}\n\n/**\n * Remove class from the nodes.\n *\n * @param els - The nodes.\n * @param className - The class name.\n *\n * @returns void\n */\nexport function removeClass(\n els: Array<Node | HTMLElement | Element>,\n className: string | undefined\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n for (const node of els) {\n if (!isNode(node)) {\n node.classList.remove(...classNames);\n continue;\n }\n\n const nodeData = nodes.get(node) || parents.get(node);\n\n if (!nodeData) continue;\n\n for (const className of classNames) {\n if (!nodeData.privateClasses.includes(className)) {\n node.classList.remove(className);\n }\n }\n }\n}\n\ntype ScrollDirection<T> = { axis: \"x\"; state: DragState<T> } | { axis: \"y\" };\n\nfunction getScrollDirection<T>(\n el: HTMLElement,\n e: PointerEvent | DragEvent,\n style: CSSStyleDeclaration,\n rect: DOMRect,\n opts: ScrollDirection<T>\n): Record<string, boolean> {\n const threshold = 0.075;\n\n const isX = opts.axis === \"x\";\n const isRoot = el === document.scrollingElement;\n const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\n const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\n const offsetProp = isX ? \"offsetWidth\" : \"offsetHeight\";\n const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\n const clientCoord = isX ? e.clientX : e.clientY;\n const rectStart = isX ? rect.left : rect.top;\n const overflow = isX ? style.overflowX : style.overflowY;\n\n if (isRoot) {\n const scrollPos = el[scrollProp];\n const clientSize = el[sizeProp];\n const canScrollBefore = scrollPos > 0;\n const canScrollAfter =\n scrollPos + clientSize <\n (isX\n ? (opts.state as SynthDragState<T>).rootScrollWidth || 0\n : el[scrollSizeProp]);\n\n return isX\n ? {\n left: canScrollBefore && clientCoord < clientSize * threshold,\n right: canScrollAfter && clientCoord > clientSize * (1 - threshold),\n }\n : {\n up: canScrollBefore && clientCoord < clientSize * threshold,\n down: canScrollAfter && clientCoord > clientSize * (1 - threshold),\n };\n }\n\n if (\n (overflow === \"auto\" || overflow === \"scroll\") &&\n el !== document.body &&\n el !== document.documentElement\n ) {\n const scrollSize = el[scrollSizeProp];\n const offsetSize = el[offsetProp];\n const scrollPos = el[scrollProp];\n\n const canScrollBefore = scrollPos > 0;\n const canScrollAfter = scrollPos < scrollSize - offsetSize;\n\n return isX\n ? {\n left:\n canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\n right:\n canScrollAfter &&\n clientCoord > rectStart + offsetSize * (1 - threshold),\n }\n : {\n up:\n canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\n down:\n canScrollAfter &&\n clientCoord > rectStart + offsetSize * (1 - threshold),\n };\n }\n\n return isX ? { left: false, right: false } : { up: false, down: false };\n}\n\ntype Axis = \"x\" | \"y\";\n\nfunction scrollAxis<T>(\n el: HTMLElement,\n _e: PointerEvent | DragEvent,\n state: DragState<T>,\n options: {\n axis: Axis;\n direction: \"positive\" | \"negative\";\n }\n) {\n // Check if this is a stale call from a previous state\n if (!isDragState(state) || !state.draggedNode) {\n return; // State has been reset or is no longer in a drag state\n }\n\n state.preventEnter = true;\n\n const isX = options.axis === \"x\";\n const dirFactor = options.direction === \"positive\" ? 1 : -1;\n const speed = 20;\n\n const key = isX ? \"lastScrollDirectionX\" : \"lastScrollDirectionY\";\n const idKey = isX ? \"frameIdX\" : \"frameIdY\";\n\n // Cancel any existing animation first, regardless of direction\n if (state[idKey] !== undefined) {\n cancelAnimationFrame(state[idKey]!);\n state[idKey] = undefined;\n }\n\n state[key] = options.direction;\n\n const scrollLoop = () => {\n // Check again if state is still valid\n if (!isDragState(state) || !state.draggedNode) {\n if (state[idKey] !== undefined) {\n cancelAnimationFrame(state[idKey]!);\n state[idKey] = undefined;\n }\n return;\n }\n\n const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\n const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\n const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\n\n const scrollPos = el[scrollProp];\n const clientSize = el[sizeProp];\n const scrollSize = el[scrollSizeProp];\n\n const canScroll =\n dirFactor > 0 ? scrollPos + clientSize < scrollSize : scrollPos > 0;\n\n if (!canScroll) {\n state[idKey] = undefined;\n state[key] = undefined;\n return;\n }\n\n el[scrollProp] += speed * dirFactor;\n\n if (isSynthDragState(state)) {\n moveNode(state);\n }\n\n state[idKey] = requestAnimationFrame(scrollLoop);\n };\n\n state[idKey] = requestAnimationFrame(scrollLoop);\n}\n\nfunction isPointerInside(el: HTMLElement, x: number, y: number): boolean {\n const rect = el.getBoundingClientRect();\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n}\n\nfunction handleSynthScroll<T>(\n coordinates: { x: number; y: number },\n e: PointerEvent | DragEvent,\n state: DragState<T>\n) {\n // First check if this is a stale call from a previous state\n if (!isDragState(state) || !state.draggedNode) {\n return; // State has been reset or is no longer in a drag state\n }\n\n cancelSynthScroll(state);\n\n const { x, y } = coordinates;\n\n let scrolled = false;\n\n const attemptScroll = (\n axis: \"x\" | \"y\",\n direction: \"positive\" | \"negative\",\n container: HTMLElement\n ) => {\n scrollAxis(container, e, state, { axis, direction });\n scrolled = true;\n };\n\n const checkAndScroll = (el: HTMLElement) => {\n const style = window.getComputedStyle(el);\n const rect = el.getBoundingClientRect();\n\n const xResult = getScrollDirection(el, e, style, rect, {\n axis: \"x\",\n state,\n });\n\n const yResult = getScrollDirection(el, e, style, rect, { axis: \"y\" });\n\n if (xResult.left || xResult.right) {\n state.lastScrollContainerX = el;\n attemptScroll(\"x\", xResult.right ? \"positive\" : \"negative\", el);\n }\n\n if (yResult.up || yResult.down) {\n state.lastScrollContainerY = el;\n attemptScroll(\"y\", yResult.down ? \"positive\" : \"negative\", el);\n }\n };\n\n if (\n state.lastScrollContainerX &&\n isPointerInside(state.lastScrollContainerX, x, y)\n ) {\n checkAndScroll(state.lastScrollContainerX);\n }\n\n if (\n !scrolled &&\n state.lastScrollContainerY &&\n isPointerInside(state.lastScrollContainerY, x, y)\n ) {\n checkAndScroll(state.lastScrollContainerY);\n }\n\n if (!scrolled) {\n let el = document.elementFromPoint(x, y);\n while (\n el &&\n !(scrolled && state.lastScrollContainerX && state.lastScrollContainerY)\n ) {\n if (el instanceof HTMLElement) {\n checkAndScroll(el);\n }\n el = el.parentElement;\n }\n }\n\n if (!scrolled) {\n const root = document.scrollingElement;\n if (root instanceof HTMLElement) {\n checkAndScroll(root);\n }\n }\n\n if (!scrolled) cancelSynthScroll(state);\n}\n\nexport function getElFromPoint<T>(coordinates: {\n x: number;\n y: number;\n}): NodeFromPoint<T> | ParentFromPoint<T> | undefined {\n let target = document.elementFromPoint(coordinates.x, coordinates.y);\n\n if (!isNode(target)) return;\n\n let isParent;\n\n let invalidEl = true;\n\n while (target && invalidEl) {\n if (nodes.has(target as Node) || parents.has(target as HTMLElement)) {\n invalidEl = false;\n\n isParent = parents.has(target as HTMLElement);\n\n break;\n }\n\n target = target.parentNode as Node;\n }\n\n if (!isParent) {\n const targetNodeData = nodes.get(target as Node);\n\n if (!targetNodeData) return;\n\n const targetParentData = parents.get(target.parentNode as Node);\n\n if (!targetParentData) return;\n\n return {\n node: {\n el: target as Node,\n data: targetNodeData,\n },\n parent: {\n el: target.parentNode as Node,\n data: targetParentData as ParentData<T>,\n },\n };\n } else {\n const parentData = parents.get(target as HTMLElement);\n\n if (!parentData) return;\n\n return {\n parent: {\n el: target as HTMLElement,\n data: parentData as ParentData<T>,\n },\n };\n }\n}\n\n/**\n * Checks to see that a given element and its parent node is instance of\n * HTMLElement.\n *\n * @param {unknown} el - The element to check.\n *\n * @returns {boolean} - Whether or not provided element is of type Node.\n */\nexport function isNode(el: unknown): el is Node {\n return el instanceof HTMLElement && el.parentNode instanceof HTMLElement;\n}\n\n/**\n * Takes a given el and event handlers, assigns them, and returns the used abort\n * controller.\n *\n * @param el - The element to add the event listeners to.\n * @param events - The events to add to the element.\n * @returns - The abort controller used for the event listeners.\n */\nexport function addEvents(\n el: Document | ShadowRoot | Node | HTMLElement | Window,\n events: EventHandlers | any\n): AbortController {\n const abortController = new AbortController();\n\n for (const eventName in events) {\n const handler = events[eventName];\n\n el.addEventListener(eventName, handler, {\n signal: abortController.signal,\n passive: false,\n capture: eventName === \"focus\" || eventName === \"blur\",\n });\n }\n\n return abortController;\n}\n","import type { PartialElement, State } from \"@domphy/core\";\nimport {\n dragAndDrop,\n type ParentConfig,\n tearDown,\n} from \"@formkit/drag-and-drop\";\n\n/**\n * Domphy adapter for `@formkit/drag-and-drop`. Apply to the list container via\n * `$`; it wires FormKit's drag engine to a Domphy `State<T[]>` — reorders update\n * the state and the keyed children re-render. The same pattern the React/Vue/\n * Solid adapters use. Render the children reactively from the same state with a\n * stable `_key` per item.\n *\n * ```ts\n * const items = toState([{ id: 1, label: \"A\" }, { id: 2, label: \"B\" }])\n * const App = {\n * ul: (l) => items.get(l).map((it) => ({ li: it.label, _key: it.id })),\n * $: [dragDrop(items)],\n * }\n * ```\n */\nexport function dragDrop<T>(\n values: State<T[]>,\n config: Partial<ParentConfig<T>> = {},\n): PartialElement {\n return {\n _onMount: (node) => {\n const parent = node.domElement as HTMLElement | null;\n if (!parent) return;\n dragAndDrop<T>({\n parent,\n getValues: () => values.get(),\n setValues: (next) => values.set(next),\n config,\n });\n },\n _onRemove: (node) => {\n const parent = node.domElement as HTMLElement | null;\n if (parent) tearDown(parent);\n },\n };\n}\n"],"mappings":"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","names":["global_exports","__export","src_exports","src_exports","__export","addClass","addEvents","addNodeClass","addParentClass","animations","dragAndDrop","dragDrop","dragStateProps","dragValues","dragstartClasses","dropOrSwap","getElFromPoint","handleClickNode","handleClickParent","handleDragend","handleDragstart","handleEnd3","handleLongPress","handleNodeBlur","handleNodeDragover3","handleNodeDrop","handleNodeFocus","handleNodeKeydown","handleNodePointerdown","handleNodePointerover2","handleNodePointerup","handleParentDragover3","handleParentDrop","handleParentFocus","handleParentPointerover2","handlePointercancel","initDrag","insert","isBrowser","isDragState","isNode","isSynthDragState","nodeEventData","nodes","parentEventData","parentValues","parents","performSort","performTransfer","preventSortOnScroll","remapFinished","remapNodes","removeClass","resetState","setAttrs","setDragState","setParentValues","setupNode","setupNodeRemap","sort","state","synthMove","tearDown","tearDownNode","tearDownNodeRemap","transfer","updateConfig","validateDragHandle","validateDragstart","validateSort","validateTransfer","pd","sp","createEmitter","callbacks","eventName","data","cb","callback","cbs","_a","emit","on","eqRegExp","x","y","eq","valA","valB","deep","explicit","objA","objB","k","key","splitClass","className","eventCoordinates","animations","animationsConfig","slideUp","slideDown","slideLeft","slideRight","parent","parents","isDragState","state","duration","easing","animate","nodeRect","nodeIndex","ascendingDirection","adjacentNode","xDiff","yDiff","node","animation","insertState","documentController","insert","insertConfig","parentData","insertParentConfig","__spreadProps","__spreadValues","handleNodeDragover","handleParentPointerover","handleParentDragover","originalHandleend","handleEnd","addEvents","checkPosition","defineRanges","firstScrollableParent","findFirstOverflowingParent","element","overflow","overflowY","overflowX","isOverflowSet","isOverflowing","hasScrollPosition","isValidDropTarget","target","targetConfig","el","isWithinAParent","current","removeClass","createVerticalRange","nodeCoords","otherCoords","isAscending","center","offset","otherEdge","nodeEdge","midpoint","range","createHorizontalRange","lastInRow","nextNodeCenter","getRealCoords","top","bottom","left","right","height","width","scrollLeft","scrollTop","isSynthDragState","enabledNodes","index","prevNode","nextNode","prevNodeCoords","nextNodeCoords","aboveOrBelowPrevious","aboveOrBelowAfter","processParentDragEvent","targetData","nativeDrag","clientX","clientY","nestedParent","realTargetParent","rect","moveBetween","moveOutside","detail","_b","foundRange","findClosest","position","positionInsertPoint","addParentClass","insertPoint","createInsertPoint","removeInsertPoint","ascending","insertPointHeight","topPosition","leftPosition","newParentValues","parentValues","draggedValues","setParentValues","draggedOverParentValues","insertValues","draggedParentValues","transferred","remapNodes","originalIndex","targetIndex","sortEventData","targetParentValues","dropZoneClass","dragPlaceholderClass","dropSwapState","dropOrSwap","dropSwapConfig","dropSwapParentConfig","handleNodePointerover","handeParentPointerover","rootDragover","rootPointerover","_e","canTransferTo","targetParent","validateTransfer","resetDraggedOverNodes","config","isSynth","updateDraggedOverNodes","addNodeClass","addClass","currentConfig","swapElements","arr1","arr2","index1","index2","indices1","elementsFromArr1","i","elementFromArr2","idx","values","newValues","draggedIndex","initialParentValues","newInitialValues","swap","shouldSwap","res","isBrowser","nodes","isMobilePlatform","ua","isMobileUA","isIpad","baseDragState","dropped","scrollTimeout","resetState","setDragState","dragStateProps","claimedPointerdowns","handleRootPointerdown","setActive","deselect","handleRootPointerup","handleRootKeydown","handleRootDrop","handleRootDragover","handleSynthScroll","handleRootPointermove","synthMove","synthDragState","initSynthDrag","handleTouchmove","handleContextmenu","dragAndDrop","getValues","setValues","nodeEventData","tearDown","draggedNodes","dragstartClasses","handleNodeKeydown","handleDragstart","handleNodeDrop","handleNodeFocus","handleNodeBlur","handlePointercancel","handleDragend","handleParentFocus","handleNodePointerup","handleParentScroll","handleNodePointerdown","handleNodeDragenter","handleNodeDragleave","handleParentDrop","_c","_d","performSort","performTransfer","setupNode","setupNodeRemap","reapplyDragClasses","tearDownNode","tearDownNodeRemap","remapFinished","nodesMutated","_f","plugin","_g","_h","setup","e","offsetX","offsetY","targetNodes","newActiveNode","selectedClass","iterativeNodes","setSelected","selectedNodes","pointerdown","firstEnabledNode","currentParent","initialParent","initialIndex","currentParentValues","reset","dragValues","updateConfig","parentEventData","draggableItem","isNode","nodeData","parentNode","setAttrs","attrs","mutationList","parentEl","force","enabledNodeRecords","identityIndexes","consumed","prevNodeData","found","valueIndex","draggedNode","validateDragstart","pointerDown","_data","validated","validateDragHandle","dragState","initDrag","dragstartData","handleLongPress","commandKey","shiftKey","targetNode","minIndex","maxIndex","_node","dragImage","wrapper","clone","path","dragHandles","elFromPoint","handle","handleClickNode","handleClickParent","preventSortOnScroll","sort","transfer","nodesToClean","initialParentData","longPressClass","placeholderClass","originalZIndex","cancelSynthScroll","finalStateForCallback","_state","result","criticalStyleProps","copyCriticalStyles","src","dest","computed","prop","applyBaseStyles","extraStyles","dragged","synthDragStateProps","cancelX","cancelY","moveNode","justStarted","startLeft","startTop","currentScrollX","currentScrollY","translateX","translateY","coordinates","getElFromPoint","pointerMoveEventData","initialParentConfig","validateSort","targetRect","dragRect","incomingDirection","threshold","nodeTargetData","parentTargetData","els","omitAppendPrivateClass","nodeSetter","newData","parentSetter","classNames","privateClasses","currentClassName","getScrollDirection","style","opts","isX","isRoot","scrollProp","sizeProp","offsetProp","scrollSizeProp","clientCoord","rectStart","scrollPos","clientSize","canScrollBefore","canScrollAfter","scrollSize","offsetSize","scrollAxis","options","dirFactor","speed","idKey","scrollLoop","isPointerInside","scrolled","attemptScroll","axis","direction","container","checkAndScroll","xResult","yResult","root","isParent","invalidEl","targetNodeData","targetParentData","events","abortController","handler","dragDrop","values","config","node","parent","dragAndDrop","next","tearDown"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";var i=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var u=(e,t)=>{for(var r in t)i(e,r,{get:t[r],enumerable:!0})},p=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of g(t))!s.call(e,n)&&n!==r&&i(e,n,{get:()=>t[n],enumerable:!(o=d(t,n))||o.enumerable});return e},m=(e,t,r)=>(p(e,t,"default"),r&&p(r,t,"default"));var E=e=>p(i({},"__esModule",{value:!0}),e);var a={};u(a,{dragDrop:()=>f});module.exports=E(a);m(a,require("@formkit/drag-and-drop"),module.exports);var l=require("@formkit/drag-and-drop");function f(e,t={}){return{_onMount:r=>{let o=r.domElement;o&&(0,l.dragAndDrop)({parent:o,getValues:()=>e.get(),setValues:n=>e.set(n),config:t})},_onRemove:r=>{let o=r.domElement;o&&(0,l.tearDown)(o)}}}0&&(module.exports={dragDrop,...require("@formkit/drag-and-drop")});
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/dragDrop.ts"],"sourcesContent":["// @domphy/dnd — drag & drop for Domphy. Re-exports the framework-agnostic\n// @formkit/drag-and-drop engine and adds the Domphy adapter `dragDrop`.\nexport * from \"@formkit/drag-and-drop\";\nexport { dragDrop } from \"./dragDrop.js\";\n","import type { PartialElement, State } from \"@domphy/core\";\nimport {\n dragAndDrop,\n type ParentConfig,\n tearDown,\n} from \"@formkit/drag-and-drop\";\n\n/**\n * Domphy adapter for `@formkit/drag-and-drop`. Apply to the list container via\n * `$`; it wires FormKit's drag engine to a Domphy `State<T[]>` — reorders update\n * the state and the keyed children re-render. The same pattern the React/Vue/\n * Solid adapters use. Render the children reactively from the same state with a\n * stable `_key` per item.\n *\n * ```ts\n * const items = toState([{ id: 1, label: \"A\" }, { id: 2, label: \"B\" }])\n * const App = {\n * ul: (l) => items.get(l).map((it) => ({ li: it.label, _key: it.id })),\n * $: [dragDrop(items)],\n * }\n * ```\n */\nexport function dragDrop<T>(\n values: State<T[]>,\n config: Partial<ParentConfig<T>> = {},\n): PartialElement {\n return {\n _onMount: (node) => {\n const parent = node.domElement as HTMLElement | null;\n if (!parent) return;\n dragAndDrop<T>({\n parent,\n getValues: () => values.get(),\n setValues: (next) => values.set(next),\n config,\n });\n },\n _onRemove: (node) => {\n const parent = node.domElement as HTMLElement | null;\n if (parent) tearDown(parent);\n },\n };\n}\n"],"mappings":"2dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,cAAAE,IAAA,eAAAC,EAAAH,GAEAI,EAAAJ,EAAc,kCAFd,gBCCA,IAAAK,EAIO,kCAiBA,SAASC,EACdC,EACAC,EAAmC,CAAC,EACpB,CAChB,MAAO,CACL,SAAWC,GAAS,CAClB,IAAMC,EAASD,EAAK,WACfC,MACL,eAAe,CACb,OAAAA,EACA,UAAW,IAAMH,EAAO,IAAI,EAC5B,UAAYI,GAASJ,EAAO,IAAII,CAAI,EACpC,OAAAH,CACF,CAAC,CACH,EACA,UAAYC,GAAS,CACnB,IAAMC,EAASD,EAAK,WAChBC,MAAQ,YAASA,CAAM,CAC7B,CACF,CACF","names":["src_exports","__export","dragDrop","__toCommonJS","__reExport","import_drag_and_drop","dragDrop","values","config","node","parent","next"]}
@@ -0,0 +1,22 @@
1
+ import { ParentConfig } from '@formkit/drag-and-drop';
2
+ export * from '@formkit/drag-and-drop';
3
+ import { State, PartialElement } from '@domphy/core';
4
+
5
+ /**
6
+ * Domphy adapter for `@formkit/drag-and-drop`. Apply to the list container via
7
+ * `$`; it wires FormKit's drag engine to a Domphy `State<T[]>` — reorders update
8
+ * the state and the keyed children re-render. The same pattern the React/Vue/
9
+ * Solid adapters use. Render the children reactively from the same state with a
10
+ * stable `_key` per item.
11
+ *
12
+ * ```ts
13
+ * const items = toState([{ id: 1, label: "A" }, { id: 2, label: "B" }])
14
+ * const App = {
15
+ * ul: (l) => items.get(l).map((it) => ({ li: it.label, _key: it.id })),
16
+ * $: [dragDrop(items)],
17
+ * }
18
+ * ```
19
+ */
20
+ declare function dragDrop<T>(values: State<T[]>, config?: Partial<ParentConfig<T>>): PartialElement;
21
+
22
+ export { dragDrop };
@@ -0,0 +1,22 @@
1
+ import { ParentConfig } from '@formkit/drag-and-drop';
2
+ export * from '@formkit/drag-and-drop';
3
+ import { State, PartialElement } from '@domphy/core';
4
+
5
+ /**
6
+ * Domphy adapter for `@formkit/drag-and-drop`. Apply to the list container via
7
+ * `$`; it wires FormKit's drag engine to a Domphy `State<T[]>` — reorders update
8
+ * the state and the keyed children re-render. The same pattern the React/Vue/
9
+ * Solid adapters use. Render the children reactively from the same state with a
10
+ * stable `_key` per item.
11
+ *
12
+ * ```ts
13
+ * const items = toState([{ id: 1, label: "A" }, { id: 2, label: "B" }])
14
+ * const App = {
15
+ * ul: (l) => items.get(l).map((it) => ({ li: it.label, _key: it.id })),
16
+ * $: [dragDrop(items)],
17
+ * }
18
+ * ```
19
+ */
20
+ declare function dragDrop<T>(values: State<T[]>, config?: Partial<ParentConfig<T>>): PartialElement;
21
+
22
+ export { dragDrop };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export*from"@formkit/drag-and-drop";import{dragAndDrop as a,tearDown as m}from"@formkit/drag-and-drop";function l(r,o={}){return{_onMount:e=>{let t=e.domElement;t&&a({parent:t,getValues:()=>r.get(),setValues:n=>r.set(n),config:o})},_onRemove:e=>{let t=e.domElement;t&&m(t)}}}export{l as dragDrop};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/dragDrop.ts"],"sourcesContent":["// @domphy/dnd — drag & drop for Domphy. Re-exports the framework-agnostic\n// @formkit/drag-and-drop engine and adds the Domphy adapter `dragDrop`.\nexport * from \"@formkit/drag-and-drop\";\nexport { dragDrop } from \"./dragDrop.js\";\n","import type { PartialElement, State } from \"@domphy/core\";\nimport {\n dragAndDrop,\n type ParentConfig,\n tearDown,\n} from \"@formkit/drag-and-drop\";\n\n/**\n * Domphy adapter for `@formkit/drag-and-drop`. Apply to the list container via\n * `$`; it wires FormKit's drag engine to a Domphy `State<T[]>` — reorders update\n * the state and the keyed children re-render. The same pattern the React/Vue/\n * Solid adapters use. Render the children reactively from the same state with a\n * stable `_key` per item.\n *\n * ```ts\n * const items = toState([{ id: 1, label: \"A\" }, { id: 2, label: \"B\" }])\n * const App = {\n * ul: (l) => items.get(l).map((it) => ({ li: it.label, _key: it.id })),\n * $: [dragDrop(items)],\n * }\n * ```\n */\nexport function dragDrop<T>(\n values: State<T[]>,\n config: Partial<ParentConfig<T>> = {},\n): PartialElement {\n return {\n _onMount: (node) => {\n const parent = node.domElement as HTMLElement | null;\n if (!parent) return;\n dragAndDrop<T>({\n parent,\n getValues: () => values.get(),\n setValues: (next) => values.set(next),\n config,\n });\n },\n _onRemove: (node) => {\n const parent = node.domElement as HTMLElement | null;\n if (parent) tearDown(parent);\n },\n };\n}\n"],"mappings":"AAEA,WAAc,yBCDd,OACE,eAAAA,EAEA,YAAAC,MACK,yBAiBA,SAASC,EACdC,EACAC,EAAmC,CAAC,EACpB,CAChB,MAAO,CACL,SAAWC,GAAS,CAClB,IAAMC,EAASD,EAAK,WACfC,GACLN,EAAe,CACb,OAAAM,EACA,UAAW,IAAMH,EAAO,IAAI,EAC5B,UAAYI,GAASJ,EAAO,IAAII,CAAI,EACpC,OAAAH,CACF,CAAC,CACH,EACA,UAAYC,GAAS,CACnB,IAAMC,EAASD,EAAK,WAChBC,GAAQL,EAASK,CAAM,CAC7B,CACF,CACF","names":["dragAndDrop","tearDown","dragDrop","values","config","node","parent","next"]}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@domphy/dnd",
3
+ "version": "0.8.0",
4
+ "description": "Domphy Drag & Drop - reactive adapter for the framework-agnostic @formkit/drag-and-drop engine",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ }
20
+ },
21
+ "keywords": [
22
+ "domphy",
23
+ "drag-and-drop",
24
+ "dnd",
25
+ "sortable",
26
+ "reorder"
27
+ ],
28
+ "author": "Huu Khanh Nguyen",
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/domphy/domphy.git",
33
+ "directory": "packages/dnd"
34
+ },
35
+ "dependencies": {
36
+ "@formkit/drag-and-drop": "^0.6.0"
37
+ },
38
+ "peerDependencies": {
39
+ "@domphy/core": "^0.8.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^25.9.2",
43
+ "tsup": "^8.5.0",
44
+ "typescript": "^5.8.3",
45
+ "vitest": "^4.0.18",
46
+ "@domphy/core": "0.8.0"
47
+ },
48
+ "files": [
49
+ "dist",
50
+ "README.md"
51
+ ],
52
+ "unpkg": "dist/dnd.global.js",
53
+ "jsdelivr": "dist/dnd.global.js",
54
+ "scripts": {
55
+ "build": "tsup",
56
+ "dev": "tsup --watch",
57
+ "pack": "tsup && npm pack",
58
+ "test": "vitest run",
59
+ "test:watch": "vitest"
60
+ }
61
+ }