diff --git a/dist/index.cjs b/dist/index.cjs index ff80295..56c1a1a 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -2101,6 +2101,7 @@ function initDrag(data, draggedNodes2) { dragImage = config.dragImage(data, draggedNodes2); } else { if (!config.multiDrag || draggedNodes2.length === 1) { + dragState.originalZIndex = data.targetData.node.el.style.zIndex; data.targetData.node.el.style.zIndex = "9999"; data.targetData.node.el.style.boxSizing = "border-box"; data.e.dataTransfer.setDragImage( @@ -2108,7 +2109,6 @@ function initDrag(data, draggedNodes2) { data.e.offsetX, data.e.offsetY ); - dragState.originalZIndex = data.targetData.node.el.style.zIndex; return dragState; } else { const wrapper = document.createElement("div"); diff --git a/dist/index.cjs.map b/dist/index.cjs.map index d266a12..ddae61e 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 SynthDragStateProps,\n ParentRecord,\n EventHandlers,\n NodeFromPoint,\n ParentFromPoint,\n ParentDragEventData,\n DragstartEventData,\n} from \"./types\";\n\nimport {\n pd,\n sp,\n on,\n emit,\n createEmitter,\n eq,\n splitClass,\n eventCoordinates,\n} from \"./utils\";\n\nexport * from \"./types\";\nexport { animations } from \"./plugins/animations\";\nexport { insert } from \"./plugins/insert\";\nexport { dropOrSwap } from \"./plugins/drop-or-swap\";\n\n/**\n * Check to see if code is running in a browser.\n */\nexport const isBrowser = typeof window !== \"undefined\";\n\n/**\n * Parents or \"lists\" are the containers that nodes or \"draggable items\" can be\n * dragged from and into.\n *\n * @type {WeakMap>}\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\nfunction isMobilePlatform() {\n if (!isBrowser) return false;\n\n if (\"userAgentData\" in navigator) {\n return (navigator.userAgentData as { mobile: boolean }).mobile === true;\n }\n\n const ua = navigator.userAgent;\n\n const isMobileUA = /android|iphone|ipod/i.test(ua);\n\n const isIpad =\n /iPad/.test(ua) ||\n (ua.includes(\"Macintosh\") && navigator.maxTouchPoints > 1);\n\n return isMobileUA || isIpad;\n}\n\n/**\n * The base drag state.\n *\n * @type {BaseDragState}\n */\nconst baseDragState = {\n affectedNodes: [],\n coordinates: {\n x: 0,\n y: 0,\n },\n currentTargetValue: undefined,\n on,\n emit,\n originalZIndex: undefined,\n pointerSelection: false,\n preventEnter: false,\n rootUserSelect: undefined,\n nodePointerdown: undefined,\n longPress: false,\n scrolling: false,\n longPressTimeout: undefined,\n remapJustFinished: false,\n selectedNodes: [],\n selectedParent: undefined,\n preventSynthDrag: false,\n pointerDown: undefined,\n lastScrollContainerX: null,\n lastScrollContainerY: null,\n rootScrollWidth: undefined,\n rootScrollHeight: undefined,\n dragItemRect: undefined,\n windowScrollX: undefined,\n windowScrollY: undefined,\n lastScrollDirectionX: undefined,\n lastScrollDirectionY: undefined,\n scrollDebounceTimeout: undefined,\n frameIdX: undefined,\n frameIdY: undefined,\n};\n\n/**\n * The state of the drag and drop.\n *\n * @type {BaseDragState}\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 * Timeout for the scroll.\n */\nlet scrollTimeout: ReturnType;\n\nexport function resetState() {\n // Clear any existing timeouts to prevent stale references\n if (state.scrollDebounceTimeout) {\n clearTimeout(state.scrollDebounceTimeout);\n }\n\n if (state.longPressTimeout) {\n clearTimeout(state.longPressTimeout);\n }\n\n // Cancel any animation frames\n if (state.frameIdX !== undefined) {\n cancelAnimationFrame(state.frameIdX);\n }\n\n if (state.frameIdY !== undefined) {\n cancelAnimationFrame(state.frameIdY);\n }\n\n const baseDragState = {\n affectedNodes: [],\n coordinates: {\n x: 0,\n y: 0,\n },\n on,\n emit,\n currentTargetValue: undefined,\n originalZIndex: undefined,\n pointerId: undefined,\n preventEnter: false,\n remapJustFinished: false,\n selectedNodes: [],\n nodePointerdown: undefined,\n rootUserSelect: undefined,\n preventSynthDrag: false,\n scrolling: false,\n selectedParent: undefined,\n pointerSelection: false,\n synthScrollDirection: undefined,\n draggedNodeDisplay: undefined,\n synthDragScrolling: false,\n longPress: false,\n pointerDown: undefined,\n longPressTimeout: undefined,\n lastScrollContainerX: null,\n lastScrollContainerY: null,\n rootScrollWidth: undefined,\n rootScrollHeight: undefined,\n dragItemRect: undefined,\n windowScrollX: undefined,\n windowScrollY: undefined,\n lastScrollDirectionX: undefined,\n lastScrollDirectionY: undefined,\n scrollDebounceTimeout: undefined,\n frameIdX: undefined,\n frameIdY: undefined,\n };\n\n state = { ...baseDragState } as BaseDragState;\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() {\n if (state.activeState) setActive(state.activeState.parent, undefined, state);\n\n if (state.selectedState)\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n state.selectedState = state.activeState = undefined;\n}\n\nfunction handleRootPointerup() {\n if (state.pointerDown) state.pointerDown.node.el.draggable = true;\n\n state.pointerDown = undefined;\n\n if (!isSynthDragState(state)) return;\n\n const config = state.currentParent.data.config;\n\n if (isSynthDragState(state)) config.handleEnd(state);\n}\n\n/**\n * Handles the keydown event on the root element.\n *\n * @param {KeyboardEvent} e - The keyboard event.\n */\nfunction handleRootKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n if (state.selectedState)\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n if (state.activeState)\n setActive(state.activeState.parent, undefined, state);\n\n state.selectedState = state.activeState = undefined;\n }\n}\n\nfunction handleRootDrop(_e: DragEvent) {\n if (!isDragState(state)) return;\n\n dropped = true;\n\n const handleEnd = state.initialParent.data.config.handleEnd;\n\n handleEnd(state);\n}\n\nfunction handleRootDragover(e: DragEvent) {\n if (!isDragState(state)) return;\n\n pd(e);\n\n const { x, y } = eventCoordinates(e);\n\n if (isDragState(state)) {\n handleSynthScroll({ x, y }, e, state);\n }\n}\n\nfunction handleRootPointermove(e: PointerEvent) {\n if (!state.pointerDown || !state.pointerDown.validated) return;\n\n const config = state.pointerDown.parent.data.config;\n\n if (e.pointerType === \"mouse\" && !isMobilePlatform()) {\n return;\n }\n\n if (!isSynthDragState(state)) {\n pd(e);\n\n if (config.longPress && !state.longPress) {\n clearTimeout(state.longPressTimeout);\n\n state.longPress = false;\n\n return;\n }\n\n const nodes = config.draggedNodes(state.pointerDown);\n\n config.dragstartClasses(state.pointerDown.node, nodes, config, true);\n\n const rect = state.pointerDown.node.el.getBoundingClientRect();\n\n const synthDragState = initSynthDrag(\n state.pointerDown.node,\n state.pointerDown.parent,\n e,\n state,\n nodes,\n rect\n );\n\n synthMove(e, synthDragState, true);\n } else if (isSynthDragState(state)) {\n synthMove(e, state);\n }\n}\n\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 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 contextmenu: (e: Event) => {\n if (isSynthDragState(state)) pd(e);\n },\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 handleNodeKeydown,\n handleDragstart,\n handleNodeDragover,\n handleParentDragover,\n handleNodeDrop,\n handleNodeFocus,\n handleNodeBlur,\n handlePointercancel,\n handleEnd,\n handleDragend,\n handleParentFocus,\n handleNodePointerup,\n handleNodePointerover,\n handleParentPointerover,\n handleParentScroll,\n handleNodePointerdown,\n handleNodeDragenter,\n handleNodeDragleave,\n handleParentDrop,\n multiDrag: config.multiDrag ?? false,\n nativeDrag: config.nativeDrag ?? true,\n performSort,\n performTransfer,\n root: config.root ?? document,\n setupNode,\n setupNodeRemap,\n reapplyDragClasses,\n tearDownNode,\n tearDownNodeRemap,\n remapFinished,\n threshold: {\n horizontal: 0,\n vertical: 0,\n },\n ...config,\n },\n enabledNodes: [],\n abortControllers: {},\n privateClasses: [],\n on,\n emit,\n };\n\n const nodesObserver = new MutationObserver(nodesMutated);\n\n nodesObserver.observe(parent, { childList: true });\n\n parents.set(parent, parentData);\n\n config.plugins?.forEach((plugin) => {\n plugin(parent)?.tearDown?.();\n });\n\n config.plugins?.forEach((plugin) => {\n plugin(parent)?.tearDown?.();\n });\n\n config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(parent)?.setup?.();\n });\n\n setup(parent, parentData);\n\n remapNodes(parent, true);\n}\n\nexport function dragStateProps(\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 startLeft: offsetX ? offsetX : x - (rect?.left ?? 0),\n startTop: offsetY ? offsetY : y - (rect?.top ?? 0),\n targetIndex: node.data.index,\n transferred: false,\n };\n}\n\n/**\n * Perform the sort of the nodes.\n *\n * @param {ParentRecord} parent - The parent record.\n * @param {Array>} draggedNodes - The dragged nodes.\n * @param {Array>} targetNodes - The target nodes.\n *\n * @returns void\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/**\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 if (!newActiveNode) {\n state.activeState = undefined;\n\n return;\n }\n\n state.activeState = {\n node: newActiveNode,\n parent,\n };\n}\n\n/**\n * This function deselects the nodes. This will clean the prior selected state\n * as well as removing any classes or attributes set.\n *\n * @param {Array>} 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\n/**\n * This function sets the selected nodes. This will clean the prior selected\n * state as well as removing any classes or attributes set.\n *\n * @param {ParentRecord} 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 setActive(parent, newActiveNode, state);\n}\n\n/**\n * Handle the parent focus event.\n *\n * @param {ParentEventData} data - The parent event data.\n * @param {BaseDragState | DragState | SynthDragState} state - The drag state.\n *\n * @returns void\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 dragover: parentEventData(parentData.config.handleParentDragover),\n handleParentPointerover: parentData.config.handleParentPointerover,\n scroll: parentEventData(parentData.config.handleParentScroll),\n drop: parentEventData(parentData.config.handleParentDrop),\n hasNestedParent: (e: CustomEvent) => {\n const parent = parents.get(e.target as HTMLElement);\n\n if (!parent) return;\n\n parent.nestedParent = e.detail.parent;\n },\n focus: parentEventData(parentData.config.handleParentFocus),\n });\n\n if (\n parentData.config.externalDragHandle &&\n parentData.config.externalDragHandle.el &&\n parentData.config.externalDragHandle.callback\n ) {\n parentData.abortControllers.externalDragHandle = addEvents(\n parentData.config.externalDragHandle.el,\n {\n pointerdown: (_e: PointerEvent) => {\n if (\n !parentData.config.externalDragHandle ||\n !parentData.config.externalDragHandle.callback\n )\n return;\n\n const draggableItem = parentData.config.externalDragHandle.callback();\n\n if (!isNode(draggableItem)) {\n console.warn(\n \"No draggable item found from external drag handle callback\"\n );\n\n return;\n }\n\n const nodeData = nodes.get(draggableItem);\n\n if (!nodeData) return;\n\n const parentNode = draggableItem.parentNode;\n\n if (!(parentNode instanceof HTMLElement)) return;\n\n const parent = parents.get(parentNode);\n\n if (!parent) return;\n\n state.pointerDown = {\n parent: {\n el: parentNode,\n data: parent,\n },\n node: {\n el: draggableItem,\n data: nodeData,\n },\n validated: true,\n };\n\n draggableItem.draggable = true;\n },\n }\n );\n }\n}\n\n/**\n * Set the attributes of the element.\n *\n * @param el - The element.\n * @param attrs - The attributes to set.\n *\n * @returns void\n */\nexport function setAttrs(el: HTMLElement, attrs: Record) {\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 focus: nodeEventData(config.handleNodeFocus),\n blur: nodeEventData(config.handleNodeBlur),\n pointerup: nodeEventData(config.handleNodePointerup),\n pointercancel: nodeEventData(config.handlePointercancel),\n pointerdown: nodeEventData(config.handleNodePointerdown),\n handleNodePointerover: config.handleNodePointerover,\n touchmove: (e: TouchEvent) => {\n if (isDragState(state) && e.cancelable) pd(e);\n },\n contextmenu: (e: Event) => {\n if (isSynthDragState(state)) pd(e);\n },\n });\n\n data.node.el.draggable = true;\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 parentData = parents.get(parentEl);\n\n if (!parentData) return;\n\n remapNodes(parentEl);\n}\n\n/**\n * Remaps the data of the parent element's children.\n *\n * @param parent - The parent element.\n *\n * @returns void\n *\n * @internal\n */\nexport function remapNodes(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.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 let nodes = config.draggedNodes({\n parent: data.targetData.parent,\n node: data.targetData.node,\n });\n\n // On Safari, pointerdown can sometimes not fire before the dragstart event.\n if (nodes.length === 0) {\n nodes = [data.targetData.node];\n }\n\n config.dragstartClasses(data.targetData.node, nodes, config);\n\n const dragState = initDrag(data, nodes);\n\n if (config.onDragstart) {\n const dragstartData: DragstartEventData = {\n parent: data.targetData.parent,\n values: parentValues(\n data.targetData.parent.el,\n data.targetData.parent.data\n ),\n draggedNode: dragState.draggedNode,\n draggedNodes: dragState.draggedNodes,\n position: dragState.initialIndex,\n state: dragState,\n };\n config.onDragstart(dragstartData);\n }\n}\n\nexport function handleNodePointerdown(\n data: NodePointerEventData,\n state: BaseDragState\n) {\n sp(data.e);\n\n state.pointerDown = {\n parent: data.targetData.parent,\n node: data.targetData.node,\n validated: false,\n };\n\n if (\n !validateDragHandle({\n 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.validated = true;\n\n handleLongPress(data, state, data.targetData.node);\n\n const parentData = data.targetData.parent.data;\n\n let selectedNodes = [data.targetData.node];\n\n const commandKey = data.e.ctrlKey || data.e.metaKey;\n\n const shiftKey = data.e.shiftKey;\n\n const targetNode = data.targetData.node;\n\n if (commandKey && parentData.config.multiDrag) {\n if (state.selectedState) {\n const idx = state.selectedState.nodes.findIndex(\n (x) => x.el === targetNode.el\n );\n\n if (idx === -1) {\n selectedNodes = [...state.selectedState.nodes, targetNode];\n } else {\n selectedNodes = state.selectedState.nodes.filter(\n (x) => x.el !== targetNode.el\n );\n }\n } else {\n selectedNodes = [targetNode];\n }\n\n setSelected(\n data.targetData.parent,\n selectedNodes,\n data.targetData.node,\n state,\n true\n );\n\n return;\n }\n\n if (shiftKey && parentData.config.multiDrag) {\n const nodes = data.targetData.parent.data.enabledNodes;\n\n if (state.selectedState && state.activeState) {\n if (state.selectedState.parent.el !== data.targetData.parent.el) {\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n state.selectedState = undefined;\n\n for (let x = 0; x <= targetNode.data.index; x++)\n selectedNodes.push(nodes[x]);\n } else {\n const [minIndex, maxIndex] =\n state.activeState.node.data.index < data.targetData.node.data.index\n ? [\n state.activeState.node.data.index,\n data.targetData.node.data.index,\n ]\n : [\n data.targetData.node.data.index,\n state.activeState.node.data.index,\n ];\n\n selectedNodes = nodes.slice(minIndex, maxIndex + 1);\n }\n } else {\n for (let x = 0; x <= targetNode.data.index; x++)\n selectedNodes.push(nodes[x]);\n }\n\n setSelected(\n data.targetData.parent,\n selectedNodes,\n data.targetData.node,\n state,\n true\n );\n\n return;\n }\n\n if (state.selectedState?.nodes?.length) {\n const idx = state.selectedState.nodes.findIndex(\n (x) => x.el === data.targetData.node.el\n );\n\n if (idx === -1) {\n if (state.selectedState.parent.el !== data.targetData.parent.el) {\n deselect(state.selectedState.nodes, data.targetData.parent, state);\n } else if (parentData.config.multiDrag && isMobilePlatform()) {\n selectedNodes.push(...state.selectedState.nodes);\n } else {\n deselect(state.selectedState.nodes, data.targetData.parent, state);\n }\n\n setSelected(\n data.targetData.parent,\n selectedNodes,\n data.targetData.node,\n state,\n true\n );\n }\n } else {\n setSelected(\n data.targetData.parent,\n [data.targetData.node],\n data.targetData.node,\n state,\n true\n );\n }\n}\n\n/**\n * Add dragstart classes to the nodes.\n *\n * @param node - The node.\n * @param nodes - The nodes.\n * @param config - The parent config.\n * @param isSynth - Whether the drag is synthetic.\n *\n * @returns void\n */\nexport function dragstartClasses(\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.selectedClass\n );\n });\n}\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 data.e.dataTransfer.effectAllowed = config.dragEffectAllowed;\n\n let dragImage: HTMLElement | undefined;\n\n data.e.dataTransfer.setData(\"text/plain\", \"\");\n\n if (config.dragImage) {\n dragImage = config.dragImage(data, draggedNodes);\n } else {\n if (!config.multiDrag || draggedNodes.length === 1) {\n data.targetData.node.el.style.zIndex = \"9999\";\n data.targetData.node.el.style.boxSizing = \"border-box\";\n\n data.e.dataTransfer.setDragImage(\n data.targetData.node.el,\n data.e.offsetX,\n data.e.offsetY\n );\n\n dragState.originalZIndex = data.targetData.node.el.style.zIndex;\n\n return dragState;\n } else {\n const wrapper = document.createElement(\"div\");\n\n wrapper.setAttribute(\"id\", \"dnd-dragged-node-clone\");\n\n wrapper.setAttribute(\"popover\", \"manual\");\n\n for (const node of draggedNodes) {\n const clone = node.el.cloneNode(true) as HTMLElement;\n\n clone.id = node.el.id + \"-clone\";\n\n clone.style.pointerEvents = \"none\";\n\n wrapper.appendChild(clone);\n }\n\n const { width } = draggedNodes[0].el.getBoundingClientRect();\n\n Object.assign(wrapper.style, {\n display: \"flex\",\n flexDirection: \"column\",\n width: `${width}px`,\n position: \"absolute\",\n pointerEvents: \"none\",\n zIndex: \"9999\",\n left: \"-9999px\",\n boxSizing: \"border-box\",\n background: \"transparent\",\n overflow: \"hidden\",\n });\n\n data.targetData.parent.el.appendChild(wrapper);\n\n wrapper.showPopover();\n\n wrapper.getBoundingClientRect(); // ← forces layout\n\n dragImage = wrapper;\n\n data.e.dataTransfer.setDragImage(\n dragImage,\n data.e.offsetX,\n data.e.offsetY\n );\n }\n }\n\n setTimeout(() => {\n dragImage?.remove();\n });\n }\n\n return dragState;\n}\n\nexport function validateDragHandle({\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\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\nexport function handleNodeFocus(data: NodeEventData) {\n if (data.e.target === data.e.currentTarget) return;\n\n if (state.pointerDown) state.pointerDown.node.el.draggable = false;\n}\n\nexport function handleNodeBlur(data: NodeEventData) {\n if (data.e.target === data.e.currentTarget) return;\n\n if (state.pointerDown) state.pointerDown.node.el.draggable = true;\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\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 = true;\n\n // --- Capture necessary data BEFORE resetState might affect it ---\n const nodesToClean = state.draggedNodes.map((x) => x.el);\n const initialParentData = state.initialParent.data;\n const isSynth = isSynthDragState(state);\n const config = parents.get(state.initialParent.el)?.config;\n const dropZoneClass = isSynth\n ? config?.synthDropZoneClass\n : config?.dropZoneClass;\n const longPressClass = initialParentData?.config?.longPressClass;\n const placeholderClass = isSynth\n ? initialParentData?.config?.synthDragPlaceholderClass // Corrected potential typo: used initialParentData\n : initialParentData?.config?.dragPlaceholderClass;\n const originalZIndex = state.originalZIndex;\n // --- End data capture ---\n\n if (isSynthDragState(state)) {\n // Ensure cloned node removal happens reasonably quickly\n if (state.clonedDraggedNode) {\n // Check if it exists\n state.clonedDraggedNode.remove();\n }\n if (state.longPressTimeout) {\n // Check if timeout exists\n clearTimeout(state.longPressTimeout);\n }\n }\n\n // Ensure scrolling is properly cancelled (needs state, do before reset)\n cancelSynthScroll(state);\n\n // Clear any lingering scroll directions and timeouts (needs state, do before reset)\n state.lastScrollDirectionX = undefined;\n state.lastScrollDirectionY = undefined;\n state.preventEnter = false;\n if (state.scrollDebounceTimeout) {\n clearTimeout(state.scrollDebounceTimeout);\n state.scrollDebounceTimeout = undefined; // Ensure it's marked as cleared\n }\n\n // Apply z-index change synchronously if needed\n if (originalZIndex !== undefined && state.draggedNode) {\n state.draggedNode.el.style.zIndex = originalZIndex;\n }\n\n // Use single rAF with captured data for class removal\n requestAnimationFrame(() => {\n // Use the captured data, not the potentially reset global state\n removeClass(nodesToClean, dropZoneClass);\n removeClass(nodesToClean, longPressClass);\n removeClass(nodesToClean, placeholderClass);\n });\n\n // Deselect and reset active state (needs state, do before reset)\n deselect(state.draggedNodes, state.currentParent, state);\n setActive(state.currentParent, undefined, state);\n\n // Prepare data for callback/event *before* resetState\n const finalStateForCallback = { ...state }; // Shallow copy for safety\n\n // Call onDragend callback *before* resetState\n config?.onDragend?.({\n parent: finalStateForCallback.currentParent,\n values: parentValues(\n finalStateForCallback.currentParent.el,\n finalStateForCallback.currentParent.data\n ),\n draggedNode: finalStateForCallback.draggedNode,\n draggedNodes: finalStateForCallback.draggedNodes,\n state: finalStateForCallback,\n });\n\n // Emit event *before* resetState\n state.emit(\"dragEnded\", finalStateForCallback); // Emit with the final state representation\n\n // Reset global state LAST\n resetState();\n\n // No need to set state.selectedState = undefined; resetState handles it.\n}\n\n/**\n * Handle the node pointer up.\n *\n * @param data - The node pointer event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleNodePointerup(\n data: NodePointerEventData,\n state: DragState | SynthDragState | BaseDragState\n) {\n sp(data.e);\n\n if (!state.pointerSelection && state.selectedState)\n deselect(state.selectedState.nodes, data.targetData.parent, state);\n\n const config = data.targetData.parent.data.config;\n\n state.pointerSelection = false;\n\n if (\"longPressTimeout\" in state && state.longPressTimeout)\n clearTimeout(state.longPressTimeout);\n\n state.longPress = false;\n\n removeClass(\n data.targetData.parent.data.enabledNodes.map((x) => x.el),\n config.longPressClass\n );\n\n 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 * @param rect - The bounding rect of the original element\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 rect: DOMRect\n): SynthDragState {\n const config = parent.data.config;\n\n let dragImage: HTMLElement;\n\n let result:\n | { dragImage: HTMLElement; offsetX?: number; offsetY?: number }\n | undefined;\n\n const criticalStyleProps = [\n \"display\",\n \"flexDirection\",\n \"alignItems\",\n \"justifyContent\",\n \"padding\",\n \"paddingTop\",\n \"margin\",\n \"marginTop\",\n \"marginBottom\",\n \"marginLeft\",\n \"marginRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"paddingRight\",\n \"border\",\n \"borderRadius\",\n \"background\",\n \"backgroundColor\",\n \"boxShadow\",\n \"font\",\n \"color\",\n \"lineHeight\",\n \"gap\",\n \"width\",\n \"height\",\n \"boxSizing\",\n \"overflow\",\n ] as const;\n\n const copyCriticalStyles = (src: HTMLElement, dest: HTMLElement) => {\n const computed = window.getComputedStyle(src);\n criticalStyleProps.forEach((prop) => {\n dest.style[prop] = computed[prop]!;\n });\n };\n\n // Helper to style the drag image\n const applyBaseStyles = (\n el: HTMLElement,\n extraStyles: Partial = {}\n ) => {\n Object.assign(el.style, {\n position: \"absolute\",\n zIndex: \"9999\",\n pointerEvents: \"none\",\n willChange: \"transform\",\n boxSizing: \"border-box\",\n opacity: \"0\",\n overflow: \"hidden\",\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n ...extraStyles,\n });\n };\n\n // Custom drag image\n if (config.synthDragImage) {\n result = config.synthDragImage(node, parent, e, draggedNodes);\n dragImage = result.dragImage;\n dragImage.setAttribute(\"popover\", \"manual\");\n applyBaseStyles(dragImage);\n }\n\n // Single drag\n else if (!config.multiDrag || draggedNodes.length === 1) {\n dragImage = node.el.cloneNode(true) as HTMLElement;\n copyCriticalStyles(node.el as HTMLElement, dragImage);\n dragImage.setAttribute(\"popover\", \"manual\");\n applyBaseStyles(dragImage);\n }\n\n // Multi-drag\n else {\n const wrapper = document.createElement(\"div\");\n\n wrapper.setAttribute(\"popover\", \"manual\");\n\n draggedNodes.forEach((dragged) => {\n const clone = dragged.el.cloneNode(true) as HTMLElement;\n\n copyCriticalStyles(dragged.el as HTMLElement, clone);\n\n clone.style.pointerEvents = \"none\";\n\n clone.style.margin = \"0\";\n\n wrapper.append(clone);\n });\n\n wrapper.style.display = \"flex\";\n wrapper.style.flexDirection = \"column\";\n wrapper.style.padding = \"0\";\n wrapper.style.margin = \"0\";\n wrapper.style.position = \"absolute\";\n wrapper.style.zIndex = \"9999\";\n wrapper.style.pointerEvents = \"none\";\n\n dragImage = wrapper;\n }\n\n dragImage.id = \"dnd-dragged-node-clone\";\n\n parent.el.appendChild(dragImage);\n\n dragImage.showPopover();\n\n const synthDragStateProps = {\n clonedDraggedEls: [],\n clonedDraggedNode: dragImage,\n synthDragScrolling: false,\n synthDragging: true,\n rootScrollWidth: document.scrollingElement?.scrollWidth,\n rootScrollHeight: document.scrollingElement?.scrollHeight,\n };\n\n const synthDragState = setDragState({\n ...dragStateProps(\n node,\n parent,\n e,\n draggedNodes,\n result?.offsetX,\n result?.offsetY\n ),\n ...synthDragStateProps,\n }) as SynthDragState;\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 state.longPressTimeout = setTimeout(() => {\n if (!state) return;\n\n state.longPress = true;\n\n if (config.longPressClass && data.e.cancelable)\n addNodeClass([node.el], config.longPressClass);\n\n pd(data.e);\n }, config.longPressDuration || 1000);\n}\n\nfunction cancelSynthScroll(\n state: DragState,\n cancelX = true,\n cancelY = true\n) {\n if (cancelX) {\n if (state.frameIdX !== undefined) {\n cancelAnimationFrame(state.frameIdX);\n state.frameIdX = undefined;\n }\n state.lastScrollDirectionX = undefined;\n }\n\n if (cancelY) {\n if (state.frameIdY !== undefined) {\n cancelAnimationFrame(state.frameIdY);\n state.frameIdY = undefined;\n }\n state.lastScrollDirectionY = undefined;\n }\n\n if (!state.frameIdX && !state.frameIdY) {\n state.preventEnter = false;\n }\n}\n\nfunction moveNode(state: SynthDragState, justStarted = false) {\n const { x, y } = state.coordinates;\n\n const startLeft = state.startLeft ?? 0;\n const startTop = state.startTop ?? 0;\n\n const currentScrollX = window.scrollX ?? 0;\n const currentScrollY = window.scrollY ?? 0;\n\n const translateX = x - startLeft + currentScrollX;\n const translateY = y - startTop + currentScrollY;\n\n state.clonedDraggedNode.style.transform = `translate3d(${translateX}px, ${translateY}px, 0px)`;\n\n if (justStarted) {\n state.clonedDraggedNode.style.opacity = \"1\";\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n state.initialParent.data.config?.longPressClass\n );\n }\n}\n\nexport function synthMove(\n e: PointerEvent,\n state: SynthDragState,\n justStarted = false\n) {\n const coordinates = eventCoordinates(e);\n state.coordinates.x = coordinates.x;\n state.coordinates.y = coordinates.y;\n\n moveNode(state, justStarted); // Pass only state now\n\n // Clear any existing timeout to avoid multiple concurrent timeouts\n if (state.scrollDebounceTimeout) {\n clearTimeout(state.scrollDebounceTimeout);\n state.scrollDebounceTimeout = undefined;\n }\n\n // Only set a new timeout if we're still in a valid drag state\n state.scrollDebounceTimeout = setTimeout(() => {\n // Only process if the drag state is still active\n if (isSynthDragState(state)) {\n handleSynthScroll(state.coordinates, e, state);\n }\n }, 16); // ~1 frame (60fps)\n\n const elFromPoint = getElFromPoint(coordinates);\n\n if (!elFromPoint) {\n document.dispatchEvent(\n new CustomEvent(\"handleRootPointerover\", {\n detail: {\n e,\n state,\n },\n })\n );\n\n return;\n }\n\n const pointerMoveEventData = {\n e,\n targetData: elFromPoint,\n state,\n };\n\n if (\"node\" in elFromPoint) {\n elFromPoint.node.el.dispatchEvent(\n new CustomEvent(\"handleNodePointerover\", {\n detail: pointerMoveEventData,\n })\n );\n } else {\n elFromPoint.parent.el.dispatchEvent(\n new CustomEvent(\"handleParentPointerover\", {\n detail: pointerMoveEventData,\n })\n );\n }\n}\n\n/**\n * Handle the node drag over.\n *\n * @param data - The node drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleNodeDragover(\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 if (isDragState(state)) {\n handleSynthScroll({ x, y }, data.e, state);\n }\n\n data.targetData.parent.el === state.currentParent?.el\n ? sort(data, state)\n : transfer(data, state);\n}\n\n/**\n * Handle the parent drag over.\n *\n * @param data - The parent drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleParentDragover(\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 const { x, y } = eventCoordinates(data.e);\n\n if (isDragState(state)) {\n handleSynthScroll({ x, y }, data.e, state);\n }\n\n transfer(data, state);\n}\n\n/**\n * Handle the parent pointer over.\n *\n * @param e - The parent pointer over event.\n *\n * @returns void\n */\nexport function handleParentPointerover(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)) {\n return;\n }\n\n const range =\n state.draggedNode.data.index > data.targetData.node.data.index\n ? [data.targetData.node.data.index, state.draggedNode.data.index]\n : [state.draggedNode.data.index, data.targetData.node.data.index];\n\n state.targetIndex = data.targetData.node.data.index;\n\n state.affectedNodes = data.targetData.parent.data.enabledNodes.filter(\n (node) => {\n return (\n range[0] <= node.data.index &&\n node.data.index <= range[1] &&\n node.el !== state.draggedNode.el\n );\n }\n );\n\n data.targetData.parent.data.config.performSort({\n parent: data.targetData.parent,\n draggedNodes: state.draggedNodes,\n targetNodes: [data.targetData.node],\n });\n}\n\n/**\n * Event listener used for all nodes.\n *\n * @param e - The event.\n *\n */\nexport function nodeEventData(\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 pd(data.e);\n\n if (\n !validateTransfer({\n currentParent: state.currentParent,\n targetParent: data.targetData.parent as any,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n state,\n })\n )\n return;\n\n data.targetData.parent.data.config.performTransfer({\n currentParent: state.currentParent,\n targetParent: data.targetData.parent,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n initialIndex: state.initialIndex,\n state,\n targetNodes: \"node\" in data.targetData ? [data.targetData.node] : [],\n });\n\n state.currentParent = data.targetData.parent;\n\n state.transferred = true;\n}\n\n/**\n * Event listener used for all parents.\n *\n * @param callback - The callback.\n *\n * @returns A function to get the parent event data.\n */\nexport function parentEventData(\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 (!data) {\n el.classList.add(...classNames);\n return;\n }\n // Revert to original logic: Initialize privateClasses as empty for this call.\n const privateClasses = [];\n\n for (const currentClassName of classNames) {\n if (!el.classList.contains(currentClassName)) {\n el.classList.add(currentClassName);\n } else if (\n // Only add to privateClasses if the element already had the class\n // AND omitAppendPrivateClass is specifically false for THIS call.\n el.classList.contains(currentClassName) &&\n omitAppendPrivateClass === false\n ) {\n privateClasses.push(currentClassName);\n }\n }\n // Assign the newly computed privateClasses, overwriting any previous value.\n data.privateClasses = privateClasses;\n return data;\n}\n\n/**\n * Remove class from the nodes.\n *\n * @param els - The nodes.\n * @param className - The class name.\n *\n * @returns void\n */\nexport function removeClass(\n els: Array,\n className: string | undefined\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n for (const node of els) {\n if (!isNode(node)) {\n node.classList.remove(...classNames);\n continue;\n }\n\n const nodeData = nodes.get(node) || parents.get(node);\n\n if (!nodeData) continue;\n\n for (const className of classNames) {\n if (!nodeData.privateClasses.includes(className)) {\n node.classList.remove(className);\n }\n }\n }\n}\n\ntype ScrollDirection = { axis: \"x\"; state: DragState } | { axis: \"y\" };\n\nfunction getScrollDirection(\n el: HTMLElement,\n e: PointerEvent | DragEvent,\n style: CSSStyleDeclaration,\n rect: DOMRect,\n opts: ScrollDirection\n): Record {\n const threshold = 0.075;\n\n const isX = opts.axis === \"x\";\n const isRoot = el === document.scrollingElement;\n const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\n const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\n const offsetProp = isX ? \"offsetWidth\" : \"offsetHeight\";\n const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\n const clientCoord = isX ? e.clientX : e.clientY;\n const rectStart = isX ? rect.left : rect.top;\n const overflow = isX ? style.overflowX : style.overflowY;\n\n if (isRoot) {\n const scrollPos = el[scrollProp];\n const clientSize = el[sizeProp];\n const canScrollBefore = scrollPos > 0;\n const canScrollAfter =\n scrollPos + clientSize <\n (isX\n ? (opts.state as SynthDragState).rootScrollWidth || 0\n : el[scrollSizeProp]);\n\n return isX\n ? {\n left: canScrollBefore && clientCoord < clientSize * threshold,\n right: canScrollAfter && clientCoord > clientSize * (1 - threshold),\n }\n : {\n up: canScrollBefore && clientCoord < clientSize * threshold,\n down: canScrollAfter && clientCoord > clientSize * (1 - threshold),\n };\n }\n\n if (\n (overflow === \"auto\" || overflow === \"scroll\") &&\n el !== document.body &&\n el !== document.documentElement\n ) {\n const scrollSize = el[scrollSizeProp];\n const offsetSize = el[offsetProp];\n const scrollPos = el[scrollProp];\n\n const canScrollBefore = scrollPos > 0;\n const canScrollAfter = scrollPos < scrollSize - offsetSize;\n\n return isX\n ? {\n left:\n canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\n right:\n canScrollAfter &&\n clientCoord > rectStart + offsetSize * (1 - threshold),\n }\n : {\n up:\n canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\n down:\n canScrollAfter &&\n clientCoord > rectStart + offsetSize * (1 - threshold),\n };\n }\n\n return isX ? { left: false, right: false } : { up: false, down: false };\n}\n\ntype Axis = \"x\" | \"y\";\n\nfunction scrollAxis(\n el: HTMLElement,\n _e: PointerEvent | DragEvent,\n state: DragState,\n options: {\n axis: Axis;\n direction: \"positive\" | \"negative\";\n }\n) {\n // Check if this is a stale call from a previous state\n if (!isDragState(state) || !state.draggedNode) {\n return; // State has been reset or is no longer in a drag state\n }\n\n state.preventEnter = true;\n\n const isX = options.axis === \"x\";\n const dirFactor = options.direction === \"positive\" ? 1 : -1;\n const speed = 20;\n\n const key = isX ? \"lastScrollDirectionX\" : \"lastScrollDirectionY\";\n const idKey = isX ? \"frameIdX\" : \"frameIdY\";\n\n // Cancel any existing animation first, regardless of direction\n if (state[idKey] !== undefined) {\n cancelAnimationFrame(state[idKey]!);\n state[idKey] = undefined;\n }\n\n state[key] = options.direction;\n\n const scrollLoop = () => {\n // Check again if state is still valid\n if (!isDragState(state) || !state.draggedNode) {\n if (state[idKey] !== undefined) {\n cancelAnimationFrame(state[idKey]!);\n state[idKey] = undefined;\n }\n return;\n }\n\n const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\n const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\n const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\n\n const scrollPos = el[scrollProp];\n const clientSize = el[sizeProp];\n const scrollSize = el[scrollSizeProp];\n\n const canScroll =\n dirFactor > 0 ? scrollPos + clientSize < scrollSize : scrollPos > 0;\n\n if (!canScroll) {\n state[idKey] = undefined;\n state[key] = undefined;\n return;\n }\n\n el[scrollProp] += speed * dirFactor;\n\n if (isSynthDragState(state)) {\n moveNode(state);\n }\n\n state[idKey] = requestAnimationFrame(scrollLoop);\n };\n\n state[idKey] = requestAnimationFrame(scrollLoop);\n}\n\nfunction isPointerInside(el: HTMLElement, x: number, y: number): boolean {\n const rect = el.getBoundingClientRect();\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n}\n\nfunction handleSynthScroll(\n coordinates: { x: number; y: number },\n e: PointerEvent | DragEvent,\n state: DragState\n) {\n // First check if this is a stale call from a previous state\n if (!isDragState(state) || !state.draggedNode) {\n return; // State has been reset or is no longer in a drag state\n }\n\n cancelSynthScroll(state);\n\n const { x, y } = coordinates;\n\n let scrolled = false;\n\n const attemptScroll = (\n axis: \"x\" | \"y\",\n direction: \"positive\" | \"negative\",\n container: HTMLElement\n ) => {\n scrollAxis(container, e, state, { axis, direction });\n scrolled = true;\n };\n\n const checkAndScroll = (el: HTMLElement) => {\n const style = window.getComputedStyle(el);\n const rect = el.getBoundingClientRect();\n\n const xResult = getScrollDirection(el, e, style, rect, {\n axis: \"x\",\n state,\n });\n\n const yResult = getScrollDirection(el, e, style, rect, { axis: \"y\" });\n\n if (xResult.left || xResult.right) {\n state.lastScrollContainerX = el;\n attemptScroll(\"x\", xResult.right ? \"positive\" : \"negative\", el);\n }\n\n if (yResult.up || yResult.down) {\n state.lastScrollContainerY = el;\n attemptScroll(\"y\", yResult.down ? \"positive\" : \"negative\", el);\n }\n };\n\n if (\n state.lastScrollContainerX &&\n isPointerInside(state.lastScrollContainerX, x, y)\n ) {\n checkAndScroll(state.lastScrollContainerX);\n }\n\n if (\n !scrolled &&\n state.lastScrollContainerY &&\n isPointerInside(state.lastScrollContainerY, x, y)\n ) {\n checkAndScroll(state.lastScrollContainerY);\n }\n\n if (!scrolled) {\n let el = document.elementFromPoint(x, y);\n while (\n el &&\n !(scrolled && state.lastScrollContainerX && state.lastScrollContainerY)\n ) {\n if (el instanceof HTMLElement) {\n checkAndScroll(el);\n }\n el = el.parentElement;\n }\n }\n\n if (!scrolled) {\n const root = document.scrollingElement;\n if (root instanceof HTMLElement) {\n checkAndScroll(root);\n }\n }\n\n if (!scrolled) cancelSynthScroll(state);\n}\n\nexport function getElFromPoint(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 capture: eventName === \"focus\" || eventName === \"blur\",\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\n/**\n * Function to get the bounding client rect of an element.\n *\n * @param {HTMLElement} el - The element to get the bounding client rect of.\n *\n * @returns {ClientRect} The bounding client rect of the element.\n */\nexport function rect(el: HTMLElement): ClientRect {\n return el.getBoundingClientRect();\n}\n\n/**\n * Function to create an emitter.\n *\n * @returns {[Function, Function]} A tuple containing emit and on functions\n */\nexport function createEmitter() {\n const callbacks = new Map void>>();\n\n const emit = function (eventName: string, data: T) {\n if (!callbacks.get(eventName)) return;\n\n callbacks.get(eventName)!.forEach((cb) => {\n cb(data);\n });\n };\n\n const on = function (eventName: string, callback: (data: T) => void) {\n const cbs = callbacks.get(eventName) ?? [];\n\n cbs.push(callback);\n\n callbacks.set(eventName, cbs);\n };\n\n return [emit, on] as const;\n}\n\n/**\n * The emit and on functions for drag and drop.\n *\n * @type {[Function, Function]}\n */\nexport const [emit, on] = createEmitter();\n\n/**\n * A regular expression to test for a valid date string.\n *\n * @param x - A RegExp to compare.\n * @param y - A RegExp to compare.\n * @public\n */\nexport function eqRegExp(x: RegExp, y: RegExp): boolean {\n return (\n x.source === y.source &&\n x.flags.split(\"\").sort().join(\"\") === y.flags.split(\"\").sort().join(\"\")\n );\n}\n\n/**\n * Compare two values for equality, optionally at depth.\n *\n * @param valA - First value.\n * @param valB - Second value.\n * @param deep - If it will compare deeply if it's an object.\n * @param explicit - An array of keys to explicity check.\n *\n * @returns `boolean`\n *\n * @public\n */\nexport function eq(\n valA: unknown,\n valB: unknown,\n deep = true,\n explicit: string[] = [\"__key\"]\n): boolean {\n if (valA === valB) return true;\n\n if (\n typeof valB === \"object\" &&\n typeof valA === \"object\" &&\n valA !== null &&\n valB !== null\n ) {\n if (valA instanceof Map) return false;\n if (valA instanceof Set) return false;\n if (valA instanceof Date && valB instanceof Date)\n return valA.getTime() === valB.getTime();\n if (valA instanceof RegExp && valB instanceof RegExp)\n return eqRegExp(valA, valB);\n if (valA === null || valB === null) return false;\n\n const objA = valA as Record;\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 * 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 Node,\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 nodes,\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 // 1. If the element is not an HTMLElement or is the insert point itself, do nothing.\n if (!(el instanceof HTMLElement) || el === insertState.insertPoint?.el) {\n return;\n }\n\n // 2. Traverse up the DOM from the element under the cursor\n // to see if any ancestor is a registered parent.\n let isWithinAParent = false;\n let current: HTMLElement | null = el;\n while (current) {\n if (nodes.has(current as Node) || parents.has(current)) {\n isWithinAParent = true;\n break; // Found a registered parent ancestor\n }\n if (current === document.body) break; // Stop if we reach the body\n current = current.parentElement;\n }\n\n // 3. If the cursor is NOT within any registered parent...\n if (!isWithinAParent) {\n // Hide the insert point if it exists\n if (insertState.insertPoint) {\n insertState.insertPoint.el.style.display = \"none\";\n }\n\n // Remove drop zone class if a parent was previously being dragged over\n if (insertState.draggedOverParent) {\n removeClass(\n [insertState.draggedOverParent.el],\n insertState.draggedOverParent.data.config.dropZoneClass\n );\n }\n\n // Reset insert state related to dragged over elements\n insertState.draggedOverNodes = [];\n insertState.draggedOverParent = null;\n\n // Reset current parent in the main state back to the initial one\n state.currentParent = state.initialParent;\n }\n // 4. If the cursor IS within a registered parent, do nothing in this function.\n // Other event handlers will manage the insertion point positioning.\n}\n\ninterface Range {\n x: [number, number];\n y: [number, number];\n vertical: boolean;\n}\n\nfunction createVerticalRange(\n nodeCoords: Coordinates,\n otherCoords: Coordinates | undefined,\n isAscending: boolean\n): Range {\n const center = nodeCoords.top + nodeCoords.height / 2;\n\n if (!otherCoords) {\n const offset = nodeCoords.height / 2 + 10;\n return {\n y: isAscending ? [center, center + offset] : [center - offset, center],\n x: [nodeCoords.left, nodeCoords.right],\n vertical: true,\n };\n }\n\n const otherEdge = isAscending ? otherCoords.top : otherCoords.bottom;\n const nodeEdge = isAscending ? nodeCoords.bottom : nodeCoords.top;\n\n let midpoint: number;\n let range: [number, number];\n\n if (isAscending) {\n // Midpoint between current node's bottom and next node's top\n midpoint = nodeEdge + (otherEdge - nodeEdge) / 2; // nodeCoords.bottom + (otherCoords.top - nodeCoords.bottom) / 2\n range = [center, midpoint]; // Range from node center down to midpoint\n } else {\n // Midpoint between previous node's bottom and current node's top\n midpoint = otherEdge + (nodeEdge - otherEdge) / 2; // otherCoords.bottom + (nodeCoords.top - otherCoords.bottom) / 2\n range = [midpoint, center]; // Range from midpoint down to node center\n }\n\n return {\n y: range,\n x: [nodeCoords.left, nodeCoords.right],\n vertical: true,\n };\n}\n\nfunction createHorizontalRange(\n nodeCoords: Coordinates,\n otherCoords: Coordinates | undefined,\n isAscending: boolean,\n lastInRow = false\n): Range {\n const center = nodeCoords.left + nodeCoords.width / 2;\n\n if (!otherCoords) {\n if (isAscending) {\n return {\n x: [center, center + nodeCoords.width],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n } else {\n return {\n x: [nodeCoords.left - 10, center],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n }\n }\n\n if (isAscending && lastInRow) {\n return {\n x: [center, nodeCoords.right + 10],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n }\n\n if (isAscending) {\n const nextNodeCenter = otherCoords.left + otherCoords.width / 2;\n return {\n x: [center, center + Math.abs(center - nextNodeCenter) / 2],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n } else {\n return {\n x: [\n otherCoords.right + Math.abs(otherCoords.right - nodeCoords.left) / 2,\n center,\n ],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n }\n}\n\nfunction getRealCoords(el: HTMLElement): Coordinates {\n const { top, bottom, left, right, height, width } =\n el.getBoundingClientRect();\n\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n return {\n top: top + scrollTop,\n bottom: bottom + scrollTop,\n left: left + scrollLeft,\n right: right + scrollLeft,\n height,\n width,\n };\n}\n\nfunction defineRanges(parent: HTMLElement) {\n if (!isDragState(state) && !isSynthDragState(state)) return;\n\n const parentData = parents.get(parent);\n if (!parentData) return;\n\n const enabledNodes = parentData.enabledNodes;\n\n enabledNodes.forEach((node, index) => {\n node.data.range = {};\n\n const prevNode = enabledNodes[index - 1];\n const nextNode = enabledNodes[index + 1];\n const nodeCoords = getRealCoords(node.el);\n const prevNodeCoords = prevNode ? getRealCoords(prevNode.el) : undefined;\n const nextNodeCoords = nextNode ? getRealCoords(nextNode.el) : undefined;\n\n const aboveOrBelowPrevious =\n prevNodeCoords &&\n (nodeCoords.top > prevNodeCoords.bottom ||\n nodeCoords.bottom < prevNodeCoords.top);\n\n const aboveOrBelowAfter =\n nextNodeCoords &&\n (nodeCoords.top > nextNodeCoords.bottom ||\n nodeCoords.bottom < nextNodeCoords.top);\n\n const fullishWidth =\n parent.getBoundingClientRect().width * 0.8 < nodeCoords.width;\n\n if (fullishWidth) {\n node.data.range.ascending = createVerticalRange(\n nodeCoords,\n nextNodeCoords,\n true\n );\n node.data.range.descending = createVerticalRange(\n nodeCoords,\n prevNodeCoords,\n false\n );\n } else if (aboveOrBelowAfter && !aboveOrBelowPrevious) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n nextNodeCoords,\n true,\n true\n );\n node.data.range.descending = createHorizontalRange(\n nodeCoords,\n prevNodeCoords,\n false\n );\n } else if (!aboveOrBelowPrevious && !aboveOrBelowAfter) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n nextNodeCoords,\n true\n );\n node.data.range.descending = createHorizontalRange(\n nodeCoords,\n prevNodeCoords,\n false\n );\n } else if (aboveOrBelowPrevious && !nextNodeCoords) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n undefined,\n true\n );\n } else if (aboveOrBelowPrevious && !aboveOrBelowAfter) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n nextNodeCoords,\n true\n );\n node.data.range.descending = createHorizontalRange(\n nodeCoords,\n undefined,\n false\n );\n }\n });\n}\n\nexport function handleNodeDragover(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 nativeDrag = false\n) {\n pd(e);\n\n if (nativeDrag && e instanceof PointerEvent) return;\n\n const { x, y } = eventCoordinates(e);\n\n // Calculate global coordinates\n const clientX = x;\n const clientY = y;\n\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n state.coordinates.x = clientX + scrollLeft;\n state.coordinates.y = clientY + scrollTop;\n\n const nestedParent = targetData.parent.data.nestedParent;\n\n let realTargetParent = targetData.parent;\n\n if (nestedParent) {\n const rect = nestedParent.el.getBoundingClientRect();\n\n if (state.coordinates.y > rect.top && state.coordinates.y < rect.bottom)\n realTargetParent = nestedParent;\n }\n\n if (realTargetParent.el === state.currentParent?.el) {\n moveBetween(realTargetParent, state);\n } else {\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);\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.style, {\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 insertState.insertPoint.el.style.display = \"block\";\n\n if (position.vertical) {\n const insertPointHeight =\n insertState.insertPoint.el.getBoundingClientRect().height;\n const targetY = position.y[ascending ? 1 : 0];\n const topPosition = targetY - insertPointHeight / 2;\n\n Object.assign(insertState.insertPoint.el.style, {\n top: `${topPosition}px`,\n left: `${position.x[0]}px`,\n right: `${position.x[1]}px`,\n width: `${position.x[1] - position.x[0]}px`,\n });\n } else {\n const leftPosition =\n position.x[ascending ? 1 : 0] -\n insertState.insertPoint.el.getBoundingClientRect().width / 2;\n insertState.insertPoint.el.style.left = `${leftPosition}px`;\n\n Object.assign(insertState.insertPoint.el.style, {\n top: `${position.y[0]}px`,\n bottom: `${position.y[1]}px`,\n height: `${position.y[1] - position.y[0]}px`,\n });\n }\n\n insertState.targetIndex = node.data.index;\n\n insertState.ascending = ascending;\n}\n\nexport function handleParentDrop(_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) && !isSynthDragState(state)) return;\n\n const insertPoint = insertState.insertPoint;\n\n if (!insertState.draggedOverParent) {\n const draggedParentValues = parentValues(\n state.initialParent.el,\n state.initialParent.data\n );\n\n const transferred = state.initialParent.el !== state.currentParent.el;\n\n remapNodes(state.initialParent.el);\n\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n const enabledNodes = [...state.initialParent.data.enabledNodes];\n\n const originalIndex = state.draggedNodes[0].data.index;\n\n const targetIndex = insertState.targetIndex;\n\n if (\n !transferred &&\n insertState.draggedOverNodes[0] &&\n insertState.draggedOverNodes[0].el !== state.draggedNodes[0].el\n ) {\n const newParentValues = [\n ...draggedParentValues.filter(\n (x) => !draggedValues.some((y) => eq(x, y))\n ),\n ];\n\n let index = insertState.draggedOverNodes[0].data.index;\n\n if (\n insertState.targetIndex > state.draggedNodes[0].data.index &&\n !insertState.ascending\n ) {\n index--;\n } else if (\n insertState.targetIndex < state.draggedNodes[0].data.index &&\n insertState.ascending\n ) {\n index++;\n }\n\n newParentValues.splice(index, 0, ...draggedValues);\n\n setParentValues(state.initialParent.el, state.initialParent.data, [\n ...newParentValues,\n ]);\n\n if (state.initialParent.data.config.onSort) {\n const sortEventData = {\n parent: {\n el: state.initialParent.el,\n data: state.initialParent.data,\n } as ParentRecord,\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 ParentRecord,\n BaseDragState,\n} from \"../../types\";\nimport {\n parents,\n parentValues,\n setParentValues,\n addNodeClass,\n isSynthDragState,\n removeClass,\n addClass,\n state,\n addEvents,\n isDragState,\n} 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\n if (state.initialParent.data.config.onSort) {\n state.initialParent.data.config.onSort({\n parent: {\n el: state.initialParent.el,\n data: state.initialParent.data,\n } as ParentRecord,\n previousValues: [...initialParentValues],\n previousNodes: [...state.initialParent.data.enabledNodes],\n nodes: [...state.initialParent.data.enabledNodes],\n values: [...newValues],\n draggedNodes: state.draggedNodes,\n previousPosition: draggedIndex,\n position: targetIndex,\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\n state: state as BaseDragState,\n });\n }\n } else {\n if (swap) {\n const res = swapElements(\n initialParentValues,\n newValues,\n state.initialIndex,\n targetIndex\n );\n\n setParentValues(\n state.initialParent.el,\n state.initialParent.data,\n res[0] as T[]\n );\n\n setParentValues(\n state.currentParent.el,\n state.currentParent.data,\n res[1] as T[]\n );\n } else {\n const newInitialValues = initialParentValues.filter(\n (x) => !draggedValues.includes(x)\n );\n\n setParentValues(\n state.initialParent.el,\n state.initialParent.data,\n newInitialValues\n );\n\n newValues.splice(targetIndex, 0, ...draggedValues);\n\n setParentValues(\n state.currentParent.el,\n state.currentParent.data,\n newValues\n );\n }\n }\n\n if (state.currentParent.data.config.onTransfer) {\n state.currentParent.data.config.onTransfer({\n sourceParent: state.currentParent,\n targetParent: state.initialParent,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n targetIndex,\n state,\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\n });\n }\n\n if (state.initialParent.data.config.onTransfer) {\n state.initialParent.data.config.onTransfer({\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n targetIndex,\n state,\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\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","handleEnd","nodes","emit","on","handleNodeDragover","handleParentDragover","handleNodePointerover","handleParentPointerover","draggedNodes","state","parent","x","scrollTimeout","className"]} \ 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 {\r\n DNDPlugin,\r\n DragAndDrop,\r\n DragState,\r\n DragStateProps,\r\n Node,\r\n NodeData,\r\n NodeDragEventData,\r\n NodeEventData,\r\n NodePointerEventData,\r\n NodeRecord,\r\n NodeTargetData,\r\n NodesData,\r\n ParentConfig,\r\n ParentData,\r\n ParentEventData,\r\n ParentTargetData,\r\n ParentsData,\r\n PointeroverNodeEvent,\r\n PointeroverParentEvent,\r\n SetupNodeData,\r\n TearDownNodeData,\r\n BaseDragState,\r\n SynthDragState,\r\n SynthDragStateProps,\r\n ParentRecord,\r\n EventHandlers,\r\n NodeFromPoint,\r\n ParentFromPoint,\r\n ParentDragEventData,\r\n DragstartEventData,\r\n} from \"./types\";\r\n\r\nimport {\r\n pd,\r\n sp,\r\n on,\r\n emit,\r\n createEmitter,\r\n eq,\r\n splitClass,\r\n eventCoordinates,\r\n} from \"./utils\";\r\n\r\nexport * from \"./types\";\r\nexport { animations } from \"./plugins/animations\";\r\nexport { insert } from \"./plugins/insert\";\r\nexport { dropOrSwap } from \"./plugins/drop-or-swap\";\r\n\r\n/**\r\n * Check to see if code is running in a browser.\r\n */\r\nexport const isBrowser = typeof window !== \"undefined\";\r\n\r\n/**\r\n * Parents or \"lists\" are the containers that nodes or \"draggable items\" can be\r\n * dragged from and into.\r\n *\r\n * @type {WeakMap>}\r\n */\r\nexport const parents: ParentsData = new WeakMap<\r\n HTMLElement,\r\n ParentData\r\n>();\r\n\r\n/**\r\n * Nodes are the draggable items and the direct descendants of the parents.\r\n *\r\n * @type {WeakMap>}\r\n */\r\nexport const nodes: NodesData = new WeakMap>();\r\n\r\nfunction isMobilePlatform() {\r\n if (!isBrowser) return false;\r\n\r\n if (\"userAgentData\" in navigator) {\r\n return (navigator.userAgentData as { mobile: boolean }).mobile === true;\r\n }\r\n\r\n const ua = navigator.userAgent;\r\n\r\n const isMobileUA = /android|iphone|ipod/i.test(ua);\r\n\r\n const isIpad =\r\n /iPad/.test(ua) ||\r\n (ua.includes(\"Macintosh\") && navigator.maxTouchPoints > 1);\r\n\r\n return isMobileUA || isIpad;\r\n}\r\n\r\n/**\r\n * The base drag state.\r\n *\r\n * @type {BaseDragState}\r\n */\r\nconst baseDragState = {\r\n affectedNodes: [],\r\n coordinates: {\r\n x: 0,\r\n y: 0,\r\n },\r\n currentTargetValue: undefined,\r\n on,\r\n emit,\r\n originalZIndex: undefined,\r\n pointerSelection: false,\r\n preventEnter: false,\r\n rootUserSelect: undefined,\r\n nodePointerdown: undefined,\r\n longPress: false,\r\n scrolling: false,\r\n longPressTimeout: undefined,\r\n remapJustFinished: false,\r\n selectedNodes: [],\r\n selectedParent: undefined,\r\n preventSynthDrag: false,\r\n pointerDown: undefined,\r\n lastScrollContainerX: null,\r\n lastScrollContainerY: null,\r\n rootScrollWidth: undefined,\r\n rootScrollHeight: undefined,\r\n dragItemRect: undefined,\r\n windowScrollX: undefined,\r\n windowScrollY: undefined,\r\n lastScrollDirectionX: undefined,\r\n lastScrollDirectionY: undefined,\r\n scrollDebounceTimeout: undefined,\r\n frameIdX: undefined,\r\n frameIdY: undefined,\r\n};\r\n\r\n/**\r\n * The state of the drag and drop.\r\n *\r\n * @type {BaseDragState}\r\n */\r\nexport let state: BaseDragState = baseDragState;\r\n\r\n/**\r\n * Variable to check if the drop has occurred.\r\n */\r\nlet dropped = false;\r\n\r\n/**\r\n * Abort controller for the document.\r\n */\r\nlet documentController: AbortController | undefined;\r\n\r\n/**\r\n * Timeout for the scroll.\r\n */\r\nlet scrollTimeout: ReturnType;\r\n\r\nexport function resetState() {\r\n // Clear any existing timeouts to prevent stale references\r\n if (state.scrollDebounceTimeout) {\r\n clearTimeout(state.scrollDebounceTimeout);\r\n }\r\n\r\n if (state.longPressTimeout) {\r\n clearTimeout(state.longPressTimeout);\r\n }\r\n\r\n // Cancel any animation frames\r\n if (state.frameIdX !== undefined) {\r\n cancelAnimationFrame(state.frameIdX);\r\n }\r\n\r\n if (state.frameIdY !== undefined) {\r\n cancelAnimationFrame(state.frameIdY);\r\n }\r\n\r\n const baseDragState = {\r\n affectedNodes: [],\r\n coordinates: {\r\n x: 0,\r\n y: 0,\r\n },\r\n on,\r\n emit,\r\n currentTargetValue: undefined,\r\n originalZIndex: undefined,\r\n pointerId: undefined,\r\n preventEnter: false,\r\n remapJustFinished: false,\r\n selectedNodes: [],\r\n nodePointerdown: undefined,\r\n rootUserSelect: undefined,\r\n preventSynthDrag: false,\r\n scrolling: false,\r\n selectedParent: undefined,\r\n pointerSelection: false,\r\n synthScrollDirection: undefined,\r\n draggedNodeDisplay: undefined,\r\n synthDragScrolling: false,\r\n longPress: false,\r\n pointerDown: undefined,\r\n longPressTimeout: undefined,\r\n lastScrollContainerX: null,\r\n lastScrollContainerY: null,\r\n rootScrollWidth: undefined,\r\n rootScrollHeight: undefined,\r\n dragItemRect: undefined,\r\n windowScrollX: undefined,\r\n windowScrollY: undefined,\r\n lastScrollDirectionX: undefined,\r\n lastScrollDirectionY: undefined,\r\n scrollDebounceTimeout: undefined,\r\n frameIdX: undefined,\r\n frameIdY: undefined,\r\n };\r\n\r\n state = { ...baseDragState } as BaseDragState;\r\n}\r\n\r\n/**\r\n * @param {DragStateProps} dragStateProps - Attributes to update state with.\r\n *\r\n * @mutation - Updates state with node values.\r\n *\r\n * @returns void\r\n */\r\nexport function setDragState(\r\n dragStateProps: (SynthDragStateProps & DragStateProps) | DragStateProps\r\n): DragState | SynthDragState {\r\n Object.assign(state, dragStateProps);\r\n\r\n dragStateProps.initialParent.data.emit(\"dragStarted\", state);\r\n\r\n dropped = false;\r\n\r\n state.emit(\"dragStarted\", state);\r\n\r\n return state as DragState | SynthDragState;\r\n}\r\n\r\n/**\r\n *\r\n */\r\nfunction handleRootPointerdown() {\r\n if (state.activeState) setActive(state.activeState.parent, undefined, state);\r\n\r\n if (state.selectedState)\r\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\r\n\r\n state.selectedState = state.activeState = undefined;\r\n}\r\n\r\nfunction handleRootPointerup() {\r\n if (state.pointerDown) state.pointerDown.node.el.draggable = true;\r\n\r\n state.pointerDown = undefined;\r\n\r\n if (!isSynthDragState(state)) return;\r\n\r\n const config = state.currentParent.data.config;\r\n\r\n if (isSynthDragState(state)) config.handleEnd(state);\r\n}\r\n\r\n/**\r\n * Handles the keydown event on the root element.\r\n *\r\n * @param {KeyboardEvent} e - The keyboard event.\r\n */\r\nfunction handleRootKeydown(e: KeyboardEvent) {\r\n if (e.key === \"Escape\") {\r\n if (state.selectedState)\r\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\r\n\r\n if (state.activeState)\r\n setActive(state.activeState.parent, undefined, state);\r\n\r\n state.selectedState = state.activeState = undefined;\r\n }\r\n}\r\n\r\nfunction handleRootDrop(_e: DragEvent) {\r\n if (!isDragState(state)) return;\r\n\r\n dropped = true;\r\n\r\n const handleEnd = state.initialParent.data.config.handleEnd;\r\n\r\n handleEnd(state);\r\n}\r\n\r\nfunction handleRootDragover(e: DragEvent) {\r\n if (!isDragState(state)) return;\r\n\r\n pd(e);\r\n\r\n const { x, y } = eventCoordinates(e);\r\n\r\n if (isDragState(state)) {\r\n handleSynthScroll({ x, y }, e, state);\r\n }\r\n}\r\n\r\nfunction handleRootPointermove(e: PointerEvent) {\r\n if (!state.pointerDown || !state.pointerDown.validated) return;\r\n\r\n const config = state.pointerDown.parent.data.config;\r\n\r\n if (e.pointerType === \"mouse\" && !isMobilePlatform()) {\r\n return;\r\n }\r\n\r\n if (!isSynthDragState(state)) {\r\n pd(e);\r\n\r\n if (config.longPress && !state.longPress) {\r\n clearTimeout(state.longPressTimeout);\r\n\r\n state.longPress = false;\r\n\r\n return;\r\n }\r\n\r\n const nodes = config.draggedNodes(state.pointerDown);\r\n\r\n config.dragstartClasses(state.pointerDown.node, nodes, config, true);\r\n\r\n const rect = state.pointerDown.node.el.getBoundingClientRect();\r\n\r\n const synthDragState = initSynthDrag(\r\n state.pointerDown.node,\r\n state.pointerDown.parent,\r\n e,\r\n state,\r\n nodes,\r\n rect\r\n );\r\n\r\n synthMove(e, synthDragState, true);\r\n } else if (isSynthDragState(state)) {\r\n synthMove(e, state);\r\n }\r\n}\r\n\r\n/**\r\n * Initializes the drag and drop functionality for a given parent.\r\n *\r\n * @param {DragAndDrop} dragAndDrop - The drag and drop configuration.\r\n *\r\n * @returns void\r\n */\r\nexport function dragAndDrop({\r\n parent,\r\n getValues,\r\n setValues,\r\n config = {},\r\n}: DragAndDrop): void {\r\n if (!isBrowser) return;\r\n\r\n if (!documentController) {\r\n documentController = addEvents(document, {\r\n dragover: handleRootDragover,\r\n pointerdown: handleRootPointerdown,\r\n pointerup: handleRootPointerup,\r\n keydown: handleRootKeydown,\r\n drop: handleRootDrop,\r\n pointermove: handleRootPointermove,\r\n pointercancel: nodeEventData(config.handlePointercancel),\r\n touchmove: (e: TouchEvent) => {\r\n if (isDragState(state) && e.cancelable) pd(e);\r\n },\r\n contextmenu: (e: Event) => {\r\n if (isSynthDragState(state)) pd(e);\r\n },\r\n });\r\n }\r\n\r\n tearDown(parent);\r\n\r\n const [emit, on] = createEmitter();\r\n\r\n const parentData: ParentData = {\r\n getValues,\r\n setValues,\r\n config: {\r\n dragDropEffect: config.dragDropEffect ?? \"move\",\r\n dragEffectAllowed: config.dragEffectAllowed ?? \"move\",\r\n draggedNodes,\r\n dragstartClasses,\r\n handleNodeKeydown,\r\n handleDragstart,\r\n handleNodeDragover,\r\n handleParentDragover,\r\n handleNodeDrop,\r\n handleNodeFocus,\r\n handleNodeBlur,\r\n handlePointercancel,\r\n handleEnd,\r\n handleDragend,\r\n handleParentFocus,\r\n handleNodePointerup,\r\n handleNodePointerover,\r\n handleParentPointerover,\r\n handleParentScroll,\r\n handleNodePointerdown,\r\n handleNodeDragenter,\r\n handleNodeDragleave,\r\n handleParentDrop,\r\n multiDrag: config.multiDrag ?? false,\r\n nativeDrag: config.nativeDrag ?? true,\r\n performSort,\r\n performTransfer,\r\n root: config.root ?? document,\r\n setupNode,\r\n setupNodeRemap,\r\n reapplyDragClasses,\r\n tearDownNode,\r\n tearDownNodeRemap,\r\n remapFinished,\r\n threshold: {\r\n horizontal: 0,\r\n vertical: 0,\r\n },\r\n ...config,\r\n },\r\n enabledNodes: [],\r\n abortControllers: {},\r\n privateClasses: [],\r\n on,\r\n emit,\r\n };\r\n\r\n const nodesObserver = new MutationObserver(nodesMutated);\r\n\r\n nodesObserver.observe(parent, { childList: true });\r\n\r\n parents.set(parent, parentData);\r\n\r\n config.plugins?.forEach((plugin) => {\r\n plugin(parent)?.tearDown?.();\r\n });\r\n\r\n config.plugins?.forEach((plugin) => {\r\n plugin(parent)?.tearDown?.();\r\n });\r\n\r\n config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(parent)?.setup?.();\r\n });\r\n\r\n setup(parent, parentData);\r\n\r\n remapNodes(parent, true);\r\n}\r\n\r\nexport function dragStateProps(\r\n node: NodeRecord,\r\n parent: ParentRecord,\r\n e: PointerEvent | DragEvent,\r\n draggedNodes: Array>,\r\n offsetX?: number,\r\n offsetY?: number\r\n): DragStateProps {\r\n const { x, y } = eventCoordinates(e);\r\n\r\n const rect = node.el.getBoundingClientRect();\r\n\r\n return {\r\n affectedNodes: [],\r\n ascendingDirection: false,\r\n clonedDraggedEls: [],\r\n coordinates: {\r\n x,\r\n y,\r\n },\r\n draggedNode: {\r\n el: node.el,\r\n data: node.data,\r\n },\r\n draggedNodes,\r\n incomingDirection: undefined,\r\n initialIndex: node.data.index,\r\n initialParent: {\r\n el: parent.el,\r\n data: parent.data,\r\n },\r\n currentParent: {\r\n el: parent.el,\r\n data: parent.data,\r\n },\r\n longPress: parent.data.config.longPress ?? false,\r\n longPressTimeout: undefined,\r\n currentTargetValue: node.data.value,\r\n scrollEls: [],\r\n startLeft: offsetX ? offsetX : x - (rect?.left ?? 0),\r\n startTop: offsetY ? offsetY : y - (rect?.top ?? 0),\r\n targetIndex: node.data.index,\r\n transferred: false,\r\n };\r\n}\r\n\r\n/**\r\n * Perform the sort of the nodes.\r\n *\r\n * @param {ParentRecord} parent - The parent record.\r\n * @param {Array>} draggedNodes - The dragged nodes.\r\n * @param {Array>} targetNodes - The target nodes.\r\n *\r\n * @returns void\r\n */\r\nexport function performSort({\r\n parent,\r\n draggedNodes,\r\n targetNodes,\r\n}: {\r\n parent: ParentRecord;\r\n draggedNodes: Array>;\r\n targetNodes: Array>;\r\n}) {\r\n remapNodes(parent.el);\r\n\r\n const draggedValues = draggedNodes.map((x) => x.data.value);\r\n\r\n const targetParentValues = parentValues(parent.el, parent.data);\r\n\r\n const originalIndex = draggedNodes[0].data.index;\r\n\r\n const enabledNodes = [...parent.data.enabledNodes];\r\n\r\n const newParentValues = [\r\n ...targetParentValues.filter((x) => !draggedValues.some((y) => eq(x, y))),\r\n ];\r\n newParentValues.splice(targetNodes[0].data.index, 0, ...draggedValues);\r\n\r\n if (\"draggedNode\" in state)\r\n state.currentTargetValue = targetNodes[0].data.value;\r\n\r\n setParentValues(parent.el, parent.data, [...newParentValues]);\r\n\r\n if (parent.data.config.onSort) {\r\n parent.data.config.onSort({\r\n parent: {\r\n el: parent.el,\r\n data: parent.data,\r\n } as ParentRecord,\r\n previousValues: [...targetParentValues],\r\n previousNodes: [...enabledNodes],\r\n nodes: [...parent.data.enabledNodes],\r\n values: [...newParentValues],\r\n draggedNodes: draggedNodes,\r\n previousPosition: originalIndex,\r\n position: targetNodes[0].data.index,\r\n targetNodes,\r\n state,\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * This function sets the active node as well as removing any classes or\r\n * attribute set.\r\n *\r\n * @param {ParentEventData} data - The parent event data.\r\n * @param {NodeRecord} newActiveNode - The new active node.\r\n * @param {BaseDragState} state - The current drag state.\r\n */\r\nfunction setActive(\r\n parent: ParentRecord,\r\n newActiveNode: NodeRecord | undefined,\r\n state: BaseDragState\r\n) {\r\n if (!newActiveNode) {\r\n state.activeState = undefined;\r\n\r\n return;\r\n }\r\n\r\n state.activeState = {\r\n node: newActiveNode,\r\n parent,\r\n };\r\n}\r\n\r\n/**\r\n * This function deselects the nodes. This will clean the prior selected state\r\n * as well as removing any classes or attributes set.\r\n *\r\n * @param {Array>} nodes - The nodes to deselect.\r\n * @param {ParentRecord} parent - The parent record.\r\n * @param {BaseDragState} state - The current drag state.\r\n */\r\nfunction deselect(\r\n nodes: Array>,\r\n parent: ParentRecord,\r\n state: BaseDragState\r\n) {\r\n const selectedClass = parent.data.config.selectedClass;\r\n\r\n if (!state.selectedState) return;\r\n\r\n const iterativeNodes = Array.from(nodes);\r\n\r\n removeClass(\r\n nodes.map((x) => x.el),\r\n selectedClass\r\n );\r\n\r\n for (const node of iterativeNodes) {\r\n node.el.setAttribute(\"aria-selected\", \"false\");\r\n\r\n const index = state.selectedState.nodes.findIndex((x) => x.el === node.el);\r\n\r\n if (index === -1) continue;\r\n\r\n state.selectedState.nodes.splice(index, 1);\r\n }\r\n}\r\n\r\n/**\r\n * This function sets the selected nodes. This will clean the prior selected\r\n * state as well as removing any classes or attributes set.\r\n *\r\n * @param {ParentRecord} parent - The parent record.\r\n * @param {Array>} selectedNodes - The nodes to select.\r\n * @param {NodeRecord | undefined} newActiveNode - The new active node.\r\n * @param {BaseDragState} state - The current drag state.\r\n * @param {boolean} pointerdown - Whether the pointerdown event was triggered.\r\n */\r\nfunction setSelected(\r\n parent: ParentRecord,\r\n selectedNodes: Array>,\r\n newActiveNode: NodeRecord | undefined,\r\n state: BaseDragState,\r\n pointerdown = false\r\n) {\r\n state.pointerSelection = pointerdown;\r\n\r\n for (const node of selectedNodes) {\r\n node.el.setAttribute(\"aria-selected\", \"true\");\r\n\r\n addNodeClass([node.el], parent.data.config.selectedClass, true);\r\n }\r\n\r\n state.selectedState = {\r\n nodes: selectedNodes,\r\n parent,\r\n };\r\n\r\n setActive(parent, newActiveNode, state);\r\n}\r\n\r\n/**\r\n * Handle the parent focus event.\r\n *\r\n * @param {ParentEventData} data - The parent event data.\r\n * @param {BaseDragState | DragState | SynthDragState} state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleParentFocus(\r\n data: ParentEventData,\r\n state: BaseDragState | DragState | SynthDragState\r\n) {\r\n const firstEnabledNode = data.targetData.parent.data.enabledNodes[0];\r\n\r\n if (!firstEnabledNode) return;\r\n\r\n if (\r\n state.selectedState &&\r\n state.selectedState.parent.el !== data.targetData.parent.el\r\n ) {\r\n setActive(data.targetData.parent, firstEnabledNode, state);\r\n } else if (!state.selectedState) {\r\n setActive(data.targetData.parent, firstEnabledNode, state);\r\n }\r\n}\r\n\r\n/**\r\n * Perform the transfer of the nodes.\r\n *\r\n * @param data - The transfer data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function performTransfer({\r\n currentParent,\r\n targetParent,\r\n initialParent,\r\n draggedNodes,\r\n initialIndex,\r\n targetNodes,\r\n state,\r\n}: {\r\n currentParent: ParentRecord;\r\n targetParent: ParentRecord;\r\n initialParent: ParentRecord;\r\n draggedNodes: Array>;\r\n initialIndex: number;\r\n state: BaseDragState | DragState | SynthDragState;\r\n targetNodes: Array>;\r\n}) {\r\n remapNodes(initialParent.el);\r\n\r\n const draggedValues = draggedNodes.map((x) => x.data.value);\r\n\r\n const currentParentValues = [\r\n ...parentValues(currentParent.el, currentParent.data).filter(\r\n (x) => !draggedValues.some((y) => eq(x, y))\r\n ),\r\n ];\r\n\r\n const targetParentValues = parentValues(targetParent.el, targetParent.data);\r\n\r\n const reset =\r\n initialParent.el === targetParent.el &&\r\n targetParent.data.config.sortable === false;\r\n\r\n let targetIndex: number;\r\n\r\n if (targetNodes.length) {\r\n if (reset) {\r\n targetIndex = initialIndex;\r\n } else if (targetParent.data.config.sortable === false) {\r\n targetIndex = targetParent.data.enabledNodes.length;\r\n } else {\r\n targetIndex = targetNodes[0].data.index;\r\n }\r\n\r\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\r\n } else {\r\n targetIndex = reset ? initialIndex : targetParent.data.enabledNodes.length;\r\n\r\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\r\n }\r\n\r\n setParentValues(currentParent.el, currentParent.data, currentParentValues);\r\n\r\n setParentValues(targetParent.el, targetParent.data, targetParentValues);\r\n\r\n if (targetParent.data.config.onTransfer) {\r\n targetParent.data.config.onTransfer({\r\n sourceParent: currentParent,\r\n targetParent,\r\n initialParent,\r\n draggedNodes,\r\n targetIndex,\r\n state,\r\n targetNodes,\r\n });\r\n }\r\n\r\n if (currentParent.data.config.onTransfer) {\r\n currentParent.data.config.onTransfer({\r\n sourceParent: currentParent,\r\n targetParent,\r\n initialParent,\r\n draggedNodes,\r\n targetIndex,\r\n state,\r\n targetNodes: targetNodes ? targetNodes : [],\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Get the values of the parent.\r\n *\r\n * @param parent - The parent element.\r\n * @param parentData - The parent data.\r\n *\r\n * @returns The values of the parent.\r\n */\r\nexport function parentValues(\r\n parent: HTMLElement,\r\n parentData: ParentData\r\n): Array {\r\n return [...parentData.getValues(parent)];\r\n}\r\n\r\n/**\r\n * Set the values of the parent.\r\n *\r\n * @param parent - The parent element.\r\n * @param parentData - The parent data.\r\n * @param values - The values to set.\r\n *\r\n * @returns void\r\n */\r\nexport function setParentValues(\r\n parent: HTMLElement,\r\n parentData: ParentData,\r\n values: Array\r\n): void {\r\n parentData.setValues(values, parent);\r\n}\r\n\r\n/**\r\n * Get the values of the dragged nodes.\r\n *\r\n * @param state - The drag state.\r\n *\r\n * @returns The values of the dragged nodes.\r\n */\r\nexport function dragValues(state: DragState): Array {\r\n return [...state.draggedNodes.map((x) => x.data.value)];\r\n}\r\n\r\n/**\r\n * Utility function to update parent config.\r\n *\r\n * @param parent - The parent element.\r\n * @param config - The config to update.\r\n *\r\n * @returns void\r\n */\r\nexport function updateConfig(\r\n parent: HTMLElement,\r\n config: Partial>\r\n) {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n parents.set(parent, {\r\n ...parentData,\r\n config: { ...parentData.config, ...config },\r\n });\r\n\r\n dragAndDrop({\r\n parent,\r\n getValues: parentData.getValues,\r\n setValues: parentData.setValues,\r\n config,\r\n });\r\n}\r\n\r\n/**\r\n * Handle the parent drop event.\r\n *\r\n * @param data - The parent event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleParentDrop(\r\n data: ParentEventData,\r\n state: DragState\r\n) {\r\n sp(data.e);\r\n\r\n dropped = true;\r\n\r\n const handleEnd = state.initialParent.data.config.handleEnd;\r\n\r\n handleEnd(state);\r\n}\r\n\r\n/**\r\n * Tear down the parent.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @returns void\r\n */\r\nexport function tearDown(parent: HTMLElement) {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n if (parentData.abortControllers.mainParent)\r\n parentData.abortControllers.mainParent.abort();\r\n}\r\n\r\n/**\r\n * Check if the state is a drag state.\r\n *\r\n * @param state - The state to check.\r\n *\r\n * @returns Whether the state is a drag state.\r\n */\r\nexport function isDragState(\r\n state: BaseDragState\r\n): state is DragState | SynthDragState {\r\n return \"draggedNode\" in state && !!state.draggedNode;\r\n}\r\n\r\n/**\r\n * Check if the state is a synth drag state.\r\n *\r\n * @param state - The state to check.\r\n *\r\n * @returns Whether the state is a synth drag state.\r\n */\r\nexport function isSynthDragState(\r\n state: BaseDragState\r\n): state is SynthDragState {\r\n return \"synthDragging\" in state && !!state.synthDragging;\r\n}\r\n\r\n/**\r\n * Setup the parent.\r\n *\r\n * @param parent - The parent element.\r\n * @param parentData - The parent data.\r\n *\r\n * @returns void\r\n */\r\nfunction setup(parent: HTMLElement, parentData: ParentData): void {\r\n parentData.abortControllers.mainParent = addEvents(parent, {\r\n dragover: parentEventData(parentData.config.handleParentDragover),\r\n handleParentPointerover: parentData.config.handleParentPointerover,\r\n scroll: parentEventData(parentData.config.handleParentScroll),\r\n drop: parentEventData(parentData.config.handleParentDrop),\r\n hasNestedParent: (e: CustomEvent) => {\r\n const parent = parents.get(e.target as HTMLElement);\r\n\r\n if (!parent) return;\r\n\r\n parent.nestedParent = e.detail.parent;\r\n },\r\n focus: parentEventData(parentData.config.handleParentFocus),\r\n });\r\n\r\n if (\r\n parentData.config.externalDragHandle &&\r\n parentData.config.externalDragHandle.el &&\r\n parentData.config.externalDragHandle.callback\r\n ) {\r\n parentData.abortControllers.externalDragHandle = addEvents(\r\n parentData.config.externalDragHandle.el,\r\n {\r\n pointerdown: (_e: PointerEvent) => {\r\n if (\r\n !parentData.config.externalDragHandle ||\r\n !parentData.config.externalDragHandle.callback\r\n )\r\n return;\r\n\r\n const draggableItem = parentData.config.externalDragHandle.callback();\r\n\r\n if (!isNode(draggableItem)) {\r\n console.warn(\r\n \"No draggable item found from external drag handle callback\"\r\n );\r\n\r\n return;\r\n }\r\n\r\n const nodeData = nodes.get(draggableItem);\r\n\r\n if (!nodeData) return;\r\n\r\n const parentNode = draggableItem.parentNode;\r\n\r\n if (!(parentNode instanceof HTMLElement)) return;\r\n\r\n const parent = parents.get(parentNode);\r\n\r\n if (!parent) return;\r\n\r\n state.pointerDown = {\r\n parent: {\r\n el: parentNode,\r\n data: parent,\r\n },\r\n node: {\r\n el: draggableItem,\r\n data: nodeData,\r\n },\r\n validated: true,\r\n };\r\n\r\n draggableItem.draggable = true;\r\n },\r\n }\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Set the attributes of the element.\r\n *\r\n * @param el - The element.\r\n * @param attrs - The attributes to set.\r\n *\r\n * @returns void\r\n */\r\nexport function setAttrs(el: HTMLElement, attrs: Record) {\r\n for (const key in attrs) el.setAttribute(key, attrs[key]);\r\n}\r\n\r\n/**\r\n * Setup the node.\r\n *\r\n * @param data - The setup node data.\r\n *\r\n * @returns void\r\n */\r\nexport function setupNode(data: SetupNodeData) {\r\n const config = data.parent.data.config;\r\n\r\n data.node.data.abortControllers.mainNode = addEvents(data.node.el, {\r\n keydown: nodeEventData(config.handleNodeKeydown),\r\n dragstart: nodeEventData(config.handleDragstart),\r\n dragover: nodeEventData(config.handleNodeDragover),\r\n dragenter: nodeEventData(config.handleNodeDragenter),\r\n dragleave: nodeEventData(config.handleNodeDragleave),\r\n dragend: nodeEventData(config.handleDragend),\r\n drop: nodeEventData(config.handleNodeDrop),\r\n focus: nodeEventData(config.handleNodeFocus),\r\n blur: nodeEventData(config.handleNodeBlur),\r\n pointerup: nodeEventData(config.handleNodePointerup),\r\n pointercancel: nodeEventData(config.handlePointercancel),\r\n pointerdown: nodeEventData(config.handleNodePointerdown),\r\n handleNodePointerover: config.handleNodePointerover,\r\n touchmove: (e: TouchEvent) => {\r\n if (isDragState(state) && e.cancelable) pd(e);\r\n },\r\n contextmenu: (e: Event) => {\r\n if (isSynthDragState(state)) pd(e);\r\n },\r\n });\r\n\r\n data.node.el.draggable = true;\r\n\r\n config.reapplyDragClasses(data.node.el, data.parent.data);\r\n\r\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(data.parent.el)?.setupNode?.(data);\r\n });\r\n}\r\n\r\n/**\r\n * Setup the node remap.\r\n *\r\n * @param data - The setup node data.\r\n *\r\n * @returns void\r\n */\r\nexport function setupNodeRemap(data: SetupNodeData) {\r\n nodes.set(data.node.el, data.node.data);\r\n\r\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(data.parent.el)?.setupNodeRemap?.(data);\r\n });\r\n}\r\n\r\n/**\r\n * Reapply the drag classes to the node.\r\n *\r\n * @param node - The node.\r\n * @param parentData - The parent data.\r\n *\r\n * @returns void\r\n */\r\nfunction reapplyDragClasses(node: Node, parentData: ParentData) {\r\n if (!isDragState(state)) return;\r\n\r\n const dropZoneClass = isSynthDragState(state)\r\n ? parentData.config.synthDropZoneClass\r\n : parentData.config.dropZoneClass;\r\n\r\n if (state.draggedNode.el !== node) return;\r\n\r\n addNodeClass([node], dropZoneClass, true);\r\n}\r\n\r\n/**\r\n * Tear down the node remap.\r\n *\r\n * @param data - The tear down node data.\r\n *\r\n * @returns void\r\n */\r\nexport function tearDownNodeRemap(data: TearDownNodeData) {\r\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(data.parent.el)?.tearDownNodeRemap?.(data);\r\n });\r\n}\r\n\r\n/**\r\n * Tear down the node.\r\n *\r\n * @param data - The tear down node data.\r\n *\r\n * @returns void\r\n */\r\nexport function tearDownNode(data: TearDownNodeData) {\r\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(data.parent.el)?.tearDownNode?.(data);\r\n });\r\n\r\n data.node.el.draggable = false;\r\n\r\n if (data.node.data?.abortControllers?.mainNode)\r\n data.node.data?.abortControllers?.mainNode.abort();\r\n}\r\n\r\n/**\r\n * Called when the nodes of a given parent element are mutated.\r\n *\r\n * @param mutationList - The list of mutations.\r\n *\r\n * @returns void\r\n *\r\n * @internal\r\n */\r\nfunction nodesMutated(mutationList: MutationRecord[]) {\r\n // TODO: This could be better, but using it as a way to ignore comments and text\r\n if (\r\n mutationList.length === 1 &&\r\n mutationList[0].addedNodes.length === 1 &&\r\n !(mutationList[0].addedNodes[0] instanceof HTMLElement)\r\n )\r\n return;\r\n\r\n const parentEl = mutationList[0].target;\r\n\r\n if (!(parentEl instanceof HTMLElement)) return;\r\n\r\n const parentData = parents.get(parentEl);\r\n\r\n if (!parentData) return;\r\n\r\n remapNodes(parentEl);\r\n}\r\n\r\n/**\r\n * Remaps the data of the parent element's children.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @returns void\r\n *\r\n * @internal\r\n */\r\nexport function remapNodes(parent: HTMLElement, force?: boolean) {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n parentData.privateClasses = Array.from(parent.classList);\r\n\r\n const enabledNodes: Array = [];\r\n\r\n const config = parentData.config;\r\n\r\n for (let x = 0; x < parent.children.length; x++) {\r\n const node = parent.children[x];\r\n\r\n if (!isNode(node) || node.id === \"dnd-dragged-node-clone\") continue;\r\n\r\n const nodeData = nodes.get(node);\r\n\r\n // Only tear down the node if we have explicitly called dragAndDrop\r\n if (force || !nodeData)\r\n config.tearDownNode({\r\n parent: {\r\n el: parent,\r\n data: parentData,\r\n },\r\n node: {\r\n el: node,\r\n data: nodeData,\r\n },\r\n });\r\n\r\n if (config.disabled) continue;\r\n\r\n if (!config.draggable || (config.draggable && config.draggable(node))) {\r\n enabledNodes.push(node);\r\n }\r\n }\r\n\r\n if (\r\n enabledNodes.length !== parentData.getValues(parent).length &&\r\n !config.disabled\r\n ) {\r\n console.warn(\r\n \"The number of draggable items defined in the parent element does not match the number of values. This may cause unexpected behavior.\"\r\n );\r\n\r\n return;\r\n }\r\n\r\n const values = parentData.getValues(parent);\r\n\r\n const enabledNodeRecords: Array> = [];\r\n\r\n for (let x = 0; x < enabledNodes.length; x++) {\r\n const node = enabledNodes[x];\r\n\r\n const prevNodeData = nodes.get(node);\r\n\r\n if (config.draggableValue && !config.draggableValue(values[x])) continue;\r\n\r\n const nodeData = Object.assign(\r\n prevNodeData ?? {\r\n privateClasses: [],\r\n abortControllers: {},\r\n },\r\n {\r\n value: values[x],\r\n index: x,\r\n }\r\n );\r\n\r\n if (\r\n !isDragState(state) &&\r\n state.activeState &&\r\n eq(state.activeState.node.data.value, nodeData.value)\r\n ) {\r\n setActive(\r\n {\r\n data: parentData,\r\n el: parent,\r\n },\r\n {\r\n el: node,\r\n data: nodeData,\r\n },\r\n state\r\n );\r\n }\r\n\r\n if (\r\n isDragState(state) &&\r\n eq(state.draggedNode.data.value, nodeData.value)\r\n ) {\r\n state.draggedNode.data = nodeData;\r\n\r\n state.draggedNode.el = node;\r\n\r\n const draggedNode = state.draggedNodes.find(\r\n (x) => x.data.value === nodeData.value\r\n );\r\n\r\n if (draggedNode) draggedNode.el = node;\r\n }\r\n\r\n enabledNodeRecords.push({\r\n el: node,\r\n data: nodeData,\r\n });\r\n\r\n if (force || !prevNodeData)\r\n config.setupNode({\r\n parent: {\r\n el: parent,\r\n data: parentData,\r\n },\r\n node: {\r\n el: node,\r\n data: nodeData,\r\n },\r\n });\r\n\r\n setupNodeRemap({\r\n parent: {\r\n el: parent,\r\n data: parentData,\r\n },\r\n node: {\r\n el: node,\r\n data: nodeData,\r\n },\r\n });\r\n }\r\n\r\n parents.set(parent, { ...parentData, enabledNodes: enabledNodeRecords });\r\n\r\n config.remapFinished(parentData);\r\n\r\n parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(parent)?.remapFinished?.();\r\n });\r\n}\r\n\r\n/**\r\n * Set the remap just finished flag.\r\n *\r\n * @returns void\r\n */\r\nexport function remapFinished() {\r\n state.remapJustFinished = true;\r\n\r\n if (\"draggedNode\" in state) state.affectedNodes = [];\r\n}\r\n\r\n/**\r\n * Validate the drag start.\r\n *\r\n * @param data - The node event data.\r\n *\r\n * @returns Whether the drag start is valid.\r\n */\r\nexport function validateDragstart(data: NodeEventData): boolean {\r\n return !!data.targetData.parent.data.config.nativeDrag;\r\n}\r\n\r\n/**\r\n * Get the dragged nodes.\r\n *\r\n * @param pointerDown - The pointer down data.\r\n *\r\n * @returns The dragged nodes.\r\n */\r\nfunction draggedNodes(pointerDown: {\r\n parent: ParentRecord;\r\n node: NodeRecord;\r\n}): Array> {\r\n if (!pointerDown.parent.data.config.multiDrag) {\r\n return [pointerDown.node];\r\n } else if (state.selectedState) {\r\n return [\r\n pointerDown.node,\r\n ...(state.selectedState?.nodes.filter(\r\n (x) => x.el !== pointerDown.node.el\r\n ) as Array>),\r\n ];\r\n }\r\n\r\n return [];\r\n}\r\n\r\n/**\r\n * Handle the parent scroll.\r\n *\r\n * @param data - The parent event data.\r\n *\r\n * @returns void\r\n */\r\nfunction handleParentScroll(_data: ParentEventData) {\r\n if (!isDragState(state)) return;\r\n\r\n state.emit(\"scrollStarted\", state);\r\n\r\n if (isSynthDragState(state)) return;\r\n\r\n state.preventEnter = true;\r\n\r\n if (scrollTimeout) clearTimeout(scrollTimeout);\r\n\r\n scrollTimeout = setTimeout(() => {\r\n state.preventEnter = false;\r\n\r\n state.emit(\"scrollEnded\", state);\r\n }, 100);\r\n}\r\n\r\n/**\r\n * Responsible for assigning dragstart classes to the dragged nodes.\r\n */\r\nexport function handleDragstart(\r\n data: NodeDragEventData,\r\n _state: BaseDragState\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (\r\n !config.nativeDrag ||\r\n !validateDragstart(data) ||\r\n !validateDragHandle({\r\n x: data.e.clientX,\r\n y: data.e.clientY,\r\n node: data.targetData.node,\r\n config,\r\n })\r\n ) {\r\n pd(data.e);\r\n\r\n return;\r\n }\r\n\r\n let nodes = config.draggedNodes({\r\n parent: data.targetData.parent,\r\n node: data.targetData.node,\r\n });\r\n\r\n // On Safari, pointerdown can sometimes not fire before the dragstart event.\r\n if (nodes.length === 0) {\r\n nodes = [data.targetData.node];\r\n }\r\n\r\n config.dragstartClasses(data.targetData.node, nodes, config);\r\n\r\n const dragState = initDrag(data, nodes);\r\n\r\n if (config.onDragstart) {\r\n const dragstartData: DragstartEventData = {\r\n parent: data.targetData.parent,\r\n values: parentValues(\r\n data.targetData.parent.el,\r\n data.targetData.parent.data\r\n ),\r\n draggedNode: dragState.draggedNode,\r\n draggedNodes: dragState.draggedNodes,\r\n position: dragState.initialIndex,\r\n state: dragState,\r\n };\r\n config.onDragstart(dragstartData);\r\n }\r\n}\r\n\r\nexport function handleNodePointerdown(\r\n data: NodePointerEventData,\r\n state: BaseDragState\r\n) {\r\n sp(data.e);\r\n\r\n state.pointerDown = {\r\n parent: data.targetData.parent,\r\n node: data.targetData.node,\r\n validated: false,\r\n };\r\n\r\n if (\r\n !validateDragHandle({\r\n x: data.e.clientX,\r\n y: data.e.clientY,\r\n node: data.targetData.node,\r\n config: data.targetData.parent.data.config,\r\n })\r\n )\r\n return;\r\n\r\n state.pointerDown.validated = true;\r\n\r\n handleLongPress(data, state, data.targetData.node);\r\n\r\n const parentData = data.targetData.parent.data;\r\n\r\n let selectedNodes = [data.targetData.node];\r\n\r\n const commandKey = data.e.ctrlKey || data.e.metaKey;\r\n\r\n const shiftKey = data.e.shiftKey;\r\n\r\n const targetNode = data.targetData.node;\r\n\r\n if (commandKey && parentData.config.multiDrag) {\r\n if (state.selectedState) {\r\n const idx = state.selectedState.nodes.findIndex(\r\n (x) => x.el === targetNode.el\r\n );\r\n\r\n if (idx === -1) {\r\n selectedNodes = [...state.selectedState.nodes, targetNode];\r\n } else {\r\n selectedNodes = state.selectedState.nodes.filter(\r\n (x) => x.el !== targetNode.el\r\n );\r\n }\r\n } else {\r\n selectedNodes = [targetNode];\r\n }\r\n\r\n setSelected(\r\n data.targetData.parent,\r\n selectedNodes,\r\n data.targetData.node,\r\n state,\r\n true\r\n );\r\n\r\n return;\r\n }\r\n\r\n if (shiftKey && parentData.config.multiDrag) {\r\n const nodes = data.targetData.parent.data.enabledNodes;\r\n\r\n if (state.selectedState && state.activeState) {\r\n if (state.selectedState.parent.el !== data.targetData.parent.el) {\r\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\r\n\r\n state.selectedState = undefined;\r\n\r\n for (let x = 0; x <= targetNode.data.index; x++)\r\n selectedNodes.push(nodes[x]);\r\n } else {\r\n const [minIndex, maxIndex] =\r\n state.activeState.node.data.index < data.targetData.node.data.index\r\n ? [\r\n state.activeState.node.data.index,\r\n data.targetData.node.data.index,\r\n ]\r\n : [\r\n data.targetData.node.data.index,\r\n state.activeState.node.data.index,\r\n ];\r\n\r\n selectedNodes = nodes.slice(minIndex, maxIndex + 1);\r\n }\r\n } else {\r\n for (let x = 0; x <= targetNode.data.index; x++)\r\n selectedNodes.push(nodes[x]);\r\n }\r\n\r\n setSelected(\r\n data.targetData.parent,\r\n selectedNodes,\r\n data.targetData.node,\r\n state,\r\n true\r\n );\r\n\r\n return;\r\n }\r\n\r\n if (state.selectedState?.nodes?.length) {\r\n const idx = state.selectedState.nodes.findIndex(\r\n (x) => x.el === data.targetData.node.el\r\n );\r\n\r\n if (idx === -1) {\r\n if (state.selectedState.parent.el !== data.targetData.parent.el) {\r\n deselect(state.selectedState.nodes, data.targetData.parent, state);\r\n } else if (parentData.config.multiDrag && isMobilePlatform()) {\r\n selectedNodes.push(...state.selectedState.nodes);\r\n } else {\r\n deselect(state.selectedState.nodes, data.targetData.parent, state);\r\n }\r\n\r\n setSelected(\r\n data.targetData.parent,\r\n selectedNodes,\r\n data.targetData.node,\r\n state,\r\n true\r\n );\r\n }\r\n } else {\r\n setSelected(\r\n data.targetData.parent,\r\n [data.targetData.node],\r\n data.targetData.node,\r\n state,\r\n true\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Add dragstart classes to the nodes.\r\n *\r\n * @param node - The node.\r\n * @param nodes - The nodes.\r\n * @param config - The parent config.\r\n * @param isSynth - Whether the drag is synthetic.\r\n *\r\n * @returns void\r\n */\r\nexport function dragstartClasses(\r\n _node: NodeRecord,\r\n nodes: Array>,\r\n config: ParentConfig,\r\n isSynth = false\r\n) {\r\n addNodeClass(\r\n nodes.map((x) => x.el),\r\n isSynth ? config.synthDraggingClass : config.draggingClass\r\n );\r\n\r\n setTimeout(() => {\r\n removeClass(\r\n nodes.map((x) => x.el),\r\n isSynth ? config.synthDraggingClass : config.draggingClass\r\n );\r\n\r\n addNodeClass(\r\n nodes.map((x) => x.el),\r\n isSynth ? config.synthDragPlaceholderClass : config.dragPlaceholderClass\r\n );\r\n\r\n addNodeClass(\r\n nodes.map((x) => x.el),\r\n isSynth ? config.synthDropZoneClass : config.dropZoneClass\r\n );\r\n\r\n removeClass(\r\n nodes.map((x) => x.el),\r\n config.selectedClass\r\n );\r\n });\r\n}\r\n\r\nexport function initDrag(\r\n data: NodeDragEventData,\r\n draggedNodes: Array>\r\n): DragState {\r\n sp(data.e);\r\n\r\n const dragState = setDragState(\r\n dragStateProps(\r\n data.targetData.node,\r\n data.targetData.parent,\r\n data.e,\r\n draggedNodes\r\n )\r\n );\r\n\r\n if (data.e.dataTransfer) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n data.e.dataTransfer.dropEffect = config.dragDropEffect;\r\n data.e.dataTransfer.effectAllowed = config.dragEffectAllowed;\r\n\r\n let dragImage: HTMLElement | undefined;\r\n\r\n data.e.dataTransfer.setData(\"text/plain\", \"\");\r\n\r\n if (config.dragImage) {\r\n dragImage = config.dragImage(data, draggedNodes);\r\n } else {\r\n if (!config.multiDrag || draggedNodes.length === 1) {\r\n dragState.originalZIndex = data.targetData.node.el.style.zIndex;\r\n\r\n data.targetData.node.el.style.zIndex = \"9999\";\r\n data.targetData.node.el.style.boxSizing = \"border-box\";\r\n\r\n data.e.dataTransfer.setDragImage(\r\n data.targetData.node.el,\r\n data.e.offsetX,\r\n data.e.offsetY\r\n );\r\n return dragState;\r\n } else {\r\n const wrapper = document.createElement(\"div\");\r\n\r\n wrapper.setAttribute(\"id\", \"dnd-dragged-node-clone\");\r\n\r\n wrapper.setAttribute(\"popover\", \"manual\");\r\n\r\n for (const node of draggedNodes) {\r\n const clone = node.el.cloneNode(true) as HTMLElement;\r\n\r\n clone.id = node.el.id + \"-clone\";\r\n\r\n clone.style.pointerEvents = \"none\";\r\n\r\n wrapper.appendChild(clone);\r\n }\r\n\r\n const { width } = draggedNodes[0].el.getBoundingClientRect();\r\n\r\n Object.assign(wrapper.style, {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n width: `${width}px`,\r\n position: \"absolute\",\r\n pointerEvents: \"none\",\r\n zIndex: \"9999\",\r\n left: \"-9999px\",\r\n boxSizing: \"border-box\",\r\n background: \"transparent\",\r\n overflow: \"hidden\",\r\n });\r\n\r\n data.targetData.parent.el.appendChild(wrapper);\r\n\r\n wrapper.showPopover();\r\n\r\n wrapper.getBoundingClientRect(); // ← forces layout\r\n\r\n dragImage = wrapper;\r\n\r\n data.e.dataTransfer.setDragImage(\r\n dragImage,\r\n data.e.offsetX,\r\n data.e.offsetY\r\n );\r\n }\r\n }\r\n\r\n setTimeout(() => {\r\n dragImage?.remove();\r\n });\r\n }\r\n\r\n return dragState;\r\n}\r\n\r\nexport function validateDragHandle({\r\n x,\r\n y,\r\n node,\r\n config,\r\n}: {\r\n x: number;\r\n y: number;\r\n node: NodeRecord;\r\n config: ParentConfig;\r\n}): boolean {\r\n if (config.externalDragHandle) return false;\r\n\r\n if (!config.dragHandle) return true;\r\n\r\n const dragHandles = node.el.querySelectorAll(config.dragHandle);\r\n\r\n if (!dragHandles) return false;\r\n\r\n const elFromPoint = config.root.elementFromPoint(x, y);\r\n\r\n if (!elFromPoint) return false;\r\n\r\n for (const handle of Array.from(dragHandles))\r\n if (elFromPoint === handle || handle.contains(elFromPoint)) return true;\r\n\r\n return false;\r\n}\r\n\r\nexport function handleClickNode(_data: NodeEventData) {}\r\n\r\nexport function handleClickParent(_data: ParentEventData) {}\r\n\r\nexport function handleNodeKeydown(_data: NodeEventData) {}\r\n\r\n/**\r\n * Prevent the sort on scroll.\r\n *\r\n * @returns A function to prevent the sort on scroll.\r\n */\r\nexport function preventSortOnScroll() {\r\n let scrollTimeout: ReturnType;\r\n\r\n return () => {\r\n clearTimeout(scrollTimeout);\r\n\r\n if (state) state.preventEnter = true;\r\n\r\n scrollTimeout = setTimeout(() => {\r\n if (state) state.preventEnter = false;\r\n }, 100);\r\n };\r\n}\r\n\r\n/**\r\n * Handle the node pointer over.\r\n *\r\n * @param e - The node pointer over event.\r\n *\r\n * @returns void\r\n */\r\nexport function handleNodePointerover(e: PointeroverNodeEvent) {\r\n if (e.detail.targetData.parent.el === e.detail.state.currentParent.el)\r\n sort(e.detail, e.detail.state);\r\n else transfer(e.detail, e.detail.state);\r\n}\r\n\r\n/**\r\n * Handle the node drop.\r\n *\r\n * @param data - The node drag event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleNodeDrop(\r\n data: NodeDragEventData,\r\n state: DragState | SynthDragState\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (!config.nativeDrag) return;\r\n\r\n sp(data.e);\r\n\r\n dropped = true;\r\n\r\n config.handleEnd(state);\r\n}\r\n\r\nexport function handleNodeFocus(data: NodeEventData) {\r\n if (data.e.target === data.e.currentTarget) return;\r\n\r\n if (state.pointerDown) state.pointerDown.node.el.draggable = false;\r\n}\r\n\r\nexport function handleNodeBlur(data: NodeEventData) {\r\n if (data.e.target === data.e.currentTarget) return;\r\n\r\n if (state.pointerDown) state.pointerDown.node.el.draggable = true;\r\n}\r\n\r\n/**\r\n * Handle the drag end.\r\n *\r\n * @param data - The node drag event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleDragend(\r\n data: NodeDragEventData,\r\n state: DragState\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (!config.nativeDrag) return;\r\n\r\n pd(data.e);\r\n\r\n sp(data.e);\r\n\r\n if (dropped) {\r\n dropped = false;\r\n\r\n return;\r\n }\r\n\r\n config.handleEnd(state);\r\n}\r\n\r\n/**\r\n * Handle the pointer cancel.\r\n *\r\n * @param data - The node event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handlePointercancel(\r\n data: NodeEventData,\r\n state: DragState | SynthDragState | BaseDragState\r\n) {\r\n if (!isSynthDragState(state)) return;\r\n\r\n pd(data.e);\r\n\r\n if (dropped) {\r\n dropped = false;\r\n\r\n return;\r\n }\r\n\r\n const config = parents.get(state.initialParent.el)?.config;\r\n\r\n if (config?.onDragend) {\r\n config.onDragend({\r\n parent: state.currentParent,\r\n values: parentValues(state.currentParent.el, state.currentParent.data),\r\n draggedNode: state.draggedNode,\r\n draggedNodes: state.draggedNodes,\r\n state,\r\n });\r\n }\r\n\r\n config?.handleEnd(state);\r\n}\r\n\r\n/**\r\n * Handle the drag end.\r\n *\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleEnd(state: DragState | SynthDragState) {\r\n if (state.draggedNode) state.draggedNode.el.draggable = true;\r\n\r\n // --- Capture necessary data BEFORE resetState might affect it ---\r\n const nodesToClean = state.draggedNodes.map((x) => x.el);\r\n const initialParentData = state.initialParent.data;\r\n const isSynth = isSynthDragState(state);\r\n const config = parents.get(state.initialParent.el)?.config;\r\n const dropZoneClass = isSynth\r\n ? config?.synthDropZoneClass\r\n : config?.dropZoneClass;\r\n const longPressClass = initialParentData?.config?.longPressClass;\r\n const placeholderClass = isSynth\r\n ? initialParentData?.config?.synthDragPlaceholderClass // Corrected potential typo: used initialParentData\r\n : initialParentData?.config?.dragPlaceholderClass;\r\n const originalZIndex = state.originalZIndex;\r\n // --- End data capture ---\r\n\r\n if (isSynthDragState(state)) {\r\n // Ensure cloned node removal happens reasonably quickly\r\n if (state.clonedDraggedNode) {\r\n // Check if it exists\r\n state.clonedDraggedNode.remove();\r\n }\r\n if (state.longPressTimeout) {\r\n // Check if timeout exists\r\n clearTimeout(state.longPressTimeout);\r\n }\r\n }\r\n\r\n // Ensure scrolling is properly cancelled (needs state, do before reset)\r\n cancelSynthScroll(state);\r\n\r\n // Clear any lingering scroll directions and timeouts (needs state, do before reset)\r\n state.lastScrollDirectionX = undefined;\r\n state.lastScrollDirectionY = undefined;\r\n state.preventEnter = false;\r\n if (state.scrollDebounceTimeout) {\r\n clearTimeout(state.scrollDebounceTimeout);\r\n state.scrollDebounceTimeout = undefined; // Ensure it's marked as cleared\r\n }\r\n\r\n // Apply z-index change synchronously if needed\r\n if (originalZIndex !== undefined && state.draggedNode) {\r\n state.draggedNode.el.style.zIndex = originalZIndex;\r\n }\r\n\r\n // Use single rAF with captured data for class removal\r\n requestAnimationFrame(() => {\r\n // Use the captured data, not the potentially reset global state\r\n removeClass(nodesToClean, dropZoneClass);\r\n removeClass(nodesToClean, longPressClass);\r\n removeClass(nodesToClean, placeholderClass);\r\n });\r\n\r\n // Deselect and reset active state (needs state, do before reset)\r\n deselect(state.draggedNodes, state.currentParent, state);\r\n setActive(state.currentParent, undefined, state);\r\n\r\n // Prepare data for callback/event *before* resetState\r\n const finalStateForCallback = { ...state }; // Shallow copy for safety\r\n\r\n // Call onDragend callback *before* resetState\r\n config?.onDragend?.({\r\n parent: finalStateForCallback.currentParent,\r\n values: parentValues(\r\n finalStateForCallback.currentParent.el,\r\n finalStateForCallback.currentParent.data\r\n ),\r\n draggedNode: finalStateForCallback.draggedNode,\r\n draggedNodes: finalStateForCallback.draggedNodes,\r\n state: finalStateForCallback,\r\n });\r\n\r\n // Emit event *before* resetState\r\n state.emit(\"dragEnded\", finalStateForCallback); // Emit with the final state representation\r\n\r\n // Reset global state LAST\r\n resetState();\r\n\r\n // No need to set state.selectedState = undefined; resetState handles it.\r\n}\r\n\r\n/**\r\n * Handle the node pointer up.\r\n *\r\n * @param data - The node pointer event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleNodePointerup(\r\n data: NodePointerEventData,\r\n state: DragState | SynthDragState | BaseDragState\r\n) {\r\n sp(data.e);\r\n\r\n if (!state.pointerSelection && state.selectedState)\r\n deselect(state.selectedState.nodes, data.targetData.parent, state);\r\n\r\n const config = data.targetData.parent.data.config;\r\n\r\n state.pointerSelection = false;\r\n\r\n if (\"longPressTimeout\" in state && state.longPressTimeout)\r\n clearTimeout(state.longPressTimeout);\r\n\r\n state.longPress = false;\r\n\r\n removeClass(\r\n data.targetData.parent.data.enabledNodes.map((x) => x.el),\r\n config.longPressClass\r\n );\r\n\r\n if (!isDragState(state)) return;\r\n\r\n config.handleEnd(state as DragState | SynthDragState);\r\n}\r\n\r\n/**\r\n * Initialize the synth drag.\r\n *\r\n * @param node - The node.\r\n * @param parent - The parent.\r\n * @param e - The pointer event.\r\n * @param _state - The drag state.\r\n * @param draggedNodes - The dragged nodes.\r\n * @param rect - The bounding rect of the original element\r\n *\r\n * @returns The synth drag state.\r\n */\r\nfunction initSynthDrag(\r\n node: NodeRecord,\r\n parent: ParentRecord,\r\n e: PointerEvent,\r\n _state: BaseDragState,\r\n draggedNodes: Array>,\r\n rect: DOMRect\r\n): SynthDragState {\r\n const config = parent.data.config;\r\n\r\n let dragImage: HTMLElement;\r\n\r\n let result:\r\n | { dragImage: HTMLElement; offsetX?: number; offsetY?: number }\r\n | undefined;\r\n\r\n const criticalStyleProps = [\r\n \"display\",\r\n \"flexDirection\",\r\n \"alignItems\",\r\n \"justifyContent\",\r\n \"padding\",\r\n \"paddingTop\",\r\n \"margin\",\r\n \"marginTop\",\r\n \"marginBottom\",\r\n \"marginLeft\",\r\n \"marginRight\",\r\n \"paddingBottom\",\r\n \"paddingLeft\",\r\n \"paddingRight\",\r\n \"border\",\r\n \"borderRadius\",\r\n \"background\",\r\n \"backgroundColor\",\r\n \"boxShadow\",\r\n \"font\",\r\n \"color\",\r\n \"lineHeight\",\r\n \"gap\",\r\n \"width\",\r\n \"height\",\r\n \"boxSizing\",\r\n \"overflow\",\r\n ] as const;\r\n\r\n const copyCriticalStyles = (src: HTMLElement, dest: HTMLElement) => {\r\n const computed = window.getComputedStyle(src);\r\n criticalStyleProps.forEach((prop) => {\r\n dest.style[prop] = computed[prop]!;\r\n });\r\n };\r\n\r\n // Helper to style the drag image\r\n const applyBaseStyles = (\r\n el: HTMLElement,\r\n extraStyles: Partial = {}\r\n ) => {\r\n Object.assign(el.style, {\r\n position: \"absolute\",\r\n zIndex: \"9999\",\r\n pointerEvents: \"none\",\r\n willChange: \"transform\",\r\n boxSizing: \"border-box\",\r\n opacity: \"0\",\r\n overflow: \"hidden\",\r\n width: `${rect.width}px`,\r\n height: `${rect.height}px`,\r\n ...extraStyles,\r\n });\r\n };\r\n\r\n // Custom drag image\r\n if (config.synthDragImage) {\r\n result = config.synthDragImage(node, parent, e, draggedNodes);\r\n dragImage = result.dragImage;\r\n dragImage.setAttribute(\"popover\", \"manual\");\r\n applyBaseStyles(dragImage);\r\n }\r\n\r\n // Single drag\r\n else if (!config.multiDrag || draggedNodes.length === 1) {\r\n dragImage = node.el.cloneNode(true) as HTMLElement;\r\n copyCriticalStyles(node.el as HTMLElement, dragImage);\r\n dragImage.setAttribute(\"popover\", \"manual\");\r\n applyBaseStyles(dragImage);\r\n }\r\n\r\n // Multi-drag\r\n else {\r\n const wrapper = document.createElement(\"div\");\r\n\r\n wrapper.setAttribute(\"popover\", \"manual\");\r\n\r\n draggedNodes.forEach((dragged) => {\r\n const clone = dragged.el.cloneNode(true) as HTMLElement;\r\n\r\n copyCriticalStyles(dragged.el as HTMLElement, clone);\r\n\r\n clone.style.pointerEvents = \"none\";\r\n\r\n clone.style.margin = \"0\";\r\n\r\n wrapper.append(clone);\r\n });\r\n\r\n wrapper.style.display = \"flex\";\r\n wrapper.style.flexDirection = \"column\";\r\n wrapper.style.padding = \"0\";\r\n wrapper.style.margin = \"0\";\r\n wrapper.style.position = \"absolute\";\r\n wrapper.style.zIndex = \"9999\";\r\n wrapper.style.pointerEvents = \"none\";\r\n\r\n dragImage = wrapper;\r\n }\r\n\r\n dragImage.id = \"dnd-dragged-node-clone\";\r\n\r\n parent.el.appendChild(dragImage);\r\n\r\n dragImage.showPopover();\r\n\r\n const synthDragStateProps = {\r\n clonedDraggedEls: [],\r\n clonedDraggedNode: dragImage,\r\n synthDragScrolling: false,\r\n synthDragging: true,\r\n rootScrollWidth: document.scrollingElement?.scrollWidth,\r\n rootScrollHeight: document.scrollingElement?.scrollHeight,\r\n };\r\n\r\n const synthDragState = setDragState({\r\n ...dragStateProps(\r\n node,\r\n parent,\r\n e,\r\n draggedNodes,\r\n result?.offsetX,\r\n result?.offsetY\r\n ),\r\n ...synthDragStateProps,\r\n }) as SynthDragState;\r\n\r\n return synthDragState;\r\n}\r\n\r\n/**\r\n * Handle the long press.\r\n *\r\n * @param data - The node pointer event data.\r\n * @param state - The drag state.\r\n * @param node - The node.\r\n *\r\n * @returns void\r\n */\r\nexport function handleLongPress(\r\n data: NodePointerEventData,\r\n state: BaseDragState,\r\n node: NodeRecord\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n state.longPressTimeout = setTimeout(() => {\r\n if (!state) return;\r\n\r\n state.longPress = true;\r\n\r\n if (config.longPressClass && data.e.cancelable)\r\n addNodeClass([node.el], config.longPressClass);\r\n\r\n pd(data.e);\r\n }, config.longPressDuration || 1000);\r\n}\r\n\r\nfunction cancelSynthScroll(\r\n state: DragState,\r\n cancelX = true,\r\n cancelY = true\r\n) {\r\n if (cancelX) {\r\n if (state.frameIdX !== undefined) {\r\n cancelAnimationFrame(state.frameIdX);\r\n state.frameIdX = undefined;\r\n }\r\n state.lastScrollDirectionX = undefined;\r\n }\r\n\r\n if (cancelY) {\r\n if (state.frameIdY !== undefined) {\r\n cancelAnimationFrame(state.frameIdY);\r\n state.frameIdY = undefined;\r\n }\r\n state.lastScrollDirectionY = undefined;\r\n }\r\n\r\n if (!state.frameIdX && !state.frameIdY) {\r\n state.preventEnter = false;\r\n }\r\n}\r\n\r\nfunction moveNode(state: SynthDragState, justStarted = false) {\r\n const { x, y } = state.coordinates;\r\n\r\n const startLeft = state.startLeft ?? 0;\r\n const startTop = state.startTop ?? 0;\r\n\r\n const currentScrollX = window.scrollX ?? 0;\r\n const currentScrollY = window.scrollY ?? 0;\r\n\r\n const translateX = x - startLeft + currentScrollX;\r\n const translateY = y - startTop + currentScrollY;\r\n\r\n state.clonedDraggedNode.style.transform = `translate3d(${translateX}px, ${translateY}px, 0px)`;\r\n\r\n if (justStarted) {\r\n state.clonedDraggedNode.style.opacity = \"1\";\r\n\r\n removeClass(\r\n state.draggedNodes.map((x) => x.el),\r\n state.initialParent.data.config?.longPressClass\r\n );\r\n }\r\n}\r\n\r\nexport function synthMove(\r\n e: PointerEvent,\r\n state: SynthDragState,\r\n justStarted = false\r\n) {\r\n const coordinates = eventCoordinates(e);\r\n state.coordinates.x = coordinates.x;\r\n state.coordinates.y = coordinates.y;\r\n\r\n moveNode(state, justStarted); // Pass only state now\r\n\r\n // Clear any existing timeout to avoid multiple concurrent timeouts\r\n if (state.scrollDebounceTimeout) {\r\n clearTimeout(state.scrollDebounceTimeout);\r\n state.scrollDebounceTimeout = undefined;\r\n }\r\n\r\n // Only set a new timeout if we're still in a valid drag state\r\n state.scrollDebounceTimeout = setTimeout(() => {\r\n // Only process if the drag state is still active\r\n if (isSynthDragState(state)) {\r\n handleSynthScroll(state.coordinates, e, state);\r\n }\r\n }, 16); // ~1 frame (60fps)\r\n\r\n const elFromPoint = getElFromPoint(coordinates);\r\n\r\n if (!elFromPoint) {\r\n document.dispatchEvent(\r\n new CustomEvent(\"handleRootPointerover\", {\r\n detail: {\r\n e,\r\n state,\r\n },\r\n })\r\n );\r\n\r\n return;\r\n }\r\n\r\n const pointerMoveEventData = {\r\n e,\r\n targetData: elFromPoint,\r\n state,\r\n };\r\n\r\n if (\"node\" in elFromPoint) {\r\n elFromPoint.node.el.dispatchEvent(\r\n new CustomEvent(\"handleNodePointerover\", {\r\n detail: pointerMoveEventData,\r\n })\r\n );\r\n } else {\r\n elFromPoint.parent.el.dispatchEvent(\r\n new CustomEvent(\"handleParentPointerover\", {\r\n detail: pointerMoveEventData,\r\n })\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Handle the node drag over.\r\n *\r\n * @param data - The node drag event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleNodeDragover(\r\n data: NodeDragEventData,\r\n state: DragState\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (!config.nativeDrag) return;\r\n\r\n const { x, y } = eventCoordinates(data.e);\r\n\r\n state.coordinates.y = y;\r\n\r\n state.coordinates.x = x;\r\n\r\n pd(data.e);\r\n\r\n sp(data.e);\r\n\r\n if (isDragState(state)) {\r\n handleSynthScroll({ x, y }, data.e, state);\r\n }\r\n\r\n data.targetData.parent.el === state.currentParent?.el\r\n ? sort(data, state)\r\n : transfer(data, state);\r\n}\r\n\r\n/**\r\n * Handle the parent drag over.\r\n *\r\n * @param data - The parent drag event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleParentDragover(\r\n data: ParentDragEventData,\r\n state: DragState\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (!config.nativeDrag) return;\r\n\r\n pd(data.e);\r\n\r\n sp(data.e);\r\n\r\n const { x, y } = eventCoordinates(data.e);\r\n\r\n if (isDragState(state)) {\r\n handleSynthScroll({ x, y }, data.e, state);\r\n }\r\n\r\n transfer(data, state);\r\n}\r\n\r\n/**\r\n * Handle the parent pointer over.\r\n *\r\n * @param e - The parent pointer over event.\r\n *\r\n * @returns void\r\n */\r\nexport function handleParentPointerover(e: PointeroverParentEvent) {\r\n if (e.detail.targetData.parent.el !== e.detail.state.currentParent.el)\r\n transfer(e.detail, e.detail.state);\r\n}\r\n\r\n/**\r\n * Validate the transfer.\r\n *\r\n * @param data - The transfer data.\r\n *\r\n * @returns Whether the transfer is valid.\r\n */\r\nexport function validateTransfer({\r\n currentParent,\r\n targetParent,\r\n initialParent,\r\n draggedNodes,\r\n state,\r\n}: {\r\n currentParent: ParentRecord;\r\n targetParent: ParentRecord;\r\n initialParent: ParentRecord;\r\n draggedNodes: Array>;\r\n state: BaseDragState;\r\n}) {\r\n if (targetParent.el === currentParent.el) return false;\r\n\r\n const targetConfig = targetParent.data.config;\r\n\r\n if (draggedNodes[0].el.contains(targetParent.el)) return false;\r\n\r\n if (targetConfig.dropZone === false) return false;\r\n\r\n const initialParentConfig = initialParent.data.config;\r\n\r\n if (targetConfig.accepts) {\r\n return targetConfig.accepts(\r\n targetParent,\r\n initialParent,\r\n currentParent,\r\n state\r\n );\r\n } else if (\r\n !targetConfig.group ||\r\n targetConfig.group !== initialParentConfig.group\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Handle the node drag enter.\r\n *\r\n * @param data - The node drag event data.\r\n * @param _state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nfunction handleNodeDragenter(\r\n data: NodeDragEventData,\r\n _state: DragState\r\n) {\r\n pd(data.e);\r\n}\r\n\r\n/**\r\n * Handle the node drag leave.\r\n *\r\n * @param data - The node drag event data.\r\n * @param _state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nfunction handleNodeDragleave(\r\n data: NodeDragEventData,\r\n _state: DragState\r\n) {\r\n pd(data.e);\r\n}\r\n\r\n/**\r\n * Validate the sort.\r\n *\r\n * @param data - The node drag event data or node pointer event data.\r\n * @param state - The drag state.\r\n * @param x - The x coordinate.\r\n * @param y - The y coordinate.\r\n *\r\n * @returns Whether the sort is valid.\r\n */\r\nexport function validateSort(\r\n data: NodeDragEventData | NodePointerEventData,\r\n state: DragState,\r\n x: number,\r\n y: number\r\n): boolean {\r\n if (\r\n state.affectedNodes\r\n .map((x) => x.data.value)\r\n .includes(data.targetData.node.data.value)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (state.remapJustFinished) {\r\n state.remapJustFinished = false;\r\n\r\n if (\r\n data.targetData.node.data.value === state.currentTargetValue ||\r\n state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)\r\n ) {\r\n state.currentTargetValue = data.targetData.node.data.value;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n if (state.preventEnter) return false;\r\n\r\n if (state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)) {\r\n state.currentTargetValue = undefined;\r\n\r\n return false;\r\n }\r\n\r\n if (data.targetData.node.data.value === state.currentTargetValue)\r\n return false;\r\n\r\n if (\r\n data.targetData.parent.el !== state.currentParent?.el ||\r\n data.targetData.parent.data.config.sortable === false\r\n )\r\n return false;\r\n\r\n if (data.targetData.node.el.contains(state.draggedNodes[0].el)) return false;\r\n\r\n const targetRect = data.targetData.node.el.getBoundingClientRect();\r\n\r\n const dragRect = state.draggedNode.el.getBoundingClientRect();\r\n\r\n const yDiff = targetRect.y - dragRect.y;\r\n\r\n const xDiff = targetRect.x - dragRect.x;\r\n\r\n let incomingDirection: \"above\" | \"below\" | \"left\" | \"right\";\r\n\r\n if (Math.abs(yDiff) > Math.abs(xDiff)) {\r\n incomingDirection = yDiff > 0 ? \"above\" : \"below\";\r\n } else {\r\n incomingDirection = xDiff > 0 ? \"left\" : \"right\";\r\n }\r\n\r\n const threshold = state.currentParent.data.config.threshold;\r\n\r\n switch (incomingDirection) {\r\n case \"left\":\r\n if (x > targetRect.x + targetRect.width * threshold.horizontal) {\r\n state.incomingDirection = \"left\";\r\n\r\n return true;\r\n }\r\n break;\r\n\r\n case \"right\":\r\n if (x < targetRect.x + targetRect.width * (1 - threshold.horizontal)) {\r\n state.incomingDirection = \"right\";\r\n\r\n return true;\r\n }\r\n break;\r\n\r\n case \"above\":\r\n if (y > targetRect.y + targetRect.height * threshold.vertical) {\r\n state.incomingDirection = \"above\";\r\n\r\n return true;\r\n }\r\n break;\r\n\r\n case \"below\":\r\n if (y < targetRect.y + targetRect.height * (1 - threshold.vertical)) {\r\n state.incomingDirection = \"below\";\r\n\r\n return true;\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Sort the nodes.\r\n *\r\n * @param data - The node drag event data or node pointer event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function sort(\r\n data: NodeDragEventData | NodePointerEventData,\r\n state: DragState\r\n) {\r\n const { x, y } = eventCoordinates(data.e);\r\n\r\n if (!validateSort(data, state, x, y)) {\r\n return;\r\n }\r\n\r\n const range =\r\n state.draggedNode.data.index > data.targetData.node.data.index\r\n ? [data.targetData.node.data.index, state.draggedNode.data.index]\r\n : [state.draggedNode.data.index, data.targetData.node.data.index];\r\n\r\n state.targetIndex = data.targetData.node.data.index;\r\n\r\n state.affectedNodes = data.targetData.parent.data.enabledNodes.filter(\r\n (node) => {\r\n return (\r\n range[0] <= node.data.index &&\r\n node.data.index <= range[1] &&\r\n node.el !== state.draggedNode.el\r\n );\r\n }\r\n );\r\n\r\n data.targetData.parent.data.config.performSort({\r\n parent: data.targetData.parent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: [data.targetData.node],\r\n });\r\n}\r\n\r\n/**\r\n * Event listener used for all nodes.\r\n *\r\n * @param e - The event.\r\n *\r\n */\r\nexport function nodeEventData(\r\n callback: any\r\n): (e: Event) => NodeEventData | undefined {\r\n function nodeTargetData(node: Node): NodeTargetData | undefined {\r\n const nodeData = nodes.get(node);\r\n\r\n if (!nodeData) return;\r\n\r\n const parentData = parents.get(node.parentNode);\r\n\r\n if (!parentData) return;\r\n\r\n return {\r\n node: {\r\n el: node,\r\n data: nodeData,\r\n },\r\n parent: {\r\n el: node.parentNode,\r\n data: parentData,\r\n },\r\n };\r\n }\r\n\r\n return (e: Event) => {\r\n const targetData = nodeTargetData(e.currentTarget as Node);\r\n\r\n if (!targetData) return;\r\n\r\n return callback(\r\n {\r\n e,\r\n targetData,\r\n },\r\n state\r\n );\r\n };\r\n}\r\n\r\n/**\r\n * Transfer the nodes.\r\n *\r\n * @param data - The node event data or parent event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function transfer(\r\n data: NodeEventData | ParentEventData,\r\n state: DragState\r\n): void {\r\n pd(data.e);\r\n\r\n if (\r\n !validateTransfer({\r\n currentParent: state.currentParent,\r\n targetParent: data.targetData.parent as any,\r\n initialParent: state.initialParent,\r\n draggedNodes: state.draggedNodes,\r\n state,\r\n })\r\n )\r\n return;\r\n\r\n data.targetData.parent.data.config.performTransfer({\r\n currentParent: state.currentParent,\r\n targetParent: data.targetData.parent,\r\n initialParent: state.initialParent,\r\n draggedNodes: state.draggedNodes,\r\n initialIndex: state.initialIndex,\r\n state,\r\n targetNodes: \"node\" in data.targetData ? [data.targetData.node] : [],\r\n });\r\n\r\n state.currentParent = data.targetData.parent;\r\n\r\n state.transferred = true;\r\n}\r\n\r\n/**\r\n * Event listener used for all parents.\r\n *\r\n * @param callback - The callback.\r\n *\r\n * @returns A function to get the parent event data.\r\n */\r\nexport function parentEventData(\r\n callback: any\r\n): (e: Event) => NodeEventData | undefined {\r\n function parentTargetData(\r\n parent: HTMLElement\r\n ): ParentTargetData | undefined {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n return {\r\n parent: {\r\n el: parent,\r\n data: parentData as ParentData,\r\n },\r\n };\r\n }\r\n\r\n return (e: Event) => {\r\n const targetData = parentTargetData(e.currentTarget as HTMLElement);\r\n\r\n if (!targetData) return;\r\n\r\n return callback(\r\n {\r\n e,\r\n targetData,\r\n },\r\n state\r\n );\r\n };\r\n}\r\n\r\n/**\r\n * Add class to the node.\r\n *\r\n * @param els - The nodes.\r\n * @param className - The class name.\r\n * @param omitAppendPrivateClass - Whether to omit append private class.\r\n *\r\n * @returns void\r\n */\r\nexport function addNodeClass(\r\n els: Array,\r\n className: string | undefined,\r\n omitAppendPrivateClass = false\r\n) {\r\n function nodeSetter(node: Node, nodeData: NodeData) {\r\n nodes.set(node, nodeData);\r\n }\r\n\r\n for (const el of els) {\r\n const nodeData = nodes.get(el as Node);\r\n\r\n const newData = addClass(el, className, nodeData, omitAppendPrivateClass);\r\n\r\n if (!newData) continue;\r\n\r\n nodeSetter(el as Node, newData as NodeData);\r\n }\r\n}\r\n\r\n/**\r\n * Add class to the parent.\r\n *\r\n * @param els - The parents.\r\n * @param className - The class name.\r\n * @param omitAppendPrivateClass - Whether to omit append private class.\r\n *\r\n * @returns void\r\n */\r\nexport function addParentClass(\r\n els: Array,\r\n className: string | undefined,\r\n omitAppendPrivateClass = false\r\n) {\r\n function parentSetter(parent: HTMLElement, parentData: ParentData) {\r\n parents.set(parent, parentData);\r\n }\r\n\r\n for (const el of els) {\r\n const parentData = parents.get(el);\r\n\r\n const newData = addClass(el, className, parentData, omitAppendPrivateClass);\r\n\r\n if (!newData) continue;\r\n\r\n parentSetter(el, newData as ParentData);\r\n }\r\n}\r\n\r\n/**\r\n * Add class to the node.\r\n *\r\n * @param el - The node.\r\n * @param className - The class name.\r\n * @param data - The node data.\r\n * @param omitAppendPrivateClass - Whether to omit append private class.\r\n *\r\n * @returns void\r\n */\r\nexport function addClass(\r\n el: Node | HTMLElement | Element,\r\n className: string | undefined,\r\n data: NodeData | ParentData | undefined,\r\n omitAppendPrivateClass = false\r\n) {\r\n if (!className) return;\r\n\r\n const classNames = splitClass(className);\r\n\r\n if (!classNames.length) return;\r\n\r\n if (!data) {\r\n el.classList.add(...classNames);\r\n return;\r\n }\r\n // Revert to original logic: Initialize privateClasses as empty for this call.\r\n const privateClasses = [];\r\n\r\n for (const currentClassName of classNames) {\r\n if (!el.classList.contains(currentClassName)) {\r\n el.classList.add(currentClassName);\r\n } else if (\r\n // Only add to privateClasses if the element already had the class\r\n // AND omitAppendPrivateClass is specifically false for THIS call.\r\n el.classList.contains(currentClassName) &&\r\n omitAppendPrivateClass === false\r\n ) {\r\n privateClasses.push(currentClassName);\r\n }\r\n }\r\n // Assign the newly computed privateClasses, overwriting any previous value.\r\n data.privateClasses = privateClasses;\r\n return data;\r\n}\r\n\r\n/**\r\n * Remove class from the nodes.\r\n *\r\n * @param els - The nodes.\r\n * @param className - The class name.\r\n *\r\n * @returns void\r\n */\r\nexport function removeClass(\r\n els: Array,\r\n className: string | undefined\r\n) {\r\n if (!className) return;\r\n\r\n const classNames = splitClass(className);\r\n\r\n if (!classNames.length) return;\r\n\r\n for (const node of els) {\r\n if (!isNode(node)) {\r\n node.classList.remove(...classNames);\r\n continue;\r\n }\r\n\r\n const nodeData = nodes.get(node) || parents.get(node);\r\n\r\n if (!nodeData) continue;\r\n\r\n for (const className of classNames) {\r\n if (!nodeData.privateClasses.includes(className)) {\r\n node.classList.remove(className);\r\n }\r\n }\r\n }\r\n}\r\n\r\ntype ScrollDirection = { axis: \"x\"; state: DragState } | { axis: \"y\" };\r\n\r\nfunction getScrollDirection(\r\n el: HTMLElement,\r\n e: PointerEvent | DragEvent,\r\n style: CSSStyleDeclaration,\r\n rect: DOMRect,\r\n opts: ScrollDirection\r\n): Record {\r\n const threshold = 0.075;\r\n\r\n const isX = opts.axis === \"x\";\r\n const isRoot = el === document.scrollingElement;\r\n const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\r\n const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\r\n const offsetProp = isX ? \"offsetWidth\" : \"offsetHeight\";\r\n const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\r\n const clientCoord = isX ? e.clientX : e.clientY;\r\n const rectStart = isX ? rect.left : rect.top;\r\n const overflow = isX ? style.overflowX : style.overflowY;\r\n\r\n if (isRoot) {\r\n const scrollPos = el[scrollProp];\r\n const clientSize = el[sizeProp];\r\n const canScrollBefore = scrollPos > 0;\r\n const canScrollAfter =\r\n scrollPos + clientSize <\r\n (isX\r\n ? (opts.state as SynthDragState).rootScrollWidth || 0\r\n : el[scrollSizeProp]);\r\n\r\n return isX\r\n ? {\r\n left: canScrollBefore && clientCoord < clientSize * threshold,\r\n right: canScrollAfter && clientCoord > clientSize * (1 - threshold),\r\n }\r\n : {\r\n up: canScrollBefore && clientCoord < clientSize * threshold,\r\n down: canScrollAfter && clientCoord > clientSize * (1 - threshold),\r\n };\r\n }\r\n\r\n if (\r\n (overflow === \"auto\" || overflow === \"scroll\") &&\r\n el !== document.body &&\r\n el !== document.documentElement\r\n ) {\r\n const scrollSize = el[scrollSizeProp];\r\n const offsetSize = el[offsetProp];\r\n const scrollPos = el[scrollProp];\r\n\r\n const canScrollBefore = scrollPos > 0;\r\n const canScrollAfter = scrollPos < scrollSize - offsetSize;\r\n\r\n return isX\r\n ? {\r\n left:\r\n canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\r\n right:\r\n canScrollAfter &&\r\n clientCoord > rectStart + offsetSize * (1 - threshold),\r\n }\r\n : {\r\n up:\r\n canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\r\n down:\r\n canScrollAfter &&\r\n clientCoord > rectStart + offsetSize * (1 - threshold),\r\n };\r\n }\r\n\r\n return isX ? { left: false, right: false } : { up: false, down: false };\r\n}\r\n\r\ntype Axis = \"x\" | \"y\";\r\n\r\nfunction scrollAxis(\r\n el: HTMLElement,\r\n _e: PointerEvent | DragEvent,\r\n state: DragState,\r\n options: {\r\n axis: Axis;\r\n direction: \"positive\" | \"negative\";\r\n }\r\n) {\r\n // Check if this is a stale call from a previous state\r\n if (!isDragState(state) || !state.draggedNode) {\r\n return; // State has been reset or is no longer in a drag state\r\n }\r\n\r\n state.preventEnter = true;\r\n\r\n const isX = options.axis === \"x\";\r\n const dirFactor = options.direction === \"positive\" ? 1 : -1;\r\n const speed = 20;\r\n\r\n const key = isX ? \"lastScrollDirectionX\" : \"lastScrollDirectionY\";\r\n const idKey = isX ? \"frameIdX\" : \"frameIdY\";\r\n\r\n // Cancel any existing animation first, regardless of direction\r\n if (state[idKey] !== undefined) {\r\n cancelAnimationFrame(state[idKey]!);\r\n state[idKey] = undefined;\r\n }\r\n\r\n state[key] = options.direction;\r\n\r\n const scrollLoop = () => {\r\n // Check again if state is still valid\r\n if (!isDragState(state) || !state.draggedNode) {\r\n if (state[idKey] !== undefined) {\r\n cancelAnimationFrame(state[idKey]!);\r\n state[idKey] = undefined;\r\n }\r\n return;\r\n }\r\n\r\n const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\r\n const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\r\n const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\r\n\r\n const scrollPos = el[scrollProp];\r\n const clientSize = el[sizeProp];\r\n const scrollSize = el[scrollSizeProp];\r\n\r\n const canScroll =\r\n dirFactor > 0 ? scrollPos + clientSize < scrollSize : scrollPos > 0;\r\n\r\n if (!canScroll) {\r\n state[idKey] = undefined;\r\n state[key] = undefined;\r\n return;\r\n }\r\n\r\n el[scrollProp] += speed * dirFactor;\r\n\r\n if (isSynthDragState(state)) {\r\n moveNode(state);\r\n }\r\n\r\n state[idKey] = requestAnimationFrame(scrollLoop);\r\n };\r\n\r\n state[idKey] = requestAnimationFrame(scrollLoop);\r\n}\r\n\r\nfunction isPointerInside(el: HTMLElement, x: number, y: number): boolean {\r\n const rect = el.getBoundingClientRect();\r\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\r\n}\r\n\r\nfunction handleSynthScroll(\r\n coordinates: { x: number; y: number },\r\n e: PointerEvent | DragEvent,\r\n state: DragState\r\n) {\r\n // First check if this is a stale call from a previous state\r\n if (!isDragState(state) || !state.draggedNode) {\r\n return; // State has been reset or is no longer in a drag state\r\n }\r\n\r\n cancelSynthScroll(state);\r\n\r\n const { x, y } = coordinates;\r\n\r\n let scrolled = false;\r\n\r\n const attemptScroll = (\r\n axis: \"x\" | \"y\",\r\n direction: \"positive\" | \"negative\",\r\n container: HTMLElement\r\n ) => {\r\n scrollAxis(container, e, state, { axis, direction });\r\n scrolled = true;\r\n };\r\n\r\n const checkAndScroll = (el: HTMLElement) => {\r\n const style = window.getComputedStyle(el);\r\n const rect = el.getBoundingClientRect();\r\n\r\n const xResult = getScrollDirection(el, e, style, rect, {\r\n axis: \"x\",\r\n state,\r\n });\r\n\r\n const yResult = getScrollDirection(el, e, style, rect, { axis: \"y\" });\r\n\r\n if (xResult.left || xResult.right) {\r\n state.lastScrollContainerX = el;\r\n attemptScroll(\"x\", xResult.right ? \"positive\" : \"negative\", el);\r\n }\r\n\r\n if (yResult.up || yResult.down) {\r\n state.lastScrollContainerY = el;\r\n attemptScroll(\"y\", yResult.down ? \"positive\" : \"negative\", el);\r\n }\r\n };\r\n\r\n if (\r\n state.lastScrollContainerX &&\r\n isPointerInside(state.lastScrollContainerX, x, y)\r\n ) {\r\n checkAndScroll(state.lastScrollContainerX);\r\n }\r\n\r\n if (\r\n !scrolled &&\r\n state.lastScrollContainerY &&\r\n isPointerInside(state.lastScrollContainerY, x, y)\r\n ) {\r\n checkAndScroll(state.lastScrollContainerY);\r\n }\r\n\r\n if (!scrolled) {\r\n let el = document.elementFromPoint(x, y);\r\n while (\r\n el &&\r\n !(scrolled && state.lastScrollContainerX && state.lastScrollContainerY)\r\n ) {\r\n if (el instanceof HTMLElement) {\r\n checkAndScroll(el);\r\n }\r\n el = el.parentElement;\r\n }\r\n }\r\n\r\n if (!scrolled) {\r\n const root = document.scrollingElement;\r\n if (root instanceof HTMLElement) {\r\n checkAndScroll(root);\r\n }\r\n }\r\n\r\n if (!scrolled) cancelSynthScroll(state);\r\n}\r\n\r\nexport function getElFromPoint(coordinates: {\r\n x: number;\r\n y: number;\r\n}): NodeFromPoint | ParentFromPoint | undefined {\r\n let target = document.elementFromPoint(coordinates.x, coordinates.y);\r\n\r\n if (!isNode(target)) return;\r\n\r\n let isParent;\r\n\r\n let invalidEl = true;\r\n\r\n while (target && invalidEl) {\r\n if (nodes.has(target as Node) || parents.has(target as HTMLElement)) {\r\n invalidEl = false;\r\n\r\n isParent = parents.has(target as HTMLElement);\r\n\r\n break;\r\n }\r\n\r\n target = target.parentNode as Node;\r\n }\r\n\r\n if (!isParent) {\r\n const targetNodeData = nodes.get(target as Node);\r\n\r\n if (!targetNodeData) return;\r\n\r\n const targetParentData = parents.get(target.parentNode as Node);\r\n\r\n if (!targetParentData) return;\r\n\r\n return {\r\n node: {\r\n el: target as Node,\r\n data: targetNodeData,\r\n },\r\n parent: {\r\n el: target.parentNode as Node,\r\n data: targetParentData as ParentData,\r\n },\r\n };\r\n } else {\r\n const parentData = parents.get(target as HTMLElement);\r\n\r\n if (!parentData) return;\r\n\r\n return {\r\n parent: {\r\n el: target as HTMLElement,\r\n data: parentData as ParentData,\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Checks to see that a given element and its parent node is instance of\r\n * HTMLElement.\r\n *\r\n * @param {unknown} el - The element to check.\r\n *\r\n * @returns {boolean} - Whether or not provided element is of type Node.\r\n */\r\nexport function isNode(el: unknown): el is Node {\r\n return el instanceof HTMLElement && el.parentNode instanceof HTMLElement;\r\n}\r\n\r\n/**\r\n * Takes a given el and event handlers, assigns them, and returns the used abort\r\n * controller.\r\n *\r\n * @param el - The element to add the event listeners to.\r\n * @param events - The events to add to the element.\r\n * @returns - The abort controller used for the event listeners.\r\n */\r\nexport function addEvents(\r\n el: Document | ShadowRoot | Node | HTMLElement | Window,\r\n events: EventHandlers | any\r\n): AbortController {\r\n const abortController = new AbortController();\r\n\r\n for (const eventName in events) {\r\n const handler = events[eventName];\r\n\r\n el.addEventListener(eventName, handler, {\r\n signal: abortController.signal,\r\n passive: false,\r\n capture: eventName === \"focus\" || eventName === \"blur\",\r\n });\r\n }\r\n\r\n return abortController;\r\n}\r\n","/**\r\n * Function to prevent default behavior of an event.\r\n *\r\n * @param {Event} e - The event to prevent default behavior of.\r\n */\r\nexport function pd(e: Event) {\r\n e.preventDefault();\r\n}\r\n\r\n/**\r\n * Function to stop propagation of an event.\r\n *\r\n * @param {Event} e - The event to stop propagation of.\r\n */\r\nexport function sp(e: Event) {\r\n e.stopPropagation();\r\n}\r\n\r\n/**\r\n * Function to get the bounding client rect of an element.\r\n *\r\n * @param {HTMLElement} el - The element to get the bounding client rect of.\r\n *\r\n * @returns {ClientRect} The bounding client rect of the element.\r\n */\r\nexport function rect(el: HTMLElement): ClientRect {\r\n return el.getBoundingClientRect();\r\n}\r\n\r\n/**\r\n * Function to create an emitter.\r\n *\r\n * @returns {[Function, Function]} A tuple containing emit and on functions\r\n */\r\nexport function createEmitter() {\r\n const callbacks = new Map void>>();\r\n\r\n const emit = function (eventName: string, data: T) {\r\n if (!callbacks.get(eventName)) return;\r\n\r\n callbacks.get(eventName)!.forEach((cb) => {\r\n cb(data);\r\n });\r\n };\r\n\r\n const on = function (eventName: string, callback: (data: T) => void) {\r\n const cbs = callbacks.get(eventName) ?? [];\r\n\r\n cbs.push(callback);\r\n\r\n callbacks.set(eventName, cbs);\r\n };\r\n\r\n return [emit, on] as const;\r\n}\r\n\r\n/**\r\n * The emit and on functions for drag and drop.\r\n *\r\n * @type {[Function, Function]}\r\n */\r\nexport const [emit, on] = createEmitter();\r\n\r\n/**\r\n * A regular expression to test for a valid date string.\r\n *\r\n * @param x - A RegExp to compare.\r\n * @param y - A RegExp to compare.\r\n * @public\r\n */\r\nexport function eqRegExp(x: RegExp, y: RegExp): boolean {\r\n return (\r\n x.source === y.source &&\r\n x.flags.split(\"\").sort().join(\"\") === y.flags.split(\"\").sort().join(\"\")\r\n );\r\n}\r\n\r\n/**\r\n * Compare two values for equality, optionally at depth.\r\n *\r\n * @param valA - First value.\r\n * @param valB - Second value.\r\n * @param deep - If it will compare deeply if it's an object.\r\n * @param explicit - An array of keys to explicity check.\r\n *\r\n * @returns `boolean`\r\n *\r\n * @public\r\n */\r\nexport function eq(\r\n valA: unknown,\r\n valB: unknown,\r\n deep = true,\r\n explicit: string[] = [\"__key\"]\r\n): boolean {\r\n if (valA === valB) return true;\r\n\r\n if (\r\n typeof valB === \"object\" &&\r\n typeof valA === \"object\" &&\r\n valA !== null &&\r\n valB !== null\r\n ) {\r\n if (valA instanceof Map) return false;\r\n if (valA instanceof Set) return false;\r\n if (valA instanceof Date && valB instanceof Date)\r\n return valA.getTime() === valB.getTime();\r\n if (valA instanceof RegExp && valB instanceof RegExp)\r\n return eqRegExp(valA, valB);\r\n if (valA === null || valB === null) return false;\r\n\r\n const objA = valA as Record;\r\n const objB = valB as Record;\r\n\r\n if (Object.keys(objA).length !== Object.keys(objB).length) return false;\r\n\r\n for (const k of explicit) {\r\n if ((k in objA || k in objB) && objA[k] !== objB[k]) return false;\r\n }\r\n\r\n for (const key in objA) {\r\n if (!(key in objB)) return false;\r\n if (objA[key] !== objB[key] && !deep) return false;\r\n if (deep && !eq(objA[key], objB[key], deep, explicit)) return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Split a class name into an array of class names.\r\n *\r\n * @param className - The class name to split.\r\n *\r\n * @returns An array of class names.\r\n */\r\nexport function splitClass(className: string): Array {\r\n return className.split(\" \").filter((x) => x);\r\n}\r\n\r\nexport function getRealCoords(el: HTMLElement): {\r\n top: number;\r\n bottom: number;\r\n left: number;\r\n right: number;\r\n height: number;\r\n width: number;\r\n} {\r\n const { top, bottom, left, right, height, width } =\r\n el.getBoundingClientRect();\r\n\r\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\r\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\r\n\r\n return {\r\n top: top + scrollTop,\r\n bottom: bottom + scrollTop,\r\n left: left + scrollLeft,\r\n right: right + scrollLeft,\r\n height,\r\n width,\r\n };\r\n}\r\n\r\nexport function eventCoordinates(data: DragEvent | PointerEvent) {\r\n return { x: data.clientX, y: data.clientY };\r\n}\r\n","import type { SetupNodeData, Node } from \"../../types\";\r\nimport type { AnimationsConfig } from \"./types\";\r\nimport { state, parents, isDragState } from \"../../index\";\r\n\r\nexport function animations(animationsConfig: Partial = {}) {\r\n const slideUp = [\r\n {\r\n transform: `translateY(${animationsConfig.yScale || 50}%)`,\r\n },\r\n {\r\n transform: `translateY(${animationsConfig.yScale || 0}%)`,\r\n },\r\n ];\r\n\r\n const slideDown = [\r\n {\r\n transform: `translateY(-${animationsConfig.yScale || 50}%)`,\r\n },\r\n {\r\n transform: `translateY(${animationsConfig.yScale || 0}%)`,\r\n },\r\n ];\r\n\r\n const slideLeft = [\r\n {\r\n transform: `translateX(${animationsConfig.xScale || 50}%)`,\r\n },\r\n {\r\n transform: `translateX(${animationsConfig.xScale || 0}%)`,\r\n },\r\n ];\r\n\r\n const slideRight = [\r\n {\r\n transform: `translateX(-${animationsConfig.xScale || 50}%)`,\r\n },\r\n {\r\n transform: `translateX(${animationsConfig.xScale || 0}%)`,\r\n },\r\n ];\r\n return (parent: HTMLElement) => {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n return {\r\n setup() {\r\n if (document.head.querySelector(\"[data-drag-and-drop]\")) return;\r\n },\r\n\r\n setupNodeRemap(data: SetupNodeData) {\r\n if (!isDragState(state)) return;\r\n\r\n const duration = animationsConfig.duration || 150;\r\n\r\n if (data.node.data.value === state.draggedNode.data.value) {\r\n switch (state.incomingDirection) {\r\n case \"below\":\r\n animate(data.node.el, slideUp, duration);\r\n\r\n break;\r\n case \"above\":\r\n animate(data.node.el, slideDown, duration);\r\n\r\n break;\r\n case \"left\":\r\n animate(data.node.el, slideRight, duration);\r\n\r\n break;\r\n case \"right\":\r\n animate(data.node.el, slideLeft, duration);\r\n\r\n break;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (\r\n !state.affectedNodes\r\n .map((x) => x.data.value)\r\n .includes(data.node.data.value)\r\n )\r\n return;\r\n\r\n const nodeRect = data.node.el.getBoundingClientRect();\r\n\r\n const nodeIndex = state.affectedNodes.findIndex(\r\n (x) => x.data.value === data.node.data.value\r\n );\r\n\r\n const draggedNodeIndex = state.draggedNode.data.index;\r\n\r\n const ascendingDirection = draggedNodeIndex >= state.targetIndex;\r\n\r\n let adjacentNode;\r\n\r\n if (ascendingDirection) {\r\n adjacentNode = state.affectedNodes[nodeIndex + 1]\r\n ? state.affectedNodes[nodeIndex + 1]\r\n : state.affectedNodes[nodeIndex - 1];\r\n } else {\r\n adjacentNode = state.affectedNodes[nodeIndex - 1]\r\n ? state.affectedNodes[nodeIndex - 1]\r\n : state.affectedNodes[nodeIndex + 1];\r\n }\r\n\r\n if (adjacentNode) {\r\n const xDiff = Math.abs(\r\n nodeRect.x - adjacentNode.el.getBoundingClientRect().x\r\n );\r\n\r\n const yDiff = Math.abs(\r\n nodeRect.y - adjacentNode.el.getBoundingClientRect().y\r\n );\r\n\r\n if (xDiff > yDiff && ascendingDirection) {\r\n animate(data.node.el, slideRight, duration);\r\n } else if (xDiff > yDiff && !ascendingDirection) {\r\n animate(data.node.el, slideLeft, duration);\r\n }\r\n } else {\r\n switch (state.incomingDirection) {\r\n case \"below\":\r\n animate(data.node.el, slideDown, duration);\r\n\r\n break;\r\n case \"above\":\r\n animate(data.node.el, slideUp, duration);\r\n\r\n break;\r\n case \"left\":\r\n animate(data.node.el, slideLeft, duration);\r\n\r\n break;\r\n case \"right\":\r\n animate(data.node.el, slideRight, duration);\r\n\r\n break;\r\n }\r\n }\r\n },\r\n };\r\n };\r\n}\r\n\r\nfunction animate(\r\n node: Node,\r\n animation: Keyframe[] | PropertyIndexedKeyframes,\r\n duration: number\r\n) {\r\n if (!state) return;\r\n\r\n state.preventEnter = true;\r\n\r\n node.animate(animation, {\r\n duration: duration,\r\n easing: \"ease-in-out\",\r\n });\r\n\r\n setTimeout(() => {\r\n if (!state) return;\r\n\r\n state.preventEnter = false;\r\n }, duration);\r\n}\r\n","import type { InsertConfig } from \"../../types\";\r\nimport type {\r\n DragState,\r\n NodeDragEventData,\r\n NodeRecord,\r\n ParentEventData,\r\n PointeroverParentEvent,\r\n ParentRecord,\r\n SynthDragState,\r\n InsertEvent,\r\n BaseDragState,\r\n InsertState,\r\n Coordinates,\r\n Node,\r\n} from \"../../types\";\r\n\r\nimport {\r\n parents,\r\n parentValues,\r\n setParentValues,\r\n state,\r\n addParentClass,\r\n isDragState,\r\n isSynthDragState,\r\n removeClass,\r\n addEvents,\r\n remapNodes,\r\n nodes,\r\n} from \"../../index\";\r\n\r\nimport { eq, pd, eventCoordinates } from \"../../utils\";\r\n\r\nexport const insertState: InsertState = {\r\n draggedOverNodes: [],\r\n draggedOverParent: null,\r\n targetIndex: 0,\r\n ascending: false,\r\n insertPoint: null,\r\n dragging: false,\r\n};\r\n\r\nlet documentController: AbortController | undefined;\r\n\r\n// WIP: This is a work in progress and not yet fully functional\r\nexport function insert(insertConfig: InsertConfig) {\r\n return (parent: HTMLElement) => {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n const insertParentConfig = {\r\n ...parentData.config,\r\n insertConfig,\r\n };\r\n\r\n return {\r\n teardown() {\r\n if (parentData.abortControllers.root) {\r\n parentData.abortControllers.root.abort();\r\n }\r\n },\r\n setup() {\r\n insertParentConfig.handleNodeDragover =\r\n insertConfig.handleNodeDragover || handleNodeDragover;\r\n\r\n insertParentConfig.handleParentPointerover =\r\n insertConfig.handleParentPointerover || handleParentPointerover;\r\n\r\n insertParentConfig.handleNodePointerover =\r\n insertConfig.handleNodePointerover || handleParentPointerover;\r\n\r\n insertParentConfig.handleParentDragover =\r\n insertConfig.handleParentDragover || handleParentDragover;\r\n\r\n const originalHandleend = insertParentConfig.handleEnd;\r\n\r\n insertParentConfig.handleEnd = (\r\n state: DragState | SynthDragState\r\n ) => {\r\n handleEnd(state);\r\n\r\n originalHandleend(state);\r\n };\r\n\r\n parentData.on(\"dragStarted\", () => {\r\n documentController = addEvents(document, {\r\n dragover: checkPosition,\r\n pointermove: checkPosition,\r\n });\r\n });\r\n\r\n parentData.on(\"dragEnded\", () => {\r\n documentController?.abort();\r\n });\r\n\r\n parentData.config = insertParentConfig;\r\n\r\n state.on(\"dragStarted\", () => {\r\n defineRanges(parent);\r\n });\r\n\r\n state.on(\"scrollStarted\", () => {\r\n if (insertState.insertPoint)\r\n insertState.insertPoint.el.style.display = \"none\";\r\n });\r\n\r\n state.on(\"scrollEnded\", () => {\r\n defineRanges(parent);\r\n });\r\n\r\n const firstScrollableParent = findFirstOverflowingParent(parent);\r\n\r\n if (firstScrollableParent) {\r\n firstScrollableParent.addEventListener(\r\n \"scroll\",\r\n defineRanges.bind(null, parent)\r\n );\r\n }\r\n\r\n window.addEventListener(\"resize\", defineRanges.bind(null, parent));\r\n },\r\n };\r\n };\r\n}\r\n\r\nfunction findFirstOverflowingParent(element: HTMLElement): HTMLElement | null {\r\n let parent = element.parentElement;\r\n\r\n while (parent) {\r\n const { overflow, overflowY, overflowX } = getComputedStyle(parent);\r\n\r\n // Check if the overflow property is set to scroll, auto, or hidden (anything other than visible)\r\n const isOverflowSet =\r\n overflow !== \"visible\" ||\r\n overflowY !== \"visible\" ||\r\n overflowX !== \"visible\";\r\n\r\n // Check if there is actual overflow (scrolling)\r\n const isOverflowing =\r\n parent.scrollHeight > parent.clientHeight ||\r\n parent.scrollWidth > parent.clientWidth;\r\n const hasScrollPosition = parent.scrollTop > 0 || parent.scrollLeft > 0;\r\n\r\n if (isOverflowSet && (isOverflowing || hasScrollPosition)) {\r\n return parent;\r\n }\r\n\r\n parent = parent.parentElement;\r\n }\r\n\r\n return null; // No overflowing parent found\r\n}\r\n\r\nfunction checkPosition(e: DragEvent | PointerEvent) {\r\n if (!isDragState(state)) return;\r\n\r\n const el = document.elementFromPoint(e.clientX, e.clientY);\r\n\r\n // 1. If the element is not an HTMLElement or is the insert point itself, do nothing.\r\n if (!(el instanceof HTMLElement) || el === insertState.insertPoint?.el) {\r\n return;\r\n }\r\n\r\n // 2. Traverse up the DOM from the element under the cursor\r\n // to see if any ancestor is a registered parent.\r\n let isWithinAParent = false;\r\n let current: HTMLElement | null = el;\r\n while (current) {\r\n if (nodes.has(current as Node) || parents.has(current)) {\r\n isWithinAParent = true;\r\n break; // Found a registered parent ancestor\r\n }\r\n if (current === document.body) break; // Stop if we reach the body\r\n current = current.parentElement;\r\n }\r\n\r\n // 3. If the cursor is NOT within any registered parent...\r\n if (!isWithinAParent) {\r\n // Hide the insert point if it exists\r\n if (insertState.insertPoint) {\r\n insertState.insertPoint.el.style.display = \"none\";\r\n }\r\n\r\n // Remove drop zone class if a parent was previously being dragged over\r\n if (insertState.draggedOverParent) {\r\n removeClass(\r\n [insertState.draggedOverParent.el],\r\n insertState.draggedOverParent.data.config.dropZoneClass\r\n );\r\n }\r\n\r\n // Reset insert state related to dragged over elements\r\n insertState.draggedOverNodes = [];\r\n insertState.draggedOverParent = null;\r\n\r\n // Reset current parent in the main state back to the initial one\r\n state.currentParent = state.initialParent;\r\n }\r\n // 4. If the cursor IS within a registered parent, do nothing in this function.\r\n // Other event handlers will manage the insertion point positioning.\r\n}\r\n\r\ninterface Range {\r\n x: [number, number];\r\n y: [number, number];\r\n vertical: boolean;\r\n}\r\n\r\nfunction createVerticalRange(\r\n nodeCoords: Coordinates,\r\n otherCoords: Coordinates | undefined,\r\n isAscending: boolean\r\n): Range {\r\n const center = nodeCoords.top + nodeCoords.height / 2;\r\n\r\n if (!otherCoords) {\r\n const offset = nodeCoords.height / 2 + 10;\r\n return {\r\n y: isAscending ? [center, center + offset] : [center - offset, center],\r\n x: [nodeCoords.left, nodeCoords.right],\r\n vertical: true,\r\n };\r\n }\r\n\r\n const otherEdge = isAscending ? otherCoords.top : otherCoords.bottom;\r\n const nodeEdge = isAscending ? nodeCoords.bottom : nodeCoords.top;\r\n\r\n let midpoint: number;\r\n let range: [number, number];\r\n\r\n if (isAscending) {\r\n // Midpoint between current node's bottom and next node's top\r\n midpoint = nodeEdge + (otherEdge - nodeEdge) / 2; // nodeCoords.bottom + (otherCoords.top - nodeCoords.bottom) / 2\r\n range = [center, midpoint]; // Range from node center down to midpoint\r\n } else {\r\n // Midpoint between previous node's bottom and current node's top\r\n midpoint = otherEdge + (nodeEdge - otherEdge) / 2; // otherCoords.bottom + (nodeCoords.top - otherCoords.bottom) / 2\r\n range = [midpoint, center]; // Range from midpoint down to node center\r\n }\r\n\r\n return {\r\n y: range,\r\n x: [nodeCoords.left, nodeCoords.right],\r\n vertical: true,\r\n };\r\n}\r\n\r\nfunction createHorizontalRange(\r\n nodeCoords: Coordinates,\r\n otherCoords: Coordinates | undefined,\r\n isAscending: boolean,\r\n lastInRow = false\r\n): Range {\r\n const center = nodeCoords.left + nodeCoords.width / 2;\r\n\r\n if (!otherCoords) {\r\n if (isAscending) {\r\n return {\r\n x: [center, center + nodeCoords.width],\r\n y: [nodeCoords.top, nodeCoords.bottom],\r\n vertical: false,\r\n };\r\n } else {\r\n return {\r\n x: [nodeCoords.left - 10, center],\r\n y: [nodeCoords.top, nodeCoords.bottom],\r\n vertical: false,\r\n };\r\n }\r\n }\r\n\r\n if (isAscending && lastInRow) {\r\n return {\r\n x: [center, nodeCoords.right + 10],\r\n y: [nodeCoords.top, nodeCoords.bottom],\r\n vertical: false,\r\n };\r\n }\r\n\r\n if (isAscending) {\r\n const nextNodeCenter = otherCoords.left + otherCoords.width / 2;\r\n return {\r\n x: [center, center + Math.abs(center - nextNodeCenter) / 2],\r\n y: [nodeCoords.top, nodeCoords.bottom],\r\n vertical: false,\r\n };\r\n } else {\r\n return {\r\n x: [\r\n otherCoords.right + Math.abs(otherCoords.right - nodeCoords.left) / 2,\r\n center,\r\n ],\r\n y: [nodeCoords.top, nodeCoords.bottom],\r\n vertical: false,\r\n };\r\n }\r\n}\r\n\r\nfunction getRealCoords(el: HTMLElement): Coordinates {\r\n const { top, bottom, left, right, height, width } =\r\n el.getBoundingClientRect();\r\n\r\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\r\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\r\n\r\n return {\r\n top: top + scrollTop,\r\n bottom: bottom + scrollTop,\r\n left: left + scrollLeft,\r\n right: right + scrollLeft,\r\n height,\r\n width,\r\n };\r\n}\r\n\r\nfunction defineRanges(parent: HTMLElement) {\r\n if (!isDragState(state) && !isSynthDragState(state)) return;\r\n\r\n const parentData = parents.get(parent);\r\n if (!parentData) return;\r\n\r\n const enabledNodes = parentData.enabledNodes;\r\n\r\n enabledNodes.forEach((node, index) => {\r\n node.data.range = {};\r\n\r\n const prevNode = enabledNodes[index - 1];\r\n const nextNode = enabledNodes[index + 1];\r\n const nodeCoords = getRealCoords(node.el);\r\n const prevNodeCoords = prevNode ? getRealCoords(prevNode.el) : undefined;\r\n const nextNodeCoords = nextNode ? getRealCoords(nextNode.el) : undefined;\r\n\r\n const aboveOrBelowPrevious =\r\n prevNodeCoords &&\r\n (nodeCoords.top > prevNodeCoords.bottom ||\r\n nodeCoords.bottom < prevNodeCoords.top);\r\n\r\n const aboveOrBelowAfter =\r\n nextNodeCoords &&\r\n (nodeCoords.top > nextNodeCoords.bottom ||\r\n nodeCoords.bottom < nextNodeCoords.top);\r\n\r\n const fullishWidth =\r\n parent.getBoundingClientRect().width * 0.8 < nodeCoords.width;\r\n\r\n if (fullishWidth) {\r\n node.data.range.ascending = createVerticalRange(\r\n nodeCoords,\r\n nextNodeCoords,\r\n true\r\n );\r\n node.data.range.descending = createVerticalRange(\r\n nodeCoords,\r\n prevNodeCoords,\r\n false\r\n );\r\n } else if (aboveOrBelowAfter && !aboveOrBelowPrevious) {\r\n node.data.range.ascending = createHorizontalRange(\r\n nodeCoords,\r\n nextNodeCoords,\r\n true,\r\n true\r\n );\r\n node.data.range.descending = createHorizontalRange(\r\n nodeCoords,\r\n prevNodeCoords,\r\n false\r\n );\r\n } else if (!aboveOrBelowPrevious && !aboveOrBelowAfter) {\r\n node.data.range.ascending = createHorizontalRange(\r\n nodeCoords,\r\n nextNodeCoords,\r\n true\r\n );\r\n node.data.range.descending = createHorizontalRange(\r\n nodeCoords,\r\n prevNodeCoords,\r\n false\r\n );\r\n } else if (aboveOrBelowPrevious && !nextNodeCoords) {\r\n node.data.range.ascending = createHorizontalRange(\r\n nodeCoords,\r\n undefined,\r\n true\r\n );\r\n } else if (aboveOrBelowPrevious && !aboveOrBelowAfter) {\r\n node.data.range.ascending = createHorizontalRange(\r\n nodeCoords,\r\n nextNodeCoords,\r\n true\r\n );\r\n node.data.range.descending = createHorizontalRange(\r\n nodeCoords,\r\n undefined,\r\n false\r\n );\r\n }\r\n });\r\n}\r\n\r\nexport function handleNodeDragover(data: NodeDragEventData) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (!config.nativeDrag) return;\r\n\r\n data.e.preventDefault();\r\n}\r\n\r\nfunction processParentDragEvent(\r\n e: DragEvent | PointerEvent,\r\n targetData: ParentEventData[\"targetData\"],\r\n state: DragState,\r\n nativeDrag = false\r\n) {\r\n pd(e);\r\n\r\n if (nativeDrag && e instanceof PointerEvent) return;\r\n\r\n const { x, y } = eventCoordinates(e);\r\n\r\n // Calculate global coordinates\r\n const clientX = x;\r\n const clientY = y;\r\n\r\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\r\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\r\n\r\n state.coordinates.x = clientX + scrollLeft;\r\n state.coordinates.y = clientY + scrollTop;\r\n\r\n const nestedParent = targetData.parent.data.nestedParent;\r\n\r\n let realTargetParent = targetData.parent;\r\n\r\n if (nestedParent) {\r\n const rect = nestedParent.el.getBoundingClientRect();\r\n\r\n if (state.coordinates.y > rect.top && state.coordinates.y < rect.bottom)\r\n realTargetParent = nestedParent;\r\n }\r\n\r\n if (realTargetParent.el === state.currentParent?.el) {\r\n moveBetween(realTargetParent, state);\r\n } else {\r\n moveOutside(realTargetParent, state);\r\n }\r\n\r\n state.currentParent = realTargetParent;\r\n}\r\n\r\nexport function handleParentDragover(\r\n data: ParentEventData,\r\n state: DragState\r\n) {\r\n processParentDragEvent(data.e as DragEvent, data.targetData, state, true);\r\n}\r\n\r\nexport function handleParentPointerover(data: PointeroverParentEvent) {\r\n const { detail } = data;\r\n\r\n const { state, targetData } = detail;\r\n\r\n if (state.scrolling) return;\r\n\r\n processParentDragEvent(detail.e, targetData, state);\r\n}\r\n\r\nexport function moveBetween(data: ParentRecord, state: DragState) {\r\n if (data.data.config.sortable === false) return;\r\n\r\n if (\r\n data.el === insertState.draggedOverParent?.el &&\r\n insertState.draggedOverParent.data.getValues(data.el).length === 0\r\n ) {\r\n return;\r\n } else if (insertState.draggedOverParent?.el) {\r\n removeClass(\r\n [insertState.draggedOverParent.el],\r\n insertState.draggedOverParent.data.config.dropZoneClass\r\n );\r\n insertState.draggedOverParent = null;\r\n }\r\n\r\n const foundRange = findClosest(data.data.enabledNodes, state);\r\n\r\n if (!foundRange) return;\r\n\r\n const key = foundRange[1] as \"ascending\" | \"descending\";\r\n\r\n if (foundRange) {\r\n const position = foundRange[0].data.range\r\n ? foundRange[0].data.range[key]\r\n : undefined;\r\n\r\n if (position)\r\n positionInsertPoint(\r\n data,\r\n position,\r\n foundRange[1] === \"ascending\",\r\n foundRange[0],\r\n insertState as InsertState\r\n );\r\n }\r\n}\r\n\r\nfunction moveOutside(data: ParentRecord, state: DragState) {\r\n if (data.el === state.currentParent.el) return false;\r\n\r\n const targetConfig = data.data.config;\r\n\r\n if (state.draggedNode.el.contains(data.el)) return false;\r\n\r\n if (targetConfig.dropZone === false) return;\r\n\r\n const initialParentConfig = state.initialParent.data.config;\r\n\r\n if (targetConfig.accepts) {\r\n return targetConfig.accepts(\r\n data,\r\n state.initialParent,\r\n state.currentParent,\r\n state\r\n );\r\n } else if (\r\n !targetConfig.group ||\r\n targetConfig.group !== initialParentConfig.group\r\n ) {\r\n return false;\r\n }\r\n\r\n const values = data.data.getValues(data.el);\r\n\r\n if (!values.length) {\r\n addParentClass([data.el], targetConfig.dropZoneClass);\r\n\r\n insertState.draggedOverParent = data as ParentRecord;\r\n\r\n const insertPoint = insertState.insertPoint;\r\n\r\n if (insertPoint) insertPoint.el.style.display = \"none\";\r\n } else {\r\n removeClass([state.currentParent.el], targetConfig.dropZoneClass);\r\n\r\n const enabledNodes = data.data.enabledNodes;\r\n\r\n const foundRange = findClosest(enabledNodes, state);\r\n\r\n if (!foundRange) return;\r\n\r\n const key = foundRange[1] as \"ascending\" | \"descending\";\r\n\r\n if (foundRange) {\r\n const position = foundRange[0].data.range\r\n ? foundRange[0].data.range[key]\r\n : undefined;\r\n\r\n if (position)\r\n positionInsertPoint(\r\n data,\r\n position,\r\n foundRange[1] === \"ascending\",\r\n foundRange[0],\r\n insertState as InsertState\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction findClosest(enabledNodes: NodeRecord[], state: DragState) {\r\n let foundRange: [NodeRecord, string] | null = null;\r\n\r\n for (let x = 0; x < enabledNodes.length; x++) {\r\n if (!state || !enabledNodes[x].data.range) continue;\r\n\r\n if (enabledNodes[x].data.range!.ascending) {\r\n if (\r\n state.coordinates.y > enabledNodes[x].data.range!.ascending!.y[0] &&\r\n state.coordinates.y < enabledNodes[x].data.range!.ascending!.y[1] &&\r\n state.coordinates.x > enabledNodes[x].data.range!.ascending!.x[0] &&\r\n state.coordinates.x < enabledNodes[x].data.range!.ascending!.x[1]\r\n ) {\r\n foundRange = [enabledNodes[x], \"ascending\"];\r\n\r\n return foundRange;\r\n }\r\n }\r\n\r\n if (enabledNodes[x].data.range!.descending) {\r\n if (\r\n state.coordinates.y > enabledNodes[x].data.range!.descending!.y[0] &&\r\n state.coordinates.y < enabledNodes[x].data.range!.descending!.y[1] &&\r\n state.coordinates.x > enabledNodes[x].data.range!.descending!.x[0] &&\r\n state.coordinates.x < enabledNodes[x].data.range!.descending!.x[1]\r\n ) {\r\n foundRange = [enabledNodes[x], \"descending\"];\r\n\r\n return foundRange;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createInsertPoint(\r\n parent: ParentRecord,\r\n insertState: InsertState\r\n) {\r\n const insertPoint = parent.data.config.insertConfig?.insertPoint({\r\n el: parent.el,\r\n data: parent.data,\r\n });\r\n\r\n if (!insertPoint)\r\n throw new Error(\"Insert point not found\", { cause: parent });\r\n\r\n insertState.insertPoint = {\r\n parent,\r\n el: insertPoint,\r\n };\r\n\r\n document.body.appendChild(insertPoint);\r\n\r\n Object.assign(insertPoint.style, {\r\n position: \"absolute\",\r\n display: \"none\",\r\n });\r\n}\r\n\r\nfunction removeInsertPoint(insertState: InsertState) {\r\n if (insertState.insertPoint?.el) insertState.insertPoint.el.remove();\r\n\r\n insertState.insertPoint = null;\r\n}\r\n\r\nfunction positionInsertPoint(\r\n parent: ParentRecord,\r\n position: { x: number[]; y: number[]; vertical: boolean },\r\n ascending: boolean,\r\n node: NodeRecord,\r\n insertState: InsertState\r\n) {\r\n if (insertState.insertPoint?.el !== parent.el) {\r\n removeInsertPoint(insertState);\r\n\r\n createInsertPoint(parent, insertState);\r\n }\r\n\r\n insertState.draggedOverNodes = [node];\r\n\r\n if (!insertState.insertPoint) return;\r\n\r\n insertState.insertPoint.el.style.display = \"block\";\r\n\r\n if (position.vertical) {\r\n const insertPointHeight =\r\n insertState.insertPoint.el.getBoundingClientRect().height;\r\n const targetY = position.y[ascending ? 1 : 0];\r\n const topPosition = targetY - insertPointHeight / 2;\r\n\r\n Object.assign(insertState.insertPoint.el.style, {\r\n top: `${topPosition}px`,\r\n left: `${position.x[0]}px`,\r\n right: `${position.x[1]}px`,\r\n width: `${position.x[1] - position.x[0]}px`,\r\n });\r\n } else {\r\n const leftPosition =\r\n position.x[ascending ? 1 : 0] -\r\n insertState.insertPoint.el.getBoundingClientRect().width / 2;\r\n insertState.insertPoint.el.style.left = `${leftPosition}px`;\r\n\r\n Object.assign(insertState.insertPoint.el.style, {\r\n top: `${position.y[0]}px`,\r\n bottom: `${position.y[1]}px`,\r\n height: `${position.y[1] - position.y[0]}px`,\r\n });\r\n }\r\n\r\n insertState.targetIndex = node.data.index;\r\n\r\n insertState.ascending = ascending;\r\n}\r\n\r\nexport function handleParentDrop(_data: NodeDragEventData) {}\r\n\r\n/**\r\n * Performs the actual insertion of the dragged nodes into the target parent.\r\n *\r\n * @param state - The current drag state.\r\n */\r\nexport function handleEnd(\r\n state: DragState | SynthDragState | BaseDragState\r\n) {\r\n if (!isDragState(state) && !isSynthDragState(state)) return;\r\n\r\n const insertPoint = insertState.insertPoint;\r\n\r\n if (!insertState.draggedOverParent) {\r\n const draggedParentValues = parentValues(\r\n state.initialParent.el,\r\n state.initialParent.data\r\n );\r\n\r\n const transferred = state.initialParent.el !== state.currentParent.el;\r\n\r\n remapNodes(state.initialParent.el);\r\n\r\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\r\n\r\n const enabledNodes = [...state.initialParent.data.enabledNodes];\r\n\r\n const originalIndex = state.draggedNodes[0].data.index;\r\n\r\n const targetIndex = insertState.targetIndex;\r\n\r\n if (\r\n !transferred &&\r\n insertState.draggedOverNodes[0] &&\r\n insertState.draggedOverNodes[0].el !== state.draggedNodes[0].el\r\n ) {\r\n const newParentValues = [\r\n ...draggedParentValues.filter(\r\n (x) => !draggedValues.some((y) => eq(x, y))\r\n ),\r\n ];\r\n\r\n let index = insertState.draggedOverNodes[0].data.index;\r\n\r\n if (\r\n insertState.targetIndex > state.draggedNodes[0].data.index &&\r\n !insertState.ascending\r\n ) {\r\n index--;\r\n } else if (\r\n insertState.targetIndex < state.draggedNodes[0].data.index &&\r\n insertState.ascending\r\n ) {\r\n index++;\r\n }\r\n\r\n newParentValues.splice(index, 0, ...draggedValues);\r\n\r\n setParentValues(state.initialParent.el, state.initialParent.data, [\r\n ...newParentValues,\r\n ]);\r\n\r\n if (state.initialParent.data.config.onSort) {\r\n const sortEventData = {\r\n parent: {\r\n el: state.initialParent.el,\r\n data: state.initialParent.data,\r\n } as ParentRecord,\r\n previousValues: [...draggedParentValues],\r\n previousNodes: [...enabledNodes],\r\n nodes: [...state.initialParent.data.enabledNodes],\r\n values: [...newParentValues],\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: insertState.draggedOverNodes,\r\n previousPosition: originalIndex,\r\n position: index,\r\n state: state as DragState,\r\n };\r\n\r\n state.initialParent.data.config.onSort(sortEventData);\r\n }\r\n } else if (transferred && insertState.draggedOverNodes.length) {\r\n const draggedParentValues = parentValues(\r\n state.initialParent.el,\r\n state.initialParent.data\r\n );\r\n\r\n // For the time being, we will not be remoing the value of the original dragged parent.\r\n let index = insertState.draggedOverNodes[0].data.index || 0;\r\n\r\n if (insertState.ascending) index++;\r\n\r\n const insertValues = state.initialParent.data.config.insertConfig\r\n ?.dynamicValues\r\n ? state.initialParent.data.config.insertConfig.dynamicValues({\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\r\n targetIndex: index,\r\n })\r\n : draggedValues;\r\n\r\n const newParentValues = [\r\n ...draggedParentValues.filter(\r\n (x) => !draggedValues.some((y) => eq(x, y))\r\n ),\r\n ];\r\n\r\n if (state.currentParent.el.contains(state.initialParent.el)) {\r\n // Update initial parent values first\r\n setParentValues(state.initialParent.el, state.initialParent.data, [\r\n ...newParentValues,\r\n ]);\r\n\r\n // Now get the target parent values.\r\n const targetParentValues = parentValues(\r\n state.currentParent.el,\r\n state.currentParent.data\r\n );\r\n\r\n targetParentValues.splice(index, 0, ...insertValues);\r\n\r\n setParentValues(state.currentParent.el, state.currentParent.data, [\r\n ...targetParentValues,\r\n ]);\r\n } else {\r\n setParentValues(state.initialParent.el, state.initialParent.data, [\r\n ...newParentValues,\r\n ]);\r\n\r\n const targetParentValues = parentValues(\r\n state.currentParent.el,\r\n state.currentParent.data\r\n );\r\n\r\n targetParentValues.splice(index, 0, ...insertValues);\r\n\r\n setParentValues(state.currentParent.el, state.currentParent.data, [\r\n ...targetParentValues,\r\n ]);\r\n }\r\n\r\n const data = {\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n initialParent: state.initialParent,\r\n draggedNodes: state.draggedNodes,\r\n targetIndex,\r\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\r\n state,\r\n };\r\n\r\n if (state.initialParent.data.config.onTransfer)\r\n state.initialParent.data.config.onTransfer(data);\r\n if (state.currentParent.data.config.onTransfer)\r\n state.currentParent.data.config.onTransfer(data);\r\n }\r\n } else if (insertState.draggedOverParent) {\r\n if (state.currentParent.el.contains(state.initialParent.el)) {\r\n const draggedParentValues = parentValues(\r\n state.initialParent.el,\r\n state.initialParent.data\r\n );\r\n\r\n const newParentValues = [\r\n ...draggedParentValues.filter(\r\n (x) => !draggedValues.some((y) => eq(x, y))\r\n ),\r\n ];\r\n\r\n setParentValues(state.initialParent.el, state.initialParent.data, [\r\n ...newParentValues,\r\n ]);\r\n\r\n const draggedOverParentValues = parentValues(\r\n insertState.draggedOverParent.el,\r\n insertState.draggedOverParent.data\r\n );\r\n\r\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\r\n\r\n const insertValues = state.initialParent.data.config.insertConfig\r\n ?.dynamicValues\r\n ? state.initialParent.data.config.insertConfig.dynamicValues({\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\r\n })\r\n : draggedValues;\r\n\r\n draggedOverParentValues.push(...insertValues);\r\n\r\n setParentValues(\r\n insertState.draggedOverParent.el,\r\n insertState.draggedOverParent.data,\r\n [...draggedOverParentValues]\r\n );\r\n } else {\r\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\r\n\r\n const draggedOverParentValues = parentValues(\r\n insertState.draggedOverParent.el,\r\n insertState.draggedOverParent.data\r\n );\r\n\r\n const insertValues = state.initialParent.data.config.insertConfig\r\n ?.dynamicValues\r\n ? state.initialParent.data.config.insertConfig.dynamicValues({\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\r\n })\r\n : draggedValues;\r\n\r\n draggedOverParentValues.push(...insertValues);\r\n\r\n setParentValues(\r\n insertState.draggedOverParent.el,\r\n insertState.draggedOverParent.data,\r\n [...draggedOverParentValues]\r\n );\r\n\r\n const draggedParentValues = parentValues(\r\n state.initialParent.el,\r\n state.initialParent.data\r\n );\r\n\r\n const newParentValues = [\r\n ...draggedParentValues.filter(\r\n (x) => !draggedValues.some((y) => eq(x, y))\r\n ),\r\n ];\r\n\r\n setParentValues(state.initialParent.el, state.initialParent.data, [\r\n ...newParentValues,\r\n ]);\r\n }\r\n\r\n const data: InsertEvent = {\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\r\n state,\r\n };\r\n\r\n if (state.initialParent.data.config.insertConfig?.insertEvent)\r\n state.initialParent.data.config.insertConfig.insertEvent(data);\r\n if (state.currentParent.data.config.insertConfig?.insertEvent)\r\n state.currentParent.data.config.insertConfig.insertEvent(data);\r\n\r\n removeClass(\r\n [insertState.draggedOverParent.el],\r\n insertState.draggedOverParent.data.config.dropZoneClass\r\n );\r\n }\r\n\r\n if (insertPoint) insertPoint.el.style.display = \"none\";\r\n\r\n const dropZoneClass = isSynthDragState(state)\r\n ? state.initialParent.data.config.synthDropZoneClass\r\n : state.initialParent.data.config.dropZoneClass;\r\n\r\n removeClass(\r\n insertState.draggedOverNodes.map((node) => node.el),\r\n dropZoneClass\r\n );\r\n\r\n const dragPlaceholderClass =\r\n state.initialParent.data.config.dragPlaceholderClass;\r\n\r\n removeClass(\r\n state.draggedNodes.map((node) => node.el),\r\n dragPlaceholderClass\r\n );\r\n\r\n insertState.draggedOverNodes = [];\r\n\r\n insertState.draggedOverParent = null;\r\n}\r\n","import type {\r\n DropSwapConfig,\r\n NodeDragEventData,\r\n DragState,\r\n SynthDragState,\r\n NodeRecord,\r\n PointeroverNodeEvent,\r\n ParentDragEventData,\r\n PointeroverParentEvent,\r\n DropSwapState,\r\n ParentRecord,\r\n BaseDragState,\r\n} from \"../../types\";\r\nimport {\r\n parents,\r\n parentValues,\r\n setParentValues,\r\n addNodeClass,\r\n isSynthDragState,\r\n removeClass,\r\n addClass,\r\n state,\r\n addEvents,\r\n isDragState,\r\n} from \"../../index\";\r\n\r\nexport const dropSwapState: DropSwapState = {\r\n draggedOverNodes: Array>(),\r\n initialDraggedIndex: undefined,\r\n transferred: false,\r\n dragging: false,\r\n};\r\n\r\n/**\r\n * Abort controller for the document.\r\n */\r\nlet documentController: AbortController | undefined;\r\n\r\nexport function dropOrSwap(dropSwapConfig: DropSwapConfig = {}) {\r\n return (parent: HTMLElement) => {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n const dropSwapParentConfig = {\r\n ...parentData.config,\r\n dropSwapConfig,\r\n };\r\n\r\n return {\r\n setup() {\r\n dropSwapParentConfig.handleNodeDragover =\r\n dropSwapConfig.handleNodeDragover || handleNodeDragover;\r\n\r\n dropSwapParentConfig.handleParentDragover =\r\n dropSwapConfig.handleParentDragover || handleParentDragover;\r\n\r\n dropSwapParentConfig.handleNodePointerover =\r\n dropSwapConfig.handleNodePointerover || handleNodePointerover;\r\n\r\n dropSwapParentConfig.handleParentPointerover =\r\n dropSwapConfig.handleParentPointerover || handeParentPointerover;\r\n\r\n const originalHandleend = dropSwapParentConfig.handleEnd;\r\n\r\n dropSwapParentConfig.handleEnd = (\r\n state: DragState | SynthDragState\r\n ) => {\r\n handleEnd(state);\r\n\r\n originalHandleend(state);\r\n };\r\n\r\n parentData.on(\"dragStarted\", () => {\r\n documentController = addEvents(document, {\r\n dragover: rootDragover,\r\n handleRootPointerover: rootPointerover,\r\n });\r\n });\r\n\r\n parentData.on(\"dragEnded\", () => {\r\n documentController?.abort();\r\n });\r\n\r\n parentData.config = dropSwapParentConfig;\r\n },\r\n };\r\n };\r\n}\r\n\r\nfunction rootDragover(_e: DragEvent) {\r\n if (!isDragState(state)) return;\r\n\r\n removeClass(\r\n [state.currentParent.el],\r\n state.currentParent.data.config.dropZoneParentClass\r\n );\r\n\r\n state.currentParent = state.initialParent;\r\n}\r\n\r\nfunction rootPointerover(_e: CustomEvent) {\r\n if (!isSynthDragState(state)) return;\r\n\r\n removeClass(\r\n [state.currentParent.el],\r\n state.currentParent.data.config.synthDropZoneParentClass\r\n );\r\n\r\n state.currentParent = state.initialParent;\r\n}\r\n\r\nfunction updateDraggedOverNodes(\r\n data: PointeroverNodeEvent | NodeDragEventData,\r\n state: DragState | SynthDragState\r\n) {\r\n const targetData =\r\n \"detail\" in data ? data.detail.targetData : data.targetData;\r\n\r\n const config = targetData.parent.data.config;\r\n\r\n const dropZoneClass = isSynthDragState(state)\r\n ? config.synthDropZoneClass\r\n : config.dropZoneClass;\r\n\r\n removeClass(\r\n dropSwapState.draggedOverNodes.map((node) => node.el),\r\n dropZoneClass\r\n );\r\n\r\n const enabledNodes = targetData.parent.data.enabledNodes;\r\n\r\n if (!enabledNodes) return;\r\n\r\n dropSwapState.draggedOverNodes = enabledNodes.slice(\r\n targetData.node.data.index,\r\n targetData.node.data.index + state.draggedNodes.length\r\n );\r\n\r\n addNodeClass(\r\n dropSwapState.draggedOverNodes.map((node) => node.el),\r\n dropZoneClass,\r\n true\r\n );\r\n\r\n state.currentTargetValue = targetData.node.data.value;\r\n\r\n state.currentParent = targetData.parent;\r\n\r\n addClass(\r\n state.currentParent.el,\r\n isSynthDragState(state)\r\n ? config.synthDropZoneParentClass\r\n : config.dropZoneParentClass,\r\n state.currentParent.data,\r\n true\r\n );\r\n}\r\n\r\nfunction handleNodeDragover(\r\n data: NodeDragEventData,\r\n state: DragState\r\n) {\r\n data.e.preventDefault();\r\n\r\n data.e.stopPropagation();\r\n\r\n updateDraggedOverNodes(data, state);\r\n}\r\n\r\nexport function handleParentDragover(\r\n data: ParentDragEventData,\r\n state: DragState\r\n) {\r\n data.e.preventDefault();\r\n\r\n data.e.stopPropagation();\r\n\r\n const currentConfig = state.currentParent.data.config;\r\n\r\n removeClass(\r\n dropSwapState.draggedOverNodes.map((node) => node.el),\r\n currentConfig.dropZoneClass\r\n );\r\n\r\n removeClass([state.currentParent.el], currentConfig.dropZoneParentClass);\r\n\r\n const config = data.targetData.parent.data.config;\r\n\r\n addClass(\r\n data.targetData.parent.el,\r\n config.dropZoneParentClass,\r\n data.targetData.parent.data,\r\n true\r\n );\r\n\r\n dropSwapState.draggedOverNodes = [];\r\n\r\n state.currentParent = data.targetData.parent;\r\n}\r\n\r\nexport function handeParentPointerover(data: PointeroverParentEvent) {\r\n const currentConfig = data.detail.state.currentParent.data.config;\r\n\r\n removeClass(\r\n dropSwapState.draggedOverNodes.map((node) => node.el),\r\n currentConfig.synthDropZoneClass\r\n );\r\n\r\n removeClass(\r\n [data.detail.state.currentParent.el],\r\n currentConfig.synthDropZoneParentClass\r\n );\r\n\r\n const config = data.detail.targetData.parent.data.config;\r\n\r\n addClass(\r\n data.detail.targetData.parent.el,\r\n config.synthDropZoneParentClass,\r\n data.detail.targetData.parent.data,\r\n true\r\n );\r\n\r\n dropSwapState.draggedOverNodes = [];\r\n\r\n data.detail.state.currentParent = data.detail.targetData.parent;\r\n}\r\n\r\nfunction handleNodePointerover(data: PointeroverNodeEvent) {\r\n if (!isSynthDragState(data.detail.state)) return;\r\n\r\n updateDraggedOverNodes(data, data.detail.state);\r\n}\r\n\r\nfunction swapElements(\r\n arr1: T[],\r\n arr2: T[] | null,\r\n index1: number | number[],\r\n index2: number\r\n): T[] | [T[], T[]] {\r\n const indices1 = Array.isArray(index1) ? index1 : [index1];\r\n\r\n if (arr2 === null) {\r\n const elementsFromArr1 = indices1.map((i) => arr1[i]);\r\n\r\n const elementFromArr2 = arr1[index2];\r\n\r\n arr1.splice(index2, 1, ...elementsFromArr1);\r\n\r\n indices1.forEach((i, idx) => {\r\n arr1[i] = idx === 0 ? elementFromArr2 : (undefined as unknown as T);\r\n });\r\n\r\n return arr1.filter((el) => el !== undefined);\r\n } else {\r\n const elementsFromArr1 = indices1.map((i) => arr1[i]);\r\n\r\n const elementFromArr2 = arr2[index2];\r\n\r\n arr2.splice(index2, 1, ...elementsFromArr1);\r\n\r\n indices1.forEach((i, idx) => {\r\n arr1[i] = idx === 0 ? elementFromArr2 : (undefined as unknown as T);\r\n });\r\n\r\n return [arr1.filter((el) => el !== undefined), arr2];\r\n }\r\n}\r\n\r\nfunction handleEnd(state: DragState | SynthDragState) {\r\n const isSynth = isSynthDragState(state);\r\n\r\n removeClass(\r\n [state.currentParent.el],\r\n isSynth\r\n ? state.currentParent.data.config.synthDropZoneParentClass\r\n : state.currentParent.data.config.dropZoneParentClass\r\n );\r\n\r\n removeClass(\r\n dropSwapState.draggedOverNodes.map((node) => node.el),\r\n isSynth\r\n ? state.currentParent.data.config.synthDropZoneClass\r\n : state.currentParent.data.config.dropZoneClass\r\n );\r\n\r\n const values = parentValues(state.currentParent.el, state.currentParent.data);\r\n\r\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\r\n\r\n const newValues = values.filter((x) => !draggedValues.includes(x));\r\n\r\n const targetIndex = dropSwapState.draggedOverNodes[0]?.data.index;\r\n\r\n const draggedIndex = state.draggedNodes[0].data.index;\r\n\r\n const initialParentValues = parentValues(\r\n state.initialParent.el,\r\n state.initialParent.data\r\n );\r\n\r\n if (targetIndex === undefined) {\r\n if (state.initialParent.el === state.currentParent.el) return;\r\n\r\n const newInitialValues = initialParentValues.filter(\r\n (x) => !draggedValues.includes(x)\r\n );\r\n\r\n setParentValues(\r\n state.initialParent.el,\r\n state.initialParent.data,\r\n newInitialValues\r\n );\r\n\r\n setParentValues(\r\n state.currentParent.el,\r\n state.currentParent.data,\r\n values.concat(draggedValues)\r\n );\r\n\r\n return;\r\n }\r\n\r\n let swap = false;\r\n\r\n const shouldSwap = state.initialParent.data.config.dropSwapConfig?.shouldSwap;\r\n\r\n if (shouldSwap)\r\n swap = shouldSwap({\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\r\n state,\r\n });\r\n\r\n if (state.initialParent.el === state.currentParent.el) {\r\n newValues.splice(targetIndex, 0, ...draggedValues);\r\n\r\n setParentValues(\r\n state.currentParent.el,\r\n state.currentParent.data,\r\n swap ? swapElements(values, null, draggedIndex, targetIndex) : newValues\r\n );\r\n\r\n if (state.initialParent.data.config.onSort) {\r\n state.initialParent.data.config.onSort({\r\n parent: {\r\n el: state.initialParent.el,\r\n data: state.initialParent.data,\r\n } as ParentRecord,\r\n previousValues: [...initialParentValues],\r\n previousNodes: [...state.initialParent.data.enabledNodes],\r\n nodes: [...state.initialParent.data.enabledNodes],\r\n values: [...newValues],\r\n draggedNodes: state.draggedNodes,\r\n previousPosition: draggedIndex,\r\n position: targetIndex,\r\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\r\n state: state as BaseDragState,\r\n });\r\n }\r\n } else {\r\n if (swap) {\r\n const res = swapElements(\r\n initialParentValues,\r\n newValues,\r\n state.initialIndex,\r\n targetIndex\r\n );\r\n\r\n setParentValues(\r\n state.initialParent.el,\r\n state.initialParent.data,\r\n res[0] as T[]\r\n );\r\n\r\n setParentValues(\r\n state.currentParent.el,\r\n state.currentParent.data,\r\n res[1] as T[]\r\n );\r\n } else {\r\n const newInitialValues = initialParentValues.filter(\r\n (x) => !draggedValues.includes(x)\r\n );\r\n\r\n setParentValues(\r\n state.initialParent.el,\r\n state.initialParent.data,\r\n newInitialValues\r\n );\r\n\r\n newValues.splice(targetIndex, 0, ...draggedValues);\r\n\r\n setParentValues(\r\n state.currentParent.el,\r\n state.currentParent.data,\r\n newValues\r\n );\r\n }\r\n }\r\n\r\n if (state.currentParent.data.config.onTransfer) {\r\n state.currentParent.data.config.onTransfer({\r\n sourceParent: state.currentParent,\r\n targetParent: state.initialParent,\r\n initialParent: state.initialParent,\r\n draggedNodes: state.draggedNodes,\r\n targetIndex,\r\n state,\r\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\r\n });\r\n }\r\n\r\n if (state.initialParent.data.config.onTransfer) {\r\n state.initialParent.data.config.onTransfer({\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n initialParent: state.initialParent,\r\n draggedNodes: state.draggedNodes,\r\n targetIndex,\r\n state,\r\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\r\n });\r\n }\r\n}\r\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","handleEnd","nodes","emit","on","handleNodeDragover","handleParentDragover","handleNodePointerover","handleParentPointerover","draggedNodes","state","parent","x","scrollTimeout","className"]} \ No newline at end of file diff --git a/dist/index.mjs b/dist/index.mjs index 219c19c..14cfba9 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -2011,6 +2011,7 @@ function initDrag(data, draggedNodes2) { dragImage = config.dragImage(data, draggedNodes2); } else { if (!config.multiDrag || draggedNodes2.length === 1) { + dragState.originalZIndex = data.targetData.node.el.style.zIndex; data.targetData.node.el.style.zIndex = "9999"; data.targetData.node.el.style.boxSizing = "border-box"; data.e.dataTransfer.setDragImage( @@ -2018,7 +2019,6 @@ function initDrag(data, draggedNodes2) { data.e.offsetX, data.e.offsetY ); - dragState.originalZIndex = data.targetData.node.el.style.zIndex; return dragState; } else { const wrapper = document.createElement("div"); diff --git a/dist/index.mjs.map b/dist/index.mjs.map index 82baadc..15bc08c 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\n/**\n * Function to get the bounding client rect of an element.\n *\n * @param {HTMLElement} el - The element to get the bounding client rect of.\n *\n * @returns {ClientRect} The bounding client rect of the element.\n */\nexport function rect(el: HTMLElement): ClientRect {\n return el.getBoundingClientRect();\n}\n\n/**\n * Function to create an emitter.\n *\n * @returns {[Function, Function]} A tuple containing emit and on functions\n */\nexport function createEmitter() {\n const callbacks = new Map void>>();\n\n const emit = function (eventName: string, data: T) {\n if (!callbacks.get(eventName)) return;\n\n callbacks.get(eventName)!.forEach((cb) => {\n cb(data);\n });\n };\n\n const on = function (eventName: string, callback: (data: T) => void) {\n const cbs = callbacks.get(eventName) ?? [];\n\n cbs.push(callback);\n\n callbacks.set(eventName, cbs);\n };\n\n return [emit, on] as const;\n}\n\n/**\n * The emit and on functions for drag and drop.\n *\n * @type {[Function, Function]}\n */\nexport const [emit, on] = createEmitter();\n\n/**\n * A regular expression to test for a valid date string.\n *\n * @param x - A RegExp to compare.\n * @param y - A RegExp to compare.\n * @public\n */\nexport function eqRegExp(x: RegExp, y: RegExp): boolean {\n return (\n x.source === y.source &&\n x.flags.split(\"\").sort().join(\"\") === y.flags.split(\"\").sort().join(\"\")\n );\n}\n\n/**\n * Compare two values for equality, optionally at depth.\n *\n * @param valA - First value.\n * @param valB - Second value.\n * @param deep - If it will compare deeply if it's an object.\n * @param explicit - An array of keys to explicity check.\n *\n * @returns `boolean`\n *\n * @public\n */\nexport function eq(\n valA: unknown,\n valB: unknown,\n deep = true,\n explicit: string[] = [\"__key\"]\n): boolean {\n if (valA === valB) return true;\n\n if (\n typeof valB === \"object\" &&\n typeof valA === \"object\" &&\n valA !== null &&\n valB !== null\n ) {\n if (valA instanceof Map) return false;\n if (valA instanceof Set) return false;\n if (valA instanceof Date && valB instanceof Date)\n return valA.getTime() === valB.getTime();\n if (valA instanceof RegExp && valB instanceof RegExp)\n return eqRegExp(valA, valB);\n if (valA === null || valB === null) return false;\n\n const objA = valA as Record;\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 * 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 Node,\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 nodes,\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 // 1. If the element is not an HTMLElement or is the insert point itself, do nothing.\n if (!(el instanceof HTMLElement) || el === insertState.insertPoint?.el) {\n return;\n }\n\n // 2. Traverse up the DOM from the element under the cursor\n // to see if any ancestor is a registered parent.\n let isWithinAParent = false;\n let current: HTMLElement | null = el;\n while (current) {\n if (nodes.has(current as Node) || parents.has(current)) {\n isWithinAParent = true;\n break; // Found a registered parent ancestor\n }\n if (current === document.body) break; // Stop if we reach the body\n current = current.parentElement;\n }\n\n // 3. If the cursor is NOT within any registered parent...\n if (!isWithinAParent) {\n // Hide the insert point if it exists\n if (insertState.insertPoint) {\n insertState.insertPoint.el.style.display = \"none\";\n }\n\n // Remove drop zone class if a parent was previously being dragged over\n if (insertState.draggedOverParent) {\n removeClass(\n [insertState.draggedOverParent.el],\n insertState.draggedOverParent.data.config.dropZoneClass\n );\n }\n\n // Reset insert state related to dragged over elements\n insertState.draggedOverNodes = [];\n insertState.draggedOverParent = null;\n\n // Reset current parent in the main state back to the initial one\n state.currentParent = state.initialParent;\n }\n // 4. If the cursor IS within a registered parent, do nothing in this function.\n // Other event handlers will manage the insertion point positioning.\n}\n\ninterface Range {\n x: [number, number];\n y: [number, number];\n vertical: boolean;\n}\n\nfunction createVerticalRange(\n nodeCoords: Coordinates,\n otherCoords: Coordinates | undefined,\n isAscending: boolean\n): Range {\n const center = nodeCoords.top + nodeCoords.height / 2;\n\n if (!otherCoords) {\n const offset = nodeCoords.height / 2 + 10;\n return {\n y: isAscending ? [center, center + offset] : [center - offset, center],\n x: [nodeCoords.left, nodeCoords.right],\n vertical: true,\n };\n }\n\n const otherEdge = isAscending ? otherCoords.top : otherCoords.bottom;\n const nodeEdge = isAscending ? nodeCoords.bottom : nodeCoords.top;\n\n let midpoint: number;\n let range: [number, number];\n\n if (isAscending) {\n // Midpoint between current node's bottom and next node's top\n midpoint = nodeEdge + (otherEdge - nodeEdge) / 2; // nodeCoords.bottom + (otherCoords.top - nodeCoords.bottom) / 2\n range = [center, midpoint]; // Range from node center down to midpoint\n } else {\n // Midpoint between previous node's bottom and current node's top\n midpoint = otherEdge + (nodeEdge - otherEdge) / 2; // otherCoords.bottom + (nodeCoords.top - otherCoords.bottom) / 2\n range = [midpoint, center]; // Range from midpoint down to node center\n }\n\n return {\n y: range,\n x: [nodeCoords.left, nodeCoords.right],\n vertical: true,\n };\n}\n\nfunction createHorizontalRange(\n nodeCoords: Coordinates,\n otherCoords: Coordinates | undefined,\n isAscending: boolean,\n lastInRow = false\n): Range {\n const center = nodeCoords.left + nodeCoords.width / 2;\n\n if (!otherCoords) {\n if (isAscending) {\n return {\n x: [center, center + nodeCoords.width],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n } else {\n return {\n x: [nodeCoords.left - 10, center],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n }\n }\n\n if (isAscending && lastInRow) {\n return {\n x: [center, nodeCoords.right + 10],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n }\n\n if (isAscending) {\n const nextNodeCenter = otherCoords.left + otherCoords.width / 2;\n return {\n x: [center, center + Math.abs(center - nextNodeCenter) / 2],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n } else {\n return {\n x: [\n otherCoords.right + Math.abs(otherCoords.right - nodeCoords.left) / 2,\n center,\n ],\n y: [nodeCoords.top, nodeCoords.bottom],\n vertical: false,\n };\n }\n}\n\nfunction getRealCoords(el: HTMLElement): Coordinates {\n const { top, bottom, left, right, height, width } =\n el.getBoundingClientRect();\n\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n return {\n top: top + scrollTop,\n bottom: bottom + scrollTop,\n left: left + scrollLeft,\n right: right + scrollLeft,\n height,\n width,\n };\n}\n\nfunction defineRanges(parent: HTMLElement) {\n if (!isDragState(state) && !isSynthDragState(state)) return;\n\n const parentData = parents.get(parent);\n if (!parentData) return;\n\n const enabledNodes = parentData.enabledNodes;\n\n enabledNodes.forEach((node, index) => {\n node.data.range = {};\n\n const prevNode = enabledNodes[index - 1];\n const nextNode = enabledNodes[index + 1];\n const nodeCoords = getRealCoords(node.el);\n const prevNodeCoords = prevNode ? getRealCoords(prevNode.el) : undefined;\n const nextNodeCoords = nextNode ? getRealCoords(nextNode.el) : undefined;\n\n const aboveOrBelowPrevious =\n prevNodeCoords &&\n (nodeCoords.top > prevNodeCoords.bottom ||\n nodeCoords.bottom < prevNodeCoords.top);\n\n const aboveOrBelowAfter =\n nextNodeCoords &&\n (nodeCoords.top > nextNodeCoords.bottom ||\n nodeCoords.bottom < nextNodeCoords.top);\n\n const fullishWidth =\n parent.getBoundingClientRect().width * 0.8 < nodeCoords.width;\n\n if (fullishWidth) {\n node.data.range.ascending = createVerticalRange(\n nodeCoords,\n nextNodeCoords,\n true\n );\n node.data.range.descending = createVerticalRange(\n nodeCoords,\n prevNodeCoords,\n false\n );\n } else if (aboveOrBelowAfter && !aboveOrBelowPrevious) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n nextNodeCoords,\n true,\n true\n );\n node.data.range.descending = createHorizontalRange(\n nodeCoords,\n prevNodeCoords,\n false\n );\n } else if (!aboveOrBelowPrevious && !aboveOrBelowAfter) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n nextNodeCoords,\n true\n );\n node.data.range.descending = createHorizontalRange(\n nodeCoords,\n prevNodeCoords,\n false\n );\n } else if (aboveOrBelowPrevious && !nextNodeCoords) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n undefined,\n true\n );\n } else if (aboveOrBelowPrevious && !aboveOrBelowAfter) {\n node.data.range.ascending = createHorizontalRange(\n nodeCoords,\n nextNodeCoords,\n true\n );\n node.data.range.descending = createHorizontalRange(\n nodeCoords,\n undefined,\n false\n );\n }\n });\n}\n\nexport function handleNodeDragover(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 nativeDrag = false\n) {\n pd(e);\n\n if (nativeDrag && e instanceof PointerEvent) return;\n\n const { x, y } = eventCoordinates(e);\n\n // Calculate global coordinates\n const clientX = x;\n const clientY = y;\n\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n state.coordinates.x = clientX + scrollLeft;\n state.coordinates.y = clientY + scrollTop;\n\n const nestedParent = targetData.parent.data.nestedParent;\n\n let realTargetParent = targetData.parent;\n\n if (nestedParent) {\n const rect = nestedParent.el.getBoundingClientRect();\n\n if (state.coordinates.y > rect.top && state.coordinates.y < rect.bottom)\n realTargetParent = nestedParent;\n }\n\n if (realTargetParent.el === state.currentParent?.el) {\n moveBetween(realTargetParent, state);\n } else {\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);\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.style, {\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 insertState.insertPoint.el.style.display = \"block\";\n\n if (position.vertical) {\n const insertPointHeight =\n insertState.insertPoint.el.getBoundingClientRect().height;\n const targetY = position.y[ascending ? 1 : 0];\n const topPosition = targetY - insertPointHeight / 2;\n\n Object.assign(insertState.insertPoint.el.style, {\n top: `${topPosition}px`,\n left: `${position.x[0]}px`,\n right: `${position.x[1]}px`,\n width: `${position.x[1] - position.x[0]}px`,\n });\n } else {\n const leftPosition =\n position.x[ascending ? 1 : 0] -\n insertState.insertPoint.el.getBoundingClientRect().width / 2;\n insertState.insertPoint.el.style.left = `${leftPosition}px`;\n\n Object.assign(insertState.insertPoint.el.style, {\n top: `${position.y[0]}px`,\n bottom: `${position.y[1]}px`,\n height: `${position.y[1] - position.y[0]}px`,\n });\n }\n\n insertState.targetIndex = node.data.index;\n\n insertState.ascending = ascending;\n}\n\nexport function handleParentDrop(_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) && !isSynthDragState(state)) return;\n\n const insertPoint = insertState.insertPoint;\n\n if (!insertState.draggedOverParent) {\n const draggedParentValues = parentValues(\n state.initialParent.el,\n state.initialParent.data\n );\n\n const transferred = state.initialParent.el !== state.currentParent.el;\n\n remapNodes(state.initialParent.el);\n\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n const enabledNodes = [...state.initialParent.data.enabledNodes];\n\n const originalIndex = state.draggedNodes[0].data.index;\n\n const targetIndex = insertState.targetIndex;\n\n if (\n !transferred &&\n insertState.draggedOverNodes[0] &&\n insertState.draggedOverNodes[0].el !== state.draggedNodes[0].el\n ) {\n const newParentValues = [\n ...draggedParentValues.filter(\n (x) => !draggedValues.some((y) => eq(x, y))\n ),\n ];\n\n let index = insertState.draggedOverNodes[0].data.index;\n\n if (\n insertState.targetIndex > state.draggedNodes[0].data.index &&\n !insertState.ascending\n ) {\n index--;\n } else if (\n insertState.targetIndex < state.draggedNodes[0].data.index &&\n insertState.ascending\n ) {\n index++;\n }\n\n newParentValues.splice(index, 0, ...draggedValues);\n\n setParentValues(state.initialParent.el, state.initialParent.data, [\n ...newParentValues,\n ]);\n\n if (state.initialParent.data.config.onSort) {\n const sortEventData = {\n parent: {\n el: state.initialParent.el,\n data: state.initialParent.data,\n } as ParentRecord,\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 ParentRecord,\n BaseDragState,\n} from \"../../types\";\nimport {\n parents,\n parentValues,\n setParentValues,\n addNodeClass,\n isSynthDragState,\n removeClass,\n addClass,\n state,\n addEvents,\n isDragState,\n} 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\n if (state.initialParent.data.config.onSort) {\n state.initialParent.data.config.onSort({\n parent: {\n el: state.initialParent.el,\n data: state.initialParent.data,\n } as ParentRecord,\n previousValues: [...initialParentValues],\n previousNodes: [...state.initialParent.data.enabledNodes],\n nodes: [...state.initialParent.data.enabledNodes],\n values: [...newValues],\n draggedNodes: state.draggedNodes,\n previousPosition: draggedIndex,\n position: targetIndex,\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\n state: state as BaseDragState,\n });\n }\n } else {\n if (swap) {\n const res = swapElements(\n initialParentValues,\n newValues,\n state.initialIndex,\n targetIndex\n );\n\n setParentValues(\n state.initialParent.el,\n state.initialParent.data,\n res[0] as T[]\n );\n\n setParentValues(\n state.currentParent.el,\n state.currentParent.data,\n res[1] as T[]\n );\n } else {\n const newInitialValues = initialParentValues.filter(\n (x) => !draggedValues.includes(x)\n );\n\n setParentValues(\n state.initialParent.el,\n state.initialParent.data,\n newInitialValues\n );\n\n newValues.splice(targetIndex, 0, ...draggedValues);\n\n setParentValues(\n state.currentParent.el,\n state.currentParent.data,\n newValues\n );\n }\n }\n\n if (state.currentParent.data.config.onTransfer) {\n state.currentParent.data.config.onTransfer({\n sourceParent: state.currentParent,\n targetParent: state.initialParent,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n targetIndex,\n state,\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\n });\n }\n\n if (state.initialParent.data.config.onTransfer) {\n state.initialParent.data.config.onTransfer({\n sourceParent: state.initialParent,\n targetParent: state.currentParent,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n targetIndex,\n state,\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\n });\n }\n}\n","import type {\n DNDPlugin,\n DragAndDrop,\n DragState,\n DragStateProps,\n Node,\n NodeData,\n NodeDragEventData,\n NodeEventData,\n NodePointerEventData,\n NodeRecord,\n NodeTargetData,\n NodesData,\n ParentConfig,\n ParentData,\n ParentEventData,\n ParentTargetData,\n ParentsData,\n PointeroverNodeEvent,\n PointeroverParentEvent,\n SetupNodeData,\n TearDownNodeData,\n BaseDragState,\n SynthDragState,\n SynthDragStateProps,\n ParentRecord,\n EventHandlers,\n NodeFromPoint,\n ParentFromPoint,\n ParentDragEventData,\n DragstartEventData,\n} from \"./types\";\n\nimport {\n pd,\n sp,\n on,\n emit,\n createEmitter,\n eq,\n splitClass,\n eventCoordinates,\n} from \"./utils\";\n\nexport * from \"./types\";\nexport { animations } from \"./plugins/animations\";\nexport { insert } from \"./plugins/insert\";\nexport { dropOrSwap } from \"./plugins/drop-or-swap\";\n\n/**\n * Check to see if code is running in a browser.\n */\nexport const isBrowser = typeof window !== \"undefined\";\n\n/**\n * Parents or \"lists\" are the containers that nodes or \"draggable items\" can be\n * dragged from and into.\n *\n * @type {WeakMap>}\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\nfunction isMobilePlatform() {\n if (!isBrowser) return false;\n\n if (\"userAgentData\" in navigator) {\n return (navigator.userAgentData as { mobile: boolean }).mobile === true;\n }\n\n const ua = navigator.userAgent;\n\n const isMobileUA = /android|iphone|ipod/i.test(ua);\n\n const isIpad =\n /iPad/.test(ua) ||\n (ua.includes(\"Macintosh\") && navigator.maxTouchPoints > 1);\n\n return isMobileUA || isIpad;\n}\n\n/**\n * The base drag state.\n *\n * @type {BaseDragState}\n */\nconst baseDragState = {\n affectedNodes: [],\n coordinates: {\n x: 0,\n y: 0,\n },\n currentTargetValue: undefined,\n on,\n emit,\n originalZIndex: undefined,\n pointerSelection: false,\n preventEnter: false,\n rootUserSelect: undefined,\n nodePointerdown: undefined,\n longPress: false,\n scrolling: false,\n longPressTimeout: undefined,\n remapJustFinished: false,\n selectedNodes: [],\n selectedParent: undefined,\n preventSynthDrag: false,\n pointerDown: undefined,\n lastScrollContainerX: null,\n lastScrollContainerY: null,\n rootScrollWidth: undefined,\n rootScrollHeight: undefined,\n dragItemRect: undefined,\n windowScrollX: undefined,\n windowScrollY: undefined,\n lastScrollDirectionX: undefined,\n lastScrollDirectionY: undefined,\n scrollDebounceTimeout: undefined,\n frameIdX: undefined,\n frameIdY: undefined,\n};\n\n/**\n * The state of the drag and drop.\n *\n * @type {BaseDragState}\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 * Timeout for the scroll.\n */\nlet scrollTimeout: ReturnType;\n\nexport function resetState() {\n // Clear any existing timeouts to prevent stale references\n if (state.scrollDebounceTimeout) {\n clearTimeout(state.scrollDebounceTimeout);\n }\n\n if (state.longPressTimeout) {\n clearTimeout(state.longPressTimeout);\n }\n\n // Cancel any animation frames\n if (state.frameIdX !== undefined) {\n cancelAnimationFrame(state.frameIdX);\n }\n\n if (state.frameIdY !== undefined) {\n cancelAnimationFrame(state.frameIdY);\n }\n\n const baseDragState = {\n affectedNodes: [],\n coordinates: {\n x: 0,\n y: 0,\n },\n on,\n emit,\n currentTargetValue: undefined,\n originalZIndex: undefined,\n pointerId: undefined,\n preventEnter: false,\n remapJustFinished: false,\n selectedNodes: [],\n nodePointerdown: undefined,\n rootUserSelect: undefined,\n preventSynthDrag: false,\n scrolling: false,\n selectedParent: undefined,\n pointerSelection: false,\n synthScrollDirection: undefined,\n draggedNodeDisplay: undefined,\n synthDragScrolling: false,\n longPress: false,\n pointerDown: undefined,\n longPressTimeout: undefined,\n lastScrollContainerX: null,\n lastScrollContainerY: null,\n rootScrollWidth: undefined,\n rootScrollHeight: undefined,\n dragItemRect: undefined,\n windowScrollX: undefined,\n windowScrollY: undefined,\n lastScrollDirectionX: undefined,\n lastScrollDirectionY: undefined,\n scrollDebounceTimeout: undefined,\n frameIdX: undefined,\n frameIdY: undefined,\n };\n\n state = { ...baseDragState } as BaseDragState;\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() {\n if (state.activeState) setActive(state.activeState.parent, undefined, state);\n\n if (state.selectedState)\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n state.selectedState = state.activeState = undefined;\n}\n\nfunction handleRootPointerup() {\n if (state.pointerDown) state.pointerDown.node.el.draggable = true;\n\n state.pointerDown = undefined;\n\n if (!isSynthDragState(state)) return;\n\n const config = state.currentParent.data.config;\n\n if (isSynthDragState(state)) config.handleEnd(state);\n}\n\n/**\n * Handles the keydown event on the root element.\n *\n * @param {KeyboardEvent} e - The keyboard event.\n */\nfunction handleRootKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n if (state.selectedState)\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n if (state.activeState)\n setActive(state.activeState.parent, undefined, state);\n\n state.selectedState = state.activeState = undefined;\n }\n}\n\nfunction handleRootDrop(_e: DragEvent) {\n if (!isDragState(state)) return;\n\n dropped = true;\n\n const handleEnd = state.initialParent.data.config.handleEnd;\n\n handleEnd(state);\n}\n\nfunction handleRootDragover(e: DragEvent) {\n if (!isDragState(state)) return;\n\n pd(e);\n\n const { x, y } = eventCoordinates(e);\n\n if (isDragState(state)) {\n handleSynthScroll({ x, y }, e, state);\n }\n}\n\nfunction handleRootPointermove(e: PointerEvent) {\n if (!state.pointerDown || !state.pointerDown.validated) return;\n\n const config = state.pointerDown.parent.data.config;\n\n if (e.pointerType === \"mouse\" && !isMobilePlatform()) {\n return;\n }\n\n if (!isSynthDragState(state)) {\n pd(e);\n\n if (config.longPress && !state.longPress) {\n clearTimeout(state.longPressTimeout);\n\n state.longPress = false;\n\n return;\n }\n\n const nodes = config.draggedNodes(state.pointerDown);\n\n config.dragstartClasses(state.pointerDown.node, nodes, config, true);\n\n const rect = state.pointerDown.node.el.getBoundingClientRect();\n\n const synthDragState = initSynthDrag(\n state.pointerDown.node,\n state.pointerDown.parent,\n e,\n state,\n nodes,\n rect\n );\n\n synthMove(e, synthDragState, true);\n } else if (isSynthDragState(state)) {\n synthMove(e, state);\n }\n}\n\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 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 contextmenu: (e: Event) => {\n if (isSynthDragState(state)) pd(e);\n },\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 handleNodeKeydown,\n handleDragstart,\n handleNodeDragover,\n handleParentDragover,\n handleNodeDrop,\n handleNodeFocus,\n handleNodeBlur,\n handlePointercancel,\n handleEnd,\n handleDragend,\n handleParentFocus,\n handleNodePointerup,\n handleNodePointerover,\n handleParentPointerover,\n handleParentScroll,\n handleNodePointerdown,\n handleNodeDragenter,\n handleNodeDragleave,\n handleParentDrop,\n multiDrag: config.multiDrag ?? false,\n nativeDrag: config.nativeDrag ?? true,\n performSort,\n performTransfer,\n root: config.root ?? document,\n setupNode,\n setupNodeRemap,\n reapplyDragClasses,\n tearDownNode,\n tearDownNodeRemap,\n remapFinished,\n threshold: {\n horizontal: 0,\n vertical: 0,\n },\n ...config,\n },\n enabledNodes: [],\n abortControllers: {},\n privateClasses: [],\n on,\n emit,\n };\n\n const nodesObserver = new MutationObserver(nodesMutated);\n\n nodesObserver.observe(parent, { childList: true });\n\n parents.set(parent, parentData);\n\n config.plugins?.forEach((plugin) => {\n plugin(parent)?.tearDown?.();\n });\n\n config.plugins?.forEach((plugin) => {\n plugin(parent)?.tearDown?.();\n });\n\n config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(parent)?.setup?.();\n });\n\n setup(parent, parentData);\n\n remapNodes(parent, true);\n}\n\nexport function dragStateProps(\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 startLeft: offsetX ? offsetX : x - (rect?.left ?? 0),\n startTop: offsetY ? offsetY : y - (rect?.top ?? 0),\n targetIndex: node.data.index,\n transferred: false,\n };\n}\n\n/**\n * Perform the sort of the nodes.\n *\n * @param {ParentRecord} parent - The parent record.\n * @param {Array>} draggedNodes - The dragged nodes.\n * @param {Array>} targetNodes - The target nodes.\n *\n * @returns void\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/**\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 if (!newActiveNode) {\n state.activeState = undefined;\n\n return;\n }\n\n state.activeState = {\n node: newActiveNode,\n parent,\n };\n}\n\n/**\n * This function deselects the nodes. This will clean the prior selected state\n * as well as removing any classes or attributes set.\n *\n * @param {Array>} 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\n/**\n * This function sets the selected nodes. This will clean the prior selected\n * state as well as removing any classes or attributes set.\n *\n * @param {ParentRecord} 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 setActive(parent, newActiveNode, state);\n}\n\n/**\n * Handle the parent focus event.\n *\n * @param {ParentEventData} data - The parent event data.\n * @param {BaseDragState | DragState | SynthDragState} state - The drag state.\n *\n * @returns void\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 dragover: parentEventData(parentData.config.handleParentDragover),\n handleParentPointerover: parentData.config.handleParentPointerover,\n scroll: parentEventData(parentData.config.handleParentScroll),\n drop: parentEventData(parentData.config.handleParentDrop),\n hasNestedParent: (e: CustomEvent) => {\n const parent = parents.get(e.target as HTMLElement);\n\n if (!parent) return;\n\n parent.nestedParent = e.detail.parent;\n },\n focus: parentEventData(parentData.config.handleParentFocus),\n });\n\n if (\n parentData.config.externalDragHandle &&\n parentData.config.externalDragHandle.el &&\n parentData.config.externalDragHandle.callback\n ) {\n parentData.abortControllers.externalDragHandle = addEvents(\n parentData.config.externalDragHandle.el,\n {\n pointerdown: (_e: PointerEvent) => {\n if (\n !parentData.config.externalDragHandle ||\n !parentData.config.externalDragHandle.callback\n )\n return;\n\n const draggableItem = parentData.config.externalDragHandle.callback();\n\n if (!isNode(draggableItem)) {\n console.warn(\n \"No draggable item found from external drag handle callback\"\n );\n\n return;\n }\n\n const nodeData = nodes.get(draggableItem);\n\n if (!nodeData) return;\n\n const parentNode = draggableItem.parentNode;\n\n if (!(parentNode instanceof HTMLElement)) return;\n\n const parent = parents.get(parentNode);\n\n if (!parent) return;\n\n state.pointerDown = {\n parent: {\n el: parentNode,\n data: parent,\n },\n node: {\n el: draggableItem,\n data: nodeData,\n },\n validated: true,\n };\n\n draggableItem.draggable = true;\n },\n }\n );\n }\n}\n\n/**\n * Set the attributes of the element.\n *\n * @param el - The element.\n * @param attrs - The attributes to set.\n *\n * @returns void\n */\nexport function setAttrs(el: HTMLElement, attrs: Record) {\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 focus: nodeEventData(config.handleNodeFocus),\n blur: nodeEventData(config.handleNodeBlur),\n pointerup: nodeEventData(config.handleNodePointerup),\n pointercancel: nodeEventData(config.handlePointercancel),\n pointerdown: nodeEventData(config.handleNodePointerdown),\n handleNodePointerover: config.handleNodePointerover,\n touchmove: (e: TouchEvent) => {\n if (isDragState(state) && e.cancelable) pd(e);\n },\n contextmenu: (e: Event) => {\n if (isSynthDragState(state)) pd(e);\n },\n });\n\n data.node.el.draggable = true;\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 parentData = parents.get(parentEl);\n\n if (!parentData) return;\n\n remapNodes(parentEl);\n}\n\n/**\n * Remaps the data of the parent element's children.\n *\n * @param parent - The parent element.\n *\n * @returns void\n *\n * @internal\n */\nexport function remapNodes(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.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 let nodes = config.draggedNodes({\n parent: data.targetData.parent,\n node: data.targetData.node,\n });\n\n // On Safari, pointerdown can sometimes not fire before the dragstart event.\n if (nodes.length === 0) {\n nodes = [data.targetData.node];\n }\n\n config.dragstartClasses(data.targetData.node, nodes, config);\n\n const dragState = initDrag(data, nodes);\n\n if (config.onDragstart) {\n const dragstartData: DragstartEventData = {\n parent: data.targetData.parent,\n values: parentValues(\n data.targetData.parent.el,\n data.targetData.parent.data\n ),\n draggedNode: dragState.draggedNode,\n draggedNodes: dragState.draggedNodes,\n position: dragState.initialIndex,\n state: dragState,\n };\n config.onDragstart(dragstartData);\n }\n}\n\nexport function handleNodePointerdown(\n data: NodePointerEventData,\n state: BaseDragState\n) {\n sp(data.e);\n\n state.pointerDown = {\n parent: data.targetData.parent,\n node: data.targetData.node,\n validated: false,\n };\n\n if (\n !validateDragHandle({\n 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.validated = true;\n\n handleLongPress(data, state, data.targetData.node);\n\n const parentData = data.targetData.parent.data;\n\n let selectedNodes = [data.targetData.node];\n\n const commandKey = data.e.ctrlKey || data.e.metaKey;\n\n const shiftKey = data.e.shiftKey;\n\n const targetNode = data.targetData.node;\n\n if (commandKey && parentData.config.multiDrag) {\n if (state.selectedState) {\n const idx = state.selectedState.nodes.findIndex(\n (x) => x.el === targetNode.el\n );\n\n if (idx === -1) {\n selectedNodes = [...state.selectedState.nodes, targetNode];\n } else {\n selectedNodes = state.selectedState.nodes.filter(\n (x) => x.el !== targetNode.el\n );\n }\n } else {\n selectedNodes = [targetNode];\n }\n\n setSelected(\n data.targetData.parent,\n selectedNodes,\n data.targetData.node,\n state,\n true\n );\n\n return;\n }\n\n if (shiftKey && parentData.config.multiDrag) {\n const nodes = data.targetData.parent.data.enabledNodes;\n\n if (state.selectedState && state.activeState) {\n if (state.selectedState.parent.el !== data.targetData.parent.el) {\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n state.selectedState = undefined;\n\n for (let x = 0; x <= targetNode.data.index; x++)\n selectedNodes.push(nodes[x]);\n } else {\n const [minIndex, maxIndex] =\n state.activeState.node.data.index < data.targetData.node.data.index\n ? [\n state.activeState.node.data.index,\n data.targetData.node.data.index,\n ]\n : [\n data.targetData.node.data.index,\n state.activeState.node.data.index,\n ];\n\n selectedNodes = nodes.slice(minIndex, maxIndex + 1);\n }\n } else {\n for (let x = 0; x <= targetNode.data.index; x++)\n selectedNodes.push(nodes[x]);\n }\n\n setSelected(\n data.targetData.parent,\n selectedNodes,\n data.targetData.node,\n state,\n true\n );\n\n return;\n }\n\n if (state.selectedState?.nodes?.length) {\n const idx = state.selectedState.nodes.findIndex(\n (x) => x.el === data.targetData.node.el\n );\n\n if (idx === -1) {\n if (state.selectedState.parent.el !== data.targetData.parent.el) {\n deselect(state.selectedState.nodes, data.targetData.parent, state);\n } else if (parentData.config.multiDrag && isMobilePlatform()) {\n selectedNodes.push(...state.selectedState.nodes);\n } else {\n deselect(state.selectedState.nodes, data.targetData.parent, state);\n }\n\n setSelected(\n data.targetData.parent,\n selectedNodes,\n data.targetData.node,\n state,\n true\n );\n }\n } else {\n setSelected(\n data.targetData.parent,\n [data.targetData.node],\n data.targetData.node,\n state,\n true\n );\n }\n}\n\n/**\n * Add dragstart classes to the nodes.\n *\n * @param node - The node.\n * @param nodes - The nodes.\n * @param config - The parent config.\n * @param isSynth - Whether the drag is synthetic.\n *\n * @returns void\n */\nexport function dragstartClasses(\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.selectedClass\n );\n });\n}\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 data.e.dataTransfer.effectAllowed = config.dragEffectAllowed;\n\n let dragImage: HTMLElement | undefined;\n\n data.e.dataTransfer.setData(\"text/plain\", \"\");\n\n if (config.dragImage) {\n dragImage = config.dragImage(data, draggedNodes);\n } else {\n if (!config.multiDrag || draggedNodes.length === 1) {\n data.targetData.node.el.style.zIndex = \"9999\";\n data.targetData.node.el.style.boxSizing = \"border-box\";\n\n data.e.dataTransfer.setDragImage(\n data.targetData.node.el,\n data.e.offsetX,\n data.e.offsetY\n );\n\n dragState.originalZIndex = data.targetData.node.el.style.zIndex;\n\n return dragState;\n } else {\n const wrapper = document.createElement(\"div\");\n\n wrapper.setAttribute(\"id\", \"dnd-dragged-node-clone\");\n\n wrapper.setAttribute(\"popover\", \"manual\");\n\n for (const node of draggedNodes) {\n const clone = node.el.cloneNode(true) as HTMLElement;\n\n clone.id = node.el.id + \"-clone\";\n\n clone.style.pointerEvents = \"none\";\n\n wrapper.appendChild(clone);\n }\n\n const { width } = draggedNodes[0].el.getBoundingClientRect();\n\n Object.assign(wrapper.style, {\n display: \"flex\",\n flexDirection: \"column\",\n width: `${width}px`,\n position: \"absolute\",\n pointerEvents: \"none\",\n zIndex: \"9999\",\n left: \"-9999px\",\n boxSizing: \"border-box\",\n background: \"transparent\",\n overflow: \"hidden\",\n });\n\n data.targetData.parent.el.appendChild(wrapper);\n\n wrapper.showPopover();\n\n wrapper.getBoundingClientRect(); // ← forces layout\n\n dragImage = wrapper;\n\n data.e.dataTransfer.setDragImage(\n dragImage,\n data.e.offsetX,\n data.e.offsetY\n );\n }\n }\n\n setTimeout(() => {\n dragImage?.remove();\n });\n }\n\n return dragState;\n}\n\nexport function validateDragHandle({\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\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\nexport function handleNodeFocus(data: NodeEventData) {\n if (data.e.target === data.e.currentTarget) return;\n\n if (state.pointerDown) state.pointerDown.node.el.draggable = false;\n}\n\nexport function handleNodeBlur(data: NodeEventData) {\n if (data.e.target === data.e.currentTarget) return;\n\n if (state.pointerDown) state.pointerDown.node.el.draggable = true;\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\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 = true;\n\n // --- Capture necessary data BEFORE resetState might affect it ---\n const nodesToClean = state.draggedNodes.map((x) => x.el);\n const initialParentData = state.initialParent.data;\n const isSynth = isSynthDragState(state);\n const config = parents.get(state.initialParent.el)?.config;\n const dropZoneClass = isSynth\n ? config?.synthDropZoneClass\n : config?.dropZoneClass;\n const longPressClass = initialParentData?.config?.longPressClass;\n const placeholderClass = isSynth\n ? initialParentData?.config?.synthDragPlaceholderClass // Corrected potential typo: used initialParentData\n : initialParentData?.config?.dragPlaceholderClass;\n const originalZIndex = state.originalZIndex;\n // --- End data capture ---\n\n if (isSynthDragState(state)) {\n // Ensure cloned node removal happens reasonably quickly\n if (state.clonedDraggedNode) {\n // Check if it exists\n state.clonedDraggedNode.remove();\n }\n if (state.longPressTimeout) {\n // Check if timeout exists\n clearTimeout(state.longPressTimeout);\n }\n }\n\n // Ensure scrolling is properly cancelled (needs state, do before reset)\n cancelSynthScroll(state);\n\n // Clear any lingering scroll directions and timeouts (needs state, do before reset)\n state.lastScrollDirectionX = undefined;\n state.lastScrollDirectionY = undefined;\n state.preventEnter = false;\n if (state.scrollDebounceTimeout) {\n clearTimeout(state.scrollDebounceTimeout);\n state.scrollDebounceTimeout = undefined; // Ensure it's marked as cleared\n }\n\n // Apply z-index change synchronously if needed\n if (originalZIndex !== undefined && state.draggedNode) {\n state.draggedNode.el.style.zIndex = originalZIndex;\n }\n\n // Use single rAF with captured data for class removal\n requestAnimationFrame(() => {\n // Use the captured data, not the potentially reset global state\n removeClass(nodesToClean, dropZoneClass);\n removeClass(nodesToClean, longPressClass);\n removeClass(nodesToClean, placeholderClass);\n });\n\n // Deselect and reset active state (needs state, do before reset)\n deselect(state.draggedNodes, state.currentParent, state);\n setActive(state.currentParent, undefined, state);\n\n // Prepare data for callback/event *before* resetState\n const finalStateForCallback = { ...state }; // Shallow copy for safety\n\n // Call onDragend callback *before* resetState\n config?.onDragend?.({\n parent: finalStateForCallback.currentParent,\n values: parentValues(\n finalStateForCallback.currentParent.el,\n finalStateForCallback.currentParent.data\n ),\n draggedNode: finalStateForCallback.draggedNode,\n draggedNodes: finalStateForCallback.draggedNodes,\n state: finalStateForCallback,\n });\n\n // Emit event *before* resetState\n state.emit(\"dragEnded\", finalStateForCallback); // Emit with the final state representation\n\n // Reset global state LAST\n resetState();\n\n // No need to set state.selectedState = undefined; resetState handles it.\n}\n\n/**\n * Handle the node pointer up.\n *\n * @param data - The node pointer event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleNodePointerup(\n data: NodePointerEventData,\n state: DragState | SynthDragState | BaseDragState\n) {\n sp(data.e);\n\n if (!state.pointerSelection && state.selectedState)\n deselect(state.selectedState.nodes, data.targetData.parent, state);\n\n const config = data.targetData.parent.data.config;\n\n state.pointerSelection = false;\n\n if (\"longPressTimeout\" in state && state.longPressTimeout)\n clearTimeout(state.longPressTimeout);\n\n state.longPress = false;\n\n removeClass(\n data.targetData.parent.data.enabledNodes.map((x) => x.el),\n config.longPressClass\n );\n\n 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 * @param rect - The bounding rect of the original element\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 rect: DOMRect\n): SynthDragState {\n const config = parent.data.config;\n\n let dragImage: HTMLElement;\n\n let result:\n | { dragImage: HTMLElement; offsetX?: number; offsetY?: number }\n | undefined;\n\n const criticalStyleProps = [\n \"display\",\n \"flexDirection\",\n \"alignItems\",\n \"justifyContent\",\n \"padding\",\n \"paddingTop\",\n \"margin\",\n \"marginTop\",\n \"marginBottom\",\n \"marginLeft\",\n \"marginRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"paddingRight\",\n \"border\",\n \"borderRadius\",\n \"background\",\n \"backgroundColor\",\n \"boxShadow\",\n \"font\",\n \"color\",\n \"lineHeight\",\n \"gap\",\n \"width\",\n \"height\",\n \"boxSizing\",\n \"overflow\",\n ] as const;\n\n const copyCriticalStyles = (src: HTMLElement, dest: HTMLElement) => {\n const computed = window.getComputedStyle(src);\n criticalStyleProps.forEach((prop) => {\n dest.style[prop] = computed[prop]!;\n });\n };\n\n // Helper to style the drag image\n const applyBaseStyles = (\n el: HTMLElement,\n extraStyles: Partial = {}\n ) => {\n Object.assign(el.style, {\n position: \"absolute\",\n zIndex: \"9999\",\n pointerEvents: \"none\",\n willChange: \"transform\",\n boxSizing: \"border-box\",\n opacity: \"0\",\n overflow: \"hidden\",\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n ...extraStyles,\n });\n };\n\n // Custom drag image\n if (config.synthDragImage) {\n result = config.synthDragImage(node, parent, e, draggedNodes);\n dragImage = result.dragImage;\n dragImage.setAttribute(\"popover\", \"manual\");\n applyBaseStyles(dragImage);\n }\n\n // Single drag\n else if (!config.multiDrag || draggedNodes.length === 1) {\n dragImage = node.el.cloneNode(true) as HTMLElement;\n copyCriticalStyles(node.el as HTMLElement, dragImage);\n dragImage.setAttribute(\"popover\", \"manual\");\n applyBaseStyles(dragImage);\n }\n\n // Multi-drag\n else {\n const wrapper = document.createElement(\"div\");\n\n wrapper.setAttribute(\"popover\", \"manual\");\n\n draggedNodes.forEach((dragged) => {\n const clone = dragged.el.cloneNode(true) as HTMLElement;\n\n copyCriticalStyles(dragged.el as HTMLElement, clone);\n\n clone.style.pointerEvents = \"none\";\n\n clone.style.margin = \"0\";\n\n wrapper.append(clone);\n });\n\n wrapper.style.display = \"flex\";\n wrapper.style.flexDirection = \"column\";\n wrapper.style.padding = \"0\";\n wrapper.style.margin = \"0\";\n wrapper.style.position = \"absolute\";\n wrapper.style.zIndex = \"9999\";\n wrapper.style.pointerEvents = \"none\";\n\n dragImage = wrapper;\n }\n\n dragImage.id = \"dnd-dragged-node-clone\";\n\n parent.el.appendChild(dragImage);\n\n dragImage.showPopover();\n\n const synthDragStateProps = {\n clonedDraggedEls: [],\n clonedDraggedNode: dragImage,\n synthDragScrolling: false,\n synthDragging: true,\n rootScrollWidth: document.scrollingElement?.scrollWidth,\n rootScrollHeight: document.scrollingElement?.scrollHeight,\n };\n\n const synthDragState = setDragState({\n ...dragStateProps(\n node,\n parent,\n e,\n draggedNodes,\n result?.offsetX,\n result?.offsetY\n ),\n ...synthDragStateProps,\n }) as SynthDragState;\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 state.longPressTimeout = setTimeout(() => {\n if (!state) return;\n\n state.longPress = true;\n\n if (config.longPressClass && data.e.cancelable)\n addNodeClass([node.el], config.longPressClass);\n\n pd(data.e);\n }, config.longPressDuration || 1000);\n}\n\nfunction cancelSynthScroll(\n state: DragState,\n cancelX = true,\n cancelY = true\n) {\n if (cancelX) {\n if (state.frameIdX !== undefined) {\n cancelAnimationFrame(state.frameIdX);\n state.frameIdX = undefined;\n }\n state.lastScrollDirectionX = undefined;\n }\n\n if (cancelY) {\n if (state.frameIdY !== undefined) {\n cancelAnimationFrame(state.frameIdY);\n state.frameIdY = undefined;\n }\n state.lastScrollDirectionY = undefined;\n }\n\n if (!state.frameIdX && !state.frameIdY) {\n state.preventEnter = false;\n }\n}\n\nfunction moveNode(state: SynthDragState, justStarted = false) {\n const { x, y } = state.coordinates;\n\n const startLeft = state.startLeft ?? 0;\n const startTop = state.startTop ?? 0;\n\n const currentScrollX = window.scrollX ?? 0;\n const currentScrollY = window.scrollY ?? 0;\n\n const translateX = x - startLeft + currentScrollX;\n const translateY = y - startTop + currentScrollY;\n\n state.clonedDraggedNode.style.transform = `translate3d(${translateX}px, ${translateY}px, 0px)`;\n\n if (justStarted) {\n state.clonedDraggedNode.style.opacity = \"1\";\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n state.initialParent.data.config?.longPressClass\n );\n }\n}\n\nexport function synthMove(\n e: PointerEvent,\n state: SynthDragState,\n justStarted = false\n) {\n const coordinates = eventCoordinates(e);\n state.coordinates.x = coordinates.x;\n state.coordinates.y = coordinates.y;\n\n moveNode(state, justStarted); // Pass only state now\n\n // Clear any existing timeout to avoid multiple concurrent timeouts\n if (state.scrollDebounceTimeout) {\n clearTimeout(state.scrollDebounceTimeout);\n state.scrollDebounceTimeout = undefined;\n }\n\n // Only set a new timeout if we're still in a valid drag state\n state.scrollDebounceTimeout = setTimeout(() => {\n // Only process if the drag state is still active\n if (isSynthDragState(state)) {\n handleSynthScroll(state.coordinates, e, state);\n }\n }, 16); // ~1 frame (60fps)\n\n const elFromPoint = getElFromPoint(coordinates);\n\n if (!elFromPoint) {\n document.dispatchEvent(\n new CustomEvent(\"handleRootPointerover\", {\n detail: {\n e,\n state,\n },\n })\n );\n\n return;\n }\n\n const pointerMoveEventData = {\n e,\n targetData: elFromPoint,\n state,\n };\n\n if (\"node\" in elFromPoint) {\n elFromPoint.node.el.dispatchEvent(\n new CustomEvent(\"handleNodePointerover\", {\n detail: pointerMoveEventData,\n })\n );\n } else {\n elFromPoint.parent.el.dispatchEvent(\n new CustomEvent(\"handleParentPointerover\", {\n detail: pointerMoveEventData,\n })\n );\n }\n}\n\n/**\n * Handle the node drag over.\n *\n * @param data - The node drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleNodeDragover(\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 if (isDragState(state)) {\n handleSynthScroll({ x, y }, data.e, state);\n }\n\n data.targetData.parent.el === state.currentParent?.el\n ? sort(data, state)\n : transfer(data, state);\n}\n\n/**\n * Handle the parent drag over.\n *\n * @param data - The parent drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleParentDragover(\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 const { x, y } = eventCoordinates(data.e);\n\n if (isDragState(state)) {\n handleSynthScroll({ x, y }, data.e, state);\n }\n\n transfer(data, state);\n}\n\n/**\n * Handle the parent pointer over.\n *\n * @param e - The parent pointer over event.\n *\n * @returns void\n */\nexport function handleParentPointerover(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)) {\n return;\n }\n\n const range =\n state.draggedNode.data.index > data.targetData.node.data.index\n ? [data.targetData.node.data.index, state.draggedNode.data.index]\n : [state.draggedNode.data.index, data.targetData.node.data.index];\n\n state.targetIndex = data.targetData.node.data.index;\n\n state.affectedNodes = data.targetData.parent.data.enabledNodes.filter(\n (node) => {\n return (\n range[0] <= node.data.index &&\n node.data.index <= range[1] &&\n node.el !== state.draggedNode.el\n );\n }\n );\n\n data.targetData.parent.data.config.performSort({\n parent: data.targetData.parent,\n draggedNodes: state.draggedNodes,\n targetNodes: [data.targetData.node],\n });\n}\n\n/**\n * Event listener used for all nodes.\n *\n * @param e - The event.\n *\n */\nexport function nodeEventData(\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 pd(data.e);\n\n if (\n !validateTransfer({\n currentParent: state.currentParent,\n targetParent: data.targetData.parent as any,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n state,\n })\n )\n return;\n\n data.targetData.parent.data.config.performTransfer({\n currentParent: state.currentParent,\n targetParent: data.targetData.parent,\n initialParent: state.initialParent,\n draggedNodes: state.draggedNodes,\n initialIndex: state.initialIndex,\n state,\n targetNodes: \"node\" in data.targetData ? [data.targetData.node] : [],\n });\n\n state.currentParent = data.targetData.parent;\n\n state.transferred = true;\n}\n\n/**\n * Event listener used for all parents.\n *\n * @param callback - The callback.\n *\n * @returns A function to get the parent event data.\n */\nexport function parentEventData(\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 (!data) {\n el.classList.add(...classNames);\n return;\n }\n // Revert to original logic: Initialize privateClasses as empty for this call.\n const privateClasses = [];\n\n for (const currentClassName of classNames) {\n if (!el.classList.contains(currentClassName)) {\n el.classList.add(currentClassName);\n } else if (\n // Only add to privateClasses if the element already had the class\n // AND omitAppendPrivateClass is specifically false for THIS call.\n el.classList.contains(currentClassName) &&\n omitAppendPrivateClass === false\n ) {\n privateClasses.push(currentClassName);\n }\n }\n // Assign the newly computed privateClasses, overwriting any previous value.\n data.privateClasses = privateClasses;\n return data;\n}\n\n/**\n * Remove class from the nodes.\n *\n * @param els - The nodes.\n * @param className - The class name.\n *\n * @returns void\n */\nexport function removeClass(\n els: Array,\n className: string | undefined\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n for (const node of els) {\n if (!isNode(node)) {\n node.classList.remove(...classNames);\n continue;\n }\n\n const nodeData = nodes.get(node) || parents.get(node);\n\n if (!nodeData) continue;\n\n for (const className of classNames) {\n if (!nodeData.privateClasses.includes(className)) {\n node.classList.remove(className);\n }\n }\n }\n}\n\ntype ScrollDirection = { axis: \"x\"; state: DragState } | { axis: \"y\" };\n\nfunction getScrollDirection(\n el: HTMLElement,\n e: PointerEvent | DragEvent,\n style: CSSStyleDeclaration,\n rect: DOMRect,\n opts: ScrollDirection\n): Record {\n const threshold = 0.075;\n\n const isX = opts.axis === \"x\";\n const isRoot = el === document.scrollingElement;\n const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\n const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\n const offsetProp = isX ? \"offsetWidth\" : \"offsetHeight\";\n const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\n const clientCoord = isX ? e.clientX : e.clientY;\n const rectStart = isX ? rect.left : rect.top;\n const overflow = isX ? style.overflowX : style.overflowY;\n\n if (isRoot) {\n const scrollPos = el[scrollProp];\n const clientSize = el[sizeProp];\n const canScrollBefore = scrollPos > 0;\n const canScrollAfter =\n scrollPos + clientSize <\n (isX\n ? (opts.state as SynthDragState).rootScrollWidth || 0\n : el[scrollSizeProp]);\n\n return isX\n ? {\n left: canScrollBefore && clientCoord < clientSize * threshold,\n right: canScrollAfter && clientCoord > clientSize * (1 - threshold),\n }\n : {\n up: canScrollBefore && clientCoord < clientSize * threshold,\n down: canScrollAfter && clientCoord > clientSize * (1 - threshold),\n };\n }\n\n if (\n (overflow === \"auto\" || overflow === \"scroll\") &&\n el !== document.body &&\n el !== document.documentElement\n ) {\n const scrollSize = el[scrollSizeProp];\n const offsetSize = el[offsetProp];\n const scrollPos = el[scrollProp];\n\n const canScrollBefore = scrollPos > 0;\n const canScrollAfter = scrollPos < scrollSize - offsetSize;\n\n return isX\n ? {\n left:\n canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\n right:\n canScrollAfter &&\n clientCoord > rectStart + offsetSize * (1 - threshold),\n }\n : {\n up:\n canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\n down:\n canScrollAfter &&\n clientCoord > rectStart + offsetSize * (1 - threshold),\n };\n }\n\n return isX ? { left: false, right: false } : { up: false, down: false };\n}\n\ntype Axis = \"x\" | \"y\";\n\nfunction scrollAxis(\n el: HTMLElement,\n _e: PointerEvent | DragEvent,\n state: DragState,\n options: {\n axis: Axis;\n direction: \"positive\" | \"negative\";\n }\n) {\n // Check if this is a stale call from a previous state\n if (!isDragState(state) || !state.draggedNode) {\n return; // State has been reset or is no longer in a drag state\n }\n\n state.preventEnter = true;\n\n const isX = options.axis === \"x\";\n const dirFactor = options.direction === \"positive\" ? 1 : -1;\n const speed = 20;\n\n const key = isX ? \"lastScrollDirectionX\" : \"lastScrollDirectionY\";\n const idKey = isX ? \"frameIdX\" : \"frameIdY\";\n\n // Cancel any existing animation first, regardless of direction\n if (state[idKey] !== undefined) {\n cancelAnimationFrame(state[idKey]!);\n state[idKey] = undefined;\n }\n\n state[key] = options.direction;\n\n const scrollLoop = () => {\n // Check again if state is still valid\n if (!isDragState(state) || !state.draggedNode) {\n if (state[idKey] !== undefined) {\n cancelAnimationFrame(state[idKey]!);\n state[idKey] = undefined;\n }\n return;\n }\n\n const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\n const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\n const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\n\n const scrollPos = el[scrollProp];\n const clientSize = el[sizeProp];\n const scrollSize = el[scrollSizeProp];\n\n const canScroll =\n dirFactor > 0 ? scrollPos + clientSize < scrollSize : scrollPos > 0;\n\n if (!canScroll) {\n state[idKey] = undefined;\n state[key] = undefined;\n return;\n }\n\n el[scrollProp] += speed * dirFactor;\n\n if (isSynthDragState(state)) {\n moveNode(state);\n }\n\n state[idKey] = requestAnimationFrame(scrollLoop);\n };\n\n state[idKey] = requestAnimationFrame(scrollLoop);\n}\n\nfunction isPointerInside(el: HTMLElement, x: number, y: number): boolean {\n const rect = el.getBoundingClientRect();\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n}\n\nfunction handleSynthScroll(\n coordinates: { x: number; y: number },\n e: PointerEvent | DragEvent,\n state: DragState\n) {\n // First check if this is a stale call from a previous state\n if (!isDragState(state) || !state.draggedNode) {\n return; // State has been reset or is no longer in a drag state\n }\n\n cancelSynthScroll(state);\n\n const { x, y } = coordinates;\n\n let scrolled = false;\n\n const attemptScroll = (\n axis: \"x\" | \"y\",\n direction: \"positive\" | \"negative\",\n container: HTMLElement\n ) => {\n scrollAxis(container, e, state, { axis, direction });\n scrolled = true;\n };\n\n const checkAndScroll = (el: HTMLElement) => {\n const style = window.getComputedStyle(el);\n const rect = el.getBoundingClientRect();\n\n const xResult = getScrollDirection(el, e, style, rect, {\n axis: \"x\",\n state,\n });\n\n const yResult = getScrollDirection(el, e, style, rect, { axis: \"y\" });\n\n if (xResult.left || xResult.right) {\n state.lastScrollContainerX = el;\n attemptScroll(\"x\", xResult.right ? \"positive\" : \"negative\", el);\n }\n\n if (yResult.up || yResult.down) {\n state.lastScrollContainerY = el;\n attemptScroll(\"y\", yResult.down ? \"positive\" : \"negative\", el);\n }\n };\n\n if (\n state.lastScrollContainerX &&\n isPointerInside(state.lastScrollContainerX, x, y)\n ) {\n checkAndScroll(state.lastScrollContainerX);\n }\n\n if (\n !scrolled &&\n state.lastScrollContainerY &&\n isPointerInside(state.lastScrollContainerY, x, y)\n ) {\n checkAndScroll(state.lastScrollContainerY);\n }\n\n if (!scrolled) {\n let el = document.elementFromPoint(x, y);\n while (\n el &&\n !(scrolled && state.lastScrollContainerX && state.lastScrollContainerY)\n ) {\n if (el instanceof HTMLElement) {\n checkAndScroll(el);\n }\n el = el.parentElement;\n }\n }\n\n if (!scrolled) {\n const root = document.scrollingElement;\n if (root instanceof HTMLElement) {\n checkAndScroll(root);\n }\n }\n\n if (!scrolled) cancelSynthScroll(state);\n}\n\nexport function getElFromPoint(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 capture: eventName === \"focus\" || eventName === \"blur\",\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","handleEnd","nodes","emit","on","handleNodeDragover","handleParentDragover","handleNodePointerover","handleParentPointerover","draggedNodes","state","parent","x","scrollTimeout","className"]} \ 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":["/**\r\n * Function to prevent default behavior of an event.\r\n *\r\n * @param {Event} e - The event to prevent default behavior of.\r\n */\r\nexport function pd(e: Event) {\r\n e.preventDefault();\r\n}\r\n\r\n/**\r\n * Function to stop propagation of an event.\r\n *\r\n * @param {Event} e - The event to stop propagation of.\r\n */\r\nexport function sp(e: Event) {\r\n e.stopPropagation();\r\n}\r\n\r\n/**\r\n * Function to get the bounding client rect of an element.\r\n *\r\n * @param {HTMLElement} el - The element to get the bounding client rect of.\r\n *\r\n * @returns {ClientRect} The bounding client rect of the element.\r\n */\r\nexport function rect(el: HTMLElement): ClientRect {\r\n return el.getBoundingClientRect();\r\n}\r\n\r\n/**\r\n * Function to create an emitter.\r\n *\r\n * @returns {[Function, Function]} A tuple containing emit and on functions\r\n */\r\nexport function createEmitter() {\r\n const callbacks = new Map void>>();\r\n\r\n const emit = function (eventName: string, data: T) {\r\n if (!callbacks.get(eventName)) return;\r\n\r\n callbacks.get(eventName)!.forEach((cb) => {\r\n cb(data);\r\n });\r\n };\r\n\r\n const on = function (eventName: string, callback: (data: T) => void) {\r\n const cbs = callbacks.get(eventName) ?? [];\r\n\r\n cbs.push(callback);\r\n\r\n callbacks.set(eventName, cbs);\r\n };\r\n\r\n return [emit, on] as const;\r\n}\r\n\r\n/**\r\n * The emit and on functions for drag and drop.\r\n *\r\n * @type {[Function, Function]}\r\n */\r\nexport const [emit, on] = createEmitter();\r\n\r\n/**\r\n * A regular expression to test for a valid date string.\r\n *\r\n * @param x - A RegExp to compare.\r\n * @param y - A RegExp to compare.\r\n * @public\r\n */\r\nexport function eqRegExp(x: RegExp, y: RegExp): boolean {\r\n return (\r\n x.source === y.source &&\r\n x.flags.split(\"\").sort().join(\"\") === y.flags.split(\"\").sort().join(\"\")\r\n );\r\n}\r\n\r\n/**\r\n * Compare two values for equality, optionally at depth.\r\n *\r\n * @param valA - First value.\r\n * @param valB - Second value.\r\n * @param deep - If it will compare deeply if it's an object.\r\n * @param explicit - An array of keys to explicity check.\r\n *\r\n * @returns `boolean`\r\n *\r\n * @public\r\n */\r\nexport function eq(\r\n valA: unknown,\r\n valB: unknown,\r\n deep = true,\r\n explicit: string[] = [\"__key\"]\r\n): boolean {\r\n if (valA === valB) return true;\r\n\r\n if (\r\n typeof valB === \"object\" &&\r\n typeof valA === \"object\" &&\r\n valA !== null &&\r\n valB !== null\r\n ) {\r\n if (valA instanceof Map) return false;\r\n if (valA instanceof Set) return false;\r\n if (valA instanceof Date && valB instanceof Date)\r\n return valA.getTime() === valB.getTime();\r\n if (valA instanceof RegExp && valB instanceof RegExp)\r\n return eqRegExp(valA, valB);\r\n if (valA === null || valB === null) return false;\r\n\r\n const objA = valA as Record;\r\n const objB = valB as Record;\r\n\r\n if (Object.keys(objA).length !== Object.keys(objB).length) return false;\r\n\r\n for (const k of explicit) {\r\n if ((k in objA || k in objB) && objA[k] !== objB[k]) return false;\r\n }\r\n\r\n for (const key in objA) {\r\n if (!(key in objB)) return false;\r\n if (objA[key] !== objB[key] && !deep) return false;\r\n if (deep && !eq(objA[key], objB[key], deep, explicit)) return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Split a class name into an array of class names.\r\n *\r\n * @param className - The class name to split.\r\n *\r\n * @returns An array of class names.\r\n */\r\nexport function splitClass(className: string): Array {\r\n return className.split(\" \").filter((x) => x);\r\n}\r\n\r\nexport function getRealCoords(el: HTMLElement): {\r\n top: number;\r\n bottom: number;\r\n left: number;\r\n right: number;\r\n height: number;\r\n width: number;\r\n} {\r\n const { top, bottom, left, right, height, width } =\r\n el.getBoundingClientRect();\r\n\r\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\r\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\r\n\r\n return {\r\n top: top + scrollTop,\r\n bottom: bottom + scrollTop,\r\n left: left + scrollLeft,\r\n right: right + scrollLeft,\r\n height,\r\n width,\r\n };\r\n}\r\n\r\nexport function eventCoordinates(data: DragEvent | PointerEvent) {\r\n return { x: data.clientX, y: data.clientY };\r\n}\r\n","import type { SetupNodeData, Node } from \"../../types\";\r\nimport type { AnimationsConfig } from \"./types\";\r\nimport { state, parents, isDragState } from \"../../index\";\r\n\r\nexport function animations(animationsConfig: Partial = {}) {\r\n const slideUp = [\r\n {\r\n transform: `translateY(${animationsConfig.yScale || 50}%)`,\r\n },\r\n {\r\n transform: `translateY(${animationsConfig.yScale || 0}%)`,\r\n },\r\n ];\r\n\r\n const slideDown = [\r\n {\r\n transform: `translateY(-${animationsConfig.yScale || 50}%)`,\r\n },\r\n {\r\n transform: `translateY(${animationsConfig.yScale || 0}%)`,\r\n },\r\n ];\r\n\r\n const slideLeft = [\r\n {\r\n transform: `translateX(${animationsConfig.xScale || 50}%)`,\r\n },\r\n {\r\n transform: `translateX(${animationsConfig.xScale || 0}%)`,\r\n },\r\n ];\r\n\r\n const slideRight = [\r\n {\r\n transform: `translateX(-${animationsConfig.xScale || 50}%)`,\r\n },\r\n {\r\n transform: `translateX(${animationsConfig.xScale || 0}%)`,\r\n },\r\n ];\r\n return (parent: HTMLElement) => {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n return {\r\n setup() {\r\n if (document.head.querySelector(\"[data-drag-and-drop]\")) return;\r\n },\r\n\r\n setupNodeRemap(data: SetupNodeData) {\r\n if (!isDragState(state)) return;\r\n\r\n const duration = animationsConfig.duration || 150;\r\n\r\n if (data.node.data.value === state.draggedNode.data.value) {\r\n switch (state.incomingDirection) {\r\n case \"below\":\r\n animate(data.node.el, slideUp, duration);\r\n\r\n break;\r\n case \"above\":\r\n animate(data.node.el, slideDown, duration);\r\n\r\n break;\r\n case \"left\":\r\n animate(data.node.el, slideRight, duration);\r\n\r\n break;\r\n case \"right\":\r\n animate(data.node.el, slideLeft, duration);\r\n\r\n break;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (\r\n !state.affectedNodes\r\n .map((x) => x.data.value)\r\n .includes(data.node.data.value)\r\n )\r\n return;\r\n\r\n const nodeRect = data.node.el.getBoundingClientRect();\r\n\r\n const nodeIndex = state.affectedNodes.findIndex(\r\n (x) => x.data.value === data.node.data.value\r\n );\r\n\r\n const draggedNodeIndex = state.draggedNode.data.index;\r\n\r\n const ascendingDirection = draggedNodeIndex >= state.targetIndex;\r\n\r\n let adjacentNode;\r\n\r\n if (ascendingDirection) {\r\n adjacentNode = state.affectedNodes[nodeIndex + 1]\r\n ? state.affectedNodes[nodeIndex + 1]\r\n : state.affectedNodes[nodeIndex - 1];\r\n } else {\r\n adjacentNode = state.affectedNodes[nodeIndex - 1]\r\n ? state.affectedNodes[nodeIndex - 1]\r\n : state.affectedNodes[nodeIndex + 1];\r\n }\r\n\r\n if (adjacentNode) {\r\n const xDiff = Math.abs(\r\n nodeRect.x - adjacentNode.el.getBoundingClientRect().x\r\n );\r\n\r\n const yDiff = Math.abs(\r\n nodeRect.y - adjacentNode.el.getBoundingClientRect().y\r\n );\r\n\r\n if (xDiff > yDiff && ascendingDirection) {\r\n animate(data.node.el, slideRight, duration);\r\n } else if (xDiff > yDiff && !ascendingDirection) {\r\n animate(data.node.el, slideLeft, duration);\r\n }\r\n } else {\r\n switch (state.incomingDirection) {\r\n case \"below\":\r\n animate(data.node.el, slideDown, duration);\r\n\r\n break;\r\n case \"above\":\r\n animate(data.node.el, slideUp, duration);\r\n\r\n break;\r\n case \"left\":\r\n animate(data.node.el, slideLeft, duration);\r\n\r\n break;\r\n case \"right\":\r\n animate(data.node.el, slideRight, duration);\r\n\r\n break;\r\n }\r\n }\r\n },\r\n };\r\n };\r\n}\r\n\r\nfunction animate(\r\n node: Node,\r\n animation: Keyframe[] | PropertyIndexedKeyframes,\r\n duration: number\r\n) {\r\n if (!state) return;\r\n\r\n state.preventEnter = true;\r\n\r\n node.animate(animation, {\r\n duration: duration,\r\n easing: \"ease-in-out\",\r\n });\r\n\r\n setTimeout(() => {\r\n if (!state) return;\r\n\r\n state.preventEnter = false;\r\n }, duration);\r\n}\r\n","import type { InsertConfig } from \"../../types\";\r\nimport type {\r\n DragState,\r\n NodeDragEventData,\r\n NodeRecord,\r\n ParentEventData,\r\n PointeroverParentEvent,\r\n ParentRecord,\r\n SynthDragState,\r\n InsertEvent,\r\n BaseDragState,\r\n InsertState,\r\n Coordinates,\r\n Node,\r\n} from \"../../types\";\r\n\r\nimport {\r\n parents,\r\n parentValues,\r\n setParentValues,\r\n state,\r\n addParentClass,\r\n isDragState,\r\n isSynthDragState,\r\n removeClass,\r\n addEvents,\r\n remapNodes,\r\n nodes,\r\n} from \"../../index\";\r\n\r\nimport { eq, pd, eventCoordinates } from \"../../utils\";\r\n\r\nexport const insertState: InsertState = {\r\n draggedOverNodes: [],\r\n draggedOverParent: null,\r\n targetIndex: 0,\r\n ascending: false,\r\n insertPoint: null,\r\n dragging: false,\r\n};\r\n\r\nlet documentController: AbortController | undefined;\r\n\r\n// WIP: This is a work in progress and not yet fully functional\r\nexport function insert(insertConfig: InsertConfig) {\r\n return (parent: HTMLElement) => {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n const insertParentConfig = {\r\n ...parentData.config,\r\n insertConfig,\r\n };\r\n\r\n return {\r\n teardown() {\r\n if (parentData.abortControllers.root) {\r\n parentData.abortControllers.root.abort();\r\n }\r\n },\r\n setup() {\r\n insertParentConfig.handleNodeDragover =\r\n insertConfig.handleNodeDragover || handleNodeDragover;\r\n\r\n insertParentConfig.handleParentPointerover =\r\n insertConfig.handleParentPointerover || handleParentPointerover;\r\n\r\n insertParentConfig.handleNodePointerover =\r\n insertConfig.handleNodePointerover || handleParentPointerover;\r\n\r\n insertParentConfig.handleParentDragover =\r\n insertConfig.handleParentDragover || handleParentDragover;\r\n\r\n const originalHandleend = insertParentConfig.handleEnd;\r\n\r\n insertParentConfig.handleEnd = (\r\n state: DragState | SynthDragState\r\n ) => {\r\n handleEnd(state);\r\n\r\n originalHandleend(state);\r\n };\r\n\r\n parentData.on(\"dragStarted\", () => {\r\n documentController = addEvents(document, {\r\n dragover: checkPosition,\r\n pointermove: checkPosition,\r\n });\r\n });\r\n\r\n parentData.on(\"dragEnded\", () => {\r\n documentController?.abort();\r\n });\r\n\r\n parentData.config = insertParentConfig;\r\n\r\n state.on(\"dragStarted\", () => {\r\n defineRanges(parent);\r\n });\r\n\r\n state.on(\"scrollStarted\", () => {\r\n if (insertState.insertPoint)\r\n insertState.insertPoint.el.style.display = \"none\";\r\n });\r\n\r\n state.on(\"scrollEnded\", () => {\r\n defineRanges(parent);\r\n });\r\n\r\n const firstScrollableParent = findFirstOverflowingParent(parent);\r\n\r\n if (firstScrollableParent) {\r\n firstScrollableParent.addEventListener(\r\n \"scroll\",\r\n defineRanges.bind(null, parent)\r\n );\r\n }\r\n\r\n window.addEventListener(\"resize\", defineRanges.bind(null, parent));\r\n },\r\n };\r\n };\r\n}\r\n\r\nfunction findFirstOverflowingParent(element: HTMLElement): HTMLElement | null {\r\n let parent = element.parentElement;\r\n\r\n while (parent) {\r\n const { overflow, overflowY, overflowX } = getComputedStyle(parent);\r\n\r\n // Check if the overflow property is set to scroll, auto, or hidden (anything other than visible)\r\n const isOverflowSet =\r\n overflow !== \"visible\" ||\r\n overflowY !== \"visible\" ||\r\n overflowX !== \"visible\";\r\n\r\n // Check if there is actual overflow (scrolling)\r\n const isOverflowing =\r\n parent.scrollHeight > parent.clientHeight ||\r\n parent.scrollWidth > parent.clientWidth;\r\n const hasScrollPosition = parent.scrollTop > 0 || parent.scrollLeft > 0;\r\n\r\n if (isOverflowSet && (isOverflowing || hasScrollPosition)) {\r\n return parent;\r\n }\r\n\r\n parent = parent.parentElement;\r\n }\r\n\r\n return null; // No overflowing parent found\r\n}\r\n\r\nfunction checkPosition(e: DragEvent | PointerEvent) {\r\n if (!isDragState(state)) return;\r\n\r\n const el = document.elementFromPoint(e.clientX, e.clientY);\r\n\r\n // 1. If the element is not an HTMLElement or is the insert point itself, do nothing.\r\n if (!(el instanceof HTMLElement) || el === insertState.insertPoint?.el) {\r\n return;\r\n }\r\n\r\n // 2. Traverse up the DOM from the element under the cursor\r\n // to see if any ancestor is a registered parent.\r\n let isWithinAParent = false;\r\n let current: HTMLElement | null = el;\r\n while (current) {\r\n if (nodes.has(current as Node) || parents.has(current)) {\r\n isWithinAParent = true;\r\n break; // Found a registered parent ancestor\r\n }\r\n if (current === document.body) break; // Stop if we reach the body\r\n current = current.parentElement;\r\n }\r\n\r\n // 3. If the cursor is NOT within any registered parent...\r\n if (!isWithinAParent) {\r\n // Hide the insert point if it exists\r\n if (insertState.insertPoint) {\r\n insertState.insertPoint.el.style.display = \"none\";\r\n }\r\n\r\n // Remove drop zone class if a parent was previously being dragged over\r\n if (insertState.draggedOverParent) {\r\n removeClass(\r\n [insertState.draggedOverParent.el],\r\n insertState.draggedOverParent.data.config.dropZoneClass\r\n );\r\n }\r\n\r\n // Reset insert state related to dragged over elements\r\n insertState.draggedOverNodes = [];\r\n insertState.draggedOverParent = null;\r\n\r\n // Reset current parent in the main state back to the initial one\r\n state.currentParent = state.initialParent;\r\n }\r\n // 4. If the cursor IS within a registered parent, do nothing in this function.\r\n // Other event handlers will manage the insertion point positioning.\r\n}\r\n\r\ninterface Range {\r\n x: [number, number];\r\n y: [number, number];\r\n vertical: boolean;\r\n}\r\n\r\nfunction createVerticalRange(\r\n nodeCoords: Coordinates,\r\n otherCoords: Coordinates | undefined,\r\n isAscending: boolean\r\n): Range {\r\n const center = nodeCoords.top + nodeCoords.height / 2;\r\n\r\n if (!otherCoords) {\r\n const offset = nodeCoords.height / 2 + 10;\r\n return {\r\n y: isAscending ? [center, center + offset] : [center - offset, center],\r\n x: [nodeCoords.left, nodeCoords.right],\r\n vertical: true,\r\n };\r\n }\r\n\r\n const otherEdge = isAscending ? otherCoords.top : otherCoords.bottom;\r\n const nodeEdge = isAscending ? nodeCoords.bottom : nodeCoords.top;\r\n\r\n let midpoint: number;\r\n let range: [number, number];\r\n\r\n if (isAscending) {\r\n // Midpoint between current node's bottom and next node's top\r\n midpoint = nodeEdge + (otherEdge - nodeEdge) / 2; // nodeCoords.bottom + (otherCoords.top - nodeCoords.bottom) / 2\r\n range = [center, midpoint]; // Range from node center down to midpoint\r\n } else {\r\n // Midpoint between previous node's bottom and current node's top\r\n midpoint = otherEdge + (nodeEdge - otherEdge) / 2; // otherCoords.bottom + (nodeCoords.top - otherCoords.bottom) / 2\r\n range = [midpoint, center]; // Range from midpoint down to node center\r\n }\r\n\r\n return {\r\n y: range,\r\n x: [nodeCoords.left, nodeCoords.right],\r\n vertical: true,\r\n };\r\n}\r\n\r\nfunction createHorizontalRange(\r\n nodeCoords: Coordinates,\r\n otherCoords: Coordinates | undefined,\r\n isAscending: boolean,\r\n lastInRow = false\r\n): Range {\r\n const center = nodeCoords.left + nodeCoords.width / 2;\r\n\r\n if (!otherCoords) {\r\n if (isAscending) {\r\n return {\r\n x: [center, center + nodeCoords.width],\r\n y: [nodeCoords.top, nodeCoords.bottom],\r\n vertical: false,\r\n };\r\n } else {\r\n return {\r\n x: [nodeCoords.left - 10, center],\r\n y: [nodeCoords.top, nodeCoords.bottom],\r\n vertical: false,\r\n };\r\n }\r\n }\r\n\r\n if (isAscending && lastInRow) {\r\n return {\r\n x: [center, nodeCoords.right + 10],\r\n y: [nodeCoords.top, nodeCoords.bottom],\r\n vertical: false,\r\n };\r\n }\r\n\r\n if (isAscending) {\r\n const nextNodeCenter = otherCoords.left + otherCoords.width / 2;\r\n return {\r\n x: [center, center + Math.abs(center - nextNodeCenter) / 2],\r\n y: [nodeCoords.top, nodeCoords.bottom],\r\n vertical: false,\r\n };\r\n } else {\r\n return {\r\n x: [\r\n otherCoords.right + Math.abs(otherCoords.right - nodeCoords.left) / 2,\r\n center,\r\n ],\r\n y: [nodeCoords.top, nodeCoords.bottom],\r\n vertical: false,\r\n };\r\n }\r\n}\r\n\r\nfunction getRealCoords(el: HTMLElement): Coordinates {\r\n const { top, bottom, left, right, height, width } =\r\n el.getBoundingClientRect();\r\n\r\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\r\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\r\n\r\n return {\r\n top: top + scrollTop,\r\n bottom: bottom + scrollTop,\r\n left: left + scrollLeft,\r\n right: right + scrollLeft,\r\n height,\r\n width,\r\n };\r\n}\r\n\r\nfunction defineRanges(parent: HTMLElement) {\r\n if (!isDragState(state) && !isSynthDragState(state)) return;\r\n\r\n const parentData = parents.get(parent);\r\n if (!parentData) return;\r\n\r\n const enabledNodes = parentData.enabledNodes;\r\n\r\n enabledNodes.forEach((node, index) => {\r\n node.data.range = {};\r\n\r\n const prevNode = enabledNodes[index - 1];\r\n const nextNode = enabledNodes[index + 1];\r\n const nodeCoords = getRealCoords(node.el);\r\n const prevNodeCoords = prevNode ? getRealCoords(prevNode.el) : undefined;\r\n const nextNodeCoords = nextNode ? getRealCoords(nextNode.el) : undefined;\r\n\r\n const aboveOrBelowPrevious =\r\n prevNodeCoords &&\r\n (nodeCoords.top > prevNodeCoords.bottom ||\r\n nodeCoords.bottom < prevNodeCoords.top);\r\n\r\n const aboveOrBelowAfter =\r\n nextNodeCoords &&\r\n (nodeCoords.top > nextNodeCoords.bottom ||\r\n nodeCoords.bottom < nextNodeCoords.top);\r\n\r\n const fullishWidth =\r\n parent.getBoundingClientRect().width * 0.8 < nodeCoords.width;\r\n\r\n if (fullishWidth) {\r\n node.data.range.ascending = createVerticalRange(\r\n nodeCoords,\r\n nextNodeCoords,\r\n true\r\n );\r\n node.data.range.descending = createVerticalRange(\r\n nodeCoords,\r\n prevNodeCoords,\r\n false\r\n );\r\n } else if (aboveOrBelowAfter && !aboveOrBelowPrevious) {\r\n node.data.range.ascending = createHorizontalRange(\r\n nodeCoords,\r\n nextNodeCoords,\r\n true,\r\n true\r\n );\r\n node.data.range.descending = createHorizontalRange(\r\n nodeCoords,\r\n prevNodeCoords,\r\n false\r\n );\r\n } else if (!aboveOrBelowPrevious && !aboveOrBelowAfter) {\r\n node.data.range.ascending = createHorizontalRange(\r\n nodeCoords,\r\n nextNodeCoords,\r\n true\r\n );\r\n node.data.range.descending = createHorizontalRange(\r\n nodeCoords,\r\n prevNodeCoords,\r\n false\r\n );\r\n } else if (aboveOrBelowPrevious && !nextNodeCoords) {\r\n node.data.range.ascending = createHorizontalRange(\r\n nodeCoords,\r\n undefined,\r\n true\r\n );\r\n } else if (aboveOrBelowPrevious && !aboveOrBelowAfter) {\r\n node.data.range.ascending = createHorizontalRange(\r\n nodeCoords,\r\n nextNodeCoords,\r\n true\r\n );\r\n node.data.range.descending = createHorizontalRange(\r\n nodeCoords,\r\n undefined,\r\n false\r\n );\r\n }\r\n });\r\n}\r\n\r\nexport function handleNodeDragover(data: NodeDragEventData) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (!config.nativeDrag) return;\r\n\r\n data.e.preventDefault();\r\n}\r\n\r\nfunction processParentDragEvent(\r\n e: DragEvent | PointerEvent,\r\n targetData: ParentEventData[\"targetData\"],\r\n state: DragState,\r\n nativeDrag = false\r\n) {\r\n pd(e);\r\n\r\n if (nativeDrag && e instanceof PointerEvent) return;\r\n\r\n const { x, y } = eventCoordinates(e);\r\n\r\n // Calculate global coordinates\r\n const clientX = x;\r\n const clientY = y;\r\n\r\n const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\r\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\r\n\r\n state.coordinates.x = clientX + scrollLeft;\r\n state.coordinates.y = clientY + scrollTop;\r\n\r\n const nestedParent = targetData.parent.data.nestedParent;\r\n\r\n let realTargetParent = targetData.parent;\r\n\r\n if (nestedParent) {\r\n const rect = nestedParent.el.getBoundingClientRect();\r\n\r\n if (state.coordinates.y > rect.top && state.coordinates.y < rect.bottom)\r\n realTargetParent = nestedParent;\r\n }\r\n\r\n if (realTargetParent.el === state.currentParent?.el) {\r\n moveBetween(realTargetParent, state);\r\n } else {\r\n moveOutside(realTargetParent, state);\r\n }\r\n\r\n state.currentParent = realTargetParent;\r\n}\r\n\r\nexport function handleParentDragover(\r\n data: ParentEventData,\r\n state: DragState\r\n) {\r\n processParentDragEvent(data.e as DragEvent, data.targetData, state, true);\r\n}\r\n\r\nexport function handleParentPointerover(data: PointeroverParentEvent) {\r\n const { detail } = data;\r\n\r\n const { state, targetData } = detail;\r\n\r\n if (state.scrolling) return;\r\n\r\n processParentDragEvent(detail.e, targetData, state);\r\n}\r\n\r\nexport function moveBetween(data: ParentRecord, state: DragState) {\r\n if (data.data.config.sortable === false) return;\r\n\r\n if (\r\n data.el === insertState.draggedOverParent?.el &&\r\n insertState.draggedOverParent.data.getValues(data.el).length === 0\r\n ) {\r\n return;\r\n } else if (insertState.draggedOverParent?.el) {\r\n removeClass(\r\n [insertState.draggedOverParent.el],\r\n insertState.draggedOverParent.data.config.dropZoneClass\r\n );\r\n insertState.draggedOverParent = null;\r\n }\r\n\r\n const foundRange = findClosest(data.data.enabledNodes, state);\r\n\r\n if (!foundRange) return;\r\n\r\n const key = foundRange[1] as \"ascending\" | \"descending\";\r\n\r\n if (foundRange) {\r\n const position = foundRange[0].data.range\r\n ? foundRange[0].data.range[key]\r\n : undefined;\r\n\r\n if (position)\r\n positionInsertPoint(\r\n data,\r\n position,\r\n foundRange[1] === \"ascending\",\r\n foundRange[0],\r\n insertState as InsertState\r\n );\r\n }\r\n}\r\n\r\nfunction moveOutside(data: ParentRecord, state: DragState) {\r\n if (data.el === state.currentParent.el) return false;\r\n\r\n const targetConfig = data.data.config;\r\n\r\n if (state.draggedNode.el.contains(data.el)) return false;\r\n\r\n if (targetConfig.dropZone === false) return;\r\n\r\n const initialParentConfig = state.initialParent.data.config;\r\n\r\n if (targetConfig.accepts) {\r\n return targetConfig.accepts(\r\n data,\r\n state.initialParent,\r\n state.currentParent,\r\n state\r\n );\r\n } else if (\r\n !targetConfig.group ||\r\n targetConfig.group !== initialParentConfig.group\r\n ) {\r\n return false;\r\n }\r\n\r\n const values = data.data.getValues(data.el);\r\n\r\n if (!values.length) {\r\n addParentClass([data.el], targetConfig.dropZoneClass);\r\n\r\n insertState.draggedOverParent = data as ParentRecord;\r\n\r\n const insertPoint = insertState.insertPoint;\r\n\r\n if (insertPoint) insertPoint.el.style.display = \"none\";\r\n } else {\r\n removeClass([state.currentParent.el], targetConfig.dropZoneClass);\r\n\r\n const enabledNodes = data.data.enabledNodes;\r\n\r\n const foundRange = findClosest(enabledNodes, state);\r\n\r\n if (!foundRange) return;\r\n\r\n const key = foundRange[1] as \"ascending\" | \"descending\";\r\n\r\n if (foundRange) {\r\n const position = foundRange[0].data.range\r\n ? foundRange[0].data.range[key]\r\n : undefined;\r\n\r\n if (position)\r\n positionInsertPoint(\r\n data,\r\n position,\r\n foundRange[1] === \"ascending\",\r\n foundRange[0],\r\n insertState as InsertState\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction findClosest(enabledNodes: NodeRecord[], state: DragState) {\r\n let foundRange: [NodeRecord, string] | null = null;\r\n\r\n for (let x = 0; x < enabledNodes.length; x++) {\r\n if (!state || !enabledNodes[x].data.range) continue;\r\n\r\n if (enabledNodes[x].data.range!.ascending) {\r\n if (\r\n state.coordinates.y > enabledNodes[x].data.range!.ascending!.y[0] &&\r\n state.coordinates.y < enabledNodes[x].data.range!.ascending!.y[1] &&\r\n state.coordinates.x > enabledNodes[x].data.range!.ascending!.x[0] &&\r\n state.coordinates.x < enabledNodes[x].data.range!.ascending!.x[1]\r\n ) {\r\n foundRange = [enabledNodes[x], \"ascending\"];\r\n\r\n return foundRange;\r\n }\r\n }\r\n\r\n if (enabledNodes[x].data.range!.descending) {\r\n if (\r\n state.coordinates.y > enabledNodes[x].data.range!.descending!.y[0] &&\r\n state.coordinates.y < enabledNodes[x].data.range!.descending!.y[1] &&\r\n state.coordinates.x > enabledNodes[x].data.range!.descending!.x[0] &&\r\n state.coordinates.x < enabledNodes[x].data.range!.descending!.x[1]\r\n ) {\r\n foundRange = [enabledNodes[x], \"descending\"];\r\n\r\n return foundRange;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createInsertPoint(\r\n parent: ParentRecord,\r\n insertState: InsertState\r\n) {\r\n const insertPoint = parent.data.config.insertConfig?.insertPoint({\r\n el: parent.el,\r\n data: parent.data,\r\n });\r\n\r\n if (!insertPoint)\r\n throw new Error(\"Insert point not found\", { cause: parent });\r\n\r\n insertState.insertPoint = {\r\n parent,\r\n el: insertPoint,\r\n };\r\n\r\n document.body.appendChild(insertPoint);\r\n\r\n Object.assign(insertPoint.style, {\r\n position: \"absolute\",\r\n display: \"none\",\r\n });\r\n}\r\n\r\nfunction removeInsertPoint(insertState: InsertState) {\r\n if (insertState.insertPoint?.el) insertState.insertPoint.el.remove();\r\n\r\n insertState.insertPoint = null;\r\n}\r\n\r\nfunction positionInsertPoint(\r\n parent: ParentRecord,\r\n position: { x: number[]; y: number[]; vertical: boolean },\r\n ascending: boolean,\r\n node: NodeRecord,\r\n insertState: InsertState\r\n) {\r\n if (insertState.insertPoint?.el !== parent.el) {\r\n removeInsertPoint(insertState);\r\n\r\n createInsertPoint(parent, insertState);\r\n }\r\n\r\n insertState.draggedOverNodes = [node];\r\n\r\n if (!insertState.insertPoint) return;\r\n\r\n insertState.insertPoint.el.style.display = \"block\";\r\n\r\n if (position.vertical) {\r\n const insertPointHeight =\r\n insertState.insertPoint.el.getBoundingClientRect().height;\r\n const targetY = position.y[ascending ? 1 : 0];\r\n const topPosition = targetY - insertPointHeight / 2;\r\n\r\n Object.assign(insertState.insertPoint.el.style, {\r\n top: `${topPosition}px`,\r\n left: `${position.x[0]}px`,\r\n right: `${position.x[1]}px`,\r\n width: `${position.x[1] - position.x[0]}px`,\r\n });\r\n } else {\r\n const leftPosition =\r\n position.x[ascending ? 1 : 0] -\r\n insertState.insertPoint.el.getBoundingClientRect().width / 2;\r\n insertState.insertPoint.el.style.left = `${leftPosition}px`;\r\n\r\n Object.assign(insertState.insertPoint.el.style, {\r\n top: `${position.y[0]}px`,\r\n bottom: `${position.y[1]}px`,\r\n height: `${position.y[1] - position.y[0]}px`,\r\n });\r\n }\r\n\r\n insertState.targetIndex = node.data.index;\r\n\r\n insertState.ascending = ascending;\r\n}\r\n\r\nexport function handleParentDrop(_data: NodeDragEventData) {}\r\n\r\n/**\r\n * Performs the actual insertion of the dragged nodes into the target parent.\r\n *\r\n * @param state - The current drag state.\r\n */\r\nexport function handleEnd(\r\n state: DragState | SynthDragState | BaseDragState\r\n) {\r\n if (!isDragState(state) && !isSynthDragState(state)) return;\r\n\r\n const insertPoint = insertState.insertPoint;\r\n\r\n if (!insertState.draggedOverParent) {\r\n const draggedParentValues = parentValues(\r\n state.initialParent.el,\r\n state.initialParent.data\r\n );\r\n\r\n const transferred = state.initialParent.el !== state.currentParent.el;\r\n\r\n remapNodes(state.initialParent.el);\r\n\r\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\r\n\r\n const enabledNodes = [...state.initialParent.data.enabledNodes];\r\n\r\n const originalIndex = state.draggedNodes[0].data.index;\r\n\r\n const targetIndex = insertState.targetIndex;\r\n\r\n if (\r\n !transferred &&\r\n insertState.draggedOverNodes[0] &&\r\n insertState.draggedOverNodes[0].el !== state.draggedNodes[0].el\r\n ) {\r\n const newParentValues = [\r\n ...draggedParentValues.filter(\r\n (x) => !draggedValues.some((y) => eq(x, y))\r\n ),\r\n ];\r\n\r\n let index = insertState.draggedOverNodes[0].data.index;\r\n\r\n if (\r\n insertState.targetIndex > state.draggedNodes[0].data.index &&\r\n !insertState.ascending\r\n ) {\r\n index--;\r\n } else if (\r\n insertState.targetIndex < state.draggedNodes[0].data.index &&\r\n insertState.ascending\r\n ) {\r\n index++;\r\n }\r\n\r\n newParentValues.splice(index, 0, ...draggedValues);\r\n\r\n setParentValues(state.initialParent.el, state.initialParent.data, [\r\n ...newParentValues,\r\n ]);\r\n\r\n if (state.initialParent.data.config.onSort) {\r\n const sortEventData = {\r\n parent: {\r\n el: state.initialParent.el,\r\n data: state.initialParent.data,\r\n } as ParentRecord,\r\n previousValues: [...draggedParentValues],\r\n previousNodes: [...enabledNodes],\r\n nodes: [...state.initialParent.data.enabledNodes],\r\n values: [...newParentValues],\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: insertState.draggedOverNodes,\r\n previousPosition: originalIndex,\r\n position: index,\r\n state: state as DragState,\r\n };\r\n\r\n state.initialParent.data.config.onSort(sortEventData);\r\n }\r\n } else if (transferred && insertState.draggedOverNodes.length) {\r\n const draggedParentValues = parentValues(\r\n state.initialParent.el,\r\n state.initialParent.data\r\n );\r\n\r\n // For the time being, we will not be remoing the value of the original dragged parent.\r\n let index = insertState.draggedOverNodes[0].data.index || 0;\r\n\r\n if (insertState.ascending) index++;\r\n\r\n const insertValues = state.initialParent.data.config.insertConfig\r\n ?.dynamicValues\r\n ? state.initialParent.data.config.insertConfig.dynamicValues({\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\r\n targetIndex: index,\r\n })\r\n : draggedValues;\r\n\r\n const newParentValues = [\r\n ...draggedParentValues.filter(\r\n (x) => !draggedValues.some((y) => eq(x, y))\r\n ),\r\n ];\r\n\r\n if (state.currentParent.el.contains(state.initialParent.el)) {\r\n // Update initial parent values first\r\n setParentValues(state.initialParent.el, state.initialParent.data, [\r\n ...newParentValues,\r\n ]);\r\n\r\n // Now get the target parent values.\r\n const targetParentValues = parentValues(\r\n state.currentParent.el,\r\n state.currentParent.data\r\n );\r\n\r\n targetParentValues.splice(index, 0, ...insertValues);\r\n\r\n setParentValues(state.currentParent.el, state.currentParent.data, [\r\n ...targetParentValues,\r\n ]);\r\n } else {\r\n setParentValues(state.initialParent.el, state.initialParent.data, [\r\n ...newParentValues,\r\n ]);\r\n\r\n const targetParentValues = parentValues(\r\n state.currentParent.el,\r\n state.currentParent.data\r\n );\r\n\r\n targetParentValues.splice(index, 0, ...insertValues);\r\n\r\n setParentValues(state.currentParent.el, state.currentParent.data, [\r\n ...targetParentValues,\r\n ]);\r\n }\r\n\r\n const data = {\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n initialParent: state.initialParent,\r\n draggedNodes: state.draggedNodes,\r\n targetIndex,\r\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\r\n state,\r\n };\r\n\r\n if (state.initialParent.data.config.onTransfer)\r\n state.initialParent.data.config.onTransfer(data);\r\n if (state.currentParent.data.config.onTransfer)\r\n state.currentParent.data.config.onTransfer(data);\r\n }\r\n } else if (insertState.draggedOverParent) {\r\n if (state.currentParent.el.contains(state.initialParent.el)) {\r\n const draggedParentValues = parentValues(\r\n state.initialParent.el,\r\n state.initialParent.data\r\n );\r\n\r\n const newParentValues = [\r\n ...draggedParentValues.filter(\r\n (x) => !draggedValues.some((y) => eq(x, y))\r\n ),\r\n ];\r\n\r\n setParentValues(state.initialParent.el, state.initialParent.data, [\r\n ...newParentValues,\r\n ]);\r\n\r\n const draggedOverParentValues = parentValues(\r\n insertState.draggedOverParent.el,\r\n insertState.draggedOverParent.data\r\n );\r\n\r\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\r\n\r\n const insertValues = state.initialParent.data.config.insertConfig\r\n ?.dynamicValues\r\n ? state.initialParent.data.config.insertConfig.dynamicValues({\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\r\n })\r\n : draggedValues;\r\n\r\n draggedOverParentValues.push(...insertValues);\r\n\r\n setParentValues(\r\n insertState.draggedOverParent.el,\r\n insertState.draggedOverParent.data,\r\n [...draggedOverParentValues]\r\n );\r\n } else {\r\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\r\n\r\n const draggedOverParentValues = parentValues(\r\n insertState.draggedOverParent.el,\r\n insertState.draggedOverParent.data\r\n );\r\n\r\n const insertValues = state.initialParent.data.config.insertConfig\r\n ?.dynamicValues\r\n ? state.initialParent.data.config.insertConfig.dynamicValues({\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\r\n })\r\n : draggedValues;\r\n\r\n draggedOverParentValues.push(...insertValues);\r\n\r\n setParentValues(\r\n insertState.draggedOverParent.el,\r\n insertState.draggedOverParent.data,\r\n [...draggedOverParentValues]\r\n );\r\n\r\n const draggedParentValues = parentValues(\r\n state.initialParent.el,\r\n state.initialParent.data\r\n );\r\n\r\n const newParentValues = [\r\n ...draggedParentValues.filter(\r\n (x) => !draggedValues.some((y) => eq(x, y))\r\n ),\r\n ];\r\n\r\n setParentValues(state.initialParent.el, state.initialParent.data, [\r\n ...newParentValues,\r\n ]);\r\n }\r\n\r\n const data: InsertEvent = {\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: insertState.draggedOverNodes as NodeRecord[],\r\n state,\r\n };\r\n\r\n if (state.initialParent.data.config.insertConfig?.insertEvent)\r\n state.initialParent.data.config.insertConfig.insertEvent(data);\r\n if (state.currentParent.data.config.insertConfig?.insertEvent)\r\n state.currentParent.data.config.insertConfig.insertEvent(data);\r\n\r\n removeClass(\r\n [insertState.draggedOverParent.el],\r\n insertState.draggedOverParent.data.config.dropZoneClass\r\n );\r\n }\r\n\r\n if (insertPoint) insertPoint.el.style.display = \"none\";\r\n\r\n const dropZoneClass = isSynthDragState(state)\r\n ? state.initialParent.data.config.synthDropZoneClass\r\n : state.initialParent.data.config.dropZoneClass;\r\n\r\n removeClass(\r\n insertState.draggedOverNodes.map((node) => node.el),\r\n dropZoneClass\r\n );\r\n\r\n const dragPlaceholderClass =\r\n state.initialParent.data.config.dragPlaceholderClass;\r\n\r\n removeClass(\r\n state.draggedNodes.map((node) => node.el),\r\n dragPlaceholderClass\r\n );\r\n\r\n insertState.draggedOverNodes = [];\r\n\r\n insertState.draggedOverParent = null;\r\n}\r\n","import type {\r\n DropSwapConfig,\r\n NodeDragEventData,\r\n DragState,\r\n SynthDragState,\r\n NodeRecord,\r\n PointeroverNodeEvent,\r\n ParentDragEventData,\r\n PointeroverParentEvent,\r\n DropSwapState,\r\n ParentRecord,\r\n BaseDragState,\r\n} from \"../../types\";\r\nimport {\r\n parents,\r\n parentValues,\r\n setParentValues,\r\n addNodeClass,\r\n isSynthDragState,\r\n removeClass,\r\n addClass,\r\n state,\r\n addEvents,\r\n isDragState,\r\n} from \"../../index\";\r\n\r\nexport const dropSwapState: DropSwapState = {\r\n draggedOverNodes: Array>(),\r\n initialDraggedIndex: undefined,\r\n transferred: false,\r\n dragging: false,\r\n};\r\n\r\n/**\r\n * Abort controller for the document.\r\n */\r\nlet documentController: AbortController | undefined;\r\n\r\nexport function dropOrSwap(dropSwapConfig: DropSwapConfig = {}) {\r\n return (parent: HTMLElement) => {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n const dropSwapParentConfig = {\r\n ...parentData.config,\r\n dropSwapConfig,\r\n };\r\n\r\n return {\r\n setup() {\r\n dropSwapParentConfig.handleNodeDragover =\r\n dropSwapConfig.handleNodeDragover || handleNodeDragover;\r\n\r\n dropSwapParentConfig.handleParentDragover =\r\n dropSwapConfig.handleParentDragover || handleParentDragover;\r\n\r\n dropSwapParentConfig.handleNodePointerover =\r\n dropSwapConfig.handleNodePointerover || handleNodePointerover;\r\n\r\n dropSwapParentConfig.handleParentPointerover =\r\n dropSwapConfig.handleParentPointerover || handeParentPointerover;\r\n\r\n const originalHandleend = dropSwapParentConfig.handleEnd;\r\n\r\n dropSwapParentConfig.handleEnd = (\r\n state: DragState | SynthDragState\r\n ) => {\r\n handleEnd(state);\r\n\r\n originalHandleend(state);\r\n };\r\n\r\n parentData.on(\"dragStarted\", () => {\r\n documentController = addEvents(document, {\r\n dragover: rootDragover,\r\n handleRootPointerover: rootPointerover,\r\n });\r\n });\r\n\r\n parentData.on(\"dragEnded\", () => {\r\n documentController?.abort();\r\n });\r\n\r\n parentData.config = dropSwapParentConfig;\r\n },\r\n };\r\n };\r\n}\r\n\r\nfunction rootDragover(_e: DragEvent) {\r\n if (!isDragState(state)) return;\r\n\r\n removeClass(\r\n [state.currentParent.el],\r\n state.currentParent.data.config.dropZoneParentClass\r\n );\r\n\r\n state.currentParent = state.initialParent;\r\n}\r\n\r\nfunction rootPointerover(_e: CustomEvent) {\r\n if (!isSynthDragState(state)) return;\r\n\r\n removeClass(\r\n [state.currentParent.el],\r\n state.currentParent.data.config.synthDropZoneParentClass\r\n );\r\n\r\n state.currentParent = state.initialParent;\r\n}\r\n\r\nfunction updateDraggedOverNodes(\r\n data: PointeroverNodeEvent | NodeDragEventData,\r\n state: DragState | SynthDragState\r\n) {\r\n const targetData =\r\n \"detail\" in data ? data.detail.targetData : data.targetData;\r\n\r\n const config = targetData.parent.data.config;\r\n\r\n const dropZoneClass = isSynthDragState(state)\r\n ? config.synthDropZoneClass\r\n : config.dropZoneClass;\r\n\r\n removeClass(\r\n dropSwapState.draggedOverNodes.map((node) => node.el),\r\n dropZoneClass\r\n );\r\n\r\n const enabledNodes = targetData.parent.data.enabledNodes;\r\n\r\n if (!enabledNodes) return;\r\n\r\n dropSwapState.draggedOverNodes = enabledNodes.slice(\r\n targetData.node.data.index,\r\n targetData.node.data.index + state.draggedNodes.length\r\n );\r\n\r\n addNodeClass(\r\n dropSwapState.draggedOverNodes.map((node) => node.el),\r\n dropZoneClass,\r\n true\r\n );\r\n\r\n state.currentTargetValue = targetData.node.data.value;\r\n\r\n state.currentParent = targetData.parent;\r\n\r\n addClass(\r\n state.currentParent.el,\r\n isSynthDragState(state)\r\n ? config.synthDropZoneParentClass\r\n : config.dropZoneParentClass,\r\n state.currentParent.data,\r\n true\r\n );\r\n}\r\n\r\nfunction handleNodeDragover(\r\n data: NodeDragEventData,\r\n state: DragState\r\n) {\r\n data.e.preventDefault();\r\n\r\n data.e.stopPropagation();\r\n\r\n updateDraggedOverNodes(data, state);\r\n}\r\n\r\nexport function handleParentDragover(\r\n data: ParentDragEventData,\r\n state: DragState\r\n) {\r\n data.e.preventDefault();\r\n\r\n data.e.stopPropagation();\r\n\r\n const currentConfig = state.currentParent.data.config;\r\n\r\n removeClass(\r\n dropSwapState.draggedOverNodes.map((node) => node.el),\r\n currentConfig.dropZoneClass\r\n );\r\n\r\n removeClass([state.currentParent.el], currentConfig.dropZoneParentClass);\r\n\r\n const config = data.targetData.parent.data.config;\r\n\r\n addClass(\r\n data.targetData.parent.el,\r\n config.dropZoneParentClass,\r\n data.targetData.parent.data,\r\n true\r\n );\r\n\r\n dropSwapState.draggedOverNodes = [];\r\n\r\n state.currentParent = data.targetData.parent;\r\n}\r\n\r\nexport function handeParentPointerover(data: PointeroverParentEvent) {\r\n const currentConfig = data.detail.state.currentParent.data.config;\r\n\r\n removeClass(\r\n dropSwapState.draggedOverNodes.map((node) => node.el),\r\n currentConfig.synthDropZoneClass\r\n );\r\n\r\n removeClass(\r\n [data.detail.state.currentParent.el],\r\n currentConfig.synthDropZoneParentClass\r\n );\r\n\r\n const config = data.detail.targetData.parent.data.config;\r\n\r\n addClass(\r\n data.detail.targetData.parent.el,\r\n config.synthDropZoneParentClass,\r\n data.detail.targetData.parent.data,\r\n true\r\n );\r\n\r\n dropSwapState.draggedOverNodes = [];\r\n\r\n data.detail.state.currentParent = data.detail.targetData.parent;\r\n}\r\n\r\nfunction handleNodePointerover(data: PointeroverNodeEvent) {\r\n if (!isSynthDragState(data.detail.state)) return;\r\n\r\n updateDraggedOverNodes(data, data.detail.state);\r\n}\r\n\r\nfunction swapElements(\r\n arr1: T[],\r\n arr2: T[] | null,\r\n index1: number | number[],\r\n index2: number\r\n): T[] | [T[], T[]] {\r\n const indices1 = Array.isArray(index1) ? index1 : [index1];\r\n\r\n if (arr2 === null) {\r\n const elementsFromArr1 = indices1.map((i) => arr1[i]);\r\n\r\n const elementFromArr2 = arr1[index2];\r\n\r\n arr1.splice(index2, 1, ...elementsFromArr1);\r\n\r\n indices1.forEach((i, idx) => {\r\n arr1[i] = idx === 0 ? elementFromArr2 : (undefined as unknown as T);\r\n });\r\n\r\n return arr1.filter((el) => el !== undefined);\r\n } else {\r\n const elementsFromArr1 = indices1.map((i) => arr1[i]);\r\n\r\n const elementFromArr2 = arr2[index2];\r\n\r\n arr2.splice(index2, 1, ...elementsFromArr1);\r\n\r\n indices1.forEach((i, idx) => {\r\n arr1[i] = idx === 0 ? elementFromArr2 : (undefined as unknown as T);\r\n });\r\n\r\n return [arr1.filter((el) => el !== undefined), arr2];\r\n }\r\n}\r\n\r\nfunction handleEnd(state: DragState | SynthDragState) {\r\n const isSynth = isSynthDragState(state);\r\n\r\n removeClass(\r\n [state.currentParent.el],\r\n isSynth\r\n ? state.currentParent.data.config.synthDropZoneParentClass\r\n : state.currentParent.data.config.dropZoneParentClass\r\n );\r\n\r\n removeClass(\r\n dropSwapState.draggedOverNodes.map((node) => node.el),\r\n isSynth\r\n ? state.currentParent.data.config.synthDropZoneClass\r\n : state.currentParent.data.config.dropZoneClass\r\n );\r\n\r\n const values = parentValues(state.currentParent.el, state.currentParent.data);\r\n\r\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\r\n\r\n const newValues = values.filter((x) => !draggedValues.includes(x));\r\n\r\n const targetIndex = dropSwapState.draggedOverNodes[0]?.data.index;\r\n\r\n const draggedIndex = state.draggedNodes[0].data.index;\r\n\r\n const initialParentValues = parentValues(\r\n state.initialParent.el,\r\n state.initialParent.data\r\n );\r\n\r\n if (targetIndex === undefined) {\r\n if (state.initialParent.el === state.currentParent.el) return;\r\n\r\n const newInitialValues = initialParentValues.filter(\r\n (x) => !draggedValues.includes(x)\r\n );\r\n\r\n setParentValues(\r\n state.initialParent.el,\r\n state.initialParent.data,\r\n newInitialValues\r\n );\r\n\r\n setParentValues(\r\n state.currentParent.el,\r\n state.currentParent.data,\r\n values.concat(draggedValues)\r\n );\r\n\r\n return;\r\n }\r\n\r\n let swap = false;\r\n\r\n const shouldSwap = state.initialParent.data.config.dropSwapConfig?.shouldSwap;\r\n\r\n if (shouldSwap)\r\n swap = shouldSwap({\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\r\n state,\r\n });\r\n\r\n if (state.initialParent.el === state.currentParent.el) {\r\n newValues.splice(targetIndex, 0, ...draggedValues);\r\n\r\n setParentValues(\r\n state.currentParent.el,\r\n state.currentParent.data,\r\n swap ? swapElements(values, null, draggedIndex, targetIndex) : newValues\r\n );\r\n\r\n if (state.initialParent.data.config.onSort) {\r\n state.initialParent.data.config.onSort({\r\n parent: {\r\n el: state.initialParent.el,\r\n data: state.initialParent.data,\r\n } as ParentRecord,\r\n previousValues: [...initialParentValues],\r\n previousNodes: [...state.initialParent.data.enabledNodes],\r\n nodes: [...state.initialParent.data.enabledNodes],\r\n values: [...newValues],\r\n draggedNodes: state.draggedNodes,\r\n previousPosition: draggedIndex,\r\n position: targetIndex,\r\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\r\n state: state as BaseDragState,\r\n });\r\n }\r\n } else {\r\n if (swap) {\r\n const res = swapElements(\r\n initialParentValues,\r\n newValues,\r\n state.initialIndex,\r\n targetIndex\r\n );\r\n\r\n setParentValues(\r\n state.initialParent.el,\r\n state.initialParent.data,\r\n res[0] as T[]\r\n );\r\n\r\n setParentValues(\r\n state.currentParent.el,\r\n state.currentParent.data,\r\n res[1] as T[]\r\n );\r\n } else {\r\n const newInitialValues = initialParentValues.filter(\r\n (x) => !draggedValues.includes(x)\r\n );\r\n\r\n setParentValues(\r\n state.initialParent.el,\r\n state.initialParent.data,\r\n newInitialValues\r\n );\r\n\r\n newValues.splice(targetIndex, 0, ...draggedValues);\r\n\r\n setParentValues(\r\n state.currentParent.el,\r\n state.currentParent.data,\r\n newValues\r\n );\r\n }\r\n }\r\n\r\n if (state.currentParent.data.config.onTransfer) {\r\n state.currentParent.data.config.onTransfer({\r\n sourceParent: state.currentParent,\r\n targetParent: state.initialParent,\r\n initialParent: state.initialParent,\r\n draggedNodes: state.draggedNodes,\r\n targetIndex,\r\n state,\r\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\r\n });\r\n }\r\n\r\n if (state.initialParent.data.config.onTransfer) {\r\n state.initialParent.data.config.onTransfer({\r\n sourceParent: state.initialParent,\r\n targetParent: state.currentParent,\r\n initialParent: state.initialParent,\r\n draggedNodes: state.draggedNodes,\r\n targetIndex,\r\n state,\r\n targetNodes: dropSwapState.draggedOverNodes as NodeRecord[],\r\n });\r\n }\r\n}\r\n","import type {\r\n DNDPlugin,\r\n DragAndDrop,\r\n DragState,\r\n DragStateProps,\r\n Node,\r\n NodeData,\r\n NodeDragEventData,\r\n NodeEventData,\r\n NodePointerEventData,\r\n NodeRecord,\r\n NodeTargetData,\r\n NodesData,\r\n ParentConfig,\r\n ParentData,\r\n ParentEventData,\r\n ParentTargetData,\r\n ParentsData,\r\n PointeroverNodeEvent,\r\n PointeroverParentEvent,\r\n SetupNodeData,\r\n TearDownNodeData,\r\n BaseDragState,\r\n SynthDragState,\r\n SynthDragStateProps,\r\n ParentRecord,\r\n EventHandlers,\r\n NodeFromPoint,\r\n ParentFromPoint,\r\n ParentDragEventData,\r\n DragstartEventData,\r\n} from \"./types\";\r\n\r\nimport {\r\n pd,\r\n sp,\r\n on,\r\n emit,\r\n createEmitter,\r\n eq,\r\n splitClass,\r\n eventCoordinates,\r\n} from \"./utils\";\r\n\r\nexport * from \"./types\";\r\nexport { animations } from \"./plugins/animations\";\r\nexport { insert } from \"./plugins/insert\";\r\nexport { dropOrSwap } from \"./plugins/drop-or-swap\";\r\n\r\n/**\r\n * Check to see if code is running in a browser.\r\n */\r\nexport const isBrowser = typeof window !== \"undefined\";\r\n\r\n/**\r\n * Parents or \"lists\" are the containers that nodes or \"draggable items\" can be\r\n * dragged from and into.\r\n *\r\n * @type {WeakMap>}\r\n */\r\nexport const parents: ParentsData = new WeakMap<\r\n HTMLElement,\r\n ParentData\r\n>();\r\n\r\n/**\r\n * Nodes are the draggable items and the direct descendants of the parents.\r\n *\r\n * @type {WeakMap>}\r\n */\r\nexport const nodes: NodesData = new WeakMap>();\r\n\r\nfunction isMobilePlatform() {\r\n if (!isBrowser) return false;\r\n\r\n if (\"userAgentData\" in navigator) {\r\n return (navigator.userAgentData as { mobile: boolean }).mobile === true;\r\n }\r\n\r\n const ua = navigator.userAgent;\r\n\r\n const isMobileUA = /android|iphone|ipod/i.test(ua);\r\n\r\n const isIpad =\r\n /iPad/.test(ua) ||\r\n (ua.includes(\"Macintosh\") && navigator.maxTouchPoints > 1);\r\n\r\n return isMobileUA || isIpad;\r\n}\r\n\r\n/**\r\n * The base drag state.\r\n *\r\n * @type {BaseDragState}\r\n */\r\nconst baseDragState = {\r\n affectedNodes: [],\r\n coordinates: {\r\n x: 0,\r\n y: 0,\r\n },\r\n currentTargetValue: undefined,\r\n on,\r\n emit,\r\n originalZIndex: undefined,\r\n pointerSelection: false,\r\n preventEnter: false,\r\n rootUserSelect: undefined,\r\n nodePointerdown: undefined,\r\n longPress: false,\r\n scrolling: false,\r\n longPressTimeout: undefined,\r\n remapJustFinished: false,\r\n selectedNodes: [],\r\n selectedParent: undefined,\r\n preventSynthDrag: false,\r\n pointerDown: undefined,\r\n lastScrollContainerX: null,\r\n lastScrollContainerY: null,\r\n rootScrollWidth: undefined,\r\n rootScrollHeight: undefined,\r\n dragItemRect: undefined,\r\n windowScrollX: undefined,\r\n windowScrollY: undefined,\r\n lastScrollDirectionX: undefined,\r\n lastScrollDirectionY: undefined,\r\n scrollDebounceTimeout: undefined,\r\n frameIdX: undefined,\r\n frameIdY: undefined,\r\n};\r\n\r\n/**\r\n * The state of the drag and drop.\r\n *\r\n * @type {BaseDragState}\r\n */\r\nexport let state: BaseDragState = baseDragState;\r\n\r\n/**\r\n * Variable to check if the drop has occurred.\r\n */\r\nlet dropped = false;\r\n\r\n/**\r\n * Abort controller for the document.\r\n */\r\nlet documentController: AbortController | undefined;\r\n\r\n/**\r\n * Timeout for the scroll.\r\n */\r\nlet scrollTimeout: ReturnType;\r\n\r\nexport function resetState() {\r\n // Clear any existing timeouts to prevent stale references\r\n if (state.scrollDebounceTimeout) {\r\n clearTimeout(state.scrollDebounceTimeout);\r\n }\r\n\r\n if (state.longPressTimeout) {\r\n clearTimeout(state.longPressTimeout);\r\n }\r\n\r\n // Cancel any animation frames\r\n if (state.frameIdX !== undefined) {\r\n cancelAnimationFrame(state.frameIdX);\r\n }\r\n\r\n if (state.frameIdY !== undefined) {\r\n cancelAnimationFrame(state.frameIdY);\r\n }\r\n\r\n const baseDragState = {\r\n affectedNodes: [],\r\n coordinates: {\r\n x: 0,\r\n y: 0,\r\n },\r\n on,\r\n emit,\r\n currentTargetValue: undefined,\r\n originalZIndex: undefined,\r\n pointerId: undefined,\r\n preventEnter: false,\r\n remapJustFinished: false,\r\n selectedNodes: [],\r\n nodePointerdown: undefined,\r\n rootUserSelect: undefined,\r\n preventSynthDrag: false,\r\n scrolling: false,\r\n selectedParent: undefined,\r\n pointerSelection: false,\r\n synthScrollDirection: undefined,\r\n draggedNodeDisplay: undefined,\r\n synthDragScrolling: false,\r\n longPress: false,\r\n pointerDown: undefined,\r\n longPressTimeout: undefined,\r\n lastScrollContainerX: null,\r\n lastScrollContainerY: null,\r\n rootScrollWidth: undefined,\r\n rootScrollHeight: undefined,\r\n dragItemRect: undefined,\r\n windowScrollX: undefined,\r\n windowScrollY: undefined,\r\n lastScrollDirectionX: undefined,\r\n lastScrollDirectionY: undefined,\r\n scrollDebounceTimeout: undefined,\r\n frameIdX: undefined,\r\n frameIdY: undefined,\r\n };\r\n\r\n state = { ...baseDragState } as BaseDragState;\r\n}\r\n\r\n/**\r\n * @param {DragStateProps} dragStateProps - Attributes to update state with.\r\n *\r\n * @mutation - Updates state with node values.\r\n *\r\n * @returns void\r\n */\r\nexport function setDragState(\r\n dragStateProps: (SynthDragStateProps & DragStateProps) | DragStateProps\r\n): DragState | SynthDragState {\r\n Object.assign(state, dragStateProps);\r\n\r\n dragStateProps.initialParent.data.emit(\"dragStarted\", state);\r\n\r\n dropped = false;\r\n\r\n state.emit(\"dragStarted\", state);\r\n\r\n return state as DragState | SynthDragState;\r\n}\r\n\r\n/**\r\n *\r\n */\r\nfunction handleRootPointerdown() {\r\n if (state.activeState) setActive(state.activeState.parent, undefined, state);\r\n\r\n if (state.selectedState)\r\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\r\n\r\n state.selectedState = state.activeState = undefined;\r\n}\r\n\r\nfunction handleRootPointerup() {\r\n if (state.pointerDown) state.pointerDown.node.el.draggable = true;\r\n\r\n state.pointerDown = undefined;\r\n\r\n if (!isSynthDragState(state)) return;\r\n\r\n const config = state.currentParent.data.config;\r\n\r\n if (isSynthDragState(state)) config.handleEnd(state);\r\n}\r\n\r\n/**\r\n * Handles the keydown event on the root element.\r\n *\r\n * @param {KeyboardEvent} e - The keyboard event.\r\n */\r\nfunction handleRootKeydown(e: KeyboardEvent) {\r\n if (e.key === \"Escape\") {\r\n if (state.selectedState)\r\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\r\n\r\n if (state.activeState)\r\n setActive(state.activeState.parent, undefined, state);\r\n\r\n state.selectedState = state.activeState = undefined;\r\n }\r\n}\r\n\r\nfunction handleRootDrop(_e: DragEvent) {\r\n if (!isDragState(state)) return;\r\n\r\n dropped = true;\r\n\r\n const handleEnd = state.initialParent.data.config.handleEnd;\r\n\r\n handleEnd(state);\r\n}\r\n\r\nfunction handleRootDragover(e: DragEvent) {\r\n if (!isDragState(state)) return;\r\n\r\n pd(e);\r\n\r\n const { x, y } = eventCoordinates(e);\r\n\r\n if (isDragState(state)) {\r\n handleSynthScroll({ x, y }, e, state);\r\n }\r\n}\r\n\r\nfunction handleRootPointermove(e: PointerEvent) {\r\n if (!state.pointerDown || !state.pointerDown.validated) return;\r\n\r\n const config = state.pointerDown.parent.data.config;\r\n\r\n if (e.pointerType === \"mouse\" && !isMobilePlatform()) {\r\n return;\r\n }\r\n\r\n if (!isSynthDragState(state)) {\r\n pd(e);\r\n\r\n if (config.longPress && !state.longPress) {\r\n clearTimeout(state.longPressTimeout);\r\n\r\n state.longPress = false;\r\n\r\n return;\r\n }\r\n\r\n const nodes = config.draggedNodes(state.pointerDown);\r\n\r\n config.dragstartClasses(state.pointerDown.node, nodes, config, true);\r\n\r\n const rect = state.pointerDown.node.el.getBoundingClientRect();\r\n\r\n const synthDragState = initSynthDrag(\r\n state.pointerDown.node,\r\n state.pointerDown.parent,\r\n e,\r\n state,\r\n nodes,\r\n rect\r\n );\r\n\r\n synthMove(e, synthDragState, true);\r\n } else if (isSynthDragState(state)) {\r\n synthMove(e, state);\r\n }\r\n}\r\n\r\n/**\r\n * Initializes the drag and drop functionality for a given parent.\r\n *\r\n * @param {DragAndDrop} dragAndDrop - The drag and drop configuration.\r\n *\r\n * @returns void\r\n */\r\nexport function dragAndDrop({\r\n parent,\r\n getValues,\r\n setValues,\r\n config = {},\r\n}: DragAndDrop): void {\r\n if (!isBrowser) return;\r\n\r\n if (!documentController) {\r\n documentController = addEvents(document, {\r\n dragover: handleRootDragover,\r\n pointerdown: handleRootPointerdown,\r\n pointerup: handleRootPointerup,\r\n keydown: handleRootKeydown,\r\n drop: handleRootDrop,\r\n pointermove: handleRootPointermove,\r\n pointercancel: nodeEventData(config.handlePointercancel),\r\n touchmove: (e: TouchEvent) => {\r\n if (isDragState(state) && e.cancelable) pd(e);\r\n },\r\n contextmenu: (e: Event) => {\r\n if (isSynthDragState(state)) pd(e);\r\n },\r\n });\r\n }\r\n\r\n tearDown(parent);\r\n\r\n const [emit, on] = createEmitter();\r\n\r\n const parentData: ParentData = {\r\n getValues,\r\n setValues,\r\n config: {\r\n dragDropEffect: config.dragDropEffect ?? \"move\",\r\n dragEffectAllowed: config.dragEffectAllowed ?? \"move\",\r\n draggedNodes,\r\n dragstartClasses,\r\n handleNodeKeydown,\r\n handleDragstart,\r\n handleNodeDragover,\r\n handleParentDragover,\r\n handleNodeDrop,\r\n handleNodeFocus,\r\n handleNodeBlur,\r\n handlePointercancel,\r\n handleEnd,\r\n handleDragend,\r\n handleParentFocus,\r\n handleNodePointerup,\r\n handleNodePointerover,\r\n handleParentPointerover,\r\n handleParentScroll,\r\n handleNodePointerdown,\r\n handleNodeDragenter,\r\n handleNodeDragleave,\r\n handleParentDrop,\r\n multiDrag: config.multiDrag ?? false,\r\n nativeDrag: config.nativeDrag ?? true,\r\n performSort,\r\n performTransfer,\r\n root: config.root ?? document,\r\n setupNode,\r\n setupNodeRemap,\r\n reapplyDragClasses,\r\n tearDownNode,\r\n tearDownNodeRemap,\r\n remapFinished,\r\n threshold: {\r\n horizontal: 0,\r\n vertical: 0,\r\n },\r\n ...config,\r\n },\r\n enabledNodes: [],\r\n abortControllers: {},\r\n privateClasses: [],\r\n on,\r\n emit,\r\n };\r\n\r\n const nodesObserver = new MutationObserver(nodesMutated);\r\n\r\n nodesObserver.observe(parent, { childList: true });\r\n\r\n parents.set(parent, parentData);\r\n\r\n config.plugins?.forEach((plugin) => {\r\n plugin(parent)?.tearDown?.();\r\n });\r\n\r\n config.plugins?.forEach((plugin) => {\r\n plugin(parent)?.tearDown?.();\r\n });\r\n\r\n config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(parent)?.setup?.();\r\n });\r\n\r\n setup(parent, parentData);\r\n\r\n remapNodes(parent, true);\r\n}\r\n\r\nexport function dragStateProps(\r\n node: NodeRecord,\r\n parent: ParentRecord,\r\n e: PointerEvent | DragEvent,\r\n draggedNodes: Array>,\r\n offsetX?: number,\r\n offsetY?: number\r\n): DragStateProps {\r\n const { x, y } = eventCoordinates(e);\r\n\r\n const rect = node.el.getBoundingClientRect();\r\n\r\n return {\r\n affectedNodes: [],\r\n ascendingDirection: false,\r\n clonedDraggedEls: [],\r\n coordinates: {\r\n x,\r\n y,\r\n },\r\n draggedNode: {\r\n el: node.el,\r\n data: node.data,\r\n },\r\n draggedNodes,\r\n incomingDirection: undefined,\r\n initialIndex: node.data.index,\r\n initialParent: {\r\n el: parent.el,\r\n data: parent.data,\r\n },\r\n currentParent: {\r\n el: parent.el,\r\n data: parent.data,\r\n },\r\n longPress: parent.data.config.longPress ?? false,\r\n longPressTimeout: undefined,\r\n currentTargetValue: node.data.value,\r\n scrollEls: [],\r\n startLeft: offsetX ? offsetX : x - (rect?.left ?? 0),\r\n startTop: offsetY ? offsetY : y - (rect?.top ?? 0),\r\n targetIndex: node.data.index,\r\n transferred: false,\r\n };\r\n}\r\n\r\n/**\r\n * Perform the sort of the nodes.\r\n *\r\n * @param {ParentRecord} parent - The parent record.\r\n * @param {Array>} draggedNodes - The dragged nodes.\r\n * @param {Array>} targetNodes - The target nodes.\r\n *\r\n * @returns void\r\n */\r\nexport function performSort({\r\n parent,\r\n draggedNodes,\r\n targetNodes,\r\n}: {\r\n parent: ParentRecord;\r\n draggedNodes: Array>;\r\n targetNodes: Array>;\r\n}) {\r\n remapNodes(parent.el);\r\n\r\n const draggedValues = draggedNodes.map((x) => x.data.value);\r\n\r\n const targetParentValues = parentValues(parent.el, parent.data);\r\n\r\n const originalIndex = draggedNodes[0].data.index;\r\n\r\n const enabledNodes = [...parent.data.enabledNodes];\r\n\r\n const newParentValues = [\r\n ...targetParentValues.filter((x) => !draggedValues.some((y) => eq(x, y))),\r\n ];\r\n newParentValues.splice(targetNodes[0].data.index, 0, ...draggedValues);\r\n\r\n if (\"draggedNode\" in state)\r\n state.currentTargetValue = targetNodes[0].data.value;\r\n\r\n setParentValues(parent.el, parent.data, [...newParentValues]);\r\n\r\n if (parent.data.config.onSort) {\r\n parent.data.config.onSort({\r\n parent: {\r\n el: parent.el,\r\n data: parent.data,\r\n } as ParentRecord,\r\n previousValues: [...targetParentValues],\r\n previousNodes: [...enabledNodes],\r\n nodes: [...parent.data.enabledNodes],\r\n values: [...newParentValues],\r\n draggedNodes: draggedNodes,\r\n previousPosition: originalIndex,\r\n position: targetNodes[0].data.index,\r\n targetNodes,\r\n state,\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * This function sets the active node as well as removing any classes or\r\n * attribute set.\r\n *\r\n * @param {ParentEventData} data - The parent event data.\r\n * @param {NodeRecord} newActiveNode - The new active node.\r\n * @param {BaseDragState} state - The current drag state.\r\n */\r\nfunction setActive(\r\n parent: ParentRecord,\r\n newActiveNode: NodeRecord | undefined,\r\n state: BaseDragState\r\n) {\r\n if (!newActiveNode) {\r\n state.activeState = undefined;\r\n\r\n return;\r\n }\r\n\r\n state.activeState = {\r\n node: newActiveNode,\r\n parent,\r\n };\r\n}\r\n\r\n/**\r\n * This function deselects the nodes. This will clean the prior selected state\r\n * as well as removing any classes or attributes set.\r\n *\r\n * @param {Array>} nodes - The nodes to deselect.\r\n * @param {ParentRecord} parent - The parent record.\r\n * @param {BaseDragState} state - The current drag state.\r\n */\r\nfunction deselect(\r\n nodes: Array>,\r\n parent: ParentRecord,\r\n state: BaseDragState\r\n) {\r\n const selectedClass = parent.data.config.selectedClass;\r\n\r\n if (!state.selectedState) return;\r\n\r\n const iterativeNodes = Array.from(nodes);\r\n\r\n removeClass(\r\n nodes.map((x) => x.el),\r\n selectedClass\r\n );\r\n\r\n for (const node of iterativeNodes) {\r\n node.el.setAttribute(\"aria-selected\", \"false\");\r\n\r\n const index = state.selectedState.nodes.findIndex((x) => x.el === node.el);\r\n\r\n if (index === -1) continue;\r\n\r\n state.selectedState.nodes.splice(index, 1);\r\n }\r\n}\r\n\r\n/**\r\n * This function sets the selected nodes. This will clean the prior selected\r\n * state as well as removing any classes or attributes set.\r\n *\r\n * @param {ParentRecord} parent - The parent record.\r\n * @param {Array>} selectedNodes - The nodes to select.\r\n * @param {NodeRecord | undefined} newActiveNode - The new active node.\r\n * @param {BaseDragState} state - The current drag state.\r\n * @param {boolean} pointerdown - Whether the pointerdown event was triggered.\r\n */\r\nfunction setSelected(\r\n parent: ParentRecord,\r\n selectedNodes: Array>,\r\n newActiveNode: NodeRecord | undefined,\r\n state: BaseDragState,\r\n pointerdown = false\r\n) {\r\n state.pointerSelection = pointerdown;\r\n\r\n for (const node of selectedNodes) {\r\n node.el.setAttribute(\"aria-selected\", \"true\");\r\n\r\n addNodeClass([node.el], parent.data.config.selectedClass, true);\r\n }\r\n\r\n state.selectedState = {\r\n nodes: selectedNodes,\r\n parent,\r\n };\r\n\r\n setActive(parent, newActiveNode, state);\r\n}\r\n\r\n/**\r\n * Handle the parent focus event.\r\n *\r\n * @param {ParentEventData} data - The parent event data.\r\n * @param {BaseDragState | DragState | SynthDragState} state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleParentFocus(\r\n data: ParentEventData,\r\n state: BaseDragState | DragState | SynthDragState\r\n) {\r\n const firstEnabledNode = data.targetData.parent.data.enabledNodes[0];\r\n\r\n if (!firstEnabledNode) return;\r\n\r\n if (\r\n state.selectedState &&\r\n state.selectedState.parent.el !== data.targetData.parent.el\r\n ) {\r\n setActive(data.targetData.parent, firstEnabledNode, state);\r\n } else if (!state.selectedState) {\r\n setActive(data.targetData.parent, firstEnabledNode, state);\r\n }\r\n}\r\n\r\n/**\r\n * Perform the transfer of the nodes.\r\n *\r\n * @param data - The transfer data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function performTransfer({\r\n currentParent,\r\n targetParent,\r\n initialParent,\r\n draggedNodes,\r\n initialIndex,\r\n targetNodes,\r\n state,\r\n}: {\r\n currentParent: ParentRecord;\r\n targetParent: ParentRecord;\r\n initialParent: ParentRecord;\r\n draggedNodes: Array>;\r\n initialIndex: number;\r\n state: BaseDragState | DragState | SynthDragState;\r\n targetNodes: Array>;\r\n}) {\r\n remapNodes(initialParent.el);\r\n\r\n const draggedValues = draggedNodes.map((x) => x.data.value);\r\n\r\n const currentParentValues = [\r\n ...parentValues(currentParent.el, currentParent.data).filter(\r\n (x) => !draggedValues.some((y) => eq(x, y))\r\n ),\r\n ];\r\n\r\n const targetParentValues = parentValues(targetParent.el, targetParent.data);\r\n\r\n const reset =\r\n initialParent.el === targetParent.el &&\r\n targetParent.data.config.sortable === false;\r\n\r\n let targetIndex: number;\r\n\r\n if (targetNodes.length) {\r\n if (reset) {\r\n targetIndex = initialIndex;\r\n } else if (targetParent.data.config.sortable === false) {\r\n targetIndex = targetParent.data.enabledNodes.length;\r\n } else {\r\n targetIndex = targetNodes[0].data.index;\r\n }\r\n\r\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\r\n } else {\r\n targetIndex = reset ? initialIndex : targetParent.data.enabledNodes.length;\r\n\r\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\r\n }\r\n\r\n setParentValues(currentParent.el, currentParent.data, currentParentValues);\r\n\r\n setParentValues(targetParent.el, targetParent.data, targetParentValues);\r\n\r\n if (targetParent.data.config.onTransfer) {\r\n targetParent.data.config.onTransfer({\r\n sourceParent: currentParent,\r\n targetParent,\r\n initialParent,\r\n draggedNodes,\r\n targetIndex,\r\n state,\r\n targetNodes,\r\n });\r\n }\r\n\r\n if (currentParent.data.config.onTransfer) {\r\n currentParent.data.config.onTransfer({\r\n sourceParent: currentParent,\r\n targetParent,\r\n initialParent,\r\n draggedNodes,\r\n targetIndex,\r\n state,\r\n targetNodes: targetNodes ? targetNodes : [],\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Get the values of the parent.\r\n *\r\n * @param parent - The parent element.\r\n * @param parentData - The parent data.\r\n *\r\n * @returns The values of the parent.\r\n */\r\nexport function parentValues(\r\n parent: HTMLElement,\r\n parentData: ParentData\r\n): Array {\r\n return [...parentData.getValues(parent)];\r\n}\r\n\r\n/**\r\n * Set the values of the parent.\r\n *\r\n * @param parent - The parent element.\r\n * @param parentData - The parent data.\r\n * @param values - The values to set.\r\n *\r\n * @returns void\r\n */\r\nexport function setParentValues(\r\n parent: HTMLElement,\r\n parentData: ParentData,\r\n values: Array\r\n): void {\r\n parentData.setValues(values, parent);\r\n}\r\n\r\n/**\r\n * Get the values of the dragged nodes.\r\n *\r\n * @param state - The drag state.\r\n *\r\n * @returns The values of the dragged nodes.\r\n */\r\nexport function dragValues(state: DragState): Array {\r\n return [...state.draggedNodes.map((x) => x.data.value)];\r\n}\r\n\r\n/**\r\n * Utility function to update parent config.\r\n *\r\n * @param parent - The parent element.\r\n * @param config - The config to update.\r\n *\r\n * @returns void\r\n */\r\nexport function updateConfig(\r\n parent: HTMLElement,\r\n config: Partial>\r\n) {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n parents.set(parent, {\r\n ...parentData,\r\n config: { ...parentData.config, ...config },\r\n });\r\n\r\n dragAndDrop({\r\n parent,\r\n getValues: parentData.getValues,\r\n setValues: parentData.setValues,\r\n config,\r\n });\r\n}\r\n\r\n/**\r\n * Handle the parent drop event.\r\n *\r\n * @param data - The parent event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleParentDrop(\r\n data: ParentEventData,\r\n state: DragState\r\n) {\r\n sp(data.e);\r\n\r\n dropped = true;\r\n\r\n const handleEnd = state.initialParent.data.config.handleEnd;\r\n\r\n handleEnd(state);\r\n}\r\n\r\n/**\r\n * Tear down the parent.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @returns void\r\n */\r\nexport function tearDown(parent: HTMLElement) {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n if (parentData.abortControllers.mainParent)\r\n parentData.abortControllers.mainParent.abort();\r\n}\r\n\r\n/**\r\n * Check if the state is a drag state.\r\n *\r\n * @param state - The state to check.\r\n *\r\n * @returns Whether the state is a drag state.\r\n */\r\nexport function isDragState(\r\n state: BaseDragState\r\n): state is DragState | SynthDragState {\r\n return \"draggedNode\" in state && !!state.draggedNode;\r\n}\r\n\r\n/**\r\n * Check if the state is a synth drag state.\r\n *\r\n * @param state - The state to check.\r\n *\r\n * @returns Whether the state is a synth drag state.\r\n */\r\nexport function isSynthDragState(\r\n state: BaseDragState\r\n): state is SynthDragState {\r\n return \"synthDragging\" in state && !!state.synthDragging;\r\n}\r\n\r\n/**\r\n * Setup the parent.\r\n *\r\n * @param parent - The parent element.\r\n * @param parentData - The parent data.\r\n *\r\n * @returns void\r\n */\r\nfunction setup(parent: HTMLElement, parentData: ParentData): void {\r\n parentData.abortControllers.mainParent = addEvents(parent, {\r\n dragover: parentEventData(parentData.config.handleParentDragover),\r\n handleParentPointerover: parentData.config.handleParentPointerover,\r\n scroll: parentEventData(parentData.config.handleParentScroll),\r\n drop: parentEventData(parentData.config.handleParentDrop),\r\n hasNestedParent: (e: CustomEvent) => {\r\n const parent = parents.get(e.target as HTMLElement);\r\n\r\n if (!parent) return;\r\n\r\n parent.nestedParent = e.detail.parent;\r\n },\r\n focus: parentEventData(parentData.config.handleParentFocus),\r\n });\r\n\r\n if (\r\n parentData.config.externalDragHandle &&\r\n parentData.config.externalDragHandle.el &&\r\n parentData.config.externalDragHandle.callback\r\n ) {\r\n parentData.abortControllers.externalDragHandle = addEvents(\r\n parentData.config.externalDragHandle.el,\r\n {\r\n pointerdown: (_e: PointerEvent) => {\r\n if (\r\n !parentData.config.externalDragHandle ||\r\n !parentData.config.externalDragHandle.callback\r\n )\r\n return;\r\n\r\n const draggableItem = parentData.config.externalDragHandle.callback();\r\n\r\n if (!isNode(draggableItem)) {\r\n console.warn(\r\n \"No draggable item found from external drag handle callback\"\r\n );\r\n\r\n return;\r\n }\r\n\r\n const nodeData = nodes.get(draggableItem);\r\n\r\n if (!nodeData) return;\r\n\r\n const parentNode = draggableItem.parentNode;\r\n\r\n if (!(parentNode instanceof HTMLElement)) return;\r\n\r\n const parent = parents.get(parentNode);\r\n\r\n if (!parent) return;\r\n\r\n state.pointerDown = {\r\n parent: {\r\n el: parentNode,\r\n data: parent,\r\n },\r\n node: {\r\n el: draggableItem,\r\n data: nodeData,\r\n },\r\n validated: true,\r\n };\r\n\r\n draggableItem.draggable = true;\r\n },\r\n }\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Set the attributes of the element.\r\n *\r\n * @param el - The element.\r\n * @param attrs - The attributes to set.\r\n *\r\n * @returns void\r\n */\r\nexport function setAttrs(el: HTMLElement, attrs: Record) {\r\n for (const key in attrs) el.setAttribute(key, attrs[key]);\r\n}\r\n\r\n/**\r\n * Setup the node.\r\n *\r\n * @param data - The setup node data.\r\n *\r\n * @returns void\r\n */\r\nexport function setupNode(data: SetupNodeData) {\r\n const config = data.parent.data.config;\r\n\r\n data.node.data.abortControllers.mainNode = addEvents(data.node.el, {\r\n keydown: nodeEventData(config.handleNodeKeydown),\r\n dragstart: nodeEventData(config.handleDragstart),\r\n dragover: nodeEventData(config.handleNodeDragover),\r\n dragenter: nodeEventData(config.handleNodeDragenter),\r\n dragleave: nodeEventData(config.handleNodeDragleave),\r\n dragend: nodeEventData(config.handleDragend),\r\n drop: nodeEventData(config.handleNodeDrop),\r\n focus: nodeEventData(config.handleNodeFocus),\r\n blur: nodeEventData(config.handleNodeBlur),\r\n pointerup: nodeEventData(config.handleNodePointerup),\r\n pointercancel: nodeEventData(config.handlePointercancel),\r\n pointerdown: nodeEventData(config.handleNodePointerdown),\r\n handleNodePointerover: config.handleNodePointerover,\r\n touchmove: (e: TouchEvent) => {\r\n if (isDragState(state) && e.cancelable) pd(e);\r\n },\r\n contextmenu: (e: Event) => {\r\n if (isSynthDragState(state)) pd(e);\r\n },\r\n });\r\n\r\n data.node.el.draggable = true;\r\n\r\n config.reapplyDragClasses(data.node.el, data.parent.data);\r\n\r\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(data.parent.el)?.setupNode?.(data);\r\n });\r\n}\r\n\r\n/**\r\n * Setup the node remap.\r\n *\r\n * @param data - The setup node data.\r\n *\r\n * @returns void\r\n */\r\nexport function setupNodeRemap(data: SetupNodeData) {\r\n nodes.set(data.node.el, data.node.data);\r\n\r\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(data.parent.el)?.setupNodeRemap?.(data);\r\n });\r\n}\r\n\r\n/**\r\n * Reapply the drag classes to the node.\r\n *\r\n * @param node - The node.\r\n * @param parentData - The parent data.\r\n *\r\n * @returns void\r\n */\r\nfunction reapplyDragClasses(node: Node, parentData: ParentData) {\r\n if (!isDragState(state)) return;\r\n\r\n const dropZoneClass = isSynthDragState(state)\r\n ? parentData.config.synthDropZoneClass\r\n : parentData.config.dropZoneClass;\r\n\r\n if (state.draggedNode.el !== node) return;\r\n\r\n addNodeClass([node], dropZoneClass, true);\r\n}\r\n\r\n/**\r\n * Tear down the node remap.\r\n *\r\n * @param data - The tear down node data.\r\n *\r\n * @returns void\r\n */\r\nexport function tearDownNodeRemap(data: TearDownNodeData) {\r\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(data.parent.el)?.tearDownNodeRemap?.(data);\r\n });\r\n}\r\n\r\n/**\r\n * Tear down the node.\r\n *\r\n * @param data - The tear down node data.\r\n *\r\n * @returns void\r\n */\r\nexport function tearDownNode(data: TearDownNodeData) {\r\n data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(data.parent.el)?.tearDownNode?.(data);\r\n });\r\n\r\n data.node.el.draggable = false;\r\n\r\n if (data.node.data?.abortControllers?.mainNode)\r\n data.node.data?.abortControllers?.mainNode.abort();\r\n}\r\n\r\n/**\r\n * Called when the nodes of a given parent element are mutated.\r\n *\r\n * @param mutationList - The list of mutations.\r\n *\r\n * @returns void\r\n *\r\n * @internal\r\n */\r\nfunction nodesMutated(mutationList: MutationRecord[]) {\r\n // TODO: This could be better, but using it as a way to ignore comments and text\r\n if (\r\n mutationList.length === 1 &&\r\n mutationList[0].addedNodes.length === 1 &&\r\n !(mutationList[0].addedNodes[0] instanceof HTMLElement)\r\n )\r\n return;\r\n\r\n const parentEl = mutationList[0].target;\r\n\r\n if (!(parentEl instanceof HTMLElement)) return;\r\n\r\n const parentData = parents.get(parentEl);\r\n\r\n if (!parentData) return;\r\n\r\n remapNodes(parentEl);\r\n}\r\n\r\n/**\r\n * Remaps the data of the parent element's children.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @returns void\r\n *\r\n * @internal\r\n */\r\nexport function remapNodes(parent: HTMLElement, force?: boolean) {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n parentData.privateClasses = Array.from(parent.classList);\r\n\r\n const enabledNodes: Array = [];\r\n\r\n const config = parentData.config;\r\n\r\n for (let x = 0; x < parent.children.length; x++) {\r\n const node = parent.children[x];\r\n\r\n if (!isNode(node) || node.id === \"dnd-dragged-node-clone\") continue;\r\n\r\n const nodeData = nodes.get(node);\r\n\r\n // Only tear down the node if we have explicitly called dragAndDrop\r\n if (force || !nodeData)\r\n config.tearDownNode({\r\n parent: {\r\n el: parent,\r\n data: parentData,\r\n },\r\n node: {\r\n el: node,\r\n data: nodeData,\r\n },\r\n });\r\n\r\n if (config.disabled) continue;\r\n\r\n if (!config.draggable || (config.draggable && config.draggable(node))) {\r\n enabledNodes.push(node);\r\n }\r\n }\r\n\r\n if (\r\n enabledNodes.length !== parentData.getValues(parent).length &&\r\n !config.disabled\r\n ) {\r\n console.warn(\r\n \"The number of draggable items defined in the parent element does not match the number of values. This may cause unexpected behavior.\"\r\n );\r\n\r\n return;\r\n }\r\n\r\n const values = parentData.getValues(parent);\r\n\r\n const enabledNodeRecords: Array> = [];\r\n\r\n for (let x = 0; x < enabledNodes.length; x++) {\r\n const node = enabledNodes[x];\r\n\r\n const prevNodeData = nodes.get(node);\r\n\r\n if (config.draggableValue && !config.draggableValue(values[x])) continue;\r\n\r\n const nodeData = Object.assign(\r\n prevNodeData ?? {\r\n privateClasses: [],\r\n abortControllers: {},\r\n },\r\n {\r\n value: values[x],\r\n index: x,\r\n }\r\n );\r\n\r\n if (\r\n !isDragState(state) &&\r\n state.activeState &&\r\n eq(state.activeState.node.data.value, nodeData.value)\r\n ) {\r\n setActive(\r\n {\r\n data: parentData,\r\n el: parent,\r\n },\r\n {\r\n el: node,\r\n data: nodeData,\r\n },\r\n state\r\n );\r\n }\r\n\r\n if (\r\n isDragState(state) &&\r\n eq(state.draggedNode.data.value, nodeData.value)\r\n ) {\r\n state.draggedNode.data = nodeData;\r\n\r\n state.draggedNode.el = node;\r\n\r\n const draggedNode = state.draggedNodes.find(\r\n (x) => x.data.value === nodeData.value\r\n );\r\n\r\n if (draggedNode) draggedNode.el = node;\r\n }\r\n\r\n enabledNodeRecords.push({\r\n el: node,\r\n data: nodeData,\r\n });\r\n\r\n if (force || !prevNodeData)\r\n config.setupNode({\r\n parent: {\r\n el: parent,\r\n data: parentData,\r\n },\r\n node: {\r\n el: node,\r\n data: nodeData,\r\n },\r\n });\r\n\r\n setupNodeRemap({\r\n parent: {\r\n el: parent,\r\n data: parentData,\r\n },\r\n node: {\r\n el: node,\r\n data: nodeData,\r\n },\r\n });\r\n }\r\n\r\n parents.set(parent, { ...parentData, enabledNodes: enabledNodeRecords });\r\n\r\n config.remapFinished(parentData);\r\n\r\n parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\r\n plugin(parent)?.remapFinished?.();\r\n });\r\n}\r\n\r\n/**\r\n * Set the remap just finished flag.\r\n *\r\n * @returns void\r\n */\r\nexport function remapFinished() {\r\n state.remapJustFinished = true;\r\n\r\n if (\"draggedNode\" in state) state.affectedNodes = [];\r\n}\r\n\r\n/**\r\n * Validate the drag start.\r\n *\r\n * @param data - The node event data.\r\n *\r\n * @returns Whether the drag start is valid.\r\n */\r\nexport function validateDragstart(data: NodeEventData): boolean {\r\n return !!data.targetData.parent.data.config.nativeDrag;\r\n}\r\n\r\n/**\r\n * Get the dragged nodes.\r\n *\r\n * @param pointerDown - The pointer down data.\r\n *\r\n * @returns The dragged nodes.\r\n */\r\nfunction draggedNodes(pointerDown: {\r\n parent: ParentRecord;\r\n node: NodeRecord;\r\n}): Array> {\r\n if (!pointerDown.parent.data.config.multiDrag) {\r\n return [pointerDown.node];\r\n } else if (state.selectedState) {\r\n return [\r\n pointerDown.node,\r\n ...(state.selectedState?.nodes.filter(\r\n (x) => x.el !== pointerDown.node.el\r\n ) as Array>),\r\n ];\r\n }\r\n\r\n return [];\r\n}\r\n\r\n/**\r\n * Handle the parent scroll.\r\n *\r\n * @param data - The parent event data.\r\n *\r\n * @returns void\r\n */\r\nfunction handleParentScroll(_data: ParentEventData) {\r\n if (!isDragState(state)) return;\r\n\r\n state.emit(\"scrollStarted\", state);\r\n\r\n if (isSynthDragState(state)) return;\r\n\r\n state.preventEnter = true;\r\n\r\n if (scrollTimeout) clearTimeout(scrollTimeout);\r\n\r\n scrollTimeout = setTimeout(() => {\r\n state.preventEnter = false;\r\n\r\n state.emit(\"scrollEnded\", state);\r\n }, 100);\r\n}\r\n\r\n/**\r\n * Responsible for assigning dragstart classes to the dragged nodes.\r\n */\r\nexport function handleDragstart(\r\n data: NodeDragEventData,\r\n _state: BaseDragState\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (\r\n !config.nativeDrag ||\r\n !validateDragstart(data) ||\r\n !validateDragHandle({\r\n x: data.e.clientX,\r\n y: data.e.clientY,\r\n node: data.targetData.node,\r\n config,\r\n })\r\n ) {\r\n pd(data.e);\r\n\r\n return;\r\n }\r\n\r\n let nodes = config.draggedNodes({\r\n parent: data.targetData.parent,\r\n node: data.targetData.node,\r\n });\r\n\r\n // On Safari, pointerdown can sometimes not fire before the dragstart event.\r\n if (nodes.length === 0) {\r\n nodes = [data.targetData.node];\r\n }\r\n\r\n config.dragstartClasses(data.targetData.node, nodes, config);\r\n\r\n const dragState = initDrag(data, nodes);\r\n\r\n if (config.onDragstart) {\r\n const dragstartData: DragstartEventData = {\r\n parent: data.targetData.parent,\r\n values: parentValues(\r\n data.targetData.parent.el,\r\n data.targetData.parent.data\r\n ),\r\n draggedNode: dragState.draggedNode,\r\n draggedNodes: dragState.draggedNodes,\r\n position: dragState.initialIndex,\r\n state: dragState,\r\n };\r\n config.onDragstart(dragstartData);\r\n }\r\n}\r\n\r\nexport function handleNodePointerdown(\r\n data: NodePointerEventData,\r\n state: BaseDragState\r\n) {\r\n sp(data.e);\r\n\r\n state.pointerDown = {\r\n parent: data.targetData.parent,\r\n node: data.targetData.node,\r\n validated: false,\r\n };\r\n\r\n if (\r\n !validateDragHandle({\r\n x: data.e.clientX,\r\n y: data.e.clientY,\r\n node: data.targetData.node,\r\n config: data.targetData.parent.data.config,\r\n })\r\n )\r\n return;\r\n\r\n state.pointerDown.validated = true;\r\n\r\n handleLongPress(data, state, data.targetData.node);\r\n\r\n const parentData = data.targetData.parent.data;\r\n\r\n let selectedNodes = [data.targetData.node];\r\n\r\n const commandKey = data.e.ctrlKey || data.e.metaKey;\r\n\r\n const shiftKey = data.e.shiftKey;\r\n\r\n const targetNode = data.targetData.node;\r\n\r\n if (commandKey && parentData.config.multiDrag) {\r\n if (state.selectedState) {\r\n const idx = state.selectedState.nodes.findIndex(\r\n (x) => x.el === targetNode.el\r\n );\r\n\r\n if (idx === -1) {\r\n selectedNodes = [...state.selectedState.nodes, targetNode];\r\n } else {\r\n selectedNodes = state.selectedState.nodes.filter(\r\n (x) => x.el !== targetNode.el\r\n );\r\n }\r\n } else {\r\n selectedNodes = [targetNode];\r\n }\r\n\r\n setSelected(\r\n data.targetData.parent,\r\n selectedNodes,\r\n data.targetData.node,\r\n state,\r\n true\r\n );\r\n\r\n return;\r\n }\r\n\r\n if (shiftKey && parentData.config.multiDrag) {\r\n const nodes = data.targetData.parent.data.enabledNodes;\r\n\r\n if (state.selectedState && state.activeState) {\r\n if (state.selectedState.parent.el !== data.targetData.parent.el) {\r\n deselect(state.selectedState.nodes, state.selectedState.parent, state);\r\n\r\n state.selectedState = undefined;\r\n\r\n for (let x = 0; x <= targetNode.data.index; x++)\r\n selectedNodes.push(nodes[x]);\r\n } else {\r\n const [minIndex, maxIndex] =\r\n state.activeState.node.data.index < data.targetData.node.data.index\r\n ? [\r\n state.activeState.node.data.index,\r\n data.targetData.node.data.index,\r\n ]\r\n : [\r\n data.targetData.node.data.index,\r\n state.activeState.node.data.index,\r\n ];\r\n\r\n selectedNodes = nodes.slice(minIndex, maxIndex + 1);\r\n }\r\n } else {\r\n for (let x = 0; x <= targetNode.data.index; x++)\r\n selectedNodes.push(nodes[x]);\r\n }\r\n\r\n setSelected(\r\n data.targetData.parent,\r\n selectedNodes,\r\n data.targetData.node,\r\n state,\r\n true\r\n );\r\n\r\n return;\r\n }\r\n\r\n if (state.selectedState?.nodes?.length) {\r\n const idx = state.selectedState.nodes.findIndex(\r\n (x) => x.el === data.targetData.node.el\r\n );\r\n\r\n if (idx === -1) {\r\n if (state.selectedState.parent.el !== data.targetData.parent.el) {\r\n deselect(state.selectedState.nodes, data.targetData.parent, state);\r\n } else if (parentData.config.multiDrag && isMobilePlatform()) {\r\n selectedNodes.push(...state.selectedState.nodes);\r\n } else {\r\n deselect(state.selectedState.nodes, data.targetData.parent, state);\r\n }\r\n\r\n setSelected(\r\n data.targetData.parent,\r\n selectedNodes,\r\n data.targetData.node,\r\n state,\r\n true\r\n );\r\n }\r\n } else {\r\n setSelected(\r\n data.targetData.parent,\r\n [data.targetData.node],\r\n data.targetData.node,\r\n state,\r\n true\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Add dragstart classes to the nodes.\r\n *\r\n * @param node - The node.\r\n * @param nodes - The nodes.\r\n * @param config - The parent config.\r\n * @param isSynth - Whether the drag is synthetic.\r\n *\r\n * @returns void\r\n */\r\nexport function dragstartClasses(\r\n _node: NodeRecord,\r\n nodes: Array>,\r\n config: ParentConfig,\r\n isSynth = false\r\n) {\r\n addNodeClass(\r\n nodes.map((x) => x.el),\r\n isSynth ? config.synthDraggingClass : config.draggingClass\r\n );\r\n\r\n setTimeout(() => {\r\n removeClass(\r\n nodes.map((x) => x.el),\r\n isSynth ? config.synthDraggingClass : config.draggingClass\r\n );\r\n\r\n addNodeClass(\r\n nodes.map((x) => x.el),\r\n isSynth ? config.synthDragPlaceholderClass : config.dragPlaceholderClass\r\n );\r\n\r\n addNodeClass(\r\n nodes.map((x) => x.el),\r\n isSynth ? config.synthDropZoneClass : config.dropZoneClass\r\n );\r\n\r\n removeClass(\r\n nodes.map((x) => x.el),\r\n config.selectedClass\r\n );\r\n });\r\n}\r\n\r\nexport function initDrag(\r\n data: NodeDragEventData,\r\n draggedNodes: Array>\r\n): DragState {\r\n sp(data.e);\r\n\r\n const dragState = setDragState(\r\n dragStateProps(\r\n data.targetData.node,\r\n data.targetData.parent,\r\n data.e,\r\n draggedNodes\r\n )\r\n );\r\n\r\n if (data.e.dataTransfer) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n data.e.dataTransfer.dropEffect = config.dragDropEffect;\r\n data.e.dataTransfer.effectAllowed = config.dragEffectAllowed;\r\n\r\n let dragImage: HTMLElement | undefined;\r\n\r\n data.e.dataTransfer.setData(\"text/plain\", \"\");\r\n\r\n if (config.dragImage) {\r\n dragImage = config.dragImage(data, draggedNodes);\r\n } else {\r\n if (!config.multiDrag || draggedNodes.length === 1) {\r\n dragState.originalZIndex = data.targetData.node.el.style.zIndex;\r\n\r\n data.targetData.node.el.style.zIndex = \"9999\";\r\n data.targetData.node.el.style.boxSizing = \"border-box\";\r\n\r\n data.e.dataTransfer.setDragImage(\r\n data.targetData.node.el,\r\n data.e.offsetX,\r\n data.e.offsetY\r\n );\r\n return dragState;\r\n } else {\r\n const wrapper = document.createElement(\"div\");\r\n\r\n wrapper.setAttribute(\"id\", \"dnd-dragged-node-clone\");\r\n\r\n wrapper.setAttribute(\"popover\", \"manual\");\r\n\r\n for (const node of draggedNodes) {\r\n const clone = node.el.cloneNode(true) as HTMLElement;\r\n\r\n clone.id = node.el.id + \"-clone\";\r\n\r\n clone.style.pointerEvents = \"none\";\r\n\r\n wrapper.appendChild(clone);\r\n }\r\n\r\n const { width } = draggedNodes[0].el.getBoundingClientRect();\r\n\r\n Object.assign(wrapper.style, {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n width: `${width}px`,\r\n position: \"absolute\",\r\n pointerEvents: \"none\",\r\n zIndex: \"9999\",\r\n left: \"-9999px\",\r\n boxSizing: \"border-box\",\r\n background: \"transparent\",\r\n overflow: \"hidden\",\r\n });\r\n\r\n data.targetData.parent.el.appendChild(wrapper);\r\n\r\n wrapper.showPopover();\r\n\r\n wrapper.getBoundingClientRect(); // ← forces layout\r\n\r\n dragImage = wrapper;\r\n\r\n data.e.dataTransfer.setDragImage(\r\n dragImage,\r\n data.e.offsetX,\r\n data.e.offsetY\r\n );\r\n }\r\n }\r\n\r\n setTimeout(() => {\r\n dragImage?.remove();\r\n });\r\n }\r\n\r\n return dragState;\r\n}\r\n\r\nexport function validateDragHandle({\r\n x,\r\n y,\r\n node,\r\n config,\r\n}: {\r\n x: number;\r\n y: number;\r\n node: NodeRecord;\r\n config: ParentConfig;\r\n}): boolean {\r\n if (config.externalDragHandle) return false;\r\n\r\n if (!config.dragHandle) return true;\r\n\r\n const dragHandles = node.el.querySelectorAll(config.dragHandle);\r\n\r\n if (!dragHandles) return false;\r\n\r\n const elFromPoint = config.root.elementFromPoint(x, y);\r\n\r\n if (!elFromPoint) return false;\r\n\r\n for (const handle of Array.from(dragHandles))\r\n if (elFromPoint === handle || handle.contains(elFromPoint)) return true;\r\n\r\n return false;\r\n}\r\n\r\nexport function handleClickNode(_data: NodeEventData) {}\r\n\r\nexport function handleClickParent(_data: ParentEventData) {}\r\n\r\nexport function handleNodeKeydown(_data: NodeEventData) {}\r\n\r\n/**\r\n * Prevent the sort on scroll.\r\n *\r\n * @returns A function to prevent the sort on scroll.\r\n */\r\nexport function preventSortOnScroll() {\r\n let scrollTimeout: ReturnType;\r\n\r\n return () => {\r\n clearTimeout(scrollTimeout);\r\n\r\n if (state) state.preventEnter = true;\r\n\r\n scrollTimeout = setTimeout(() => {\r\n if (state) state.preventEnter = false;\r\n }, 100);\r\n };\r\n}\r\n\r\n/**\r\n * Handle the node pointer over.\r\n *\r\n * @param e - The node pointer over event.\r\n *\r\n * @returns void\r\n */\r\nexport function handleNodePointerover(e: PointeroverNodeEvent) {\r\n if (e.detail.targetData.parent.el === e.detail.state.currentParent.el)\r\n sort(e.detail, e.detail.state);\r\n else transfer(e.detail, e.detail.state);\r\n}\r\n\r\n/**\r\n * Handle the node drop.\r\n *\r\n * @param data - The node drag event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleNodeDrop(\r\n data: NodeDragEventData,\r\n state: DragState | SynthDragState\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (!config.nativeDrag) return;\r\n\r\n sp(data.e);\r\n\r\n dropped = true;\r\n\r\n config.handleEnd(state);\r\n}\r\n\r\nexport function handleNodeFocus(data: NodeEventData) {\r\n if (data.e.target === data.e.currentTarget) return;\r\n\r\n if (state.pointerDown) state.pointerDown.node.el.draggable = false;\r\n}\r\n\r\nexport function handleNodeBlur(data: NodeEventData) {\r\n if (data.e.target === data.e.currentTarget) return;\r\n\r\n if (state.pointerDown) state.pointerDown.node.el.draggable = true;\r\n}\r\n\r\n/**\r\n * Handle the drag end.\r\n *\r\n * @param data - The node drag event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleDragend(\r\n data: NodeDragEventData,\r\n state: DragState\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (!config.nativeDrag) return;\r\n\r\n pd(data.e);\r\n\r\n sp(data.e);\r\n\r\n if (dropped) {\r\n dropped = false;\r\n\r\n return;\r\n }\r\n\r\n config.handleEnd(state);\r\n}\r\n\r\n/**\r\n * Handle the pointer cancel.\r\n *\r\n * @param data - The node event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handlePointercancel(\r\n data: NodeEventData,\r\n state: DragState | SynthDragState | BaseDragState\r\n) {\r\n if (!isSynthDragState(state)) return;\r\n\r\n pd(data.e);\r\n\r\n if (dropped) {\r\n dropped = false;\r\n\r\n return;\r\n }\r\n\r\n const config = parents.get(state.initialParent.el)?.config;\r\n\r\n if (config?.onDragend) {\r\n config.onDragend({\r\n parent: state.currentParent,\r\n values: parentValues(state.currentParent.el, state.currentParent.data),\r\n draggedNode: state.draggedNode,\r\n draggedNodes: state.draggedNodes,\r\n state,\r\n });\r\n }\r\n\r\n config?.handleEnd(state);\r\n}\r\n\r\n/**\r\n * Handle the drag end.\r\n *\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleEnd(state: DragState | SynthDragState) {\r\n if (state.draggedNode) state.draggedNode.el.draggable = true;\r\n\r\n // --- Capture necessary data BEFORE resetState might affect it ---\r\n const nodesToClean = state.draggedNodes.map((x) => x.el);\r\n const initialParentData = state.initialParent.data;\r\n const isSynth = isSynthDragState(state);\r\n const config = parents.get(state.initialParent.el)?.config;\r\n const dropZoneClass = isSynth\r\n ? config?.synthDropZoneClass\r\n : config?.dropZoneClass;\r\n const longPressClass = initialParentData?.config?.longPressClass;\r\n const placeholderClass = isSynth\r\n ? initialParentData?.config?.synthDragPlaceholderClass // Corrected potential typo: used initialParentData\r\n : initialParentData?.config?.dragPlaceholderClass;\r\n const originalZIndex = state.originalZIndex;\r\n // --- End data capture ---\r\n\r\n if (isSynthDragState(state)) {\r\n // Ensure cloned node removal happens reasonably quickly\r\n if (state.clonedDraggedNode) {\r\n // Check if it exists\r\n state.clonedDraggedNode.remove();\r\n }\r\n if (state.longPressTimeout) {\r\n // Check if timeout exists\r\n clearTimeout(state.longPressTimeout);\r\n }\r\n }\r\n\r\n // Ensure scrolling is properly cancelled (needs state, do before reset)\r\n cancelSynthScroll(state);\r\n\r\n // Clear any lingering scroll directions and timeouts (needs state, do before reset)\r\n state.lastScrollDirectionX = undefined;\r\n state.lastScrollDirectionY = undefined;\r\n state.preventEnter = false;\r\n if (state.scrollDebounceTimeout) {\r\n clearTimeout(state.scrollDebounceTimeout);\r\n state.scrollDebounceTimeout = undefined; // Ensure it's marked as cleared\r\n }\r\n\r\n // Apply z-index change synchronously if needed\r\n if (originalZIndex !== undefined && state.draggedNode) {\r\n state.draggedNode.el.style.zIndex = originalZIndex;\r\n }\r\n\r\n // Use single rAF with captured data for class removal\r\n requestAnimationFrame(() => {\r\n // Use the captured data, not the potentially reset global state\r\n removeClass(nodesToClean, dropZoneClass);\r\n removeClass(nodesToClean, longPressClass);\r\n removeClass(nodesToClean, placeholderClass);\r\n });\r\n\r\n // Deselect and reset active state (needs state, do before reset)\r\n deselect(state.draggedNodes, state.currentParent, state);\r\n setActive(state.currentParent, undefined, state);\r\n\r\n // Prepare data for callback/event *before* resetState\r\n const finalStateForCallback = { ...state }; // Shallow copy for safety\r\n\r\n // Call onDragend callback *before* resetState\r\n config?.onDragend?.({\r\n parent: finalStateForCallback.currentParent,\r\n values: parentValues(\r\n finalStateForCallback.currentParent.el,\r\n finalStateForCallback.currentParent.data\r\n ),\r\n draggedNode: finalStateForCallback.draggedNode,\r\n draggedNodes: finalStateForCallback.draggedNodes,\r\n state: finalStateForCallback,\r\n });\r\n\r\n // Emit event *before* resetState\r\n state.emit(\"dragEnded\", finalStateForCallback); // Emit with the final state representation\r\n\r\n // Reset global state LAST\r\n resetState();\r\n\r\n // No need to set state.selectedState = undefined; resetState handles it.\r\n}\r\n\r\n/**\r\n * Handle the node pointer up.\r\n *\r\n * @param data - The node pointer event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleNodePointerup(\r\n data: NodePointerEventData,\r\n state: DragState | SynthDragState | BaseDragState\r\n) {\r\n sp(data.e);\r\n\r\n if (!state.pointerSelection && state.selectedState)\r\n deselect(state.selectedState.nodes, data.targetData.parent, state);\r\n\r\n const config = data.targetData.parent.data.config;\r\n\r\n state.pointerSelection = false;\r\n\r\n if (\"longPressTimeout\" in state && state.longPressTimeout)\r\n clearTimeout(state.longPressTimeout);\r\n\r\n state.longPress = false;\r\n\r\n removeClass(\r\n data.targetData.parent.data.enabledNodes.map((x) => x.el),\r\n config.longPressClass\r\n );\r\n\r\n if (!isDragState(state)) return;\r\n\r\n config.handleEnd(state as DragState | SynthDragState);\r\n}\r\n\r\n/**\r\n * Initialize the synth drag.\r\n *\r\n * @param node - The node.\r\n * @param parent - The parent.\r\n * @param e - The pointer event.\r\n * @param _state - The drag state.\r\n * @param draggedNodes - The dragged nodes.\r\n * @param rect - The bounding rect of the original element\r\n *\r\n * @returns The synth drag state.\r\n */\r\nfunction initSynthDrag(\r\n node: NodeRecord,\r\n parent: ParentRecord,\r\n e: PointerEvent,\r\n _state: BaseDragState,\r\n draggedNodes: Array>,\r\n rect: DOMRect\r\n): SynthDragState {\r\n const config = parent.data.config;\r\n\r\n let dragImage: HTMLElement;\r\n\r\n let result:\r\n | { dragImage: HTMLElement; offsetX?: number; offsetY?: number }\r\n | undefined;\r\n\r\n const criticalStyleProps = [\r\n \"display\",\r\n \"flexDirection\",\r\n \"alignItems\",\r\n \"justifyContent\",\r\n \"padding\",\r\n \"paddingTop\",\r\n \"margin\",\r\n \"marginTop\",\r\n \"marginBottom\",\r\n \"marginLeft\",\r\n \"marginRight\",\r\n \"paddingBottom\",\r\n \"paddingLeft\",\r\n \"paddingRight\",\r\n \"border\",\r\n \"borderRadius\",\r\n \"background\",\r\n \"backgroundColor\",\r\n \"boxShadow\",\r\n \"font\",\r\n \"color\",\r\n \"lineHeight\",\r\n \"gap\",\r\n \"width\",\r\n \"height\",\r\n \"boxSizing\",\r\n \"overflow\",\r\n ] as const;\r\n\r\n const copyCriticalStyles = (src: HTMLElement, dest: HTMLElement) => {\r\n const computed = window.getComputedStyle(src);\r\n criticalStyleProps.forEach((prop) => {\r\n dest.style[prop] = computed[prop]!;\r\n });\r\n };\r\n\r\n // Helper to style the drag image\r\n const applyBaseStyles = (\r\n el: HTMLElement,\r\n extraStyles: Partial = {}\r\n ) => {\r\n Object.assign(el.style, {\r\n position: \"absolute\",\r\n zIndex: \"9999\",\r\n pointerEvents: \"none\",\r\n willChange: \"transform\",\r\n boxSizing: \"border-box\",\r\n opacity: \"0\",\r\n overflow: \"hidden\",\r\n width: `${rect.width}px`,\r\n height: `${rect.height}px`,\r\n ...extraStyles,\r\n });\r\n };\r\n\r\n // Custom drag image\r\n if (config.synthDragImage) {\r\n result = config.synthDragImage(node, parent, e, draggedNodes);\r\n dragImage = result.dragImage;\r\n dragImage.setAttribute(\"popover\", \"manual\");\r\n applyBaseStyles(dragImage);\r\n }\r\n\r\n // Single drag\r\n else if (!config.multiDrag || draggedNodes.length === 1) {\r\n dragImage = node.el.cloneNode(true) as HTMLElement;\r\n copyCriticalStyles(node.el as HTMLElement, dragImage);\r\n dragImage.setAttribute(\"popover\", \"manual\");\r\n applyBaseStyles(dragImage);\r\n }\r\n\r\n // Multi-drag\r\n else {\r\n const wrapper = document.createElement(\"div\");\r\n\r\n wrapper.setAttribute(\"popover\", \"manual\");\r\n\r\n draggedNodes.forEach((dragged) => {\r\n const clone = dragged.el.cloneNode(true) as HTMLElement;\r\n\r\n copyCriticalStyles(dragged.el as HTMLElement, clone);\r\n\r\n clone.style.pointerEvents = \"none\";\r\n\r\n clone.style.margin = \"0\";\r\n\r\n wrapper.append(clone);\r\n });\r\n\r\n wrapper.style.display = \"flex\";\r\n wrapper.style.flexDirection = \"column\";\r\n wrapper.style.padding = \"0\";\r\n wrapper.style.margin = \"0\";\r\n wrapper.style.position = \"absolute\";\r\n wrapper.style.zIndex = \"9999\";\r\n wrapper.style.pointerEvents = \"none\";\r\n\r\n dragImage = wrapper;\r\n }\r\n\r\n dragImage.id = \"dnd-dragged-node-clone\";\r\n\r\n parent.el.appendChild(dragImage);\r\n\r\n dragImage.showPopover();\r\n\r\n const synthDragStateProps = {\r\n clonedDraggedEls: [],\r\n clonedDraggedNode: dragImage,\r\n synthDragScrolling: false,\r\n synthDragging: true,\r\n rootScrollWidth: document.scrollingElement?.scrollWidth,\r\n rootScrollHeight: document.scrollingElement?.scrollHeight,\r\n };\r\n\r\n const synthDragState = setDragState({\r\n ...dragStateProps(\r\n node,\r\n parent,\r\n e,\r\n draggedNodes,\r\n result?.offsetX,\r\n result?.offsetY\r\n ),\r\n ...synthDragStateProps,\r\n }) as SynthDragState;\r\n\r\n return synthDragState;\r\n}\r\n\r\n/**\r\n * Handle the long press.\r\n *\r\n * @param data - The node pointer event data.\r\n * @param state - The drag state.\r\n * @param node - The node.\r\n *\r\n * @returns void\r\n */\r\nexport function handleLongPress(\r\n data: NodePointerEventData,\r\n state: BaseDragState,\r\n node: NodeRecord\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n state.longPressTimeout = setTimeout(() => {\r\n if (!state) return;\r\n\r\n state.longPress = true;\r\n\r\n if (config.longPressClass && data.e.cancelable)\r\n addNodeClass([node.el], config.longPressClass);\r\n\r\n pd(data.e);\r\n }, config.longPressDuration || 1000);\r\n}\r\n\r\nfunction cancelSynthScroll(\r\n state: DragState,\r\n cancelX = true,\r\n cancelY = true\r\n) {\r\n if (cancelX) {\r\n if (state.frameIdX !== undefined) {\r\n cancelAnimationFrame(state.frameIdX);\r\n state.frameIdX = undefined;\r\n }\r\n state.lastScrollDirectionX = undefined;\r\n }\r\n\r\n if (cancelY) {\r\n if (state.frameIdY !== undefined) {\r\n cancelAnimationFrame(state.frameIdY);\r\n state.frameIdY = undefined;\r\n }\r\n state.lastScrollDirectionY = undefined;\r\n }\r\n\r\n if (!state.frameIdX && !state.frameIdY) {\r\n state.preventEnter = false;\r\n }\r\n}\r\n\r\nfunction moveNode(state: SynthDragState, justStarted = false) {\r\n const { x, y } = state.coordinates;\r\n\r\n const startLeft = state.startLeft ?? 0;\r\n const startTop = state.startTop ?? 0;\r\n\r\n const currentScrollX = window.scrollX ?? 0;\r\n const currentScrollY = window.scrollY ?? 0;\r\n\r\n const translateX = x - startLeft + currentScrollX;\r\n const translateY = y - startTop + currentScrollY;\r\n\r\n state.clonedDraggedNode.style.transform = `translate3d(${translateX}px, ${translateY}px, 0px)`;\r\n\r\n if (justStarted) {\r\n state.clonedDraggedNode.style.opacity = \"1\";\r\n\r\n removeClass(\r\n state.draggedNodes.map((x) => x.el),\r\n state.initialParent.data.config?.longPressClass\r\n );\r\n }\r\n}\r\n\r\nexport function synthMove(\r\n e: PointerEvent,\r\n state: SynthDragState,\r\n justStarted = false\r\n) {\r\n const coordinates = eventCoordinates(e);\r\n state.coordinates.x = coordinates.x;\r\n state.coordinates.y = coordinates.y;\r\n\r\n moveNode(state, justStarted); // Pass only state now\r\n\r\n // Clear any existing timeout to avoid multiple concurrent timeouts\r\n if (state.scrollDebounceTimeout) {\r\n clearTimeout(state.scrollDebounceTimeout);\r\n state.scrollDebounceTimeout = undefined;\r\n }\r\n\r\n // Only set a new timeout if we're still in a valid drag state\r\n state.scrollDebounceTimeout = setTimeout(() => {\r\n // Only process if the drag state is still active\r\n if (isSynthDragState(state)) {\r\n handleSynthScroll(state.coordinates, e, state);\r\n }\r\n }, 16); // ~1 frame (60fps)\r\n\r\n const elFromPoint = getElFromPoint(coordinates);\r\n\r\n if (!elFromPoint) {\r\n document.dispatchEvent(\r\n new CustomEvent(\"handleRootPointerover\", {\r\n detail: {\r\n e,\r\n state,\r\n },\r\n })\r\n );\r\n\r\n return;\r\n }\r\n\r\n const pointerMoveEventData = {\r\n e,\r\n targetData: elFromPoint,\r\n state,\r\n };\r\n\r\n if (\"node\" in elFromPoint) {\r\n elFromPoint.node.el.dispatchEvent(\r\n new CustomEvent(\"handleNodePointerover\", {\r\n detail: pointerMoveEventData,\r\n })\r\n );\r\n } else {\r\n elFromPoint.parent.el.dispatchEvent(\r\n new CustomEvent(\"handleParentPointerover\", {\r\n detail: pointerMoveEventData,\r\n })\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Handle the node drag over.\r\n *\r\n * @param data - The node drag event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleNodeDragover(\r\n data: NodeDragEventData,\r\n state: DragState\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (!config.nativeDrag) return;\r\n\r\n const { x, y } = eventCoordinates(data.e);\r\n\r\n state.coordinates.y = y;\r\n\r\n state.coordinates.x = x;\r\n\r\n pd(data.e);\r\n\r\n sp(data.e);\r\n\r\n if (isDragState(state)) {\r\n handleSynthScroll({ x, y }, data.e, state);\r\n }\r\n\r\n data.targetData.parent.el === state.currentParent?.el\r\n ? sort(data, state)\r\n : transfer(data, state);\r\n}\r\n\r\n/**\r\n * Handle the parent drag over.\r\n *\r\n * @param data - The parent drag event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function handleParentDragover(\r\n data: ParentDragEventData,\r\n state: DragState\r\n) {\r\n const config = data.targetData.parent.data.config;\r\n\r\n if (!config.nativeDrag) return;\r\n\r\n pd(data.e);\r\n\r\n sp(data.e);\r\n\r\n const { x, y } = eventCoordinates(data.e);\r\n\r\n if (isDragState(state)) {\r\n handleSynthScroll({ x, y }, data.e, state);\r\n }\r\n\r\n transfer(data, state);\r\n}\r\n\r\n/**\r\n * Handle the parent pointer over.\r\n *\r\n * @param e - The parent pointer over event.\r\n *\r\n * @returns void\r\n */\r\nexport function handleParentPointerover(e: PointeroverParentEvent) {\r\n if (e.detail.targetData.parent.el !== e.detail.state.currentParent.el)\r\n transfer(e.detail, e.detail.state);\r\n}\r\n\r\n/**\r\n * Validate the transfer.\r\n *\r\n * @param data - The transfer data.\r\n *\r\n * @returns Whether the transfer is valid.\r\n */\r\nexport function validateTransfer({\r\n currentParent,\r\n targetParent,\r\n initialParent,\r\n draggedNodes,\r\n state,\r\n}: {\r\n currentParent: ParentRecord;\r\n targetParent: ParentRecord;\r\n initialParent: ParentRecord;\r\n draggedNodes: Array>;\r\n state: BaseDragState;\r\n}) {\r\n if (targetParent.el === currentParent.el) return false;\r\n\r\n const targetConfig = targetParent.data.config;\r\n\r\n if (draggedNodes[0].el.contains(targetParent.el)) return false;\r\n\r\n if (targetConfig.dropZone === false) return false;\r\n\r\n const initialParentConfig = initialParent.data.config;\r\n\r\n if (targetConfig.accepts) {\r\n return targetConfig.accepts(\r\n targetParent,\r\n initialParent,\r\n currentParent,\r\n state\r\n );\r\n } else if (\r\n !targetConfig.group ||\r\n targetConfig.group !== initialParentConfig.group\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Handle the node drag enter.\r\n *\r\n * @param data - The node drag event data.\r\n * @param _state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nfunction handleNodeDragenter(\r\n data: NodeDragEventData,\r\n _state: DragState\r\n) {\r\n pd(data.e);\r\n}\r\n\r\n/**\r\n * Handle the node drag leave.\r\n *\r\n * @param data - The node drag event data.\r\n * @param _state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nfunction handleNodeDragleave(\r\n data: NodeDragEventData,\r\n _state: DragState\r\n) {\r\n pd(data.e);\r\n}\r\n\r\n/**\r\n * Validate the sort.\r\n *\r\n * @param data - The node drag event data or node pointer event data.\r\n * @param state - The drag state.\r\n * @param x - The x coordinate.\r\n * @param y - The y coordinate.\r\n *\r\n * @returns Whether the sort is valid.\r\n */\r\nexport function validateSort(\r\n data: NodeDragEventData | NodePointerEventData,\r\n state: DragState,\r\n x: number,\r\n y: number\r\n): boolean {\r\n if (\r\n state.affectedNodes\r\n .map((x) => x.data.value)\r\n .includes(data.targetData.node.data.value)\r\n ) {\r\n return false;\r\n }\r\n\r\n if (state.remapJustFinished) {\r\n state.remapJustFinished = false;\r\n\r\n if (\r\n data.targetData.node.data.value === state.currentTargetValue ||\r\n state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)\r\n ) {\r\n state.currentTargetValue = data.targetData.node.data.value;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n if (state.preventEnter) return false;\r\n\r\n if (state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)) {\r\n state.currentTargetValue = undefined;\r\n\r\n return false;\r\n }\r\n\r\n if (data.targetData.node.data.value === state.currentTargetValue)\r\n return false;\r\n\r\n if (\r\n data.targetData.parent.el !== state.currentParent?.el ||\r\n data.targetData.parent.data.config.sortable === false\r\n )\r\n return false;\r\n\r\n if (data.targetData.node.el.contains(state.draggedNodes[0].el)) return false;\r\n\r\n const targetRect = data.targetData.node.el.getBoundingClientRect();\r\n\r\n const dragRect = state.draggedNode.el.getBoundingClientRect();\r\n\r\n const yDiff = targetRect.y - dragRect.y;\r\n\r\n const xDiff = targetRect.x - dragRect.x;\r\n\r\n let incomingDirection: \"above\" | \"below\" | \"left\" | \"right\";\r\n\r\n if (Math.abs(yDiff) > Math.abs(xDiff)) {\r\n incomingDirection = yDiff > 0 ? \"above\" : \"below\";\r\n } else {\r\n incomingDirection = xDiff > 0 ? \"left\" : \"right\";\r\n }\r\n\r\n const threshold = state.currentParent.data.config.threshold;\r\n\r\n switch (incomingDirection) {\r\n case \"left\":\r\n if (x > targetRect.x + targetRect.width * threshold.horizontal) {\r\n state.incomingDirection = \"left\";\r\n\r\n return true;\r\n }\r\n break;\r\n\r\n case \"right\":\r\n if (x < targetRect.x + targetRect.width * (1 - threshold.horizontal)) {\r\n state.incomingDirection = \"right\";\r\n\r\n return true;\r\n }\r\n break;\r\n\r\n case \"above\":\r\n if (y > targetRect.y + targetRect.height * threshold.vertical) {\r\n state.incomingDirection = \"above\";\r\n\r\n return true;\r\n }\r\n break;\r\n\r\n case \"below\":\r\n if (y < targetRect.y + targetRect.height * (1 - threshold.vertical)) {\r\n state.incomingDirection = \"below\";\r\n\r\n return true;\r\n }\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Sort the nodes.\r\n *\r\n * @param data - The node drag event data or node pointer event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function sort(\r\n data: NodeDragEventData | NodePointerEventData,\r\n state: DragState\r\n) {\r\n const { x, y } = eventCoordinates(data.e);\r\n\r\n if (!validateSort(data, state, x, y)) {\r\n return;\r\n }\r\n\r\n const range =\r\n state.draggedNode.data.index > data.targetData.node.data.index\r\n ? [data.targetData.node.data.index, state.draggedNode.data.index]\r\n : [state.draggedNode.data.index, data.targetData.node.data.index];\r\n\r\n state.targetIndex = data.targetData.node.data.index;\r\n\r\n state.affectedNodes = data.targetData.parent.data.enabledNodes.filter(\r\n (node) => {\r\n return (\r\n range[0] <= node.data.index &&\r\n node.data.index <= range[1] &&\r\n node.el !== state.draggedNode.el\r\n );\r\n }\r\n );\r\n\r\n data.targetData.parent.data.config.performSort({\r\n parent: data.targetData.parent,\r\n draggedNodes: state.draggedNodes,\r\n targetNodes: [data.targetData.node],\r\n });\r\n}\r\n\r\n/**\r\n * Event listener used for all nodes.\r\n *\r\n * @param e - The event.\r\n *\r\n */\r\nexport function nodeEventData(\r\n callback: any\r\n): (e: Event) => NodeEventData | undefined {\r\n function nodeTargetData(node: Node): NodeTargetData | undefined {\r\n const nodeData = nodes.get(node);\r\n\r\n if (!nodeData) return;\r\n\r\n const parentData = parents.get(node.parentNode);\r\n\r\n if (!parentData) return;\r\n\r\n return {\r\n node: {\r\n el: node,\r\n data: nodeData,\r\n },\r\n parent: {\r\n el: node.parentNode,\r\n data: parentData,\r\n },\r\n };\r\n }\r\n\r\n return (e: Event) => {\r\n const targetData = nodeTargetData(e.currentTarget as Node);\r\n\r\n if (!targetData) return;\r\n\r\n return callback(\r\n {\r\n e,\r\n targetData,\r\n },\r\n state\r\n );\r\n };\r\n}\r\n\r\n/**\r\n * Transfer the nodes.\r\n *\r\n * @param data - The node event data or parent event data.\r\n * @param state - The drag state.\r\n *\r\n * @returns void\r\n */\r\nexport function transfer(\r\n data: NodeEventData | ParentEventData,\r\n state: DragState\r\n): void {\r\n pd(data.e);\r\n\r\n if (\r\n !validateTransfer({\r\n currentParent: state.currentParent,\r\n targetParent: data.targetData.parent as any,\r\n initialParent: state.initialParent,\r\n draggedNodes: state.draggedNodes,\r\n state,\r\n })\r\n )\r\n return;\r\n\r\n data.targetData.parent.data.config.performTransfer({\r\n currentParent: state.currentParent,\r\n targetParent: data.targetData.parent,\r\n initialParent: state.initialParent,\r\n draggedNodes: state.draggedNodes,\r\n initialIndex: state.initialIndex,\r\n state,\r\n targetNodes: \"node\" in data.targetData ? [data.targetData.node] : [],\r\n });\r\n\r\n state.currentParent = data.targetData.parent;\r\n\r\n state.transferred = true;\r\n}\r\n\r\n/**\r\n * Event listener used for all parents.\r\n *\r\n * @param callback - The callback.\r\n *\r\n * @returns A function to get the parent event data.\r\n */\r\nexport function parentEventData(\r\n callback: any\r\n): (e: Event) => NodeEventData | undefined {\r\n function parentTargetData(\r\n parent: HTMLElement\r\n ): ParentTargetData | undefined {\r\n const parentData = parents.get(parent);\r\n\r\n if (!parentData) return;\r\n\r\n return {\r\n parent: {\r\n el: parent,\r\n data: parentData as ParentData,\r\n },\r\n };\r\n }\r\n\r\n return (e: Event) => {\r\n const targetData = parentTargetData(e.currentTarget as HTMLElement);\r\n\r\n if (!targetData) return;\r\n\r\n return callback(\r\n {\r\n e,\r\n targetData,\r\n },\r\n state\r\n );\r\n };\r\n}\r\n\r\n/**\r\n * Add class to the node.\r\n *\r\n * @param els - The nodes.\r\n * @param className - The class name.\r\n * @param omitAppendPrivateClass - Whether to omit append private class.\r\n *\r\n * @returns void\r\n */\r\nexport function addNodeClass(\r\n els: Array,\r\n className: string | undefined,\r\n omitAppendPrivateClass = false\r\n) {\r\n function nodeSetter(node: Node, nodeData: NodeData) {\r\n nodes.set(node, nodeData);\r\n }\r\n\r\n for (const el of els) {\r\n const nodeData = nodes.get(el as Node);\r\n\r\n const newData = addClass(el, className, nodeData, omitAppendPrivateClass);\r\n\r\n if (!newData) continue;\r\n\r\n nodeSetter(el as Node, newData as NodeData);\r\n }\r\n}\r\n\r\n/**\r\n * Add class to the parent.\r\n *\r\n * @param els - The parents.\r\n * @param className - The class name.\r\n * @param omitAppendPrivateClass - Whether to omit append private class.\r\n *\r\n * @returns void\r\n */\r\nexport function addParentClass(\r\n els: Array,\r\n className: string | undefined,\r\n omitAppendPrivateClass = false\r\n) {\r\n function parentSetter(parent: HTMLElement, parentData: ParentData) {\r\n parents.set(parent, parentData);\r\n }\r\n\r\n for (const el of els) {\r\n const parentData = parents.get(el);\r\n\r\n const newData = addClass(el, className, parentData, omitAppendPrivateClass);\r\n\r\n if (!newData) continue;\r\n\r\n parentSetter(el, newData as ParentData);\r\n }\r\n}\r\n\r\n/**\r\n * Add class to the node.\r\n *\r\n * @param el - The node.\r\n * @param className - The class name.\r\n * @param data - The node data.\r\n * @param omitAppendPrivateClass - Whether to omit append private class.\r\n *\r\n * @returns void\r\n */\r\nexport function addClass(\r\n el: Node | HTMLElement | Element,\r\n className: string | undefined,\r\n data: NodeData | ParentData | undefined,\r\n omitAppendPrivateClass = false\r\n) {\r\n if (!className) return;\r\n\r\n const classNames = splitClass(className);\r\n\r\n if (!classNames.length) return;\r\n\r\n if (!data) {\r\n el.classList.add(...classNames);\r\n return;\r\n }\r\n // Revert to original logic: Initialize privateClasses as empty for this call.\r\n const privateClasses = [];\r\n\r\n for (const currentClassName of classNames) {\r\n if (!el.classList.contains(currentClassName)) {\r\n el.classList.add(currentClassName);\r\n } else if (\r\n // Only add to privateClasses if the element already had the class\r\n // AND omitAppendPrivateClass is specifically false for THIS call.\r\n el.classList.contains(currentClassName) &&\r\n omitAppendPrivateClass === false\r\n ) {\r\n privateClasses.push(currentClassName);\r\n }\r\n }\r\n // Assign the newly computed privateClasses, overwriting any previous value.\r\n data.privateClasses = privateClasses;\r\n return data;\r\n}\r\n\r\n/**\r\n * Remove class from the nodes.\r\n *\r\n * @param els - The nodes.\r\n * @param className - The class name.\r\n *\r\n * @returns void\r\n */\r\nexport function removeClass(\r\n els: Array,\r\n className: string | undefined\r\n) {\r\n if (!className) return;\r\n\r\n const classNames = splitClass(className);\r\n\r\n if (!classNames.length) return;\r\n\r\n for (const node of els) {\r\n if (!isNode(node)) {\r\n node.classList.remove(...classNames);\r\n continue;\r\n }\r\n\r\n const nodeData = nodes.get(node) || parents.get(node);\r\n\r\n if (!nodeData) continue;\r\n\r\n for (const className of classNames) {\r\n if (!nodeData.privateClasses.includes(className)) {\r\n node.classList.remove(className);\r\n }\r\n }\r\n }\r\n}\r\n\r\ntype ScrollDirection = { axis: \"x\"; state: DragState } | { axis: \"y\" };\r\n\r\nfunction getScrollDirection(\r\n el: HTMLElement,\r\n e: PointerEvent | DragEvent,\r\n style: CSSStyleDeclaration,\r\n rect: DOMRect,\r\n opts: ScrollDirection\r\n): Record {\r\n const threshold = 0.075;\r\n\r\n const isX = opts.axis === \"x\";\r\n const isRoot = el === document.scrollingElement;\r\n const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\r\n const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\r\n const offsetProp = isX ? \"offsetWidth\" : \"offsetHeight\";\r\n const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\r\n const clientCoord = isX ? e.clientX : e.clientY;\r\n const rectStart = isX ? rect.left : rect.top;\r\n const overflow = isX ? style.overflowX : style.overflowY;\r\n\r\n if (isRoot) {\r\n const scrollPos = el[scrollProp];\r\n const clientSize = el[sizeProp];\r\n const canScrollBefore = scrollPos > 0;\r\n const canScrollAfter =\r\n scrollPos + clientSize <\r\n (isX\r\n ? (opts.state as SynthDragState).rootScrollWidth || 0\r\n : el[scrollSizeProp]);\r\n\r\n return isX\r\n ? {\r\n left: canScrollBefore && clientCoord < clientSize * threshold,\r\n right: canScrollAfter && clientCoord > clientSize * (1 - threshold),\r\n }\r\n : {\r\n up: canScrollBefore && clientCoord < clientSize * threshold,\r\n down: canScrollAfter && clientCoord > clientSize * (1 - threshold),\r\n };\r\n }\r\n\r\n if (\r\n (overflow === \"auto\" || overflow === \"scroll\") &&\r\n el !== document.body &&\r\n el !== document.documentElement\r\n ) {\r\n const scrollSize = el[scrollSizeProp];\r\n const offsetSize = el[offsetProp];\r\n const scrollPos = el[scrollProp];\r\n\r\n const canScrollBefore = scrollPos > 0;\r\n const canScrollAfter = scrollPos < scrollSize - offsetSize;\r\n\r\n return isX\r\n ? {\r\n left:\r\n canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\r\n right:\r\n canScrollAfter &&\r\n clientCoord > rectStart + offsetSize * (1 - threshold),\r\n }\r\n : {\r\n up:\r\n canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\r\n down:\r\n canScrollAfter &&\r\n clientCoord > rectStart + offsetSize * (1 - threshold),\r\n };\r\n }\r\n\r\n return isX ? { left: false, right: false } : { up: false, down: false };\r\n}\r\n\r\ntype Axis = \"x\" | \"y\";\r\n\r\nfunction scrollAxis(\r\n el: HTMLElement,\r\n _e: PointerEvent | DragEvent,\r\n state: DragState,\r\n options: {\r\n axis: Axis;\r\n direction: \"positive\" | \"negative\";\r\n }\r\n) {\r\n // Check if this is a stale call from a previous state\r\n if (!isDragState(state) || !state.draggedNode) {\r\n return; // State has been reset or is no longer in a drag state\r\n }\r\n\r\n state.preventEnter = true;\r\n\r\n const isX = options.axis === \"x\";\r\n const dirFactor = options.direction === \"positive\" ? 1 : -1;\r\n const speed = 20;\r\n\r\n const key = isX ? \"lastScrollDirectionX\" : \"lastScrollDirectionY\";\r\n const idKey = isX ? \"frameIdX\" : \"frameIdY\";\r\n\r\n // Cancel any existing animation first, regardless of direction\r\n if (state[idKey] !== undefined) {\r\n cancelAnimationFrame(state[idKey]!);\r\n state[idKey] = undefined;\r\n }\r\n\r\n state[key] = options.direction;\r\n\r\n const scrollLoop = () => {\r\n // Check again if state is still valid\r\n if (!isDragState(state) || !state.draggedNode) {\r\n if (state[idKey] !== undefined) {\r\n cancelAnimationFrame(state[idKey]!);\r\n state[idKey] = undefined;\r\n }\r\n return;\r\n }\r\n\r\n const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\r\n const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\r\n const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\r\n\r\n const scrollPos = el[scrollProp];\r\n const clientSize = el[sizeProp];\r\n const scrollSize = el[scrollSizeProp];\r\n\r\n const canScroll =\r\n dirFactor > 0 ? scrollPos + clientSize < scrollSize : scrollPos > 0;\r\n\r\n if (!canScroll) {\r\n state[idKey] = undefined;\r\n state[key] = undefined;\r\n return;\r\n }\r\n\r\n el[scrollProp] += speed * dirFactor;\r\n\r\n if (isSynthDragState(state)) {\r\n moveNode(state);\r\n }\r\n\r\n state[idKey] = requestAnimationFrame(scrollLoop);\r\n };\r\n\r\n state[idKey] = requestAnimationFrame(scrollLoop);\r\n}\r\n\r\nfunction isPointerInside(el: HTMLElement, x: number, y: number): boolean {\r\n const rect = el.getBoundingClientRect();\r\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\r\n}\r\n\r\nfunction handleSynthScroll(\r\n coordinates: { x: number; y: number },\r\n e: PointerEvent | DragEvent,\r\n state: DragState\r\n) {\r\n // First check if this is a stale call from a previous state\r\n if (!isDragState(state) || !state.draggedNode) {\r\n return; // State has been reset or is no longer in a drag state\r\n }\r\n\r\n cancelSynthScroll(state);\r\n\r\n const { x, y } = coordinates;\r\n\r\n let scrolled = false;\r\n\r\n const attemptScroll = (\r\n axis: \"x\" | \"y\",\r\n direction: \"positive\" | \"negative\",\r\n container: HTMLElement\r\n ) => {\r\n scrollAxis(container, e, state, { axis, direction });\r\n scrolled = true;\r\n };\r\n\r\n const checkAndScroll = (el: HTMLElement) => {\r\n const style = window.getComputedStyle(el);\r\n const rect = el.getBoundingClientRect();\r\n\r\n const xResult = getScrollDirection(el, e, style, rect, {\r\n axis: \"x\",\r\n state,\r\n });\r\n\r\n const yResult = getScrollDirection(el, e, style, rect, { axis: \"y\" });\r\n\r\n if (xResult.left || xResult.right) {\r\n state.lastScrollContainerX = el;\r\n attemptScroll(\"x\", xResult.right ? \"positive\" : \"negative\", el);\r\n }\r\n\r\n if (yResult.up || yResult.down) {\r\n state.lastScrollContainerY = el;\r\n attemptScroll(\"y\", yResult.down ? \"positive\" : \"negative\", el);\r\n }\r\n };\r\n\r\n if (\r\n state.lastScrollContainerX &&\r\n isPointerInside(state.lastScrollContainerX, x, y)\r\n ) {\r\n checkAndScroll(state.lastScrollContainerX);\r\n }\r\n\r\n if (\r\n !scrolled &&\r\n state.lastScrollContainerY &&\r\n isPointerInside(state.lastScrollContainerY, x, y)\r\n ) {\r\n checkAndScroll(state.lastScrollContainerY);\r\n }\r\n\r\n if (!scrolled) {\r\n let el = document.elementFromPoint(x, y);\r\n while (\r\n el &&\r\n !(scrolled && state.lastScrollContainerX && state.lastScrollContainerY)\r\n ) {\r\n if (el instanceof HTMLElement) {\r\n checkAndScroll(el);\r\n }\r\n el = el.parentElement;\r\n }\r\n }\r\n\r\n if (!scrolled) {\r\n const root = document.scrollingElement;\r\n if (root instanceof HTMLElement) {\r\n checkAndScroll(root);\r\n }\r\n }\r\n\r\n if (!scrolled) cancelSynthScroll(state);\r\n}\r\n\r\nexport function getElFromPoint(coordinates: {\r\n x: number;\r\n y: number;\r\n}): NodeFromPoint | ParentFromPoint | undefined {\r\n let target = document.elementFromPoint(coordinates.x, coordinates.y);\r\n\r\n if (!isNode(target)) return;\r\n\r\n let isParent;\r\n\r\n let invalidEl = true;\r\n\r\n while (target && invalidEl) {\r\n if (nodes.has(target as Node) || parents.has(target as HTMLElement)) {\r\n invalidEl = false;\r\n\r\n isParent = parents.has(target as HTMLElement);\r\n\r\n break;\r\n }\r\n\r\n target = target.parentNode as Node;\r\n }\r\n\r\n if (!isParent) {\r\n const targetNodeData = nodes.get(target as Node);\r\n\r\n if (!targetNodeData) return;\r\n\r\n const targetParentData = parents.get(target.parentNode as Node);\r\n\r\n if (!targetParentData) return;\r\n\r\n return {\r\n node: {\r\n el: target as Node,\r\n data: targetNodeData,\r\n },\r\n parent: {\r\n el: target.parentNode as Node,\r\n data: targetParentData as ParentData,\r\n },\r\n };\r\n } else {\r\n const parentData = parents.get(target as HTMLElement);\r\n\r\n if (!parentData) return;\r\n\r\n return {\r\n parent: {\r\n el: target as HTMLElement,\r\n data: parentData as ParentData,\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Checks to see that a given element and its parent node is instance of\r\n * HTMLElement.\r\n *\r\n * @param {unknown} el - The element to check.\r\n *\r\n * @returns {boolean} - Whether or not provided element is of type Node.\r\n */\r\nexport function isNode(el: unknown): el is Node {\r\n return el instanceof HTMLElement && el.parentNode instanceof HTMLElement;\r\n}\r\n\r\n/**\r\n * Takes a given el and event handlers, assigns them, and returns the used abort\r\n * controller.\r\n *\r\n * @param el - The element to add the event listeners to.\r\n * @param events - The events to add to the element.\r\n * @returns - The abort controller used for the event listeners.\r\n */\r\nexport function addEvents(\r\n el: Document | ShadowRoot | Node | HTMLElement | Window,\r\n events: EventHandlers | any\r\n): AbortController {\r\n const abortController = new AbortController();\r\n\r\n for (const eventName in events) {\r\n const handler = events[eventName];\r\n\r\n el.addEventListener(eventName, handler, {\r\n signal: abortController.signal,\r\n passive: false,\r\n capture: eventName === \"focus\" || eventName === \"blur\",\r\n });\r\n }\r\n\r\n return abortController;\r\n}\r\n"],"mappings":"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","names":["emit","on","state","insertState","state","draggedParentValues","documentController","handleNodeDragover","handleParentDragover","state","handleEnd","documentController","baseDragState","dragStateProps","handleEnd","nodes","emit","on","handleNodeDragover","handleParentDragover","handleNodePointerover","handleParentPointerover","draggedNodes","state","parent","x","scrollTimeout","className"]} \ No newline at end of file diff --git a/dist/react/index.cjs.map b/dist/react/index.cjs.map index d7493b9..7ab6b58 100644 --- a/dist/react/index.cjs.map +++ b/dist/react/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/react/index.ts","../../src/react/utils.ts"],"sourcesContent":["import type { ReactDragAndDropConfig } from \"./types\";\nimport type { ParentConfig } from \"../types\";\nimport type { Dispatch, SetStateAction, RefObject } from \"react\";\nimport { useRef, useEffect, useState } from \"react\";\nimport { dragAndDrop as initParent, isBrowser, tearDown } from \"../index\";\nimport { handleReactElements } from \"./utils\";\nexport * from \"./types\";\n\n/**\n * Global store for parent els to values.\n */\nconst parentValues: WeakMap<\n HTMLElement,\n [Array, React.Dispatch>>]\n> = new WeakMap();\n\nfunction getValues(parent: HTMLElement): Array {\n const values = parentValues.get(parent);\n\n if (!values) {\n console.warn(\"No values found for parent element\");\n\n return [];\n }\n\n return values[0] as Array;\n}\n\nfunction setValues(newValues: Array, parent: HTMLElement): void {\n const values = parentValues.get(parent);\n\n if (values) values[1](newValues);\n\n parentValues.set(parent, [newValues, values![1]]);\n}\n\nfunction handleParent | HTMLElement, T>(\n config: Partial>,\n values: [Array, React.Dispatch>>]\n) {\n return (el: HTMLElement) => {\n parentValues.set(el, values);\n\n initParent({ parent: el, getValues, setValues, config });\n };\n}\n\n/**\n * Entry point for React drag and drop.\n *\n * @param data - The drag and drop configuration.\n * @returns void\n */\nexport function dragAndDrop(\n data:\n | ReactDragAndDropConfig | HTMLElement, I[]>\n | Array | HTMLElement, I[]>>\n): void {\n if (!isBrowser) return;\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((dnd) => {\n const { parent, state, ...rest } = dnd;\n\n handleReactElements(parent, handleParent(rest, state));\n });\n}\n\n/**\n * Hook for adding drag and drop/sortable support to a list of items.\n *\n * @param list - Initial list of data.\n * @param options - The drag and drop configuration.\n * @returns\n */\nexport function useDragAndDrop(\n list: T[],\n options: Partial> = {}\n): [\n RefObject,\n T[],\n Dispatch>,\n (config: Partial>) => void\n] {\n const parent: RefObject = useRef(null);\n\n const [values, setValues] = useState(list);\n\n function updateConfig(config: Partial> = {}) {\n dragAndDrop({ parent, state: [values, setValues], ...config });\n }\n\n useEffect(() => {\n dragAndDrop({ parent, state: [values, setValues], ...options });\n }, [values]);\n\n useEffect(() => {\n return () => {\n if (parent.current) tearDown(parent.current);\n };\n }, []);\n\n return [parent, values, setValues, updateConfig];\n}\n","import type { RefObject } from \"react\";\n\n/**\n * Checks if the given parent is an HTMLElement.\n *\n * @param dnd - The drag and drop configuration.\n */\nexport function getEl(\n parent: HTMLElement | RefObject\n): HTMLElement | void {\n if (parent instanceof HTMLElement) return parent;\n else if (\"current\" in parent && parent.current instanceof HTMLElement)\n return parent.current;\n else {\n console.warn(\"Invalid parent element\", parent);\n\n return;\n }\n}\n\nexport function handleReactElements(\n element: HTMLElement | RefObject,\n cb: (el: HTMLElement) => void\n): void {\n const el = getEl(element);\n\n if (el) cb(el);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAA4C;AAC5C,eAA+D;;;ACGxD,SAAS,MACd,QACoB;AACpB,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,aAAa,UAAU,OAAO,mBAAmB;AACxD,WAAO,OAAO;AAAA,OACX;AACH,YAAQ,KAAK,0BAA0B,MAAM;AAE7C;AAAA,EACF;AACF;AAEO,SAAS,oBACd,SACA,IACM;AACN,QAAM,KAAK,MAAM,OAAO;AAExB,MAAI,GAAI,IAAG,EAAE;AACf;;;ADhBA,IAAM,eAGF,oBAAI,QAAQ;AAEhB,SAAS,UAAa,QAA+B;AACnD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OAAO,CAAC;AACjB;AAEA,SAAS,UAAU,WAA2B,QAA2B;AACvE,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,OAAQ,QAAO,CAAC,EAAE,SAAS;AAE/B,eAAa,IAAI,QAAQ,CAAC,WAAW,OAAQ,CAAC,CAAC,CAAC;AAClD;AAEA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,OAAoB;AAC1B,iBAAa,IAAI,IAAI,MAAM;AAE3B,iBAAAA,aAAc,EAAE,QAAQ,IAAI,WAAW,WAAW,OAAO,CAAC;AAAA,EAC5D;AACF;AAQO,SAAS,YACd,MAGM;AACN,MAAI,CAAC,mBAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,IAAI;AAEnC,wBAAoB,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,EACvD,CAAC;AACH;AASO,SAAS,eACd,MACA,UAAoC,CAAC,GAMrC;AACA,QAAM,aAAuB,qBAAU,IAAI;AAE3C,QAAM,CAAC,QAAQC,UAAS,QAAI,uBAAS,IAAI;AAEzC,WAAS,aAAa,SAAmC,CAAC,GAAG;AAC3D,gBAAY,EAAE,QAAQ,OAAO,CAAC,QAAQA,UAAS,GAAG,GAAG,OAAO,CAAC;AAAA,EAC/D;AAEA,8BAAU,MAAM;AACd,gBAAY,EAAE,QAAQ,OAAO,CAAC,QAAQA,UAAS,GAAG,GAAG,QAAQ,CAAC;AAAA,EAChE,GAAG,CAAC,MAAM,CAAC;AAEX,8BAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,OAAO,QAAS,wBAAS,OAAO,OAAO;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,CAAC,QAAQ,QAAQA,YAAW,YAAY;AACjD;","names":["initParent","setValues"]} \ No newline at end of file +{"version":3,"sources":["../../src/react/index.ts","../../src/react/utils.ts"],"sourcesContent":["import type { ReactDragAndDropConfig } from \"./types\";\r\nimport type { ParentConfig } from \"../types\";\r\nimport type { Dispatch, SetStateAction, RefObject } from \"react\";\r\nimport { useRef, useEffect, useState } from \"react\";\r\nimport { dragAndDrop as initParent, isBrowser, tearDown } from \"../index\";\r\nimport { handleReactElements } from \"./utils\";\r\nexport * from \"./types\";\r\n\r\n/**\r\n * Global store for parent els to values.\r\n */\r\nconst parentValues: WeakMap<\r\n HTMLElement,\r\n [Array, React.Dispatch>>]\r\n> = new WeakMap();\r\n\r\nfunction getValues(parent: HTMLElement): Array {\r\n const values = parentValues.get(parent);\r\n\r\n if (!values) {\r\n console.warn(\"No values found for parent element\");\r\n\r\n return [];\r\n }\r\n\r\n return values[0] as Array;\r\n}\r\n\r\nfunction setValues(newValues: Array, parent: HTMLElement): void {\r\n const values = parentValues.get(parent);\r\n\r\n if (values) values[1](newValues);\r\n\r\n parentValues.set(parent, [newValues, values![1]]);\r\n}\r\n\r\nfunction handleParent | HTMLElement, T>(\r\n config: Partial>,\r\n values: [Array, React.Dispatch>>]\r\n) {\r\n return (el: HTMLElement) => {\r\n parentValues.set(el, values);\r\n\r\n initParent({ parent: el, getValues, setValues, config });\r\n };\r\n}\r\n\r\n/**\r\n * Entry point for React drag and drop.\r\n *\r\n * @param data - The drag and drop configuration.\r\n * @returns void\r\n */\r\nexport function dragAndDrop(\r\n data:\r\n | ReactDragAndDropConfig | HTMLElement, I[]>\r\n | Array | HTMLElement, I[]>>\r\n): void {\r\n if (!isBrowser) return;\r\n\r\n if (!Array.isArray(data)) data = [data];\r\n\r\n data.forEach((dnd) => {\r\n const { parent, state, ...rest } = dnd;\r\n\r\n handleReactElements(parent, handleParent(rest, state));\r\n });\r\n}\r\n\r\n/**\r\n * Hook for adding drag and drop/sortable support to a list of items.\r\n *\r\n * @param list - Initial list of data.\r\n * @param options - The drag and drop configuration.\r\n * @returns\r\n */\r\nexport function useDragAndDrop(\r\n list: T[],\r\n options: Partial> = {}\r\n): [\r\n RefObject,\r\n T[],\r\n Dispatch>,\r\n (config: Partial>) => void\r\n] {\r\n const parent: RefObject = useRef(null);\r\n\r\n const [values, setValues] = useState(list);\r\n\r\n function updateConfig(config: Partial> = {}) {\r\n dragAndDrop({ parent, state: [values, setValues], ...config });\r\n }\r\n\r\n useEffect(() => {\r\n dragAndDrop({ parent, state: [values, setValues], ...options });\r\n }, [values]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (parent.current) tearDown(parent.current);\r\n };\r\n }, []);\r\n\r\n return [parent, values, setValues, updateConfig];\r\n}\r\n","import type { RefObject } from \"react\";\r\n\r\n/**\r\n * Checks if the given parent is an HTMLElement.\r\n *\r\n * @param dnd - The drag and drop configuration.\r\n */\r\nexport function getEl(\r\n parent: HTMLElement | RefObject\r\n): HTMLElement | void {\r\n if (parent instanceof HTMLElement) return parent;\r\n else if (\"current\" in parent && parent.current instanceof HTMLElement)\r\n return parent.current;\r\n else {\r\n console.warn(\"Invalid parent element\", parent);\r\n\r\n return;\r\n }\r\n}\r\n\r\nexport function handleReactElements(\r\n element: HTMLElement | RefObject,\r\n cb: (el: HTMLElement) => void\r\n): void {\r\n const el = getEl(element);\r\n\r\n if (el) cb(el);\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAA4C;AAC5C,eAA+D;;;ACGxD,SAAS,MACd,QACoB;AACpB,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,aAAa,UAAU,OAAO,mBAAmB;AACxD,WAAO,OAAO;AAAA,OACX;AACH,YAAQ,KAAK,0BAA0B,MAAM;AAE7C;AAAA,EACF;AACF;AAEO,SAAS,oBACd,SACA,IACM;AACN,QAAM,KAAK,MAAM,OAAO;AAExB,MAAI,GAAI,IAAG,EAAE;AACf;;;ADhBA,IAAM,eAGF,oBAAI,QAAQ;AAEhB,SAAS,UAAa,QAA+B;AACnD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OAAO,CAAC;AACjB;AAEA,SAAS,UAAU,WAA2B,QAA2B;AACvE,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,OAAQ,QAAO,CAAC,EAAE,SAAS;AAE/B,eAAa,IAAI,QAAQ,CAAC,WAAW,OAAQ,CAAC,CAAC,CAAC;AAClD;AAEA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,OAAoB;AAC1B,iBAAa,IAAI,IAAI,MAAM;AAE3B,iBAAAA,aAAc,EAAE,QAAQ,IAAI,WAAW,WAAW,OAAO,CAAC;AAAA,EAC5D;AACF;AAQO,SAAS,YACd,MAGM;AACN,MAAI,CAAC,mBAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,IAAI;AAEnC,wBAAoB,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,EACvD,CAAC;AACH;AASO,SAAS,eACd,MACA,UAAoC,CAAC,GAMrC;AACA,QAAM,aAAuB,qBAAU,IAAI;AAE3C,QAAM,CAAC,QAAQC,UAAS,QAAI,uBAAS,IAAI;AAEzC,WAAS,aAAa,SAAmC,CAAC,GAAG;AAC3D,gBAAY,EAAE,QAAQ,OAAO,CAAC,QAAQA,UAAS,GAAG,GAAG,OAAO,CAAC;AAAA,EAC/D;AAEA,8BAAU,MAAM;AACd,gBAAY,EAAE,QAAQ,OAAO,CAAC,QAAQA,UAAS,GAAG,GAAG,QAAQ,CAAC;AAAA,EAChE,GAAG,CAAC,MAAM,CAAC;AAEX,8BAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,OAAO,QAAS,wBAAS,OAAO,OAAO;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,CAAC,QAAQ,QAAQA,YAAW,YAAY;AACjD;","names":["initParent","setValues"]} \ No newline at end of file diff --git a/dist/react/index.mjs.map b/dist/react/index.mjs.map index d5dc6cc..616d9a9 100644 --- a/dist/react/index.mjs.map +++ b/dist/react/index.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/react/index.ts","../../src/react/utils.ts"],"sourcesContent":["import type { ReactDragAndDropConfig } from \"./types\";\nimport type { ParentConfig } from \"../types\";\nimport type { Dispatch, SetStateAction, RefObject } from \"react\";\nimport { useRef, useEffect, useState } from \"react\";\nimport { dragAndDrop as initParent, isBrowser, tearDown } from \"../index\";\nimport { handleReactElements } from \"./utils\";\nexport * from \"./types\";\n\n/**\n * Global store for parent els to values.\n */\nconst parentValues: WeakMap<\n HTMLElement,\n [Array, React.Dispatch>>]\n> = new WeakMap();\n\nfunction getValues(parent: HTMLElement): Array {\n const values = parentValues.get(parent);\n\n if (!values) {\n console.warn(\"No values found for parent element\");\n\n return [];\n }\n\n return values[0] as Array;\n}\n\nfunction setValues(newValues: Array, parent: HTMLElement): void {\n const values = parentValues.get(parent);\n\n if (values) values[1](newValues);\n\n parentValues.set(parent, [newValues, values![1]]);\n}\n\nfunction handleParent | HTMLElement, T>(\n config: Partial>,\n values: [Array, React.Dispatch>>]\n) {\n return (el: HTMLElement) => {\n parentValues.set(el, values);\n\n initParent({ parent: el, getValues, setValues, config });\n };\n}\n\n/**\n * Entry point for React drag and drop.\n *\n * @param data - The drag and drop configuration.\n * @returns void\n */\nexport function dragAndDrop(\n data:\n | ReactDragAndDropConfig | HTMLElement, I[]>\n | Array | HTMLElement, I[]>>\n): void {\n if (!isBrowser) return;\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((dnd) => {\n const { parent, state, ...rest } = dnd;\n\n handleReactElements(parent, handleParent(rest, state));\n });\n}\n\n/**\n * Hook for adding drag and drop/sortable support to a list of items.\n *\n * @param list - Initial list of data.\n * @param options - The drag and drop configuration.\n * @returns\n */\nexport function useDragAndDrop(\n list: T[],\n options: Partial> = {}\n): [\n RefObject,\n T[],\n Dispatch>,\n (config: Partial>) => void\n] {\n const parent: RefObject = useRef(null);\n\n const [values, setValues] = useState(list);\n\n function updateConfig(config: Partial> = {}) {\n dragAndDrop({ parent, state: [values, setValues], ...config });\n }\n\n useEffect(() => {\n dragAndDrop({ parent, state: [values, setValues], ...options });\n }, [values]);\n\n useEffect(() => {\n return () => {\n if (parent.current) tearDown(parent.current);\n };\n }, []);\n\n return [parent, values, setValues, updateConfig];\n}\n","import type { RefObject } from \"react\";\n\n/**\n * Checks if the given parent is an HTMLElement.\n *\n * @param dnd - The drag and drop configuration.\n */\nexport function getEl(\n parent: HTMLElement | RefObject\n): HTMLElement | void {\n if (parent instanceof HTMLElement) return parent;\n else if (\"current\" in parent && parent.current instanceof HTMLElement)\n return parent.current;\n else {\n console.warn(\"Invalid parent element\", parent);\n\n return;\n }\n}\n\nexport function handleReactElements(\n element: HTMLElement | RefObject,\n cb: (el: HTMLElement) => void\n): void {\n const el = getEl(element);\n\n if (el) cb(el);\n}\n"],"mappings":";AAGA,SAAS,QAAQ,WAAW,gBAAgB;AAC5C,SAAS,eAAe,YAAY,WAAW,gBAAgB;;;ACGxD,SAAS,MACd,QACoB;AACpB,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,aAAa,UAAU,OAAO,mBAAmB;AACxD,WAAO,OAAO;AAAA,OACX;AACH,YAAQ,KAAK,0BAA0B,MAAM;AAE7C;AAAA,EACF;AACF;AAEO,SAAS,oBACd,SACA,IACM;AACN,QAAM,KAAK,MAAM,OAAO;AAExB,MAAI,GAAI,IAAG,EAAE;AACf;;;ADhBA,IAAM,eAGF,oBAAI,QAAQ;AAEhB,SAAS,UAAa,QAA+B;AACnD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OAAO,CAAC;AACjB;AAEA,SAAS,UAAU,WAA2B,QAA2B;AACvE,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,OAAQ,QAAO,CAAC,EAAE,SAAS;AAE/B,eAAa,IAAI,QAAQ,CAAC,WAAW,OAAQ,CAAC,CAAC,CAAC;AAClD;AAEA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,OAAoB;AAC1B,iBAAa,IAAI,IAAI,MAAM;AAE3B,eAAc,EAAE,QAAQ,IAAI,WAAW,WAAW,OAAO,CAAC;AAAA,EAC5D;AACF;AAQO,SAAS,YACd,MAGM;AACN,MAAI,CAAC,UAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,IAAI;AAEnC,wBAAoB,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,EACvD,CAAC;AACH;AASO,SAAS,eACd,MACA,UAAoC,CAAC,GAMrC;AACA,QAAM,SAAuB,OAAU,IAAI;AAE3C,QAAM,CAAC,QAAQA,UAAS,IAAI,SAAS,IAAI;AAEzC,WAAS,aAAa,SAAmC,CAAC,GAAG;AAC3D,gBAAY,EAAE,QAAQ,OAAO,CAAC,QAAQA,UAAS,GAAG,GAAG,OAAO,CAAC;AAAA,EAC/D;AAEA,YAAU,MAAM;AACd,gBAAY,EAAE,QAAQ,OAAO,CAAC,QAAQA,UAAS,GAAG,GAAG,QAAQ,CAAC;AAAA,EAChE,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,OAAO,QAAS,UAAS,OAAO,OAAO;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,CAAC,QAAQ,QAAQA,YAAW,YAAY;AACjD;","names":["setValues"]} \ No newline at end of file +{"version":3,"sources":["../../src/react/index.ts","../../src/react/utils.ts"],"sourcesContent":["import type { ReactDragAndDropConfig } from \"./types\";\r\nimport type { ParentConfig } from \"../types\";\r\nimport type { Dispatch, SetStateAction, RefObject } from \"react\";\r\nimport { useRef, useEffect, useState } from \"react\";\r\nimport { dragAndDrop as initParent, isBrowser, tearDown } from \"../index\";\r\nimport { handleReactElements } from \"./utils\";\r\nexport * from \"./types\";\r\n\r\n/**\r\n * Global store for parent els to values.\r\n */\r\nconst parentValues: WeakMap<\r\n HTMLElement,\r\n [Array, React.Dispatch>>]\r\n> = new WeakMap();\r\n\r\nfunction getValues(parent: HTMLElement): Array {\r\n const values = parentValues.get(parent);\r\n\r\n if (!values) {\r\n console.warn(\"No values found for parent element\");\r\n\r\n return [];\r\n }\r\n\r\n return values[0] as Array;\r\n}\r\n\r\nfunction setValues(newValues: Array, parent: HTMLElement): void {\r\n const values = parentValues.get(parent);\r\n\r\n if (values) values[1](newValues);\r\n\r\n parentValues.set(parent, [newValues, values![1]]);\r\n}\r\n\r\nfunction handleParent | HTMLElement, T>(\r\n config: Partial>,\r\n values: [Array, React.Dispatch>>]\r\n) {\r\n return (el: HTMLElement) => {\r\n parentValues.set(el, values);\r\n\r\n initParent({ parent: el, getValues, setValues, config });\r\n };\r\n}\r\n\r\n/**\r\n * Entry point for React drag and drop.\r\n *\r\n * @param data - The drag and drop configuration.\r\n * @returns void\r\n */\r\nexport function dragAndDrop(\r\n data:\r\n | ReactDragAndDropConfig | HTMLElement, I[]>\r\n | Array | HTMLElement, I[]>>\r\n): void {\r\n if (!isBrowser) return;\r\n\r\n if (!Array.isArray(data)) data = [data];\r\n\r\n data.forEach((dnd) => {\r\n const { parent, state, ...rest } = dnd;\r\n\r\n handleReactElements(parent, handleParent(rest, state));\r\n });\r\n}\r\n\r\n/**\r\n * Hook for adding drag and drop/sortable support to a list of items.\r\n *\r\n * @param list - Initial list of data.\r\n * @param options - The drag and drop configuration.\r\n * @returns\r\n */\r\nexport function useDragAndDrop(\r\n list: T[],\r\n options: Partial> = {}\r\n): [\r\n RefObject,\r\n T[],\r\n Dispatch>,\r\n (config: Partial>) => void\r\n] {\r\n const parent: RefObject = useRef(null);\r\n\r\n const [values, setValues] = useState(list);\r\n\r\n function updateConfig(config: Partial> = {}) {\r\n dragAndDrop({ parent, state: [values, setValues], ...config });\r\n }\r\n\r\n useEffect(() => {\r\n dragAndDrop({ parent, state: [values, setValues], ...options });\r\n }, [values]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (parent.current) tearDown(parent.current);\r\n };\r\n }, []);\r\n\r\n return [parent, values, setValues, updateConfig];\r\n}\r\n","import type { RefObject } from \"react\";\r\n\r\n/**\r\n * Checks if the given parent is an HTMLElement.\r\n *\r\n * @param dnd - The drag and drop configuration.\r\n */\r\nexport function getEl(\r\n parent: HTMLElement | RefObject\r\n): HTMLElement | void {\r\n if (parent instanceof HTMLElement) return parent;\r\n else if (\"current\" in parent && parent.current instanceof HTMLElement)\r\n return parent.current;\r\n else {\r\n console.warn(\"Invalid parent element\", parent);\r\n\r\n return;\r\n }\r\n}\r\n\r\nexport function handleReactElements(\r\n element: HTMLElement | RefObject,\r\n cb: (el: HTMLElement) => void\r\n): void {\r\n const el = getEl(element);\r\n\r\n if (el) cb(el);\r\n}\r\n"],"mappings":";AAGA,SAAS,QAAQ,WAAW,gBAAgB;AAC5C,SAAS,eAAe,YAAY,WAAW,gBAAgB;;;ACGxD,SAAS,MACd,QACoB;AACpB,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,aAAa,UAAU,OAAO,mBAAmB;AACxD,WAAO,OAAO;AAAA,OACX;AACH,YAAQ,KAAK,0BAA0B,MAAM;AAE7C;AAAA,EACF;AACF;AAEO,SAAS,oBACd,SACA,IACM;AACN,QAAM,KAAK,MAAM,OAAO;AAExB,MAAI,GAAI,IAAG,EAAE;AACf;;;ADhBA,IAAM,eAGF,oBAAI,QAAQ;AAEhB,SAAS,UAAa,QAA+B;AACnD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OAAO,CAAC;AACjB;AAEA,SAAS,UAAU,WAA2B,QAA2B;AACvE,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,OAAQ,QAAO,CAAC,EAAE,SAAS;AAE/B,eAAa,IAAI,QAAQ,CAAC,WAAW,OAAQ,CAAC,CAAC,CAAC;AAClD;AAEA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,OAAoB;AAC1B,iBAAa,IAAI,IAAI,MAAM;AAE3B,eAAc,EAAE,QAAQ,IAAI,WAAW,WAAW,OAAO,CAAC;AAAA,EAC5D;AACF;AAQO,SAAS,YACd,MAGM;AACN,MAAI,CAAC,UAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,IAAI;AAEnC,wBAAoB,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,EACvD,CAAC;AACH;AASO,SAAS,eACd,MACA,UAAoC,CAAC,GAMrC;AACA,QAAM,SAAuB,OAAU,IAAI;AAE3C,QAAM,CAAC,QAAQA,UAAS,IAAI,SAAS,IAAI;AAEzC,WAAS,aAAa,SAAmC,CAAC,GAAG;AAC3D,gBAAY,EAAE,QAAQ,OAAO,CAAC,QAAQA,UAAS,GAAG,GAAG,OAAO,CAAC;AAAA,EAC/D;AAEA,YAAU,MAAM;AACd,gBAAY,EAAE,QAAQ,OAAO,CAAC,QAAQA,UAAS,GAAG,GAAG,QAAQ,CAAC;AAAA,EAChE,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,OAAO,QAAS,UAAS,OAAO,OAAO;AAAA,IAC7C;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,CAAC,QAAQ,QAAQA,YAAW,YAAY;AACjD;","names":["setValues"]} \ No newline at end of file diff --git a/dist/solid/index.cjs.map b/dist/solid/index.cjs.map index 442e8b6..623cf01 100644 --- a/dist/solid/index.cjs.map +++ b/dist/solid/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/solid/index.ts","../../src/solid/utils.ts"],"sourcesContent":["import {\n dragAndDrop as initParent,\n isBrowser,\n type ParentConfig,\n tearDown,\n} from \"../index\";\nimport {\n createSignal,\n type Accessor,\n type Setter,\n onCleanup,\n onMount,\n} from \"solid-js\";\nimport { createStore, Store } from \"solid-js/store\";\nimport type { SolidDragAndDropConfig, SolidState } from \"./types\";\nimport { handleSolidElements } from \"./utils\";\n\n/**\n * Global store for parent els to values.\n */\nconst parentValues: WeakMap> = new WeakMap();\n\n/**\n * Returns the values of the parent element.\n *\n * @param parent - The parent element.\n *\n * @returns The values of the parent element.\n */\nfunction getValues(parent: HTMLElement): Array {\n const values = parentValues.get(parent);\n\n if (!values) {\n console.warn(\"No values found for parent element\");\n\n return [];\n }\n\n return (values[0] as Accessor>)();\n}\n\n/**\n * Sets the values of the parent element.\n *\n * @param parent - The parent element.\n *\n * @param newValues - The new values for the parent element.\n *\n * @returns void\n */\nfunction setValues(newValues: Array, parent: HTMLElement): void {\n const currentValues = parentValues.get(parent);\n\n if (currentValues) currentValues[1](newValues);\n}\n\nfunction handleParent | HTMLElement, T>(\n config: Partial>,\n values: SolidState\n) {\n return (el: HTMLElement) => {\n parentValues.set(el, values);\n\n initParent({ parent: el, getValues, setValues, config });\n };\n}\n\nexport function dragAndDrop(\n data:\n | SolidDragAndDropConfig | HTMLElement, I[]>\n | Array | HTMLElement, I[]>>\n): void {\n if (!isBrowser) return;\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((dnd) => {\n const { parent, state, ...rest } = dnd;\n\n handleSolidElements(parent, handleParent(rest, state));\n });\n}\n\n/**\n * Hook for adding drag and drop/sortable support to a list of items.\n *\n * @param initValues - Initial list of data.\n * @param options - The drag and drop configuration.\n * @returns\n */\nexport function useDragAndDrop(\n initValues: T[],\n options: Partial> = {}\n): [\n Setter,\n Accessor>,\n ReturnType>[1], // Return type of `createStore` will be changed in solid-js 2, so use `ReturnType` util here\n (config?: Partial>) => void\n] {\n const [parent, setParent] = createSignal(null);\n\n const [values, setValues] = createStore(initValues);\n\n function updateConfig(config: Partial> = {}) {\n dragAndDrop({ parent, state: [() => values, setValues], ...config });\n }\n\n onMount(() =>\n dragAndDrop({ parent, state: [() => values, setValues], ...options })\n );\n onCleanup(() => {\n const p = parent();\n p && tearDown(p);\n });\n\n return [setParent, () => values, setValues, updateConfig];\n}\n","import { createEffect, on, type Accessor } from \"solid-js\";\n\n/**\n * Checks if the given parent is an HTMLElement.\n *\n * @param dnd - The drag and drop configuration.\n */\nexport function getEl(\n parent: HTMLElement | Accessor\n): HTMLElement | void {\n if (parent instanceof HTMLElement) return parent;\n else if (typeof parent !== 'function') return undefined;\n const p = parent();\n return p instanceof HTMLElement ? p : undefined;\n}\n\nexport function handleSolidElements(\n element: HTMLElement | Accessor,\n cb: (el: HTMLElement) => void\n): void {\n createEffect(on(() => getEl(element), (el) => el && cb(el)));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAKO;AACP,IAAAA,mBAMO;AACP,mBAAmC;;;ACbnC,sBAAgD;AAOzC,SAAS,MACd,QACoB;AACpB,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,OAAO,WAAW,WAAY,QAAO;AAC9C,QAAM,IAAI,OAAO;AACjB,SAAO,aAAa,cAAc,IAAI;AACxC;AAEO,SAAS,oBACd,SACA,IACM;AACN,wCAAa,oBAAG,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC;AAC7D;;;ADDA,IAAM,eAAsD,oBAAI,QAAQ;AASxE,SAAS,UAAa,QAA+B;AACnD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAQ,OAAO,CAAC,EAAyB;AAC3C;AAWA,SAAS,UAAU,WAAuB,QAA2B;AACnE,QAAM,gBAAgB,aAAa,IAAI,MAAM;AAE7C,MAAI,cAAe,eAAc,CAAC,EAAE,SAAS;AAC/C;AAEA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,OAAoB;AAC1B,iBAAa,IAAI,IAAI,MAAM;AAE3B,iBAAAC,aAAc,EAAE,QAAQ,IAAI,WAAW,WAAW,OAAO,CAAC;AAAA,EAC5D;AACF;AAEO,SAAS,YACd,MAGM;AACN,MAAI,CAAC,mBAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,IAAI;AAEnC,wBAAoB,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,EACvD,CAAC;AACH;AASO,SAAS,eACd,YACA,UAAoC,CAAC,GAMrC;AACA,QAAM,CAAC,QAAQ,SAAS,QAAI,+BAAuB,IAAI;AAEvD,QAAM,CAAC,QAAQC,UAAS,QAAI,0BAAY,UAAU;AAElD,WAAS,aAAa,SAAmC,CAAC,GAAG;AAC3D,gBAAY,EAAE,QAAQ,OAAO,CAAC,MAAM,QAAQA,UAAS,GAAG,GAAG,OAAO,CAAC;AAAA,EACrE;AAEA;AAAA,IAAQ,MACN,YAAY,EAAE,QAAQ,OAAO,CAAC,MAAM,QAAQA,UAAS,GAAG,GAAG,QAAQ,CAAC;AAAA,EACtE;AACA,kCAAU,MAAM;AACd,UAAM,IAAI,OAAO;AACjB,aAAK,mBAAS,CAAC;AAAA,EACjB,CAAC;AAED,SAAO,CAAC,WAAW,MAAM,QAAQA,YAAW,YAAY;AAC1D;","names":["import_solid_js","initParent","setValues"]} \ No newline at end of file +{"version":3,"sources":["../../src/solid/index.ts","../../src/solid/utils.ts"],"sourcesContent":["import {\r\n dragAndDrop as initParent,\r\n isBrowser,\r\n type ParentConfig,\r\n tearDown,\r\n} from \"../index\";\r\nimport {\r\n createSignal,\r\n type Accessor,\r\n type Setter,\r\n onCleanup,\r\n onMount,\r\n} from \"solid-js\";\r\nimport { createStore, Store } from \"solid-js/store\";\r\nimport type { SolidDragAndDropConfig, SolidState } from \"./types\";\r\nimport { handleSolidElements } from \"./utils\";\r\n\r\n/**\r\n * Global store for parent els to values.\r\n */\r\nconst parentValues: WeakMap> = new WeakMap();\r\n\r\n/**\r\n * Returns the values of the parent element.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @returns The values of the parent element.\r\n */\r\nfunction getValues(parent: HTMLElement): Array {\r\n const values = parentValues.get(parent);\r\n\r\n if (!values) {\r\n console.warn(\"No values found for parent element\");\r\n\r\n return [];\r\n }\r\n\r\n return (values[0] as Accessor>)();\r\n}\r\n\r\n/**\r\n * Sets the values of the parent element.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @param newValues - The new values for the parent element.\r\n *\r\n * @returns void\r\n */\r\nfunction setValues(newValues: Array, parent: HTMLElement): void {\r\n const currentValues = parentValues.get(parent);\r\n\r\n if (currentValues) currentValues[1](newValues);\r\n}\r\n\r\nfunction handleParent | HTMLElement, T>(\r\n config: Partial>,\r\n values: SolidState\r\n) {\r\n return (el: HTMLElement) => {\r\n parentValues.set(el, values);\r\n\r\n initParent({ parent: el, getValues, setValues, config });\r\n };\r\n}\r\n\r\nexport function dragAndDrop(\r\n data:\r\n | SolidDragAndDropConfig | HTMLElement, I[]>\r\n | Array | HTMLElement, I[]>>\r\n): void {\r\n if (!isBrowser) return;\r\n\r\n if (!Array.isArray(data)) data = [data];\r\n\r\n data.forEach((dnd) => {\r\n const { parent, state, ...rest } = dnd;\r\n\r\n handleSolidElements(parent, handleParent(rest, state));\r\n });\r\n}\r\n\r\n/**\r\n * Hook for adding drag and drop/sortable support to a list of items.\r\n *\r\n * @param initValues - Initial list of data.\r\n * @param options - The drag and drop configuration.\r\n * @returns\r\n */\r\nexport function useDragAndDrop(\r\n initValues: T[],\r\n options: Partial> = {}\r\n): [\r\n Setter,\r\n Accessor>,\r\n ReturnType>[1], // Return type of `createStore` will be changed in solid-js 2, so use `ReturnType` util here\r\n (config?: Partial>) => void\r\n] {\r\n const [parent, setParent] = createSignal(null);\r\n\r\n const [values, setValues] = createStore(initValues);\r\n\r\n function updateConfig(config: Partial> = {}) {\r\n dragAndDrop({ parent, state: [() => values, setValues], ...config });\r\n }\r\n\r\n onMount(() =>\r\n dragAndDrop({ parent, state: [() => values, setValues], ...options })\r\n );\r\n onCleanup(() => {\r\n const p = parent();\r\n p && tearDown(p);\r\n });\r\n\r\n return [setParent, () => values, setValues, updateConfig];\r\n}\r\n","import { createEffect, on, type Accessor } from \"solid-js\";\r\n\r\n/**\r\n * Checks if the given parent is an HTMLElement.\r\n *\r\n * @param dnd - The drag and drop configuration.\r\n */\r\nexport function getEl(\r\n parent: HTMLElement | Accessor\r\n): HTMLElement | void {\r\n if (parent instanceof HTMLElement) return parent;\r\n else if (typeof parent !== 'function') return undefined;\r\n const p = parent();\r\n return p instanceof HTMLElement ? p : undefined;\r\n}\r\n\r\nexport function handleSolidElements(\r\n element: HTMLElement | Accessor,\r\n cb: (el: HTMLElement) => void\r\n): void {\r\n createEffect(on(() => getEl(element), (el) => el && cb(el)));\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAKO;AACP,IAAAA,mBAMO;AACP,mBAAmC;;;ACbnC,sBAAgD;AAOzC,SAAS,MACd,QACoB;AACpB,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,OAAO,WAAW,WAAY,QAAO;AAC9C,QAAM,IAAI,OAAO;AACjB,SAAO,aAAa,cAAc,IAAI;AACxC;AAEO,SAAS,oBACd,SACA,IACM;AACN,wCAAa,oBAAG,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC;AAC7D;;;ADDA,IAAM,eAAsD,oBAAI,QAAQ;AASxE,SAAS,UAAa,QAA+B;AACnD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAQ,OAAO,CAAC,EAAyB;AAC3C;AAWA,SAAS,UAAU,WAAuB,QAA2B;AACnE,QAAM,gBAAgB,aAAa,IAAI,MAAM;AAE7C,MAAI,cAAe,eAAc,CAAC,EAAE,SAAS;AAC/C;AAEA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,OAAoB;AAC1B,iBAAa,IAAI,IAAI,MAAM;AAE3B,iBAAAC,aAAc,EAAE,QAAQ,IAAI,WAAW,WAAW,OAAO,CAAC;AAAA,EAC5D;AACF;AAEO,SAAS,YACd,MAGM;AACN,MAAI,CAAC,mBAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,IAAI;AAEnC,wBAAoB,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,EACvD,CAAC;AACH;AASO,SAAS,eACd,YACA,UAAoC,CAAC,GAMrC;AACA,QAAM,CAAC,QAAQ,SAAS,QAAI,+BAAuB,IAAI;AAEvD,QAAM,CAAC,QAAQC,UAAS,QAAI,0BAAY,UAAU;AAElD,WAAS,aAAa,SAAmC,CAAC,GAAG;AAC3D,gBAAY,EAAE,QAAQ,OAAO,CAAC,MAAM,QAAQA,UAAS,GAAG,GAAG,OAAO,CAAC;AAAA,EACrE;AAEA;AAAA,IAAQ,MACN,YAAY,EAAE,QAAQ,OAAO,CAAC,MAAM,QAAQA,UAAS,GAAG,GAAG,QAAQ,CAAC;AAAA,EACtE;AACA,kCAAU,MAAM;AACd,UAAM,IAAI,OAAO;AACjB,aAAK,mBAAS,CAAC;AAAA,EACjB,CAAC;AAED,SAAO,CAAC,WAAW,MAAM,QAAQA,YAAW,YAAY;AAC1D;","names":["import_solid_js","initParent","setValues"]} \ No newline at end of file diff --git a/dist/solid/index.mjs.map b/dist/solid/index.mjs.map index ae7c072..265c2d3 100644 --- a/dist/solid/index.mjs.map +++ b/dist/solid/index.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/solid/index.ts","../../src/solid/utils.ts"],"sourcesContent":["import {\n dragAndDrop as initParent,\n isBrowser,\n type ParentConfig,\n tearDown,\n} from \"../index\";\nimport {\n createSignal,\n type Accessor,\n type Setter,\n onCleanup,\n onMount,\n} from \"solid-js\";\nimport { createStore, Store } from \"solid-js/store\";\nimport type { SolidDragAndDropConfig, SolidState } from \"./types\";\nimport { handleSolidElements } from \"./utils\";\n\n/**\n * Global store for parent els to values.\n */\nconst parentValues: WeakMap> = new WeakMap();\n\n/**\n * Returns the values of the parent element.\n *\n * @param parent - The parent element.\n *\n * @returns The values of the parent element.\n */\nfunction getValues(parent: HTMLElement): Array {\n const values = parentValues.get(parent);\n\n if (!values) {\n console.warn(\"No values found for parent element\");\n\n return [];\n }\n\n return (values[0] as Accessor>)();\n}\n\n/**\n * Sets the values of the parent element.\n *\n * @param parent - The parent element.\n *\n * @param newValues - The new values for the parent element.\n *\n * @returns void\n */\nfunction setValues(newValues: Array, parent: HTMLElement): void {\n const currentValues = parentValues.get(parent);\n\n if (currentValues) currentValues[1](newValues);\n}\n\nfunction handleParent | HTMLElement, T>(\n config: Partial>,\n values: SolidState\n) {\n return (el: HTMLElement) => {\n parentValues.set(el, values);\n\n initParent({ parent: el, getValues, setValues, config });\n };\n}\n\nexport function dragAndDrop(\n data:\n | SolidDragAndDropConfig | HTMLElement, I[]>\n | Array | HTMLElement, I[]>>\n): void {\n if (!isBrowser) return;\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((dnd) => {\n const { parent, state, ...rest } = dnd;\n\n handleSolidElements(parent, handleParent(rest, state));\n });\n}\n\n/**\n * Hook for adding drag and drop/sortable support to a list of items.\n *\n * @param initValues - Initial list of data.\n * @param options - The drag and drop configuration.\n * @returns\n */\nexport function useDragAndDrop(\n initValues: T[],\n options: Partial> = {}\n): [\n Setter,\n Accessor>,\n ReturnType>[1], // Return type of `createStore` will be changed in solid-js 2, so use `ReturnType` util here\n (config?: Partial>) => void\n] {\n const [parent, setParent] = createSignal(null);\n\n const [values, setValues] = createStore(initValues);\n\n function updateConfig(config: Partial> = {}) {\n dragAndDrop({ parent, state: [() => values, setValues], ...config });\n }\n\n onMount(() =>\n dragAndDrop({ parent, state: [() => values, setValues], ...options })\n );\n onCleanup(() => {\n const p = parent();\n p && tearDown(p);\n });\n\n return [setParent, () => values, setValues, updateConfig];\n}\n","import { createEffect, on, type Accessor } from \"solid-js\";\n\n/**\n * Checks if the given parent is an HTMLElement.\n *\n * @param dnd - The drag and drop configuration.\n */\nexport function getEl(\n parent: HTMLElement | Accessor\n): HTMLElement | void {\n if (parent instanceof HTMLElement) return parent;\n else if (typeof parent !== 'function') return undefined;\n const p = parent();\n return p instanceof HTMLElement ? p : undefined;\n}\n\nexport function handleSolidElements(\n element: HTMLElement | Accessor,\n cb: (el: HTMLElement) => void\n): void {\n createEffect(on(() => getEl(element), (el) => el && cb(el)));\n}\n"],"mappings":";AAAA;AAAA,EACE,eAAe;AAAA,EACf;AAAA,EAEA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAA0B;;;ACbnC,SAAS,cAAc,UAAyB;AAOzC,SAAS,MACd,QACoB;AACpB,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,OAAO,WAAW,WAAY,QAAO;AAC9C,QAAM,IAAI,OAAO;AACjB,SAAO,aAAa,cAAc,IAAI;AACxC;AAEO,SAAS,oBACd,SACA,IACM;AACN,eAAa,GAAG,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC;AAC7D;;;ADDA,IAAM,eAAsD,oBAAI,QAAQ;AASxE,SAAS,UAAa,QAA+B;AACnD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAQ,OAAO,CAAC,EAAyB;AAC3C;AAWA,SAAS,UAAU,WAAuB,QAA2B;AACnE,QAAM,gBAAgB,aAAa,IAAI,MAAM;AAE7C,MAAI,cAAe,eAAc,CAAC,EAAE,SAAS;AAC/C;AAEA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,OAAoB;AAC1B,iBAAa,IAAI,IAAI,MAAM;AAE3B,eAAc,EAAE,QAAQ,IAAI,WAAW,WAAW,OAAO,CAAC;AAAA,EAC5D;AACF;AAEO,SAAS,YACd,MAGM;AACN,MAAI,CAAC,UAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,IAAI;AAEnC,wBAAoB,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,EACvD,CAAC;AACH;AASO,SAAS,eACd,YACA,UAAoC,CAAC,GAMrC;AACA,QAAM,CAAC,QAAQ,SAAS,IAAI,aAAuB,IAAI;AAEvD,QAAM,CAAC,QAAQA,UAAS,IAAI,YAAY,UAAU;AAElD,WAAS,aAAa,SAAmC,CAAC,GAAG;AAC3D,gBAAY,EAAE,QAAQ,OAAO,CAAC,MAAM,QAAQA,UAAS,GAAG,GAAG,OAAO,CAAC;AAAA,EACrE;AAEA;AAAA,IAAQ,MACN,YAAY,EAAE,QAAQ,OAAO,CAAC,MAAM,QAAQA,UAAS,GAAG,GAAG,QAAQ,CAAC;AAAA,EACtE;AACA,YAAU,MAAM;AACd,UAAM,IAAI,OAAO;AACjB,SAAK,SAAS,CAAC;AAAA,EACjB,CAAC;AAED,SAAO,CAAC,WAAW,MAAM,QAAQA,YAAW,YAAY;AAC1D;","names":["setValues"]} \ No newline at end of file +{"version":3,"sources":["../../src/solid/index.ts","../../src/solid/utils.ts"],"sourcesContent":["import {\r\n dragAndDrop as initParent,\r\n isBrowser,\r\n type ParentConfig,\r\n tearDown,\r\n} from \"../index\";\r\nimport {\r\n createSignal,\r\n type Accessor,\r\n type Setter,\r\n onCleanup,\r\n onMount,\r\n} from \"solid-js\";\r\nimport { createStore, Store } from \"solid-js/store\";\r\nimport type { SolidDragAndDropConfig, SolidState } from \"./types\";\r\nimport { handleSolidElements } from \"./utils\";\r\n\r\n/**\r\n * Global store for parent els to values.\r\n */\r\nconst parentValues: WeakMap> = new WeakMap();\r\n\r\n/**\r\n * Returns the values of the parent element.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @returns The values of the parent element.\r\n */\r\nfunction getValues(parent: HTMLElement): Array {\r\n const values = parentValues.get(parent);\r\n\r\n if (!values) {\r\n console.warn(\"No values found for parent element\");\r\n\r\n return [];\r\n }\r\n\r\n return (values[0] as Accessor>)();\r\n}\r\n\r\n/**\r\n * Sets the values of the parent element.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @param newValues - The new values for the parent element.\r\n *\r\n * @returns void\r\n */\r\nfunction setValues(newValues: Array, parent: HTMLElement): void {\r\n const currentValues = parentValues.get(parent);\r\n\r\n if (currentValues) currentValues[1](newValues);\r\n}\r\n\r\nfunction handleParent | HTMLElement, T>(\r\n config: Partial>,\r\n values: SolidState\r\n) {\r\n return (el: HTMLElement) => {\r\n parentValues.set(el, values);\r\n\r\n initParent({ parent: el, getValues, setValues, config });\r\n };\r\n}\r\n\r\nexport function dragAndDrop(\r\n data:\r\n | SolidDragAndDropConfig | HTMLElement, I[]>\r\n | Array | HTMLElement, I[]>>\r\n): void {\r\n if (!isBrowser) return;\r\n\r\n if (!Array.isArray(data)) data = [data];\r\n\r\n data.forEach((dnd) => {\r\n const { parent, state, ...rest } = dnd;\r\n\r\n handleSolidElements(parent, handleParent(rest, state));\r\n });\r\n}\r\n\r\n/**\r\n * Hook for adding drag and drop/sortable support to a list of items.\r\n *\r\n * @param initValues - Initial list of data.\r\n * @param options - The drag and drop configuration.\r\n * @returns\r\n */\r\nexport function useDragAndDrop(\r\n initValues: T[],\r\n options: Partial> = {}\r\n): [\r\n Setter,\r\n Accessor>,\r\n ReturnType>[1], // Return type of `createStore` will be changed in solid-js 2, so use `ReturnType` util here\r\n (config?: Partial>) => void\r\n] {\r\n const [parent, setParent] = createSignal(null);\r\n\r\n const [values, setValues] = createStore(initValues);\r\n\r\n function updateConfig(config: Partial> = {}) {\r\n dragAndDrop({ parent, state: [() => values, setValues], ...config });\r\n }\r\n\r\n onMount(() =>\r\n dragAndDrop({ parent, state: [() => values, setValues], ...options })\r\n );\r\n onCleanup(() => {\r\n const p = parent();\r\n p && tearDown(p);\r\n });\r\n\r\n return [setParent, () => values, setValues, updateConfig];\r\n}\r\n","import { createEffect, on, type Accessor } from \"solid-js\";\r\n\r\n/**\r\n * Checks if the given parent is an HTMLElement.\r\n *\r\n * @param dnd - The drag and drop configuration.\r\n */\r\nexport function getEl(\r\n parent: HTMLElement | Accessor\r\n): HTMLElement | void {\r\n if (parent instanceof HTMLElement) return parent;\r\n else if (typeof parent !== 'function') return undefined;\r\n const p = parent();\r\n return p instanceof HTMLElement ? p : undefined;\r\n}\r\n\r\nexport function handleSolidElements(\r\n element: HTMLElement | Accessor,\r\n cb: (el: HTMLElement) => void\r\n): void {\r\n createEffect(on(() => getEl(element), (el) => el && cb(el)));\r\n}\r\n"],"mappings":";AAAA;AAAA,EACE,eAAe;AAAA,EACf;AAAA,EAEA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAA0B;;;ACbnC,SAAS,cAAc,UAAyB;AAOzC,SAAS,MACd,QACoB;AACpB,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,OAAO,WAAW,WAAY,QAAO;AAC9C,QAAM,IAAI,OAAO;AACjB,SAAO,aAAa,cAAc,IAAI;AACxC;AAEO,SAAS,oBACd,SACA,IACM;AACN,eAAa,GAAG,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC;AAC7D;;;ADDA,IAAM,eAAsD,oBAAI,QAAQ;AASxE,SAAS,UAAa,QAA+B;AACnD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAQ,OAAO,CAAC,EAAyB;AAC3C;AAWA,SAAS,UAAU,WAAuB,QAA2B;AACnE,QAAM,gBAAgB,aAAa,IAAI,MAAM;AAE7C,MAAI,cAAe,eAAc,CAAC,EAAE,SAAS;AAC/C;AAEA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,OAAoB;AAC1B,iBAAa,IAAI,IAAI,MAAM;AAE3B,eAAc,EAAE,QAAQ,IAAI,WAAW,WAAW,OAAO,CAAC;AAAA,EAC5D;AACF;AAEO,SAAS,YACd,MAGM;AACN,MAAI,CAAC,UAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,OAAO,GAAG,KAAK,IAAI;AAEnC,wBAAoB,QAAQ,aAAa,MAAM,KAAK,CAAC;AAAA,EACvD,CAAC;AACH;AASO,SAAS,eACd,YACA,UAAoC,CAAC,GAMrC;AACA,QAAM,CAAC,QAAQ,SAAS,IAAI,aAAuB,IAAI;AAEvD,QAAM,CAAC,QAAQA,UAAS,IAAI,YAAY,UAAU;AAElD,WAAS,aAAa,SAAmC,CAAC,GAAG;AAC3D,gBAAY,EAAE,QAAQ,OAAO,CAAC,MAAM,QAAQA,UAAS,GAAG,GAAG,OAAO,CAAC;AAAA,EACrE;AAEA;AAAA,IAAQ,MACN,YAAY,EAAE,QAAQ,OAAO,CAAC,MAAM,QAAQA,UAAS,GAAG,GAAG,QAAQ,CAAC;AAAA,EACtE;AACA,YAAU,MAAM;AACd,UAAM,IAAI,OAAO;AACjB,SAAK,SAAS,CAAC;AAAA,EACjB,CAAC;AAED,SAAO,CAAC,WAAW,MAAM,QAAQA,YAAW,YAAY;AAC1D;","names":["setValues"]} \ No newline at end of file diff --git a/dist/vue/index.cjs.map b/dist/vue/index.cjs.map index 5444ecb..72af3fa 100644 --- a/dist/vue/index.cjs.map +++ b/dist/vue/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/vue/index.ts","../../src/vue/utils.ts"],"sourcesContent":["import type { Ref } from \"vue\";\nimport type { VueDragAndDropData, VueParentConfig } from \"./types\";\nimport { dragAndDrop as initParent, isBrowser, tearDown } from \"../index\";\nimport { onUnmounted, ref } from \"vue\";\nimport { handleVueElements } from \"./utils\";\nexport * from \"./types\";\n\n/**\n * Global store for parent els to values.\n */\nconst parentValues: WeakMap> | Array> =\n new WeakMap();\n\n/**\n * Returns the values of the parent element.\n *\n * @param parent - The parent element.\n *\n * @returns The values of the parent element.\n */\nfunction getValues(parent: HTMLElement): Array {\n const values = parentValues.get(parent);\n\n if (!values) {\n console.warn(\"No values found for parent element\");\n\n return [];\n }\n\n return \"value\" in values ? values.value : values;\n}\n\n/**\n * Sets the values of the parent element.\n *\n * @param parent - The parent element.\n *\n * @param newValues - The new values for the parent element.\n *\n * @returns void\n */\nfunction setValues(newValues: Array, parent: HTMLElement): void {\n const currentValues = parentValues.get(parent);\n\n // Only update reactive values. If static, let's not update.\n if (currentValues && \"value\" in currentValues)\n currentValues.value = newValues;\n //else if (currentValues) parentValues.set(parent, newValues);\n}\n/**\n * Entry point for Vue drag and drop.\n *\n * @param data - The drag and drop configuration.\n *\n * @returns void\n */\nexport function dragAndDrop(\n data: VueDragAndDropData | Array>\n): void {\n if (!isBrowser) return;\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((dnd) => {\n const { parent, values, ...rest } = dnd;\n\n handleVueElements(parent, handleParent(rest, values));\n });\n}\n\n/**\n * Creates a new instance of drag and drop and returns the parent element and\n * a ref of the values to use in your template.\n *\n * @param initialValues - The initial values of the parent element.\n *\n * @returns The parent element and values for drag and drop.\n */\nexport function useDragAndDrop(\n initialValues: T[],\n options: Partial> = {}\n): [\n Ref,\n Ref,\n (config: Partial>) => void\n] {\n const parent = ref();\n\n const values = ref(initialValues) as Ref;\n\n function updateConfig(config: Partial> = {}) {\n dragAndDrop({ parent, values, ...config });\n }\n\n dragAndDrop({ parent, values, ...options });\n\n onUnmounted(() => parent.value && tearDown(parent.value));\n\n return [parent, values, updateConfig];\n}\n\n/**\n * Sets the HTMLElement parent to weakmap with provided values and calls\n * initParent.\n *\n * @param config - The config of the parent.\n *\n * @param values - The values of the parent element.\n *\n */\nfunction handleParent(\n config: Partial>,\n values: Ref> | Array\n) {\n return (parent: HTMLElement) => {\n parentValues.set(parent, values);\n\n initParent({\n parent,\n getValues,\n setValues,\n config: {\n ...config,\n },\n });\n };\n}\n","import type { VueElement } from \"./types\";\nimport { watch } from \"vue\";\n\n/**\n * Checks if the given parent is an HTMLElement.\n *\n * @param dnd - The drag and drop configuration.\n */\nexport function getEl(parent: VueElement): HTMLElement | void {\n if (parent instanceof HTMLElement) return parent;\n else if (parent.value instanceof HTMLElement) return parent.value;\n else if (\"$el\" in parent && parent.$el instanceof HTMLElement)\n return parent.$el;\n}\n\nexport function handleVueElements(\n elements: Array | VueElement,\n cb: (el: HTMLElement) => void\n): void {\n if (!Array.isArray(elements)) elements = [elements];\n\n for (const element of elements) {\n const validEl = getEl(element);\n\n if (validEl) return cb(validEl);\n\n const stop = watch(element, (newEl) => {\n if (!newEl) return;\n\n const validEl = getEl(newEl);\n\n !validEl ? console.warn(\"Invalid parent element\", newEl) : cb(validEl);\n\n stop();\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,eAA+D;AAC/D,IAAAA,cAAiC;;;ACFjC,iBAAsB;AAOf,SAAS,MAAM,QAAwC;AAC5D,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,OAAO,iBAAiB,YAAa,QAAO,OAAO;AAAA,WACnD,SAAS,UAAU,OAAO,eAAe;AAChD,WAAO,OAAO;AAClB;AAEO,SAAS,kBACd,UACA,IACM;AACN,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,YAAW,CAAC,QAAQ;AAElD,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,MAAM,OAAO;AAE7B,QAAI,QAAS,QAAO,GAAG,OAAO;AAE9B,UAAM,WAAO,kBAAM,SAAS,CAAC,UAAU;AACrC,UAAI,CAAC,MAAO;AAEZ,YAAMC,WAAU,MAAM,KAAK;AAE3B,OAACA,WAAU,QAAQ,KAAK,0BAA0B,KAAK,IAAI,GAAGA,QAAO;AAErE,WAAK;AAAA,IACP,CAAC;AAAA,EACH;AACF;;;AD1BA,IAAM,eACJ,oBAAI,QAAQ;AASd,SAAS,UAAU,QAAiC;AAClD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,WAAW,SAAS,OAAO,QAAQ;AAC5C;AAWA,SAAS,UAAU,WAAuB,QAA2B;AACnE,QAAM,gBAAgB,aAAa,IAAI,MAAM;AAG7C,MAAI,iBAAiB,WAAW;AAC9B,kBAAc,QAAQ;AAE1B;AAQO,SAAS,YACd,MACM;AACN,MAAI,CAAC,mBAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,QAAQ,GAAG,KAAK,IAAI;AAEpC,sBAAkB,QAAQ,aAAa,MAAM,MAAM,CAAC;AAAA,EACtD,CAAC;AACH;AAUO,SAAS,eACd,eACA,UAAuC,CAAC,GAKxC;AACA,QAAM,aAAS,iBAA6B;AAE5C,QAAM,aAAS,iBAAI,aAAa;AAEhC,WAAS,aAAa,SAAsC,CAAC,GAAG;AAC9D,gBAAY,EAAE,QAAQ,QAAQ,GAAG,OAAO,CAAC;AAAA,EAC3C;AAEA,cAAY,EAAE,QAAQ,QAAQ,GAAG,QAAQ,CAAC;AAE1C,+BAAY,MAAM,OAAO,aAAS,mBAAS,OAAO,KAAK,CAAC;AAExD,SAAO,CAAC,QAAQ,QAAQ,YAAY;AACtC;AAWA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,WAAwB;AAC9B,iBAAa,IAAI,QAAQ,MAAM;AAE/B,iBAAAC,aAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,QACN,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":["import_vue","validEl","initParent"]} \ No newline at end of file +{"version":3,"sources":["../../src/vue/index.ts","../../src/vue/utils.ts"],"sourcesContent":["import type { Ref } from \"vue\";\r\nimport type { VueDragAndDropData, VueParentConfig } from \"./types\";\r\nimport { dragAndDrop as initParent, isBrowser, tearDown } from \"../index\";\r\nimport { onUnmounted, ref } from \"vue\";\r\nimport { handleVueElements } from \"./utils\";\r\nexport * from \"./types\";\r\n\r\n/**\r\n * Global store for parent els to values.\r\n */\r\nconst parentValues: WeakMap> | Array> =\r\n new WeakMap();\r\n\r\n/**\r\n * Returns the values of the parent element.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @returns The values of the parent element.\r\n */\r\nfunction getValues(parent: HTMLElement): Array {\r\n const values = parentValues.get(parent);\r\n\r\n if (!values) {\r\n console.warn(\"No values found for parent element\");\r\n\r\n return [];\r\n }\r\n\r\n return \"value\" in values ? values.value : values;\r\n}\r\n\r\n/**\r\n * Sets the values of the parent element.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @param newValues - The new values for the parent element.\r\n *\r\n * @returns void\r\n */\r\nfunction setValues(newValues: Array, parent: HTMLElement): void {\r\n const currentValues = parentValues.get(parent);\r\n\r\n // Only update reactive values. If static, let's not update.\r\n if (currentValues && \"value\" in currentValues)\r\n currentValues.value = newValues;\r\n //else if (currentValues) parentValues.set(parent, newValues);\r\n}\r\n/**\r\n * Entry point for Vue drag and drop.\r\n *\r\n * @param data - The drag and drop configuration.\r\n *\r\n * @returns void\r\n */\r\nexport function dragAndDrop(\r\n data: VueDragAndDropData | Array>\r\n): void {\r\n if (!isBrowser) return;\r\n\r\n if (!Array.isArray(data)) data = [data];\r\n\r\n data.forEach((dnd) => {\r\n const { parent, values, ...rest } = dnd;\r\n\r\n handleVueElements(parent, handleParent(rest, values));\r\n });\r\n}\r\n\r\n/**\r\n * Creates a new instance of drag and drop and returns the parent element and\r\n * a ref of the values to use in your template.\r\n *\r\n * @param initialValues - The initial values of the parent element.\r\n *\r\n * @returns The parent element and values for drag and drop.\r\n */\r\nexport function useDragAndDrop(\r\n initialValues: T[],\r\n options: Partial> = {}\r\n): [\r\n Ref,\r\n Ref,\r\n (config: Partial>) => void\r\n] {\r\n const parent = ref();\r\n\r\n const values = ref(initialValues) as Ref;\r\n\r\n function updateConfig(config: Partial> = {}) {\r\n dragAndDrop({ parent, values, ...config });\r\n }\r\n\r\n dragAndDrop({ parent, values, ...options });\r\n\r\n onUnmounted(() => parent.value && tearDown(parent.value));\r\n\r\n return [parent, values, updateConfig];\r\n}\r\n\r\n/**\r\n * Sets the HTMLElement parent to weakmap with provided values and calls\r\n * initParent.\r\n *\r\n * @param config - The config of the parent.\r\n *\r\n * @param values - The values of the parent element.\r\n *\r\n */\r\nfunction handleParent(\r\n config: Partial>,\r\n values: Ref> | Array\r\n) {\r\n return (parent: HTMLElement) => {\r\n parentValues.set(parent, values);\r\n\r\n initParent({\r\n parent,\r\n getValues,\r\n setValues,\r\n config: {\r\n ...config,\r\n },\r\n });\r\n };\r\n}\r\n","import type { VueElement } from \"./types\";\r\nimport { watch } from \"vue\";\r\n\r\n/**\r\n * Checks if the given parent is an HTMLElement.\r\n *\r\n * @param dnd - The drag and drop configuration.\r\n */\r\nexport function getEl(parent: VueElement): HTMLElement | void {\r\n if (parent instanceof HTMLElement) return parent;\r\n else if (parent.value instanceof HTMLElement) return parent.value;\r\n else if (\"$el\" in parent && parent.$el instanceof HTMLElement)\r\n return parent.$el;\r\n}\r\n\r\nexport function handleVueElements(\r\n elements: Array | VueElement,\r\n cb: (el: HTMLElement) => void\r\n): void {\r\n if (!Array.isArray(elements)) elements = [elements];\r\n\r\n for (const element of elements) {\r\n const validEl = getEl(element);\r\n\r\n if (validEl) return cb(validEl);\r\n\r\n const stop = watch(element, (newEl) => {\r\n if (!newEl) return;\r\n\r\n const validEl = getEl(newEl);\r\n\r\n !validEl ? console.warn(\"Invalid parent element\", newEl) : cb(validEl);\r\n\r\n stop();\r\n });\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,eAA+D;AAC/D,IAAAA,cAAiC;;;ACFjC,iBAAsB;AAOf,SAAS,MAAM,QAAwC;AAC5D,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,OAAO,iBAAiB,YAAa,QAAO,OAAO;AAAA,WACnD,SAAS,UAAU,OAAO,eAAe;AAChD,WAAO,OAAO;AAClB;AAEO,SAAS,kBACd,UACA,IACM;AACN,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,YAAW,CAAC,QAAQ;AAElD,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,MAAM,OAAO;AAE7B,QAAI,QAAS,QAAO,GAAG,OAAO;AAE9B,UAAM,WAAO,kBAAM,SAAS,CAAC,UAAU;AACrC,UAAI,CAAC,MAAO;AAEZ,YAAMC,WAAU,MAAM,KAAK;AAE3B,OAACA,WAAU,QAAQ,KAAK,0BAA0B,KAAK,IAAI,GAAGA,QAAO;AAErE,WAAK;AAAA,IACP,CAAC;AAAA,EACH;AACF;;;AD1BA,IAAM,eACJ,oBAAI,QAAQ;AASd,SAAS,UAAU,QAAiC;AAClD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,WAAW,SAAS,OAAO,QAAQ;AAC5C;AAWA,SAAS,UAAU,WAAuB,QAA2B;AACnE,QAAM,gBAAgB,aAAa,IAAI,MAAM;AAG7C,MAAI,iBAAiB,WAAW;AAC9B,kBAAc,QAAQ;AAE1B;AAQO,SAAS,YACd,MACM;AACN,MAAI,CAAC,mBAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,QAAQ,GAAG,KAAK,IAAI;AAEpC,sBAAkB,QAAQ,aAAa,MAAM,MAAM,CAAC;AAAA,EACtD,CAAC;AACH;AAUO,SAAS,eACd,eACA,UAAuC,CAAC,GAKxC;AACA,QAAM,aAAS,iBAA6B;AAE5C,QAAM,aAAS,iBAAI,aAAa;AAEhC,WAAS,aAAa,SAAsC,CAAC,GAAG;AAC9D,gBAAY,EAAE,QAAQ,QAAQ,GAAG,OAAO,CAAC;AAAA,EAC3C;AAEA,cAAY,EAAE,QAAQ,QAAQ,GAAG,QAAQ,CAAC;AAE1C,+BAAY,MAAM,OAAO,aAAS,mBAAS,OAAO,KAAK,CAAC;AAExD,SAAO,CAAC,QAAQ,QAAQ,YAAY;AACtC;AAWA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,WAAwB;AAC9B,iBAAa,IAAI,QAAQ,MAAM;AAE/B,iBAAAC,aAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,QACN,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":["import_vue","validEl","initParent"]} \ No newline at end of file diff --git a/dist/vue/index.mjs.map b/dist/vue/index.mjs.map index 2a8adc9..847a01c 100644 --- a/dist/vue/index.mjs.map +++ b/dist/vue/index.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/vue/index.ts","../../src/vue/utils.ts"],"sourcesContent":["import type { Ref } from \"vue\";\nimport type { VueDragAndDropData, VueParentConfig } from \"./types\";\nimport { dragAndDrop as initParent, isBrowser, tearDown } from \"../index\";\nimport { onUnmounted, ref } from \"vue\";\nimport { handleVueElements } from \"./utils\";\nexport * from \"./types\";\n\n/**\n * Global store for parent els to values.\n */\nconst parentValues: WeakMap> | Array> =\n new WeakMap();\n\n/**\n * Returns the values of the parent element.\n *\n * @param parent - The parent element.\n *\n * @returns The values of the parent element.\n */\nfunction getValues(parent: HTMLElement): Array {\n const values = parentValues.get(parent);\n\n if (!values) {\n console.warn(\"No values found for parent element\");\n\n return [];\n }\n\n return \"value\" in values ? values.value : values;\n}\n\n/**\n * Sets the values of the parent element.\n *\n * @param parent - The parent element.\n *\n * @param newValues - The new values for the parent element.\n *\n * @returns void\n */\nfunction setValues(newValues: Array, parent: HTMLElement): void {\n const currentValues = parentValues.get(parent);\n\n // Only update reactive values. If static, let's not update.\n if (currentValues && \"value\" in currentValues)\n currentValues.value = newValues;\n //else if (currentValues) parentValues.set(parent, newValues);\n}\n/**\n * Entry point for Vue drag and drop.\n *\n * @param data - The drag and drop configuration.\n *\n * @returns void\n */\nexport function dragAndDrop(\n data: VueDragAndDropData | Array>\n): void {\n if (!isBrowser) return;\n\n if (!Array.isArray(data)) data = [data];\n\n data.forEach((dnd) => {\n const { parent, values, ...rest } = dnd;\n\n handleVueElements(parent, handleParent(rest, values));\n });\n}\n\n/**\n * Creates a new instance of drag and drop and returns the parent element and\n * a ref of the values to use in your template.\n *\n * @param initialValues - The initial values of the parent element.\n *\n * @returns The parent element and values for drag and drop.\n */\nexport function useDragAndDrop(\n initialValues: T[],\n options: Partial> = {}\n): [\n Ref,\n Ref,\n (config: Partial>) => void\n] {\n const parent = ref();\n\n const values = ref(initialValues) as Ref;\n\n function updateConfig(config: Partial> = {}) {\n dragAndDrop({ parent, values, ...config });\n }\n\n dragAndDrop({ parent, values, ...options });\n\n onUnmounted(() => parent.value && tearDown(parent.value));\n\n return [parent, values, updateConfig];\n}\n\n/**\n * Sets the HTMLElement parent to weakmap with provided values and calls\n * initParent.\n *\n * @param config - The config of the parent.\n *\n * @param values - The values of the parent element.\n *\n */\nfunction handleParent(\n config: Partial>,\n values: Ref> | Array\n) {\n return (parent: HTMLElement) => {\n parentValues.set(parent, values);\n\n initParent({\n parent,\n getValues,\n setValues,\n config: {\n ...config,\n },\n });\n };\n}\n","import type { VueElement } from \"./types\";\nimport { watch } from \"vue\";\n\n/**\n * Checks if the given parent is an HTMLElement.\n *\n * @param dnd - The drag and drop configuration.\n */\nexport function getEl(parent: VueElement): HTMLElement | void {\n if (parent instanceof HTMLElement) return parent;\n else if (parent.value instanceof HTMLElement) return parent.value;\n else if (\"$el\" in parent && parent.$el instanceof HTMLElement)\n return parent.$el;\n}\n\nexport function handleVueElements(\n elements: Array | VueElement,\n cb: (el: HTMLElement) => void\n): void {\n if (!Array.isArray(elements)) elements = [elements];\n\n for (const element of elements) {\n const validEl = getEl(element);\n\n if (validEl) return cb(validEl);\n\n const stop = watch(element, (newEl) => {\n if (!newEl) return;\n\n const validEl = getEl(newEl);\n\n !validEl ? console.warn(\"Invalid parent element\", newEl) : cb(validEl);\n\n stop();\n });\n }\n}\n"],"mappings":";AAEA,SAAS,eAAe,YAAY,WAAW,gBAAgB;AAC/D,SAAS,aAAa,WAAW;;;ACFjC,SAAS,aAAa;AAOf,SAAS,MAAM,QAAwC;AAC5D,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,OAAO,iBAAiB,YAAa,QAAO,OAAO;AAAA,WACnD,SAAS,UAAU,OAAO,eAAe;AAChD,WAAO,OAAO;AAClB;AAEO,SAAS,kBACd,UACA,IACM;AACN,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,YAAW,CAAC,QAAQ;AAElD,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,MAAM,OAAO;AAE7B,QAAI,QAAS,QAAO,GAAG,OAAO;AAE9B,UAAM,OAAO,MAAM,SAAS,CAAC,UAAU;AACrC,UAAI,CAAC,MAAO;AAEZ,YAAMA,WAAU,MAAM,KAAK;AAE3B,OAACA,WAAU,QAAQ,KAAK,0BAA0B,KAAK,IAAI,GAAGA,QAAO;AAErE,WAAK;AAAA,IACP,CAAC;AAAA,EACH;AACF;;;AD1BA,IAAM,eACJ,oBAAI,QAAQ;AASd,SAAS,UAAU,QAAiC;AAClD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,WAAW,SAAS,OAAO,QAAQ;AAC5C;AAWA,SAAS,UAAU,WAAuB,QAA2B;AACnE,QAAM,gBAAgB,aAAa,IAAI,MAAM;AAG7C,MAAI,iBAAiB,WAAW;AAC9B,kBAAc,QAAQ;AAE1B;AAQO,SAAS,YACd,MACM;AACN,MAAI,CAAC,UAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,QAAQ,GAAG,KAAK,IAAI;AAEpC,sBAAkB,QAAQ,aAAa,MAAM,MAAM,CAAC;AAAA,EACtD,CAAC;AACH;AAUO,SAAS,eACd,eACA,UAAuC,CAAC,GAKxC;AACA,QAAM,SAAS,IAA6B;AAE5C,QAAM,SAAS,IAAI,aAAa;AAEhC,WAAS,aAAa,SAAsC,CAAC,GAAG;AAC9D,gBAAY,EAAE,QAAQ,QAAQ,GAAG,OAAO,CAAC;AAAA,EAC3C;AAEA,cAAY,EAAE,QAAQ,QAAQ,GAAG,QAAQ,CAAC;AAE1C,cAAY,MAAM,OAAO,SAAS,SAAS,OAAO,KAAK,CAAC;AAExD,SAAO,CAAC,QAAQ,QAAQ,YAAY;AACtC;AAWA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,WAAwB;AAC9B,iBAAa,IAAI,QAAQ,MAAM;AAE/B,eAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,QACN,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":["validEl"]} \ No newline at end of file +{"version":3,"sources":["../../src/vue/index.ts","../../src/vue/utils.ts"],"sourcesContent":["import type { Ref } from \"vue\";\r\nimport type { VueDragAndDropData, VueParentConfig } from \"./types\";\r\nimport { dragAndDrop as initParent, isBrowser, tearDown } from \"../index\";\r\nimport { onUnmounted, ref } from \"vue\";\r\nimport { handleVueElements } from \"./utils\";\r\nexport * from \"./types\";\r\n\r\n/**\r\n * Global store for parent els to values.\r\n */\r\nconst parentValues: WeakMap> | Array> =\r\n new WeakMap();\r\n\r\n/**\r\n * Returns the values of the parent element.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @returns The values of the parent element.\r\n */\r\nfunction getValues(parent: HTMLElement): Array {\r\n const values = parentValues.get(parent);\r\n\r\n if (!values) {\r\n console.warn(\"No values found for parent element\");\r\n\r\n return [];\r\n }\r\n\r\n return \"value\" in values ? values.value : values;\r\n}\r\n\r\n/**\r\n * Sets the values of the parent element.\r\n *\r\n * @param parent - The parent element.\r\n *\r\n * @param newValues - The new values for the parent element.\r\n *\r\n * @returns void\r\n */\r\nfunction setValues(newValues: Array, parent: HTMLElement): void {\r\n const currentValues = parentValues.get(parent);\r\n\r\n // Only update reactive values. If static, let's not update.\r\n if (currentValues && \"value\" in currentValues)\r\n currentValues.value = newValues;\r\n //else if (currentValues) parentValues.set(parent, newValues);\r\n}\r\n/**\r\n * Entry point for Vue drag and drop.\r\n *\r\n * @param data - The drag and drop configuration.\r\n *\r\n * @returns void\r\n */\r\nexport function dragAndDrop(\r\n data: VueDragAndDropData | Array>\r\n): void {\r\n if (!isBrowser) return;\r\n\r\n if (!Array.isArray(data)) data = [data];\r\n\r\n data.forEach((dnd) => {\r\n const { parent, values, ...rest } = dnd;\r\n\r\n handleVueElements(parent, handleParent(rest, values));\r\n });\r\n}\r\n\r\n/**\r\n * Creates a new instance of drag and drop and returns the parent element and\r\n * a ref of the values to use in your template.\r\n *\r\n * @param initialValues - The initial values of the parent element.\r\n *\r\n * @returns The parent element and values for drag and drop.\r\n */\r\nexport function useDragAndDrop(\r\n initialValues: T[],\r\n options: Partial> = {}\r\n): [\r\n Ref,\r\n Ref,\r\n (config: Partial>) => void\r\n] {\r\n const parent = ref();\r\n\r\n const values = ref(initialValues) as Ref;\r\n\r\n function updateConfig(config: Partial> = {}) {\r\n dragAndDrop({ parent, values, ...config });\r\n }\r\n\r\n dragAndDrop({ parent, values, ...options });\r\n\r\n onUnmounted(() => parent.value && tearDown(parent.value));\r\n\r\n return [parent, values, updateConfig];\r\n}\r\n\r\n/**\r\n * Sets the HTMLElement parent to weakmap with provided values and calls\r\n * initParent.\r\n *\r\n * @param config - The config of the parent.\r\n *\r\n * @param values - The values of the parent element.\r\n *\r\n */\r\nfunction handleParent(\r\n config: Partial>,\r\n values: Ref> | Array\r\n) {\r\n return (parent: HTMLElement) => {\r\n parentValues.set(parent, values);\r\n\r\n initParent({\r\n parent,\r\n getValues,\r\n setValues,\r\n config: {\r\n ...config,\r\n },\r\n });\r\n };\r\n}\r\n","import type { VueElement } from \"./types\";\r\nimport { watch } from \"vue\";\r\n\r\n/**\r\n * Checks if the given parent is an HTMLElement.\r\n *\r\n * @param dnd - The drag and drop configuration.\r\n */\r\nexport function getEl(parent: VueElement): HTMLElement | void {\r\n if (parent instanceof HTMLElement) return parent;\r\n else if (parent.value instanceof HTMLElement) return parent.value;\r\n else if (\"$el\" in parent && parent.$el instanceof HTMLElement)\r\n return parent.$el;\r\n}\r\n\r\nexport function handleVueElements(\r\n elements: Array | VueElement,\r\n cb: (el: HTMLElement) => void\r\n): void {\r\n if (!Array.isArray(elements)) elements = [elements];\r\n\r\n for (const element of elements) {\r\n const validEl = getEl(element);\r\n\r\n if (validEl) return cb(validEl);\r\n\r\n const stop = watch(element, (newEl) => {\r\n if (!newEl) return;\r\n\r\n const validEl = getEl(newEl);\r\n\r\n !validEl ? console.warn(\"Invalid parent element\", newEl) : cb(validEl);\r\n\r\n stop();\r\n });\r\n }\r\n}\r\n"],"mappings":";AAEA,SAAS,eAAe,YAAY,WAAW,gBAAgB;AAC/D,SAAS,aAAa,WAAW;;;ACFjC,SAAS,aAAa;AAOf,SAAS,MAAM,QAAwC;AAC5D,MAAI,kBAAkB,YAAa,QAAO;AAAA,WACjC,OAAO,iBAAiB,YAAa,QAAO,OAAO;AAAA,WACnD,SAAS,UAAU,OAAO,eAAe;AAChD,WAAO,OAAO;AAClB;AAEO,SAAS,kBACd,UACA,IACM;AACN,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,YAAW,CAAC,QAAQ;AAElD,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,MAAM,OAAO;AAE7B,QAAI,QAAS,QAAO,GAAG,OAAO;AAE9B,UAAM,OAAO,MAAM,SAAS,CAAC,UAAU;AACrC,UAAI,CAAC,MAAO;AAEZ,YAAMA,WAAU,MAAM,KAAK;AAE3B,OAACA,WAAU,QAAQ,KAAK,0BAA0B,KAAK,IAAI,GAAGA,QAAO;AAErE,WAAK;AAAA,IACP,CAAC;AAAA,EACH;AACF;;;AD1BA,IAAM,eACJ,oBAAI,QAAQ;AASd,SAAS,UAAU,QAAiC;AAClD,QAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,oCAAoC;AAEjD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,WAAW,SAAS,OAAO,QAAQ;AAC5C;AAWA,SAAS,UAAU,WAAuB,QAA2B;AACnE,QAAM,gBAAgB,aAAa,IAAI,MAAM;AAG7C,MAAI,iBAAiB,WAAW;AAC9B,kBAAc,QAAQ;AAE1B;AAQO,SAAS,YACd,MACM;AACN,MAAI,CAAC,UAAW;AAEhB,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC,IAAI;AAEtC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,EAAE,QAAQ,QAAQ,GAAG,KAAK,IAAI;AAEpC,sBAAkB,QAAQ,aAAa,MAAM,MAAM,CAAC;AAAA,EACtD,CAAC;AACH;AAUO,SAAS,eACd,eACA,UAAuC,CAAC,GAKxC;AACA,QAAM,SAAS,IAA6B;AAE5C,QAAM,SAAS,IAAI,aAAa;AAEhC,WAAS,aAAa,SAAsC,CAAC,GAAG;AAC9D,gBAAY,EAAE,QAAQ,QAAQ,GAAG,OAAO,CAAC;AAAA,EAC3C;AAEA,cAAY,EAAE,QAAQ,QAAQ,GAAG,QAAQ,CAAC;AAE1C,cAAY,MAAM,OAAO,SAAS,SAAS,OAAO,KAAK,CAAC;AAExD,SAAO,CAAC,QAAQ,QAAQ,YAAY;AACtC;AAWA,SAAS,aACP,QACA,QACA;AACA,SAAO,CAAC,WAAwB;AAC9B,iBAAa,IAAI,QAAQ,MAAM;AAE/B,eAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,QACN,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":["validEl"]} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 5a6d784..8797042 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1610,6 +1610,8 @@ export function initDrag( dragImage = config.dragImage(data, draggedNodes); } else { if (!config.multiDrag || draggedNodes.length === 1) { + dragState.originalZIndex = data.targetData.node.el.style.zIndex; + data.targetData.node.el.style.zIndex = "9999"; data.targetData.node.el.style.boxSizing = "border-box"; @@ -1618,9 +1620,6 @@ export function initDrag( data.e.offsetX, data.e.offsetY ); - - dragState.originalZIndex = data.targetData.node.el.style.zIndex; - return dragState; } else { const wrapper = document.createElement("div");