From b3022e363d1ff5ab564e3b53f2a4e26d878a4999 Mon Sep 17 00:00:00 2001 From: Sasha Milenkovic Date: Mon, 1 Apr 2024 13:27:48 -0400 Subject: [PATCH] fix: fixes typing error in swap plugin --- dist/index.cjs | 155 ++++++++++++++++++++++++++++++++++---- dist/index.cjs.map | 2 +- dist/index.d.cts | 8 +- dist/index.d.ts | 8 +- dist/index.mjs | 154 +++++++++++++++++++++++++++++++++---- dist/index.mjs.map | 2 +- src/plugins/swap/index.ts | 17 +++-- 7 files changed, 304 insertions(+), 42 deletions(-) diff --git a/dist/index.cjs b/dist/index.cjs index 8e16fce..a23b85b 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -34,12 +34,12 @@ __export(src_exports, { events: () => events, getElFromPoint: () => getElFromPoint, getScrollParent: () => getScrollParent, - handleDragoverNode: () => handleDragoverNode, + handleDragoverNode: () => handleDragoverNode2, handleDragoverParent: () => handleDragoverParent, handleDragstart: () => handleDragstart, handleEnd: () => handleEnd, handleLongTouch: () => handleLongTouch, - handleTouchOverNode: () => handleTouchOverNode, + handleTouchOverNode: () => handleTouchOverNode2, handleTouchOverParent: () => handleTouchOverParent, handleTouchedNode: () => handleTouchedNode, handleTouchmove: () => handleTouchmove, @@ -68,6 +68,7 @@ __export(src_exports, { setupNodeRemap: () => setupNodeRemap, sort: () => sort, state: () => state, + swap: () => swap, tearDown: () => tearDown, tearDownNode: () => tearDownNode, tearDownNodeRemap: () => tearDownNodeRemap, @@ -604,10 +605,6 @@ function animate(node, animation, duration) { node.animate(animation, { duration }); - setTimeout(() => { - if (!state) - return; - }, duration); } // src/plugins/multiDrag/plugins/selections/index.ts @@ -889,6 +886,136 @@ function keydown(data) { multiDragState.activeNode.el.focus(); } +// src/plugins/swap/index.ts +var swapState = { + draggedOverNodes: Array() +}; +function swap(swapConfig = {}) { + return (parent) => { + const parentData = parents.get(parent); + if (!parentData) + return; + const swapParentConfig = { + ...parentData.config, + swapConfig + }; + return { + setup() { + swapParentConfig.handleDragoverNode = swapConfig.handleDragoverNode || handleDragoverNode; + swapParentConfig.handleTouchOverNode = swapConfig.handleTouchOverNode || handleTouchOverNode; + swapParentConfig.handleEnd = swapConfig.handleEnd || handleEnd2; + swapParentConfig.handleDragoverParent = () => { + }; + swapParentConfig.handleTouchOverParent = () => { + }; + parentData.config = swapParentConfig; + } + }; + }; +} +function handleDragoverNode(data) { + if (!state) + return; + dragoverNode(data, state); +} +function handleTouchOverNode(data) { + if (!state) + return; + const dropZoneClass = data.detail.targetData.parent.data.config.touchDropZoneClass; + removeClass( + swapState.draggedOverNodes.map((node) => node.el), + dropZoneClass + ); + const enabledNodes = data.detail.targetData.parent.data.enabledNodes; + if (!enabledNodes) + return; + swapState.draggedOverNodes = enabledNodes.slice( + data.detail.targetData.node.data.index, + data.detail.targetData.node.data.index + state.draggedNodes.length + ); + addClass( + swapState.draggedOverNodes.map((node) => node.el), + dropZoneClass, + true + ); + state.lastTargetValue = data.detail.targetData.node.data.value; + state.lastParent = data.detail.targetData.parent; +} +function dragoverNode(data, state2) { + data.e.preventDefault(); + data.e.stopPropagation(); + const dropZoneClass = data.targetData.parent.data.config.dropZoneClass; + removeClass( + swapState.draggedOverNodes.map((node) => node.el), + dropZoneClass + ); + const enabledNodes = data.targetData.parent.data.enabledNodes; + if (!enabledNodes) + return; + swapState.draggedOverNodes = enabledNodes.slice( + data.targetData.node.data.index, + data.targetData.node.data.index + state2.draggedNodes.length + ); + addClass( + swapState.draggedOverNodes.map((node) => node.el), + dropZoneClass, + true + ); + state2.lastTargetValue = data.targetData.node.data.value; + state2.lastParent = data.targetData.parent; +} +function handleEnd2(data) { + if (!state) + return; + const draggedParentValues = parentValues( + state.initialParent.el, + state.initialParent.data + ); + let targetParentValues = parentValues( + state.lastParent.el, + state.lastParent.data + ); + const draggedValues = state.draggedNodes.map((node) => node.data.value); + const draggedOverNodeValues = swapState.draggedOverNodes.map( + (node) => node.data.value + ); + const draggedIndex = state.draggedNodes[0].data.index; + const draggedOverIndex = swapState.draggedOverNodes[0].data.index; + targetParentValues.splice( + draggedOverIndex, + draggedValues.length, + ...draggedValues + ); + if (state.initialParent.el === state.lastParent.el) { + targetParentValues.splice( + draggedIndex, + draggedValues.length, + ...draggedOverNodeValues + ); + setParentValues(state.initialParent.el, state.initialParent.data, [ + ...targetParentValues + ]); + } else { + draggedParentValues.splice( + draggedIndex, + draggedValues.length, + ...draggedOverNodeValues + ); + setParentValues(state.lastParent.el, state.lastParent.data, [ + ...targetParentValues + ]); + setParentValues(state.initialParent.el, state.initialParent.data, [ + ...draggedParentValues + ]); + } + const dropZoneClass = "touchedNode" in state ? data.targetData.parent.data.config.touchDropZoneClass : data.targetData.parent.data.config.dropZoneClass; + removeClass( + swapState.draggedOverNodes.map((node) => node.el), + dropZoneClass + ); + handleEnd(data); +} + // src/index.ts var scrollConfig = { up: [0, -1], @@ -1022,12 +1149,12 @@ function dragAndDrop({ setValues, config: { handleDragstart, - handleDragoverNode, + handleDragoverNode: handleDragoverNode2, handleDragoverParent, handleEnd, handleTouchstart, handleTouchmove, - handleTouchOverNode, + handleTouchOverNode: handleTouchOverNode2, handleTouchOverParent, handleDragenterNode, handleDragleaveNode, @@ -1242,7 +1369,7 @@ function dragstart2(data) { config.dropZoneClass ); } -function handleTouchOverNode(e) { +function handleTouchOverNode2(e) { if (!state) return; if (e.detail.targetData.parent.el === state.lastParent.el) @@ -1256,9 +1383,6 @@ function setupNode(data) { data.nodeData.abortControllers.mainNode = addEvents(data.node, { dragstart: nodeEventData(config.handleDragstart), dragover: nodeEventData(config.handleDragoverNode), - // dragover: nodeEventData( - // throttle(data.parentData.config.handleDragoverNode, 1000) - // ), dragenter: nodeEventData(config.handleDragenterNode), dragleave: nodeEventData(config.handleDragleaveNode), dragend: nodeEventData(config.handleEnd), @@ -1537,14 +1661,14 @@ function performScroll(direction, x, y) { "touchedNode" in state2 ? 10 : 100 ); } -function handleDragoverNode(data) { +function handleDragoverNode2(data) { if (!state) return; const { x, y } = eventCoordinates(data.e); state.coordinates.y = y; state.coordinates.x = x; handleScroll(); - dragoverNode(data, state); + dragoverNode2(data, state); } function handleDragoverParent(data) { if (!state) @@ -1585,7 +1709,7 @@ function handleDragenterNode(data, _state) { function handleDragleaveNode(data, _state) { data.e.preventDefault(); } -function dragoverNode(eventData, dragState) { +function dragoverNode2(eventData, dragState) { eventData.e.preventDefault(); eventData.e.stopPropagation(); eventData.targetData.parent.el === dragState.lastParent?.el ? sort(eventData, dragState) : transfer(eventData, dragState); @@ -1804,6 +1928,7 @@ function parentEventData(callback) { setupNodeRemap, sort, state, + swap, tearDown, tearDownNode, tearDownNodeRemap, diff --git a/dist/index.cjs.map b/dist/index.cjs.map index 8a6f493..f638895 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/plugins/multiDrag/index.ts","../src/plugins/animations/index.ts","../src/plugins/multiDrag/plugins/selections/index.ts"],"sourcesContent":["import type {\n DragAndDrop,\n Node,\n DNDPlugin,\n NodeEventData,\n TouchOverNodeEvent,\n ParentsData,\n NodesData,\n DragState,\n TouchState,\n DragStateProps,\n TouchStateProps,\n NodeData,\n ParentData,\n SetupNodeData,\n TearDownNodeData,\n NodeTargetData,\n ParentConfig,\n ParentTargetData,\n ParentEventData,\n TouchOverParentEvent,\n NodeDragEventData,\n NodeTouchEventData,\n NodeRecord,\n ScrollData,\n} from \"./types\";\nimport {\n isBrowser,\n addClass,\n removeClass,\n getElFromPoint,\n isNode,\n getScrollParent,\n addEvents,\n copyNodeStyle,\n eventCoordinates,\n throttle,\n} from \"./utils\";\nexport { isBrowser };\nexport * from \"./types\";\nexport { multiDrag } from \"./plugins/multiDrag\";\nexport { animations } from \"./plugins/animations\";\nexport { selections } from \"./plugins/multiDrag/plugins/selections\";\nexport * from \"./utils\";\n\nconst scrollConfig: {\n [key: string]: [number, number];\n} = {\n up: [0, -1],\n down: [0, 1],\n left: [-1, 0],\n right: [1, 0],\n};\n\nexport const nodes: NodesData = new WeakMap>();\n\nexport const parents: ParentsData = new WeakMap<\n HTMLElement,\n ParentData\n>();\n\n/**\n * The state of the drag and drop. Is undefined until either dragstart or\n * touchstart is called.\n */\nexport let state: DragState | TouchState | undefined = undefined;\n\nexport function resetState() {\n state = undefined;\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: DragStateProps\n): DragState {\n state = {\n ascendingDirection: false,\n incomingDirection: undefined,\n enterCount: 0,\n targetIndex: 0,\n affectedNodes: [],\n lastValue: undefined,\n activeNode: undefined,\n lastTargetValue: undefined,\n remapJustFinished: false,\n preventEnter: false,\n clonedDraggedEls: [],\n originalZIndex: undefined,\n ...dragStateProps,\n } as DragState;\n\n return state;\n}\n\nexport function setTouchState(\n dragState: DragState,\n touchStateProps: TouchStateProps\n): TouchState {\n state = {\n ...dragState,\n ...touchStateProps,\n };\n\n return state as TouchState;\n}\n\nexport function dragStateProps(\n data: NodeDragEventData | NodeTouchEventData\n): DragStateProps {\n const { x, y } = eventCoordinates(data.e);\n\n return {\n coordinates: {\n x,\n y,\n },\n draggedNode: {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n draggedNodes: [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ],\n initialIndex: data.targetData.node.data.index,\n initialParent: {\n el: data.targetData.parent.el,\n data: data.targetData.parent.data,\n },\n lastParent: {\n el: data.targetData.parent.el,\n data: data.targetData.parent.data,\n },\n scrollParent: getScrollParent(data.targetData.node.el),\n };\n}\n\nexport function performSort(\n state: DragState | TouchState,\n data: NodeDragEventData | NodeTouchEventData\n) {\n const draggedValues = dragValues(state);\n\n const targetParentValues = parentValues(\n data.targetData.parent.el,\n data.targetData.parent.data\n );\n\n const newParentValues = [\n ...targetParentValues.filter((x) => !draggedValues.includes(x)),\n ];\n\n newParentValues.splice(data.targetData.node.data.index, 0, ...draggedValues);\n\n state.lastTargetValue = data.targetData.node.data.value;\n\n setParentValues(data.targetData.parent.el, data.targetData.parent.data, [\n ...newParentValues,\n ]);\n}\n\nexport function parentValues(\n parent: HTMLElement,\n parentData: ParentData\n): Array {\n return [...parentData.getValues(parent)];\n}\n\nexport function setParentValues(\n parent: HTMLElement,\n parentData: ParentData,\n values: Array\n): void {\n parentData.setValues(values, parent);\n}\n\nexport function dragValues(state: DragState | TouchState): Array {\n return [...state.draggedNodes.map((x) => x.data.value)];\n}\n\n/**\n * Utility function to update parent config.\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 * Initializes the drag and drop functionality for a given parent.\n *\n * @param {DragAndDrop} dragAndDrop - The drag and drop configuration.\n * @param {HTMLElement} dragAndDrop.parent - The parent element.\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 document.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n\n // Temp fix sincie I am throttling dragover node\n if (nodes.has(e.target as Node) || parents.has(e.target as HTMLElement))\n return;\n\n if (state) {\n state.remapJustFinished = false;\n\n state.lastTargetValue = undefined;\n\n const { x, y } = eventCoordinates(e);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n }\n });\n\n tearDown(parent);\n\n const parentData: ParentData = {\n getValues,\n setValues,\n config: {\n handleDragstart,\n handleDragoverNode,\n handleDragoverParent,\n handleEnd,\n handleTouchstart,\n handleTouchmove,\n handleTouchOverNode,\n handleTouchOverParent,\n handleDragenterNode,\n handleDragleaveNode,\n performSort,\n performTransfer,\n root: document,\n setupNode,\n setupNodeRemap,\n reapplyDragClasses,\n tearDownNode,\n tearDownNodeRemap,\n remapFinished,\n scrollBehavior: {\n x: 0.8,\n y: 0.8,\n },\n threshold: {\n horizontal: 0,\n vertical: 0,\n },\n ...config,\n },\n enabledNodes: [],\n abortControllers: {},\n };\n\n const nodesObserver = new MutationObserver(nodesMutated);\n\n nodesObserver.observe(parent, { childList: true });\n\n parents.set(parent, parentData as any);\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 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\nfunction setup(parent: HTMLElement, parentData: ParentData): void {\n parentData.abortControllers.mainParent = addEvents(parent, {\n dragover: parentEventData(\n throttle(parentData.config.handleDragoverParent, 10)\n ),\n touchOverParent: parentData.config.handleTouchOverParent,\n });\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 const parentEl = mutationList[0].target;\n\n if (!(parentEl instanceof HTMLElement)) 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 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)) continue;\n\n const nodeData = nodes.get(node);\n\n // Only tear down the node if someone has explicitly called dragAndDrop.\n if (force || !nodeData) {\n config.tearDownNode({ node, parent, nodeData, parentData });\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 enabled nodes does not match the number of values.\"\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 const nodeData = Object.assign(\n prevNodeData ?? {\n privateClasses: [],\n abortControllers: {},\n },\n {\n value: values[x],\n index: x,\n }\n );\n\n // TODO: maybe get rid of this — duplicate of the next if statement\n if (state && nodeData.value === state.draggedNode.data.value) {\n state.draggedNode.data = nodeData;\n\n state.draggedNode.el = node;\n }\n\n if (\n state &&\n state.draggedNodes.map((x) => x.data.value).includes(nodeData.value)\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 const setupNodeData = {\n node,\n parent,\n parentData,\n nodeData,\n };\n\n if (force || !prevNodeData) config.setupNode(setupNodeData);\n\n setupNodeRemap(setupNodeData);\n }\n\n parents.set(parent, { ...parentData, enabledNodes: enabledNodeRecords });\n\n config.remapFinished(parentData);\n}\n\nexport function remapFinished() {\n if (state) {\n state.preventEnter = false;\n\n state.remapJustFinished = true;\n\n state.affectedNodes = [];\n }\n}\n\nexport function handleDragstart(data: NodeEventData) {\n if (!(data.e instanceof DragEvent)) return;\n\n dragstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nexport function dragstartClasses(\n el: HTMLElement | Node | Element,\n draggingClass: string | undefined,\n dropZoneClass: string | undefined\n) {\n addClass([el], draggingClass);\n\n setTimeout(() => {\n removeClass([el], draggingClass);\n\n addClass([el], dropZoneClass);\n });\n}\n\nexport function initDrag(eventData: NodeDragEventData): DragState {\n const dragState = setDragState(dragStateProps(eventData));\n\n eventData.e.stopPropagation();\n\n if (eventData.e.dataTransfer) {\n eventData.e.dataTransfer.dropEffect = \"move\";\n\n eventData.e.dataTransfer.effectAllowed = \"move\";\n\n eventData.e.dataTransfer.setDragImage(\n eventData.targetData.node.el,\n eventData.e.offsetX,\n eventData.e.offsetY\n );\n }\n\n return dragState;\n}\n\nfunction validateDragHandle(data: NodeEventData): boolean {\n if (!(data.e instanceof DragEvent) && !(data.e instanceof TouchEvent))\n return false;\n\n const config = data.targetData.parent.data.config;\n\n if (!config.dragHandle) return true;\n\n const dragHandles = data.targetData.node.el.querySelectorAll(\n config.dragHandle\n );\n\n if (!dragHandles) return false;\n\n const coordinates = eventCoordinates(data.e);\n\n const elFromPoint = config.root.elementFromPoint(\n coordinates.x,\n coordinates.y\n );\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\n return false;\n}\n\nfunction touchstart(data: NodeTouchEventData) {\n if (!validateDragHandle(data)) return;\n\n const touchState = initTouch(data);\n\n handleTouchedNode(data, touchState);\n\n handleLongTouch(data, touchState);\n}\n\nexport function dragstart(data: NodeDragEventData) {\n if (!validateDragHandle(data)) {\n data.e.preventDefault();\n\n return;\n }\n\n const config = data.targetData.parent.data.config;\n\n const dragState = initDrag(data);\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n dragstartClasses(\n dragState.draggedNode.el,\n config.draggingClass,\n config.dropZoneClass\n );\n}\n\nexport function handleTouchOverNode(e: TouchOverNodeEvent) {\n if (!state) return;\n\n if (e.detail.targetData.parent.el === state.lastParent.el)\n sort(e.detail, state);\n else transfer(e.detail, state);\n}\n\nexport function setupNode(data: SetupNodeData) {\n const config = data.parentData.config;\n\n data.node.draggable = true;\n\n data.nodeData.abortControllers.mainNode = addEvents(data.node, {\n dragstart: nodeEventData(config.handleDragstart),\n dragover: nodeEventData(config.handleDragoverNode),\n // dragover: nodeEventData(\n // throttle(data.parentData.config.handleDragoverNode, 1000)\n // ),\n dragenter: nodeEventData(config.handleDragenterNode),\n dragleave: nodeEventData(config.handleDragleaveNode),\n dragend: nodeEventData(config.handleEnd),\n touchstart: nodeEventData(config.handleTouchstart),\n touchmove: nodeEventData(config.handleTouchmove),\n touchend: nodeEventData(config.handleEnd),\n touchOverNode: config.handleTouchOverNode,\n });\n\n config.reapplyDragClasses(data.node, data.parentData);\n\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.setupNode?.(data);\n });\n}\n\nexport function setupNodeRemap(data: SetupNodeData) {\n nodes.set(data.node, data.nodeData);\n\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.setupNodeRemap?.(data);\n });\n}\n\nfunction reapplyDragClasses(node: Node, parentData: ParentData) {\n if (!state) return;\n\n const dropZoneClass =\n \"touchedNode\" in state\n ? parentData.config.touchDropZoneClass\n : parentData.config.dropZoneClass;\n\n if (state.draggedNode.el !== node) return;\n\n addClass([node], dropZoneClass, true);\n}\n\nexport function tearDownNodeRemap(data: TearDownNodeData) {\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.tearDownNodeRemap?.(data);\n });\n}\n\nexport function tearDownNode(data: TearDownNodeData) {\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.tearDownNode?.(data);\n });\n\n data.node.draggable = false;\n\n if (data.nodeData?.abortControllers?.mainNode) {\n data.nodeData?.abortControllers?.mainNode.abort();\n }\n}\n\nexport function handleEnd(eventData: NodeEventData) {\n if (!state) return;\n\n end(eventData, state);\n\n resetState();\n}\n\nexport function end(\n _eventData: NodeEventData,\n state: DragState | TouchState\n) {\n document.removeEventListener(\"contextmenu\", preventDefault);\n\n if (\"longTouchTimeout\" in state && state.longTouchTimeout)\n clearTimeout(state.longTouchTimeout);\n\n const config = parents.get(state.initialParent.el)?.config;\n\n const isTouch = \"touchedNode\" in state;\n\n const dropZoneClass = isTouch\n ? config?.touchDropZoneClass\n : config?.dropZoneClass;\n\n if (state.originalZIndex !== undefined)\n state.draggedNode.el.style.zIndex = state.originalZIndex;\n\n addClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass,\n true\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n\n if (config?.longTouchClass) {\n removeClass(\n state.draggedNodes.map((x) => x.el),\n state.initialParent.data?.config?.longTouchClass\n );\n }\n\n if (\"touchedNode\" in state) state.touchedNode?.remove();\n}\n\nexport function handleTouchstart(eventData: NodeEventData) {\n if (!(eventData.e instanceof TouchEvent)) return;\n\n touchstart({\n e: eventData.e,\n targetData: eventData.targetData,\n });\n}\n\nexport function initTouch(data: NodeTouchEventData): TouchState {\n data.e.stopPropagation();\n\n const clonedNode = data.targetData.node.el.cloneNode(true) as HTMLElement;\n\n const rect = data.targetData.node.el.getBoundingClientRect();\n\n const touchState = setTouchState(setDragState(dragStateProps(data)), {\n coordinates: {\n x: data.e.touches[0].clientX,\n y: data.e.touches[0].clientY,\n },\n scrollParent: getScrollParent(data.targetData.node.el),\n touchStartLeft: data.e.touches[0].clientX - rect.left,\n touchStartTop: data.e.touches[0].clientY - rect.top,\n touchedNode: clonedNode,\n touchMoving: false,\n });\n\n return touchState;\n}\n\nfunction preventDefault(e: Event) {\n e.preventDefault();\n}\n\nexport function handleTouchedNode(\n data: NodeTouchEventData,\n touchState: TouchState\n) {\n touchState.touchedNodeDisplay = touchState.touchedNode.style.display;\n\n const rect = data.targetData.node.el.getBoundingClientRect();\n\n touchState.touchedNode.style.cssText = `\n width: ${rect.width}px;\n position: fixed;\n pointer-events: none;\n top: -9999px;\n z-index: 999999;\n display: none;\n `;\n\n document.body.append(touchState.touchedNode);\n\n copyNodeStyle(data.targetData.node.el, touchState.touchedNode as Node);\n\n touchState.touchedNode.style.display = \"none\";\n\n document.addEventListener(\"contextmenu\", preventDefault);\n}\n\nexport function handleLongTouch(\n data: NodeEventData,\n touchState: TouchState\n) {\n const config = data.targetData.parent.data.config;\n\n if (!config.longTouch) return;\n\n touchState.longTouchTimeout = setTimeout(() => {\n if (!touchState) return;\n\n touchState.longTouch = true;\n\n if (config.longTouchClass && data.e.cancelable)\n addClass(\n touchState.draggedNodes.map((x) => x.el),\n config.longTouchClass\n );\n\n data.e.preventDefault();\n }, config.longTouchTimeout || 200);\n}\n\nexport function handleTouchmove(eventData: NodeTouchEventData) {\n if (!state || !(\"touchedNode\" in state)) return;\n\n touchmove(eventData, state);\n}\n\nfunction touchmoveClasses(\n touchState: TouchState,\n config: ParentConfig\n) {\n if (config.longTouchClass)\n removeClass(\n touchState.draggedNodes.map((x) => x.el),\n config?.longTouchClass\n );\n\n if (config.touchDraggingClass)\n addClass([touchState.touchedNode], config.touchDraggingClass);\n\n if (config.touchDropZoneClass)\n addClass(\n touchState.draggedNodes.map((x) => x.el),\n config.touchDropZoneClass\n );\n}\n\nfunction getScrollData(\n state?: DragState | TouchState\n): ScrollData | void {\n if (!state || !state.scrollParent) return;\n\n const { x, y, width, height } = state.scrollParent.getBoundingClientRect();\n\n const {\n x: xThresh,\n y: yThresh,\n scrollOutside,\n } = state.lastParent.data.config.scrollBehavior;\n\n return {\n state,\n xThresh,\n yThresh,\n scrollOutside,\n scrollParent: state.scrollParent,\n x,\n y,\n width,\n height,\n };\n}\n\nfunction shouldScroll(\n direction: string\n): DragState | TouchState | void {\n const data = getScrollData(state);\n\n if (!data) return;\n\n switch (direction) {\n case \"down\":\n return shouldScrollDown(data.state, data);\n\n case \"up\":\n return shouldScrollUp(data.state, data);\n\n case \"right\":\n return shouldScrollRight(data.state, data);\n\n case \"left\":\n return shouldScrollLeft(data.state, data);\n }\n}\n\nfunction shouldScrollRight(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientWidth + data.x - state.coordinates.x;\n\n if (!data.scrollOutside && diff < 0) return;\n\n if (\n diff < (1 - data.xThresh) * data.scrollParent.clientWidth &&\n !(\n data.scrollParent.scrollLeft + data.scrollParent.clientWidth >=\n data.scrollParent.scrollWidth\n )\n )\n return state;\n}\n\nfunction shouldScrollLeft(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientWidth + data.x - state.coordinates.x;\n\n if (!data.scrollOutside && diff > data.scrollParent.clientWidth) return;\n\n if (\n diff > data.xThresh * data.scrollParent.clientWidth &&\n data.scrollParent.scrollLeft !== 0\n )\n return state;\n}\n\nfunction shouldScrollUp(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientHeight + data.y - state.coordinates.y;\n\n if (!data.scrollOutside && diff > data.scrollParent.clientHeight) return;\n\n if (\n diff > data.yThresh * data.scrollParent.clientHeight &&\n data.scrollParent.scrollTop !== 0\n )\n return state;\n}\n\nfunction shouldScrollDown(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientHeight + data.y - state.coordinates.y;\n\n if (!data.scrollOutside && diff < 0) return;\n\n if (\n diff < (1 - data.yThresh) * data.scrollParent.clientHeight &&\n !(\n data.scrollParent.scrollTop + data.scrollParent.clientHeight >=\n data.scrollParent.scrollHeight\n )\n )\n return state;\n}\n\nfunction moveTouchedNode(\n data: NodeTouchEventData,\n touchState: TouchState\n) {\n touchState.touchMoving = true;\n\n touchState.touchedNode.style.display = touchState.touchedNodeDisplay || \"\";\n\n const { x, y } = eventCoordinates(data.e);\n\n touchState.coordinates.y = y;\n\n touchState.coordinates.x = x;\n\n const touchStartLeft = touchState.touchStartLeft ?? 0;\n\n const touchStartTop = touchState.touchStartTop ?? 0;\n\n touchState.touchedNode.style.left = `${x - touchStartLeft}px`;\n\n touchState.touchedNode.style.top = `${y - touchStartTop}px`;\n\n touchmoveClasses(touchState, data.targetData.parent.data.config);\n}\n\nfunction touchmove(data: NodeTouchEventData, touchState: TouchState) {\n const config = data.targetData.parent.data.config;\n\n if (config.longTouch && !touchState.longTouch) {\n clearTimeout(touchState.longTouchTimeout);\n\n return;\n }\n\n if (data.e.cancelable) data.e.preventDefault();\n\n moveTouchedNode(data, touchState);\n\n handleScroll();\n\n const elFromPoint = getElFromPoint(data);\n\n if (!elFromPoint) return;\n\n const touchMoveEventData = {\n e: data.e,\n targetData: elFromPoint,\n };\n\n if (\"node\" in elFromPoint) {\n elFromPoint.node.el.dispatchEvent(\n new CustomEvent(\"touchOverNode\", {\n detail: touchMoveEventData,\n })\n );\n } else {\n elFromPoint.parent.el.dispatchEvent(\n new CustomEvent(\"touchOverParent\", {\n detail: touchMoveEventData,\n })\n );\n }\n}\n\nfunction handleScroll() {\n for (const direction of Object.keys(scrollConfig)) {\n const [x, y] = scrollConfig[direction];\n\n performScroll(direction, x, y);\n }\n}\n\nfunction performScroll(direction: string, x: number, y: number) {\n const state = shouldScroll(direction);\n\n if (!state) return;\n\n state.scrollParent.scrollBy(x, y);\n\n setTimeout(\n () => {\n performScroll(direction, x, y);\n },\n \"touchedNode\" in state ? 10 : 100\n );\n}\n\nexport function handleDragoverNode(data: NodeDragEventData) {\n if (!state) return;\n\n const { x, y } = eventCoordinates(data.e);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n\n dragoverNode(data, state);\n}\n\nexport function handleDragoverParent(data: ParentEventData) {\n if (!state) return;\n\n const { x, y } = eventCoordinates(data.e as DragEvent);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n\n transfer(data, state);\n}\n\nexport function handleTouchOverParent(e: TouchOverParentEvent) {\n if (!state) return;\n\n transfer(e.detail, state);\n}\n\nexport function validateTransfer(\n data: ParentEventData,\n state: DragState | TouchState\n) {\n if (data.targetData.parent.el === state.lastParent.el) return false;\n\n const targetConfig = data.targetData.parent.data.config;\n\n if (targetConfig.dropZone === false) return false;\n\n const initialParentConfig = state.initialParent.data.config;\n\n if (targetConfig.accepts) {\n return targetConfig.accepts(\n data.targetData.parent,\n state.initialParent,\n state.lastParent,\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\nfunction handleDragenterNode(\n data: NodeDragEventData,\n _state: DragState\n) {\n data.e.preventDefault();\n}\n\nfunction handleDragleaveNode(\n data: NodeDragEventData,\n _state: DragState\n) {\n data.e.preventDefault();\n}\n\nfunction dragoverNode(\n eventData: NodeDragEventData,\n dragState: DragState\n) {\n eventData.e.preventDefault();\n\n eventData.e.stopPropagation();\n\n eventData.targetData.parent.el === dragState.lastParent?.el\n ? sort(eventData, dragState)\n : transfer(eventData, dragState);\n}\n\nexport function validateSort(\n data: NodeDragEventData | NodeTouchEventData,\n state: DragState | TouchState,\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.lastTargetValue ||\n state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)\n ) {\n state.lastTargetValue = data.targetData.node.data.value;\n }\n\n return false;\n }\n\n if (state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)) {\n state.lastTargetValue = undefined;\n return false;\n }\n\n if (data.targetData.node.data.value === state.lastTargetValue) return false;\n\n if (\n state.preventEnter ||\n data.targetData.parent.el !== state.lastParent?.el ||\n data.targetData.parent.data.config.sortable === false\n )\n 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.lastParent.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\nexport function sort(\n data: NodeDragEventData | NodeTouchEventData,\n state: DragState | TouchState\n) {\n const { x, y } = eventCoordinates(data.e);\n\n if (!validateSort(data, state, x, y)) return;\n\n state.preventEnter = true;\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(state, data);\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 const parent = node.parentNode || state?.lastParent?.el;\n\n if (!nodeData) return;\n\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n return {\n node: {\n el: node,\n data: nodeData,\n },\n parent: {\n el: parent,\n data: parentData as 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 e,\n targetData,\n });\n };\n}\n\n// TRANSFER LOGIC:\nexport function performTransfer(\n state: DragState | TouchState,\n data: NodeEventData | ParentEventData\n) {\n const draggedValues = dragValues(state);\n\n const lastParentValues = parentValues(\n state.lastParent.el,\n state.lastParent.data\n ).filter((x: any) => !draggedValues.includes(x));\n\n const targetParentValues = parentValues(\n data.targetData.parent.el,\n data.targetData.parent.data\n );\n\n const reset =\n state.initialParent.el === data.targetData.parent.el &&\n data.targetData.parent.data.config.sortable === false;\n\n let targetIndex: number;\n\n if (\"node\" in data.targetData) {\n if (reset) {\n targetIndex = state.initialIndex;\n } else if (data.targetData.parent.data.config.sortable === false) {\n targetIndex = data.targetData.parent.data.enabledNodes.length;\n } else {\n targetIndex = data.targetData.node.data.index;\n }\n\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\n } else {\n targetIndex = reset\n ? state.initialIndex\n : data.targetData.parent.data.enabledNodes.length;\n\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\n }\n\n setParentValues(state.lastParent.el, state.lastParent.data, lastParentValues);\n\n setParentValues(\n data.targetData.parent.el,\n data.targetData.parent.data,\n targetParentValues\n );\n}\n\n/**\n * Used when the dragged element enters into a parent other than its own.\n *\n * @param eventData\n *\n * @param state\n *\n * @internal\n *\n * @returns void\n */\nexport function transfer(\n data: NodeEventData | ParentEventData,\n state: DragState | TouchState\n): void {\n if (!validateTransfer(data, state)) return;\n\n data.targetData.parent.data.config.performTransfer(state, data);\n\n state.lastParent = data.targetData.parent;\n}\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 e,\n targetData,\n });\n };\n}\n","import type {\n Node,\n NodeEventData,\n NodeFromPoint,\n ParentFromPoint,\n EventHandlers,\n ParentData,\n} from \"./types\";\n\nimport { parents, nodes } from \"./index\";\n\nexport function throttle(callback: any, limit: number) {\n var wait = false;\n return function (...args: any[]) {\n if (!wait) {\n callback.call(null, ...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n }, limit);\n }\n };\n}\n\nfunction splitClass(className: string): Array {\n return className.split(\" \").filter((x) => x);\n}\n\n/**\n * Check to see if code is running in a browser.\n *\n * @internal\n */\nexport const isBrowser = typeof window !== \"undefined\";\n\nexport function addClass(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n if (classNames.includes(\"longTouch\")) return;\n\n for (const node of els) {\n if (!isNode(node) || !nodes.has(node)) {\n node.classList.add(...classNames);\n\n continue;\n }\n\n const privateClasses = [];\n\n const nodeData = nodes.get(node);\n\n if (!nodeData) continue;\n\n for (const className of classNames) {\n if (!node.classList.contains(className)) {\n node.classList.add(className);\n } else if (\n node.classList.contains(className) &&\n omitAppendPrivateClass === false\n ) {\n privateClasses.push(className);\n }\n }\n\n nodeData.privateClasses = privateClasses;\n\n nodes.set(node, nodeData);\n }\n}\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);\n\n if (!nodeData) continue;\n for (const className of classNames) {\n if (!nodeData.privateClasses.includes(className)) {\n node.classList.remove(className);\n }\n }\n }\n}\n\n/**\n * Used for getting the closest scrollable parent of a given element.\n *\n * @param node - The element to get the closest scrollable parent of.\n *\n * @internal\n */\nexport function getScrollParent(childNode: HTMLElement): HTMLElement {\n let parentNode = childNode.parentNode;\n\n while (\n parentNode !== null &&\n parentNode.nodeType === 1 &&\n parentNode instanceof HTMLElement\n ) {\n const computedStyle = window.getComputedStyle(parentNode);\n\n const overflow = computedStyle.getPropertyValue(\"overflow\");\n\n if (overflow === \"scroll\" || overflow === \"auto\") return parentNode;\n\n parentNode = parentNode.parentNode;\n }\n\n return document.documentElement;\n}\n/**\n * Used for setting a single event listener on x number of events for a given\n * element.\n *\n * @param el - The element to set the event listener on.\n *\n * @param events - An array of events to set the event listener on.\n *\n * @param fn - The function to run when the event is triggered.\n *\n * @param remove - Whether or not to remove the event listener.\n *\n * @internal\n */\nexport function events(\n el: Node | HTMLElement,\n events: Array,\n fn: any,\n remove = false\n) {\n events.forEach((event) => {\n remove ? el.removeEventListener(event, fn) : el.addEventListener(event, fn);\n });\n}\n\nexport function getElFromPoint(\n eventData: NodeEventData\n): NodeFromPoint | ParentFromPoint | undefined {\n if (!(eventData.e instanceof TouchEvent)) return;\n\n const newX = eventData.e.touches[0].clientX;\n\n const newY = eventData.e.touches[0].clientY;\n\n let target = document.elementFromPoint(newX, newY);\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 are instances of\n * HTML Elements.\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,\n events: EventHandlers | any\n): AbortController {\n const abortController = new AbortController();\n for (const eventName in events) {\n const handler = events[eventName];\n el.addEventListener(eventName, handler, {\n signal: abortController.signal,\n passive: false,\n });\n }\n return abortController;\n}\n\nexport function copyNodeStyle(\n sourceNode: Node,\n targetNode: Node,\n omitKeys = false\n) {\n const computedStyle = window.getComputedStyle(sourceNode);\n\n const omittedKeys = [\n \"position\",\n \"z-index\",\n \"top\",\n \"left\",\n \"x\",\n \"pointer-events\",\n \"y\",\n \"transform-origin\",\n \"filter\",\n \"-webkit-text-fill-color\",\n ];\n\n for (const key of Array.from(computedStyle)) {\n if (omitKeys === false && key && omittedKeys.includes(key)) continue;\n\n targetNode.style.setProperty(\n key,\n computedStyle.getPropertyValue(key),\n computedStyle.getPropertyPriority(key)\n );\n }\n\n for (const child of Array.from(sourceNode.children)) {\n if (!isNode(child)) continue;\n\n const targetChild = targetNode.children[\n Array.from(sourceNode.children).indexOf(child)\n ] as Node;\n\n copyNodeStyle(child, targetChild, omitKeys);\n }\n}\n\nexport function eventCoordinates(data: DragEvent | TouchEvent) {\n return data instanceof DragEvent\n ? { x: data.clientX, y: data.clientY }\n : { x: data.touches[0].clientX, y: data.touches[0].clientY };\n}\n","import type {\n Node,\n NodeEventData,\n NodeRecord,\n DragState,\n TouchState,\n ParentData,\n NodeDragEventData,\n NodeTouchEventData,\n DNDPluginData,\n TearDownNodeData,\n SetupNodeData,\n} from \"../../types\";\nimport type {\n MultiDragConfig,\n MultiDragParentConfig,\n MultiDragState,\n} from \"./types\";\n\nimport {\n parents,\n handleLongTouch,\n initDrag,\n initTouch,\n dragstartClasses,\n handleTouchedNode,\n end,\n state,\n resetState,\n} from \"../../index\";\nimport { addClass, removeClass, copyNodeStyle } from \"../../utils\";\n\nexport const multiDragState: MultiDragState = {\n selectedNodes: Array>(),\n\n activeNode: undefined,\n\n isTouch: false,\n};\n\nexport function multiDrag(\n multiDragConfig: Partial> = {}\n) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n const multiDragParentConfig = {\n ...parentData.config,\n multiDragConfig: multiDragConfig,\n } as MultiDragParentConfig;\n\n return {\n setup() {\n multiDragParentConfig.handleDragstart =\n multiDragConfig.multiHandleDragstart || multiHandleDragstart;\n\n multiDragParentConfig.handleTouchstart =\n multiDragConfig.multiHandleTouchstart || multiHandleTouchstart;\n\n multiDragParentConfig.handleEnd =\n multiDragConfig.multiHandleEnd || multiHandleEnd;\n\n multiDragParentConfig.reapplyDragClasses =\n multiDragConfig.multiReapplyDragClasses || multiReapplyDragClasses;\n\n parentData.config = multiDragParentConfig;\n\n multiDragParentConfig.multiDragConfig.plugins?.forEach((plugin) => {\n plugin(parent)?.tearDown?.();\n });\n\n multiDragParentConfig.multiDragConfig.plugins?.forEach((plugin) => {\n plugin(parent)?.setup?.();\n });\n },\n\n tearDownNodeRemap(data: TearDownNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.tearDownNodeRemap?.(data);\n });\n },\n\n tearDownNode(data: TearDownNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.tearDownNode?.(data);\n });\n },\n\n setupNodeRemap(data: SetupNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.setupNodeRemap?.(data);\n });\n },\n\n setupNode(data: SetupNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.setupNode?.(data);\n });\n },\n } satisfies DNDPluginData;\n };\n}\n\nfunction multiReapplyDragClasses(node: Node, parentData: ParentData) {\n if (!state) return;\n\n const dropZoneClass =\n \"touchedNode\" in state\n ? parentData.config.multiDragConfig.touchDropZoneClass\n : parentData.config.multiDragConfig.dropZoneClass;\n\n const draggedNodeEls = state.draggedNodes.map((x) => x.el);\n\n if (!draggedNodeEls.includes(node)) return;\n\n addClass([node], dropZoneClass, true);\n}\n\nfunction multiHandleEnd(data: NodeEventData) {\n if (!state) return;\n\n const isTouch = state && \"touchedNode\" in state;\n\n if (isTouch && \"touchMoving\" in state && !state.touchMoving) return;\n\n end(data, state);\n\n selectionsEnd(data, state);\n\n resetState();\n}\n\nfunction selectionsEnd(\n data: NodeEventData,\n state: DragState | TouchState\n) {\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const selectedClass =\n data.targetData.parent.data.config.selectionsConfig?.selectedClass;\n\n const isTouch = state && \"touchedNode\" in state;\n\n if (selectedClass) {\n removeClass(\n multiDragState.selectedNodes.map((x) => x.el),\n selectedClass\n );\n }\n\n multiDragState.selectedNodes = [];\n\n multiDragState.activeNode = undefined;\n\n const dropZoneClass = isTouch\n ? multiDragConfig.selectionDropZoneClass\n : multiDragConfig.touchSelectionDraggingClass;\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n}\n\nfunction multiHandleDragstart(data: NodeEventData) {\n if (!(data.e instanceof DragEvent)) return;\n\n dragstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nfunction dragstart(data: NodeDragEventData) {\n const dragState = initDrag(data);\n\n multiDragState.isTouch = false;\n\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const parentValues = data.targetData.parent.data.getValues(\n data.targetData.parent.el\n );\n\n let selectedValues = multiDragState.selectedNodes.length\n ? multiDragState.selectedNodes.map((x) => x.data.value)\n : multiDragConfig.selections &&\n multiDragConfig.selections(parentValues, data.targetData.parent.el);\n\n if (selectedValues === undefined) return;\n\n if (!selectedValues.includes(data.targetData.node.data.value)) {\n selectedValues = [data.targetData.node.data.value, ...selectedValues];\n\n const selectionConfig = data.targetData.parent.data.config.selectionsConfig;\n\n addClass([data.targetData.node.el], selectionConfig?.selectedClass, true);\n\n multiDragState.selectedNodes.push(data.targetData.node);\n }\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n if (Array.isArray(selectedValues) && selectedValues.length) {\n const targetRect = data.targetData.node.el.getBoundingClientRect();\n\n const [x, y] = [\n data.e.clientX - targetRect.left,\n data.e.clientY - targetRect.top,\n ];\n\n stackNodes(handleSelections(data, selectedValues, dragState, x, y));\n } else {\n const config = data.targetData.parent.data.config;\n\n dragstartClasses(\n dragState.draggedNode.el,\n config.draggingClass,\n config.dropZoneClass\n );\n }\n}\n\nfunction multiHandleTouchstart(data: NodeEventData) {\n if (!(data.e instanceof TouchEvent)) return;\n\n touchstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nfunction touchstart(data: NodeTouchEventData) {\n const touchState = initTouch(data);\n\n multiDragState.isTouch = true;\n\n multiDragState.activeNode = data.targetData.node;\n\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const parentValues = data.targetData.parent.data.getValues(\n data.targetData.parent.el\n );\n\n let selectedValues = [];\n\n if (data.targetData.parent.data.config.selectionsConfig) {\n selectedValues = multiDragState.selectedNodes.map((x) => x.data.value);\n } else {\n selectedValues =\n multiDragConfig.selections &&\n multiDragConfig.selections(parentValues, data.targetData.parent.el);\n }\n\n selectedValues = [data.targetData.node.data.value, ...selectedValues];\n\n const selectionConfig = data.targetData.parent.data.config.selectionsConfig;\n\n addClass([data.targetData.node.el], selectionConfig?.selectedClass, true);\n\n if (Array.isArray(selectedValues) && selectedValues.length) {\n stackNodes(\n handleSelections(\n data,\n selectedValues,\n touchState,\n touchState.touchStartLeft,\n touchState.touchStartTop\n )\n );\n } else {\n handleTouchedNode(data, touchState);\n }\n\n handleLongTouch(data, touchState);\n}\n\nexport function handleSelections(\n data: NodeEventData,\n selectedValues: Array,\n state: DragState | TouchState,\n x: number,\n y: number\n) {\n for (const child of data.targetData.parent.data.enabledNodes) {\n if (child.el === state.draggedNode.el) continue;\n\n if (!selectedValues.includes(child.data.value)) continue;\n\n state.draggedNodes.push(child);\n }\n\n const config = data.targetData.parent.data.config.multiDragConfig;\n\n const clonedEls = state.draggedNodes.map((x: NodeRecord) => {\n const el = x.el.cloneNode(true) as Node;\n\n copyNodeStyle(x.el, el, true);\n\n if (data.e instanceof DragEvent) addClass([el], config.draggingClass);\n\n return el;\n });\n\n setTimeout(() => {\n if (data.e instanceof DragEvent) {\n addClass(\n state.draggedNodes.map((x) => x.el),\n config.dropZoneClass\n );\n }\n });\n\n state.clonedDraggedEls = clonedEls;\n\n return { data, state, x, y };\n}\n\nexport function stackNodes({\n data,\n state,\n x,\n y,\n}: {\n data: NodeEventData;\n state: DragState | TouchState;\n x: number;\n y: number;\n}) {\n const wrapper = document.createElement(\"div\");\n\n for (const el of state.clonedDraggedEls) {\n if (el instanceof HTMLElement) el.style.pointerEvents = \"none\";\n\n wrapper.append(el);\n }\n\n const { width } = state.draggedNode.el.getBoundingClientRect();\n\n wrapper.style.cssText = `\n display: flex;\n flex-direction: column;\n width: ${width}px;\n position: fixed;\n pointer-events: none;\n z-index: 9999;\n left: -9999px\n `;\n\n document.body.append(wrapper);\n\n if (data.e instanceof DragEvent) {\n data.e.dataTransfer?.setDragImage(wrapper, x, y);\n\n setTimeout(() => {\n wrapper.remove();\n });\n } else if (\"touchedNode\" in state) {\n state.touchedNode = wrapper;\n }\n}\n","import type { SetupNodeData, Node } from \"../../types\";\nimport type { AnimationsConfig } from \"./types\";\nimport { state, parents } from \"../../index\";\n\nconst slideUp = [\n {\n transform: \"translateY(100%)\",\n },\n {\n transform: \"translateY(0)\",\n },\n];\n\nconst slideDown = [\n {\n transform: \"translateY(-100%)\",\n },\n {\n transform: \"translateY(0)\",\n },\n];\n\nconst slideLeft = [\n {\n transform: \"translateX(100%)\",\n },\n {\n transform: \"translateX(0)\",\n },\n];\n\nconst slideRight = [\n {\n transform: \"translateX(-100%)\",\n },\n {\n transform: \"translateX(0)\",\n },\n];\n\nexport function animations(animationsConfig: Partial = {}) {\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 (!state) return;\n\n const duration = animationsConfig.duration || 150;\n\n if (data.nodeData.value === state.draggedNode.data.value) {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node, slideUp, duration);\n\n break;\n case \"above\":\n animate(data.node, slideDown, duration);\n\n break;\n case \"left\":\n animate(data.node, slideRight, duration);\n\n break;\n case \"right\":\n animate(data.node, 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.nodeData.value)\n )\n return;\n\n const nodeRect = data.node.getBoundingClientRect();\n\n const nodeIndex = state.affectedNodes.findIndex(\n (x) => x.data.value === data.nodeData.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, slideRight, duration);\n } else if (xDiff > yDiff && !ascendingDirection) {\n animate(data.node, slideLeft, duration);\n }\n } else {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node, slideDown, duration);\n\n break;\n case \"above\":\n animate(data.node, slideUp, duration);\n\n break;\n case \"left\":\n animate(data.node, slideLeft, duration);\n\n break;\n case \"right\":\n animate(data.node, 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 node.animate(animation, {\n duration: duration,\n });\n\n setTimeout(() => {\n if (!state) return;\n\n // state.swappedNodeValue = undefined;\n\n // state.remapJustFinished = true;\n\n // state.lastTargetValue = undefined;\n\n // state.preventEnter = false;\n }, duration);\n}\n","import type {\n SetupNodeData,\n NodeEventData,\n TearDownNodeData,\n ParentConfig,\n} from \"../../../../types\";\n\nimport type { SelectionsConfig } from \"./types\";\n\nimport { parents, nodeEventData } from \"../../../../index\";\n\nimport { addEvents, removeClass, addClass } from \"../../../../utils\";\n\nimport { multiDragState } from \"../../index\";\n\nexport function selections(selectionsConfig: SelectionsConfig = {}) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n return {\n setup() {\n parentData.config.selectionsConfig = selectionsConfig;\n\n parentData.config.handleClick =\n selectionsConfig.handleClick || handleClick;\n\n parentData.config.handleKeydown =\n selectionsConfig.handleKeydown || handleKeydown;\n\n selectionsConfig.clickawayDeselect =\n selectionsConfig.clickawayDeselect === undefined\n ? true\n : selectionsConfig.clickawayDeselect;\n\n if (!selectionsConfig.clickawayDeselect) return;\n\n const rootAbortControllers = addEvents(parentData.config.root, {\n click: handleRootClick.bind(null, parentData.config),\n });\n\n parentData.abortControllers[\"root\"] = rootAbortControllers;\n },\n\n tearDown() {\n if (parentData.abortControllers.root) {\n parentData.abortControllers.root.abort();\n }\n },\n\n tearDownNode(data: TearDownNodeData) {\n if (data.parentData.abortControllers.selectionsNode) {\n data.parentData.abortControllers.selectionsNode.abort();\n }\n },\n\n setupNode(data: SetupNodeData) {\n const config = data.parentData.config;\n\n data.node.setAttribute(\"tabindex\", \"0\");\n\n const abortControllers = addEvents(data.node, {\n click: nodeEventData(config.handleClick),\n keydown: nodeEventData(config.handleKeydown),\n });\n\n data.nodeData.abortControllers[\"selectionsNode\"] = abortControllers;\n },\n };\n };\n}\n\nfunction handleRootClick(config: ParentConfig) {\n removeClass(\n multiDragState.selectedNodes.map((x) => x.el),\n config.selectionsConfig.selectedClass\n );\n\n multiDragState.selectedNodes = [];\n\n multiDragState.activeNode = undefined;\n}\n\nfunction handleKeydown(data: NodeEventData) {\n keydown(data);\n}\n\nfunction handleClick(data: NodeEventData) {\n click(data);\n}\n\nfunction click(data: NodeEventData) {\n data.e.stopPropagation();\n\n const selectionsConfig = data.targetData.parent.data.config.selectionsConfig;\n\n const ctParentData = data.targetData.parent.data;\n\n const selectedClass = selectionsConfig.selectedClass;\n\n const targetNode = data.targetData.node;\n\n let commandKey = false;\n\n let shiftKey = false;\n\n if (data.e instanceof MouseEvent) {\n commandKey = data.e.ctrlKey || data.e.metaKey;\n shiftKey = data.e.shiftKey;\n }\n\n if (shiftKey && multiDragState.isTouch === false) {\n if (!multiDragState.activeNode) {\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n for (let x = 0; x <= data.targetData.node.data.index; x++) {\n multiDragState.selectedNodes.push(ctParentData.enabledNodes[x]);\n if (selectedClass) {\n addClass([ctParentData.enabledNodes[x].el], selectedClass, true);\n }\n }\n } else {\n const [minIndex, maxIndex] =\n multiDragState.activeNode.data.index < data.targetData.node.data.index\n ? [\n multiDragState.activeNode.data.index,\n data.targetData.node.data.index,\n ]\n : [\n data.targetData.node.data.index,\n multiDragState.activeNode.data.index,\n ];\n\n const selectedNodes = ctParentData.enabledNodes.slice(\n minIndex,\n maxIndex + 1\n );\n\n if (selectedNodes.length === 1) {\n for (const node of multiDragState.selectedNodes) {\n if (selectedClass) node.el.classList.remove(selectedClass);\n }\n\n multiDragState.selectedNodes = [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ];\n\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n if (selectedClass) {\n data.targetData.node.el.classList.add(selectedClass);\n }\n }\n for (let x = minIndex - 1; x >= 0; x--) {\n if (\n multiDragState.selectedNodes.includes(ctParentData.enabledNodes[x])\n ) {\n multiDragState.selectedNodes = [\n ...multiDragState.selectedNodes.filter(\n (el) => el !== ctParentData.enabledNodes[x]\n ),\n ];\n\n if (selectedClass) {\n addClass([ctParentData.enabledNodes[x].el], selectedClass, true);\n }\n } else {\n break;\n }\n }\n for (let x = maxIndex; x < ctParentData.enabledNodes.length; x++) {\n if (\n multiDragState.selectedNodes.includes(ctParentData.enabledNodes[x])\n ) {\n multiDragState.selectedNodes = [\n ...multiDragState.selectedNodes.filter(\n (el) => el !== ctParentData.enabledNodes[x]\n ),\n ];\n if (selectedClass) {\n removeClass([ctParentData.enabledNodes[x].el], selectedClass);\n }\n } else {\n break;\n }\n }\n for (const node of selectedNodes) {\n if (!multiDragState.selectedNodes.map((x) => x.el).includes(node.el)) {\n multiDragState.selectedNodes.push(node);\n }\n\n if (selectedClass) {\n addClass([node.el], selectedClass, true);\n }\n }\n }\n } else if (commandKey) {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = targetNode;\n if (selectedClass) {\n addClass([targetNode.el], selectedClass, true);\n }\n multiDragState.selectedNodes.push(targetNode);\n }\n } else if (!commandKey && multiDragState.isTouch === false) {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n if (selectedClass) {\n for (const el of multiDragState.selectedNodes) {\n removeClass([el.el], selectedClass);\n }\n\n addClass([data.targetData.node.el], selectedClass, true);\n }\n multiDragState.selectedNodes = [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ];\n }\n } else {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = targetNode;\n if (selectedClass) {\n addClass([targetNode.el], selectedClass, true);\n }\n multiDragState.selectedNodes.push(targetNode);\n }\n }\n}\n\nfunction keydown(data: NodeEventData) {\n if (!(data.e instanceof KeyboardEvent)) return;\n\n const keys = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\n\n if (!keys.includes(data.e.key) || !multiDragState.activeNode) return;\n\n const selectionsConfig = data.targetData.parent.data.config.selectionsConfig;\n\n data.e.preventDefault();\n\n const parentData = data.targetData.parent.data;\n\n const nodeData = data.targetData.node.data;\n\n const enabledNodes = parentData.enabledNodes;\n\n const moveUp = data.e.key === \"ArrowUp\" || data.e.key === \"ArrowLeft\";\n\n const moveDown = data.e.key === \"ArrowDown\" || data.e.key === \"ArrowRight\";\n\n const invalidKeydown =\n (moveUp && nodeData.index === 0) ||\n (moveDown && nodeData.index === enabledNodes.length - 1);\n\n if (invalidKeydown) return;\n\n const adjacentNode = enabledNodes[nodeData.index + (moveUp ? -1 : 1)];\n\n const selectedClass = selectionsConfig.selectedClass;\n\n if (!adjacentNode) return;\n\n if (data.e.altKey) {\n if (multiDragState.selectedNodes.length > 1) {\n for (const el of multiDragState.selectedNodes) {\n if (selectedClass && multiDragState.activeNode !== el) {\n removeClass([el.el], selectedClass);\n }\n }\n\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el !== multiDragState.activeNode\n );\n }\n const parentValues = parentData.getValues(data.targetData.parent.el);\n\n [\n parentValues[nodeData.index],\n parentValues[nodeData.index + (moveUp ? -1 : 1)],\n ] = [\n parentValues[nodeData.index + (moveUp ? -1 : 1)],\n parentValues[nodeData.index],\n ];\n\n parentData.setValues(parentValues, data.targetData.parent.el);\n } else if (data.e.shiftKey && multiDragState.isTouch === false) {\n if (\n !multiDragState.selectedNodes.map((x) => x.el).includes(adjacentNode.el)\n ) {\n multiDragState.selectedNodes.push(adjacentNode);\n\n if (selectedClass) {\n addClass([adjacentNode.el], selectedClass, true);\n }\n\n multiDragState.activeNode = adjacentNode;\n } else {\n if (\n multiDragState.selectedNodes\n .map((x) => x.el)\n .includes(multiDragState.activeNode.el)\n ) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el !== multiDragState.activeNode\n );\n\n if (selectedClass) {\n removeClass([multiDragState.activeNode.el], selectedClass);\n }\n\n multiDragState.activeNode = adjacentNode;\n }\n }\n } else {\n for (const el of multiDragState.selectedNodes) {\n if (selectedClass && multiDragState.activeNode !== el) {\n removeClass([el.el], selectedClass);\n }\n }\n\n removeClass([multiDragState.activeNode.el], selectedClass);\n\n multiDragState.selectedNodes = [adjacentNode];\n\n addClass([adjacentNode.el], selectedClass, true);\n\n multiDragState.activeNode = adjacentNode;\n }\n\n data.targetData.node.el.blur();\n\n multiDragState.activeNode = adjacentNode;\n\n multiDragState.activeNode.el.focus();\n}\n"],"mappings":"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","names":["dragstart","className","events","state","parentValues","x","parentValues","dragStateProps","state","x","dragstart","touchstart"]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/plugins/multiDrag/index.ts","../src/plugins/animations/index.ts","../src/plugins/multiDrag/plugins/selections/index.ts","../src/plugins/swap/index.ts"],"sourcesContent":["import type {\n DragAndDrop,\n Node,\n DNDPlugin,\n NodeEventData,\n TouchOverNodeEvent,\n ParentsData,\n NodesData,\n DragState,\n TouchState,\n DragStateProps,\n TouchStateProps,\n NodeData,\n ParentData,\n SetupNodeData,\n TearDownNodeData,\n NodeTargetData,\n ParentConfig,\n ParentTargetData,\n ParentEventData,\n TouchOverParentEvent,\n NodeDragEventData,\n NodeTouchEventData,\n NodeRecord,\n ScrollData,\n} from \"./types\";\nimport {\n isBrowser,\n addClass,\n removeClass,\n getElFromPoint,\n isNode,\n getScrollParent,\n addEvents,\n copyNodeStyle,\n eventCoordinates,\n throttle,\n} from \"./utils\";\nexport { isBrowser };\nexport * from \"./types\";\nexport { multiDrag } from \"./plugins/multiDrag\";\nexport { animations } from \"./plugins/animations\";\nexport { selections } from \"./plugins/multiDrag/plugins/selections\";\nexport { swap } from \"./plugins/swap\";\nexport * from \"./utils\";\n\nconst scrollConfig: {\n [key: string]: [number, number];\n} = {\n up: [0, -1],\n down: [0, 1],\n left: [-1, 0],\n right: [1, 0],\n};\n\nexport const nodes: NodesData = new WeakMap>();\n\nexport const parents: ParentsData = new WeakMap<\n HTMLElement,\n ParentData\n>();\n\n/**\n * The state of the drag and drop. Is undefined until either dragstart or\n * touchstart is called.\n */\nexport let state: DragState | TouchState | undefined = undefined;\n\nexport function resetState() {\n state = undefined;\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: DragStateProps\n): DragState {\n state = {\n ascendingDirection: false,\n incomingDirection: undefined,\n enterCount: 0,\n targetIndex: 0,\n affectedNodes: [],\n lastValue: undefined,\n activeNode: undefined,\n lastTargetValue: undefined,\n remapJustFinished: false,\n preventEnter: false,\n clonedDraggedEls: [],\n originalZIndex: undefined,\n ...dragStateProps,\n } as DragState;\n\n return state;\n}\n\nexport function setTouchState(\n dragState: DragState,\n touchStateProps: TouchStateProps\n): TouchState {\n state = {\n ...dragState,\n ...touchStateProps,\n };\n\n return state as TouchState;\n}\n\nexport function dragStateProps(\n data: NodeDragEventData | NodeTouchEventData\n): DragStateProps {\n const { x, y } = eventCoordinates(data.e);\n\n return {\n coordinates: {\n x,\n y,\n },\n draggedNode: {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n draggedNodes: [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ],\n initialIndex: data.targetData.node.data.index,\n initialParent: {\n el: data.targetData.parent.el,\n data: data.targetData.parent.data,\n },\n lastParent: {\n el: data.targetData.parent.el,\n data: data.targetData.parent.data,\n },\n scrollParent: getScrollParent(data.targetData.node.el),\n };\n}\n\nexport function performSort(\n state: DragState | TouchState,\n data: NodeDragEventData | NodeTouchEventData\n) {\n const draggedValues = dragValues(state);\n\n const targetParentValues = parentValues(\n data.targetData.parent.el,\n data.targetData.parent.data\n );\n\n const newParentValues = [\n ...targetParentValues.filter((x) => !draggedValues.includes(x)),\n ];\n\n newParentValues.splice(data.targetData.node.data.index, 0, ...draggedValues);\n\n state.lastTargetValue = data.targetData.node.data.value;\n\n setParentValues(data.targetData.parent.el, data.targetData.parent.data, [\n ...newParentValues,\n ]);\n}\n\nexport function parentValues(\n parent: HTMLElement,\n parentData: ParentData\n): Array {\n return [...parentData.getValues(parent)];\n}\n\nexport function setParentValues(\n parent: HTMLElement,\n parentData: ParentData,\n values: Array\n): void {\n parentData.setValues(values, parent);\n}\n\nexport function dragValues(state: DragState | TouchState): Array {\n return [...state.draggedNodes.map((x) => x.data.value)];\n}\n\n/**\n * Utility function to update parent config.\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 * Initializes the drag and drop functionality for a given parent.\n *\n * @param {DragAndDrop} dragAndDrop - The drag and drop configuration.\n * @param {HTMLElement} dragAndDrop.parent - The parent element.\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 document.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n\n // Temp fix sincie I am throttling dragover node\n if (nodes.has(e.target as Node) || parents.has(e.target as HTMLElement))\n return;\n\n if (state) {\n state.remapJustFinished = false;\n\n state.lastTargetValue = undefined;\n\n const { x, y } = eventCoordinates(e);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n }\n });\n\n tearDown(parent);\n\n const parentData: ParentData = {\n getValues,\n setValues,\n config: {\n handleDragstart,\n handleDragoverNode,\n handleDragoverParent,\n handleEnd,\n handleTouchstart,\n handleTouchmove,\n handleTouchOverNode,\n handleTouchOverParent,\n handleDragenterNode,\n handleDragleaveNode,\n performSort,\n performTransfer,\n root: document,\n setupNode,\n setupNodeRemap,\n reapplyDragClasses,\n tearDownNode,\n tearDownNodeRemap,\n remapFinished,\n scrollBehavior: {\n x: 0.8,\n y: 0.8,\n },\n threshold: {\n horizontal: 0,\n vertical: 0,\n },\n ...config,\n },\n enabledNodes: [],\n abortControllers: {},\n };\n\n const nodesObserver = new MutationObserver(nodesMutated);\n\n nodesObserver.observe(parent, { childList: true });\n\n parents.set(parent, parentData as any);\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 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\nfunction setup(parent: HTMLElement, parentData: ParentData): void {\n parentData.abortControllers.mainParent = addEvents(parent, {\n dragover: parentEventData(\n throttle(parentData.config.handleDragoverParent, 10)\n ),\n touchOverParent: parentData.config.handleTouchOverParent,\n });\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 const parentEl = mutationList[0].target;\n\n if (!(parentEl instanceof HTMLElement)) 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 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)) continue;\n\n const nodeData = nodes.get(node);\n\n // Only tear down the node if someone has explicitly called dragAndDrop.\n if (force || !nodeData) {\n config.tearDownNode({ node, parent, nodeData, parentData });\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 enabled nodes does not match the number of values.\"\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 const nodeData = Object.assign(\n prevNodeData ?? {\n privateClasses: [],\n abortControllers: {},\n },\n {\n value: values[x],\n index: x,\n }\n );\n\n // TODO: maybe get rid of this — duplicate of the next if statement\n if (state && nodeData.value === state.draggedNode.data.value) {\n state.draggedNode.data = nodeData;\n\n state.draggedNode.el = node;\n }\n\n if (\n state &&\n state.draggedNodes.map((x) => x.data.value).includes(nodeData.value)\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 const setupNodeData = {\n node,\n parent,\n parentData,\n nodeData,\n };\n\n if (force || !prevNodeData) config.setupNode(setupNodeData);\n\n setupNodeRemap(setupNodeData);\n }\n\n parents.set(parent, { ...parentData, enabledNodes: enabledNodeRecords });\n\n config.remapFinished(parentData);\n}\n\nexport function remapFinished() {\n if (state) {\n state.preventEnter = false;\n\n state.remapJustFinished = true;\n\n state.affectedNodes = [];\n }\n}\n\nexport function handleDragstart(data: NodeEventData) {\n if (!(data.e instanceof DragEvent)) return;\n\n dragstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nexport function dragstartClasses(\n el: HTMLElement | Node | Element,\n draggingClass: string | undefined,\n dropZoneClass: string | undefined\n) {\n addClass([el], draggingClass);\n\n setTimeout(() => {\n removeClass([el], draggingClass);\n\n addClass([el], dropZoneClass);\n });\n}\n\nexport function initDrag(eventData: NodeDragEventData): DragState {\n const dragState = setDragState(dragStateProps(eventData));\n\n eventData.e.stopPropagation();\n\n if (eventData.e.dataTransfer) {\n eventData.e.dataTransfer.dropEffect = \"move\";\n\n eventData.e.dataTransfer.effectAllowed = \"move\";\n\n eventData.e.dataTransfer.setDragImage(\n eventData.targetData.node.el,\n eventData.e.offsetX,\n eventData.e.offsetY\n );\n }\n\n return dragState;\n}\n\nfunction validateDragHandle(data: NodeEventData): boolean {\n if (!(data.e instanceof DragEvent) && !(data.e instanceof TouchEvent))\n return false;\n\n const config = data.targetData.parent.data.config;\n\n if (!config.dragHandle) return true;\n\n const dragHandles = data.targetData.node.el.querySelectorAll(\n config.dragHandle\n );\n\n if (!dragHandles) return false;\n\n const coordinates = eventCoordinates(data.e);\n\n const elFromPoint = config.root.elementFromPoint(\n coordinates.x,\n coordinates.y\n );\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\n return false;\n}\n\nfunction touchstart(data: NodeTouchEventData) {\n if (!validateDragHandle(data)) return;\n\n const touchState = initTouch(data);\n\n handleTouchedNode(data, touchState);\n\n handleLongTouch(data, touchState);\n}\n\nexport function dragstart(data: NodeDragEventData) {\n if (!validateDragHandle(data)) {\n data.e.preventDefault();\n\n return;\n }\n\n const config = data.targetData.parent.data.config;\n\n const dragState = initDrag(data);\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n dragstartClasses(\n dragState.draggedNode.el,\n config.draggingClass,\n config.dropZoneClass\n );\n}\n\nexport function handleTouchOverNode(e: TouchOverNodeEvent) {\n if (!state) return;\n\n if (e.detail.targetData.parent.el === state.lastParent.el)\n sort(e.detail, state);\n else transfer(e.detail, state);\n}\n\nexport function setupNode(data: SetupNodeData) {\n const config = data.parentData.config;\n\n data.node.draggable = true;\n\n data.nodeData.abortControllers.mainNode = addEvents(data.node, {\n dragstart: nodeEventData(config.handleDragstart),\n dragover: nodeEventData(config.handleDragoverNode),\n dragenter: nodeEventData(config.handleDragenterNode),\n dragleave: nodeEventData(config.handleDragleaveNode),\n dragend: nodeEventData(config.handleEnd),\n touchstart: nodeEventData(config.handleTouchstart),\n touchmove: nodeEventData(config.handleTouchmove),\n touchend: nodeEventData(config.handleEnd),\n touchOverNode: config.handleTouchOverNode,\n });\n\n config.reapplyDragClasses(data.node, data.parentData);\n\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.setupNode?.(data);\n });\n}\n\nexport function setupNodeRemap(data: SetupNodeData) {\n nodes.set(data.node, data.nodeData);\n\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.setupNodeRemap?.(data);\n });\n}\n\nfunction reapplyDragClasses(node: Node, parentData: ParentData) {\n if (!state) return;\n\n const dropZoneClass =\n \"touchedNode\" in state\n ? parentData.config.touchDropZoneClass\n : parentData.config.dropZoneClass;\n\n if (state.draggedNode.el !== node) return;\n\n addClass([node], dropZoneClass, true);\n}\n\nexport function tearDownNodeRemap(data: TearDownNodeData) {\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.tearDownNodeRemap?.(data);\n });\n}\n\nexport function tearDownNode(data: TearDownNodeData) {\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.tearDownNode?.(data);\n });\n\n data.node.draggable = false;\n\n if (data.nodeData?.abortControllers?.mainNode) {\n data.nodeData?.abortControllers?.mainNode.abort();\n }\n}\n\nexport function handleEnd(eventData: NodeEventData) {\n if (!state) return;\n\n end(eventData, state);\n\n resetState();\n}\n\nexport function end(\n _eventData: NodeEventData,\n state: DragState | TouchState\n) {\n document.removeEventListener(\"contextmenu\", preventDefault);\n\n if (\"longTouchTimeout\" in state && state.longTouchTimeout)\n clearTimeout(state.longTouchTimeout);\n\n const config = parents.get(state.initialParent.el)?.config;\n\n const isTouch = \"touchedNode\" in state;\n\n const dropZoneClass = isTouch\n ? config?.touchDropZoneClass\n : config?.dropZoneClass;\n\n if (state.originalZIndex !== undefined)\n state.draggedNode.el.style.zIndex = state.originalZIndex;\n\n addClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass,\n true\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n\n if (config?.longTouchClass) {\n removeClass(\n state.draggedNodes.map((x) => x.el),\n state.initialParent.data?.config?.longTouchClass\n );\n }\n\n if (\"touchedNode\" in state) state.touchedNode?.remove();\n}\n\nexport function handleTouchstart(eventData: NodeEventData) {\n if (!(eventData.e instanceof TouchEvent)) return;\n\n touchstart({\n e: eventData.e,\n targetData: eventData.targetData,\n });\n}\n\nexport function initTouch(data: NodeTouchEventData): TouchState {\n data.e.stopPropagation();\n\n const clonedNode = data.targetData.node.el.cloneNode(true) as HTMLElement;\n\n const rect = data.targetData.node.el.getBoundingClientRect();\n\n const touchState = setTouchState(setDragState(dragStateProps(data)), {\n coordinates: {\n x: data.e.touches[0].clientX,\n y: data.e.touches[0].clientY,\n },\n scrollParent: getScrollParent(data.targetData.node.el),\n touchStartLeft: data.e.touches[0].clientX - rect.left,\n touchStartTop: data.e.touches[0].clientY - rect.top,\n touchedNode: clonedNode,\n touchMoving: false,\n });\n\n return touchState;\n}\n\nfunction preventDefault(e: Event) {\n e.preventDefault();\n}\n\nexport function handleTouchedNode(\n data: NodeTouchEventData,\n touchState: TouchState\n) {\n touchState.touchedNodeDisplay = touchState.touchedNode.style.display;\n\n const rect = data.targetData.node.el.getBoundingClientRect();\n\n touchState.touchedNode.style.cssText = `\n width: ${rect.width}px;\n position: fixed;\n pointer-events: none;\n top: -9999px;\n z-index: 999999;\n display: none;\n `;\n\n document.body.append(touchState.touchedNode);\n\n copyNodeStyle(data.targetData.node.el, touchState.touchedNode as Node);\n\n touchState.touchedNode.style.display = \"none\";\n\n document.addEventListener(\"contextmenu\", preventDefault);\n}\n\nexport function handleLongTouch(\n data: NodeEventData,\n touchState: TouchState\n) {\n const config = data.targetData.parent.data.config;\n\n if (!config.longTouch) return;\n\n touchState.longTouchTimeout = setTimeout(() => {\n if (!touchState) return;\n\n touchState.longTouch = true;\n\n if (config.longTouchClass && data.e.cancelable)\n addClass(\n touchState.draggedNodes.map((x) => x.el),\n config.longTouchClass\n );\n\n data.e.preventDefault();\n }, config.longTouchTimeout || 200);\n}\n\nexport function handleTouchmove(eventData: NodeTouchEventData) {\n if (!state || !(\"touchedNode\" in state)) return;\n\n touchmove(eventData, state);\n}\n\nfunction touchmoveClasses(\n touchState: TouchState,\n config: ParentConfig\n) {\n if (config.longTouchClass)\n removeClass(\n touchState.draggedNodes.map((x) => x.el),\n config?.longTouchClass\n );\n\n if (config.touchDraggingClass)\n addClass([touchState.touchedNode], config.touchDraggingClass);\n\n if (config.touchDropZoneClass)\n addClass(\n touchState.draggedNodes.map((x) => x.el),\n config.touchDropZoneClass\n );\n}\n\nfunction getScrollData(\n state?: DragState | TouchState\n): ScrollData | void {\n if (!state || !state.scrollParent) return;\n\n const { x, y, width, height } = state.scrollParent.getBoundingClientRect();\n\n const {\n x: xThresh,\n y: yThresh,\n scrollOutside,\n } = state.lastParent.data.config.scrollBehavior;\n\n return {\n state,\n xThresh,\n yThresh,\n scrollOutside,\n scrollParent: state.scrollParent,\n x,\n y,\n width,\n height,\n };\n}\n\nfunction shouldScroll(\n direction: string\n): DragState | TouchState | void {\n const data = getScrollData(state);\n\n if (!data) return;\n\n switch (direction) {\n case \"down\":\n return shouldScrollDown(data.state, data);\n\n case \"up\":\n return shouldScrollUp(data.state, data);\n\n case \"right\":\n return shouldScrollRight(data.state, data);\n\n case \"left\":\n return shouldScrollLeft(data.state, data);\n }\n}\n\nfunction shouldScrollRight(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientWidth + data.x - state.coordinates.x;\n\n if (!data.scrollOutside && diff < 0) return;\n\n if (\n diff < (1 - data.xThresh) * data.scrollParent.clientWidth &&\n !(\n data.scrollParent.scrollLeft + data.scrollParent.clientWidth >=\n data.scrollParent.scrollWidth\n )\n )\n return state;\n}\n\nfunction shouldScrollLeft(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientWidth + data.x - state.coordinates.x;\n\n if (!data.scrollOutside && diff > data.scrollParent.clientWidth) return;\n\n if (\n diff > data.xThresh * data.scrollParent.clientWidth &&\n data.scrollParent.scrollLeft !== 0\n )\n return state;\n}\n\nfunction shouldScrollUp(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientHeight + data.y - state.coordinates.y;\n\n if (!data.scrollOutside && diff > data.scrollParent.clientHeight) return;\n\n if (\n diff > data.yThresh * data.scrollParent.clientHeight &&\n data.scrollParent.scrollTop !== 0\n )\n return state;\n}\n\nfunction shouldScrollDown(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientHeight + data.y - state.coordinates.y;\n\n if (!data.scrollOutside && diff < 0) return;\n\n if (\n diff < (1 - data.yThresh) * data.scrollParent.clientHeight &&\n !(\n data.scrollParent.scrollTop + data.scrollParent.clientHeight >=\n data.scrollParent.scrollHeight\n )\n )\n return state;\n}\n\nfunction moveTouchedNode(\n data: NodeTouchEventData,\n touchState: TouchState\n) {\n touchState.touchMoving = true;\n\n touchState.touchedNode.style.display = touchState.touchedNodeDisplay || \"\";\n\n const { x, y } = eventCoordinates(data.e);\n\n touchState.coordinates.y = y;\n\n touchState.coordinates.x = x;\n\n const touchStartLeft = touchState.touchStartLeft ?? 0;\n\n const touchStartTop = touchState.touchStartTop ?? 0;\n\n touchState.touchedNode.style.left = `${x - touchStartLeft}px`;\n\n touchState.touchedNode.style.top = `${y - touchStartTop}px`;\n\n touchmoveClasses(touchState, data.targetData.parent.data.config);\n}\n\nfunction touchmove(data: NodeTouchEventData, touchState: TouchState) {\n const config = data.targetData.parent.data.config;\n\n if (config.longTouch && !touchState.longTouch) {\n clearTimeout(touchState.longTouchTimeout);\n\n return;\n }\n\n if (data.e.cancelable) data.e.preventDefault();\n\n moveTouchedNode(data, touchState);\n\n handleScroll();\n\n const elFromPoint = getElFromPoint(data);\n\n if (!elFromPoint) return;\n\n const touchMoveEventData = {\n e: data.e,\n targetData: elFromPoint,\n };\n\n if (\"node\" in elFromPoint) {\n elFromPoint.node.el.dispatchEvent(\n new CustomEvent(\"touchOverNode\", {\n detail: touchMoveEventData,\n })\n );\n } else {\n elFromPoint.parent.el.dispatchEvent(\n new CustomEvent(\"touchOverParent\", {\n detail: touchMoveEventData,\n })\n );\n }\n}\n\nfunction handleScroll() {\n for (const direction of Object.keys(scrollConfig)) {\n const [x, y] = scrollConfig[direction];\n\n performScroll(direction, x, y);\n }\n}\n\nfunction performScroll(direction: string, x: number, y: number) {\n const state = shouldScroll(direction);\n\n if (!state) return;\n\n state.scrollParent.scrollBy(x, y);\n\n setTimeout(\n () => {\n performScroll(direction, x, y);\n },\n \"touchedNode\" in state ? 10 : 100\n );\n}\n\nexport function handleDragoverNode(data: NodeDragEventData) {\n if (!state) return;\n\n const { x, y } = eventCoordinates(data.e);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n\n dragoverNode(data, state);\n}\n\nexport function handleDragoverParent(data: ParentEventData) {\n if (!state) return;\n\n const { x, y } = eventCoordinates(data.e as DragEvent);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n\n transfer(data, state);\n}\n\nexport function handleTouchOverParent(e: TouchOverParentEvent) {\n if (!state) return;\n\n transfer(e.detail, state);\n}\n\nexport function validateTransfer(\n data: ParentEventData,\n state: DragState | TouchState\n) {\n if (data.targetData.parent.el === state.lastParent.el) return false;\n\n const targetConfig = data.targetData.parent.data.config;\n\n if (targetConfig.dropZone === false) return false;\n\n const initialParentConfig = state.initialParent.data.config;\n\n if (targetConfig.accepts) {\n return targetConfig.accepts(\n data.targetData.parent,\n state.initialParent,\n state.lastParent,\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\nfunction handleDragenterNode(\n data: NodeDragEventData,\n _state: DragState\n) {\n data.e.preventDefault();\n}\n\nfunction handleDragleaveNode(\n data: NodeDragEventData,\n _state: DragState\n) {\n data.e.preventDefault();\n}\n\nfunction dragoverNode(\n eventData: NodeDragEventData,\n dragState: DragState\n) {\n eventData.e.preventDefault();\n\n eventData.e.stopPropagation();\n\n eventData.targetData.parent.el === dragState.lastParent?.el\n ? sort(eventData, dragState)\n : transfer(eventData, dragState);\n}\n\nexport function validateSort(\n data: NodeDragEventData | NodeTouchEventData,\n state: DragState | TouchState,\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.lastTargetValue ||\n state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)\n ) {\n state.lastTargetValue = data.targetData.node.data.value;\n }\n\n return false;\n }\n\n if (state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)) {\n state.lastTargetValue = undefined;\n return false;\n }\n\n if (data.targetData.node.data.value === state.lastTargetValue) return false;\n\n if (\n state.preventEnter ||\n data.targetData.parent.el !== state.lastParent?.el ||\n data.targetData.parent.data.config.sortable === false\n )\n 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.lastParent.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\nexport function sort(\n data: NodeDragEventData | NodeTouchEventData,\n state: DragState | TouchState\n) {\n const { x, y } = eventCoordinates(data.e);\n\n if (!validateSort(data, state, x, y)) return;\n\n state.preventEnter = true;\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(state, data);\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 const parent = node.parentNode || state?.lastParent?.el;\n\n if (!nodeData) return;\n\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n return {\n node: {\n el: node,\n data: nodeData,\n },\n parent: {\n el: parent,\n data: parentData as 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 e,\n targetData,\n });\n };\n}\n\n// TRANSFER LOGIC:\nexport function performTransfer(\n state: DragState | TouchState,\n data: NodeEventData | ParentEventData\n) {\n const draggedValues = dragValues(state);\n\n const lastParentValues = parentValues(\n state.lastParent.el,\n state.lastParent.data\n ).filter((x: any) => !draggedValues.includes(x));\n\n const targetParentValues = parentValues(\n data.targetData.parent.el,\n data.targetData.parent.data\n );\n\n const reset =\n state.initialParent.el === data.targetData.parent.el &&\n data.targetData.parent.data.config.sortable === false;\n\n let targetIndex: number;\n\n if (\"node\" in data.targetData) {\n if (reset) {\n targetIndex = state.initialIndex;\n } else if (data.targetData.parent.data.config.sortable === false) {\n targetIndex = data.targetData.parent.data.enabledNodes.length;\n } else {\n targetIndex = data.targetData.node.data.index;\n }\n\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\n } else {\n targetIndex = reset\n ? state.initialIndex\n : data.targetData.parent.data.enabledNodes.length;\n\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\n }\n\n setParentValues(state.lastParent.el, state.lastParent.data, lastParentValues);\n\n setParentValues(\n data.targetData.parent.el,\n data.targetData.parent.data,\n targetParentValues\n );\n}\n\n/**\n * Used when the dragged element enters into a parent other than its own.\n *\n * @param eventData\n *\n * @param state\n *\n * @internal\n *\n * @returns void\n */\nexport function transfer(\n data: NodeEventData | ParentEventData,\n state: DragState | TouchState\n): void {\n if (!validateTransfer(data, state)) return;\n\n data.targetData.parent.data.config.performTransfer(state, data);\n\n state.lastParent = data.targetData.parent;\n}\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 e,\n targetData,\n });\n };\n}\n","import type {\n Node,\n NodeEventData,\n NodeFromPoint,\n ParentFromPoint,\n EventHandlers,\n ParentData,\n} from \"./types\";\n\nimport { parents, nodes } from \"./index\";\n\nexport function throttle(callback: any, limit: number) {\n var wait = false;\n return function (...args: any[]) {\n if (!wait) {\n callback.call(null, ...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n }, limit);\n }\n };\n}\n\nfunction splitClass(className: string): Array {\n return className.split(\" \").filter((x) => x);\n}\n\n/**\n * Check to see if code is running in a browser.\n *\n * @internal\n */\nexport const isBrowser = typeof window !== \"undefined\";\n\nexport function addClass(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n if (classNames.includes(\"longTouch\")) return;\n\n for (const node of els) {\n if (!isNode(node) || !nodes.has(node)) {\n node.classList.add(...classNames);\n\n continue;\n }\n\n const privateClasses = [];\n\n const nodeData = nodes.get(node);\n\n if (!nodeData) continue;\n\n for (const className of classNames) {\n if (!node.classList.contains(className)) {\n node.classList.add(className);\n } else if (\n node.classList.contains(className) &&\n omitAppendPrivateClass === false\n ) {\n privateClasses.push(className);\n }\n }\n\n nodeData.privateClasses = privateClasses;\n\n nodes.set(node, nodeData);\n }\n}\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);\n\n if (!nodeData) continue;\n for (const className of classNames) {\n if (!nodeData.privateClasses.includes(className)) {\n node.classList.remove(className);\n }\n }\n }\n}\n\n/**\n * Used for getting the closest scrollable parent of a given element.\n *\n * @param node - The element to get the closest scrollable parent of.\n *\n * @internal\n */\nexport function getScrollParent(childNode: HTMLElement): HTMLElement {\n let parentNode = childNode.parentNode;\n\n while (\n parentNode !== null &&\n parentNode.nodeType === 1 &&\n parentNode instanceof HTMLElement\n ) {\n const computedStyle = window.getComputedStyle(parentNode);\n\n const overflow = computedStyle.getPropertyValue(\"overflow\");\n\n if (overflow === \"scroll\" || overflow === \"auto\") return parentNode;\n\n parentNode = parentNode.parentNode;\n }\n\n return document.documentElement;\n}\n/**\n * Used for setting a single event listener on x number of events for a given\n * element.\n *\n * @param el - The element to set the event listener on.\n *\n * @param events - An array of events to set the event listener on.\n *\n * @param fn - The function to run when the event is triggered.\n *\n * @param remove - Whether or not to remove the event listener.\n *\n * @internal\n */\nexport function events(\n el: Node | HTMLElement,\n events: Array,\n fn: any,\n remove = false\n) {\n events.forEach((event) => {\n remove ? el.removeEventListener(event, fn) : el.addEventListener(event, fn);\n });\n}\n\nexport function getElFromPoint(\n eventData: NodeEventData\n): NodeFromPoint | ParentFromPoint | undefined {\n if (!(eventData.e instanceof TouchEvent)) return;\n\n const newX = eventData.e.touches[0].clientX;\n\n const newY = eventData.e.touches[0].clientY;\n\n let target = document.elementFromPoint(newX, newY);\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 are instances of\n * HTML Elements.\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,\n events: EventHandlers | any\n): AbortController {\n const abortController = new AbortController();\n for (const eventName in events) {\n const handler = events[eventName];\n el.addEventListener(eventName, handler, {\n signal: abortController.signal,\n passive: false,\n });\n }\n return abortController;\n}\n\nexport function copyNodeStyle(\n sourceNode: Node,\n targetNode: Node,\n omitKeys = false\n) {\n const computedStyle = window.getComputedStyle(sourceNode);\n\n const omittedKeys = [\n \"position\",\n \"z-index\",\n \"top\",\n \"left\",\n \"x\",\n \"pointer-events\",\n \"y\",\n \"transform-origin\",\n \"filter\",\n \"-webkit-text-fill-color\",\n ];\n\n for (const key of Array.from(computedStyle)) {\n if (omitKeys === false && key && omittedKeys.includes(key)) continue;\n\n targetNode.style.setProperty(\n key,\n computedStyle.getPropertyValue(key),\n computedStyle.getPropertyPriority(key)\n );\n }\n\n for (const child of Array.from(sourceNode.children)) {\n if (!isNode(child)) continue;\n\n const targetChild = targetNode.children[\n Array.from(sourceNode.children).indexOf(child)\n ] as Node;\n\n copyNodeStyle(child, targetChild, omitKeys);\n }\n}\n\nexport function eventCoordinates(data: DragEvent | TouchEvent) {\n return data instanceof DragEvent\n ? { x: data.clientX, y: data.clientY }\n : { x: data.touches[0].clientX, y: data.touches[0].clientY };\n}\n","import type {\n Node,\n NodeEventData,\n NodeRecord,\n DragState,\n TouchState,\n ParentData,\n NodeDragEventData,\n NodeTouchEventData,\n DNDPluginData,\n TearDownNodeData,\n SetupNodeData,\n} from \"../../types\";\nimport type {\n MultiDragConfig,\n MultiDragParentConfig,\n MultiDragState,\n} from \"./types\";\n\nimport {\n parents,\n handleLongTouch,\n initDrag,\n initTouch,\n dragstartClasses,\n handleTouchedNode,\n end,\n state,\n resetState,\n} from \"../../index\";\nimport { addClass, removeClass, copyNodeStyle } from \"../../utils\";\n\nexport const multiDragState: MultiDragState = {\n selectedNodes: Array>(),\n\n activeNode: undefined,\n\n isTouch: false,\n};\n\nexport function multiDrag(\n multiDragConfig: Partial> = {}\n) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n const multiDragParentConfig = {\n ...parentData.config,\n multiDragConfig: multiDragConfig,\n } as MultiDragParentConfig;\n\n return {\n setup() {\n multiDragParentConfig.handleDragstart =\n multiDragConfig.multiHandleDragstart || multiHandleDragstart;\n\n multiDragParentConfig.handleTouchstart =\n multiDragConfig.multiHandleTouchstart || multiHandleTouchstart;\n\n multiDragParentConfig.handleEnd =\n multiDragConfig.multiHandleEnd || multiHandleEnd;\n\n multiDragParentConfig.reapplyDragClasses =\n multiDragConfig.multiReapplyDragClasses || multiReapplyDragClasses;\n\n parentData.config = multiDragParentConfig;\n\n multiDragParentConfig.multiDragConfig.plugins?.forEach((plugin) => {\n plugin(parent)?.tearDown?.();\n });\n\n multiDragParentConfig.multiDragConfig.plugins?.forEach((plugin) => {\n plugin(parent)?.setup?.();\n });\n },\n\n tearDownNodeRemap(data: TearDownNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.tearDownNodeRemap?.(data);\n });\n },\n\n tearDownNode(data: TearDownNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.tearDownNode?.(data);\n });\n },\n\n setupNodeRemap(data: SetupNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.setupNodeRemap?.(data);\n });\n },\n\n setupNode(data: SetupNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.setupNode?.(data);\n });\n },\n } satisfies DNDPluginData;\n };\n}\n\nfunction multiReapplyDragClasses(node: Node, parentData: ParentData) {\n if (!state) return;\n\n const dropZoneClass =\n \"touchedNode\" in state\n ? parentData.config.multiDragConfig.touchDropZoneClass\n : parentData.config.multiDragConfig.dropZoneClass;\n\n const draggedNodeEls = state.draggedNodes.map((x) => x.el);\n\n if (!draggedNodeEls.includes(node)) return;\n\n addClass([node], dropZoneClass, true);\n}\n\nfunction multiHandleEnd(data: NodeEventData) {\n if (!state) return;\n\n const isTouch = state && \"touchedNode\" in state;\n\n if (isTouch && \"touchMoving\" in state && !state.touchMoving) return;\n\n end(data, state);\n\n selectionsEnd(data, state);\n\n resetState();\n}\n\nfunction selectionsEnd(\n data: NodeEventData,\n state: DragState | TouchState\n) {\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const selectedClass =\n data.targetData.parent.data.config.selectionsConfig?.selectedClass;\n\n const isTouch = state && \"touchedNode\" in state;\n\n if (selectedClass) {\n removeClass(\n multiDragState.selectedNodes.map((x) => x.el),\n selectedClass\n );\n }\n\n multiDragState.selectedNodes = [];\n\n multiDragState.activeNode = undefined;\n\n const dropZoneClass = isTouch\n ? multiDragConfig.selectionDropZoneClass\n : multiDragConfig.touchSelectionDraggingClass;\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n}\n\nfunction multiHandleDragstart(data: NodeEventData) {\n if (!(data.e instanceof DragEvent)) return;\n\n dragstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nfunction dragstart(data: NodeDragEventData) {\n const dragState = initDrag(data);\n\n multiDragState.isTouch = false;\n\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const parentValues = data.targetData.parent.data.getValues(\n data.targetData.parent.el\n );\n\n let selectedValues = multiDragState.selectedNodes.length\n ? multiDragState.selectedNodes.map((x) => x.data.value)\n : multiDragConfig.selections &&\n multiDragConfig.selections(parentValues, data.targetData.parent.el);\n\n if (selectedValues === undefined) return;\n\n if (!selectedValues.includes(data.targetData.node.data.value)) {\n selectedValues = [data.targetData.node.data.value, ...selectedValues];\n\n const selectionConfig = data.targetData.parent.data.config.selectionsConfig;\n\n addClass([data.targetData.node.el], selectionConfig?.selectedClass, true);\n\n multiDragState.selectedNodes.push(data.targetData.node);\n }\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n if (Array.isArray(selectedValues) && selectedValues.length) {\n const targetRect = data.targetData.node.el.getBoundingClientRect();\n\n const [x, y] = [\n data.e.clientX - targetRect.left,\n data.e.clientY - targetRect.top,\n ];\n\n stackNodes(handleSelections(data, selectedValues, dragState, x, y));\n } else {\n const config = data.targetData.parent.data.config;\n\n dragstartClasses(\n dragState.draggedNode.el,\n config.draggingClass,\n config.dropZoneClass\n );\n }\n}\n\nfunction multiHandleTouchstart(data: NodeEventData) {\n if (!(data.e instanceof TouchEvent)) return;\n\n touchstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nfunction touchstart(data: NodeTouchEventData) {\n const touchState = initTouch(data);\n\n multiDragState.isTouch = true;\n\n multiDragState.activeNode = data.targetData.node;\n\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const parentValues = data.targetData.parent.data.getValues(\n data.targetData.parent.el\n );\n\n let selectedValues = [];\n\n if (data.targetData.parent.data.config.selectionsConfig) {\n selectedValues = multiDragState.selectedNodes.map((x) => x.data.value);\n } else {\n selectedValues =\n multiDragConfig.selections &&\n multiDragConfig.selections(parentValues, data.targetData.parent.el);\n }\n\n selectedValues = [data.targetData.node.data.value, ...selectedValues];\n\n const selectionConfig = data.targetData.parent.data.config.selectionsConfig;\n\n addClass([data.targetData.node.el], selectionConfig?.selectedClass, true);\n\n if (Array.isArray(selectedValues) && selectedValues.length) {\n stackNodes(\n handleSelections(\n data,\n selectedValues,\n touchState,\n touchState.touchStartLeft,\n touchState.touchStartTop\n )\n );\n } else {\n handleTouchedNode(data, touchState);\n }\n\n handleLongTouch(data, touchState);\n}\n\nexport function handleSelections(\n data: NodeEventData,\n selectedValues: Array,\n state: DragState | TouchState,\n x: number,\n y: number\n) {\n for (const child of data.targetData.parent.data.enabledNodes) {\n if (child.el === state.draggedNode.el) continue;\n\n if (!selectedValues.includes(child.data.value)) continue;\n\n state.draggedNodes.push(child);\n }\n\n const config = data.targetData.parent.data.config.multiDragConfig;\n\n const clonedEls = state.draggedNodes.map((x: NodeRecord) => {\n const el = x.el.cloneNode(true) as Node;\n\n copyNodeStyle(x.el, el, true);\n\n if (data.e instanceof DragEvent) addClass([el], config.draggingClass);\n\n return el;\n });\n\n setTimeout(() => {\n if (data.e instanceof DragEvent) {\n addClass(\n state.draggedNodes.map((x) => x.el),\n config.dropZoneClass\n );\n }\n });\n\n state.clonedDraggedEls = clonedEls;\n\n return { data, state, x, y };\n}\n\nexport function stackNodes({\n data,\n state,\n x,\n y,\n}: {\n data: NodeEventData;\n state: DragState | TouchState;\n x: number;\n y: number;\n}) {\n const wrapper = document.createElement(\"div\");\n\n for (const el of state.clonedDraggedEls) {\n if (el instanceof HTMLElement) el.style.pointerEvents = \"none\";\n\n wrapper.append(el);\n }\n\n const { width } = state.draggedNode.el.getBoundingClientRect();\n\n wrapper.style.cssText = `\n display: flex;\n flex-direction: column;\n width: ${width}px;\n position: fixed;\n pointer-events: none;\n z-index: 9999;\n left: -9999px\n `;\n\n document.body.append(wrapper);\n\n if (data.e instanceof DragEvent) {\n data.e.dataTransfer?.setDragImage(wrapper, x, y);\n\n setTimeout(() => {\n wrapper.remove();\n });\n } else if (\"touchedNode\" in state) {\n state.touchedNode = wrapper;\n }\n}\n","import type { SetupNodeData, Node } from \"../../types\";\nimport type { AnimationsConfig } from \"./types\";\nimport { state, parents } from \"../../index\";\n\nconst slideUp = [\n {\n transform: \"translateY(100%)\",\n },\n {\n transform: \"translateY(0)\",\n },\n];\n\nconst slideDown = [\n {\n transform: \"translateY(-100%)\",\n },\n {\n transform: \"translateY(0)\",\n },\n];\n\nconst slideLeft = [\n {\n transform: \"translateX(100%)\",\n },\n {\n transform: \"translateX(0)\",\n },\n];\n\nconst slideRight = [\n {\n transform: \"translateX(-100%)\",\n },\n {\n transform: \"translateX(0)\",\n },\n];\n\nexport function animations(animationsConfig: Partial = {}) {\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 (!state) return;\n\n const duration = animationsConfig.duration || 150;\n\n if (data.nodeData.value === state.draggedNode.data.value) {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node, slideUp, duration);\n\n break;\n case \"above\":\n animate(data.node, slideDown, duration);\n\n break;\n case \"left\":\n animate(data.node, slideRight, duration);\n\n break;\n case \"right\":\n animate(data.node, 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.nodeData.value)\n )\n return;\n\n const nodeRect = data.node.getBoundingClientRect();\n\n const nodeIndex = state.affectedNodes.findIndex(\n (x) => x.data.value === data.nodeData.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, slideRight, duration);\n } else if (xDiff > yDiff && !ascendingDirection) {\n animate(data.node, slideLeft, duration);\n }\n } else {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node, slideDown, duration);\n\n break;\n case \"above\":\n animate(data.node, slideUp, duration);\n\n break;\n case \"left\":\n animate(data.node, slideLeft, duration);\n\n break;\n case \"right\":\n animate(data.node, 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 node.animate(animation, {\n duration: duration,\n });\n}\n","import type {\n SetupNodeData,\n NodeEventData,\n TearDownNodeData,\n ParentConfig,\n} from \"../../../../types\";\n\nimport type { SelectionsConfig } from \"./types\";\n\nimport { parents, nodeEventData } from \"../../../../index\";\n\nimport { addEvents, removeClass, addClass } from \"../../../../utils\";\n\nimport { multiDragState } from \"../../index\";\n\nexport function selections(selectionsConfig: SelectionsConfig = {}) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n return {\n setup() {\n parentData.config.selectionsConfig = selectionsConfig;\n\n parentData.config.handleClick =\n selectionsConfig.handleClick || handleClick;\n\n parentData.config.handleKeydown =\n selectionsConfig.handleKeydown || handleKeydown;\n\n selectionsConfig.clickawayDeselect =\n selectionsConfig.clickawayDeselect === undefined\n ? true\n : selectionsConfig.clickawayDeselect;\n\n if (!selectionsConfig.clickawayDeselect) return;\n\n const rootAbortControllers = addEvents(parentData.config.root, {\n click: handleRootClick.bind(null, parentData.config),\n });\n\n parentData.abortControllers[\"root\"] = rootAbortControllers;\n },\n\n tearDown() {\n if (parentData.abortControllers.root) {\n parentData.abortControllers.root.abort();\n }\n },\n\n tearDownNode(data: TearDownNodeData) {\n if (data.parentData.abortControllers.selectionsNode) {\n data.parentData.abortControllers.selectionsNode.abort();\n }\n },\n\n setupNode(data: SetupNodeData) {\n const config = data.parentData.config;\n\n data.node.setAttribute(\"tabindex\", \"0\");\n\n const abortControllers = addEvents(data.node, {\n click: nodeEventData(config.handleClick),\n keydown: nodeEventData(config.handleKeydown),\n });\n\n data.nodeData.abortControllers[\"selectionsNode\"] = abortControllers;\n },\n };\n };\n}\n\nfunction handleRootClick(config: ParentConfig) {\n removeClass(\n multiDragState.selectedNodes.map((x) => x.el),\n config.selectionsConfig.selectedClass\n );\n\n multiDragState.selectedNodes = [];\n\n multiDragState.activeNode = undefined;\n}\n\nfunction handleKeydown(data: NodeEventData) {\n keydown(data);\n}\n\nfunction handleClick(data: NodeEventData) {\n click(data);\n}\n\nfunction click(data: NodeEventData) {\n data.e.stopPropagation();\n\n const selectionsConfig = data.targetData.parent.data.config.selectionsConfig;\n\n const ctParentData = data.targetData.parent.data;\n\n const selectedClass = selectionsConfig.selectedClass;\n\n const targetNode = data.targetData.node;\n\n let commandKey = false;\n\n let shiftKey = false;\n\n if (data.e instanceof MouseEvent) {\n commandKey = data.e.ctrlKey || data.e.metaKey;\n shiftKey = data.e.shiftKey;\n }\n\n if (shiftKey && multiDragState.isTouch === false) {\n if (!multiDragState.activeNode) {\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n for (let x = 0; x <= data.targetData.node.data.index; x++) {\n multiDragState.selectedNodes.push(ctParentData.enabledNodes[x]);\n if (selectedClass) {\n addClass([ctParentData.enabledNodes[x].el], selectedClass, true);\n }\n }\n } else {\n const [minIndex, maxIndex] =\n multiDragState.activeNode.data.index < data.targetData.node.data.index\n ? [\n multiDragState.activeNode.data.index,\n data.targetData.node.data.index,\n ]\n : [\n data.targetData.node.data.index,\n multiDragState.activeNode.data.index,\n ];\n\n const selectedNodes = ctParentData.enabledNodes.slice(\n minIndex,\n maxIndex + 1\n );\n\n if (selectedNodes.length === 1) {\n for (const node of multiDragState.selectedNodes) {\n if (selectedClass) node.el.classList.remove(selectedClass);\n }\n\n multiDragState.selectedNodes = [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ];\n\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n if (selectedClass) {\n data.targetData.node.el.classList.add(selectedClass);\n }\n }\n for (let x = minIndex - 1; x >= 0; x--) {\n if (\n multiDragState.selectedNodes.includes(ctParentData.enabledNodes[x])\n ) {\n multiDragState.selectedNodes = [\n ...multiDragState.selectedNodes.filter(\n (el) => el !== ctParentData.enabledNodes[x]\n ),\n ];\n\n if (selectedClass) {\n addClass([ctParentData.enabledNodes[x].el], selectedClass, true);\n }\n } else {\n break;\n }\n }\n for (let x = maxIndex; x < ctParentData.enabledNodes.length; x++) {\n if (\n multiDragState.selectedNodes.includes(ctParentData.enabledNodes[x])\n ) {\n multiDragState.selectedNodes = [\n ...multiDragState.selectedNodes.filter(\n (el) => el !== ctParentData.enabledNodes[x]\n ),\n ];\n if (selectedClass) {\n removeClass([ctParentData.enabledNodes[x].el], selectedClass);\n }\n } else {\n break;\n }\n }\n for (const node of selectedNodes) {\n if (!multiDragState.selectedNodes.map((x) => x.el).includes(node.el)) {\n multiDragState.selectedNodes.push(node);\n }\n\n if (selectedClass) {\n addClass([node.el], selectedClass, true);\n }\n }\n }\n } else if (commandKey) {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = targetNode;\n if (selectedClass) {\n addClass([targetNode.el], selectedClass, true);\n }\n multiDragState.selectedNodes.push(targetNode);\n }\n } else if (!commandKey && multiDragState.isTouch === false) {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n if (selectedClass) {\n for (const el of multiDragState.selectedNodes) {\n removeClass([el.el], selectedClass);\n }\n\n addClass([data.targetData.node.el], selectedClass, true);\n }\n multiDragState.selectedNodes = [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ];\n }\n } else {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = targetNode;\n if (selectedClass) {\n addClass([targetNode.el], selectedClass, true);\n }\n multiDragState.selectedNodes.push(targetNode);\n }\n }\n}\n\nfunction keydown(data: NodeEventData) {\n if (!(data.e instanceof KeyboardEvent)) return;\n\n const keys = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\n\n if (!keys.includes(data.e.key) || !multiDragState.activeNode) return;\n\n const selectionsConfig = data.targetData.parent.data.config.selectionsConfig;\n\n data.e.preventDefault();\n\n const parentData = data.targetData.parent.data;\n\n const nodeData = data.targetData.node.data;\n\n const enabledNodes = parentData.enabledNodes;\n\n const moveUp = data.e.key === \"ArrowUp\" || data.e.key === \"ArrowLeft\";\n\n const moveDown = data.e.key === \"ArrowDown\" || data.e.key === \"ArrowRight\";\n\n const invalidKeydown =\n (moveUp && nodeData.index === 0) ||\n (moveDown && nodeData.index === enabledNodes.length - 1);\n\n if (invalidKeydown) return;\n\n const adjacentNode = enabledNodes[nodeData.index + (moveUp ? -1 : 1)];\n\n const selectedClass = selectionsConfig.selectedClass;\n\n if (!adjacentNode) return;\n\n if (data.e.altKey) {\n if (multiDragState.selectedNodes.length > 1) {\n for (const el of multiDragState.selectedNodes) {\n if (selectedClass && multiDragState.activeNode !== el) {\n removeClass([el.el], selectedClass);\n }\n }\n\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el !== multiDragState.activeNode\n );\n }\n const parentValues = parentData.getValues(data.targetData.parent.el);\n\n [\n parentValues[nodeData.index],\n parentValues[nodeData.index + (moveUp ? -1 : 1)],\n ] = [\n parentValues[nodeData.index + (moveUp ? -1 : 1)],\n parentValues[nodeData.index],\n ];\n\n parentData.setValues(parentValues, data.targetData.parent.el);\n } else if (data.e.shiftKey && multiDragState.isTouch === false) {\n if (\n !multiDragState.selectedNodes.map((x) => x.el).includes(adjacentNode.el)\n ) {\n multiDragState.selectedNodes.push(adjacentNode);\n\n if (selectedClass) {\n addClass([adjacentNode.el], selectedClass, true);\n }\n\n multiDragState.activeNode = adjacentNode;\n } else {\n if (\n multiDragState.selectedNodes\n .map((x) => x.el)\n .includes(multiDragState.activeNode.el)\n ) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el !== multiDragState.activeNode\n );\n\n if (selectedClass) {\n removeClass([multiDragState.activeNode.el], selectedClass);\n }\n\n multiDragState.activeNode = adjacentNode;\n }\n }\n } else {\n for (const el of multiDragState.selectedNodes) {\n if (selectedClass && multiDragState.activeNode !== el) {\n removeClass([el.el], selectedClass);\n }\n }\n\n removeClass([multiDragState.activeNode.el], selectedClass);\n\n multiDragState.selectedNodes = [adjacentNode];\n\n addClass([adjacentNode.el], selectedClass, true);\n\n multiDragState.activeNode = adjacentNode;\n }\n\n data.targetData.node.el.blur();\n\n multiDragState.activeNode = adjacentNode;\n\n multiDragState.activeNode.el.focus();\n}\n","import type {\n NodeDragEventData,\n ParentConfig,\n DragState,\n NodeTouchEventData,\n NodeRecord,\n TouchOverNodeEvent,\n} from \"../../types\";\nimport {\n state,\n parents,\n handleEnd as originalHandleEnd,\n parentValues,\n setParentValues,\n} from \"../../index\";\nimport { addClass, removeClass } from \"../../utils\";\n\nexport const swapState = {\n draggedOverNodes: Array>(),\n};\n\ninterface SwapConfig extends ParentConfig {}\n\nexport function swap(swapConfig: Partial> = {}) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n const swapParentConfig = {\n ...parentData.config,\n swapConfig: swapConfig,\n } as SwapConfig;\n\n return {\n setup() {\n swapParentConfig.handleDragoverNode =\n swapConfig.handleDragoverNode || handleDragoverNode;\n\n swapParentConfig.handleTouchOverNode =\n swapConfig.handleTouchOverNode || handleTouchOverNode;\n\n swapParentConfig.handleEnd = swapConfig.handleEnd || handleEnd;\n\n swapParentConfig.handleDragoverParent = () => {};\n\n swapParentConfig.handleTouchOverParent = () => {};\n\n parentData.config = swapParentConfig;\n },\n };\n };\n}\n\nfunction handleDragoverNode(data: NodeDragEventData) {\n if (!state) return;\n\n dragoverNode(data, state);\n}\n\nfunction handleTouchOverNode(data: TouchOverNodeEvent) {\n if (!state) return;\n\n const dropZoneClass =\n data.detail.targetData.parent.data.config.touchDropZoneClass;\n\n removeClass(\n swapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass\n );\n\n const enabledNodes = data.detail.targetData.parent.data.enabledNodes;\n\n if (!enabledNodes) return;\n\n swapState.draggedOverNodes = enabledNodes.slice(\n data.detail.targetData.node.data.index,\n data.detail.targetData.node.data.index + state.draggedNodes.length\n );\n\n addClass(\n swapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass,\n true\n );\n\n state.lastTargetValue = data.detail.targetData.node.data.value;\n\n state.lastParent = data.detail.targetData.parent;\n}\n\nfunction dragoverNode(data: NodeDragEventData, state: DragState) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\n\n const dropZoneClass = data.targetData.parent.data.config.dropZoneClass;\n\n removeClass(\n swapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass\n );\n\n const enabledNodes = data.targetData.parent.data.enabledNodes;\n\n if (!enabledNodes) return;\n\n swapState.draggedOverNodes = enabledNodes.slice(\n data.targetData.node.data.index,\n data.targetData.node.data.index + state.draggedNodes.length\n );\n\n addClass(\n swapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass,\n true\n );\n\n state.lastTargetValue = data.targetData.node.data.value;\n\n state.lastParent = data.targetData.parent;\n}\n\nfunction handleEnd(data: NodeDragEventData | NodeTouchEventData) {\n if (!state) return;\n\n const draggedParentValues = parentValues(\n state.initialParent.el,\n state.initialParent.data\n );\n\n let targetParentValues = parentValues(\n state.lastParent.el,\n state.lastParent.data\n );\n\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n const draggedOverNodeValues = swapState.draggedOverNodes.map(\n (node) => node.data.value\n );\n\n const draggedIndex = state.draggedNodes[0].data.index;\n\n const draggedOverIndex = swapState.draggedOverNodes[0].data.index;\n\n targetParentValues.splice(\n draggedOverIndex,\n draggedValues.length,\n ...draggedValues\n );\n\n if (state.initialParent.el === state.lastParent.el) {\n targetParentValues.splice(\n draggedIndex,\n draggedValues.length,\n ...draggedOverNodeValues\n );\n\n setParentValues(state.initialParent.el, state.initialParent.data, [\n ...targetParentValues,\n ]);\n } else {\n draggedParentValues.splice(\n draggedIndex,\n draggedValues.length,\n ...draggedOverNodeValues\n );\n\n setParentValues(state.lastParent.el, state.lastParent.data, [\n ...targetParentValues,\n ]);\n\n setParentValues(state.initialParent.el, state.initialParent.data, [\n ...draggedParentValues,\n ]);\n }\n\n const dropZoneClass =\n \"touchedNode\" in state\n ? data.targetData.parent.data.config.touchDropZoneClass\n : data.targetData.parent.data.config.dropZoneClass;\n\n removeClass(\n swapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass\n );\n\n originalHandleEnd(data);\n}\n"],"mappings":"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","names":["dragstart","handleDragoverNode","handleTouchOverNode","className","events","state","parentValues","x","parentValues","handleEnd","state","dragStateProps","state","handleDragoverNode","handleTouchOverNode","x","dragstart","touchstart","dragoverNode"]} \ No newline at end of file diff --git a/dist/index.d.cts b/dist/index.d.cts index 3837739..770c569 100644 --- a/dist/index.d.cts +++ b/dist/index.d.cts @@ -745,6 +745,12 @@ declare function selections(selectionsConfig?: SelectionsConfig): (parent: setupNode(data: SetupNodeData): void; } | undefined; +interface SwapConfig extends ParentConfig { +} +declare function swap(swapConfig?: Partial>): (parent: HTMLElement) => { + setup(): void; +} | undefined; + declare const nodes: NodesData; declare const parents: ParentsData; /** @@ -836,4 +842,4 @@ declare function performTransfer(state: DragState | TouchState, data: N declare function transfer(data: NodeEventData | ParentEventData, state: DragState | TouchState): void; declare function parentEventData(callback: any): (e: Event) => NodeEventData | undefined; -export { type DNDPlugin, type DNDPluginData, type DragAndDrop, type DragAndDropData, type DragState, type DragStateProps, type EventHandlers, type Node, type NodeData, type NodeDragEventData, type NodeEvent, type NodeEventData, type NodeFromPoint, type NodeRecord, type NodeTargetData, type NodeTouchEventData, type NodesData, type ParentConfig, type ParentData, type ParentDragEventData, type ParentEventData, type ParentFromPoint, type ParentObservers, type ParentRecord, type ParentTargetData, type ParentsData, type PluginData, type ScrollData, type SetupNode, type SetupNodeData, type TearDownNode, type TearDownNodeData, type TouchOverNodeEvent, type TouchOverParentEvent, type TouchState, type TouchStateProps, addClass, addEvents, animations, copyNodeStyle, dragAndDrop, dragStateProps, dragValues, dragstart, dragstartClasses, end, eventCoordinates, events, getElFromPoint, getScrollParent, handleDragoverNode, handleDragoverParent, handleDragstart, handleEnd, handleLongTouch, handleTouchOverNode, handleTouchOverParent, handleTouchedNode, handleTouchmove, handleTouchstart, initDrag, initTouch, isBrowser, isNode, multiDrag, nodeEventData, nodes, parentEventData, parentValues, parents, performSort, performTransfer, remapFinished, remapNodes, removeClass, resetState, selections, setDragState, setParentValues, setTouchState, setupNode, setupNodeRemap, sort, state, tearDown, tearDownNode, tearDownNodeRemap, throttle, transfer, updateConfig, validateSort, validateTransfer }; +export { type DNDPlugin, type DNDPluginData, type DragAndDrop, type DragAndDropData, type DragState, type DragStateProps, type EventHandlers, type Node, type NodeData, type NodeDragEventData, type NodeEvent, type NodeEventData, type NodeFromPoint, type NodeRecord, type NodeTargetData, type NodeTouchEventData, type NodesData, type ParentConfig, type ParentData, type ParentDragEventData, type ParentEventData, type ParentFromPoint, type ParentObservers, type ParentRecord, type ParentTargetData, type ParentsData, type PluginData, type ScrollData, type SetupNode, type SetupNodeData, type TearDownNode, type TearDownNodeData, type TouchOverNodeEvent, type TouchOverParentEvent, type TouchState, type TouchStateProps, addClass, addEvents, animations, copyNodeStyle, dragAndDrop, dragStateProps, dragValues, dragstart, dragstartClasses, end, eventCoordinates, events, getElFromPoint, getScrollParent, handleDragoverNode, handleDragoverParent, handleDragstart, handleEnd, handleLongTouch, handleTouchOverNode, handleTouchOverParent, handleTouchedNode, handleTouchmove, handleTouchstart, initDrag, initTouch, isBrowser, isNode, multiDrag, nodeEventData, nodes, parentEventData, parentValues, parents, performSort, performTransfer, remapFinished, remapNodes, removeClass, resetState, selections, setDragState, setParentValues, setTouchState, setupNode, setupNodeRemap, sort, state, swap, tearDown, tearDownNode, tearDownNodeRemap, throttle, transfer, updateConfig, validateSort, validateTransfer }; diff --git a/dist/index.d.ts b/dist/index.d.ts index 3837739..770c569 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -745,6 +745,12 @@ declare function selections(selectionsConfig?: SelectionsConfig): (parent: setupNode(data: SetupNodeData): void; } | undefined; +interface SwapConfig extends ParentConfig { +} +declare function swap(swapConfig?: Partial>): (parent: HTMLElement) => { + setup(): void; +} | undefined; + declare const nodes: NodesData; declare const parents: ParentsData; /** @@ -836,4 +842,4 @@ declare function performTransfer(state: DragState | TouchState, data: N declare function transfer(data: NodeEventData | ParentEventData, state: DragState | TouchState): void; declare function parentEventData(callback: any): (e: Event) => NodeEventData | undefined; -export { type DNDPlugin, type DNDPluginData, type DragAndDrop, type DragAndDropData, type DragState, type DragStateProps, type EventHandlers, type Node, type NodeData, type NodeDragEventData, type NodeEvent, type NodeEventData, type NodeFromPoint, type NodeRecord, type NodeTargetData, type NodeTouchEventData, type NodesData, type ParentConfig, type ParentData, type ParentDragEventData, type ParentEventData, type ParentFromPoint, type ParentObservers, type ParentRecord, type ParentTargetData, type ParentsData, type PluginData, type ScrollData, type SetupNode, type SetupNodeData, type TearDownNode, type TearDownNodeData, type TouchOverNodeEvent, type TouchOverParentEvent, type TouchState, type TouchStateProps, addClass, addEvents, animations, copyNodeStyle, dragAndDrop, dragStateProps, dragValues, dragstart, dragstartClasses, end, eventCoordinates, events, getElFromPoint, getScrollParent, handleDragoverNode, handleDragoverParent, handleDragstart, handleEnd, handleLongTouch, handleTouchOverNode, handleTouchOverParent, handleTouchedNode, handleTouchmove, handleTouchstart, initDrag, initTouch, isBrowser, isNode, multiDrag, nodeEventData, nodes, parentEventData, parentValues, parents, performSort, performTransfer, remapFinished, remapNodes, removeClass, resetState, selections, setDragState, setParentValues, setTouchState, setupNode, setupNodeRemap, sort, state, tearDown, tearDownNode, tearDownNodeRemap, throttle, transfer, updateConfig, validateSort, validateTransfer }; +export { type DNDPlugin, type DNDPluginData, type DragAndDrop, type DragAndDropData, type DragState, type DragStateProps, type EventHandlers, type Node, type NodeData, type NodeDragEventData, type NodeEvent, type NodeEventData, type NodeFromPoint, type NodeRecord, type NodeTargetData, type NodeTouchEventData, type NodesData, type ParentConfig, type ParentData, type ParentDragEventData, type ParentEventData, type ParentFromPoint, type ParentObservers, type ParentRecord, type ParentTargetData, type ParentsData, type PluginData, type ScrollData, type SetupNode, type SetupNodeData, type TearDownNode, type TearDownNodeData, type TouchOverNodeEvent, type TouchOverParentEvent, type TouchState, type TouchStateProps, addClass, addEvents, animations, copyNodeStyle, dragAndDrop, dragStateProps, dragValues, dragstart, dragstartClasses, end, eventCoordinates, events, getElFromPoint, getScrollParent, handleDragoverNode, handleDragoverParent, handleDragstart, handleEnd, handleLongTouch, handleTouchOverNode, handleTouchOverParent, handleTouchedNode, handleTouchmove, handleTouchstart, initDrag, initTouch, isBrowser, isNode, multiDrag, nodeEventData, nodes, parentEventData, parentValues, parents, performSort, performTransfer, remapFinished, remapNodes, removeClass, resetState, selections, setDragState, setParentValues, setTouchState, setupNode, setupNodeRemap, sort, state, swap, tearDown, tearDownNode, tearDownNodeRemap, throttle, transfer, updateConfig, validateSort, validateTransfer }; diff --git a/dist/index.mjs b/dist/index.mjs index 5fa7725..713f4f6 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -523,10 +523,6 @@ function animate(node, animation, duration) { node.animate(animation, { duration }); - setTimeout(() => { - if (!state) - return; - }, duration); } // src/plugins/multiDrag/plugins/selections/index.ts @@ -808,6 +804,136 @@ function keydown(data) { multiDragState.activeNode.el.focus(); } +// src/plugins/swap/index.ts +var swapState = { + draggedOverNodes: Array() +}; +function swap(swapConfig = {}) { + return (parent) => { + const parentData = parents.get(parent); + if (!parentData) + return; + const swapParentConfig = { + ...parentData.config, + swapConfig + }; + return { + setup() { + swapParentConfig.handleDragoverNode = swapConfig.handleDragoverNode || handleDragoverNode; + swapParentConfig.handleTouchOverNode = swapConfig.handleTouchOverNode || handleTouchOverNode; + swapParentConfig.handleEnd = swapConfig.handleEnd || handleEnd2; + swapParentConfig.handleDragoverParent = () => { + }; + swapParentConfig.handleTouchOverParent = () => { + }; + parentData.config = swapParentConfig; + } + }; + }; +} +function handleDragoverNode(data) { + if (!state) + return; + dragoverNode(data, state); +} +function handleTouchOverNode(data) { + if (!state) + return; + const dropZoneClass = data.detail.targetData.parent.data.config.touchDropZoneClass; + removeClass( + swapState.draggedOverNodes.map((node) => node.el), + dropZoneClass + ); + const enabledNodes = data.detail.targetData.parent.data.enabledNodes; + if (!enabledNodes) + return; + swapState.draggedOverNodes = enabledNodes.slice( + data.detail.targetData.node.data.index, + data.detail.targetData.node.data.index + state.draggedNodes.length + ); + addClass( + swapState.draggedOverNodes.map((node) => node.el), + dropZoneClass, + true + ); + state.lastTargetValue = data.detail.targetData.node.data.value; + state.lastParent = data.detail.targetData.parent; +} +function dragoverNode(data, state2) { + data.e.preventDefault(); + data.e.stopPropagation(); + const dropZoneClass = data.targetData.parent.data.config.dropZoneClass; + removeClass( + swapState.draggedOverNodes.map((node) => node.el), + dropZoneClass + ); + const enabledNodes = data.targetData.parent.data.enabledNodes; + if (!enabledNodes) + return; + swapState.draggedOverNodes = enabledNodes.slice( + data.targetData.node.data.index, + data.targetData.node.data.index + state2.draggedNodes.length + ); + addClass( + swapState.draggedOverNodes.map((node) => node.el), + dropZoneClass, + true + ); + state2.lastTargetValue = data.targetData.node.data.value; + state2.lastParent = data.targetData.parent; +} +function handleEnd2(data) { + if (!state) + return; + const draggedParentValues = parentValues( + state.initialParent.el, + state.initialParent.data + ); + let targetParentValues = parentValues( + state.lastParent.el, + state.lastParent.data + ); + const draggedValues = state.draggedNodes.map((node) => node.data.value); + const draggedOverNodeValues = swapState.draggedOverNodes.map( + (node) => node.data.value + ); + const draggedIndex = state.draggedNodes[0].data.index; + const draggedOverIndex = swapState.draggedOverNodes[0].data.index; + targetParentValues.splice( + draggedOverIndex, + draggedValues.length, + ...draggedValues + ); + if (state.initialParent.el === state.lastParent.el) { + targetParentValues.splice( + draggedIndex, + draggedValues.length, + ...draggedOverNodeValues + ); + setParentValues(state.initialParent.el, state.initialParent.data, [ + ...targetParentValues + ]); + } else { + draggedParentValues.splice( + draggedIndex, + draggedValues.length, + ...draggedOverNodeValues + ); + setParentValues(state.lastParent.el, state.lastParent.data, [ + ...targetParentValues + ]); + setParentValues(state.initialParent.el, state.initialParent.data, [ + ...draggedParentValues + ]); + } + const dropZoneClass = "touchedNode" in state ? data.targetData.parent.data.config.touchDropZoneClass : data.targetData.parent.data.config.dropZoneClass; + removeClass( + swapState.draggedOverNodes.map((node) => node.el), + dropZoneClass + ); + handleEnd(data); +} + // src/index.ts var scrollConfig = { up: [0, -1], @@ -941,12 +1067,12 @@ function dragAndDrop({ setValues, config: { handleDragstart, - handleDragoverNode, + handleDragoverNode: handleDragoverNode2, handleDragoverParent, handleEnd, handleTouchstart, handleTouchmove, - handleTouchOverNode, + handleTouchOverNode: handleTouchOverNode2, handleTouchOverParent, handleDragenterNode, handleDragleaveNode, @@ -1161,7 +1287,7 @@ function dragstart2(data) { config.dropZoneClass ); } -function handleTouchOverNode(e) { +function handleTouchOverNode2(e) { if (!state) return; if (e.detail.targetData.parent.el === state.lastParent.el) @@ -1175,9 +1301,6 @@ function setupNode(data) { data.nodeData.abortControllers.mainNode = addEvents(data.node, { dragstart: nodeEventData(config.handleDragstart), dragover: nodeEventData(config.handleDragoverNode), - // dragover: nodeEventData( - // throttle(data.parentData.config.handleDragoverNode, 1000) - // ), dragenter: nodeEventData(config.handleDragenterNode), dragleave: nodeEventData(config.handleDragleaveNode), dragend: nodeEventData(config.handleEnd), @@ -1456,14 +1579,14 @@ function performScroll(direction, x, y) { "touchedNode" in state2 ? 10 : 100 ); } -function handleDragoverNode(data) { +function handleDragoverNode2(data) { if (!state) return; const { x, y } = eventCoordinates(data.e); state.coordinates.y = y; state.coordinates.x = x; handleScroll(); - dragoverNode(data, state); + dragoverNode2(data, state); } function handleDragoverParent(data) { if (!state) @@ -1504,7 +1627,7 @@ function handleDragenterNode(data, _state) { function handleDragleaveNode(data, _state) { data.e.preventDefault(); } -function dragoverNode(eventData, dragState) { +function dragoverNode2(eventData, dragState) { eventData.e.preventDefault(); eventData.e.stopPropagation(); eventData.targetData.parent.el === dragState.lastParent?.el ? sort(eventData, dragState) : transfer(eventData, dragState); @@ -1688,12 +1811,12 @@ export { events, getElFromPoint, getScrollParent, - handleDragoverNode, + handleDragoverNode2 as handleDragoverNode, handleDragoverParent, handleDragstart, handleEnd, handleLongTouch, - handleTouchOverNode, + handleTouchOverNode2 as handleTouchOverNode, handleTouchOverParent, handleTouchedNode, handleTouchmove, @@ -1722,6 +1845,7 @@ export { setupNodeRemap, sort, state, + swap, tearDown, tearDownNode, tearDownNodeRemap, diff --git a/dist/index.mjs.map b/dist/index.mjs.map index 015371c..2d1f900 100644 --- a/dist/index.mjs.map +++ b/dist/index.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/utils.ts","../src/plugins/multiDrag/index.ts","../src/plugins/animations/index.ts","../src/plugins/multiDrag/plugins/selections/index.ts","../src/index.ts"],"sourcesContent":["import type {\n Node,\n NodeEventData,\n NodeFromPoint,\n ParentFromPoint,\n EventHandlers,\n ParentData,\n} from \"./types\";\n\nimport { parents, nodes } from \"./index\";\n\nexport function throttle(callback: any, limit: number) {\n var wait = false;\n return function (...args: any[]) {\n if (!wait) {\n callback.call(null, ...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n }, limit);\n }\n };\n}\n\nfunction splitClass(className: string): Array {\n return className.split(\" \").filter((x) => x);\n}\n\n/**\n * Check to see if code is running in a browser.\n *\n * @internal\n */\nexport const isBrowser = typeof window !== \"undefined\";\n\nexport function addClass(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n if (classNames.includes(\"longTouch\")) return;\n\n for (const node of els) {\n if (!isNode(node) || !nodes.has(node)) {\n node.classList.add(...classNames);\n\n continue;\n }\n\n const privateClasses = [];\n\n const nodeData = nodes.get(node);\n\n if (!nodeData) continue;\n\n for (const className of classNames) {\n if (!node.classList.contains(className)) {\n node.classList.add(className);\n } else if (\n node.classList.contains(className) &&\n omitAppendPrivateClass === false\n ) {\n privateClasses.push(className);\n }\n }\n\n nodeData.privateClasses = privateClasses;\n\n nodes.set(node, nodeData);\n }\n}\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);\n\n if (!nodeData) continue;\n for (const className of classNames) {\n if (!nodeData.privateClasses.includes(className)) {\n node.classList.remove(className);\n }\n }\n }\n}\n\n/**\n * Used for getting the closest scrollable parent of a given element.\n *\n * @param node - The element to get the closest scrollable parent of.\n *\n * @internal\n */\nexport function getScrollParent(childNode: HTMLElement): HTMLElement {\n let parentNode = childNode.parentNode;\n\n while (\n parentNode !== null &&\n parentNode.nodeType === 1 &&\n parentNode instanceof HTMLElement\n ) {\n const computedStyle = window.getComputedStyle(parentNode);\n\n const overflow = computedStyle.getPropertyValue(\"overflow\");\n\n if (overflow === \"scroll\" || overflow === \"auto\") return parentNode;\n\n parentNode = parentNode.parentNode;\n }\n\n return document.documentElement;\n}\n/**\n * Used for setting a single event listener on x number of events for a given\n * element.\n *\n * @param el - The element to set the event listener on.\n *\n * @param events - An array of events to set the event listener on.\n *\n * @param fn - The function to run when the event is triggered.\n *\n * @param remove - Whether or not to remove the event listener.\n *\n * @internal\n */\nexport function events(\n el: Node | HTMLElement,\n events: Array,\n fn: any,\n remove = false\n) {\n events.forEach((event) => {\n remove ? el.removeEventListener(event, fn) : el.addEventListener(event, fn);\n });\n}\n\nexport function getElFromPoint(\n eventData: NodeEventData\n): NodeFromPoint | ParentFromPoint | undefined {\n if (!(eventData.e instanceof TouchEvent)) return;\n\n const newX = eventData.e.touches[0].clientX;\n\n const newY = eventData.e.touches[0].clientY;\n\n let target = document.elementFromPoint(newX, newY);\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 are instances of\n * HTML Elements.\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,\n events: EventHandlers | any\n): AbortController {\n const abortController = new AbortController();\n for (const eventName in events) {\n const handler = events[eventName];\n el.addEventListener(eventName, handler, {\n signal: abortController.signal,\n passive: false,\n });\n }\n return abortController;\n}\n\nexport function copyNodeStyle(\n sourceNode: Node,\n targetNode: Node,\n omitKeys = false\n) {\n const computedStyle = window.getComputedStyle(sourceNode);\n\n const omittedKeys = [\n \"position\",\n \"z-index\",\n \"top\",\n \"left\",\n \"x\",\n \"pointer-events\",\n \"y\",\n \"transform-origin\",\n \"filter\",\n \"-webkit-text-fill-color\",\n ];\n\n for (const key of Array.from(computedStyle)) {\n if (omitKeys === false && key && omittedKeys.includes(key)) continue;\n\n targetNode.style.setProperty(\n key,\n computedStyle.getPropertyValue(key),\n computedStyle.getPropertyPriority(key)\n );\n }\n\n for (const child of Array.from(sourceNode.children)) {\n if (!isNode(child)) continue;\n\n const targetChild = targetNode.children[\n Array.from(sourceNode.children).indexOf(child)\n ] as Node;\n\n copyNodeStyle(child, targetChild, omitKeys);\n }\n}\n\nexport function eventCoordinates(data: DragEvent | TouchEvent) {\n return data instanceof DragEvent\n ? { x: data.clientX, y: data.clientY }\n : { x: data.touches[0].clientX, y: data.touches[0].clientY };\n}\n","import type {\n Node,\n NodeEventData,\n NodeRecord,\n DragState,\n TouchState,\n ParentData,\n NodeDragEventData,\n NodeTouchEventData,\n DNDPluginData,\n TearDownNodeData,\n SetupNodeData,\n} from \"../../types\";\nimport type {\n MultiDragConfig,\n MultiDragParentConfig,\n MultiDragState,\n} from \"./types\";\n\nimport {\n parents,\n handleLongTouch,\n initDrag,\n initTouch,\n dragstartClasses,\n handleTouchedNode,\n end,\n state,\n resetState,\n} from \"../../index\";\nimport { addClass, removeClass, copyNodeStyle } from \"../../utils\";\n\nexport const multiDragState: MultiDragState = {\n selectedNodes: Array>(),\n\n activeNode: undefined,\n\n isTouch: false,\n};\n\nexport function multiDrag(\n multiDragConfig: Partial> = {}\n) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n const multiDragParentConfig = {\n ...parentData.config,\n multiDragConfig: multiDragConfig,\n } as MultiDragParentConfig;\n\n return {\n setup() {\n multiDragParentConfig.handleDragstart =\n multiDragConfig.multiHandleDragstart || multiHandleDragstart;\n\n multiDragParentConfig.handleTouchstart =\n multiDragConfig.multiHandleTouchstart || multiHandleTouchstart;\n\n multiDragParentConfig.handleEnd =\n multiDragConfig.multiHandleEnd || multiHandleEnd;\n\n multiDragParentConfig.reapplyDragClasses =\n multiDragConfig.multiReapplyDragClasses || multiReapplyDragClasses;\n\n parentData.config = multiDragParentConfig;\n\n multiDragParentConfig.multiDragConfig.plugins?.forEach((plugin) => {\n plugin(parent)?.tearDown?.();\n });\n\n multiDragParentConfig.multiDragConfig.plugins?.forEach((plugin) => {\n plugin(parent)?.setup?.();\n });\n },\n\n tearDownNodeRemap(data: TearDownNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.tearDownNodeRemap?.(data);\n });\n },\n\n tearDownNode(data: TearDownNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.tearDownNode?.(data);\n });\n },\n\n setupNodeRemap(data: SetupNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.setupNodeRemap?.(data);\n });\n },\n\n setupNode(data: SetupNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.setupNode?.(data);\n });\n },\n } satisfies DNDPluginData;\n };\n}\n\nfunction multiReapplyDragClasses(node: Node, parentData: ParentData) {\n if (!state) return;\n\n const dropZoneClass =\n \"touchedNode\" in state\n ? parentData.config.multiDragConfig.touchDropZoneClass\n : parentData.config.multiDragConfig.dropZoneClass;\n\n const draggedNodeEls = state.draggedNodes.map((x) => x.el);\n\n if (!draggedNodeEls.includes(node)) return;\n\n addClass([node], dropZoneClass, true);\n}\n\nfunction multiHandleEnd(data: NodeEventData) {\n if (!state) return;\n\n const isTouch = state && \"touchedNode\" in state;\n\n if (isTouch && \"touchMoving\" in state && !state.touchMoving) return;\n\n end(data, state);\n\n selectionsEnd(data, state);\n\n resetState();\n}\n\nfunction selectionsEnd(\n data: NodeEventData,\n state: DragState | TouchState\n) {\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const selectedClass =\n data.targetData.parent.data.config.selectionsConfig?.selectedClass;\n\n const isTouch = state && \"touchedNode\" in state;\n\n if (selectedClass) {\n removeClass(\n multiDragState.selectedNodes.map((x) => x.el),\n selectedClass\n );\n }\n\n multiDragState.selectedNodes = [];\n\n multiDragState.activeNode = undefined;\n\n const dropZoneClass = isTouch\n ? multiDragConfig.selectionDropZoneClass\n : multiDragConfig.touchSelectionDraggingClass;\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n}\n\nfunction multiHandleDragstart(data: NodeEventData) {\n if (!(data.e instanceof DragEvent)) return;\n\n dragstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nfunction dragstart(data: NodeDragEventData) {\n const dragState = initDrag(data);\n\n multiDragState.isTouch = false;\n\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const parentValues = data.targetData.parent.data.getValues(\n data.targetData.parent.el\n );\n\n let selectedValues = multiDragState.selectedNodes.length\n ? multiDragState.selectedNodes.map((x) => x.data.value)\n : multiDragConfig.selections &&\n multiDragConfig.selections(parentValues, data.targetData.parent.el);\n\n if (selectedValues === undefined) return;\n\n if (!selectedValues.includes(data.targetData.node.data.value)) {\n selectedValues = [data.targetData.node.data.value, ...selectedValues];\n\n const selectionConfig = data.targetData.parent.data.config.selectionsConfig;\n\n addClass([data.targetData.node.el], selectionConfig?.selectedClass, true);\n\n multiDragState.selectedNodes.push(data.targetData.node);\n }\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n if (Array.isArray(selectedValues) && selectedValues.length) {\n const targetRect = data.targetData.node.el.getBoundingClientRect();\n\n const [x, y] = [\n data.e.clientX - targetRect.left,\n data.e.clientY - targetRect.top,\n ];\n\n stackNodes(handleSelections(data, selectedValues, dragState, x, y));\n } else {\n const config = data.targetData.parent.data.config;\n\n dragstartClasses(\n dragState.draggedNode.el,\n config.draggingClass,\n config.dropZoneClass\n );\n }\n}\n\nfunction multiHandleTouchstart(data: NodeEventData) {\n if (!(data.e instanceof TouchEvent)) return;\n\n touchstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nfunction touchstart(data: NodeTouchEventData) {\n const touchState = initTouch(data);\n\n multiDragState.isTouch = true;\n\n multiDragState.activeNode = data.targetData.node;\n\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const parentValues = data.targetData.parent.data.getValues(\n data.targetData.parent.el\n );\n\n let selectedValues = [];\n\n if (data.targetData.parent.data.config.selectionsConfig) {\n selectedValues = multiDragState.selectedNodes.map((x) => x.data.value);\n } else {\n selectedValues =\n multiDragConfig.selections &&\n multiDragConfig.selections(parentValues, data.targetData.parent.el);\n }\n\n selectedValues = [data.targetData.node.data.value, ...selectedValues];\n\n const selectionConfig = data.targetData.parent.data.config.selectionsConfig;\n\n addClass([data.targetData.node.el], selectionConfig?.selectedClass, true);\n\n if (Array.isArray(selectedValues) && selectedValues.length) {\n stackNodes(\n handleSelections(\n data,\n selectedValues,\n touchState,\n touchState.touchStartLeft,\n touchState.touchStartTop\n )\n );\n } else {\n handleTouchedNode(data, touchState);\n }\n\n handleLongTouch(data, touchState);\n}\n\nexport function handleSelections(\n data: NodeEventData,\n selectedValues: Array,\n state: DragState | TouchState,\n x: number,\n y: number\n) {\n for (const child of data.targetData.parent.data.enabledNodes) {\n if (child.el === state.draggedNode.el) continue;\n\n if (!selectedValues.includes(child.data.value)) continue;\n\n state.draggedNodes.push(child);\n }\n\n const config = data.targetData.parent.data.config.multiDragConfig;\n\n const clonedEls = state.draggedNodes.map((x: NodeRecord) => {\n const el = x.el.cloneNode(true) as Node;\n\n copyNodeStyle(x.el, el, true);\n\n if (data.e instanceof DragEvent) addClass([el], config.draggingClass);\n\n return el;\n });\n\n setTimeout(() => {\n if (data.e instanceof DragEvent) {\n addClass(\n state.draggedNodes.map((x) => x.el),\n config.dropZoneClass\n );\n }\n });\n\n state.clonedDraggedEls = clonedEls;\n\n return { data, state, x, y };\n}\n\nexport function stackNodes({\n data,\n state,\n x,\n y,\n}: {\n data: NodeEventData;\n state: DragState | TouchState;\n x: number;\n y: number;\n}) {\n const wrapper = document.createElement(\"div\");\n\n for (const el of state.clonedDraggedEls) {\n if (el instanceof HTMLElement) el.style.pointerEvents = \"none\";\n\n wrapper.append(el);\n }\n\n const { width } = state.draggedNode.el.getBoundingClientRect();\n\n wrapper.style.cssText = `\n display: flex;\n flex-direction: column;\n width: ${width}px;\n position: fixed;\n pointer-events: none;\n z-index: 9999;\n left: -9999px\n `;\n\n document.body.append(wrapper);\n\n if (data.e instanceof DragEvent) {\n data.e.dataTransfer?.setDragImage(wrapper, x, y);\n\n setTimeout(() => {\n wrapper.remove();\n });\n } else if (\"touchedNode\" in state) {\n state.touchedNode = wrapper;\n }\n}\n","import type { SetupNodeData, Node } from \"../../types\";\nimport type { AnimationsConfig } from \"./types\";\nimport { state, parents } from \"../../index\";\n\nconst slideUp = [\n {\n transform: \"translateY(100%)\",\n },\n {\n transform: \"translateY(0)\",\n },\n];\n\nconst slideDown = [\n {\n transform: \"translateY(-100%)\",\n },\n {\n transform: \"translateY(0)\",\n },\n];\n\nconst slideLeft = [\n {\n transform: \"translateX(100%)\",\n },\n {\n transform: \"translateX(0)\",\n },\n];\n\nconst slideRight = [\n {\n transform: \"translateX(-100%)\",\n },\n {\n transform: \"translateX(0)\",\n },\n];\n\nexport function animations(animationsConfig: Partial = {}) {\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 (!state) return;\n\n const duration = animationsConfig.duration || 150;\n\n if (data.nodeData.value === state.draggedNode.data.value) {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node, slideUp, duration);\n\n break;\n case \"above\":\n animate(data.node, slideDown, duration);\n\n break;\n case \"left\":\n animate(data.node, slideRight, duration);\n\n break;\n case \"right\":\n animate(data.node, 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.nodeData.value)\n )\n return;\n\n const nodeRect = data.node.getBoundingClientRect();\n\n const nodeIndex = state.affectedNodes.findIndex(\n (x) => x.data.value === data.nodeData.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, slideRight, duration);\n } else if (xDiff > yDiff && !ascendingDirection) {\n animate(data.node, slideLeft, duration);\n }\n } else {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node, slideDown, duration);\n\n break;\n case \"above\":\n animate(data.node, slideUp, duration);\n\n break;\n case \"left\":\n animate(data.node, slideLeft, duration);\n\n break;\n case \"right\":\n animate(data.node, 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 node.animate(animation, {\n duration: duration,\n });\n\n setTimeout(() => {\n if (!state) return;\n\n // state.swappedNodeValue = undefined;\n\n // state.remapJustFinished = true;\n\n // state.lastTargetValue = undefined;\n\n // state.preventEnter = false;\n }, duration);\n}\n","import type {\n SetupNodeData,\n NodeEventData,\n TearDownNodeData,\n ParentConfig,\n} from \"../../../../types\";\n\nimport type { SelectionsConfig } from \"./types\";\n\nimport { parents, nodeEventData } from \"../../../../index\";\n\nimport { addEvents, removeClass, addClass } from \"../../../../utils\";\n\nimport { multiDragState } from \"../../index\";\n\nexport function selections(selectionsConfig: SelectionsConfig = {}) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n return {\n setup() {\n parentData.config.selectionsConfig = selectionsConfig;\n\n parentData.config.handleClick =\n selectionsConfig.handleClick || handleClick;\n\n parentData.config.handleKeydown =\n selectionsConfig.handleKeydown || handleKeydown;\n\n selectionsConfig.clickawayDeselect =\n selectionsConfig.clickawayDeselect === undefined\n ? true\n : selectionsConfig.clickawayDeselect;\n\n if (!selectionsConfig.clickawayDeselect) return;\n\n const rootAbortControllers = addEvents(parentData.config.root, {\n click: handleRootClick.bind(null, parentData.config),\n });\n\n parentData.abortControllers[\"root\"] = rootAbortControllers;\n },\n\n tearDown() {\n if (parentData.abortControllers.root) {\n parentData.abortControllers.root.abort();\n }\n },\n\n tearDownNode(data: TearDownNodeData) {\n if (data.parentData.abortControllers.selectionsNode) {\n data.parentData.abortControllers.selectionsNode.abort();\n }\n },\n\n setupNode(data: SetupNodeData) {\n const config = data.parentData.config;\n\n data.node.setAttribute(\"tabindex\", \"0\");\n\n const abortControllers = addEvents(data.node, {\n click: nodeEventData(config.handleClick),\n keydown: nodeEventData(config.handleKeydown),\n });\n\n data.nodeData.abortControllers[\"selectionsNode\"] = abortControllers;\n },\n };\n };\n}\n\nfunction handleRootClick(config: ParentConfig) {\n removeClass(\n multiDragState.selectedNodes.map((x) => x.el),\n config.selectionsConfig.selectedClass\n );\n\n multiDragState.selectedNodes = [];\n\n multiDragState.activeNode = undefined;\n}\n\nfunction handleKeydown(data: NodeEventData) {\n keydown(data);\n}\n\nfunction handleClick(data: NodeEventData) {\n click(data);\n}\n\nfunction click(data: NodeEventData) {\n data.e.stopPropagation();\n\n const selectionsConfig = data.targetData.parent.data.config.selectionsConfig;\n\n const ctParentData = data.targetData.parent.data;\n\n const selectedClass = selectionsConfig.selectedClass;\n\n const targetNode = data.targetData.node;\n\n let commandKey = false;\n\n let shiftKey = false;\n\n if (data.e instanceof MouseEvent) {\n commandKey = data.e.ctrlKey || data.e.metaKey;\n shiftKey = data.e.shiftKey;\n }\n\n if (shiftKey && multiDragState.isTouch === false) {\n if (!multiDragState.activeNode) {\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n for (let x = 0; x <= data.targetData.node.data.index; x++) {\n multiDragState.selectedNodes.push(ctParentData.enabledNodes[x]);\n if (selectedClass) {\n addClass([ctParentData.enabledNodes[x].el], selectedClass, true);\n }\n }\n } else {\n const [minIndex, maxIndex] =\n multiDragState.activeNode.data.index < data.targetData.node.data.index\n ? [\n multiDragState.activeNode.data.index,\n data.targetData.node.data.index,\n ]\n : [\n data.targetData.node.data.index,\n multiDragState.activeNode.data.index,\n ];\n\n const selectedNodes = ctParentData.enabledNodes.slice(\n minIndex,\n maxIndex + 1\n );\n\n if (selectedNodes.length === 1) {\n for (const node of multiDragState.selectedNodes) {\n if (selectedClass) node.el.classList.remove(selectedClass);\n }\n\n multiDragState.selectedNodes = [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ];\n\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n if (selectedClass) {\n data.targetData.node.el.classList.add(selectedClass);\n }\n }\n for (let x = minIndex - 1; x >= 0; x--) {\n if (\n multiDragState.selectedNodes.includes(ctParentData.enabledNodes[x])\n ) {\n multiDragState.selectedNodes = [\n ...multiDragState.selectedNodes.filter(\n (el) => el !== ctParentData.enabledNodes[x]\n ),\n ];\n\n if (selectedClass) {\n addClass([ctParentData.enabledNodes[x].el], selectedClass, true);\n }\n } else {\n break;\n }\n }\n for (let x = maxIndex; x < ctParentData.enabledNodes.length; x++) {\n if (\n multiDragState.selectedNodes.includes(ctParentData.enabledNodes[x])\n ) {\n multiDragState.selectedNodes = [\n ...multiDragState.selectedNodes.filter(\n (el) => el !== ctParentData.enabledNodes[x]\n ),\n ];\n if (selectedClass) {\n removeClass([ctParentData.enabledNodes[x].el], selectedClass);\n }\n } else {\n break;\n }\n }\n for (const node of selectedNodes) {\n if (!multiDragState.selectedNodes.map((x) => x.el).includes(node.el)) {\n multiDragState.selectedNodes.push(node);\n }\n\n if (selectedClass) {\n addClass([node.el], selectedClass, true);\n }\n }\n }\n } else if (commandKey) {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = targetNode;\n if (selectedClass) {\n addClass([targetNode.el], selectedClass, true);\n }\n multiDragState.selectedNodes.push(targetNode);\n }\n } else if (!commandKey && multiDragState.isTouch === false) {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n if (selectedClass) {\n for (const el of multiDragState.selectedNodes) {\n removeClass([el.el], selectedClass);\n }\n\n addClass([data.targetData.node.el], selectedClass, true);\n }\n multiDragState.selectedNodes = [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ];\n }\n } else {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = targetNode;\n if (selectedClass) {\n addClass([targetNode.el], selectedClass, true);\n }\n multiDragState.selectedNodes.push(targetNode);\n }\n }\n}\n\nfunction keydown(data: NodeEventData) {\n if (!(data.e instanceof KeyboardEvent)) return;\n\n const keys = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\n\n if (!keys.includes(data.e.key) || !multiDragState.activeNode) return;\n\n const selectionsConfig = data.targetData.parent.data.config.selectionsConfig;\n\n data.e.preventDefault();\n\n const parentData = data.targetData.parent.data;\n\n const nodeData = data.targetData.node.data;\n\n const enabledNodes = parentData.enabledNodes;\n\n const moveUp = data.e.key === \"ArrowUp\" || data.e.key === \"ArrowLeft\";\n\n const moveDown = data.e.key === \"ArrowDown\" || data.e.key === \"ArrowRight\";\n\n const invalidKeydown =\n (moveUp && nodeData.index === 0) ||\n (moveDown && nodeData.index === enabledNodes.length - 1);\n\n if (invalidKeydown) return;\n\n const adjacentNode = enabledNodes[nodeData.index + (moveUp ? -1 : 1)];\n\n const selectedClass = selectionsConfig.selectedClass;\n\n if (!adjacentNode) return;\n\n if (data.e.altKey) {\n if (multiDragState.selectedNodes.length > 1) {\n for (const el of multiDragState.selectedNodes) {\n if (selectedClass && multiDragState.activeNode !== el) {\n removeClass([el.el], selectedClass);\n }\n }\n\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el !== multiDragState.activeNode\n );\n }\n const parentValues = parentData.getValues(data.targetData.parent.el);\n\n [\n parentValues[nodeData.index],\n parentValues[nodeData.index + (moveUp ? -1 : 1)],\n ] = [\n parentValues[nodeData.index + (moveUp ? -1 : 1)],\n parentValues[nodeData.index],\n ];\n\n parentData.setValues(parentValues, data.targetData.parent.el);\n } else if (data.e.shiftKey && multiDragState.isTouch === false) {\n if (\n !multiDragState.selectedNodes.map((x) => x.el).includes(adjacentNode.el)\n ) {\n multiDragState.selectedNodes.push(adjacentNode);\n\n if (selectedClass) {\n addClass([adjacentNode.el], selectedClass, true);\n }\n\n multiDragState.activeNode = adjacentNode;\n } else {\n if (\n multiDragState.selectedNodes\n .map((x) => x.el)\n .includes(multiDragState.activeNode.el)\n ) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el !== multiDragState.activeNode\n );\n\n if (selectedClass) {\n removeClass([multiDragState.activeNode.el], selectedClass);\n }\n\n multiDragState.activeNode = adjacentNode;\n }\n }\n } else {\n for (const el of multiDragState.selectedNodes) {\n if (selectedClass && multiDragState.activeNode !== el) {\n removeClass([el.el], selectedClass);\n }\n }\n\n removeClass([multiDragState.activeNode.el], selectedClass);\n\n multiDragState.selectedNodes = [adjacentNode];\n\n addClass([adjacentNode.el], selectedClass, true);\n\n multiDragState.activeNode = adjacentNode;\n }\n\n data.targetData.node.el.blur();\n\n multiDragState.activeNode = adjacentNode;\n\n multiDragState.activeNode.el.focus();\n}\n","import type {\n DragAndDrop,\n Node,\n DNDPlugin,\n NodeEventData,\n TouchOverNodeEvent,\n ParentsData,\n NodesData,\n DragState,\n TouchState,\n DragStateProps,\n TouchStateProps,\n NodeData,\n ParentData,\n SetupNodeData,\n TearDownNodeData,\n NodeTargetData,\n ParentConfig,\n ParentTargetData,\n ParentEventData,\n TouchOverParentEvent,\n NodeDragEventData,\n NodeTouchEventData,\n NodeRecord,\n ScrollData,\n} from \"./types\";\nimport {\n isBrowser,\n addClass,\n removeClass,\n getElFromPoint,\n isNode,\n getScrollParent,\n addEvents,\n copyNodeStyle,\n eventCoordinates,\n throttle,\n} from \"./utils\";\nexport { isBrowser };\nexport * from \"./types\";\nexport { multiDrag } from \"./plugins/multiDrag\";\nexport { animations } from \"./plugins/animations\";\nexport { selections } from \"./plugins/multiDrag/plugins/selections\";\nexport * from \"./utils\";\n\nconst scrollConfig: {\n [key: string]: [number, number];\n} = {\n up: [0, -1],\n down: [0, 1],\n left: [-1, 0],\n right: [1, 0],\n};\n\nexport const nodes: NodesData = new WeakMap>();\n\nexport const parents: ParentsData = new WeakMap<\n HTMLElement,\n ParentData\n>();\n\n/**\n * The state of the drag and drop. Is undefined until either dragstart or\n * touchstart is called.\n */\nexport let state: DragState | TouchState | undefined = undefined;\n\nexport function resetState() {\n state = undefined;\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: DragStateProps\n): DragState {\n state = {\n ascendingDirection: false,\n incomingDirection: undefined,\n enterCount: 0,\n targetIndex: 0,\n affectedNodes: [],\n lastValue: undefined,\n activeNode: undefined,\n lastTargetValue: undefined,\n remapJustFinished: false,\n preventEnter: false,\n clonedDraggedEls: [],\n originalZIndex: undefined,\n ...dragStateProps,\n } as DragState;\n\n return state;\n}\n\nexport function setTouchState(\n dragState: DragState,\n touchStateProps: TouchStateProps\n): TouchState {\n state = {\n ...dragState,\n ...touchStateProps,\n };\n\n return state as TouchState;\n}\n\nexport function dragStateProps(\n data: NodeDragEventData | NodeTouchEventData\n): DragStateProps {\n const { x, y } = eventCoordinates(data.e);\n\n return {\n coordinates: {\n x,\n y,\n },\n draggedNode: {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n draggedNodes: [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ],\n initialIndex: data.targetData.node.data.index,\n initialParent: {\n el: data.targetData.parent.el,\n data: data.targetData.parent.data,\n },\n lastParent: {\n el: data.targetData.parent.el,\n data: data.targetData.parent.data,\n },\n scrollParent: getScrollParent(data.targetData.node.el),\n };\n}\n\nexport function performSort(\n state: DragState | TouchState,\n data: NodeDragEventData | NodeTouchEventData\n) {\n const draggedValues = dragValues(state);\n\n const targetParentValues = parentValues(\n data.targetData.parent.el,\n data.targetData.parent.data\n );\n\n const newParentValues = [\n ...targetParentValues.filter((x) => !draggedValues.includes(x)),\n ];\n\n newParentValues.splice(data.targetData.node.data.index, 0, ...draggedValues);\n\n state.lastTargetValue = data.targetData.node.data.value;\n\n setParentValues(data.targetData.parent.el, data.targetData.parent.data, [\n ...newParentValues,\n ]);\n}\n\nexport function parentValues(\n parent: HTMLElement,\n parentData: ParentData\n): Array {\n return [...parentData.getValues(parent)];\n}\n\nexport function setParentValues(\n parent: HTMLElement,\n parentData: ParentData,\n values: Array\n): void {\n parentData.setValues(values, parent);\n}\n\nexport function dragValues(state: DragState | TouchState): Array {\n return [...state.draggedNodes.map((x) => x.data.value)];\n}\n\n/**\n * Utility function to update parent config.\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 * Initializes the drag and drop functionality for a given parent.\n *\n * @param {DragAndDrop} dragAndDrop - The drag and drop configuration.\n * @param {HTMLElement} dragAndDrop.parent - The parent element.\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 document.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n\n // Temp fix sincie I am throttling dragover node\n if (nodes.has(e.target as Node) || parents.has(e.target as HTMLElement))\n return;\n\n if (state) {\n state.remapJustFinished = false;\n\n state.lastTargetValue = undefined;\n\n const { x, y } = eventCoordinates(e);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n }\n });\n\n tearDown(parent);\n\n const parentData: ParentData = {\n getValues,\n setValues,\n config: {\n handleDragstart,\n handleDragoverNode,\n handleDragoverParent,\n handleEnd,\n handleTouchstart,\n handleTouchmove,\n handleTouchOverNode,\n handleTouchOverParent,\n handleDragenterNode,\n handleDragleaveNode,\n performSort,\n performTransfer,\n root: document,\n setupNode,\n setupNodeRemap,\n reapplyDragClasses,\n tearDownNode,\n tearDownNodeRemap,\n remapFinished,\n scrollBehavior: {\n x: 0.8,\n y: 0.8,\n },\n threshold: {\n horizontal: 0,\n vertical: 0,\n },\n ...config,\n },\n enabledNodes: [],\n abortControllers: {},\n };\n\n const nodesObserver = new MutationObserver(nodesMutated);\n\n nodesObserver.observe(parent, { childList: true });\n\n parents.set(parent, parentData as any);\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 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\nfunction setup(parent: HTMLElement, parentData: ParentData): void {\n parentData.abortControllers.mainParent = addEvents(parent, {\n dragover: parentEventData(\n throttle(parentData.config.handleDragoverParent, 10)\n ),\n touchOverParent: parentData.config.handleTouchOverParent,\n });\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 const parentEl = mutationList[0].target;\n\n if (!(parentEl instanceof HTMLElement)) 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 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)) continue;\n\n const nodeData = nodes.get(node);\n\n // Only tear down the node if someone has explicitly called dragAndDrop.\n if (force || !nodeData) {\n config.tearDownNode({ node, parent, nodeData, parentData });\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 enabled nodes does not match the number of values.\"\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 const nodeData = Object.assign(\n prevNodeData ?? {\n privateClasses: [],\n abortControllers: {},\n },\n {\n value: values[x],\n index: x,\n }\n );\n\n // TODO: maybe get rid of this — duplicate of the next if statement\n if (state && nodeData.value === state.draggedNode.data.value) {\n state.draggedNode.data = nodeData;\n\n state.draggedNode.el = node;\n }\n\n if (\n state &&\n state.draggedNodes.map((x) => x.data.value).includes(nodeData.value)\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 const setupNodeData = {\n node,\n parent,\n parentData,\n nodeData,\n };\n\n if (force || !prevNodeData) config.setupNode(setupNodeData);\n\n setupNodeRemap(setupNodeData);\n }\n\n parents.set(parent, { ...parentData, enabledNodes: enabledNodeRecords });\n\n config.remapFinished(parentData);\n}\n\nexport function remapFinished() {\n if (state) {\n state.preventEnter = false;\n\n state.remapJustFinished = true;\n\n state.affectedNodes = [];\n }\n}\n\nexport function handleDragstart(data: NodeEventData) {\n if (!(data.e instanceof DragEvent)) return;\n\n dragstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nexport function dragstartClasses(\n el: HTMLElement | Node | Element,\n draggingClass: string | undefined,\n dropZoneClass: string | undefined\n) {\n addClass([el], draggingClass);\n\n setTimeout(() => {\n removeClass([el], draggingClass);\n\n addClass([el], dropZoneClass);\n });\n}\n\nexport function initDrag(eventData: NodeDragEventData): DragState {\n const dragState = setDragState(dragStateProps(eventData));\n\n eventData.e.stopPropagation();\n\n if (eventData.e.dataTransfer) {\n eventData.e.dataTransfer.dropEffect = \"move\";\n\n eventData.e.dataTransfer.effectAllowed = \"move\";\n\n eventData.e.dataTransfer.setDragImage(\n eventData.targetData.node.el,\n eventData.e.offsetX,\n eventData.e.offsetY\n );\n }\n\n return dragState;\n}\n\nfunction validateDragHandle(data: NodeEventData): boolean {\n if (!(data.e instanceof DragEvent) && !(data.e instanceof TouchEvent))\n return false;\n\n const config = data.targetData.parent.data.config;\n\n if (!config.dragHandle) return true;\n\n const dragHandles = data.targetData.node.el.querySelectorAll(\n config.dragHandle\n );\n\n if (!dragHandles) return false;\n\n const coordinates = eventCoordinates(data.e);\n\n const elFromPoint = config.root.elementFromPoint(\n coordinates.x,\n coordinates.y\n );\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\n return false;\n}\n\nfunction touchstart(data: NodeTouchEventData) {\n if (!validateDragHandle(data)) return;\n\n const touchState = initTouch(data);\n\n handleTouchedNode(data, touchState);\n\n handleLongTouch(data, touchState);\n}\n\nexport function dragstart(data: NodeDragEventData) {\n if (!validateDragHandle(data)) {\n data.e.preventDefault();\n\n return;\n }\n\n const config = data.targetData.parent.data.config;\n\n const dragState = initDrag(data);\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n dragstartClasses(\n dragState.draggedNode.el,\n config.draggingClass,\n config.dropZoneClass\n );\n}\n\nexport function handleTouchOverNode(e: TouchOverNodeEvent) {\n if (!state) return;\n\n if (e.detail.targetData.parent.el === state.lastParent.el)\n sort(e.detail, state);\n else transfer(e.detail, state);\n}\n\nexport function setupNode(data: SetupNodeData) {\n const config = data.parentData.config;\n\n data.node.draggable = true;\n\n data.nodeData.abortControllers.mainNode = addEvents(data.node, {\n dragstart: nodeEventData(config.handleDragstart),\n dragover: nodeEventData(config.handleDragoverNode),\n // dragover: nodeEventData(\n // throttle(data.parentData.config.handleDragoverNode, 1000)\n // ),\n dragenter: nodeEventData(config.handleDragenterNode),\n dragleave: nodeEventData(config.handleDragleaveNode),\n dragend: nodeEventData(config.handleEnd),\n touchstart: nodeEventData(config.handleTouchstart),\n touchmove: nodeEventData(config.handleTouchmove),\n touchend: nodeEventData(config.handleEnd),\n touchOverNode: config.handleTouchOverNode,\n });\n\n config.reapplyDragClasses(data.node, data.parentData);\n\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.setupNode?.(data);\n });\n}\n\nexport function setupNodeRemap(data: SetupNodeData) {\n nodes.set(data.node, data.nodeData);\n\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.setupNodeRemap?.(data);\n });\n}\n\nfunction reapplyDragClasses(node: Node, parentData: ParentData) {\n if (!state) return;\n\n const dropZoneClass =\n \"touchedNode\" in state\n ? parentData.config.touchDropZoneClass\n : parentData.config.dropZoneClass;\n\n if (state.draggedNode.el !== node) return;\n\n addClass([node], dropZoneClass, true);\n}\n\nexport function tearDownNodeRemap(data: TearDownNodeData) {\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.tearDownNodeRemap?.(data);\n });\n}\n\nexport function tearDownNode(data: TearDownNodeData) {\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.tearDownNode?.(data);\n });\n\n data.node.draggable = false;\n\n if (data.nodeData?.abortControllers?.mainNode) {\n data.nodeData?.abortControllers?.mainNode.abort();\n }\n}\n\nexport function handleEnd(eventData: NodeEventData) {\n if (!state) return;\n\n end(eventData, state);\n\n resetState();\n}\n\nexport function end(\n _eventData: NodeEventData,\n state: DragState | TouchState\n) {\n document.removeEventListener(\"contextmenu\", preventDefault);\n\n if (\"longTouchTimeout\" in state && state.longTouchTimeout)\n clearTimeout(state.longTouchTimeout);\n\n const config = parents.get(state.initialParent.el)?.config;\n\n const isTouch = \"touchedNode\" in state;\n\n const dropZoneClass = isTouch\n ? config?.touchDropZoneClass\n : config?.dropZoneClass;\n\n if (state.originalZIndex !== undefined)\n state.draggedNode.el.style.zIndex = state.originalZIndex;\n\n addClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass,\n true\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n\n if (config?.longTouchClass) {\n removeClass(\n state.draggedNodes.map((x) => x.el),\n state.initialParent.data?.config?.longTouchClass\n );\n }\n\n if (\"touchedNode\" in state) state.touchedNode?.remove();\n}\n\nexport function handleTouchstart(eventData: NodeEventData) {\n if (!(eventData.e instanceof TouchEvent)) return;\n\n touchstart({\n e: eventData.e,\n targetData: eventData.targetData,\n });\n}\n\nexport function initTouch(data: NodeTouchEventData): TouchState {\n data.e.stopPropagation();\n\n const clonedNode = data.targetData.node.el.cloneNode(true) as HTMLElement;\n\n const rect = data.targetData.node.el.getBoundingClientRect();\n\n const touchState = setTouchState(setDragState(dragStateProps(data)), {\n coordinates: {\n x: data.e.touches[0].clientX,\n y: data.e.touches[0].clientY,\n },\n scrollParent: getScrollParent(data.targetData.node.el),\n touchStartLeft: data.e.touches[0].clientX - rect.left,\n touchStartTop: data.e.touches[0].clientY - rect.top,\n touchedNode: clonedNode,\n touchMoving: false,\n });\n\n return touchState;\n}\n\nfunction preventDefault(e: Event) {\n e.preventDefault();\n}\n\nexport function handleTouchedNode(\n data: NodeTouchEventData,\n touchState: TouchState\n) {\n touchState.touchedNodeDisplay = touchState.touchedNode.style.display;\n\n const rect = data.targetData.node.el.getBoundingClientRect();\n\n touchState.touchedNode.style.cssText = `\n width: ${rect.width}px;\n position: fixed;\n pointer-events: none;\n top: -9999px;\n z-index: 999999;\n display: none;\n `;\n\n document.body.append(touchState.touchedNode);\n\n copyNodeStyle(data.targetData.node.el, touchState.touchedNode as Node);\n\n touchState.touchedNode.style.display = \"none\";\n\n document.addEventListener(\"contextmenu\", preventDefault);\n}\n\nexport function handleLongTouch(\n data: NodeEventData,\n touchState: TouchState\n) {\n const config = data.targetData.parent.data.config;\n\n if (!config.longTouch) return;\n\n touchState.longTouchTimeout = setTimeout(() => {\n if (!touchState) return;\n\n touchState.longTouch = true;\n\n if (config.longTouchClass && data.e.cancelable)\n addClass(\n touchState.draggedNodes.map((x) => x.el),\n config.longTouchClass\n );\n\n data.e.preventDefault();\n }, config.longTouchTimeout || 200);\n}\n\nexport function handleTouchmove(eventData: NodeTouchEventData) {\n if (!state || !(\"touchedNode\" in state)) return;\n\n touchmove(eventData, state);\n}\n\nfunction touchmoveClasses(\n touchState: TouchState,\n config: ParentConfig\n) {\n if (config.longTouchClass)\n removeClass(\n touchState.draggedNodes.map((x) => x.el),\n config?.longTouchClass\n );\n\n if (config.touchDraggingClass)\n addClass([touchState.touchedNode], config.touchDraggingClass);\n\n if (config.touchDropZoneClass)\n addClass(\n touchState.draggedNodes.map((x) => x.el),\n config.touchDropZoneClass\n );\n}\n\nfunction getScrollData(\n state?: DragState | TouchState\n): ScrollData | void {\n if (!state || !state.scrollParent) return;\n\n const { x, y, width, height } = state.scrollParent.getBoundingClientRect();\n\n const {\n x: xThresh,\n y: yThresh,\n scrollOutside,\n } = state.lastParent.data.config.scrollBehavior;\n\n return {\n state,\n xThresh,\n yThresh,\n scrollOutside,\n scrollParent: state.scrollParent,\n x,\n y,\n width,\n height,\n };\n}\n\nfunction shouldScroll(\n direction: string\n): DragState | TouchState | void {\n const data = getScrollData(state);\n\n if (!data) return;\n\n switch (direction) {\n case \"down\":\n return shouldScrollDown(data.state, data);\n\n case \"up\":\n return shouldScrollUp(data.state, data);\n\n case \"right\":\n return shouldScrollRight(data.state, data);\n\n case \"left\":\n return shouldScrollLeft(data.state, data);\n }\n}\n\nfunction shouldScrollRight(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientWidth + data.x - state.coordinates.x;\n\n if (!data.scrollOutside && diff < 0) return;\n\n if (\n diff < (1 - data.xThresh) * data.scrollParent.clientWidth &&\n !(\n data.scrollParent.scrollLeft + data.scrollParent.clientWidth >=\n data.scrollParent.scrollWidth\n )\n )\n return state;\n}\n\nfunction shouldScrollLeft(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientWidth + data.x - state.coordinates.x;\n\n if (!data.scrollOutside && diff > data.scrollParent.clientWidth) return;\n\n if (\n diff > data.xThresh * data.scrollParent.clientWidth &&\n data.scrollParent.scrollLeft !== 0\n )\n return state;\n}\n\nfunction shouldScrollUp(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientHeight + data.y - state.coordinates.y;\n\n if (!data.scrollOutside && diff > data.scrollParent.clientHeight) return;\n\n if (\n diff > data.yThresh * data.scrollParent.clientHeight &&\n data.scrollParent.scrollTop !== 0\n )\n return state;\n}\n\nfunction shouldScrollDown(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientHeight + data.y - state.coordinates.y;\n\n if (!data.scrollOutside && diff < 0) return;\n\n if (\n diff < (1 - data.yThresh) * data.scrollParent.clientHeight &&\n !(\n data.scrollParent.scrollTop + data.scrollParent.clientHeight >=\n data.scrollParent.scrollHeight\n )\n )\n return state;\n}\n\nfunction moveTouchedNode(\n data: NodeTouchEventData,\n touchState: TouchState\n) {\n touchState.touchMoving = true;\n\n touchState.touchedNode.style.display = touchState.touchedNodeDisplay || \"\";\n\n const { x, y } = eventCoordinates(data.e);\n\n touchState.coordinates.y = y;\n\n touchState.coordinates.x = x;\n\n const touchStartLeft = touchState.touchStartLeft ?? 0;\n\n const touchStartTop = touchState.touchStartTop ?? 0;\n\n touchState.touchedNode.style.left = `${x - touchStartLeft}px`;\n\n touchState.touchedNode.style.top = `${y - touchStartTop}px`;\n\n touchmoveClasses(touchState, data.targetData.parent.data.config);\n}\n\nfunction touchmove(data: NodeTouchEventData, touchState: TouchState) {\n const config = data.targetData.parent.data.config;\n\n if (config.longTouch && !touchState.longTouch) {\n clearTimeout(touchState.longTouchTimeout);\n\n return;\n }\n\n if (data.e.cancelable) data.e.preventDefault();\n\n moveTouchedNode(data, touchState);\n\n handleScroll();\n\n const elFromPoint = getElFromPoint(data);\n\n if (!elFromPoint) return;\n\n const touchMoveEventData = {\n e: data.e,\n targetData: elFromPoint,\n };\n\n if (\"node\" in elFromPoint) {\n elFromPoint.node.el.dispatchEvent(\n new CustomEvent(\"touchOverNode\", {\n detail: touchMoveEventData,\n })\n );\n } else {\n elFromPoint.parent.el.dispatchEvent(\n new CustomEvent(\"touchOverParent\", {\n detail: touchMoveEventData,\n })\n );\n }\n}\n\nfunction handleScroll() {\n for (const direction of Object.keys(scrollConfig)) {\n const [x, y] = scrollConfig[direction];\n\n performScroll(direction, x, y);\n }\n}\n\nfunction performScroll(direction: string, x: number, y: number) {\n const state = shouldScroll(direction);\n\n if (!state) return;\n\n state.scrollParent.scrollBy(x, y);\n\n setTimeout(\n () => {\n performScroll(direction, x, y);\n },\n \"touchedNode\" in state ? 10 : 100\n );\n}\n\nexport function handleDragoverNode(data: NodeDragEventData) {\n if (!state) return;\n\n const { x, y } = eventCoordinates(data.e);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n\n dragoverNode(data, state);\n}\n\nexport function handleDragoverParent(data: ParentEventData) {\n if (!state) return;\n\n const { x, y } = eventCoordinates(data.e as DragEvent);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n\n transfer(data, state);\n}\n\nexport function handleTouchOverParent(e: TouchOverParentEvent) {\n if (!state) return;\n\n transfer(e.detail, state);\n}\n\nexport function validateTransfer(\n data: ParentEventData,\n state: DragState | TouchState\n) {\n if (data.targetData.parent.el === state.lastParent.el) return false;\n\n const targetConfig = data.targetData.parent.data.config;\n\n if (targetConfig.dropZone === false) return false;\n\n const initialParentConfig = state.initialParent.data.config;\n\n if (targetConfig.accepts) {\n return targetConfig.accepts(\n data.targetData.parent,\n state.initialParent,\n state.lastParent,\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\nfunction handleDragenterNode(\n data: NodeDragEventData,\n _state: DragState\n) {\n data.e.preventDefault();\n}\n\nfunction handleDragleaveNode(\n data: NodeDragEventData,\n _state: DragState\n) {\n data.e.preventDefault();\n}\n\nfunction dragoverNode(\n eventData: NodeDragEventData,\n dragState: DragState\n) {\n eventData.e.preventDefault();\n\n eventData.e.stopPropagation();\n\n eventData.targetData.parent.el === dragState.lastParent?.el\n ? sort(eventData, dragState)\n : transfer(eventData, dragState);\n}\n\nexport function validateSort(\n data: NodeDragEventData | NodeTouchEventData,\n state: DragState | TouchState,\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.lastTargetValue ||\n state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)\n ) {\n state.lastTargetValue = data.targetData.node.data.value;\n }\n\n return false;\n }\n\n if (state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)) {\n state.lastTargetValue = undefined;\n return false;\n }\n\n if (data.targetData.node.data.value === state.lastTargetValue) return false;\n\n if (\n state.preventEnter ||\n data.targetData.parent.el !== state.lastParent?.el ||\n data.targetData.parent.data.config.sortable === false\n )\n 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.lastParent.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\nexport function sort(\n data: NodeDragEventData | NodeTouchEventData,\n state: DragState | TouchState\n) {\n const { x, y } = eventCoordinates(data.e);\n\n if (!validateSort(data, state, x, y)) return;\n\n state.preventEnter = true;\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(state, data);\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 const parent = node.parentNode || state?.lastParent?.el;\n\n if (!nodeData) return;\n\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n return {\n node: {\n el: node,\n data: nodeData,\n },\n parent: {\n el: parent,\n data: parentData as 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 e,\n targetData,\n });\n };\n}\n\n// TRANSFER LOGIC:\nexport function performTransfer(\n state: DragState | TouchState,\n data: NodeEventData | ParentEventData\n) {\n const draggedValues = dragValues(state);\n\n const lastParentValues = parentValues(\n state.lastParent.el,\n state.lastParent.data\n ).filter((x: any) => !draggedValues.includes(x));\n\n const targetParentValues = parentValues(\n data.targetData.parent.el,\n data.targetData.parent.data\n );\n\n const reset =\n state.initialParent.el === data.targetData.parent.el &&\n data.targetData.parent.data.config.sortable === false;\n\n let targetIndex: number;\n\n if (\"node\" in data.targetData) {\n if (reset) {\n targetIndex = state.initialIndex;\n } else if (data.targetData.parent.data.config.sortable === false) {\n targetIndex = data.targetData.parent.data.enabledNodes.length;\n } else {\n targetIndex = data.targetData.node.data.index;\n }\n\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\n } else {\n targetIndex = reset\n ? state.initialIndex\n : data.targetData.parent.data.enabledNodes.length;\n\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\n }\n\n setParentValues(state.lastParent.el, state.lastParent.data, lastParentValues);\n\n setParentValues(\n data.targetData.parent.el,\n data.targetData.parent.data,\n targetParentValues\n );\n}\n\n/**\n * Used when the dragged element enters into a parent other than its own.\n *\n * @param eventData\n *\n * @param state\n *\n * @internal\n *\n * @returns void\n */\nexport function transfer(\n data: NodeEventData | ParentEventData,\n state: DragState | TouchState\n): void {\n if (!validateTransfer(data, state)) return;\n\n data.targetData.parent.data.config.performTransfer(state, data);\n\n state.lastParent = data.targetData.parent;\n}\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 e,\n targetData,\n });\n };\n}\n"],"mappings":"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","names":["className","events","state","parentValues","x","parentValues","dragStateProps","state","x","dragstart","touchstart"]} \ No newline at end of file +{"version":3,"sources":["../src/utils.ts","../src/plugins/multiDrag/index.ts","../src/plugins/animations/index.ts","../src/plugins/multiDrag/plugins/selections/index.ts","../src/plugins/swap/index.ts","../src/index.ts"],"sourcesContent":["import type {\n Node,\n NodeEventData,\n NodeFromPoint,\n ParentFromPoint,\n EventHandlers,\n ParentData,\n} from \"./types\";\n\nimport { parents, nodes } from \"./index\";\n\nexport function throttle(callback: any, limit: number) {\n var wait = false;\n return function (...args: any[]) {\n if (!wait) {\n callback.call(null, ...args);\n wait = true;\n setTimeout(function () {\n wait = false;\n }, limit);\n }\n };\n}\n\nfunction splitClass(className: string): Array {\n return className.split(\" \").filter((x) => x);\n}\n\n/**\n * Check to see if code is running in a browser.\n *\n * @internal\n */\nexport const isBrowser = typeof window !== \"undefined\";\n\nexport function addClass(\n els: Array,\n className: string | undefined,\n omitAppendPrivateClass = false\n) {\n if (!className) return;\n\n const classNames = splitClass(className);\n\n if (!classNames.length) return;\n\n if (classNames.includes(\"longTouch\")) return;\n\n for (const node of els) {\n if (!isNode(node) || !nodes.has(node)) {\n node.classList.add(...classNames);\n\n continue;\n }\n\n const privateClasses = [];\n\n const nodeData = nodes.get(node);\n\n if (!nodeData) continue;\n\n for (const className of classNames) {\n if (!node.classList.contains(className)) {\n node.classList.add(className);\n } else if (\n node.classList.contains(className) &&\n omitAppendPrivateClass === false\n ) {\n privateClasses.push(className);\n }\n }\n\n nodeData.privateClasses = privateClasses;\n\n nodes.set(node, nodeData);\n }\n}\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);\n\n if (!nodeData) continue;\n for (const className of classNames) {\n if (!nodeData.privateClasses.includes(className)) {\n node.classList.remove(className);\n }\n }\n }\n}\n\n/**\n * Used for getting the closest scrollable parent of a given element.\n *\n * @param node - The element to get the closest scrollable parent of.\n *\n * @internal\n */\nexport function getScrollParent(childNode: HTMLElement): HTMLElement {\n let parentNode = childNode.parentNode;\n\n while (\n parentNode !== null &&\n parentNode.nodeType === 1 &&\n parentNode instanceof HTMLElement\n ) {\n const computedStyle = window.getComputedStyle(parentNode);\n\n const overflow = computedStyle.getPropertyValue(\"overflow\");\n\n if (overflow === \"scroll\" || overflow === \"auto\") return parentNode;\n\n parentNode = parentNode.parentNode;\n }\n\n return document.documentElement;\n}\n/**\n * Used for setting a single event listener on x number of events for a given\n * element.\n *\n * @param el - The element to set the event listener on.\n *\n * @param events - An array of events to set the event listener on.\n *\n * @param fn - The function to run when the event is triggered.\n *\n * @param remove - Whether or not to remove the event listener.\n *\n * @internal\n */\nexport function events(\n el: Node | HTMLElement,\n events: Array,\n fn: any,\n remove = false\n) {\n events.forEach((event) => {\n remove ? el.removeEventListener(event, fn) : el.addEventListener(event, fn);\n });\n}\n\nexport function getElFromPoint(\n eventData: NodeEventData\n): NodeFromPoint | ParentFromPoint | undefined {\n if (!(eventData.e instanceof TouchEvent)) return;\n\n const newX = eventData.e.touches[0].clientX;\n\n const newY = eventData.e.touches[0].clientY;\n\n let target = document.elementFromPoint(newX, newY);\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 are instances of\n * HTML Elements.\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,\n events: EventHandlers | any\n): AbortController {\n const abortController = new AbortController();\n for (const eventName in events) {\n const handler = events[eventName];\n el.addEventListener(eventName, handler, {\n signal: abortController.signal,\n passive: false,\n });\n }\n return abortController;\n}\n\nexport function copyNodeStyle(\n sourceNode: Node,\n targetNode: Node,\n omitKeys = false\n) {\n const computedStyle = window.getComputedStyle(sourceNode);\n\n const omittedKeys = [\n \"position\",\n \"z-index\",\n \"top\",\n \"left\",\n \"x\",\n \"pointer-events\",\n \"y\",\n \"transform-origin\",\n \"filter\",\n \"-webkit-text-fill-color\",\n ];\n\n for (const key of Array.from(computedStyle)) {\n if (omitKeys === false && key && omittedKeys.includes(key)) continue;\n\n targetNode.style.setProperty(\n key,\n computedStyle.getPropertyValue(key),\n computedStyle.getPropertyPriority(key)\n );\n }\n\n for (const child of Array.from(sourceNode.children)) {\n if (!isNode(child)) continue;\n\n const targetChild = targetNode.children[\n Array.from(sourceNode.children).indexOf(child)\n ] as Node;\n\n copyNodeStyle(child, targetChild, omitKeys);\n }\n}\n\nexport function eventCoordinates(data: DragEvent | TouchEvent) {\n return data instanceof DragEvent\n ? { x: data.clientX, y: data.clientY }\n : { x: data.touches[0].clientX, y: data.touches[0].clientY };\n}\n","import type {\n Node,\n NodeEventData,\n NodeRecord,\n DragState,\n TouchState,\n ParentData,\n NodeDragEventData,\n NodeTouchEventData,\n DNDPluginData,\n TearDownNodeData,\n SetupNodeData,\n} from \"../../types\";\nimport type {\n MultiDragConfig,\n MultiDragParentConfig,\n MultiDragState,\n} from \"./types\";\n\nimport {\n parents,\n handleLongTouch,\n initDrag,\n initTouch,\n dragstartClasses,\n handleTouchedNode,\n end,\n state,\n resetState,\n} from \"../../index\";\nimport { addClass, removeClass, copyNodeStyle } from \"../../utils\";\n\nexport const multiDragState: MultiDragState = {\n selectedNodes: Array>(),\n\n activeNode: undefined,\n\n isTouch: false,\n};\n\nexport function multiDrag(\n multiDragConfig: Partial> = {}\n) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n const multiDragParentConfig = {\n ...parentData.config,\n multiDragConfig: multiDragConfig,\n } as MultiDragParentConfig;\n\n return {\n setup() {\n multiDragParentConfig.handleDragstart =\n multiDragConfig.multiHandleDragstart || multiHandleDragstart;\n\n multiDragParentConfig.handleTouchstart =\n multiDragConfig.multiHandleTouchstart || multiHandleTouchstart;\n\n multiDragParentConfig.handleEnd =\n multiDragConfig.multiHandleEnd || multiHandleEnd;\n\n multiDragParentConfig.reapplyDragClasses =\n multiDragConfig.multiReapplyDragClasses || multiReapplyDragClasses;\n\n parentData.config = multiDragParentConfig;\n\n multiDragParentConfig.multiDragConfig.plugins?.forEach((plugin) => {\n plugin(parent)?.tearDown?.();\n });\n\n multiDragParentConfig.multiDragConfig.plugins?.forEach((plugin) => {\n plugin(parent)?.setup?.();\n });\n },\n\n tearDownNodeRemap(data: TearDownNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.tearDownNodeRemap?.(data);\n });\n },\n\n tearDownNode(data: TearDownNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.tearDownNode?.(data);\n });\n },\n\n setupNodeRemap(data: SetupNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.setupNodeRemap?.(data);\n });\n },\n\n setupNode(data: SetupNodeData) {\n multiDragParentConfig.multiDragConfig?.plugins?.forEach((plugin) => {\n plugin(data.parent)?.setupNode?.(data);\n });\n },\n } satisfies DNDPluginData;\n };\n}\n\nfunction multiReapplyDragClasses(node: Node, parentData: ParentData) {\n if (!state) return;\n\n const dropZoneClass =\n \"touchedNode\" in state\n ? parentData.config.multiDragConfig.touchDropZoneClass\n : parentData.config.multiDragConfig.dropZoneClass;\n\n const draggedNodeEls = state.draggedNodes.map((x) => x.el);\n\n if (!draggedNodeEls.includes(node)) return;\n\n addClass([node], dropZoneClass, true);\n}\n\nfunction multiHandleEnd(data: NodeEventData) {\n if (!state) return;\n\n const isTouch = state && \"touchedNode\" in state;\n\n if (isTouch && \"touchMoving\" in state && !state.touchMoving) return;\n\n end(data, state);\n\n selectionsEnd(data, state);\n\n resetState();\n}\n\nfunction selectionsEnd(\n data: NodeEventData,\n state: DragState | TouchState\n) {\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const selectedClass =\n data.targetData.parent.data.config.selectionsConfig?.selectedClass;\n\n const isTouch = state && \"touchedNode\" in state;\n\n if (selectedClass) {\n removeClass(\n multiDragState.selectedNodes.map((x) => x.el),\n selectedClass\n );\n }\n\n multiDragState.selectedNodes = [];\n\n multiDragState.activeNode = undefined;\n\n const dropZoneClass = isTouch\n ? multiDragConfig.selectionDropZoneClass\n : multiDragConfig.touchSelectionDraggingClass;\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n}\n\nfunction multiHandleDragstart(data: NodeEventData) {\n if (!(data.e instanceof DragEvent)) return;\n\n dragstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nfunction dragstart(data: NodeDragEventData) {\n const dragState = initDrag(data);\n\n multiDragState.isTouch = false;\n\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const parentValues = data.targetData.parent.data.getValues(\n data.targetData.parent.el\n );\n\n let selectedValues = multiDragState.selectedNodes.length\n ? multiDragState.selectedNodes.map((x) => x.data.value)\n : multiDragConfig.selections &&\n multiDragConfig.selections(parentValues, data.targetData.parent.el);\n\n if (selectedValues === undefined) return;\n\n if (!selectedValues.includes(data.targetData.node.data.value)) {\n selectedValues = [data.targetData.node.data.value, ...selectedValues];\n\n const selectionConfig = data.targetData.parent.data.config.selectionsConfig;\n\n addClass([data.targetData.node.el], selectionConfig?.selectedClass, true);\n\n multiDragState.selectedNodes.push(data.targetData.node);\n }\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n if (Array.isArray(selectedValues) && selectedValues.length) {\n const targetRect = data.targetData.node.el.getBoundingClientRect();\n\n const [x, y] = [\n data.e.clientX - targetRect.left,\n data.e.clientY - targetRect.top,\n ];\n\n stackNodes(handleSelections(data, selectedValues, dragState, x, y));\n } else {\n const config = data.targetData.parent.data.config;\n\n dragstartClasses(\n dragState.draggedNode.el,\n config.draggingClass,\n config.dropZoneClass\n );\n }\n}\n\nfunction multiHandleTouchstart(data: NodeEventData) {\n if (!(data.e instanceof TouchEvent)) return;\n\n touchstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nfunction touchstart(data: NodeTouchEventData) {\n const touchState = initTouch(data);\n\n multiDragState.isTouch = true;\n\n multiDragState.activeNode = data.targetData.node;\n\n const multiDragConfig = data.targetData.parent.data.config.multiDragConfig;\n\n const parentValues = data.targetData.parent.data.getValues(\n data.targetData.parent.el\n );\n\n let selectedValues = [];\n\n if (data.targetData.parent.data.config.selectionsConfig) {\n selectedValues = multiDragState.selectedNodes.map((x) => x.data.value);\n } else {\n selectedValues =\n multiDragConfig.selections &&\n multiDragConfig.selections(parentValues, data.targetData.parent.el);\n }\n\n selectedValues = [data.targetData.node.data.value, ...selectedValues];\n\n const selectionConfig = data.targetData.parent.data.config.selectionsConfig;\n\n addClass([data.targetData.node.el], selectionConfig?.selectedClass, true);\n\n if (Array.isArray(selectedValues) && selectedValues.length) {\n stackNodes(\n handleSelections(\n data,\n selectedValues,\n touchState,\n touchState.touchStartLeft,\n touchState.touchStartTop\n )\n );\n } else {\n handleTouchedNode(data, touchState);\n }\n\n handleLongTouch(data, touchState);\n}\n\nexport function handleSelections(\n data: NodeEventData,\n selectedValues: Array,\n state: DragState | TouchState,\n x: number,\n y: number\n) {\n for (const child of data.targetData.parent.data.enabledNodes) {\n if (child.el === state.draggedNode.el) continue;\n\n if (!selectedValues.includes(child.data.value)) continue;\n\n state.draggedNodes.push(child);\n }\n\n const config = data.targetData.parent.data.config.multiDragConfig;\n\n const clonedEls = state.draggedNodes.map((x: NodeRecord) => {\n const el = x.el.cloneNode(true) as Node;\n\n copyNodeStyle(x.el, el, true);\n\n if (data.e instanceof DragEvent) addClass([el], config.draggingClass);\n\n return el;\n });\n\n setTimeout(() => {\n if (data.e instanceof DragEvent) {\n addClass(\n state.draggedNodes.map((x) => x.el),\n config.dropZoneClass\n );\n }\n });\n\n state.clonedDraggedEls = clonedEls;\n\n return { data, state, x, y };\n}\n\nexport function stackNodes({\n data,\n state,\n x,\n y,\n}: {\n data: NodeEventData;\n state: DragState | TouchState;\n x: number;\n y: number;\n}) {\n const wrapper = document.createElement(\"div\");\n\n for (const el of state.clonedDraggedEls) {\n if (el instanceof HTMLElement) el.style.pointerEvents = \"none\";\n\n wrapper.append(el);\n }\n\n const { width } = state.draggedNode.el.getBoundingClientRect();\n\n wrapper.style.cssText = `\n display: flex;\n flex-direction: column;\n width: ${width}px;\n position: fixed;\n pointer-events: none;\n z-index: 9999;\n left: -9999px\n `;\n\n document.body.append(wrapper);\n\n if (data.e instanceof DragEvent) {\n data.e.dataTransfer?.setDragImage(wrapper, x, y);\n\n setTimeout(() => {\n wrapper.remove();\n });\n } else if (\"touchedNode\" in state) {\n state.touchedNode = wrapper;\n }\n}\n","import type { SetupNodeData, Node } from \"../../types\";\nimport type { AnimationsConfig } from \"./types\";\nimport { state, parents } from \"../../index\";\n\nconst slideUp = [\n {\n transform: \"translateY(100%)\",\n },\n {\n transform: \"translateY(0)\",\n },\n];\n\nconst slideDown = [\n {\n transform: \"translateY(-100%)\",\n },\n {\n transform: \"translateY(0)\",\n },\n];\n\nconst slideLeft = [\n {\n transform: \"translateX(100%)\",\n },\n {\n transform: \"translateX(0)\",\n },\n];\n\nconst slideRight = [\n {\n transform: \"translateX(-100%)\",\n },\n {\n transform: \"translateX(0)\",\n },\n];\n\nexport function animations(animationsConfig: Partial = {}) {\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 (!state) return;\n\n const duration = animationsConfig.duration || 150;\n\n if (data.nodeData.value === state.draggedNode.data.value) {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node, slideUp, duration);\n\n break;\n case \"above\":\n animate(data.node, slideDown, duration);\n\n break;\n case \"left\":\n animate(data.node, slideRight, duration);\n\n break;\n case \"right\":\n animate(data.node, 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.nodeData.value)\n )\n return;\n\n const nodeRect = data.node.getBoundingClientRect();\n\n const nodeIndex = state.affectedNodes.findIndex(\n (x) => x.data.value === data.nodeData.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, slideRight, duration);\n } else if (xDiff > yDiff && !ascendingDirection) {\n animate(data.node, slideLeft, duration);\n }\n } else {\n switch (state.incomingDirection) {\n case \"below\":\n animate(data.node, slideDown, duration);\n\n break;\n case \"above\":\n animate(data.node, slideUp, duration);\n\n break;\n case \"left\":\n animate(data.node, slideLeft, duration);\n\n break;\n case \"right\":\n animate(data.node, 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 node.animate(animation, {\n duration: duration,\n });\n}\n","import type {\n SetupNodeData,\n NodeEventData,\n TearDownNodeData,\n ParentConfig,\n} from \"../../../../types\";\n\nimport type { SelectionsConfig } from \"./types\";\n\nimport { parents, nodeEventData } from \"../../../../index\";\n\nimport { addEvents, removeClass, addClass } from \"../../../../utils\";\n\nimport { multiDragState } from \"../../index\";\n\nexport function selections(selectionsConfig: SelectionsConfig = {}) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n return {\n setup() {\n parentData.config.selectionsConfig = selectionsConfig;\n\n parentData.config.handleClick =\n selectionsConfig.handleClick || handleClick;\n\n parentData.config.handleKeydown =\n selectionsConfig.handleKeydown || handleKeydown;\n\n selectionsConfig.clickawayDeselect =\n selectionsConfig.clickawayDeselect === undefined\n ? true\n : selectionsConfig.clickawayDeselect;\n\n if (!selectionsConfig.clickawayDeselect) return;\n\n const rootAbortControllers = addEvents(parentData.config.root, {\n click: handleRootClick.bind(null, parentData.config),\n });\n\n parentData.abortControllers[\"root\"] = rootAbortControllers;\n },\n\n tearDown() {\n if (parentData.abortControllers.root) {\n parentData.abortControllers.root.abort();\n }\n },\n\n tearDownNode(data: TearDownNodeData) {\n if (data.parentData.abortControllers.selectionsNode) {\n data.parentData.abortControllers.selectionsNode.abort();\n }\n },\n\n setupNode(data: SetupNodeData) {\n const config = data.parentData.config;\n\n data.node.setAttribute(\"tabindex\", \"0\");\n\n const abortControllers = addEvents(data.node, {\n click: nodeEventData(config.handleClick),\n keydown: nodeEventData(config.handleKeydown),\n });\n\n data.nodeData.abortControllers[\"selectionsNode\"] = abortControllers;\n },\n };\n };\n}\n\nfunction handleRootClick(config: ParentConfig) {\n removeClass(\n multiDragState.selectedNodes.map((x) => x.el),\n config.selectionsConfig.selectedClass\n );\n\n multiDragState.selectedNodes = [];\n\n multiDragState.activeNode = undefined;\n}\n\nfunction handleKeydown(data: NodeEventData) {\n keydown(data);\n}\n\nfunction handleClick(data: NodeEventData) {\n click(data);\n}\n\nfunction click(data: NodeEventData) {\n data.e.stopPropagation();\n\n const selectionsConfig = data.targetData.parent.data.config.selectionsConfig;\n\n const ctParentData = data.targetData.parent.data;\n\n const selectedClass = selectionsConfig.selectedClass;\n\n const targetNode = data.targetData.node;\n\n let commandKey = false;\n\n let shiftKey = false;\n\n if (data.e instanceof MouseEvent) {\n commandKey = data.e.ctrlKey || data.e.metaKey;\n shiftKey = data.e.shiftKey;\n }\n\n if (shiftKey && multiDragState.isTouch === false) {\n if (!multiDragState.activeNode) {\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n for (let x = 0; x <= data.targetData.node.data.index; x++) {\n multiDragState.selectedNodes.push(ctParentData.enabledNodes[x]);\n if (selectedClass) {\n addClass([ctParentData.enabledNodes[x].el], selectedClass, true);\n }\n }\n } else {\n const [minIndex, maxIndex] =\n multiDragState.activeNode.data.index < data.targetData.node.data.index\n ? [\n multiDragState.activeNode.data.index,\n data.targetData.node.data.index,\n ]\n : [\n data.targetData.node.data.index,\n multiDragState.activeNode.data.index,\n ];\n\n const selectedNodes = ctParentData.enabledNodes.slice(\n minIndex,\n maxIndex + 1\n );\n\n if (selectedNodes.length === 1) {\n for (const node of multiDragState.selectedNodes) {\n if (selectedClass) node.el.classList.remove(selectedClass);\n }\n\n multiDragState.selectedNodes = [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ];\n\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n if (selectedClass) {\n data.targetData.node.el.classList.add(selectedClass);\n }\n }\n for (let x = minIndex - 1; x >= 0; x--) {\n if (\n multiDragState.selectedNodes.includes(ctParentData.enabledNodes[x])\n ) {\n multiDragState.selectedNodes = [\n ...multiDragState.selectedNodes.filter(\n (el) => el !== ctParentData.enabledNodes[x]\n ),\n ];\n\n if (selectedClass) {\n addClass([ctParentData.enabledNodes[x].el], selectedClass, true);\n }\n } else {\n break;\n }\n }\n for (let x = maxIndex; x < ctParentData.enabledNodes.length; x++) {\n if (\n multiDragState.selectedNodes.includes(ctParentData.enabledNodes[x])\n ) {\n multiDragState.selectedNodes = [\n ...multiDragState.selectedNodes.filter(\n (el) => el !== ctParentData.enabledNodes[x]\n ),\n ];\n if (selectedClass) {\n removeClass([ctParentData.enabledNodes[x].el], selectedClass);\n }\n } else {\n break;\n }\n }\n for (const node of selectedNodes) {\n if (!multiDragState.selectedNodes.map((x) => x.el).includes(node.el)) {\n multiDragState.selectedNodes.push(node);\n }\n\n if (selectedClass) {\n addClass([node.el], selectedClass, true);\n }\n }\n }\n } else if (commandKey) {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = targetNode;\n if (selectedClass) {\n addClass([targetNode.el], selectedClass, true);\n }\n multiDragState.selectedNodes.push(targetNode);\n }\n } else if (!commandKey && multiDragState.isTouch === false) {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n };\n\n if (selectedClass) {\n for (const el of multiDragState.selectedNodes) {\n removeClass([el.el], selectedClass);\n }\n\n addClass([data.targetData.node.el], selectedClass, true);\n }\n multiDragState.selectedNodes = [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ];\n }\n } else {\n if (multiDragState.selectedNodes.map((x) => x.el).includes(targetNode.el)) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el.el !== targetNode.el\n );\n if (selectedClass) {\n removeClass([targetNode.el], selectedClass);\n }\n } else {\n multiDragState.activeNode = targetNode;\n if (selectedClass) {\n addClass([targetNode.el], selectedClass, true);\n }\n multiDragState.selectedNodes.push(targetNode);\n }\n }\n}\n\nfunction keydown(data: NodeEventData) {\n if (!(data.e instanceof KeyboardEvent)) return;\n\n const keys = [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\n\n if (!keys.includes(data.e.key) || !multiDragState.activeNode) return;\n\n const selectionsConfig = data.targetData.parent.data.config.selectionsConfig;\n\n data.e.preventDefault();\n\n const parentData = data.targetData.parent.data;\n\n const nodeData = data.targetData.node.data;\n\n const enabledNodes = parentData.enabledNodes;\n\n const moveUp = data.e.key === \"ArrowUp\" || data.e.key === \"ArrowLeft\";\n\n const moveDown = data.e.key === \"ArrowDown\" || data.e.key === \"ArrowRight\";\n\n const invalidKeydown =\n (moveUp && nodeData.index === 0) ||\n (moveDown && nodeData.index === enabledNodes.length - 1);\n\n if (invalidKeydown) return;\n\n const adjacentNode = enabledNodes[nodeData.index + (moveUp ? -1 : 1)];\n\n const selectedClass = selectionsConfig.selectedClass;\n\n if (!adjacentNode) return;\n\n if (data.e.altKey) {\n if (multiDragState.selectedNodes.length > 1) {\n for (const el of multiDragState.selectedNodes) {\n if (selectedClass && multiDragState.activeNode !== el) {\n removeClass([el.el], selectedClass);\n }\n }\n\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el !== multiDragState.activeNode\n );\n }\n const parentValues = parentData.getValues(data.targetData.parent.el);\n\n [\n parentValues[nodeData.index],\n parentValues[nodeData.index + (moveUp ? -1 : 1)],\n ] = [\n parentValues[nodeData.index + (moveUp ? -1 : 1)],\n parentValues[nodeData.index],\n ];\n\n parentData.setValues(parentValues, data.targetData.parent.el);\n } else if (data.e.shiftKey && multiDragState.isTouch === false) {\n if (\n !multiDragState.selectedNodes.map((x) => x.el).includes(adjacentNode.el)\n ) {\n multiDragState.selectedNodes.push(adjacentNode);\n\n if (selectedClass) {\n addClass([adjacentNode.el], selectedClass, true);\n }\n\n multiDragState.activeNode = adjacentNode;\n } else {\n if (\n multiDragState.selectedNodes\n .map((x) => x.el)\n .includes(multiDragState.activeNode.el)\n ) {\n multiDragState.selectedNodes = multiDragState.selectedNodes.filter(\n (el) => el !== multiDragState.activeNode\n );\n\n if (selectedClass) {\n removeClass([multiDragState.activeNode.el], selectedClass);\n }\n\n multiDragState.activeNode = adjacentNode;\n }\n }\n } else {\n for (const el of multiDragState.selectedNodes) {\n if (selectedClass && multiDragState.activeNode !== el) {\n removeClass([el.el], selectedClass);\n }\n }\n\n removeClass([multiDragState.activeNode.el], selectedClass);\n\n multiDragState.selectedNodes = [adjacentNode];\n\n addClass([adjacentNode.el], selectedClass, true);\n\n multiDragState.activeNode = adjacentNode;\n }\n\n data.targetData.node.el.blur();\n\n multiDragState.activeNode = adjacentNode;\n\n multiDragState.activeNode.el.focus();\n}\n","import type {\n NodeDragEventData,\n ParentConfig,\n DragState,\n NodeTouchEventData,\n NodeRecord,\n TouchOverNodeEvent,\n} from \"../../types\";\nimport {\n state,\n parents,\n handleEnd as originalHandleEnd,\n parentValues,\n setParentValues,\n} from \"../../index\";\nimport { addClass, removeClass } from \"../../utils\";\n\nexport const swapState = {\n draggedOverNodes: Array>(),\n};\n\ninterface SwapConfig extends ParentConfig {}\n\nexport function swap(swapConfig: Partial> = {}) {\n return (parent: HTMLElement) => {\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n const swapParentConfig = {\n ...parentData.config,\n swapConfig: swapConfig,\n } as SwapConfig;\n\n return {\n setup() {\n swapParentConfig.handleDragoverNode =\n swapConfig.handleDragoverNode || handleDragoverNode;\n\n swapParentConfig.handleTouchOverNode =\n swapConfig.handleTouchOverNode || handleTouchOverNode;\n\n swapParentConfig.handleEnd = swapConfig.handleEnd || handleEnd;\n\n swapParentConfig.handleDragoverParent = () => {};\n\n swapParentConfig.handleTouchOverParent = () => {};\n\n parentData.config = swapParentConfig;\n },\n };\n };\n}\n\nfunction handleDragoverNode(data: NodeDragEventData) {\n if (!state) return;\n\n dragoverNode(data, state);\n}\n\nfunction handleTouchOverNode(data: TouchOverNodeEvent) {\n if (!state) return;\n\n const dropZoneClass =\n data.detail.targetData.parent.data.config.touchDropZoneClass;\n\n removeClass(\n swapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass\n );\n\n const enabledNodes = data.detail.targetData.parent.data.enabledNodes;\n\n if (!enabledNodes) return;\n\n swapState.draggedOverNodes = enabledNodes.slice(\n data.detail.targetData.node.data.index,\n data.detail.targetData.node.data.index + state.draggedNodes.length\n );\n\n addClass(\n swapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass,\n true\n );\n\n state.lastTargetValue = data.detail.targetData.node.data.value;\n\n state.lastParent = data.detail.targetData.parent;\n}\n\nfunction dragoverNode(data: NodeDragEventData, state: DragState) {\n data.e.preventDefault();\n\n data.e.stopPropagation();\n\n const dropZoneClass = data.targetData.parent.data.config.dropZoneClass;\n\n removeClass(\n swapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass\n );\n\n const enabledNodes = data.targetData.parent.data.enabledNodes;\n\n if (!enabledNodes) return;\n\n swapState.draggedOverNodes = enabledNodes.slice(\n data.targetData.node.data.index,\n data.targetData.node.data.index + state.draggedNodes.length\n );\n\n addClass(\n swapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass,\n true\n );\n\n state.lastTargetValue = data.targetData.node.data.value;\n\n state.lastParent = data.targetData.parent;\n}\n\nfunction handleEnd(data: NodeDragEventData | NodeTouchEventData) {\n if (!state) return;\n\n const draggedParentValues = parentValues(\n state.initialParent.el,\n state.initialParent.data\n );\n\n let targetParentValues = parentValues(\n state.lastParent.el,\n state.lastParent.data\n );\n\n const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n const draggedOverNodeValues = swapState.draggedOverNodes.map(\n (node) => node.data.value\n );\n\n const draggedIndex = state.draggedNodes[0].data.index;\n\n const draggedOverIndex = swapState.draggedOverNodes[0].data.index;\n\n targetParentValues.splice(\n draggedOverIndex,\n draggedValues.length,\n ...draggedValues\n );\n\n if (state.initialParent.el === state.lastParent.el) {\n targetParentValues.splice(\n draggedIndex,\n draggedValues.length,\n ...draggedOverNodeValues\n );\n\n setParentValues(state.initialParent.el, state.initialParent.data, [\n ...targetParentValues,\n ]);\n } else {\n draggedParentValues.splice(\n draggedIndex,\n draggedValues.length,\n ...draggedOverNodeValues\n );\n\n setParentValues(state.lastParent.el, state.lastParent.data, [\n ...targetParentValues,\n ]);\n\n setParentValues(state.initialParent.el, state.initialParent.data, [\n ...draggedParentValues,\n ]);\n }\n\n const dropZoneClass =\n \"touchedNode\" in state\n ? data.targetData.parent.data.config.touchDropZoneClass\n : data.targetData.parent.data.config.dropZoneClass;\n\n removeClass(\n swapState.draggedOverNodes.map((node) => node.el),\n dropZoneClass\n );\n\n originalHandleEnd(data);\n}\n","import type {\n DragAndDrop,\n Node,\n DNDPlugin,\n NodeEventData,\n TouchOverNodeEvent,\n ParentsData,\n NodesData,\n DragState,\n TouchState,\n DragStateProps,\n TouchStateProps,\n NodeData,\n ParentData,\n SetupNodeData,\n TearDownNodeData,\n NodeTargetData,\n ParentConfig,\n ParentTargetData,\n ParentEventData,\n TouchOverParentEvent,\n NodeDragEventData,\n NodeTouchEventData,\n NodeRecord,\n ScrollData,\n} from \"./types\";\nimport {\n isBrowser,\n addClass,\n removeClass,\n getElFromPoint,\n isNode,\n getScrollParent,\n addEvents,\n copyNodeStyle,\n eventCoordinates,\n throttle,\n} from \"./utils\";\nexport { isBrowser };\nexport * from \"./types\";\nexport { multiDrag } from \"./plugins/multiDrag\";\nexport { animations } from \"./plugins/animations\";\nexport { selections } from \"./plugins/multiDrag/plugins/selections\";\nexport { swap } from \"./plugins/swap\";\nexport * from \"./utils\";\n\nconst scrollConfig: {\n [key: string]: [number, number];\n} = {\n up: [0, -1],\n down: [0, 1],\n left: [-1, 0],\n right: [1, 0],\n};\n\nexport const nodes: NodesData = new WeakMap>();\n\nexport const parents: ParentsData = new WeakMap<\n HTMLElement,\n ParentData\n>();\n\n/**\n * The state of the drag and drop. Is undefined until either dragstart or\n * touchstart is called.\n */\nexport let state: DragState | TouchState | undefined = undefined;\n\nexport function resetState() {\n state = undefined;\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: DragStateProps\n): DragState {\n state = {\n ascendingDirection: false,\n incomingDirection: undefined,\n enterCount: 0,\n targetIndex: 0,\n affectedNodes: [],\n lastValue: undefined,\n activeNode: undefined,\n lastTargetValue: undefined,\n remapJustFinished: false,\n preventEnter: false,\n clonedDraggedEls: [],\n originalZIndex: undefined,\n ...dragStateProps,\n } as DragState;\n\n return state;\n}\n\nexport function setTouchState(\n dragState: DragState,\n touchStateProps: TouchStateProps\n): TouchState {\n state = {\n ...dragState,\n ...touchStateProps,\n };\n\n return state as TouchState;\n}\n\nexport function dragStateProps(\n data: NodeDragEventData | NodeTouchEventData\n): DragStateProps {\n const { x, y } = eventCoordinates(data.e);\n\n return {\n coordinates: {\n x,\n y,\n },\n draggedNode: {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n draggedNodes: [\n {\n el: data.targetData.node.el,\n data: data.targetData.node.data,\n },\n ],\n initialIndex: data.targetData.node.data.index,\n initialParent: {\n el: data.targetData.parent.el,\n data: data.targetData.parent.data,\n },\n lastParent: {\n el: data.targetData.parent.el,\n data: data.targetData.parent.data,\n },\n scrollParent: getScrollParent(data.targetData.node.el),\n };\n}\n\nexport function performSort(\n state: DragState | TouchState,\n data: NodeDragEventData | NodeTouchEventData\n) {\n const draggedValues = dragValues(state);\n\n const targetParentValues = parentValues(\n data.targetData.parent.el,\n data.targetData.parent.data\n );\n\n const newParentValues = [\n ...targetParentValues.filter((x) => !draggedValues.includes(x)),\n ];\n\n newParentValues.splice(data.targetData.node.data.index, 0, ...draggedValues);\n\n state.lastTargetValue = data.targetData.node.data.value;\n\n setParentValues(data.targetData.parent.el, data.targetData.parent.data, [\n ...newParentValues,\n ]);\n}\n\nexport function parentValues(\n parent: HTMLElement,\n parentData: ParentData\n): Array {\n return [...parentData.getValues(parent)];\n}\n\nexport function setParentValues(\n parent: HTMLElement,\n parentData: ParentData,\n values: Array\n): void {\n parentData.setValues(values, parent);\n}\n\nexport function dragValues(state: DragState | TouchState): Array {\n return [...state.draggedNodes.map((x) => x.data.value)];\n}\n\n/**\n * Utility function to update parent config.\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 * Initializes the drag and drop functionality for a given parent.\n *\n * @param {DragAndDrop} dragAndDrop - The drag and drop configuration.\n * @param {HTMLElement} dragAndDrop.parent - The parent element.\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 document.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n\n // Temp fix sincie I am throttling dragover node\n if (nodes.has(e.target as Node) || parents.has(e.target as HTMLElement))\n return;\n\n if (state) {\n state.remapJustFinished = false;\n\n state.lastTargetValue = undefined;\n\n const { x, y } = eventCoordinates(e);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n }\n });\n\n tearDown(parent);\n\n const parentData: ParentData = {\n getValues,\n setValues,\n config: {\n handleDragstart,\n handleDragoverNode,\n handleDragoverParent,\n handleEnd,\n handleTouchstart,\n handleTouchmove,\n handleTouchOverNode,\n handleTouchOverParent,\n handleDragenterNode,\n handleDragleaveNode,\n performSort,\n performTransfer,\n root: document,\n setupNode,\n setupNodeRemap,\n reapplyDragClasses,\n tearDownNode,\n tearDownNodeRemap,\n remapFinished,\n scrollBehavior: {\n x: 0.8,\n y: 0.8,\n },\n threshold: {\n horizontal: 0,\n vertical: 0,\n },\n ...config,\n },\n enabledNodes: [],\n abortControllers: {},\n };\n\n const nodesObserver = new MutationObserver(nodesMutated);\n\n nodesObserver.observe(parent, { childList: true });\n\n parents.set(parent, parentData as any);\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 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\nfunction setup(parent: HTMLElement, parentData: ParentData): void {\n parentData.abortControllers.mainParent = addEvents(parent, {\n dragover: parentEventData(\n throttle(parentData.config.handleDragoverParent, 10)\n ),\n touchOverParent: parentData.config.handleTouchOverParent,\n });\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 const parentEl = mutationList[0].target;\n\n if (!(parentEl instanceof HTMLElement)) 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 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)) continue;\n\n const nodeData = nodes.get(node);\n\n // Only tear down the node if someone has explicitly called dragAndDrop.\n if (force || !nodeData) {\n config.tearDownNode({ node, parent, nodeData, parentData });\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 enabled nodes does not match the number of values.\"\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 const nodeData = Object.assign(\n prevNodeData ?? {\n privateClasses: [],\n abortControllers: {},\n },\n {\n value: values[x],\n index: x,\n }\n );\n\n // TODO: maybe get rid of this — duplicate of the next if statement\n if (state && nodeData.value === state.draggedNode.data.value) {\n state.draggedNode.data = nodeData;\n\n state.draggedNode.el = node;\n }\n\n if (\n state &&\n state.draggedNodes.map((x) => x.data.value).includes(nodeData.value)\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 const setupNodeData = {\n node,\n parent,\n parentData,\n nodeData,\n };\n\n if (force || !prevNodeData) config.setupNode(setupNodeData);\n\n setupNodeRemap(setupNodeData);\n }\n\n parents.set(parent, { ...parentData, enabledNodes: enabledNodeRecords });\n\n config.remapFinished(parentData);\n}\n\nexport function remapFinished() {\n if (state) {\n state.preventEnter = false;\n\n state.remapJustFinished = true;\n\n state.affectedNodes = [];\n }\n}\n\nexport function handleDragstart(data: NodeEventData) {\n if (!(data.e instanceof DragEvent)) return;\n\n dragstart({\n e: data.e,\n targetData: data.targetData,\n });\n}\n\nexport function dragstartClasses(\n el: HTMLElement | Node | Element,\n draggingClass: string | undefined,\n dropZoneClass: string | undefined\n) {\n addClass([el], draggingClass);\n\n setTimeout(() => {\n removeClass([el], draggingClass);\n\n addClass([el], dropZoneClass);\n });\n}\n\nexport function initDrag(eventData: NodeDragEventData): DragState {\n const dragState = setDragState(dragStateProps(eventData));\n\n eventData.e.stopPropagation();\n\n if (eventData.e.dataTransfer) {\n eventData.e.dataTransfer.dropEffect = \"move\";\n\n eventData.e.dataTransfer.effectAllowed = \"move\";\n\n eventData.e.dataTransfer.setDragImage(\n eventData.targetData.node.el,\n eventData.e.offsetX,\n eventData.e.offsetY\n );\n }\n\n return dragState;\n}\n\nfunction validateDragHandle(data: NodeEventData): boolean {\n if (!(data.e instanceof DragEvent) && !(data.e instanceof TouchEvent))\n return false;\n\n const config = data.targetData.parent.data.config;\n\n if (!config.dragHandle) return true;\n\n const dragHandles = data.targetData.node.el.querySelectorAll(\n config.dragHandle\n );\n\n if (!dragHandles) return false;\n\n const coordinates = eventCoordinates(data.e);\n\n const elFromPoint = config.root.elementFromPoint(\n coordinates.x,\n coordinates.y\n );\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\n return false;\n}\n\nfunction touchstart(data: NodeTouchEventData) {\n if (!validateDragHandle(data)) return;\n\n const touchState = initTouch(data);\n\n handleTouchedNode(data, touchState);\n\n handleLongTouch(data, touchState);\n}\n\nexport function dragstart(data: NodeDragEventData) {\n if (!validateDragHandle(data)) {\n data.e.preventDefault();\n\n return;\n }\n\n const config = data.targetData.parent.data.config;\n\n const dragState = initDrag(data);\n\n const originalZIndex = data.targetData.node.el.style.zIndex;\n\n dragState.originalZIndex = originalZIndex;\n\n data.targetData.node.el.style.zIndex = \"9999\";\n\n dragstartClasses(\n dragState.draggedNode.el,\n config.draggingClass,\n config.dropZoneClass\n );\n}\n\nexport function handleTouchOverNode(e: TouchOverNodeEvent) {\n if (!state) return;\n\n if (e.detail.targetData.parent.el === state.lastParent.el)\n sort(e.detail, state);\n else transfer(e.detail, state);\n}\n\nexport function setupNode(data: SetupNodeData) {\n const config = data.parentData.config;\n\n data.node.draggable = true;\n\n data.nodeData.abortControllers.mainNode = addEvents(data.node, {\n dragstart: nodeEventData(config.handleDragstart),\n dragover: nodeEventData(config.handleDragoverNode),\n dragenter: nodeEventData(config.handleDragenterNode),\n dragleave: nodeEventData(config.handleDragleaveNode),\n dragend: nodeEventData(config.handleEnd),\n touchstart: nodeEventData(config.handleTouchstart),\n touchmove: nodeEventData(config.handleTouchmove),\n touchend: nodeEventData(config.handleEnd),\n touchOverNode: config.handleTouchOverNode,\n });\n\n config.reapplyDragClasses(data.node, data.parentData);\n\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.setupNode?.(data);\n });\n}\n\nexport function setupNodeRemap(data: SetupNodeData) {\n nodes.set(data.node, data.nodeData);\n\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.setupNodeRemap?.(data);\n });\n}\n\nfunction reapplyDragClasses(node: Node, parentData: ParentData) {\n if (!state) return;\n\n const dropZoneClass =\n \"touchedNode\" in state\n ? parentData.config.touchDropZoneClass\n : parentData.config.dropZoneClass;\n\n if (state.draggedNode.el !== node) return;\n\n addClass([node], dropZoneClass, true);\n}\n\nexport function tearDownNodeRemap(data: TearDownNodeData) {\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.tearDownNodeRemap?.(data);\n });\n}\n\nexport function tearDownNode(data: TearDownNodeData) {\n data.parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n plugin(data.parent)?.tearDownNode?.(data);\n });\n\n data.node.draggable = false;\n\n if (data.nodeData?.abortControllers?.mainNode) {\n data.nodeData?.abortControllers?.mainNode.abort();\n }\n}\n\nexport function handleEnd(eventData: NodeEventData) {\n if (!state) return;\n\n end(eventData, state);\n\n resetState();\n}\n\nexport function end(\n _eventData: NodeEventData,\n state: DragState | TouchState\n) {\n document.removeEventListener(\"contextmenu\", preventDefault);\n\n if (\"longTouchTimeout\" in state && state.longTouchTimeout)\n clearTimeout(state.longTouchTimeout);\n\n const config = parents.get(state.initialParent.el)?.config;\n\n const isTouch = \"touchedNode\" in state;\n\n const dropZoneClass = isTouch\n ? config?.touchDropZoneClass\n : config?.dropZoneClass;\n\n if (state.originalZIndex !== undefined)\n state.draggedNode.el.style.zIndex = state.originalZIndex;\n\n addClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass,\n true\n );\n\n removeClass(\n state.draggedNodes.map((x) => x.el),\n dropZoneClass\n );\n\n if (config?.longTouchClass) {\n removeClass(\n state.draggedNodes.map((x) => x.el),\n state.initialParent.data?.config?.longTouchClass\n );\n }\n\n if (\"touchedNode\" in state) state.touchedNode?.remove();\n}\n\nexport function handleTouchstart(eventData: NodeEventData) {\n if (!(eventData.e instanceof TouchEvent)) return;\n\n touchstart({\n e: eventData.e,\n targetData: eventData.targetData,\n });\n}\n\nexport function initTouch(data: NodeTouchEventData): TouchState {\n data.e.stopPropagation();\n\n const clonedNode = data.targetData.node.el.cloneNode(true) as HTMLElement;\n\n const rect = data.targetData.node.el.getBoundingClientRect();\n\n const touchState = setTouchState(setDragState(dragStateProps(data)), {\n coordinates: {\n x: data.e.touches[0].clientX,\n y: data.e.touches[0].clientY,\n },\n scrollParent: getScrollParent(data.targetData.node.el),\n touchStartLeft: data.e.touches[0].clientX - rect.left,\n touchStartTop: data.e.touches[0].clientY - rect.top,\n touchedNode: clonedNode,\n touchMoving: false,\n });\n\n return touchState;\n}\n\nfunction preventDefault(e: Event) {\n e.preventDefault();\n}\n\nexport function handleTouchedNode(\n data: NodeTouchEventData,\n touchState: TouchState\n) {\n touchState.touchedNodeDisplay = touchState.touchedNode.style.display;\n\n const rect = data.targetData.node.el.getBoundingClientRect();\n\n touchState.touchedNode.style.cssText = `\n width: ${rect.width}px;\n position: fixed;\n pointer-events: none;\n top: -9999px;\n z-index: 999999;\n display: none;\n `;\n\n document.body.append(touchState.touchedNode);\n\n copyNodeStyle(data.targetData.node.el, touchState.touchedNode as Node);\n\n touchState.touchedNode.style.display = \"none\";\n\n document.addEventListener(\"contextmenu\", preventDefault);\n}\n\nexport function handleLongTouch(\n data: NodeEventData,\n touchState: TouchState\n) {\n const config = data.targetData.parent.data.config;\n\n if (!config.longTouch) return;\n\n touchState.longTouchTimeout = setTimeout(() => {\n if (!touchState) return;\n\n touchState.longTouch = true;\n\n if (config.longTouchClass && data.e.cancelable)\n addClass(\n touchState.draggedNodes.map((x) => x.el),\n config.longTouchClass\n );\n\n data.e.preventDefault();\n }, config.longTouchTimeout || 200);\n}\n\nexport function handleTouchmove(eventData: NodeTouchEventData) {\n if (!state || !(\"touchedNode\" in state)) return;\n\n touchmove(eventData, state);\n}\n\nfunction touchmoveClasses(\n touchState: TouchState,\n config: ParentConfig\n) {\n if (config.longTouchClass)\n removeClass(\n touchState.draggedNodes.map((x) => x.el),\n config?.longTouchClass\n );\n\n if (config.touchDraggingClass)\n addClass([touchState.touchedNode], config.touchDraggingClass);\n\n if (config.touchDropZoneClass)\n addClass(\n touchState.draggedNodes.map((x) => x.el),\n config.touchDropZoneClass\n );\n}\n\nfunction getScrollData(\n state?: DragState | TouchState\n): ScrollData | void {\n if (!state || !state.scrollParent) return;\n\n const { x, y, width, height } = state.scrollParent.getBoundingClientRect();\n\n const {\n x: xThresh,\n y: yThresh,\n scrollOutside,\n } = state.lastParent.data.config.scrollBehavior;\n\n return {\n state,\n xThresh,\n yThresh,\n scrollOutside,\n scrollParent: state.scrollParent,\n x,\n y,\n width,\n height,\n };\n}\n\nfunction shouldScroll(\n direction: string\n): DragState | TouchState | void {\n const data = getScrollData(state);\n\n if (!data) return;\n\n switch (direction) {\n case \"down\":\n return shouldScrollDown(data.state, data);\n\n case \"up\":\n return shouldScrollUp(data.state, data);\n\n case \"right\":\n return shouldScrollRight(data.state, data);\n\n case \"left\":\n return shouldScrollLeft(data.state, data);\n }\n}\n\nfunction shouldScrollRight(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientWidth + data.x - state.coordinates.x;\n\n if (!data.scrollOutside && diff < 0) return;\n\n if (\n diff < (1 - data.xThresh) * data.scrollParent.clientWidth &&\n !(\n data.scrollParent.scrollLeft + data.scrollParent.clientWidth >=\n data.scrollParent.scrollWidth\n )\n )\n return state;\n}\n\nfunction shouldScrollLeft(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientWidth + data.x - state.coordinates.x;\n\n if (!data.scrollOutside && diff > data.scrollParent.clientWidth) return;\n\n if (\n diff > data.xThresh * data.scrollParent.clientWidth &&\n data.scrollParent.scrollLeft !== 0\n )\n return state;\n}\n\nfunction shouldScrollUp(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientHeight + data.y - state.coordinates.y;\n\n if (!data.scrollOutside && diff > data.scrollParent.clientHeight) return;\n\n if (\n diff > data.yThresh * data.scrollParent.clientHeight &&\n data.scrollParent.scrollTop !== 0\n )\n return state;\n}\n\nfunction shouldScrollDown(\n state: TouchState | DragState,\n data: ScrollData\n): TouchState | DragState | void {\n const diff = data.scrollParent.clientHeight + data.y - state.coordinates.y;\n\n if (!data.scrollOutside && diff < 0) return;\n\n if (\n diff < (1 - data.yThresh) * data.scrollParent.clientHeight &&\n !(\n data.scrollParent.scrollTop + data.scrollParent.clientHeight >=\n data.scrollParent.scrollHeight\n )\n )\n return state;\n}\n\nfunction moveTouchedNode(\n data: NodeTouchEventData,\n touchState: TouchState\n) {\n touchState.touchMoving = true;\n\n touchState.touchedNode.style.display = touchState.touchedNodeDisplay || \"\";\n\n const { x, y } = eventCoordinates(data.e);\n\n touchState.coordinates.y = y;\n\n touchState.coordinates.x = x;\n\n const touchStartLeft = touchState.touchStartLeft ?? 0;\n\n const touchStartTop = touchState.touchStartTop ?? 0;\n\n touchState.touchedNode.style.left = `${x - touchStartLeft}px`;\n\n touchState.touchedNode.style.top = `${y - touchStartTop}px`;\n\n touchmoveClasses(touchState, data.targetData.parent.data.config);\n}\n\nfunction touchmove(data: NodeTouchEventData, touchState: TouchState) {\n const config = data.targetData.parent.data.config;\n\n if (config.longTouch && !touchState.longTouch) {\n clearTimeout(touchState.longTouchTimeout);\n\n return;\n }\n\n if (data.e.cancelable) data.e.preventDefault();\n\n moveTouchedNode(data, touchState);\n\n handleScroll();\n\n const elFromPoint = getElFromPoint(data);\n\n if (!elFromPoint) return;\n\n const touchMoveEventData = {\n e: data.e,\n targetData: elFromPoint,\n };\n\n if (\"node\" in elFromPoint) {\n elFromPoint.node.el.dispatchEvent(\n new CustomEvent(\"touchOverNode\", {\n detail: touchMoveEventData,\n })\n );\n } else {\n elFromPoint.parent.el.dispatchEvent(\n new CustomEvent(\"touchOverParent\", {\n detail: touchMoveEventData,\n })\n );\n }\n}\n\nfunction handleScroll() {\n for (const direction of Object.keys(scrollConfig)) {\n const [x, y] = scrollConfig[direction];\n\n performScroll(direction, x, y);\n }\n}\n\nfunction performScroll(direction: string, x: number, y: number) {\n const state = shouldScroll(direction);\n\n if (!state) return;\n\n state.scrollParent.scrollBy(x, y);\n\n setTimeout(\n () => {\n performScroll(direction, x, y);\n },\n \"touchedNode\" in state ? 10 : 100\n );\n}\n\nexport function handleDragoverNode(data: NodeDragEventData) {\n if (!state) return;\n\n const { x, y } = eventCoordinates(data.e);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n\n dragoverNode(data, state);\n}\n\nexport function handleDragoverParent(data: ParentEventData) {\n if (!state) return;\n\n const { x, y } = eventCoordinates(data.e as DragEvent);\n\n state.coordinates.y = y;\n\n state.coordinates.x = x;\n\n handleScroll();\n\n transfer(data, state);\n}\n\nexport function handleTouchOverParent(e: TouchOverParentEvent) {\n if (!state) return;\n\n transfer(e.detail, state);\n}\n\nexport function validateTransfer(\n data: ParentEventData,\n state: DragState | TouchState\n) {\n if (data.targetData.parent.el === state.lastParent.el) return false;\n\n const targetConfig = data.targetData.parent.data.config;\n\n if (targetConfig.dropZone === false) return false;\n\n const initialParentConfig = state.initialParent.data.config;\n\n if (targetConfig.accepts) {\n return targetConfig.accepts(\n data.targetData.parent,\n state.initialParent,\n state.lastParent,\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\nfunction handleDragenterNode(\n data: NodeDragEventData,\n _state: DragState\n) {\n data.e.preventDefault();\n}\n\nfunction handleDragleaveNode(\n data: NodeDragEventData,\n _state: DragState\n) {\n data.e.preventDefault();\n}\n\nfunction dragoverNode(\n eventData: NodeDragEventData,\n dragState: DragState\n) {\n eventData.e.preventDefault();\n\n eventData.e.stopPropagation();\n\n eventData.targetData.parent.el === dragState.lastParent?.el\n ? sort(eventData, dragState)\n : transfer(eventData, dragState);\n}\n\nexport function validateSort(\n data: NodeDragEventData | NodeTouchEventData,\n state: DragState | TouchState,\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.lastTargetValue ||\n state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)\n ) {\n state.lastTargetValue = data.targetData.node.data.value;\n }\n\n return false;\n }\n\n if (state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)) {\n state.lastTargetValue = undefined;\n return false;\n }\n\n if (data.targetData.node.data.value === state.lastTargetValue) return false;\n\n if (\n state.preventEnter ||\n data.targetData.parent.el !== state.lastParent?.el ||\n data.targetData.parent.data.config.sortable === false\n )\n 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.lastParent.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\nexport function sort(\n data: NodeDragEventData | NodeTouchEventData,\n state: DragState | TouchState\n) {\n const { x, y } = eventCoordinates(data.e);\n\n if (!validateSort(data, state, x, y)) return;\n\n state.preventEnter = true;\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(state, data);\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 const parent = node.parentNode || state?.lastParent?.el;\n\n if (!nodeData) return;\n\n const parentData = parents.get(parent);\n\n if (!parentData) return;\n\n return {\n node: {\n el: node,\n data: nodeData,\n },\n parent: {\n el: parent,\n data: parentData as 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 e,\n targetData,\n });\n };\n}\n\n// TRANSFER LOGIC:\nexport function performTransfer(\n state: DragState | TouchState,\n data: NodeEventData | ParentEventData\n) {\n const draggedValues = dragValues(state);\n\n const lastParentValues = parentValues(\n state.lastParent.el,\n state.lastParent.data\n ).filter((x: any) => !draggedValues.includes(x));\n\n const targetParentValues = parentValues(\n data.targetData.parent.el,\n data.targetData.parent.data\n );\n\n const reset =\n state.initialParent.el === data.targetData.parent.el &&\n data.targetData.parent.data.config.sortable === false;\n\n let targetIndex: number;\n\n if (\"node\" in data.targetData) {\n if (reset) {\n targetIndex = state.initialIndex;\n } else if (data.targetData.parent.data.config.sortable === false) {\n targetIndex = data.targetData.parent.data.enabledNodes.length;\n } else {\n targetIndex = data.targetData.node.data.index;\n }\n\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\n } else {\n targetIndex = reset\n ? state.initialIndex\n : data.targetData.parent.data.enabledNodes.length;\n\n targetParentValues.splice(targetIndex, 0, ...draggedValues);\n }\n\n setParentValues(state.lastParent.el, state.lastParent.data, lastParentValues);\n\n setParentValues(\n data.targetData.parent.el,\n data.targetData.parent.data,\n targetParentValues\n );\n}\n\n/**\n * Used when the dragged element enters into a parent other than its own.\n *\n * @param eventData\n *\n * @param state\n *\n * @internal\n *\n * @returns void\n */\nexport function transfer(\n data: NodeEventData | ParentEventData,\n state: DragState | TouchState\n): void {\n if (!validateTransfer(data, state)) return;\n\n data.targetData.parent.data.config.performTransfer(state, data);\n\n state.lastParent = data.targetData.parent;\n}\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 e,\n targetData,\n });\n };\n}\n"],"mappings":"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","names":["className","events","state","parentValues","x","parentValues","handleEnd","state","dragStateProps","state","handleDragoverNode","handleTouchOverNode","x","dragstart","touchstart","dragoverNode"]} \ No newline at end of file diff --git a/src/plugins/swap/index.ts b/src/plugins/swap/index.ts index c1b9738..2431c9e 100644 --- a/src/plugins/swap/index.ts +++ b/src/plugins/swap/index.ts @@ -4,7 +4,7 @@ import type { DragState, NodeTouchEventData, NodeRecord, - TouchState, + TouchOverNodeEvent, } from "../../types"; import { state, @@ -58,23 +58,24 @@ function handleDragoverNode(data: NodeDragEventData) { dragoverNode(data, state); } -function handleTouchOverNode(data: NodeTouchEventData) { +function handleTouchOverNode(data: TouchOverNodeEvent) { if (!state) return; - const dropZoneClass = data.targetData.parent.data.config.touchDropZoneClass; + const dropZoneClass = + data.detail.targetData.parent.data.config.touchDropZoneClass; removeClass( swapState.draggedOverNodes.map((node) => node.el), dropZoneClass ); - const enabledNodes = data.targetData.parent.data.enabledNodes; + const enabledNodes = data.detail.targetData.parent.data.enabledNodes; if (!enabledNodes) return; swapState.draggedOverNodes = enabledNodes.slice( - data.targetData.node.data.index, - data.targetData.node.data.index + state.draggedNodes.length + data.detail.targetData.node.data.index, + data.detail.targetData.node.data.index + state.draggedNodes.length ); addClass( @@ -83,9 +84,9 @@ function handleTouchOverNode(data: NodeTouchEventData) { true ); - state.lastTargetValue = data.targetData.node.data.value; + state.lastTargetValue = data.detail.targetData.node.data.value; - state.lastParent = data.targetData.parent; + state.lastParent = data.detail.targetData.parent; } function dragoverNode(data: NodeDragEventData, state: DragState) {