diff --git a/dist/index.cjs b/dist/index.cjs index ff658dd..30a2075 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -25,7 +25,6 @@ __export(src_exports, { addNodeClass: () => addNodeClass, addParentClass: () => addParentClass, animations: () => animations, - copyNodeStyle: () => copyNodeStyle, dragAndDrop: () => dragAndDrop, dragStateProps: () => dragStateProps, dragValues: () => dragValues, @@ -1227,29 +1226,6 @@ function handleRootKeydown(e) { } function handleRootDrop(_e) { } -function copyNodeStyle(sourceNode, targetNode, omitKeys = false) { - const computedStyle = window.getComputedStyle(sourceNode); - const omittedKeys = [ - "position", - "z-index", - "top", - "left", - "x", - "pointer-events", - "y", - "transform-origin", - "filter", - "-webkit-text-fill-color" - ]; - for (const key of Array.from(computedStyle)) { - if (omitKeys === false && key && omittedKeys.includes(key)) continue; - targetNode.style.setProperty( - key, - computedStyle.getPropertyValue(key), - computedStyle.getPropertyPriority(key) - ); - } -} function handleRootDragover(e) { if (!isDragState(state)) return; pd(e); @@ -2358,14 +2334,13 @@ function initSynthDrag(node, parent, e, _state, draggedNodes2) { zIndex: 9999, pointerEvents: "none", margin: 0, + willChange: "transform", overflow: "hidden", display: "none" }); } else { if (!config.multiDrag || draggedNodes2.length === 1) { - console.log("boom"); dragImage = node.el.cloneNode(true); - copyNodeStyle(node.el, dragImage); dragImage.id = "dnd-dragged-node-clone"; display = dragImage.style.display; dragImage.setAttribute("popover", "manual"); @@ -2375,16 +2350,15 @@ function initSynthDrag(node, parent, e, _state, draggedNodes2) { width: node.el.getBoundingClientRect().width + "px", overflow: "hidden", margin: 0, + willChange: "transform", pointerEvents: "none", zIndex: 9999 }); } else { const wrapper = document.createElement("div"); - console.log("getting here"); wrapper.setAttribute("popover", "manual"); for (const node2 of draggedNodes2) { const clonedNode = node2.el.cloneNode(true); - copyNodeStyle(node2.el, clonedNode); clonedNode.style.pointerEvents = "none"; wrapper.append(clonedNode); } @@ -2470,9 +2444,12 @@ function moveNode(e, state2, scrollX2 = 0, scrollY2 = 0) { state2.coordinates.x = x; const startLeft = state2.startLeft ?? 0; const startTop = state2.startTop ?? 0; + console.log("window scroll y", window.scrollY); + console.log("start top", startTop); const translateX = x - startLeft + window.scrollX; const translateY = y - startTop + window.scrollY; state2.clonedDraggedNode.style.transform = `translate(${translateX + scrollX2}px, ${translateY + scrollY2}px)`; + console.log("translate y", translateY + scrollY2); if (e.cancelable) pd(e); pointermoveClasses(state2, state2.initialParent.data.config); } @@ -2928,7 +2905,6 @@ function addEvents(el, events) { addNodeClass, addParentClass, animations, - copyNodeStyle, dragAndDrop, dragStateProps, dragValues, diff --git a/dist/index.cjs.map b/dist/index.cjs.map index 7880324..fd834dd 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/plugins/animations/index.ts","../src/plugins/insert/index.ts","../src/plugins/drop-or-swap/index.ts"],"sourcesContent":["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 ParentKeydownEventData,\n SynthDragStateProps,\n ParentRecord,\n EventHandlers,\n NodeFromPoint,\n ParentFromPoint,\n ParentDragEventData,\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>}\n */\nexport const parents: ParentsData = new WeakMap<\n HTMLElement,\n ParentData\n>();\n\n/**\n * Nodes are the draggable items and the direct descendants of the parents.\n *\n * @type {WeakMap>}\n */\nexport const nodes: NodesData = new WeakMap>();\n\n/**\n * Function to check if touch support is enabled.\n *\n * @returns {boolean}\n */\nfunction checkTouchSupport() {\n if (!isBrowser) return false;\n\n return \"ontouchstart\" in window || navigator.maxTouchPoints > 0;\n}\n\n/**\n * The base drag state.\n *\n * @type {BaseDragState}\n */\nconst baseDragState = {\n activeDescendant: undefined,\n affectedNodes: [],\n coordinates: {\n x: 0,\n y: 0,\n },\n currentTargetValue: undefined,\n on,\n emit,\n newActiveDescendant: undefined,\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};\n\n/**\n * The state of the drag and drop.\n *\n * @type {BaseDragState}\n */\nexport let state: BaseDragState = 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 * Abort controller for the window.\n */\nlet windowController: AbortController | undefined;\n\n/**\n * Timeout for the scroll.\n */\nlet scrollTimeout: ReturnType;\n\n/**\n * Variable to check if the device is touch.\n */\nlet touchDevice: boolean = false;\n\nexport function resetState() {\n const baseDragState = {\n activeDescendant: undefined,\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 };\n\n state = { ...baseDragState } as BaseDragState;\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(\n dragStateProps: (SynthDragStateProps & DragStateProps) | DragStateProps\n): DragState | SynthDragState {\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 | SynthDragState;\n}\n\n/**\n *\n */\nfunction handleRootPointerdown(_e: PointerEvent) {\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(e: PointerEvent) {\n pd(e);\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\nexport function copyNodeStyle(\n sourceNode: HTMLElement,\n targetNode: HTMLElement,\n omitKeys = false\n) {\n const computedStyle = window.getComputedStyle(sourceNode);\n\n const omittedKeys = [\n \"position\",\n \"z-index\",\n \"top\",\n \"left\",\n \"x\",\n \"pointer-events\",\n \"y\",\n \"transform-origin\",\n \"filter\",\n \"-webkit-text-fill-color\",\n ];\n\n for (const key of Array.from(computedStyle)) {\n if (omitKeys === false && key && omittedKeys.includes(key)) continue;\n\n targetNode.style.setProperty(\n key,\n computedStyle.getPropertyValue(key),\n computedStyle.getPropertyPriority(key)\n );\n }\n}\n\n/**\n * If we are currently dragging, then let's prevent default on dragover to avoid\n * the default behavior of the browser on drop.\n */\nfunction handleRootDragover(e: DragEvent) {\n if (!isDragState(state)) return;\n\n pd(e);\n}\n\nfunction handleRootPointermove(e: PointerEvent) {\n if (!state.pointerDown) return;\n\n //pd(e);\n\n const config = state.pointerDown.parent.data.config;\n\n if (\n !isSynthDragState(state) &&\n (touchDevice || (!touchDevice && !config.nativeDrag))\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 synthDragState = initSynthDrag(\n state.pointerDown.node,\n state.pointerDown.parent,\n e,\n state,\n nodes\n );\n\n state.rootUserSelect = window.getComputedStyle(\n document.documentElement\n ).userSelect;\n\n document.body.style.userSelect = \"none\";\n\n synthMove(e, synthDragState);\n } else if (isSynthDragState(state)) {\n synthMove(e, state);\n }\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({\n parent,\n getValues,\n setValues,\n config = {},\n}: DragAndDrop): void {\n if (!isBrowser) return;\n\n touchDevice = checkTouchSupport();\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: (e: TouchEvent) => {\n if (isDragState(state) && e.cancelable) pd(e);\n },\n });\n\n const liveRegion = document.createElement(\"div\");\n\n setAttrs(liveRegion, {\n \"aria-live\": \"polite\",\n \"aria-atomic\": \"true\",\n \"data-dnd-live-region\": \"true\",\n });\n\n Object.assign(liveRegion.style, {\n position: \"absolute\",\n top: \"0px\",\n left: \"-9999px\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: \"0\",\n });\n\n document.body.appendChild(liveRegion);\n }\n\n if (!windowController)\n windowController = addEvents(window, {\n resize: () => {\n touchDevice = checkTouchSupport();\n },\n });\n\n tearDown(parent);\n\n const [emit, on] = createEmitter();\n\n const parentData: ParentData = {\n getValues,\n setValues,\n config: {\n dragDropEffect: config.dragDropEffect ?? \"move\",\n dragEffectAllowed: config.dragEffectAllowed ?? \"move\",\n draggedNodes,\n dragstartClasses,\n deepCopyStyles: config.deepCopyStyles ?? false,\n handleNodeKeydown,\n handleParentKeydown,\n handleDragstart,\n handleNodeDragover,\n handleParentDragover,\n handleNodeDrop,\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(\n node: NodeRecord,\n parent: ParentRecord,\n e: PointerEvent | DragEvent,\n draggedNodes: Array>,\n offsetX?: number,\n offsetY?: number\n): DragStateProps {\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 // Need to account for if the explicity offset is positive or negative\n startLeft: offsetX ? offsetX : x - rect.left,\n startTop: offsetY ? offsetY : y - rect.top,\n targetIndex: node.data.index,\n transferred: false,\n };\n}\n\nexport function performSort({\n parent,\n draggedNodes,\n targetNodes,\n}: {\n parent: ParentRecord;\n draggedNodes: Array>;\n targetNodes: Array>;\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,\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,\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(\n parent: ParentRecord,\n newActiveNode: NodeRecord | undefined,\n state: BaseDragState\n) {\n const activeDescendantClass = parent.data.config.activeDescendantClass;\n\n if (state.activeState) {\n {\n removeClass([state.activeState.node.el], activeDescendantClass);\n\n if (state.activeState.parent.el !== parent.el)\n state.activeState.parent.el.setAttribute(\"aria-activedescendant\", \"\");\n }\n }\n\n if (!newActiveNode) {\n state.activeState?.parent.el.setAttribute(\"aria-activedescendant\", \"\");\n\n state.activeState = undefined;\n\n return;\n }\n\n state.activeState = {\n node: newActiveNode,\n parent,\n };\n\n addNodeClass([newActiveNode.el], activeDescendantClass);\n\n state.activeState.parent.el.setAttribute(\n \"aria-activedescendant\",\n state.activeState.node.el.id\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>} nodes - The nodes to deselect.\n * @param {ParentRecord} parent - The parent record.\n * @param {BaseDragState} state - The current drag state.\n */\nfunction deselect(\n nodes: Array>,\n parent: ParentRecord,\n state: BaseDragState\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 clearLiveRegion(parent);\n}\n\n/**\n * This function sets the selected nodes. This will clean the prior selected state\n * as well as removing any classes or attributes set.\n *\n * @param {ParentRecord} parent - The parent record.\n * @param {Array>} selectedNodes - The nodes to select.\n * @param {NodeRecord | undefined} newActiveNode - The new active node.\n * @param {BaseDragState} state - The current drag state.\n * @param {boolean} pointerdown - Whether the pointerdown event was triggered.\n */\nfunction setSelected(\n parent: ParentRecord,\n selectedNodes: Array>,\n newActiveNode: NodeRecord | undefined,\n state: BaseDragState,\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 const selectedItems = selectedNodes.map((x) =>\n x.el.getAttribute(\"aria-label\")\n );\n\n if (selectedItems.length === 0) {\n state.selectedState = undefined;\n\n clearLiveRegion(parent);\n\n return;\n }\n\n setActive(parent, newActiveNode, state);\n\n updateLiveRegion(\n parent,\n `${selectedItems.join(\n \", \"\n )} ready for dragging. Use arrow keys to navigate. Press enter to drop ${selectedItems.join(\n \", \"\n )}.`\n );\n}\n\nfunction updateLiveRegion(parent: ParentRecord, message: string) {\n const liveRegion = document.querySelector('[data-dnd-live-region=\"true\"]');\n\n if (!liveRegion) return;\n\n liveRegion.id = parent.el.id + \"-live-region\";\n\n liveRegion.textContent = message;\n}\n\nfunction clearLiveRegion(parent: ParentRecord) {\n const liveRegion = document.getElementById(parent.el.id + \"-live-region\");\n\n if (!liveRegion) return;\n\n liveRegion.textContent = \"\";\n}\n\nexport function handleParentFocus(\n data: ParentEventData,\n state: BaseDragState | DragState | SynthDragState\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({\n currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n initialIndex,\n targetNodes,\n state,\n}: {\n currentParent: ParentRecord;\n targetParent: ParentRecord;\n initialParent: ParentRecord;\n draggedNodes: Array>;\n initialIndex: number;\n state: BaseDragState | DragState | SynthDragState;\n targetNodes: Array>;\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(\n parent: HTMLElement,\n parentData: ParentData\n): Array {\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(\n parent: HTMLElement,\n parentData: ParentData,\n values: Array\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(state: DragState): Array {\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(\n parent: HTMLElement,\n config: Partial>\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(\n data: ParentEventData,\n state: DragState\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 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(\n state: BaseDragState\n): state is DragState | SynthDragState {\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(\n state: BaseDragState\n): state is SynthDragState {\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(parent: HTMLElement, parentData: ParentData): void {\n parentData.abortControllers.mainParent = addEvents(parent, {\n keydown: parentEventData(parentData.config.handleParentKeydown),\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 };\n\n draggableItem.draggable = true;\n },\n }\n );\n }\n\n if (parent.id)\n setAttrs(parent, {\n role: \"listbox\",\n tabindex: \"0\",\n \"aria-multiselectable\": parentData.config.multiDrag ? \"true\" : \"false\",\n \"aria-activedescendant\": \"\",\n \"aria-describedby\": parent.id + \"-live-region\",\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) {\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(data: SetupNodeData) {\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 pointerup: nodeEventData(config.handleNodePointerup),\n pointercancel: nodeEventData(config.handlePointercancel),\n\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 (touchDevice) pd(e);\n },\n });\n\n data.node.el.setAttribute(\"role\", \"option\");\n\n data.node.el.setAttribute(\"aria-selected\", \"false\");\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(data: SetupNodeData) {\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(node: Node, parentData: ParentData) {\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(data: TearDownNodeData) {\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(data: TearDownNodeData) {\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 allSelectedAndActiveNodes = document.querySelectorAll(\n `[aria-selected=\"true\"]`\n );\n\n const parentData = parents.get(parentEl);\n\n if (!parentData) return;\n\n for (let x = 0; x < allSelectedAndActiveNodes.length; x++) {\n const node = allSelectedAndActiveNodes[x];\n\n node.setAttribute(\"aria-selected\", \"false\");\n\n removeClass([node], parentData.config.selectedClass);\n }\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(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 = [];\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 }\n }\n\n if (\n enabledNodes.length !== parentData.getValues(parent).length &&\n !config.disabled\n ) {\n console.warn(\n \"The number of draggable items defined in the parent element does not match the number of values. This may cause unexpected behavior.\"\n );\n\n return;\n }\n\n const values = parentData.getValues(parent);\n\n const enabledNodeRecords: Array> = [];\n\n for (let x = 0; x < enabledNodes.length; x++) {\n const node = enabledNodes[x];\n\n const prevNodeData = nodes.get(node);\n\n if (config.draggableValue && !config.draggableValue(values[x])) continue;\n\n const nodeData = Object.assign(\n prevNodeData ?? {\n privateClasses: [],\n abortControllers: {},\n },\n {\n value: values[x],\n index: x,\n }\n );\n\n if (\n !isDragState(state) &&\n state.newActiveDescendant &&\n eq(state.newActiveDescendant.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 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): 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(pointerDown: {\n parent: ParentRecord;\n node: NodeRecord;\n}): Array> {\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>),\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(_data: ParentEventData) {\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(\n data: NodeDragEventData,\n _state: BaseDragState\n) {\n const config = data.targetData.parent.data.config;\n\n if (\n !config.nativeDrag ||\n !validateDragstart(data) ||\n !validateDragHandle({\n x: data.e.clientX,\n y: data.e.clientY,\n node: data.targetData.node,\n config,\n })\n ) {\n pd(data.e);\n\n return;\n }\n\n const nodes = config.draggedNodes({\n parent: data.targetData.parent,\n node: 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 config.onDragstart({\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}\n\nexport function handleNodePointerdown(\n data: NodePointerEventData,\n state: BaseDragState\n) {\n sp(data.e);\n\n if (\n !validateDragHandle({\n x: data.e.clientX,\n y: data.e.clientY,\n node: data.targetData.node,\n config: data.targetData.parent.data.config,\n })\n )\n return;\n\n state.pointerDown = {\n parent: data.targetData.parent,\n node: data.targetData.node,\n };\n\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 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 && touchDevice) {\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(\n _node: NodeRecord,\n nodes: Array>,\n config: ParentConfig,\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.activeDescendantClass\n );\n\n removeClass(\n nodes.map((x) => x.el),\n config.selectedClass\n );\n });\n}\n\n/**\n * Initialize the drag state.\n *\n * @param data - The node drag event data.\n * @param draggedNodes - The dragged nodes.\n *\n * @returns The drag state.\n */\nexport function initDrag(\n data: NodeDragEventData,\n draggedNodes: Array>\n): DragState {\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\n data.e.dataTransfer.effectAllowed = config.dragEffectAllowed;\n\n let dragImage: HTMLElement | undefined;\n\n if (config.dragImage) {\n dragImage = config.dragImage(data, draggedNodes);\n } else {\n if (!config.multiDrag) {\n data.e.dataTransfer.setDragImage(\n data.targetData.node.el,\n data.e.offsetX,\n data.e.offsetY\n );\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n return dragState;\n } else {\n const wrapper = document.createElement(\"div\");\n\n for (const node of draggedNodes) {\n const clonedNode = node.el.cloneNode(true) as HTMLElement;\n\n clonedNode.style.pointerEvents = \"none\";\n\n clonedNode.id = node.el.id + \"-clone\";\n\n wrapper.append(clonedNode);\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 });\n\n dragImage = wrapper;\n }\n\n document.body.appendChild(dragImage);\n }\n\n data.e.dataTransfer.setDragImage(dragImage, data.e.offsetX, data.e.offsetY);\n\n setTimeout(() => {\n dragImage?.remove();\n });\n }\n\n return dragState;\n}\n\nexport function validateDragHandle({\n x,\n y,\n node,\n config,\n}: {\n x: number;\n y: number;\n node: NodeRecord;\n config: ParentConfig;\n}): boolean {\n if (config.externalDragHandle) return false;\n\n if (!config.dragHandle) return true;\n\n const dragHandles = node.el.querySelectorAll(config.dragHandle);\n\n if (!dragHandles) return false;\n\n const elFromPoint = config.root.elementFromPoint(x, y);\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(_data: NodeEventData) {}\n\nexport function handleClickParent(_data: ParentEventData) {}\n\nexport function handleNodeKeydown(_data: NodeEventData) {}\n\nexport function handleParentKeydown(\n data: ParentKeydownEventData,\n state: BaseDragState\n) {\n const activeDescendant = state.activeState?.node;\n\n if (!activeDescendant) return;\n\n const parentData = data.targetData.parent.data;\n\n const enabledNodes = parentData.enabledNodes;\n\n if (!(data.e.target instanceof HTMLElement)) return;\n const index = enabledNodes.findIndex((x) => x.el === activeDescendant.el);\n\n if (index === -1) return;\n\n if (\n [\"ArrowDown\", \"ArrowUp\", \"ArrowRight\", \"ArrowLeft\"].includes(data.e.key)\n ) {\n pd(data.e);\n\n const nextIndex =\n data.e.key === \"ArrowDown\" || data.e.key === \"ArrowRight\"\n ? index + 1\n : index - 1;\n\n if (nextIndex < 0 || nextIndex >= enabledNodes.length) return;\n\n const nextNode = enabledNodes[nextIndex];\n\n setActive(data.targetData.parent, nextNode, state);\n } else if (data.e.key === \" \") {\n pd(data.e);\n\n state.selectedState && state.selectedState.nodes.includes(activeDescendant)\n ? setSelected(\n data.targetData.parent,\n state.selectedState.nodes.filter((x) => x.el !== activeDescendant.el),\n activeDescendant,\n state\n )\n : setSelected(\n data.targetData.parent,\n [activeDescendant],\n activeDescendant,\n state\n );\n } else if (data.e.key === \"Enter\" && state.selectedState) {\n if (\n state.selectedState.parent.el === data.targetData.parent.el &&\n state.activeState\n ) {\n if (state.selectedState.nodes[0].el === state.activeState.node.el) {\n updateLiveRegion(data.targetData.parent, \"Cannot drop item on itself\");\n\n return;\n }\n\n state.newActiveDescendant = state.selectedState.nodes[0];\n\n parentData.config.performSort({\n parent: data.targetData.parent,\n draggedNodes: state.selectedState.nodes,\n targetNodes: [state.activeState.node],\n });\n\n deselect([], data.targetData.parent, state);\n\n updateLiveRegion(data.targetData.parent, \"Drop successful\");\n } else if (\n state.activeState &&\n state.selectedState.parent.el !== data.targetData.parent.el &&\n validateTransfer({\n currentParent: data.targetData.parent,\n targetParent: state.selectedState.parent,\n initialParent: state.selectedState.parent,\n draggedNodes: state.selectedState.nodes,\n state,\n })\n ) {\n parentData.config.performTransfer({\n currentParent: state.selectedState.parent,\n targetParent: data.targetData.parent,\n initialParent: state.selectedState.parent,\n draggedNodes: state.selectedState.nodes,\n initialIndex: state.selectedState.nodes[0].data.index,\n state,\n targetNodes: [state.activeState.node],\n });\n\n state.newActiveDescendant = state.selectedState.nodes[0];\n\n setSelected(data.targetData.parent, [], undefined, state);\n\n updateLiveRegion(data.targetData.parent, \"Drop successful\");\n }\n }\n}\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;\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(e: PointeroverNodeEvent) {\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(\n data: NodeDragEventData,\n state: DragState | SynthDragState\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\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(\n data: NodeDragEventData,\n state: DragState\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(\n data: NodeEventData,\n state: DragState | SynthDragState | BaseDragState\n) {\n if (!isSynthDragState(state)) return;\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(state: DragState | SynthDragState) {\n if (state.draggedNode) state.draggedNode.el.draggable = false;\n\n document.body.style.userSelect = state.rootUserSelect || \"\";\n\n if (isSynthDragState(state)) {\n document.documentElement.style.overscrollBehavior =\n state.rootOverScrollBehavior || \"\";\n\n document.documentElement.style.touchAction = state.rootTouchAction || \"\";\n }\n\n if (isSynthDragState(state)) cancelSynthScroll(state);\n\n if (\"longPressTimeout\" in state && state.longPressTimeout)\n clearTimeout(state.longPressTimeout);\n\n const config = parents.get(state.initialParent.el)?.config;\n\n const isSynth = isSynthDragState(state);\n\n const dropZoneClass = isSynth\n ? config?.synthDropZoneClass\n : config?.dropZoneClass;\n\n if (state.originalZIndex !== undefined)\n state.draggedNode.el.style.zIndex = state.originalZIndex;\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n state.initialParent.data?.config?.longPressClass\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n isSynth\n ? state.initialParent.data.config.synthDragPlaceholderClass\n : state.initialParent.data?.config?.dragPlaceholderClass\n );\n\n if (isSynth) state.clonedDraggedNode.remove();\n\n deselect(state.draggedNodes, state.currentParent, state);\n\n setActive(state.currentParent, undefined, state);\n\n resetState();\n\n state.selectedState = undefined;\n\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 state.emit(\"dragEnded\", state);\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(\n data: NodePointerEventData,\n state: DragState | SynthDragState | BaseDragState\n) {\n sp(data.e);\n\n state.pointerDown = undefined;\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 removeClass(\n data.targetData.parent.data.enabledNodes.map((x) => x.el),\n config.longPressClass\n );\n\n if (!isDragState(state)) return;\n\n config.handleEnd(state as DragState | SynthDragState);\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 *\n * @returns The synth drag state.\n */\nfunction initSynthDrag(\n node: NodeRecord,\n parent: ParentRecord,\n e: PointerEvent,\n _state: BaseDragState,\n draggedNodes: Array>\n): SynthDragState {\n const config = parent.data.config;\n\n let dragImage: HTMLElement | undefined;\n\n let display = node.el.style.display;\n\n let result = undefined;\n\n if (config.synthDragImage) {\n result = config.synthDragImage(node, parent, e, draggedNodes);\n\n dragImage = result.dragImage;\n\n dragImage.setAttribute(\"popover\", \"manual\");\n\n dragImage.id = \"dnd-dragged-node-clone\";\n\n display = dragImage.style.display;\n\n Object.assign(dragImage.style, {\n position: \"absolute\",\n zIndex: 9999,\n pointerEvents: \"none\",\n margin: 0,\n overflow: \"hidden\",\n display: \"none\",\n });\n } else {\n if (!config.multiDrag || draggedNodes.length === 1) {\n console.log(\"boom\");\n dragImage = node.el.cloneNode(true) as HTMLElement;\n\n copyNodeStyle(node.el, dragImage);\n\n dragImage.id = \"dnd-dragged-node-clone\";\n\n display = dragImage.style.display;\n\n dragImage.setAttribute(\"popover\", \"manual\");\n\n Object.assign(dragImage.style, {\n position: \"absolute\",\n height: node.el.getBoundingClientRect().height + \"px\",\n width: node.el.getBoundingClientRect().width + \"px\",\n overflow: \"hidden\",\n margin: 0,\n pointerEvents: \"none\",\n zIndex: 9999,\n });\n } else {\n const wrapper = document.createElement(\"div\");\n console.log(\"getting here\");\n\n wrapper.setAttribute(\"popover\", \"manual\");\n\n for (const node of draggedNodes) {\n const clonedNode = node.el.cloneNode(true) as HTMLElement;\n\n copyNodeStyle(node.el, clonedNode);\n\n clonedNode.style.pointerEvents = \"none\";\n\n wrapper.append(clonedNode);\n }\n\n display = wrapper.style.display;\n\n wrapper.id = \"dnd-dragged-node-clone\";\n\n dragImage = wrapper;\n\n Object.assign(dragImage.style, {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"absolute\",\n overflow: \"hidden\",\n margin: 0,\n padding: 0,\n pointerEvents: \"none\",\n zIndex: 9999,\n });\n }\n }\n\n dragImage.style.position = \"absolute\";\n\n parent.el.appendChild(dragImage);\n\n dragImage.showPopover();\n\n const synthDragStateProps = {\n clonedDraggedEls: [],\n clonedDraggedNode: dragImage,\n draggedNodeDisplay: display,\n synthDragScrolling: false,\n synthDragging: true,\n rootScrollWidth: document.scrollingElement?.scrollWidth,\n rootScrollHeight: document.scrollingElement?.scrollHeight,\n rootOverScrollBehavior: document.documentElement.style.overscrollBehavior,\n rootTouchAction: document.documentElement.style.touchAction,\n };\n\n document.documentElement.style.overscrollBehavior = \"none\";\n\n document.documentElement.style.touchAction = \"none\";\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;\n\n synthDragState.clonedDraggedNode.style.display =\n synthDragState.draggedNodeDisplay || \"\";\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(\n data: NodePointerEventData,\n state: BaseDragState,\n node: NodeRecord\n) {\n const config = data.targetData.parent.data.config;\n\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 || 200);\n}\n\nfunction pointermoveClasses(\n state: SynthDragState,\n config: ParentConfig\n) {\n if (config.longPressClass)\n removeClass(\n state.draggedNodes.map((x) => x.el),\n config?.longPressClass\n );\n}\n\nfunction cancelSynthScroll(\n state: SynthDragState,\n cancelX = true,\n cancelY = true\n) {\n if (cancelX && state.animationFrameIdX !== undefined) {\n cancelAnimationFrame(state.animationFrameIdX);\n\n state.animationFrameIdX = undefined;\n }\n\n if (cancelY && state.animationFrameIdY !== undefined) {\n cancelAnimationFrame(state.animationFrameIdY);\n\n state.animationFrameIdY = undefined;\n }\n\n if (!state.animationFrameIdX && !state.animationFrameIdY) {\n state.preventEnter = false;\n }\n}\n\nfunction moveNode(\n e: PointerEvent,\n state: SynthDragState,\n scrollX = 0,\n scrollY = 0\n) {\n const { x, y } = eventCoordinates(e);\n\n state.coordinates.y = y;\n state.coordinates.x = x;\n\n const startLeft = state.startLeft ?? 0;\n const startTop = state.startTop ?? 0;\n\n // Calculate the translation values\n const translateX = x - startLeft + window.scrollX;\n const translateY = y - startTop + window.scrollY;\n\n // Apply the transform using translate\n state.clonedDraggedNode.style.transform = `translate(${\n translateX + scrollX\n }px, ${translateY + scrollY}px)`;\n\n if (e.cancelable) pd(e);\n\n pointermoveClasses(state, state.initialParent.data.config);\n}\n\n/**\n * Handle the synth move.\n *\n * @param e - The pointer event.\n * @param state - The synth drag state.\n *\n * @returns void\n */\nexport function synthMove(e: PointerEvent, state: SynthDragState) {\n moveNode(e, state);\n\n const coordinates = eventCoordinates(e);\n\n handleSynthScroll(coordinates, e, state);\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 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(\n data: NodeDragEventData,\n state: DragState\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 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(\n data: ParentDragEventData,\n state: DragState\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 Object.assign(eventCoordinates(data.e));\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(e: PointeroverParentEvent) {\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({\n currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n state,\n}: {\n currentParent: ParentRecord;\n targetParent: ParentRecord;\n initialParent: ParentRecord;\n draggedNodes: Array>;\n state: BaseDragState;\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(\n data: NodeDragEventData,\n _state: DragState\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(\n data: NodeDragEventData,\n _state: DragState\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(\n data: NodeDragEventData | NodePointerEventData,\n state: DragState,\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(\n data: NodeDragEventData | NodePointerEventData,\n state: DragState\n) {\n const { x, y } = eventCoordinates(data.e);\n\n if (!validateSort(data, state, x, y)) return;\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(\n callback: any\n): (e: Event) => NodeEventData | undefined {\n function nodeTargetData(node: Node): NodeTargetData | 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(\n data: NodeEventData | ParentEventData,\n state: DragState\n): void {\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(\n callback: any\n): (e: Event) => NodeEventData | undefined {\n function parentTargetData(\n parent: HTMLElement\n ): ParentTargetData | 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,\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(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n function nodeSetter(node: Node, nodeData: NodeData) {\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);\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(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n function parentSetter(parent: HTMLElement, parentData: ParentData) {\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);\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 | ParentData | undefined,\n omitAppendPrivateClass = false\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n if (classNames.includes(\"longPress\")) return;\n\n if (!data) {\n el.classList.add(...classNames);\n\n return;\n }\n\n const privateClasses = [];\n\n for (const className of classNames) {\n if (!el.classList.contains(className)) {\n el.classList.add(className);\n } else if (\n el.classList.contains(className) &&\n omitAppendPrivateClass === false\n ) {\n privateClasses.push(className);\n }\n }\n\n data.privateClasses = privateClasses;\n\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,\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\n/**\n * Check if the element is scrollable on the x axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param style - The style.\n * @param rect - The rect.\n * @param state - The state.\n *\n * @returns void\n */\nfunction isScrollX(\n el: HTMLElement,\n e: PointerEvent,\n style: CSSStyleDeclaration,\n rect: DOMRect,\n state: SynthDragState\n): { left: boolean; right: boolean } {\n const threshold = 0.1;\n\n if (el === document.scrollingElement) {\n const canScrollLeft = el.scrollLeft > 0;\n const canScrollRight =\n el.scrollLeft + window.innerWidth < (state.rootScrollWidth || 0);\n\n return {\n right: canScrollRight && e.clientX > el.clientWidth * (1 - threshold),\n left: canScrollLeft && e.clientX < el.clientWidth * threshold,\n };\n }\n\n if (\n (style.overflowX === \"auto\" || style.overflowX === \"scroll\") &&\n el !== document.body &&\n el !== document.documentElement\n ) {\n const scrollWidth = el.scrollWidth;\n const offsetWidth = el.offsetWidth;\n const scrollLeft = el.scrollLeft;\n\n return {\n right:\n e.clientX > rect.left + offsetWidth * (1 - threshold) &&\n scrollLeft < scrollWidth - offsetWidth,\n left: e.clientX < rect.left + offsetWidth * threshold && scrollLeft > 0,\n };\n }\n\n return {\n right: false,\n left: false,\n };\n}\n\n/**\n * Check if the element is scrollable on the y axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param style - The style.\n * @param rect - The rect.\n *\n * @returns void\n */\nfunction isScrollY(\n el: HTMLElement,\n e: PointerEvent,\n style: CSSStyleDeclaration,\n rect: DOMRect\n): { up: boolean; down: boolean } {\n const threshold = 0.1;\n\n if (el === document.scrollingElement) {\n return {\n down: e.clientY > el.clientHeight * (1 - threshold),\n up: e.clientY < el.clientHeight * threshold,\n };\n }\n\n if (\n (style.overflowY === \"auto\" || style.overflowY === \"scroll\") &&\n el !== document.body &&\n el !== document.documentElement\n ) {\n const scrollHeight = el.scrollHeight;\n const offsetHeight = el.offsetHeight;\n const scrollTop = el.scrollTop;\n\n return {\n down:\n e.clientY > rect.top + offsetHeight * (1 - threshold) &&\n scrollTop < scrollHeight - offsetHeight,\n up: e.clientY < rect.top + offsetHeight * threshold && scrollTop > 0,\n };\n }\n\n return {\n down: false,\n up: false,\n };\n}\n\n/**\n * Scroll the element on the x axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param state - The state.\n * @param right - Whether to scroll right.\n *\n * @returns void\n */\nfunction scrollX(\n el: HTMLElement,\n e: PointerEvent,\n state: SynthDragState,\n right = true\n) {\n state.preventEnter = true;\n\n const incr = right ? 5 : -5;\n\n function scroll(el: HTMLElement) {\n el.scrollBy({ left: incr });\n\n moveNode(e, state, incr, 0);\n\n state.animationFrameIdX = requestAnimationFrame(scroll.bind(null, el));\n }\n\n state.animationFrameIdX = requestAnimationFrame(scroll.bind(null, el));\n}\n\n/**\n * Scroll the element on the y axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param state - The state.\n * @param up - Whether to scroll up.\n *\n * @returns void\n */\nfunction scrollY(\n el: Element,\n e: PointerEvent,\n state: SynthDragState,\n up = true\n) {\n state.preventEnter = true;\n\n const incr = up ? -5 : 5;\n\n function scroll() {\n el.scrollBy({ top: incr });\n\n moveNode(e, state, 0, incr);\n\n state.animationFrameIdY = requestAnimationFrame(scroll);\n }\n\n state.animationFrameIdY = requestAnimationFrame(scroll);\n}\n\n/**\n * Handle the synth scroll.\n *\n * @param coordinates - The coordinates.\n * @param e - The event.\n * @param state - The state.\n *\n * @returns void\n */\nfunction handleSynthScroll(\n coordinates: { x: number; y: number },\n e: PointerEvent,\n state: SynthDragState\n) {\n cancelSynthScroll(state);\n\n const scrollables: Record<\"x\" | \"y\", HTMLElement | null> = {\n x: null,\n y: null,\n };\n\n const els = document.elementsFromPoint(coordinates.x, coordinates.y);\n\n for (const el of els) {\n if (scrollables.x && scrollables.y) break;\n\n if (!(el instanceof HTMLElement)) continue;\n\n const rect = el.getBoundingClientRect();\n\n const style = window.getComputedStyle(el);\n\n if (!scrollables.x) {\n const { left, right } = isScrollX(el, e, style, rect, state);\n\n if (left || right) {\n scrollables.x = el;\n\n scrollX(el, e, state, right);\n }\n }\n\n if (!scrollables.y) {\n const { up, down } = isScrollY(el, e, style, rect);\n\n if (up || down) {\n scrollables.y = el;\n\n scrollY(el, e, state, up);\n }\n }\n }\n}\n\nexport function getElFromPoint(coordinates: {\n x: number;\n y: number;\n}): NodeFromPoint | ParentFromPoint | 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,\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,\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 });\n }\n\n return abortController;\n}\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\nexport function rect(el: HTMLElement) {\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() {\n const callbacks = new Map void>>();\n\n const emit = function (eventName: string, data: T) {\n if (!callbacks.get(eventName)) return;\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;\n const objB = valB as Record;\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// * Throttle a function.\n// *\n// * @param callback - The callback function to throttle.\n// * @param limit - The minimum time in milliseconds between function calls.\n// *\n// * @returns A throttled version of the callback function.\n// */\n//export function throttle(\n// callback: (...args: Args) => Return,\n// limit: number\n//): (...args: Args) => void {\n// let wait = false;\n// return function (...args: Args) {\n// if (!wait) {\n// callback.apply(null, args);\n// wait = true;\n// setTimeout(function () {\n// wait = false;\n// }, limit);\n// }\n// };\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 {\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 = {}) {\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(data: SetupNodeData) {\n if (!isDragState(state)) return;\n\n const duration = animationsConfig.duration || 150;\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);\n\n break;\n case \"above\":\n animate(data.node.el, slideDown, duration);\n\n break;\n case \"left\":\n animate(data.node.el, slideRight, duration);\n\n break;\n case \"right\":\n animate(data.node.el, slideLeft, duration);\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);\n } else if (xDiff > yDiff && !ascendingDirection) {\n animate(data.node.el, slideLeft, duration);\n }\n } else {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node.el, slideDown, duration);\n\n break;\n case \"above\":\n animate(data.node.el, slideUp, duration);\n\n break;\n case \"left\":\n animate(data.node.el, slideLeft, duration);\n\n break;\n case \"right\":\n animate(data.node.el, slideRight, duration);\n\n break;\n }\n }\n },\n };\n };\n}\n\nfunction animate(\n node: Node,\n animation: Keyframe[] | PropertyIndexedKeyframes,\n duration: number\n) {\n if (!state) return;\n\n state.preventEnter = true;\n\n node.animate(animation, {\n duration: duration,\n easing: \"ease-in-out\",\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 = {\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(insertConfig: InsertConfig) {\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 | SynthDragState\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\nfunction checkPosition(e: DragEvent | PointerEvent) {\n if (!isDragState(state)) return;\n\n const el = document.elementFromPoint(e.clientX, e.clientY);\n\n if (!(el instanceof HTMLElement)) return;\n\n if (!parents.has(el)) {\n const insertPoint = insertState.insertPoint;\n\n if (insertPoint?.el === el) return;\n\n if (insertPoint) insertPoint.el.style.display = \"none\";\n\n if (insertState.draggedOverParent) {\n removeClass(\n [insertState.draggedOverParent.el],\n insertState.draggedOverParent.data.config.dropZoneClass\n );\n }\n\n insertState.draggedOverNodes = [];\n\n insertState.draggedOverParent = null;\n\n state.currentParent = state.initialParent;\n }\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 const midpoint = nodeEdge + Math.abs(nodeEdge - otherEdge) / 2;\n\n return {\n y: isAscending ? [center, midpoint] : [midpoint, center],\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)) 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(data: NodeDragEventData) {\n const config = data.targetData.parent.data.config;\n\n if (!config.nativeDrag) return;\n\n data.e.preventDefault();\n}\n\nfunction processParentDragEvent(\n e: DragEvent | PointerEvent,\n targetData: ParentEventData[\"targetData\"],\n state: DragState,\n isNativeDrag: boolean\n) {\n const config = targetData.parent.data.config;\n\n if (!isNativeDrag && config.nativeDrag) return;\n\n pd(e);\n\n if (isNativeDrag) pd(e);\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 {\n moveOutside(realTargetParent, state);\n }\n\n state.currentParent = realTargetParent;\n}\n\nexport function handleParentDragover(\n data: ParentEventData,\n state: DragState\n) {\n processParentDragEvent(data.e as DragEvent, data.targetData, state, true);\n}\n\nexport function handleParentPointerover(data: PointeroverParentEvent) {\n const { detail } = data;\n\n const { state, targetData } = detail;\n\n if (state.scrolling) return;\n\n processParentDragEvent(detail.e, targetData, state, false);\n}\n\nexport function moveBetween(data: ParentRecord, state: DragState) {\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\n );\n }\n}\n\nfunction moveOutside(data: ParentRecord, state: DragState) {\n if (data.el === state.currentParent.el) return false;\n\n const targetConfig = data.data.config;\n\n if (state.draggedNode.el.contains(data.el)) return false;\n\n if (targetConfig.dropZone === false) return;\n\n const initialParentConfig = state.initialParent.data.config;\n\n if (targetConfig.accepts) {\n return targetConfig.accepts(\n data,\n state.initialParent,\n state.currentParent,\n state\n );\n } else if (\n !targetConfig.group ||\n targetConfig.group !== initialParentConfig.group\n ) {\n return false;\n }\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;\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;\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\n );\n }\n }\n}\n\nfunction findClosest(enabledNodes: NodeRecord[], state: DragState) {\n let foundRange: [NodeRecord, 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(\n parent: ParentRecord,\n insertState: InsertState\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, {\n position: \"absolute\",\n display: \"none\",\n });\n}\n\nfunction removeInsertPoint(insertState: InsertState) {\n if (insertState.insertPoint?.el) insertState.insertPoint.el.remove();\n\n insertState.insertPoint = null;\n}\n\nfunction positioninsertPoint(\n parent: ParentRecord,\n position: { x: number[]; y: number[]; vertical: boolean },\n ascending: boolean,\n node: NodeRecord,\n insertState: InsertState\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 if (position.vertical) {\n const topPosition =\n position.y[ascending ? 1 : 0] -\n insertState.insertPoint.el.getBoundingClientRect().height / 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 height: \"4px\",\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 width: \"4px\",\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 insertState.insertPoint.el.style.display = \"block\";\n}\n\nexport function handleParentDrop(_data: NodeDragEventData) {}\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(\n state: DragState | SynthDragState | BaseDragState\n) {\n if (!isDragState(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,\n previousValues: [...draggedParentValues],\n previousNodes: [...enabledNodes],\n nodes: [...state.initialParent.data.enabledNodes],\n values: [...newParentValues],\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes,\n previousPosition: originalIndex,\n position: index,\n state: state as DragState,\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[],\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[],\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[],\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[],\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 = {\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\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} from \"../../types\";\nimport {\n parents,\n parentValues,\n setParentValues,\n addNodeClass,\n isSynthDragState,\n removeClass,\n addClass,\n state,\n addEvents,\n isDragState,\n} from \"../../index\";\n\nexport const dropSwapState: DropSwapState = {\n draggedOverNodes: Array>(),\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(dropSwapConfig: DropSwapConfig = {}) {\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 | SynthDragState\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\nfunction updateDraggedOverNodes(\n data: PointeroverNodeEvent | NodeDragEventData,\n state: DragState | SynthDragState\n) {\n const targetData =\n \"detail\" in data ? data.detail.targetData : data.targetData;\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(\n data: NodeDragEventData,\n state: DragState\n) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\n\n updateDraggedOverNodes(data, state);\n}\n\nexport function handleParentDragover(\n data: ParentDragEventData,\n state: DragState\n) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\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(data: PointeroverParentEvent) {\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(data: PointeroverNodeEvent) {\n if (!isSynthDragState(data.detail.state)) return;\n\n updateDraggedOverNodes(data, data.detail.state);\n}\n\nfunction swapElements(\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(state: DragState | SynthDragState) {\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[],\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 } 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"],"mappings":"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","names":["handleEnd","handleNodeDragover","handleNodePointerover","handleParentDragover","handleParentPointerover","emit","on","state","insertState","state","draggedParentValues","documentController","handleNodeDragover","handleParentDragover","state","handleEnd","documentController","baseDragState","dragStateProps","nodes","emit","on","handleNodeDragover","handleParentDragover","handleEnd","handleNodePointerover","handleParentPointerover","draggedNodes","state","parent","x","scrollTimeout","node","scrollX","scrollY","className","el"]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/plugins/animations/index.ts","../src/plugins/insert/index.ts","../src/plugins/drop-or-swap/index.ts"],"sourcesContent":["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 ParentKeydownEventData,\n SynthDragStateProps,\n ParentRecord,\n EventHandlers,\n NodeFromPoint,\n ParentFromPoint,\n ParentDragEventData,\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>}\n */\nexport const parents: ParentsData = new WeakMap<\n HTMLElement,\n ParentData\n>();\n\n/**\n * Nodes are the draggable items and the direct descendants of the parents.\n *\n * @type {WeakMap>}\n */\nexport const nodes: NodesData = new WeakMap>();\n\n/**\n * Function to check if touch support is enabled.\n *\n * @returns {boolean}\n */\nfunction checkTouchSupport() {\n if (!isBrowser) return false;\n\n return \"ontouchstart\" in window || navigator.maxTouchPoints > 0;\n}\n\n/**\n * The base drag state.\n *\n * @type {BaseDragState}\n */\nconst baseDragState = {\n activeDescendant: undefined,\n affectedNodes: [],\n coordinates: {\n x: 0,\n y: 0,\n },\n currentTargetValue: undefined,\n on,\n emit,\n newActiveDescendant: undefined,\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};\n\n/**\n * The state of the drag and drop.\n *\n * @type {BaseDragState}\n */\nexport let state: BaseDragState = 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 * Abort controller for the window.\n */\nlet windowController: AbortController | undefined;\n\n/**\n * Timeout for the scroll.\n */\nlet scrollTimeout: ReturnType;\n\n/**\n * Variable to check if the device is touch.\n */\nlet touchDevice: boolean = false;\n\nexport function resetState() {\n const baseDragState = {\n activeDescendant: undefined,\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 };\n\n state = { ...baseDragState } as BaseDragState;\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(\n dragStateProps: (SynthDragStateProps & DragStateProps) | DragStateProps\n): DragState | SynthDragState {\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 | SynthDragState;\n}\n\n/**\n *\n */\nfunction handleRootPointerdown(_e: PointerEvent) {\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(e: PointerEvent) {\n pd(e);\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\n/**\n * If we are currently dragging, then let's prevent default on dragover to avoid\n * the default behavior of the browser on drop.\n */\nfunction handleRootDragover(e: DragEvent) {\n if (!isDragState(state)) return;\n\n pd(e);\n}\n\nfunction handleRootPointermove(e: PointerEvent) {\n if (!state.pointerDown) return;\n\n //pd(e);\n\n const config = state.pointerDown.parent.data.config;\n\n if (\n !isSynthDragState(state) &&\n (touchDevice || (!touchDevice && !config.nativeDrag))\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 synthDragState = initSynthDrag(\n state.pointerDown.node,\n state.pointerDown.parent,\n e,\n state,\n nodes\n );\n\n state.rootUserSelect = window.getComputedStyle(\n document.documentElement\n ).userSelect;\n\n document.body.style.userSelect = \"none\";\n\n synthMove(e, synthDragState);\n } else if (isSynthDragState(state)) {\n synthMove(e, state);\n }\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({\n parent,\n getValues,\n setValues,\n config = {},\n}: DragAndDrop): void {\n if (!isBrowser) return;\n\n touchDevice = checkTouchSupport();\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: (e: TouchEvent) => {\n if (isDragState(state) && e.cancelable) pd(e);\n },\n });\n\n const liveRegion = document.createElement(\"div\");\n\n setAttrs(liveRegion, {\n \"aria-live\": \"polite\",\n \"aria-atomic\": \"true\",\n \"data-dnd-live-region\": \"true\",\n });\n\n Object.assign(liveRegion.style, {\n position: \"absolute\",\n top: \"0px\",\n left: \"-9999px\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: \"0\",\n });\n\n document.body.appendChild(liveRegion);\n }\n\n if (!windowController)\n windowController = addEvents(window, {\n resize: () => {\n touchDevice = checkTouchSupport();\n },\n });\n\n tearDown(parent);\n\n const [emit, on] = createEmitter();\n\n const parentData: ParentData = {\n getValues,\n setValues,\n config: {\n dragDropEffect: config.dragDropEffect ?? \"move\",\n dragEffectAllowed: config.dragEffectAllowed ?? \"move\",\n draggedNodes,\n dragstartClasses,\n deepCopyStyles: config.deepCopyStyles ?? false,\n handleNodeKeydown,\n handleParentKeydown,\n handleDragstart,\n handleNodeDragover,\n handleParentDragover,\n handleNodeDrop,\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(\n node: NodeRecord,\n parent: ParentRecord,\n e: PointerEvent | DragEvent,\n draggedNodes: Array>,\n offsetX?: number,\n offsetY?: number\n): DragStateProps {\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 // Need to account for if the explicity offset is positive or negative\n startLeft: offsetX ? offsetX : x - rect.left,\n startTop: offsetY ? offsetY : y - rect.top,\n targetIndex: node.data.index,\n transferred: false,\n };\n}\n\nexport function performSort({\n parent,\n draggedNodes,\n targetNodes,\n}: {\n parent: ParentRecord;\n draggedNodes: Array>;\n targetNodes: Array>;\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,\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,\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(\n parent: ParentRecord,\n newActiveNode: NodeRecord | undefined,\n state: BaseDragState\n) {\n const activeDescendantClass = parent.data.config.activeDescendantClass;\n\n if (state.activeState) {\n {\n removeClass([state.activeState.node.el], activeDescendantClass);\n\n if (state.activeState.parent.el !== parent.el)\n state.activeState.parent.el.setAttribute(\"aria-activedescendant\", \"\");\n }\n }\n\n if (!newActiveNode) {\n state.activeState?.parent.el.setAttribute(\"aria-activedescendant\", \"\");\n\n state.activeState = undefined;\n\n return;\n }\n\n state.activeState = {\n node: newActiveNode,\n parent,\n };\n\n addNodeClass([newActiveNode.el], activeDescendantClass);\n\n state.activeState.parent.el.setAttribute(\n \"aria-activedescendant\",\n state.activeState.node.el.id\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>} nodes - The nodes to deselect.\n * @param {ParentRecord} parent - The parent record.\n * @param {BaseDragState} state - The current drag state.\n */\nfunction deselect(\n nodes: Array>,\n parent: ParentRecord,\n state: BaseDragState\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 clearLiveRegion(parent);\n}\n\n/**\n * This function sets the selected nodes. This will clean the prior selected state\n * as well as removing any classes or attributes set.\n *\n * @param {ParentRecord} parent - The parent record.\n * @param {Array>} selectedNodes - The nodes to select.\n * @param {NodeRecord | undefined} newActiveNode - The new active node.\n * @param {BaseDragState} state - The current drag state.\n * @param {boolean} pointerdown - Whether the pointerdown event was triggered.\n */\nfunction setSelected(\n parent: ParentRecord,\n selectedNodes: Array>,\n newActiveNode: NodeRecord | undefined,\n state: BaseDragState,\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 const selectedItems = selectedNodes.map((x) =>\n x.el.getAttribute(\"aria-label\")\n );\n\n if (selectedItems.length === 0) {\n state.selectedState = undefined;\n\n clearLiveRegion(parent);\n\n return;\n }\n\n setActive(parent, newActiveNode, state);\n\n updateLiveRegion(\n parent,\n `${selectedItems.join(\n \", \"\n )} ready for dragging. Use arrow keys to navigate. Press enter to drop ${selectedItems.join(\n \", \"\n )}.`\n );\n}\n\nfunction updateLiveRegion(parent: ParentRecord, message: string) {\n const liveRegion = document.querySelector('[data-dnd-live-region=\"true\"]');\n\n if (!liveRegion) return;\n\n liveRegion.id = parent.el.id + \"-live-region\";\n\n liveRegion.textContent = message;\n}\n\nfunction clearLiveRegion(parent: ParentRecord) {\n const liveRegion = document.getElementById(parent.el.id + \"-live-region\");\n\n if (!liveRegion) return;\n\n liveRegion.textContent = \"\";\n}\n\nexport function handleParentFocus(\n data: ParentEventData,\n state: BaseDragState | DragState | SynthDragState\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({\n currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n initialIndex,\n targetNodes,\n state,\n}: {\n currentParent: ParentRecord;\n targetParent: ParentRecord;\n initialParent: ParentRecord;\n draggedNodes: Array>;\n initialIndex: number;\n state: BaseDragState | DragState | SynthDragState;\n targetNodes: Array>;\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(\n parent: HTMLElement,\n parentData: ParentData\n): Array {\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(\n parent: HTMLElement,\n parentData: ParentData,\n values: Array\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(state: DragState): Array {\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(\n parent: HTMLElement,\n config: Partial>\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(\n data: ParentEventData,\n state: DragState\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 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(\n state: BaseDragState\n): state is DragState | SynthDragState {\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(\n state: BaseDragState\n): state is SynthDragState {\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(parent: HTMLElement, parentData: ParentData): void {\n parentData.abortControllers.mainParent = addEvents(parent, {\n keydown: parentEventData(parentData.config.handleParentKeydown),\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 };\n\n draggableItem.draggable = true;\n },\n }\n );\n }\n\n if (parent.id)\n setAttrs(parent, {\n role: \"listbox\",\n tabindex: \"0\",\n \"aria-multiselectable\": parentData.config.multiDrag ? \"true\" : \"false\",\n \"aria-activedescendant\": \"\",\n \"aria-describedby\": parent.id + \"-live-region\",\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) {\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(data: SetupNodeData) {\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 pointerup: nodeEventData(config.handleNodePointerup),\n pointercancel: nodeEventData(config.handlePointercancel),\n\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 (touchDevice) pd(e);\n },\n });\n\n data.node.el.setAttribute(\"role\", \"option\");\n\n data.node.el.setAttribute(\"aria-selected\", \"false\");\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(data: SetupNodeData) {\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(node: Node, parentData: ParentData) {\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(data: TearDownNodeData) {\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(data: TearDownNodeData) {\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 allSelectedAndActiveNodes = document.querySelectorAll(\n `[aria-selected=\"true\"]`\n );\n\n const parentData = parents.get(parentEl);\n\n if (!parentData) return;\n\n for (let x = 0; x < allSelectedAndActiveNodes.length; x++) {\n const node = allSelectedAndActiveNodes[x];\n\n node.setAttribute(\"aria-selected\", \"false\");\n\n removeClass([node], parentData.config.selectedClass);\n }\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(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 = [];\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 }\n }\n\n if (\n enabledNodes.length !== parentData.getValues(parent).length &&\n !config.disabled\n ) {\n console.warn(\n \"The number of draggable items defined in the parent element does not match the number of values. This may cause unexpected behavior.\"\n );\n\n return;\n }\n\n const values = parentData.getValues(parent);\n\n const enabledNodeRecords: Array> = [];\n\n for (let x = 0; x < enabledNodes.length; x++) {\n const node = enabledNodes[x];\n\n const prevNodeData = nodes.get(node);\n\n if (config.draggableValue && !config.draggableValue(values[x])) continue;\n\n const nodeData = Object.assign(\n prevNodeData ?? {\n privateClasses: [],\n abortControllers: {},\n },\n {\n value: values[x],\n index: x,\n }\n );\n\n if (\n !isDragState(state) &&\n state.newActiveDescendant &&\n eq(state.newActiveDescendant.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 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): 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(pointerDown: {\n parent: ParentRecord;\n node: NodeRecord;\n}): Array> {\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>),\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(_data: ParentEventData) {\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(\n data: NodeDragEventData,\n _state: BaseDragState\n) {\n const config = data.targetData.parent.data.config;\n\n if (\n !config.nativeDrag ||\n !validateDragstart(data) ||\n !validateDragHandle({\n x: data.e.clientX,\n y: data.e.clientY,\n node: data.targetData.node,\n config,\n })\n ) {\n pd(data.e);\n\n return;\n }\n\n const nodes = config.draggedNodes({\n parent: data.targetData.parent,\n node: 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 config.onDragstart({\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}\n\nexport function handleNodePointerdown(\n data: NodePointerEventData,\n state: BaseDragState\n) {\n sp(data.e);\n\n if (\n !validateDragHandle({\n x: data.e.clientX,\n y: data.e.clientY,\n node: data.targetData.node,\n config: data.targetData.parent.data.config,\n })\n )\n return;\n\n state.pointerDown = {\n parent: data.targetData.parent,\n node: data.targetData.node,\n };\n\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 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 && touchDevice) {\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(\n _node: NodeRecord,\n nodes: Array>,\n config: ParentConfig,\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.activeDescendantClass\n );\n\n removeClass(\n nodes.map((x) => x.el),\n config.selectedClass\n );\n });\n}\n\n/**\n * Initialize the drag state.\n *\n * @param data - The node drag event data.\n * @param draggedNodes - The dragged nodes.\n *\n * @returns The drag state.\n */\nexport function initDrag(\n data: NodeDragEventData,\n draggedNodes: Array>\n): DragState {\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\n data.e.dataTransfer.effectAllowed = config.dragEffectAllowed;\n\n let dragImage: HTMLElement | undefined;\n\n if (config.dragImage) {\n dragImage = config.dragImage(data, draggedNodes);\n } else {\n if (!config.multiDrag) {\n data.e.dataTransfer.setDragImage(\n data.targetData.node.el,\n data.e.offsetX,\n data.e.offsetY\n );\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n return dragState;\n } else {\n const wrapper = document.createElement(\"div\");\n\n for (const node of draggedNodes) {\n const clonedNode = node.el.cloneNode(true) as HTMLElement;\n\n clonedNode.style.pointerEvents = \"none\";\n\n clonedNode.id = node.el.id + \"-clone\";\n\n wrapper.append(clonedNode);\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 });\n\n dragImage = wrapper;\n }\n\n document.body.appendChild(dragImage);\n }\n\n data.e.dataTransfer.setDragImage(dragImage, data.e.offsetX, data.e.offsetY);\n\n setTimeout(() => {\n dragImage?.remove();\n });\n }\n\n return dragState;\n}\n\nexport function validateDragHandle({\n x,\n y,\n node,\n config,\n}: {\n x: number;\n y: number;\n node: NodeRecord;\n config: ParentConfig;\n}): boolean {\n if (config.externalDragHandle) return false;\n\n if (!config.dragHandle) return true;\n\n const dragHandles = node.el.querySelectorAll(config.dragHandle);\n\n if (!dragHandles) return false;\n\n const elFromPoint = config.root.elementFromPoint(x, y);\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(_data: NodeEventData) {}\n\nexport function handleClickParent(_data: ParentEventData) {}\n\nexport function handleNodeKeydown(_data: NodeEventData) {}\n\nexport function handleParentKeydown(\n data: ParentKeydownEventData,\n state: BaseDragState\n) {\n const activeDescendant = state.activeState?.node;\n\n if (!activeDescendant) return;\n\n const parentData = data.targetData.parent.data;\n\n const enabledNodes = parentData.enabledNodes;\n\n if (!(data.e.target instanceof HTMLElement)) return;\n const index = enabledNodes.findIndex((x) => x.el === activeDescendant.el);\n\n if (index === -1) return;\n\n if (\n [\"ArrowDown\", \"ArrowUp\", \"ArrowRight\", \"ArrowLeft\"].includes(data.e.key)\n ) {\n pd(data.e);\n\n const nextIndex =\n data.e.key === \"ArrowDown\" || data.e.key === \"ArrowRight\"\n ? index + 1\n : index - 1;\n\n if (nextIndex < 0 || nextIndex >= enabledNodes.length) return;\n\n const nextNode = enabledNodes[nextIndex];\n\n setActive(data.targetData.parent, nextNode, state);\n } else if (data.e.key === \" \") {\n pd(data.e);\n\n state.selectedState && state.selectedState.nodes.includes(activeDescendant)\n ? setSelected(\n data.targetData.parent,\n state.selectedState.nodes.filter((x) => x.el !== activeDescendant.el),\n activeDescendant,\n state\n )\n : setSelected(\n data.targetData.parent,\n [activeDescendant],\n activeDescendant,\n state\n );\n } else if (data.e.key === \"Enter\" && state.selectedState) {\n if (\n state.selectedState.parent.el === data.targetData.parent.el &&\n state.activeState\n ) {\n if (state.selectedState.nodes[0].el === state.activeState.node.el) {\n updateLiveRegion(data.targetData.parent, \"Cannot drop item on itself\");\n\n return;\n }\n\n state.newActiveDescendant = state.selectedState.nodes[0];\n\n parentData.config.performSort({\n parent: data.targetData.parent,\n draggedNodes: state.selectedState.nodes,\n targetNodes: [state.activeState.node],\n });\n\n deselect([], data.targetData.parent, state);\n\n updateLiveRegion(data.targetData.parent, \"Drop successful\");\n } else if (\n state.activeState &&\n state.selectedState.parent.el !== data.targetData.parent.el &&\n validateTransfer({\n currentParent: data.targetData.parent,\n targetParent: state.selectedState.parent,\n initialParent: state.selectedState.parent,\n draggedNodes: state.selectedState.nodes,\n state,\n })\n ) {\n parentData.config.performTransfer({\n currentParent: state.selectedState.parent,\n targetParent: data.targetData.parent,\n initialParent: state.selectedState.parent,\n draggedNodes: state.selectedState.nodes,\n initialIndex: state.selectedState.nodes[0].data.index,\n state,\n targetNodes: [state.activeState.node],\n });\n\n state.newActiveDescendant = state.selectedState.nodes[0];\n\n setSelected(data.targetData.parent, [], undefined, state);\n\n updateLiveRegion(data.targetData.parent, \"Drop successful\");\n }\n }\n}\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;\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(e: PointeroverNodeEvent) {\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(\n data: NodeDragEventData,\n state: DragState | SynthDragState\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\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(\n data: NodeDragEventData,\n state: DragState\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(\n data: NodeEventData,\n state: DragState | SynthDragState | BaseDragState\n) {\n if (!isSynthDragState(state)) return;\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(state: DragState | SynthDragState) {\n if (state.draggedNode) state.draggedNode.el.draggable = false;\n\n document.body.style.userSelect = state.rootUserSelect || \"\";\n\n if (isSynthDragState(state)) {\n document.documentElement.style.overscrollBehavior =\n state.rootOverScrollBehavior || \"\";\n\n document.documentElement.style.touchAction = state.rootTouchAction || \"\";\n }\n\n if (isSynthDragState(state)) cancelSynthScroll(state);\n\n if (\"longPressTimeout\" in state && state.longPressTimeout)\n clearTimeout(state.longPressTimeout);\n\n const config = parents.get(state.initialParent.el)?.config;\n\n const isSynth = isSynthDragState(state);\n\n const dropZoneClass = isSynth\n ? config?.synthDropZoneClass\n : config?.dropZoneClass;\n\n if (state.originalZIndex !== undefined)\n state.draggedNode.el.style.zIndex = state.originalZIndex;\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n state.initialParent.data?.config?.longPressClass\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n isSynth\n ? state.initialParent.data.config.synthDragPlaceholderClass\n : state.initialParent.data?.config?.dragPlaceholderClass\n );\n\n if (isSynth) state.clonedDraggedNode.remove();\n\n deselect(state.draggedNodes, state.currentParent, state);\n\n setActive(state.currentParent, undefined, state);\n\n resetState();\n\n state.selectedState = undefined;\n\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 state.emit(\"dragEnded\", state);\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(\n data: NodePointerEventData,\n state: DragState | SynthDragState | BaseDragState\n) {\n sp(data.e);\n\n state.pointerDown = undefined;\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 removeClass(\n data.targetData.parent.data.enabledNodes.map((x) => x.el),\n config.longPressClass\n );\n\n if (!isDragState(state)) return;\n\n config.handleEnd(state as DragState | SynthDragState);\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 *\n * @returns The synth drag state.\n */\nfunction initSynthDrag(\n node: NodeRecord,\n parent: ParentRecord,\n e: PointerEvent,\n _state: BaseDragState,\n draggedNodes: Array>\n): SynthDragState {\n const config = parent.data.config;\n\n let dragImage: HTMLElement | undefined;\n\n let display = node.el.style.display;\n\n let result = undefined;\n\n if (config.synthDragImage) {\n result = config.synthDragImage(node, parent, e, draggedNodes);\n\n dragImage = result.dragImage;\n\n dragImage.setAttribute(\"popover\", \"manual\");\n\n dragImage.id = \"dnd-dragged-node-clone\";\n\n display = dragImage.style.display;\n\n Object.assign(dragImage.style, {\n position: \"absolute\",\n zIndex: 9999,\n pointerEvents: \"none\",\n margin: 0,\n willChange: \"transform\",\n overflow: \"hidden\",\n display: \"none\",\n });\n } else {\n if (!config.multiDrag || draggedNodes.length === 1) {\n dragImage = node.el.cloneNode(true) as HTMLElement;\n\n dragImage.id = \"dnd-dragged-node-clone\";\n\n display = dragImage.style.display;\n\n dragImage.setAttribute(\"popover\", \"manual\");\n\n Object.assign(dragImage.style, {\n position: \"absolute\",\n height: node.el.getBoundingClientRect().height + \"px\",\n width: node.el.getBoundingClientRect().width + \"px\",\n overflow: \"hidden\",\n margin: 0,\n willChange: \"transform\",\n pointerEvents: \"none\",\n zIndex: 9999,\n });\n } else {\n const wrapper = document.createElement(\"div\");\n\n wrapper.setAttribute(\"popover\", \"manual\");\n\n for (const node of draggedNodes) {\n const clonedNode = node.el.cloneNode(true) as HTMLElement;\n\n clonedNode.style.pointerEvents = \"none\";\n\n wrapper.append(clonedNode);\n }\n\n display = wrapper.style.display;\n\n wrapper.id = \"dnd-dragged-node-clone\";\n\n dragImage = wrapper;\n\n Object.assign(dragImage.style, {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"absolute\",\n overflow: \"hidden\",\n margin: 0,\n padding: 0,\n pointerEvents: \"none\",\n zIndex: 9999,\n });\n }\n }\n\n dragImage.style.position = \"absolute\";\n\n parent.el.appendChild(dragImage);\n\n dragImage.showPopover();\n\n const synthDragStateProps = {\n clonedDraggedEls: [],\n clonedDraggedNode: dragImage,\n draggedNodeDisplay: display,\n synthDragScrolling: false,\n synthDragging: true,\n rootScrollWidth: document.scrollingElement?.scrollWidth,\n rootScrollHeight: document.scrollingElement?.scrollHeight,\n rootOverScrollBehavior: document.documentElement.style.overscrollBehavior,\n rootTouchAction: document.documentElement.style.touchAction,\n };\n\n document.documentElement.style.overscrollBehavior = \"none\";\n\n document.documentElement.style.touchAction = \"none\";\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;\n\n synthDragState.clonedDraggedNode.style.display =\n synthDragState.draggedNodeDisplay || \"\";\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(\n data: NodePointerEventData,\n state: BaseDragState,\n node: NodeRecord\n) {\n const config = data.targetData.parent.data.config;\n\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 || 200);\n}\n\nfunction pointermoveClasses(\n state: SynthDragState,\n config: ParentConfig\n) {\n if (config.longPressClass)\n removeClass(\n state.draggedNodes.map((x) => x.el),\n config?.longPressClass\n );\n}\n\nfunction cancelSynthScroll(\n state: SynthDragState,\n cancelX = true,\n cancelY = true\n) {\n if (cancelX && state.animationFrameIdX !== undefined) {\n cancelAnimationFrame(state.animationFrameIdX);\n\n state.animationFrameIdX = undefined;\n }\n\n if (cancelY && state.animationFrameIdY !== undefined) {\n cancelAnimationFrame(state.animationFrameIdY);\n\n state.animationFrameIdY = undefined;\n }\n\n if (!state.animationFrameIdX && !state.animationFrameIdY) {\n state.preventEnter = false;\n }\n}\n\nfunction moveNode(\n e: PointerEvent,\n state: SynthDragState,\n scrollX = 0,\n scrollY = 0\n) {\n const { x, y } = eventCoordinates(e);\n\n state.coordinates.y = y;\n state.coordinates.x = x;\n\n const startLeft = state.startLeft ?? 0;\n const startTop = state.startTop ?? 0;\n\n console.log(\"window scroll y\", window.scrollY);\n console.log(\"start top\", startTop);\n\n // Calculate the translation values\n const translateX = x - startLeft + window.scrollX;\n const translateY = y - startTop + window.scrollY;\n\n // Apply the transform using translate\n state.clonedDraggedNode.style.transform = `translate(${\n translateX + scrollX\n }px, ${translateY + scrollY}px)`;\n\n console.log(\"translate y\", translateY + scrollY);\n\n if (e.cancelable) pd(e);\n\n pointermoveClasses(state, state.initialParent.data.config);\n}\n\n/**\n * Handle the synth move.\n *\n * @param e - The pointer event.\n * @param state - The synth drag state.\n *\n * @returns void\n */\nexport function synthMove(e: PointerEvent, state: SynthDragState) {\n moveNode(e, state);\n\n const coordinates = eventCoordinates(e);\n\n handleSynthScroll(coordinates, e, state);\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 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(\n data: NodeDragEventData,\n state: DragState\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 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(\n data: ParentDragEventData,\n state: DragState\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 Object.assign(eventCoordinates(data.e));\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(e: PointeroverParentEvent) {\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({\n currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n state,\n}: {\n currentParent: ParentRecord;\n targetParent: ParentRecord;\n initialParent: ParentRecord;\n draggedNodes: Array>;\n state: BaseDragState;\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(\n data: NodeDragEventData,\n _state: DragState\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(\n data: NodeDragEventData,\n _state: DragState\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(\n data: NodeDragEventData | NodePointerEventData,\n state: DragState,\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(\n data: NodeDragEventData | NodePointerEventData,\n state: DragState\n) {\n const { x, y } = eventCoordinates(data.e);\n\n if (!validateSort(data, state, x, y)) return;\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(\n callback: any\n): (e: Event) => NodeEventData | undefined {\n function nodeTargetData(node: Node): NodeTargetData | 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(\n data: NodeEventData | ParentEventData,\n state: DragState\n): void {\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(\n callback: any\n): (e: Event) => NodeEventData | undefined {\n function parentTargetData(\n parent: HTMLElement\n ): ParentTargetData | 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,\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(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n function nodeSetter(node: Node, nodeData: NodeData) {\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);\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(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n function parentSetter(parent: HTMLElement, parentData: ParentData) {\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);\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 | ParentData | undefined,\n omitAppendPrivateClass = false\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n if (classNames.includes(\"longPress\")) return;\n\n if (!data) {\n el.classList.add(...classNames);\n\n return;\n }\n\n const privateClasses = [];\n\n for (const className of classNames) {\n if (!el.classList.contains(className)) {\n el.classList.add(className);\n } else if (\n el.classList.contains(className) &&\n omitAppendPrivateClass === false\n ) {\n privateClasses.push(className);\n }\n }\n\n data.privateClasses = privateClasses;\n\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,\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\n/**\n * Check if the element is scrollable on the x axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param style - The style.\n * @param rect - The rect.\n * @param state - The state.\n *\n * @returns void\n */\nfunction isScrollX(\n el: HTMLElement,\n e: PointerEvent,\n style: CSSStyleDeclaration,\n rect: DOMRect,\n state: SynthDragState\n): { left: boolean; right: boolean } {\n const threshold = 0.1;\n\n if (el === document.scrollingElement) {\n const canScrollLeft = el.scrollLeft > 0;\n const canScrollRight =\n el.scrollLeft + window.innerWidth < (state.rootScrollWidth || 0);\n\n return {\n right: canScrollRight && e.clientX > el.clientWidth * (1 - threshold),\n left: canScrollLeft && e.clientX < el.clientWidth * threshold,\n };\n }\n\n if (\n (style.overflowX === \"auto\" || style.overflowX === \"scroll\") &&\n el !== document.body &&\n el !== document.documentElement\n ) {\n const scrollWidth = el.scrollWidth;\n const offsetWidth = el.offsetWidth;\n const scrollLeft = el.scrollLeft;\n\n return {\n right:\n e.clientX > rect.left + offsetWidth * (1 - threshold) &&\n scrollLeft < scrollWidth - offsetWidth,\n left: e.clientX < rect.left + offsetWidth * threshold && scrollLeft > 0,\n };\n }\n\n return {\n right: false,\n left: false,\n };\n}\n\n/**\n * Check if the element is scrollable on the y axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param style - The style.\n * @param rect - The rect.\n *\n * @returns void\n */\nfunction isScrollY(\n el: HTMLElement,\n e: PointerEvent,\n style: CSSStyleDeclaration,\n rect: DOMRect\n): { up: boolean; down: boolean } {\n const threshold = 0.1;\n\n if (el === document.scrollingElement) {\n return {\n down: e.clientY > el.clientHeight * (1 - threshold),\n up: e.clientY < el.clientHeight * threshold,\n };\n }\n\n if (\n (style.overflowY === \"auto\" || style.overflowY === \"scroll\") &&\n el !== document.body &&\n el !== document.documentElement\n ) {\n const scrollHeight = el.scrollHeight;\n const offsetHeight = el.offsetHeight;\n const scrollTop = el.scrollTop;\n\n return {\n down:\n e.clientY > rect.top + offsetHeight * (1 - threshold) &&\n scrollTop < scrollHeight - offsetHeight,\n up: e.clientY < rect.top + offsetHeight * threshold && scrollTop > 0,\n };\n }\n\n return {\n down: false,\n up: false,\n };\n}\n\n/**\n * Scroll the element on the x axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param state - The state.\n * @param right - Whether to scroll right.\n *\n * @returns void\n */\nfunction scrollX(\n el: HTMLElement,\n e: PointerEvent,\n state: SynthDragState,\n right = true\n) {\n state.preventEnter = true;\n\n const incr = right ? 5 : -5;\n\n function scroll(el: HTMLElement) {\n el.scrollBy({ left: incr });\n\n moveNode(e, state, incr, 0);\n\n state.animationFrameIdX = requestAnimationFrame(scroll.bind(null, el));\n }\n\n state.animationFrameIdX = requestAnimationFrame(scroll.bind(null, el));\n}\n\n/**\n * Scroll the element on the y axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param state - The state.\n * @param up - Whether to scroll up.\n *\n * @returns void\n */\nfunction scrollY(\n el: Element,\n e: PointerEvent,\n state: SynthDragState,\n up = true\n) {\n state.preventEnter = true;\n\n const incr = up ? -5 : 5;\n\n function scroll() {\n el.scrollBy({ top: incr });\n\n moveNode(e, state, 0, incr);\n\n state.animationFrameIdY = requestAnimationFrame(scroll);\n }\n\n state.animationFrameIdY = requestAnimationFrame(scroll);\n}\n\n/**\n * Handle the synth scroll.\n *\n * @param coordinates - The coordinates.\n * @param e - The event.\n * @param state - The state.\n *\n * @returns void\n */\nfunction handleSynthScroll(\n coordinates: { x: number; y: number },\n e: PointerEvent,\n state: SynthDragState\n) {\n cancelSynthScroll(state);\n\n const scrollables: Record<\"x\" | \"y\", HTMLElement | null> = {\n x: null,\n y: null,\n };\n\n const els = document.elementsFromPoint(coordinates.x, coordinates.y);\n\n for (const el of els) {\n if (scrollables.x && scrollables.y) break;\n\n if (!(el instanceof HTMLElement)) continue;\n\n const rect = el.getBoundingClientRect();\n\n const style = window.getComputedStyle(el);\n\n if (!scrollables.x) {\n const { left, right } = isScrollX(el, e, style, rect, state);\n\n if (left || right) {\n scrollables.x = el;\n\n scrollX(el, e, state, right);\n }\n }\n\n if (!scrollables.y) {\n const { up, down } = isScrollY(el, e, style, rect);\n\n if (up || down) {\n scrollables.y = el;\n\n scrollY(el, e, state, up);\n }\n }\n }\n}\n\nexport function getElFromPoint(coordinates: {\n x: number;\n y: number;\n}): NodeFromPoint | ParentFromPoint | 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,\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,\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 });\n }\n\n return abortController;\n}\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\nexport function rect(el: HTMLElement) {\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() {\n const callbacks = new Map void>>();\n\n const emit = function (eventName: string, data: T) {\n if (!callbacks.get(eventName)) return;\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;\n const objB = valB as Record;\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// * Throttle a function.\n// *\n// * @param callback - The callback function to throttle.\n// * @param limit - The minimum time in milliseconds between function calls.\n// *\n// * @returns A throttled version of the callback function.\n// */\n//export function throttle(\n// callback: (...args: Args) => Return,\n// limit: number\n//): (...args: Args) => void {\n// let wait = false;\n// return function (...args: Args) {\n// if (!wait) {\n// callback.apply(null, args);\n// wait = true;\n// setTimeout(function () {\n// wait = false;\n// }, limit);\n// }\n// };\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 {\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 = {}) {\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(data: SetupNodeData) {\n if (!isDragState(state)) return;\n\n const duration = animationsConfig.duration || 150;\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);\n\n break;\n case \"above\":\n animate(data.node.el, slideDown, duration);\n\n break;\n case \"left\":\n animate(data.node.el, slideRight, duration);\n\n break;\n case \"right\":\n animate(data.node.el, slideLeft, duration);\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);\n } else if (xDiff > yDiff && !ascendingDirection) {\n animate(data.node.el, slideLeft, duration);\n }\n } else {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node.el, slideDown, duration);\n\n break;\n case \"above\":\n animate(data.node.el, slideUp, duration);\n\n break;\n case \"left\":\n animate(data.node.el, slideLeft, duration);\n\n break;\n case \"right\":\n animate(data.node.el, slideRight, duration);\n\n break;\n }\n }\n },\n };\n };\n}\n\nfunction animate(\n node: Node,\n animation: Keyframe[] | PropertyIndexedKeyframes,\n duration: number\n) {\n if (!state) return;\n\n state.preventEnter = true;\n\n node.animate(animation, {\n duration: duration,\n easing: \"ease-in-out\",\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 = {\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(insertConfig: InsertConfig) {\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 | SynthDragState\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\nfunction checkPosition(e: DragEvent | PointerEvent) {\n if (!isDragState(state)) return;\n\n const el = document.elementFromPoint(e.clientX, e.clientY);\n\n if (!(el instanceof HTMLElement)) return;\n\n if (!parents.has(el)) {\n const insertPoint = insertState.insertPoint;\n\n if (insertPoint?.el === el) return;\n\n if (insertPoint) insertPoint.el.style.display = \"none\";\n\n if (insertState.draggedOverParent) {\n removeClass(\n [insertState.draggedOverParent.el],\n insertState.draggedOverParent.data.config.dropZoneClass\n );\n }\n\n insertState.draggedOverNodes = [];\n\n insertState.draggedOverParent = null;\n\n state.currentParent = state.initialParent;\n }\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 const midpoint = nodeEdge + Math.abs(nodeEdge - otherEdge) / 2;\n\n return {\n y: isAscending ? [center, midpoint] : [midpoint, center],\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)) 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(data: NodeDragEventData) {\n const config = data.targetData.parent.data.config;\n\n if (!config.nativeDrag) return;\n\n data.e.preventDefault();\n}\n\nfunction processParentDragEvent(\n e: DragEvent | PointerEvent,\n targetData: ParentEventData[\"targetData\"],\n state: DragState,\n isNativeDrag: boolean\n) {\n const config = targetData.parent.data.config;\n\n if (!isNativeDrag && config.nativeDrag) return;\n\n pd(e);\n\n if (isNativeDrag) pd(e);\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 {\n moveOutside(realTargetParent, state);\n }\n\n state.currentParent = realTargetParent;\n}\n\nexport function handleParentDragover(\n data: ParentEventData,\n state: DragState\n) {\n processParentDragEvent(data.e as DragEvent, data.targetData, state, true);\n}\n\nexport function handleParentPointerover(data: PointeroverParentEvent) {\n const { detail } = data;\n\n const { state, targetData } = detail;\n\n if (state.scrolling) return;\n\n processParentDragEvent(detail.e, targetData, state, false);\n}\n\nexport function moveBetween(data: ParentRecord, state: DragState) {\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\n );\n }\n}\n\nfunction moveOutside(data: ParentRecord, state: DragState) {\n if (data.el === state.currentParent.el) return false;\n\n const targetConfig = data.data.config;\n\n if (state.draggedNode.el.contains(data.el)) return false;\n\n if (targetConfig.dropZone === false) return;\n\n const initialParentConfig = state.initialParent.data.config;\n\n if (targetConfig.accepts) {\n return targetConfig.accepts(\n data,\n state.initialParent,\n state.currentParent,\n state\n );\n } else if (\n !targetConfig.group ||\n targetConfig.group !== initialParentConfig.group\n ) {\n return false;\n }\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;\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;\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\n );\n }\n }\n}\n\nfunction findClosest(enabledNodes: NodeRecord[], state: DragState) {\n let foundRange: [NodeRecord, 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(\n parent: ParentRecord,\n insertState: InsertState\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, {\n position: \"absolute\",\n display: \"none\",\n });\n}\n\nfunction removeInsertPoint(insertState: InsertState) {\n if (insertState.insertPoint?.el) insertState.insertPoint.el.remove();\n\n insertState.insertPoint = null;\n}\n\nfunction positioninsertPoint(\n parent: ParentRecord,\n position: { x: number[]; y: number[]; vertical: boolean },\n ascending: boolean,\n node: NodeRecord,\n insertState: InsertState\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 if (position.vertical) {\n const topPosition =\n position.y[ascending ? 1 : 0] -\n insertState.insertPoint.el.getBoundingClientRect().height / 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 height: \"4px\",\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 width: \"4px\",\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 insertState.insertPoint.el.style.display = \"block\";\n}\n\nexport function handleParentDrop(_data: NodeDragEventData) {}\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(\n state: DragState | SynthDragState | BaseDragState\n) {\n if (!isDragState(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,\n previousValues: [...draggedParentValues],\n previousNodes: [...enabledNodes],\n nodes: [...state.initialParent.data.enabledNodes],\n values: [...newParentValues],\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes,\n previousPosition: originalIndex,\n position: index,\n state: state as DragState,\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[],\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[],\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[],\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[],\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 = {\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\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} from \"../../types\";\nimport {\n parents,\n parentValues,\n setParentValues,\n addNodeClass,\n isSynthDragState,\n removeClass,\n addClass,\n state,\n addEvents,\n isDragState,\n} from \"../../index\";\n\nexport const dropSwapState: DropSwapState = {\n draggedOverNodes: Array>(),\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(dropSwapConfig: DropSwapConfig = {}) {\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 | SynthDragState\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\nfunction updateDraggedOverNodes(\n data: PointeroverNodeEvent | NodeDragEventData,\n state: DragState | SynthDragState\n) {\n const targetData =\n \"detail\" in data ? data.detail.targetData : data.targetData;\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(\n data: NodeDragEventData,\n state: DragState\n) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\n\n updateDraggedOverNodes(data, state);\n}\n\nexport function handleParentDragover(\n data: ParentDragEventData,\n state: DragState\n) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\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(data: PointeroverParentEvent) {\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(data: PointeroverNodeEvent) {\n if (!isSynthDragState(data.detail.state)) return;\n\n updateDraggedOverNodes(data, data.detail.state);\n}\n\nfunction swapElements(\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(state: DragState | SynthDragState) {\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[],\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 } 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"],"mappings":"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","names":["handleEnd","handleNodeDragover","handleNodePointerover","handleParentDragover","handleParentPointerover","emit","on","state","insertState","state","draggedParentValues","documentController","handleNodeDragover","handleParentDragover","state","handleEnd","documentController","baseDragState","dragStateProps","nodes","emit","on","handleNodeDragover","handleParentDragover","handleEnd","handleNodePointerover","handleParentPointerover","draggedNodes","state","parent","x","scrollTimeout","node","scrollX","scrollY","className","el"]} \ No newline at end of file diff --git a/dist/index.d.cts b/dist/index.d.cts index d04ae73..a3310e5 100644 --- a/dist/index.d.cts +++ b/dist/index.d.cts @@ -960,7 +960,6 @@ declare function resetState(): void; * @returns void */ declare function setDragState(dragStateProps: (SynthDragStateProps & DragStateProps) | DragStateProps): DragState | SynthDragState; -declare function copyNodeStyle(sourceNode: HTMLElement, targetNode: HTMLElement, omitKeys?: boolean): void; /** * Initializes the drag and drop functionality for a given parent. * @@ -1386,4 +1385,4 @@ declare function isNode(el: unknown): el is Node; */ declare function addEvents(el: Document | ShadowRoot | Node | HTMLElement | Window, events: EventHandlers | any): AbortController; -export { type BaseDragState, type Coordinates, type DNDPlugin, type DNDPluginData, type DragAndDrop, type DragAndDropData, type DragState, type DragStateProps, type DragendEvent, type DragendEventData, type DragstartEvent, type DragstartEventData, type DropSwapConfig, type DropSwapState, type DynamicValuesData, type EventHandlers, type InsertConfig, type InsertEvent, type InsertState, type NativeDragEffects, type Node, type NodeData, type NodeDragEventData, type NodeEvent, type NodeEventData, type NodeFromPoint, type NodePointerEventData, type NodeRecord, type NodeTargetData, type NodesData, type ParentConfig, type ParentData, type ParentDragEventData, type ParentEventData, type ParentFromPoint, type ParentKeydownEventData, type ParentObservers, type ParentPointerEventData, type ParentRecord, type ParentTargetData, type ParentsData, type PluginData, type PointeroverNodeEvent, type PointeroverParentEvent, type RemapFinished, type RemapFinishedData, type ScrollData, type SetupNode, type SetupNodeData, type ShouldSwapData, type SortEvent, type SortEventData, type StateEvents, type SynthDragState, type SynthDragStateProps, type TearDownNode, type TearDownNodeData, type TransferEvent, type TransferEventData, addClass, addEvents, addNodeClass, addParentClass, animations, copyNodeStyle, dragAndDrop, dragStateProps, dragValues, dragstartClasses, dropOrSwap, getElFromPoint, handleClickNode, handleClickParent, handleDragend, handleDragstart, handleEnd, handleLongPress, handleNodeDragover, handleNodeDrop, handleNodeKeydown, handleNodePointerdown, handleNodePointerover, handleNodePointerup, handleParentDragover, handleParentDrop, handleParentFocus, handleParentKeydown, handleParentPointerover, 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 }; +export { type BaseDragState, type Coordinates, type DNDPlugin, type DNDPluginData, type DragAndDrop, type DragAndDropData, type DragState, type DragStateProps, type DragendEvent, type DragendEventData, type DragstartEvent, type DragstartEventData, type DropSwapConfig, type DropSwapState, type DynamicValuesData, type EventHandlers, type InsertConfig, type InsertEvent, type InsertState, type NativeDragEffects, type Node, type NodeData, type NodeDragEventData, type NodeEvent, type NodeEventData, type NodeFromPoint, type NodePointerEventData, type NodeRecord, type NodeTargetData, type NodesData, type ParentConfig, type ParentData, type ParentDragEventData, type ParentEventData, type ParentFromPoint, type ParentKeydownEventData, type ParentObservers, type ParentPointerEventData, type ParentRecord, type ParentTargetData, type ParentsData, type PluginData, type PointeroverNodeEvent, type PointeroverParentEvent, type RemapFinished, type RemapFinishedData, type ScrollData, type SetupNode, type SetupNodeData, type ShouldSwapData, type SortEvent, type SortEventData, type StateEvents, type SynthDragState, type SynthDragStateProps, type TearDownNode, type TearDownNodeData, type TransferEvent, type TransferEventData, addClass, addEvents, addNodeClass, addParentClass, animations, dragAndDrop, dragStateProps, dragValues, dragstartClasses, dropOrSwap, getElFromPoint, handleClickNode, handleClickParent, handleDragend, handleDragstart, handleEnd, handleLongPress, handleNodeDragover, handleNodeDrop, handleNodeKeydown, handleNodePointerdown, handleNodePointerover, handleNodePointerup, handleParentDragover, handleParentDrop, handleParentFocus, handleParentKeydown, handleParentPointerover, 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 }; diff --git a/dist/index.d.ts b/dist/index.d.ts index d04ae73..a3310e5 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -960,7 +960,6 @@ declare function resetState(): void; * @returns void */ declare function setDragState(dragStateProps: (SynthDragStateProps & DragStateProps) | DragStateProps): DragState | SynthDragState; -declare function copyNodeStyle(sourceNode: HTMLElement, targetNode: HTMLElement, omitKeys?: boolean): void; /** * Initializes the drag and drop functionality for a given parent. * @@ -1386,4 +1385,4 @@ declare function isNode(el: unknown): el is Node; */ declare function addEvents(el: Document | ShadowRoot | Node | HTMLElement | Window, events: EventHandlers | any): AbortController; -export { type BaseDragState, type Coordinates, type DNDPlugin, type DNDPluginData, type DragAndDrop, type DragAndDropData, type DragState, type DragStateProps, type DragendEvent, type DragendEventData, type DragstartEvent, type DragstartEventData, type DropSwapConfig, type DropSwapState, type DynamicValuesData, type EventHandlers, type InsertConfig, type InsertEvent, type InsertState, type NativeDragEffects, type Node, type NodeData, type NodeDragEventData, type NodeEvent, type NodeEventData, type NodeFromPoint, type NodePointerEventData, type NodeRecord, type NodeTargetData, type NodesData, type ParentConfig, type ParentData, type ParentDragEventData, type ParentEventData, type ParentFromPoint, type ParentKeydownEventData, type ParentObservers, type ParentPointerEventData, type ParentRecord, type ParentTargetData, type ParentsData, type PluginData, type PointeroverNodeEvent, type PointeroverParentEvent, type RemapFinished, type RemapFinishedData, type ScrollData, type SetupNode, type SetupNodeData, type ShouldSwapData, type SortEvent, type SortEventData, type StateEvents, type SynthDragState, type SynthDragStateProps, type TearDownNode, type TearDownNodeData, type TransferEvent, type TransferEventData, addClass, addEvents, addNodeClass, addParentClass, animations, copyNodeStyle, dragAndDrop, dragStateProps, dragValues, dragstartClasses, dropOrSwap, getElFromPoint, handleClickNode, handleClickParent, handleDragend, handleDragstart, handleEnd, handleLongPress, handleNodeDragover, handleNodeDrop, handleNodeKeydown, handleNodePointerdown, handleNodePointerover, handleNodePointerup, handleParentDragover, handleParentDrop, handleParentFocus, handleParentKeydown, handleParentPointerover, 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 }; +export { type BaseDragState, type Coordinates, type DNDPlugin, type DNDPluginData, type DragAndDrop, type DragAndDropData, type DragState, type DragStateProps, type DragendEvent, type DragendEventData, type DragstartEvent, type DragstartEventData, type DropSwapConfig, type DropSwapState, type DynamicValuesData, type EventHandlers, type InsertConfig, type InsertEvent, type InsertState, type NativeDragEffects, type Node, type NodeData, type NodeDragEventData, type NodeEvent, type NodeEventData, type NodeFromPoint, type NodePointerEventData, type NodeRecord, type NodeTargetData, type NodesData, type ParentConfig, type ParentData, type ParentDragEventData, type ParentEventData, type ParentFromPoint, type ParentKeydownEventData, type ParentObservers, type ParentPointerEventData, type ParentRecord, type ParentTargetData, type ParentsData, type PluginData, type PointeroverNodeEvent, type PointeroverParentEvent, type RemapFinished, type RemapFinishedData, type ScrollData, type SetupNode, type SetupNodeData, type ShouldSwapData, type SortEvent, type SortEventData, type StateEvents, type SynthDragState, type SynthDragStateProps, type TearDownNode, type TearDownNodeData, type TransferEvent, type TransferEventData, addClass, addEvents, addNodeClass, addParentClass, animations, dragAndDrop, dragStateProps, dragValues, dragstartClasses, dropOrSwap, getElFromPoint, handleClickNode, handleClickParent, handleDragend, handleDragstart, handleEnd, handleLongPress, handleNodeDragover, handleNodeDrop, handleNodeKeydown, handleNodePointerdown, handleNodePointerover, handleNodePointerup, handleParentDragover, handleParentDrop, handleParentFocus, handleParentKeydown, handleParentPointerover, 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 }; diff --git a/dist/index.mjs b/dist/index.mjs index 18ba4c6..2255722 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -1137,29 +1137,6 @@ function handleRootKeydown(e) { } function handleRootDrop(_e) { } -function copyNodeStyle(sourceNode, targetNode, omitKeys = false) { - const computedStyle = window.getComputedStyle(sourceNode); - const omittedKeys = [ - "position", - "z-index", - "top", - "left", - "x", - "pointer-events", - "y", - "transform-origin", - "filter", - "-webkit-text-fill-color" - ]; - for (const key of Array.from(computedStyle)) { - if (omitKeys === false && key && omittedKeys.includes(key)) continue; - targetNode.style.setProperty( - key, - computedStyle.getPropertyValue(key), - computedStyle.getPropertyPriority(key) - ); - } -} function handleRootDragover(e) { if (!isDragState(state)) return; pd(e); @@ -2268,14 +2245,13 @@ function initSynthDrag(node, parent, e, _state, draggedNodes2) { zIndex: 9999, pointerEvents: "none", margin: 0, + willChange: "transform", overflow: "hidden", display: "none" }); } else { if (!config.multiDrag || draggedNodes2.length === 1) { - console.log("boom"); dragImage = node.el.cloneNode(true); - copyNodeStyle(node.el, dragImage); dragImage.id = "dnd-dragged-node-clone"; display = dragImage.style.display; dragImage.setAttribute("popover", "manual"); @@ -2285,16 +2261,15 @@ function initSynthDrag(node, parent, e, _state, draggedNodes2) { width: node.el.getBoundingClientRect().width + "px", overflow: "hidden", margin: 0, + willChange: "transform", pointerEvents: "none", zIndex: 9999 }); } else { const wrapper = document.createElement("div"); - console.log("getting here"); wrapper.setAttribute("popover", "manual"); for (const node2 of draggedNodes2) { const clonedNode = node2.el.cloneNode(true); - copyNodeStyle(node2.el, clonedNode); clonedNode.style.pointerEvents = "none"; wrapper.append(clonedNode); } @@ -2380,9 +2355,12 @@ function moveNode(e, state2, scrollX2 = 0, scrollY2 = 0) { state2.coordinates.x = x; const startLeft = state2.startLeft ?? 0; const startTop = state2.startTop ?? 0; + console.log("window scroll y", window.scrollY); + console.log("start top", startTop); const translateX = x - startLeft + window.scrollX; const translateY = y - startTop + window.scrollY; state2.clonedDraggedNode.style.transform = `translate(${translateX + scrollX2}px, ${translateY + scrollY2}px)`; + console.log("translate y", translateY + scrollY2); if (e.cancelable) pd(e); pointermoveClasses(state2, state2.initialParent.data.config); } @@ -2837,7 +2815,6 @@ export { addNodeClass, addParentClass, animations, - copyNodeStyle, dragAndDrop, dragStateProps, dragValues, diff --git a/dist/index.mjs.map b/dist/index.mjs.map index dc760cc..4c9ad12 100644 --- a/dist/index.mjs.map +++ b/dist/index.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/utils.ts","../src/plugins/animations/index.ts","../src/plugins/insert/index.ts","../src/plugins/drop-or-swap/index.ts","../src/index.ts"],"sourcesContent":["/**\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\nexport function rect(el: HTMLElement) {\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() {\n const callbacks = new Map void>>();\n\n const emit = function (eventName: string, data: T) {\n if (!callbacks.get(eventName)) return;\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;\n const objB = valB as Record;\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// * Throttle a function.\n// *\n// * @param callback - The callback function to throttle.\n// * @param limit - The minimum time in milliseconds between function calls.\n// *\n// * @returns A throttled version of the callback function.\n// */\n//export function throttle(\n// callback: (...args: Args) => Return,\n// limit: number\n//): (...args: Args) => void {\n// let wait = false;\n// return function (...args: Args) {\n// if (!wait) {\n// callback.apply(null, args);\n// wait = true;\n// setTimeout(function () {\n// wait = false;\n// }, limit);\n// }\n// };\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 {\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 = {}) {\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(data: SetupNodeData) {\n if (!isDragState(state)) return;\n\n const duration = animationsConfig.duration || 150;\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);\n\n break;\n case \"above\":\n animate(data.node.el, slideDown, duration);\n\n break;\n case \"left\":\n animate(data.node.el, slideRight, duration);\n\n break;\n case \"right\":\n animate(data.node.el, slideLeft, duration);\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);\n } else if (xDiff > yDiff && !ascendingDirection) {\n animate(data.node.el, slideLeft, duration);\n }\n } else {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node.el, slideDown, duration);\n\n break;\n case \"above\":\n animate(data.node.el, slideUp, duration);\n\n break;\n case \"left\":\n animate(data.node.el, slideLeft, duration);\n\n break;\n case \"right\":\n animate(data.node.el, slideRight, duration);\n\n break;\n }\n }\n },\n };\n };\n}\n\nfunction animate(\n node: Node,\n animation: Keyframe[] | PropertyIndexedKeyframes,\n duration: number\n) {\n if (!state) return;\n\n state.preventEnter = true;\n\n node.animate(animation, {\n duration: duration,\n easing: \"ease-in-out\",\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 = {\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(insertConfig: InsertConfig) {\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 | SynthDragState\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\nfunction checkPosition(e: DragEvent | PointerEvent) {\n if (!isDragState(state)) return;\n\n const el = document.elementFromPoint(e.clientX, e.clientY);\n\n if (!(el instanceof HTMLElement)) return;\n\n if (!parents.has(el)) {\n const insertPoint = insertState.insertPoint;\n\n if (insertPoint?.el === el) return;\n\n if (insertPoint) insertPoint.el.style.display = \"none\";\n\n if (insertState.draggedOverParent) {\n removeClass(\n [insertState.draggedOverParent.el],\n insertState.draggedOverParent.data.config.dropZoneClass\n );\n }\n\n insertState.draggedOverNodes = [];\n\n insertState.draggedOverParent = null;\n\n state.currentParent = state.initialParent;\n }\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 const midpoint = nodeEdge + Math.abs(nodeEdge - otherEdge) / 2;\n\n return {\n y: isAscending ? [center, midpoint] : [midpoint, center],\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)) 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(data: NodeDragEventData) {\n const config = data.targetData.parent.data.config;\n\n if (!config.nativeDrag) return;\n\n data.e.preventDefault();\n}\n\nfunction processParentDragEvent(\n e: DragEvent | PointerEvent,\n targetData: ParentEventData[\"targetData\"],\n state: DragState,\n isNativeDrag: boolean\n) {\n const config = targetData.parent.data.config;\n\n if (!isNativeDrag && config.nativeDrag) return;\n\n pd(e);\n\n if (isNativeDrag) pd(e);\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 {\n moveOutside(realTargetParent, state);\n }\n\n state.currentParent = realTargetParent;\n}\n\nexport function handleParentDragover(\n data: ParentEventData,\n state: DragState\n) {\n processParentDragEvent(data.e as DragEvent, data.targetData, state, true);\n}\n\nexport function handleParentPointerover(data: PointeroverParentEvent) {\n const { detail } = data;\n\n const { state, targetData } = detail;\n\n if (state.scrolling) return;\n\n processParentDragEvent(detail.e, targetData, state, false);\n}\n\nexport function moveBetween(data: ParentRecord, state: DragState) {\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\n );\n }\n}\n\nfunction moveOutside(data: ParentRecord, state: DragState) {\n if (data.el === state.currentParent.el) return false;\n\n const targetConfig = data.data.config;\n\n if (state.draggedNode.el.contains(data.el)) return false;\n\n if (targetConfig.dropZone === false) return;\n\n const initialParentConfig = state.initialParent.data.config;\n\n if (targetConfig.accepts) {\n return targetConfig.accepts(\n data,\n state.initialParent,\n state.currentParent,\n state\n );\n } else if (\n !targetConfig.group ||\n targetConfig.group !== initialParentConfig.group\n ) {\n return false;\n }\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;\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;\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\n );\n }\n }\n}\n\nfunction findClosest(enabledNodes: NodeRecord[], state: DragState) {\n let foundRange: [NodeRecord, 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(\n parent: ParentRecord,\n insertState: InsertState\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, {\n position: \"absolute\",\n display: \"none\",\n });\n}\n\nfunction removeInsertPoint(insertState: InsertState) {\n if (insertState.insertPoint?.el) insertState.insertPoint.el.remove();\n\n insertState.insertPoint = null;\n}\n\nfunction positioninsertPoint(\n parent: ParentRecord,\n position: { x: number[]; y: number[]; vertical: boolean },\n ascending: boolean,\n node: NodeRecord,\n insertState: InsertState\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 if (position.vertical) {\n const topPosition =\n position.y[ascending ? 1 : 0] -\n insertState.insertPoint.el.getBoundingClientRect().height / 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 height: \"4px\",\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 width: \"4px\",\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 insertState.insertPoint.el.style.display = \"block\";\n}\n\nexport function handleParentDrop(_data: NodeDragEventData) {}\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(\n state: DragState | SynthDragState | BaseDragState\n) {\n if (!isDragState(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,\n previousValues: [...draggedParentValues],\n previousNodes: [...enabledNodes],\n nodes: [...state.initialParent.data.enabledNodes],\n values: [...newParentValues],\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes,\n previousPosition: originalIndex,\n position: index,\n state: state as DragState,\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[],\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[],\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[],\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[],\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 = {\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\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} from \"../../types\";\nimport {\n parents,\n parentValues,\n setParentValues,\n addNodeClass,\n isSynthDragState,\n removeClass,\n addClass,\n state,\n addEvents,\n isDragState,\n} from \"../../index\";\n\nexport const dropSwapState: DropSwapState = {\n draggedOverNodes: Array>(),\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(dropSwapConfig: DropSwapConfig = {}) {\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 | SynthDragState\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\nfunction updateDraggedOverNodes(\n data: PointeroverNodeEvent | NodeDragEventData,\n state: DragState | SynthDragState\n) {\n const targetData =\n \"detail\" in data ? data.detail.targetData : data.targetData;\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(\n data: NodeDragEventData,\n state: DragState\n) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\n\n updateDraggedOverNodes(data, state);\n}\n\nexport function handleParentDragover(\n data: ParentDragEventData,\n state: DragState\n) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\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(data: PointeroverParentEvent) {\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(data: PointeroverNodeEvent) {\n if (!isSynthDragState(data.detail.state)) return;\n\n updateDraggedOverNodes(data, data.detail.state);\n}\n\nfunction swapElements(\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(state: DragState | SynthDragState) {\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[],\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 } 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","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 ParentKeydownEventData,\n SynthDragStateProps,\n ParentRecord,\n EventHandlers,\n NodeFromPoint,\n ParentFromPoint,\n ParentDragEventData,\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>}\n */\nexport const parents: ParentsData = new WeakMap<\n HTMLElement,\n ParentData\n>();\n\n/**\n * Nodes are the draggable items and the direct descendants of the parents.\n *\n * @type {WeakMap>}\n */\nexport const nodes: NodesData = new WeakMap>();\n\n/**\n * Function to check if touch support is enabled.\n *\n * @returns {boolean}\n */\nfunction checkTouchSupport() {\n if (!isBrowser) return false;\n\n return \"ontouchstart\" in window || navigator.maxTouchPoints > 0;\n}\n\n/**\n * The base drag state.\n *\n * @type {BaseDragState}\n */\nconst baseDragState = {\n activeDescendant: undefined,\n affectedNodes: [],\n coordinates: {\n x: 0,\n y: 0,\n },\n currentTargetValue: undefined,\n on,\n emit,\n newActiveDescendant: undefined,\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};\n\n/**\n * The state of the drag and drop.\n *\n * @type {BaseDragState}\n */\nexport let state: BaseDragState = 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 * Abort controller for the window.\n */\nlet windowController: AbortController | undefined;\n\n/**\n * Timeout for the scroll.\n */\nlet scrollTimeout: ReturnType;\n\n/**\n * Variable to check if the device is touch.\n */\nlet touchDevice: boolean = false;\n\nexport function resetState() {\n const baseDragState = {\n activeDescendant: undefined,\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 };\n\n state = { ...baseDragState } as BaseDragState;\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(\n dragStateProps: (SynthDragStateProps & DragStateProps) | DragStateProps\n): DragState | SynthDragState {\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 | SynthDragState;\n}\n\n/**\n *\n */\nfunction handleRootPointerdown(_e: PointerEvent) {\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(e: PointerEvent) {\n pd(e);\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\nexport function copyNodeStyle(\n sourceNode: HTMLElement,\n targetNode: HTMLElement,\n omitKeys = false\n) {\n const computedStyle = window.getComputedStyle(sourceNode);\n\n const omittedKeys = [\n \"position\",\n \"z-index\",\n \"top\",\n \"left\",\n \"x\",\n \"pointer-events\",\n \"y\",\n \"transform-origin\",\n \"filter\",\n \"-webkit-text-fill-color\",\n ];\n\n for (const key of Array.from(computedStyle)) {\n if (omitKeys === false && key && omittedKeys.includes(key)) continue;\n\n targetNode.style.setProperty(\n key,\n computedStyle.getPropertyValue(key),\n computedStyle.getPropertyPriority(key)\n );\n }\n}\n\n/**\n * If we are currently dragging, then let's prevent default on dragover to avoid\n * the default behavior of the browser on drop.\n */\nfunction handleRootDragover(e: DragEvent) {\n if (!isDragState(state)) return;\n\n pd(e);\n}\n\nfunction handleRootPointermove(e: PointerEvent) {\n if (!state.pointerDown) return;\n\n //pd(e);\n\n const config = state.pointerDown.parent.data.config;\n\n if (\n !isSynthDragState(state) &&\n (touchDevice || (!touchDevice && !config.nativeDrag))\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 synthDragState = initSynthDrag(\n state.pointerDown.node,\n state.pointerDown.parent,\n e,\n state,\n nodes\n );\n\n state.rootUserSelect = window.getComputedStyle(\n document.documentElement\n ).userSelect;\n\n document.body.style.userSelect = \"none\";\n\n synthMove(e, synthDragState);\n } else if (isSynthDragState(state)) {\n synthMove(e, state);\n }\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({\n parent,\n getValues,\n setValues,\n config = {},\n}: DragAndDrop): void {\n if (!isBrowser) return;\n\n touchDevice = checkTouchSupport();\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: (e: TouchEvent) => {\n if (isDragState(state) && e.cancelable) pd(e);\n },\n });\n\n const liveRegion = document.createElement(\"div\");\n\n setAttrs(liveRegion, {\n \"aria-live\": \"polite\",\n \"aria-atomic\": \"true\",\n \"data-dnd-live-region\": \"true\",\n });\n\n Object.assign(liveRegion.style, {\n position: \"absolute\",\n top: \"0px\",\n left: \"-9999px\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: \"0\",\n });\n\n document.body.appendChild(liveRegion);\n }\n\n if (!windowController)\n windowController = addEvents(window, {\n resize: () => {\n touchDevice = checkTouchSupport();\n },\n });\n\n tearDown(parent);\n\n const [emit, on] = createEmitter();\n\n const parentData: ParentData = {\n getValues,\n setValues,\n config: {\n dragDropEffect: config.dragDropEffect ?? \"move\",\n dragEffectAllowed: config.dragEffectAllowed ?? \"move\",\n draggedNodes,\n dragstartClasses,\n deepCopyStyles: config.deepCopyStyles ?? false,\n handleNodeKeydown,\n handleParentKeydown,\n handleDragstart,\n handleNodeDragover,\n handleParentDragover,\n handleNodeDrop,\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(\n node: NodeRecord,\n parent: ParentRecord,\n e: PointerEvent | DragEvent,\n draggedNodes: Array>,\n offsetX?: number,\n offsetY?: number\n): DragStateProps {\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 // Need to account for if the explicity offset is positive or negative\n startLeft: offsetX ? offsetX : x - rect.left,\n startTop: offsetY ? offsetY : y - rect.top,\n targetIndex: node.data.index,\n transferred: false,\n };\n}\n\nexport function performSort({\n parent,\n draggedNodes,\n targetNodes,\n}: {\n parent: ParentRecord;\n draggedNodes: Array>;\n targetNodes: Array>;\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,\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,\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(\n parent: ParentRecord,\n newActiveNode: NodeRecord | undefined,\n state: BaseDragState\n) {\n const activeDescendantClass = parent.data.config.activeDescendantClass;\n\n if (state.activeState) {\n {\n removeClass([state.activeState.node.el], activeDescendantClass);\n\n if (state.activeState.parent.el !== parent.el)\n state.activeState.parent.el.setAttribute(\"aria-activedescendant\", \"\");\n }\n }\n\n if (!newActiveNode) {\n state.activeState?.parent.el.setAttribute(\"aria-activedescendant\", \"\");\n\n state.activeState = undefined;\n\n return;\n }\n\n state.activeState = {\n node: newActiveNode,\n parent,\n };\n\n addNodeClass([newActiveNode.el], activeDescendantClass);\n\n state.activeState.parent.el.setAttribute(\n \"aria-activedescendant\",\n state.activeState.node.el.id\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>} nodes - The nodes to deselect.\n * @param {ParentRecord} parent - The parent record.\n * @param {BaseDragState} state - The current drag state.\n */\nfunction deselect(\n nodes: Array>,\n parent: ParentRecord,\n state: BaseDragState\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 clearLiveRegion(parent);\n}\n\n/**\n * This function sets the selected nodes. This will clean the prior selected state\n * as well as removing any classes or attributes set.\n *\n * @param {ParentRecord} parent - The parent record.\n * @param {Array>} selectedNodes - The nodes to select.\n * @param {NodeRecord | undefined} newActiveNode - The new active node.\n * @param {BaseDragState} state - The current drag state.\n * @param {boolean} pointerdown - Whether the pointerdown event was triggered.\n */\nfunction setSelected(\n parent: ParentRecord,\n selectedNodes: Array>,\n newActiveNode: NodeRecord | undefined,\n state: BaseDragState,\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 const selectedItems = selectedNodes.map((x) =>\n x.el.getAttribute(\"aria-label\")\n );\n\n if (selectedItems.length === 0) {\n state.selectedState = undefined;\n\n clearLiveRegion(parent);\n\n return;\n }\n\n setActive(parent, newActiveNode, state);\n\n updateLiveRegion(\n parent,\n `${selectedItems.join(\n \", \"\n )} ready for dragging. Use arrow keys to navigate. Press enter to drop ${selectedItems.join(\n \", \"\n )}.`\n );\n}\n\nfunction updateLiveRegion(parent: ParentRecord, message: string) {\n const liveRegion = document.querySelector('[data-dnd-live-region=\"true\"]');\n\n if (!liveRegion) return;\n\n liveRegion.id = parent.el.id + \"-live-region\";\n\n liveRegion.textContent = message;\n}\n\nfunction clearLiveRegion(parent: ParentRecord) {\n const liveRegion = document.getElementById(parent.el.id + \"-live-region\");\n\n if (!liveRegion) return;\n\n liveRegion.textContent = \"\";\n}\n\nexport function handleParentFocus(\n data: ParentEventData,\n state: BaseDragState | DragState | SynthDragState\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({\n currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n initialIndex,\n targetNodes,\n state,\n}: {\n currentParent: ParentRecord;\n targetParent: ParentRecord;\n initialParent: ParentRecord;\n draggedNodes: Array>;\n initialIndex: number;\n state: BaseDragState | DragState | SynthDragState;\n targetNodes: Array>;\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(\n parent: HTMLElement,\n parentData: ParentData\n): Array {\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(\n parent: HTMLElement,\n parentData: ParentData,\n values: Array\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(state: DragState): Array {\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(\n parent: HTMLElement,\n config: Partial>\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(\n data: ParentEventData,\n state: DragState\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 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(\n state: BaseDragState\n): state is DragState | SynthDragState {\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(\n state: BaseDragState\n): state is SynthDragState {\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(parent: HTMLElement, parentData: ParentData): void {\n parentData.abortControllers.mainParent = addEvents(parent, {\n keydown: parentEventData(parentData.config.handleParentKeydown),\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 };\n\n draggableItem.draggable = true;\n },\n }\n );\n }\n\n if (parent.id)\n setAttrs(parent, {\n role: \"listbox\",\n tabindex: \"0\",\n \"aria-multiselectable\": parentData.config.multiDrag ? \"true\" : \"false\",\n \"aria-activedescendant\": \"\",\n \"aria-describedby\": parent.id + \"-live-region\",\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) {\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(data: SetupNodeData) {\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 pointerup: nodeEventData(config.handleNodePointerup),\n pointercancel: nodeEventData(config.handlePointercancel),\n\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 (touchDevice) pd(e);\n },\n });\n\n data.node.el.setAttribute(\"role\", \"option\");\n\n data.node.el.setAttribute(\"aria-selected\", \"false\");\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(data: SetupNodeData) {\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(node: Node, parentData: ParentData) {\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(data: TearDownNodeData) {\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(data: TearDownNodeData) {\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 allSelectedAndActiveNodes = document.querySelectorAll(\n `[aria-selected=\"true\"]`\n );\n\n const parentData = parents.get(parentEl);\n\n if (!parentData) return;\n\n for (let x = 0; x < allSelectedAndActiveNodes.length; x++) {\n const node = allSelectedAndActiveNodes[x];\n\n node.setAttribute(\"aria-selected\", \"false\");\n\n removeClass([node], parentData.config.selectedClass);\n }\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(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 = [];\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 }\n }\n\n if (\n enabledNodes.length !== parentData.getValues(parent).length &&\n !config.disabled\n ) {\n console.warn(\n \"The number of draggable items defined in the parent element does not match the number of values. This may cause unexpected behavior.\"\n );\n\n return;\n }\n\n const values = parentData.getValues(parent);\n\n const enabledNodeRecords: Array> = [];\n\n for (let x = 0; x < enabledNodes.length; x++) {\n const node = enabledNodes[x];\n\n const prevNodeData = nodes.get(node);\n\n if (config.draggableValue && !config.draggableValue(values[x])) continue;\n\n const nodeData = Object.assign(\n prevNodeData ?? {\n privateClasses: [],\n abortControllers: {},\n },\n {\n value: values[x],\n index: x,\n }\n );\n\n if (\n !isDragState(state) &&\n state.newActiveDescendant &&\n eq(state.newActiveDescendant.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 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): 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(pointerDown: {\n parent: ParentRecord;\n node: NodeRecord;\n}): Array> {\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>),\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(_data: ParentEventData) {\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(\n data: NodeDragEventData,\n _state: BaseDragState\n) {\n const config = data.targetData.parent.data.config;\n\n if (\n !config.nativeDrag ||\n !validateDragstart(data) ||\n !validateDragHandle({\n x: data.e.clientX,\n y: data.e.clientY,\n node: data.targetData.node,\n config,\n })\n ) {\n pd(data.e);\n\n return;\n }\n\n const nodes = config.draggedNodes({\n parent: data.targetData.parent,\n node: 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 config.onDragstart({\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}\n\nexport function handleNodePointerdown(\n data: NodePointerEventData,\n state: BaseDragState\n) {\n sp(data.e);\n\n if (\n !validateDragHandle({\n x: data.e.clientX,\n y: data.e.clientY,\n node: data.targetData.node,\n config: data.targetData.parent.data.config,\n })\n )\n return;\n\n state.pointerDown = {\n parent: data.targetData.parent,\n node: data.targetData.node,\n };\n\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 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 && touchDevice) {\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(\n _node: NodeRecord,\n nodes: Array>,\n config: ParentConfig,\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.activeDescendantClass\n );\n\n removeClass(\n nodes.map((x) => x.el),\n config.selectedClass\n );\n });\n}\n\n/**\n * Initialize the drag state.\n *\n * @param data - The node drag event data.\n * @param draggedNodes - The dragged nodes.\n *\n * @returns The drag state.\n */\nexport function initDrag(\n data: NodeDragEventData,\n draggedNodes: Array>\n): DragState {\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\n data.e.dataTransfer.effectAllowed = config.dragEffectAllowed;\n\n let dragImage: HTMLElement | undefined;\n\n if (config.dragImage) {\n dragImage = config.dragImage(data, draggedNodes);\n } else {\n if (!config.multiDrag) {\n data.e.dataTransfer.setDragImage(\n data.targetData.node.el,\n data.e.offsetX,\n data.e.offsetY\n );\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n return dragState;\n } else {\n const wrapper = document.createElement(\"div\");\n\n for (const node of draggedNodes) {\n const clonedNode = node.el.cloneNode(true) as HTMLElement;\n\n clonedNode.style.pointerEvents = \"none\";\n\n clonedNode.id = node.el.id + \"-clone\";\n\n wrapper.append(clonedNode);\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 });\n\n dragImage = wrapper;\n }\n\n document.body.appendChild(dragImage);\n }\n\n data.e.dataTransfer.setDragImage(dragImage, data.e.offsetX, data.e.offsetY);\n\n setTimeout(() => {\n dragImage?.remove();\n });\n }\n\n return dragState;\n}\n\nexport function validateDragHandle({\n x,\n y,\n node,\n config,\n}: {\n x: number;\n y: number;\n node: NodeRecord;\n config: ParentConfig;\n}): boolean {\n if (config.externalDragHandle) return false;\n\n if (!config.dragHandle) return true;\n\n const dragHandles = node.el.querySelectorAll(config.dragHandle);\n\n if (!dragHandles) return false;\n\n const elFromPoint = config.root.elementFromPoint(x, y);\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(_data: NodeEventData) {}\n\nexport function handleClickParent(_data: ParentEventData) {}\n\nexport function handleNodeKeydown(_data: NodeEventData) {}\n\nexport function handleParentKeydown(\n data: ParentKeydownEventData,\n state: BaseDragState\n) {\n const activeDescendant = state.activeState?.node;\n\n if (!activeDescendant) return;\n\n const parentData = data.targetData.parent.data;\n\n const enabledNodes = parentData.enabledNodes;\n\n if (!(data.e.target instanceof HTMLElement)) return;\n const index = enabledNodes.findIndex((x) => x.el === activeDescendant.el);\n\n if (index === -1) return;\n\n if (\n [\"ArrowDown\", \"ArrowUp\", \"ArrowRight\", \"ArrowLeft\"].includes(data.e.key)\n ) {\n pd(data.e);\n\n const nextIndex =\n data.e.key === \"ArrowDown\" || data.e.key === \"ArrowRight\"\n ? index + 1\n : index - 1;\n\n if (nextIndex < 0 || nextIndex >= enabledNodes.length) return;\n\n const nextNode = enabledNodes[nextIndex];\n\n setActive(data.targetData.parent, nextNode, state);\n } else if (data.e.key === \" \") {\n pd(data.e);\n\n state.selectedState && state.selectedState.nodes.includes(activeDescendant)\n ? setSelected(\n data.targetData.parent,\n state.selectedState.nodes.filter((x) => x.el !== activeDescendant.el),\n activeDescendant,\n state\n )\n : setSelected(\n data.targetData.parent,\n [activeDescendant],\n activeDescendant,\n state\n );\n } else if (data.e.key === \"Enter\" && state.selectedState) {\n if (\n state.selectedState.parent.el === data.targetData.parent.el &&\n state.activeState\n ) {\n if (state.selectedState.nodes[0].el === state.activeState.node.el) {\n updateLiveRegion(data.targetData.parent, \"Cannot drop item on itself\");\n\n return;\n }\n\n state.newActiveDescendant = state.selectedState.nodes[0];\n\n parentData.config.performSort({\n parent: data.targetData.parent,\n draggedNodes: state.selectedState.nodes,\n targetNodes: [state.activeState.node],\n });\n\n deselect([], data.targetData.parent, state);\n\n updateLiveRegion(data.targetData.parent, \"Drop successful\");\n } else if (\n state.activeState &&\n state.selectedState.parent.el !== data.targetData.parent.el &&\n validateTransfer({\n currentParent: data.targetData.parent,\n targetParent: state.selectedState.parent,\n initialParent: state.selectedState.parent,\n draggedNodes: state.selectedState.nodes,\n state,\n })\n ) {\n parentData.config.performTransfer({\n currentParent: state.selectedState.parent,\n targetParent: data.targetData.parent,\n initialParent: state.selectedState.parent,\n draggedNodes: state.selectedState.nodes,\n initialIndex: state.selectedState.nodes[0].data.index,\n state,\n targetNodes: [state.activeState.node],\n });\n\n state.newActiveDescendant = state.selectedState.nodes[0];\n\n setSelected(data.targetData.parent, [], undefined, state);\n\n updateLiveRegion(data.targetData.parent, \"Drop successful\");\n }\n }\n}\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;\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(e: PointeroverNodeEvent) {\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(\n data: NodeDragEventData,\n state: DragState | SynthDragState\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\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(\n data: NodeDragEventData,\n state: DragState\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(\n data: NodeEventData,\n state: DragState | SynthDragState | BaseDragState\n) {\n if (!isSynthDragState(state)) return;\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(state: DragState | SynthDragState) {\n if (state.draggedNode) state.draggedNode.el.draggable = false;\n\n document.body.style.userSelect = state.rootUserSelect || \"\";\n\n if (isSynthDragState(state)) {\n document.documentElement.style.overscrollBehavior =\n state.rootOverScrollBehavior || \"\";\n\n document.documentElement.style.touchAction = state.rootTouchAction || \"\";\n }\n\n if (isSynthDragState(state)) cancelSynthScroll(state);\n\n if (\"longPressTimeout\" in state && state.longPressTimeout)\n clearTimeout(state.longPressTimeout);\n\n const config = parents.get(state.initialParent.el)?.config;\n\n const isSynth = isSynthDragState(state);\n\n const dropZoneClass = isSynth\n ? config?.synthDropZoneClass\n : config?.dropZoneClass;\n\n if (state.originalZIndex !== undefined)\n state.draggedNode.el.style.zIndex = state.originalZIndex;\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n state.initialParent.data?.config?.longPressClass\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n isSynth\n ? state.initialParent.data.config.synthDragPlaceholderClass\n : state.initialParent.data?.config?.dragPlaceholderClass\n );\n\n if (isSynth) state.clonedDraggedNode.remove();\n\n deselect(state.draggedNodes, state.currentParent, state);\n\n setActive(state.currentParent, undefined, state);\n\n resetState();\n\n state.selectedState = undefined;\n\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 state.emit(\"dragEnded\", state);\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(\n data: NodePointerEventData,\n state: DragState | SynthDragState | BaseDragState\n) {\n sp(data.e);\n\n state.pointerDown = undefined;\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 removeClass(\n data.targetData.parent.data.enabledNodes.map((x) => x.el),\n config.longPressClass\n );\n\n if (!isDragState(state)) return;\n\n config.handleEnd(state as DragState | SynthDragState);\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 *\n * @returns The synth drag state.\n */\nfunction initSynthDrag(\n node: NodeRecord,\n parent: ParentRecord,\n e: PointerEvent,\n _state: BaseDragState,\n draggedNodes: Array>\n): SynthDragState {\n const config = parent.data.config;\n\n let dragImage: HTMLElement | undefined;\n\n let display = node.el.style.display;\n\n let result = undefined;\n\n if (config.synthDragImage) {\n result = config.synthDragImage(node, parent, e, draggedNodes);\n\n dragImage = result.dragImage;\n\n dragImage.setAttribute(\"popover\", \"manual\");\n\n dragImage.id = \"dnd-dragged-node-clone\";\n\n display = dragImage.style.display;\n\n Object.assign(dragImage.style, {\n position: \"absolute\",\n zIndex: 9999,\n pointerEvents: \"none\",\n margin: 0,\n overflow: \"hidden\",\n display: \"none\",\n });\n } else {\n if (!config.multiDrag || draggedNodes.length === 1) {\n console.log(\"boom\");\n dragImage = node.el.cloneNode(true) as HTMLElement;\n\n copyNodeStyle(node.el, dragImage);\n\n dragImage.id = \"dnd-dragged-node-clone\";\n\n display = dragImage.style.display;\n\n dragImage.setAttribute(\"popover\", \"manual\");\n\n Object.assign(dragImage.style, {\n position: \"absolute\",\n height: node.el.getBoundingClientRect().height + \"px\",\n width: node.el.getBoundingClientRect().width + \"px\",\n overflow: \"hidden\",\n margin: 0,\n pointerEvents: \"none\",\n zIndex: 9999,\n });\n } else {\n const wrapper = document.createElement(\"div\");\n console.log(\"getting here\");\n\n wrapper.setAttribute(\"popover\", \"manual\");\n\n for (const node of draggedNodes) {\n const clonedNode = node.el.cloneNode(true) as HTMLElement;\n\n copyNodeStyle(node.el, clonedNode);\n\n clonedNode.style.pointerEvents = \"none\";\n\n wrapper.append(clonedNode);\n }\n\n display = wrapper.style.display;\n\n wrapper.id = \"dnd-dragged-node-clone\";\n\n dragImage = wrapper;\n\n Object.assign(dragImage.style, {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"absolute\",\n overflow: \"hidden\",\n margin: 0,\n padding: 0,\n pointerEvents: \"none\",\n zIndex: 9999,\n });\n }\n }\n\n dragImage.style.position = \"absolute\";\n\n parent.el.appendChild(dragImage);\n\n dragImage.showPopover();\n\n const synthDragStateProps = {\n clonedDraggedEls: [],\n clonedDraggedNode: dragImage,\n draggedNodeDisplay: display,\n synthDragScrolling: false,\n synthDragging: true,\n rootScrollWidth: document.scrollingElement?.scrollWidth,\n rootScrollHeight: document.scrollingElement?.scrollHeight,\n rootOverScrollBehavior: document.documentElement.style.overscrollBehavior,\n rootTouchAction: document.documentElement.style.touchAction,\n };\n\n document.documentElement.style.overscrollBehavior = \"none\";\n\n document.documentElement.style.touchAction = \"none\";\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;\n\n synthDragState.clonedDraggedNode.style.display =\n synthDragState.draggedNodeDisplay || \"\";\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(\n data: NodePointerEventData,\n state: BaseDragState,\n node: NodeRecord\n) {\n const config = data.targetData.parent.data.config;\n\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 || 200);\n}\n\nfunction pointermoveClasses(\n state: SynthDragState,\n config: ParentConfig\n) {\n if (config.longPressClass)\n removeClass(\n state.draggedNodes.map((x) => x.el),\n config?.longPressClass\n );\n}\n\nfunction cancelSynthScroll(\n state: SynthDragState,\n cancelX = true,\n cancelY = true\n) {\n if (cancelX && state.animationFrameIdX !== undefined) {\n cancelAnimationFrame(state.animationFrameIdX);\n\n state.animationFrameIdX = undefined;\n }\n\n if (cancelY && state.animationFrameIdY !== undefined) {\n cancelAnimationFrame(state.animationFrameIdY);\n\n state.animationFrameIdY = undefined;\n }\n\n if (!state.animationFrameIdX && !state.animationFrameIdY) {\n state.preventEnter = false;\n }\n}\n\nfunction moveNode(\n e: PointerEvent,\n state: SynthDragState,\n scrollX = 0,\n scrollY = 0\n) {\n const { x, y } = eventCoordinates(e);\n\n state.coordinates.y = y;\n state.coordinates.x = x;\n\n const startLeft = state.startLeft ?? 0;\n const startTop = state.startTop ?? 0;\n\n // Calculate the translation values\n const translateX = x - startLeft + window.scrollX;\n const translateY = y - startTop + window.scrollY;\n\n // Apply the transform using translate\n state.clonedDraggedNode.style.transform = `translate(${\n translateX + scrollX\n }px, ${translateY + scrollY}px)`;\n\n if (e.cancelable) pd(e);\n\n pointermoveClasses(state, state.initialParent.data.config);\n}\n\n/**\n * Handle the synth move.\n *\n * @param e - The pointer event.\n * @param state - The synth drag state.\n *\n * @returns void\n */\nexport function synthMove(e: PointerEvent, state: SynthDragState) {\n moveNode(e, state);\n\n const coordinates = eventCoordinates(e);\n\n handleSynthScroll(coordinates, e, state);\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 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(\n data: NodeDragEventData,\n state: DragState\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 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(\n data: ParentDragEventData,\n state: DragState\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 Object.assign(eventCoordinates(data.e));\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(e: PointeroverParentEvent) {\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({\n currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n state,\n}: {\n currentParent: ParentRecord;\n targetParent: ParentRecord;\n initialParent: ParentRecord;\n draggedNodes: Array>;\n state: BaseDragState;\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(\n data: NodeDragEventData,\n _state: DragState\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(\n data: NodeDragEventData,\n _state: DragState\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(\n data: NodeDragEventData | NodePointerEventData,\n state: DragState,\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(\n data: NodeDragEventData | NodePointerEventData,\n state: DragState\n) {\n const { x, y } = eventCoordinates(data.e);\n\n if (!validateSort(data, state, x, y)) return;\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(\n callback: any\n): (e: Event) => NodeEventData | undefined {\n function nodeTargetData(node: Node): NodeTargetData | 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(\n data: NodeEventData | ParentEventData,\n state: DragState\n): void {\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(\n callback: any\n): (e: Event) => NodeEventData | undefined {\n function parentTargetData(\n parent: HTMLElement\n ): ParentTargetData | 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,\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(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n function nodeSetter(node: Node, nodeData: NodeData) {\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);\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(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n function parentSetter(parent: HTMLElement, parentData: ParentData) {\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);\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 | ParentData | undefined,\n omitAppendPrivateClass = false\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n if (classNames.includes(\"longPress\")) return;\n\n if (!data) {\n el.classList.add(...classNames);\n\n return;\n }\n\n const privateClasses = [];\n\n for (const className of classNames) {\n if (!el.classList.contains(className)) {\n el.classList.add(className);\n } else if (\n el.classList.contains(className) &&\n omitAppendPrivateClass === false\n ) {\n privateClasses.push(className);\n }\n }\n\n data.privateClasses = privateClasses;\n\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,\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\n/**\n * Check if the element is scrollable on the x axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param style - The style.\n * @param rect - The rect.\n * @param state - The state.\n *\n * @returns void\n */\nfunction isScrollX(\n el: HTMLElement,\n e: PointerEvent,\n style: CSSStyleDeclaration,\n rect: DOMRect,\n state: SynthDragState\n): { left: boolean; right: boolean } {\n const threshold = 0.1;\n\n if (el === document.scrollingElement) {\n const canScrollLeft = el.scrollLeft > 0;\n const canScrollRight =\n el.scrollLeft + window.innerWidth < (state.rootScrollWidth || 0);\n\n return {\n right: canScrollRight && e.clientX > el.clientWidth * (1 - threshold),\n left: canScrollLeft && e.clientX < el.clientWidth * threshold,\n };\n }\n\n if (\n (style.overflowX === \"auto\" || style.overflowX === \"scroll\") &&\n el !== document.body &&\n el !== document.documentElement\n ) {\n const scrollWidth = el.scrollWidth;\n const offsetWidth = el.offsetWidth;\n const scrollLeft = el.scrollLeft;\n\n return {\n right:\n e.clientX > rect.left + offsetWidth * (1 - threshold) &&\n scrollLeft < scrollWidth - offsetWidth,\n left: e.clientX < rect.left + offsetWidth * threshold && scrollLeft > 0,\n };\n }\n\n return {\n right: false,\n left: false,\n };\n}\n\n/**\n * Check if the element is scrollable on the y axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param style - The style.\n * @param rect - The rect.\n *\n * @returns void\n */\nfunction isScrollY(\n el: HTMLElement,\n e: PointerEvent,\n style: CSSStyleDeclaration,\n rect: DOMRect\n): { up: boolean; down: boolean } {\n const threshold = 0.1;\n\n if (el === document.scrollingElement) {\n return {\n down: e.clientY > el.clientHeight * (1 - threshold),\n up: e.clientY < el.clientHeight * threshold,\n };\n }\n\n if (\n (style.overflowY === \"auto\" || style.overflowY === \"scroll\") &&\n el !== document.body &&\n el !== document.documentElement\n ) {\n const scrollHeight = el.scrollHeight;\n const offsetHeight = el.offsetHeight;\n const scrollTop = el.scrollTop;\n\n return {\n down:\n e.clientY > rect.top + offsetHeight * (1 - threshold) &&\n scrollTop < scrollHeight - offsetHeight,\n up: e.clientY < rect.top + offsetHeight * threshold && scrollTop > 0,\n };\n }\n\n return {\n down: false,\n up: false,\n };\n}\n\n/**\n * Scroll the element on the x axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param state - The state.\n * @param right - Whether to scroll right.\n *\n * @returns void\n */\nfunction scrollX(\n el: HTMLElement,\n e: PointerEvent,\n state: SynthDragState,\n right = true\n) {\n state.preventEnter = true;\n\n const incr = right ? 5 : -5;\n\n function scroll(el: HTMLElement) {\n el.scrollBy({ left: incr });\n\n moveNode(e, state, incr, 0);\n\n state.animationFrameIdX = requestAnimationFrame(scroll.bind(null, el));\n }\n\n state.animationFrameIdX = requestAnimationFrame(scroll.bind(null, el));\n}\n\n/**\n * Scroll the element on the y axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param state - The state.\n * @param up - Whether to scroll up.\n *\n * @returns void\n */\nfunction scrollY(\n el: Element,\n e: PointerEvent,\n state: SynthDragState,\n up = true\n) {\n state.preventEnter = true;\n\n const incr = up ? -5 : 5;\n\n function scroll() {\n el.scrollBy({ top: incr });\n\n moveNode(e, state, 0, incr);\n\n state.animationFrameIdY = requestAnimationFrame(scroll);\n }\n\n state.animationFrameIdY = requestAnimationFrame(scroll);\n}\n\n/**\n * Handle the synth scroll.\n *\n * @param coordinates - The coordinates.\n * @param e - The event.\n * @param state - The state.\n *\n * @returns void\n */\nfunction handleSynthScroll(\n coordinates: { x: number; y: number },\n e: PointerEvent,\n state: SynthDragState\n) {\n cancelSynthScroll(state);\n\n const scrollables: Record<\"x\" | \"y\", HTMLElement | null> = {\n x: null,\n y: null,\n };\n\n const els = document.elementsFromPoint(coordinates.x, coordinates.y);\n\n for (const el of els) {\n if (scrollables.x && scrollables.y) break;\n\n if (!(el instanceof HTMLElement)) continue;\n\n const rect = el.getBoundingClientRect();\n\n const style = window.getComputedStyle(el);\n\n if (!scrollables.x) {\n const { left, right } = isScrollX(el, e, style, rect, state);\n\n if (left || right) {\n scrollables.x = el;\n\n scrollX(el, e, state, right);\n }\n }\n\n if (!scrollables.y) {\n const { up, down } = isScrollY(el, e, style, rect);\n\n if (up || down) {\n scrollables.y = el;\n\n scrollY(el, e, state, up);\n }\n }\n }\n}\n\nexport function getElFromPoint(coordinates: {\n x: number;\n y: number;\n}): NodeFromPoint | ParentFromPoint | 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,\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,\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 });\n }\n\n return abortController;\n}\n"],"mappings":"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","names":["emit","on","state","insertState","state","draggedParentValues","documentController","handleNodeDragover","handleParentDragover","state","handleEnd","documentController","baseDragState","dragStateProps","nodes","emit","on","handleNodeDragover","handleParentDragover","handleEnd","handleNodePointerover","handleParentPointerover","draggedNodes","state","parent","x","scrollTimeout","node","scrollX","scrollY","className","el"]} \ No newline at end of file +{"version":3,"sources":["../src/utils.ts","../src/plugins/animations/index.ts","../src/plugins/insert/index.ts","../src/plugins/drop-or-swap/index.ts","../src/index.ts"],"sourcesContent":["/**\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\nexport function rect(el: HTMLElement) {\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() {\n const callbacks = new Map void>>();\n\n const emit = function (eventName: string, data: T) {\n if (!callbacks.get(eventName)) return;\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;\n const objB = valB as Record;\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// * Throttle a function.\n// *\n// * @param callback - The callback function to throttle.\n// * @param limit - The minimum time in milliseconds between function calls.\n// *\n// * @returns A throttled version of the callback function.\n// */\n//export function throttle(\n// callback: (...args: Args) => Return,\n// limit: number\n//): (...args: Args) => void {\n// let wait = false;\n// return function (...args: Args) {\n// if (!wait) {\n// callback.apply(null, args);\n// wait = true;\n// setTimeout(function () {\n// wait = false;\n// }, limit);\n// }\n// };\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 {\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 = {}) {\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(data: SetupNodeData) {\n if (!isDragState(state)) return;\n\n const duration = animationsConfig.duration || 150;\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);\n\n break;\n case \"above\":\n animate(data.node.el, slideDown, duration);\n\n break;\n case \"left\":\n animate(data.node.el, slideRight, duration);\n\n break;\n case \"right\":\n animate(data.node.el, slideLeft, duration);\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);\n } else if (xDiff > yDiff && !ascendingDirection) {\n animate(data.node.el, slideLeft, duration);\n }\n } else {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node.el, slideDown, duration);\n\n break;\n case \"above\":\n animate(data.node.el, slideUp, duration);\n\n break;\n case \"left\":\n animate(data.node.el, slideLeft, duration);\n\n break;\n case \"right\":\n animate(data.node.el, slideRight, duration);\n\n break;\n }\n }\n },\n };\n };\n}\n\nfunction animate(\n node: Node,\n animation: Keyframe[] | PropertyIndexedKeyframes,\n duration: number\n) {\n if (!state) return;\n\n state.preventEnter = true;\n\n node.animate(animation, {\n duration: duration,\n easing: \"ease-in-out\",\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 = {\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(insertConfig: InsertConfig) {\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 | SynthDragState\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\nfunction checkPosition(e: DragEvent | PointerEvent) {\n if (!isDragState(state)) return;\n\n const el = document.elementFromPoint(e.clientX, e.clientY);\n\n if (!(el instanceof HTMLElement)) return;\n\n if (!parents.has(el)) {\n const insertPoint = insertState.insertPoint;\n\n if (insertPoint?.el === el) return;\n\n if (insertPoint) insertPoint.el.style.display = \"none\";\n\n if (insertState.draggedOverParent) {\n removeClass(\n [insertState.draggedOverParent.el],\n insertState.draggedOverParent.data.config.dropZoneClass\n );\n }\n\n insertState.draggedOverNodes = [];\n\n insertState.draggedOverParent = null;\n\n state.currentParent = state.initialParent;\n }\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 const midpoint = nodeEdge + Math.abs(nodeEdge - otherEdge) / 2;\n\n return {\n y: isAscending ? [center, midpoint] : [midpoint, center],\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)) 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(data: NodeDragEventData) {\n const config = data.targetData.parent.data.config;\n\n if (!config.nativeDrag) return;\n\n data.e.preventDefault();\n}\n\nfunction processParentDragEvent(\n e: DragEvent | PointerEvent,\n targetData: ParentEventData[\"targetData\"],\n state: DragState,\n isNativeDrag: boolean\n) {\n const config = targetData.parent.data.config;\n\n if (!isNativeDrag && config.nativeDrag) return;\n\n pd(e);\n\n if (isNativeDrag) pd(e);\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 {\n moveOutside(realTargetParent, state);\n }\n\n state.currentParent = realTargetParent;\n}\n\nexport function handleParentDragover(\n data: ParentEventData,\n state: DragState\n) {\n processParentDragEvent(data.e as DragEvent, data.targetData, state, true);\n}\n\nexport function handleParentPointerover(data: PointeroverParentEvent) {\n const { detail } = data;\n\n const { state, targetData } = detail;\n\n if (state.scrolling) return;\n\n processParentDragEvent(detail.e, targetData, state, false);\n}\n\nexport function moveBetween(data: ParentRecord, state: DragState) {\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\n );\n }\n}\n\nfunction moveOutside(data: ParentRecord, state: DragState) {\n if (data.el === state.currentParent.el) return false;\n\n const targetConfig = data.data.config;\n\n if (state.draggedNode.el.contains(data.el)) return false;\n\n if (targetConfig.dropZone === false) return;\n\n const initialParentConfig = state.initialParent.data.config;\n\n if (targetConfig.accepts) {\n return targetConfig.accepts(\n data,\n state.initialParent,\n state.currentParent,\n state\n );\n } else if (\n !targetConfig.group ||\n targetConfig.group !== initialParentConfig.group\n ) {\n return false;\n }\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;\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;\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\n );\n }\n }\n}\n\nfunction findClosest(enabledNodes: NodeRecord[], state: DragState) {\n let foundRange: [NodeRecord, 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(\n parent: ParentRecord,\n insertState: InsertState\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, {\n position: \"absolute\",\n display: \"none\",\n });\n}\n\nfunction removeInsertPoint(insertState: InsertState) {\n if (insertState.insertPoint?.el) insertState.insertPoint.el.remove();\n\n insertState.insertPoint = null;\n}\n\nfunction positioninsertPoint(\n parent: ParentRecord,\n position: { x: number[]; y: number[]; vertical: boolean },\n ascending: boolean,\n node: NodeRecord,\n insertState: InsertState\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 if (position.vertical) {\n const topPosition =\n position.y[ascending ? 1 : 0] -\n insertState.insertPoint.el.getBoundingClientRect().height / 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 height: \"4px\",\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 width: \"4px\",\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 insertState.insertPoint.el.style.display = \"block\";\n}\n\nexport function handleParentDrop(_data: NodeDragEventData) {}\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(\n state: DragState | SynthDragState | BaseDragState\n) {\n if (!isDragState(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,\n previousValues: [...draggedParentValues],\n previousNodes: [...enabledNodes],\n nodes: [...state.initialParent.data.enabledNodes],\n values: [...newParentValues],\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes,\n previousPosition: originalIndex,\n position: index,\n state: state as DragState,\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[],\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[],\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[],\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[],\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 = {\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n draggedNodes: state.draggedNodes,\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\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} from \"../../types\";\nimport {\n parents,\n parentValues,\n setParentValues,\n addNodeClass,\n isSynthDragState,\n removeClass,\n addClass,\n state,\n addEvents,\n isDragState,\n} from \"../../index\";\n\nexport const dropSwapState: DropSwapState = {\n draggedOverNodes: Array>(),\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(dropSwapConfig: DropSwapConfig = {}) {\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 | SynthDragState\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\nfunction updateDraggedOverNodes(\n data: PointeroverNodeEvent | NodeDragEventData,\n state: DragState | SynthDragState\n) {\n const targetData =\n \"detail\" in data ? data.detail.targetData : data.targetData;\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(\n data: NodeDragEventData,\n state: DragState\n) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\n\n updateDraggedOverNodes(data, state);\n}\n\nexport function handleParentDragover(\n data: ParentDragEventData,\n state: DragState\n) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\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(data: PointeroverParentEvent) {\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(data: PointeroverNodeEvent) {\n if (!isSynthDragState(data.detail.state)) return;\n\n updateDraggedOverNodes(data, data.detail.state);\n}\n\nfunction swapElements(\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(state: DragState | SynthDragState) {\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[],\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 } 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","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 ParentKeydownEventData,\n SynthDragStateProps,\n ParentRecord,\n EventHandlers,\n NodeFromPoint,\n ParentFromPoint,\n ParentDragEventData,\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>}\n */\nexport const parents: ParentsData = new WeakMap<\n HTMLElement,\n ParentData\n>();\n\n/**\n * Nodes are the draggable items and the direct descendants of the parents.\n *\n * @type {WeakMap>}\n */\nexport const nodes: NodesData = new WeakMap>();\n\n/**\n * Function to check if touch support is enabled.\n *\n * @returns {boolean}\n */\nfunction checkTouchSupport() {\n if (!isBrowser) return false;\n\n return \"ontouchstart\" in window || navigator.maxTouchPoints > 0;\n}\n\n/**\n * The base drag state.\n *\n * @type {BaseDragState}\n */\nconst baseDragState = {\n activeDescendant: undefined,\n affectedNodes: [],\n coordinates: {\n x: 0,\n y: 0,\n },\n currentTargetValue: undefined,\n on,\n emit,\n newActiveDescendant: undefined,\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};\n\n/**\n * The state of the drag and drop.\n *\n * @type {BaseDragState}\n */\nexport let state: BaseDragState = 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 * Abort controller for the window.\n */\nlet windowController: AbortController | undefined;\n\n/**\n * Timeout for the scroll.\n */\nlet scrollTimeout: ReturnType;\n\n/**\n * Variable to check if the device is touch.\n */\nlet touchDevice: boolean = false;\n\nexport function resetState() {\n const baseDragState = {\n activeDescendant: undefined,\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 };\n\n state = { ...baseDragState } as BaseDragState;\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(\n dragStateProps: (SynthDragStateProps & DragStateProps) | DragStateProps\n): DragState | SynthDragState {\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 | SynthDragState;\n}\n\n/**\n *\n */\nfunction handleRootPointerdown(_e: PointerEvent) {\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(e: PointerEvent) {\n pd(e);\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\n/**\n * If we are currently dragging, then let's prevent default on dragover to avoid\n * the default behavior of the browser on drop.\n */\nfunction handleRootDragover(e: DragEvent) {\n if (!isDragState(state)) return;\n\n pd(e);\n}\n\nfunction handleRootPointermove(e: PointerEvent) {\n if (!state.pointerDown) return;\n\n //pd(e);\n\n const config = state.pointerDown.parent.data.config;\n\n if (\n !isSynthDragState(state) &&\n (touchDevice || (!touchDevice && !config.nativeDrag))\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 synthDragState = initSynthDrag(\n state.pointerDown.node,\n state.pointerDown.parent,\n e,\n state,\n nodes\n );\n\n state.rootUserSelect = window.getComputedStyle(\n document.documentElement\n ).userSelect;\n\n document.body.style.userSelect = \"none\";\n\n synthMove(e, synthDragState);\n } else if (isSynthDragState(state)) {\n synthMove(e, state);\n }\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({\n parent,\n getValues,\n setValues,\n config = {},\n}: DragAndDrop): void {\n if (!isBrowser) return;\n\n touchDevice = checkTouchSupport();\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: (e: TouchEvent) => {\n if (isDragState(state) && e.cancelable) pd(e);\n },\n });\n\n const liveRegion = document.createElement(\"div\");\n\n setAttrs(liveRegion, {\n \"aria-live\": \"polite\",\n \"aria-atomic\": \"true\",\n \"data-dnd-live-region\": \"true\",\n });\n\n Object.assign(liveRegion.style, {\n position: \"absolute\",\n top: \"0px\",\n left: \"-9999px\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n overflow: \"hidden\",\n clip: \"rect(0, 0, 0, 0)\",\n whiteSpace: \"nowrap\",\n border: \"0\",\n });\n\n document.body.appendChild(liveRegion);\n }\n\n if (!windowController)\n windowController = addEvents(window, {\n resize: () => {\n touchDevice = checkTouchSupport();\n },\n });\n\n tearDown(parent);\n\n const [emit, on] = createEmitter();\n\n const parentData: ParentData = {\n getValues,\n setValues,\n config: {\n dragDropEffect: config.dragDropEffect ?? \"move\",\n dragEffectAllowed: config.dragEffectAllowed ?? \"move\",\n draggedNodes,\n dragstartClasses,\n deepCopyStyles: config.deepCopyStyles ?? false,\n handleNodeKeydown,\n handleParentKeydown,\n handleDragstart,\n handleNodeDragover,\n handleParentDragover,\n handleNodeDrop,\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(\n node: NodeRecord,\n parent: ParentRecord,\n e: PointerEvent | DragEvent,\n draggedNodes: Array>,\n offsetX?: number,\n offsetY?: number\n): DragStateProps {\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 // Need to account for if the explicity offset is positive or negative\n startLeft: offsetX ? offsetX : x - rect.left,\n startTop: offsetY ? offsetY : y - rect.top,\n targetIndex: node.data.index,\n transferred: false,\n };\n}\n\nexport function performSort({\n parent,\n draggedNodes,\n targetNodes,\n}: {\n parent: ParentRecord;\n draggedNodes: Array>;\n targetNodes: Array>;\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,\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,\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(\n parent: ParentRecord,\n newActiveNode: NodeRecord | undefined,\n state: BaseDragState\n) {\n const activeDescendantClass = parent.data.config.activeDescendantClass;\n\n if (state.activeState) {\n {\n removeClass([state.activeState.node.el], activeDescendantClass);\n\n if (state.activeState.parent.el !== parent.el)\n state.activeState.parent.el.setAttribute(\"aria-activedescendant\", \"\");\n }\n }\n\n if (!newActiveNode) {\n state.activeState?.parent.el.setAttribute(\"aria-activedescendant\", \"\");\n\n state.activeState = undefined;\n\n return;\n }\n\n state.activeState = {\n node: newActiveNode,\n parent,\n };\n\n addNodeClass([newActiveNode.el], activeDescendantClass);\n\n state.activeState.parent.el.setAttribute(\n \"aria-activedescendant\",\n state.activeState.node.el.id\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>} nodes - The nodes to deselect.\n * @param {ParentRecord} parent - The parent record.\n * @param {BaseDragState} state - The current drag state.\n */\nfunction deselect(\n nodes: Array>,\n parent: ParentRecord,\n state: BaseDragState\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 clearLiveRegion(parent);\n}\n\n/**\n * This function sets the selected nodes. This will clean the prior selected state\n * as well as removing any classes or attributes set.\n *\n * @param {ParentRecord} parent - The parent record.\n * @param {Array>} selectedNodes - The nodes to select.\n * @param {NodeRecord | undefined} newActiveNode - The new active node.\n * @param {BaseDragState} state - The current drag state.\n * @param {boolean} pointerdown - Whether the pointerdown event was triggered.\n */\nfunction setSelected(\n parent: ParentRecord,\n selectedNodes: Array>,\n newActiveNode: NodeRecord | undefined,\n state: BaseDragState,\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 const selectedItems = selectedNodes.map((x) =>\n x.el.getAttribute(\"aria-label\")\n );\n\n if (selectedItems.length === 0) {\n state.selectedState = undefined;\n\n clearLiveRegion(parent);\n\n return;\n }\n\n setActive(parent, newActiveNode, state);\n\n updateLiveRegion(\n parent,\n `${selectedItems.join(\n \", \"\n )} ready for dragging. Use arrow keys to navigate. Press enter to drop ${selectedItems.join(\n \", \"\n )}.`\n );\n}\n\nfunction updateLiveRegion(parent: ParentRecord, message: string) {\n const liveRegion = document.querySelector('[data-dnd-live-region=\"true\"]');\n\n if (!liveRegion) return;\n\n liveRegion.id = parent.el.id + \"-live-region\";\n\n liveRegion.textContent = message;\n}\n\nfunction clearLiveRegion(parent: ParentRecord) {\n const liveRegion = document.getElementById(parent.el.id + \"-live-region\");\n\n if (!liveRegion) return;\n\n liveRegion.textContent = \"\";\n}\n\nexport function handleParentFocus(\n data: ParentEventData,\n state: BaseDragState | DragState | SynthDragState\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({\n currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n initialIndex,\n targetNodes,\n state,\n}: {\n currentParent: ParentRecord;\n targetParent: ParentRecord;\n initialParent: ParentRecord;\n draggedNodes: Array>;\n initialIndex: number;\n state: BaseDragState | DragState | SynthDragState;\n targetNodes: Array>;\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(\n parent: HTMLElement,\n parentData: ParentData\n): Array {\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(\n parent: HTMLElement,\n parentData: ParentData,\n values: Array\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(state: DragState): Array {\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(\n parent: HTMLElement,\n config: Partial>\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(\n data: ParentEventData,\n state: DragState\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 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(\n state: BaseDragState\n): state is DragState | SynthDragState {\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(\n state: BaseDragState\n): state is SynthDragState {\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(parent: HTMLElement, parentData: ParentData): void {\n parentData.abortControllers.mainParent = addEvents(parent, {\n keydown: parentEventData(parentData.config.handleParentKeydown),\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 };\n\n draggableItem.draggable = true;\n },\n }\n );\n }\n\n if (parent.id)\n setAttrs(parent, {\n role: \"listbox\",\n tabindex: \"0\",\n \"aria-multiselectable\": parentData.config.multiDrag ? \"true\" : \"false\",\n \"aria-activedescendant\": \"\",\n \"aria-describedby\": parent.id + \"-live-region\",\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) {\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(data: SetupNodeData) {\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 pointerup: nodeEventData(config.handleNodePointerup),\n pointercancel: nodeEventData(config.handlePointercancel),\n\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 (touchDevice) pd(e);\n },\n });\n\n data.node.el.setAttribute(\"role\", \"option\");\n\n data.node.el.setAttribute(\"aria-selected\", \"false\");\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(data: SetupNodeData) {\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(node: Node, parentData: ParentData) {\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(data: TearDownNodeData) {\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(data: TearDownNodeData) {\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 allSelectedAndActiveNodes = document.querySelectorAll(\n `[aria-selected=\"true\"]`\n );\n\n const parentData = parents.get(parentEl);\n\n if (!parentData) return;\n\n for (let x = 0; x < allSelectedAndActiveNodes.length; x++) {\n const node = allSelectedAndActiveNodes[x];\n\n node.setAttribute(\"aria-selected\", \"false\");\n\n removeClass([node], parentData.config.selectedClass);\n }\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(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 = [];\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 }\n }\n\n if (\n enabledNodes.length !== parentData.getValues(parent).length &&\n !config.disabled\n ) {\n console.warn(\n \"The number of draggable items defined in the parent element does not match the number of values. This may cause unexpected behavior.\"\n );\n\n return;\n }\n\n const values = parentData.getValues(parent);\n\n const enabledNodeRecords: Array> = [];\n\n for (let x = 0; x < enabledNodes.length; x++) {\n const node = enabledNodes[x];\n\n const prevNodeData = nodes.get(node);\n\n if (config.draggableValue && !config.draggableValue(values[x])) continue;\n\n const nodeData = Object.assign(\n prevNodeData ?? {\n privateClasses: [],\n abortControllers: {},\n },\n {\n value: values[x],\n index: x,\n }\n );\n\n if (\n !isDragState(state) &&\n state.newActiveDescendant &&\n eq(state.newActiveDescendant.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 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): 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(pointerDown: {\n parent: ParentRecord;\n node: NodeRecord;\n}): Array> {\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>),\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(_data: ParentEventData) {\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(\n data: NodeDragEventData,\n _state: BaseDragState\n) {\n const config = data.targetData.parent.data.config;\n\n if (\n !config.nativeDrag ||\n !validateDragstart(data) ||\n !validateDragHandle({\n x: data.e.clientX,\n y: data.e.clientY,\n node: data.targetData.node,\n config,\n })\n ) {\n pd(data.e);\n\n return;\n }\n\n const nodes = config.draggedNodes({\n parent: data.targetData.parent,\n node: 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 config.onDragstart({\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}\n\nexport function handleNodePointerdown(\n data: NodePointerEventData,\n state: BaseDragState\n) {\n sp(data.e);\n\n if (\n !validateDragHandle({\n x: data.e.clientX,\n y: data.e.clientY,\n node: data.targetData.node,\n config: data.targetData.parent.data.config,\n })\n )\n return;\n\n state.pointerDown = {\n parent: data.targetData.parent,\n node: data.targetData.node,\n };\n\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 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 && touchDevice) {\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(\n _node: NodeRecord,\n nodes: Array>,\n config: ParentConfig,\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.activeDescendantClass\n );\n\n removeClass(\n nodes.map((x) => x.el),\n config.selectedClass\n );\n });\n}\n\n/**\n * Initialize the drag state.\n *\n * @param data - The node drag event data.\n * @param draggedNodes - The dragged nodes.\n *\n * @returns The drag state.\n */\nexport function initDrag(\n data: NodeDragEventData,\n draggedNodes: Array>\n): DragState {\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\n data.e.dataTransfer.effectAllowed = config.dragEffectAllowed;\n\n let dragImage: HTMLElement | undefined;\n\n if (config.dragImage) {\n dragImage = config.dragImage(data, draggedNodes);\n } else {\n if (!config.multiDrag) {\n data.e.dataTransfer.setDragImage(\n data.targetData.node.el,\n data.e.offsetX,\n data.e.offsetY\n );\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n return dragState;\n } else {\n const wrapper = document.createElement(\"div\");\n\n for (const node of draggedNodes) {\n const clonedNode = node.el.cloneNode(true) as HTMLElement;\n\n clonedNode.style.pointerEvents = \"none\";\n\n clonedNode.id = node.el.id + \"-clone\";\n\n wrapper.append(clonedNode);\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 });\n\n dragImage = wrapper;\n }\n\n document.body.appendChild(dragImage);\n }\n\n data.e.dataTransfer.setDragImage(dragImage, data.e.offsetX, data.e.offsetY);\n\n setTimeout(() => {\n dragImage?.remove();\n });\n }\n\n return dragState;\n}\n\nexport function validateDragHandle({\n x,\n y,\n node,\n config,\n}: {\n x: number;\n y: number;\n node: NodeRecord;\n config: ParentConfig;\n}): boolean {\n if (config.externalDragHandle) return false;\n\n if (!config.dragHandle) return true;\n\n const dragHandles = node.el.querySelectorAll(config.dragHandle);\n\n if (!dragHandles) return false;\n\n const elFromPoint = config.root.elementFromPoint(x, y);\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(_data: NodeEventData) {}\n\nexport function handleClickParent(_data: ParentEventData) {}\n\nexport function handleNodeKeydown(_data: NodeEventData) {}\n\nexport function handleParentKeydown(\n data: ParentKeydownEventData,\n state: BaseDragState\n) {\n const activeDescendant = state.activeState?.node;\n\n if (!activeDescendant) return;\n\n const parentData = data.targetData.parent.data;\n\n const enabledNodes = parentData.enabledNodes;\n\n if (!(data.e.target instanceof HTMLElement)) return;\n const index = enabledNodes.findIndex((x) => x.el === activeDescendant.el);\n\n if (index === -1) return;\n\n if (\n [\"ArrowDown\", \"ArrowUp\", \"ArrowRight\", \"ArrowLeft\"].includes(data.e.key)\n ) {\n pd(data.e);\n\n const nextIndex =\n data.e.key === \"ArrowDown\" || data.e.key === \"ArrowRight\"\n ? index + 1\n : index - 1;\n\n if (nextIndex < 0 || nextIndex >= enabledNodes.length) return;\n\n const nextNode = enabledNodes[nextIndex];\n\n setActive(data.targetData.parent, nextNode, state);\n } else if (data.e.key === \" \") {\n pd(data.e);\n\n state.selectedState && state.selectedState.nodes.includes(activeDescendant)\n ? setSelected(\n data.targetData.parent,\n state.selectedState.nodes.filter((x) => x.el !== activeDescendant.el),\n activeDescendant,\n state\n )\n : setSelected(\n data.targetData.parent,\n [activeDescendant],\n activeDescendant,\n state\n );\n } else if (data.e.key === \"Enter\" && state.selectedState) {\n if (\n state.selectedState.parent.el === data.targetData.parent.el &&\n state.activeState\n ) {\n if (state.selectedState.nodes[0].el === state.activeState.node.el) {\n updateLiveRegion(data.targetData.parent, \"Cannot drop item on itself\");\n\n return;\n }\n\n state.newActiveDescendant = state.selectedState.nodes[0];\n\n parentData.config.performSort({\n parent: data.targetData.parent,\n draggedNodes: state.selectedState.nodes,\n targetNodes: [state.activeState.node],\n });\n\n deselect([], data.targetData.parent, state);\n\n updateLiveRegion(data.targetData.parent, \"Drop successful\");\n } else if (\n state.activeState &&\n state.selectedState.parent.el !== data.targetData.parent.el &&\n validateTransfer({\n currentParent: data.targetData.parent,\n targetParent: state.selectedState.parent,\n initialParent: state.selectedState.parent,\n draggedNodes: state.selectedState.nodes,\n state,\n })\n ) {\n parentData.config.performTransfer({\n currentParent: state.selectedState.parent,\n targetParent: data.targetData.parent,\n initialParent: state.selectedState.parent,\n draggedNodes: state.selectedState.nodes,\n initialIndex: state.selectedState.nodes[0].data.index,\n state,\n targetNodes: [state.activeState.node],\n });\n\n state.newActiveDescendant = state.selectedState.nodes[0];\n\n setSelected(data.targetData.parent, [], undefined, state);\n\n updateLiveRegion(data.targetData.parent, \"Drop successful\");\n }\n }\n}\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;\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(e: PointeroverNodeEvent) {\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(\n data: NodeDragEventData,\n state: DragState | SynthDragState\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\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(\n data: NodeDragEventData,\n state: DragState\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(\n data: NodeEventData,\n state: DragState | SynthDragState | BaseDragState\n) {\n if (!isSynthDragState(state)) return;\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(state: DragState | SynthDragState) {\n if (state.draggedNode) state.draggedNode.el.draggable = false;\n\n document.body.style.userSelect = state.rootUserSelect || \"\";\n\n if (isSynthDragState(state)) {\n document.documentElement.style.overscrollBehavior =\n state.rootOverScrollBehavior || \"\";\n\n document.documentElement.style.touchAction = state.rootTouchAction || \"\";\n }\n\n if (isSynthDragState(state)) cancelSynthScroll(state);\n\n if (\"longPressTimeout\" in state && state.longPressTimeout)\n clearTimeout(state.longPressTimeout);\n\n const config = parents.get(state.initialParent.el)?.config;\n\n const isSynth = isSynthDragState(state);\n\n const dropZoneClass = isSynth\n ? config?.synthDropZoneClass\n : config?.dropZoneClass;\n\n if (state.originalZIndex !== undefined)\n state.draggedNode.el.style.zIndex = state.originalZIndex;\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n state.initialParent.data?.config?.longPressClass\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n isSynth\n ? state.initialParent.data.config.synthDragPlaceholderClass\n : state.initialParent.data?.config?.dragPlaceholderClass\n );\n\n if (isSynth) state.clonedDraggedNode.remove();\n\n deselect(state.draggedNodes, state.currentParent, state);\n\n setActive(state.currentParent, undefined, state);\n\n resetState();\n\n state.selectedState = undefined;\n\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 state.emit(\"dragEnded\", state);\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(\n data: NodePointerEventData,\n state: DragState | SynthDragState | BaseDragState\n) {\n sp(data.e);\n\n state.pointerDown = undefined;\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 removeClass(\n data.targetData.parent.data.enabledNodes.map((x) => x.el),\n config.longPressClass\n );\n\n if (!isDragState(state)) return;\n\n config.handleEnd(state as DragState | SynthDragState);\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 *\n * @returns The synth drag state.\n */\nfunction initSynthDrag(\n node: NodeRecord,\n parent: ParentRecord,\n e: PointerEvent,\n _state: BaseDragState,\n draggedNodes: Array>\n): SynthDragState {\n const config = parent.data.config;\n\n let dragImage: HTMLElement | undefined;\n\n let display = node.el.style.display;\n\n let result = undefined;\n\n if (config.synthDragImage) {\n result = config.synthDragImage(node, parent, e, draggedNodes);\n\n dragImage = result.dragImage;\n\n dragImage.setAttribute(\"popover\", \"manual\");\n\n dragImage.id = \"dnd-dragged-node-clone\";\n\n display = dragImage.style.display;\n\n Object.assign(dragImage.style, {\n position: \"absolute\",\n zIndex: 9999,\n pointerEvents: \"none\",\n margin: 0,\n willChange: \"transform\",\n overflow: \"hidden\",\n display: \"none\",\n });\n } else {\n if (!config.multiDrag || draggedNodes.length === 1) {\n dragImage = node.el.cloneNode(true) as HTMLElement;\n\n dragImage.id = \"dnd-dragged-node-clone\";\n\n display = dragImage.style.display;\n\n dragImage.setAttribute(\"popover\", \"manual\");\n\n Object.assign(dragImage.style, {\n position: \"absolute\",\n height: node.el.getBoundingClientRect().height + \"px\",\n width: node.el.getBoundingClientRect().width + \"px\",\n overflow: \"hidden\",\n margin: 0,\n willChange: \"transform\",\n pointerEvents: \"none\",\n zIndex: 9999,\n });\n } else {\n const wrapper = document.createElement(\"div\");\n\n wrapper.setAttribute(\"popover\", \"manual\");\n\n for (const node of draggedNodes) {\n const clonedNode = node.el.cloneNode(true) as HTMLElement;\n\n clonedNode.style.pointerEvents = \"none\";\n\n wrapper.append(clonedNode);\n }\n\n display = wrapper.style.display;\n\n wrapper.id = \"dnd-dragged-node-clone\";\n\n dragImage = wrapper;\n\n Object.assign(dragImage.style, {\n display: \"flex\",\n flexDirection: \"column\",\n position: \"absolute\",\n overflow: \"hidden\",\n margin: 0,\n padding: 0,\n pointerEvents: \"none\",\n zIndex: 9999,\n });\n }\n }\n\n dragImage.style.position = \"absolute\";\n\n parent.el.appendChild(dragImage);\n\n dragImage.showPopover();\n\n const synthDragStateProps = {\n clonedDraggedEls: [],\n clonedDraggedNode: dragImage,\n draggedNodeDisplay: display,\n synthDragScrolling: false,\n synthDragging: true,\n rootScrollWidth: document.scrollingElement?.scrollWidth,\n rootScrollHeight: document.scrollingElement?.scrollHeight,\n rootOverScrollBehavior: document.documentElement.style.overscrollBehavior,\n rootTouchAction: document.documentElement.style.touchAction,\n };\n\n document.documentElement.style.overscrollBehavior = \"none\";\n\n document.documentElement.style.touchAction = \"none\";\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;\n\n synthDragState.clonedDraggedNode.style.display =\n synthDragState.draggedNodeDisplay || \"\";\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(\n data: NodePointerEventData,\n state: BaseDragState,\n node: NodeRecord\n) {\n const config = data.targetData.parent.data.config;\n\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 || 200);\n}\n\nfunction pointermoveClasses(\n state: SynthDragState,\n config: ParentConfig\n) {\n if (config.longPressClass)\n removeClass(\n state.draggedNodes.map((x) => x.el),\n config?.longPressClass\n );\n}\n\nfunction cancelSynthScroll(\n state: SynthDragState,\n cancelX = true,\n cancelY = true\n) {\n if (cancelX && state.animationFrameIdX !== undefined) {\n cancelAnimationFrame(state.animationFrameIdX);\n\n state.animationFrameIdX = undefined;\n }\n\n if (cancelY && state.animationFrameIdY !== undefined) {\n cancelAnimationFrame(state.animationFrameIdY);\n\n state.animationFrameIdY = undefined;\n }\n\n if (!state.animationFrameIdX && !state.animationFrameIdY) {\n state.preventEnter = false;\n }\n}\n\nfunction moveNode(\n e: PointerEvent,\n state: SynthDragState,\n scrollX = 0,\n scrollY = 0\n) {\n const { x, y } = eventCoordinates(e);\n\n state.coordinates.y = y;\n state.coordinates.x = x;\n\n const startLeft = state.startLeft ?? 0;\n const startTop = state.startTop ?? 0;\n\n console.log(\"window scroll y\", window.scrollY);\n console.log(\"start top\", startTop);\n\n // Calculate the translation values\n const translateX = x - startLeft + window.scrollX;\n const translateY = y - startTop + window.scrollY;\n\n // Apply the transform using translate\n state.clonedDraggedNode.style.transform = `translate(${\n translateX + scrollX\n }px, ${translateY + scrollY}px)`;\n\n console.log(\"translate y\", translateY + scrollY);\n\n if (e.cancelable) pd(e);\n\n pointermoveClasses(state, state.initialParent.data.config);\n}\n\n/**\n * Handle the synth move.\n *\n * @param e - The pointer event.\n * @param state - The synth drag state.\n *\n * @returns void\n */\nexport function synthMove(e: PointerEvent, state: SynthDragState) {\n moveNode(e, state);\n\n const coordinates = eventCoordinates(e);\n\n handleSynthScroll(coordinates, e, state);\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 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(\n data: NodeDragEventData,\n state: DragState\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 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(\n data: ParentDragEventData,\n state: DragState\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 Object.assign(eventCoordinates(data.e));\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(e: PointeroverParentEvent) {\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({\n currentParent,\n targetParent,\n initialParent,\n draggedNodes,\n state,\n}: {\n currentParent: ParentRecord;\n targetParent: ParentRecord;\n initialParent: ParentRecord;\n draggedNodes: Array>;\n state: BaseDragState;\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(\n data: NodeDragEventData,\n _state: DragState\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(\n data: NodeDragEventData,\n _state: DragState\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(\n data: NodeDragEventData | NodePointerEventData,\n state: DragState,\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(\n data: NodeDragEventData | NodePointerEventData,\n state: DragState\n) {\n const { x, y } = eventCoordinates(data.e);\n\n if (!validateSort(data, state, x, y)) return;\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(\n callback: any\n): (e: Event) => NodeEventData | undefined {\n function nodeTargetData(node: Node): NodeTargetData | 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(\n data: NodeEventData | ParentEventData,\n state: DragState\n): void {\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(\n callback: any\n): (e: Event) => NodeEventData | undefined {\n function parentTargetData(\n parent: HTMLElement\n ): ParentTargetData | 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,\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(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n function nodeSetter(node: Node, nodeData: NodeData) {\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);\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(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n function parentSetter(parent: HTMLElement, parentData: ParentData) {\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);\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 | ParentData | undefined,\n omitAppendPrivateClass = false\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n if (classNames.includes(\"longPress\")) return;\n\n if (!data) {\n el.classList.add(...classNames);\n\n return;\n }\n\n const privateClasses = [];\n\n for (const className of classNames) {\n if (!el.classList.contains(className)) {\n el.classList.add(className);\n } else if (\n el.classList.contains(className) &&\n omitAppendPrivateClass === false\n ) {\n privateClasses.push(className);\n }\n }\n\n data.privateClasses = privateClasses;\n\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,\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\n/**\n * Check if the element is scrollable on the x axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param style - The style.\n * @param rect - The rect.\n * @param state - The state.\n *\n * @returns void\n */\nfunction isScrollX(\n el: HTMLElement,\n e: PointerEvent,\n style: CSSStyleDeclaration,\n rect: DOMRect,\n state: SynthDragState\n): { left: boolean; right: boolean } {\n const threshold = 0.1;\n\n if (el === document.scrollingElement) {\n const canScrollLeft = el.scrollLeft > 0;\n const canScrollRight =\n el.scrollLeft + window.innerWidth < (state.rootScrollWidth || 0);\n\n return {\n right: canScrollRight && e.clientX > el.clientWidth * (1 - threshold),\n left: canScrollLeft && e.clientX < el.clientWidth * threshold,\n };\n }\n\n if (\n (style.overflowX === \"auto\" || style.overflowX === \"scroll\") &&\n el !== document.body &&\n el !== document.documentElement\n ) {\n const scrollWidth = el.scrollWidth;\n const offsetWidth = el.offsetWidth;\n const scrollLeft = el.scrollLeft;\n\n return {\n right:\n e.clientX > rect.left + offsetWidth * (1 - threshold) &&\n scrollLeft < scrollWidth - offsetWidth,\n left: e.clientX < rect.left + offsetWidth * threshold && scrollLeft > 0,\n };\n }\n\n return {\n right: false,\n left: false,\n };\n}\n\n/**\n * Check if the element is scrollable on the y axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param style - The style.\n * @param rect - The rect.\n *\n * @returns void\n */\nfunction isScrollY(\n el: HTMLElement,\n e: PointerEvent,\n style: CSSStyleDeclaration,\n rect: DOMRect\n): { up: boolean; down: boolean } {\n const threshold = 0.1;\n\n if (el === document.scrollingElement) {\n return {\n down: e.clientY > el.clientHeight * (1 - threshold),\n up: e.clientY < el.clientHeight * threshold,\n };\n }\n\n if (\n (style.overflowY === \"auto\" || style.overflowY === \"scroll\") &&\n el !== document.body &&\n el !== document.documentElement\n ) {\n const scrollHeight = el.scrollHeight;\n const offsetHeight = el.offsetHeight;\n const scrollTop = el.scrollTop;\n\n return {\n down:\n e.clientY > rect.top + offsetHeight * (1 - threshold) &&\n scrollTop < scrollHeight - offsetHeight,\n up: e.clientY < rect.top + offsetHeight * threshold && scrollTop > 0,\n };\n }\n\n return {\n down: false,\n up: false,\n };\n}\n\n/**\n * Scroll the element on the x axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param state - The state.\n * @param right - Whether to scroll right.\n *\n * @returns void\n */\nfunction scrollX(\n el: HTMLElement,\n e: PointerEvent,\n state: SynthDragState,\n right = true\n) {\n state.preventEnter = true;\n\n const incr = right ? 5 : -5;\n\n function scroll(el: HTMLElement) {\n el.scrollBy({ left: incr });\n\n moveNode(e, state, incr, 0);\n\n state.animationFrameIdX = requestAnimationFrame(scroll.bind(null, el));\n }\n\n state.animationFrameIdX = requestAnimationFrame(scroll.bind(null, el));\n}\n\n/**\n * Scroll the element on the y axis.\n *\n * @param el - The element.\n * @param e - The event.\n * @param state - The state.\n * @param up - Whether to scroll up.\n *\n * @returns void\n */\nfunction scrollY(\n el: Element,\n e: PointerEvent,\n state: SynthDragState,\n up = true\n) {\n state.preventEnter = true;\n\n const incr = up ? -5 : 5;\n\n function scroll() {\n el.scrollBy({ top: incr });\n\n moveNode(e, state, 0, incr);\n\n state.animationFrameIdY = requestAnimationFrame(scroll);\n }\n\n state.animationFrameIdY = requestAnimationFrame(scroll);\n}\n\n/**\n * Handle the synth scroll.\n *\n * @param coordinates - The coordinates.\n * @param e - The event.\n * @param state - The state.\n *\n * @returns void\n */\nfunction handleSynthScroll(\n coordinates: { x: number; y: number },\n e: PointerEvent,\n state: SynthDragState\n) {\n cancelSynthScroll(state);\n\n const scrollables: Record<\"x\" | \"y\", HTMLElement | null> = {\n x: null,\n y: null,\n };\n\n const els = document.elementsFromPoint(coordinates.x, coordinates.y);\n\n for (const el of els) {\n if (scrollables.x && scrollables.y) break;\n\n if (!(el instanceof HTMLElement)) continue;\n\n const rect = el.getBoundingClientRect();\n\n const style = window.getComputedStyle(el);\n\n if (!scrollables.x) {\n const { left, right } = isScrollX(el, e, style, rect, state);\n\n if (left || right) {\n scrollables.x = el;\n\n scrollX(el, e, state, right);\n }\n }\n\n if (!scrollables.y) {\n const { up, down } = isScrollY(el, e, style, rect);\n\n if (up || down) {\n scrollables.y = el;\n\n scrollY(el, e, state, up);\n }\n }\n }\n}\n\nexport function getElFromPoint(coordinates: {\n x: number;\n y: number;\n}): NodeFromPoint | ParentFromPoint | 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,\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,\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 });\n }\n\n return abortController;\n}\n"],"mappings":"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","names":["emit","on","state","insertState","state","draggedParentValues","documentController","handleNodeDragover","handleParentDragover","state","handleEnd","documentController","baseDragState","dragStateProps","nodes","emit","on","handleNodeDragover","handleParentDragover","handleEnd","handleNodePointerover","handleParentPointerover","draggedNodes","state","parent","x","scrollTimeout","node","scrollX","scrollY","className","el"]} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 944e168..de20947 100644 --- a/src/index.ts +++ b/src/index.ts @@ -241,37 +241,6 @@ function handleRootKeydown(e: KeyboardEvent) { function handleRootDrop(_e: DragEvent) {} -export function copyNodeStyle( - sourceNode: HTMLElement, - targetNode: HTMLElement, - omitKeys = false -) { - const computedStyle = window.getComputedStyle(sourceNode); - - const omittedKeys = [ - "position", - "z-index", - "top", - "left", - "x", - "pointer-events", - "y", - "transform-origin", - "filter", - "-webkit-text-fill-color", - ]; - - for (const key of Array.from(computedStyle)) { - if (omitKeys === false && key && omittedKeys.includes(key)) continue; - - targetNode.style.setProperty( - key, - computedStyle.getPropertyValue(key), - computedStyle.getPropertyPriority(key) - ); - } -} - /** * If we are currently dragging, then let's prevent default on dragover to avoid * the default behavior of the browser on drop. @@ -2172,16 +2141,14 @@ function initSynthDrag( zIndex: 9999, pointerEvents: "none", margin: 0, + willChange: "transform", overflow: "hidden", display: "none", }); } else { if (!config.multiDrag || draggedNodes.length === 1) { - console.log("boom"); dragImage = node.el.cloneNode(true) as HTMLElement; - copyNodeStyle(node.el, dragImage); - dragImage.id = "dnd-dragged-node-clone"; display = dragImage.style.display; @@ -2194,20 +2161,18 @@ function initSynthDrag( width: node.el.getBoundingClientRect().width + "px", overflow: "hidden", margin: 0, + willChange: "transform", pointerEvents: "none", zIndex: 9999, }); } else { const wrapper = document.createElement("div"); - console.log("getting here"); wrapper.setAttribute("popover", "manual"); for (const node of draggedNodes) { const clonedNode = node.el.cloneNode(true) as HTMLElement; - copyNodeStyle(node.el, clonedNode); - clonedNode.style.pointerEvents = "none"; wrapper.append(clonedNode);