{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/plugins/animations/index.ts","../src/plugins/insert/index.ts","../src/plugins/drop-or-swap/index.ts"],"sourcesContent":["import type {\n  DNDPlugin,\n  DragAndDrop,\n  DragState,\n  DragStateProps,\n  Node,\n  NodeData,\n  NodeDragEventData,\n  NodeEventData,\n  NodePointerEventData,\n  NodeRecord,\n  NodeTargetData,\n  NodesData,\n  ParentConfig,\n  ParentData,\n  ParentEventData,\n  ParentTargetData,\n  ParentsData,\n  PointeroverNodeEvent,\n  PointeroverParentEvent,\n  SetupNodeData,\n  TearDownNodeData,\n  BaseDragState,\n  SynthDragState,\n  SynthDragStateProps,\n  ParentRecord,\n  EventHandlers,\n  NodeFromPoint,\n  ParentFromPoint,\n  ParentDragEventData,\n  DragstartEventData,\n} from \"./types\";\n\nimport {\n  pd,\n  sp,\n  on,\n  emit,\n  createEmitter,\n  eq,\n  splitClass,\n  eventCoordinates,\n} from \"./utils\";\n\nexport * from \"./types\";\nexport { animations } from \"./plugins/animations\";\nexport { insert } from \"./plugins/insert\";\nexport { dropOrSwap } from \"./plugins/drop-or-swap\";\n\n/**\n * Check to see if code is running in a browser.\n */\nexport const isBrowser = typeof window !== \"undefined\";\n\n/**\n * Parents or \"lists\" are the containers that nodes or \"draggable items\" can be\n * dragged from and into.\n *\n * @type {WeakMap<HTMLElement, ParentData<unknown>>}\n */\nexport const parents: ParentsData<any> = new WeakMap<\n  HTMLElement,\n  ParentData<unknown>\n>();\n\n/**\n * Nodes are the draggable items and the direct descendants of the parents.\n *\n * @type {WeakMap<Node, NodeData<unknown>>}\n */\nexport const nodes: NodesData<any> = new WeakMap<Node, NodeData<unknown>>();\n\nfunction isMobilePlatform() {\n  if (!isBrowser) return false;\n\n  if (\"userAgentData\" in navigator) {\n    return (navigator.userAgentData as { mobile: boolean }).mobile === true;\n  }\n\n  const ua = navigator.userAgent;\n\n  const isMobileUA = /android|iphone|ipod/i.test(ua);\n\n  const isIpad =\n    /iPad/.test(ua) ||\n    (ua.includes(\"Macintosh\") && navigator.maxTouchPoints > 1);\n\n  return isMobileUA || isIpad;\n}\n\n/**\n * The base drag state.\n *\n * @type {BaseDragState<unknown>}\n */\nconst baseDragState = {\n  affectedNodes: [],\n  coordinates: {\n    x: 0,\n    y: 0,\n  },\n  currentTargetValue: undefined,\n  on,\n  emit,\n  originalZIndex: undefined,\n  pointerSelection: false,\n  preventEnter: false,\n  rootUserSelect: undefined,\n  nodePointerdown: undefined,\n  longPress: false,\n  scrolling: false,\n  longPressTimeout: undefined,\n  remapJustFinished: false,\n  selectedNodes: [],\n  selectedParent: undefined,\n  preventSynthDrag: false,\n  pointerDown: undefined,\n  lastScrollContainerX: null,\n  lastScrollContainerY: null,\n  rootScrollWidth: undefined,\n  rootScrollHeight: undefined,\n  dragItemRect: undefined,\n  windowScrollX: undefined,\n  windowScrollY: undefined,\n  lastScrollDirectionX: undefined,\n  lastScrollDirectionY: undefined,\n  scrollDebounceTimeout: undefined,\n  frameIdX: undefined,\n  frameIdY: undefined,\n};\n\n/**\n * The state of the drag and drop.\n *\n * @type {BaseDragState<unknown>}\n */\nexport let state: BaseDragState<unknown> = baseDragState;\n\n/**\n * Variable to check if the drop has occurred.\n */\nlet dropped = false;\n\n/**\n * Abort controller for the document.\n */\nlet documentController: AbortController | undefined;\n\n/**\n * Timeout for the scroll.\n */\nlet scrollTimeout: ReturnType<typeof setTimeout>;\n\nexport function resetState() {\n  // Clear any existing timeouts to prevent stale references\n  if (state.scrollDebounceTimeout) {\n    clearTimeout(state.scrollDebounceTimeout);\n  }\n\n  if (state.longPressTimeout) {\n    clearTimeout(state.longPressTimeout);\n  }\n\n  // Cancel any animation frames\n  if (state.frameIdX !== undefined) {\n    cancelAnimationFrame(state.frameIdX);\n  }\n\n  if (state.frameIdY !== undefined) {\n    cancelAnimationFrame(state.frameIdY);\n  }\n\n  const baseDragState = {\n    affectedNodes: [],\n    coordinates: {\n      x: 0,\n      y: 0,\n    },\n    on,\n    emit,\n    currentTargetValue: undefined,\n    originalZIndex: undefined,\n    pointerId: undefined,\n    preventEnter: false,\n    remapJustFinished: false,\n    selectedNodes: [],\n    nodePointerdown: undefined,\n    rootUserSelect: undefined,\n    preventSynthDrag: false,\n    scrolling: false,\n    selectedParent: undefined,\n    pointerSelection: false,\n    synthScrollDirection: undefined,\n    draggedNodeDisplay: undefined,\n    synthDragScrolling: false,\n    longPress: false,\n    pointerDown: undefined,\n    longPressTimeout: undefined,\n    lastScrollContainerX: null,\n    lastScrollContainerY: null,\n    rootScrollWidth: undefined,\n    rootScrollHeight: undefined,\n    dragItemRect: undefined,\n    windowScrollX: undefined,\n    windowScrollY: undefined,\n    lastScrollDirectionX: undefined,\n    lastScrollDirectionY: undefined,\n    scrollDebounceTimeout: undefined,\n    frameIdX: undefined,\n    frameIdY: undefined,\n  };\n\n  state = { ...baseDragState } as BaseDragState<unknown>;\n}\n\n/**\n * @param {DragStateProps} dragStateProps - Attributes to update state with.\n *\n * @mutation - Updates state with node values.\n *\n * @returns void\n */\nexport function setDragState<T>(\n  dragStateProps: (SynthDragStateProps & DragStateProps<T>) | DragStateProps<T>\n): DragState<T> | SynthDragState<T> {\n  Object.assign(state, dragStateProps);\n\n  dragStateProps.initialParent.data.emit(\"dragStarted\", state);\n\n  dropped = false;\n\n  state.emit(\"dragStarted\", state);\n\n  return state as DragState<T> | SynthDragState<T>;\n}\n\n/**\n *\n */\nfunction handleRootPointerdown() {\n  if (state.activeState) setActive(state.activeState.parent, undefined, state);\n\n  if (state.selectedState)\n    deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n  state.selectedState = state.activeState = undefined;\n}\n\nfunction handleRootPointerup() {\n  if (state.pointerDown) state.pointerDown.node.el.draggable = true;\n\n  state.pointerDown = undefined;\n\n  if (!isSynthDragState(state)) return;\n\n  const config = state.currentParent.data.config;\n\n  if (isSynthDragState(state)) config.handleEnd(state);\n}\n\n/**\n * Handles the keydown event on the root element.\n *\n * @param {KeyboardEvent} e - The keyboard event.\n */\nfunction handleRootKeydown(e: KeyboardEvent) {\n  if (e.key === \"Escape\") {\n    if (state.selectedState)\n      deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n    if (state.activeState)\n      setActive(state.activeState.parent, undefined, state);\n\n    state.selectedState = state.activeState = undefined;\n  }\n}\n\nfunction handleRootDrop(_e: DragEvent) {\n  if (!isDragState(state)) return;\n\n  dropped = true;\n\n  const handleEnd = state.initialParent.data.config.handleEnd;\n\n  handleEnd(state);\n}\n\nfunction handleRootDragover(e: DragEvent) {\n  if (!isDragState(state)) return;\n\n  pd(e);\n\n  const { x, y } = eventCoordinates(e);\n\n  if (isDragState(state)) {\n    handleSynthScroll({ x, y }, e, state);\n  }\n}\n\nfunction handleRootPointermove(e: PointerEvent) {\n  if (!state.pointerDown || !state.pointerDown.validated) return;\n\n  const config = state.pointerDown.parent.data.config;\n\n  if (e.pointerType === \"mouse\" && !isMobilePlatform()) {\n    return;\n  }\n\n  if (!isSynthDragState(state)) {\n    pd(e);\n\n    if (config.longPress && !state.longPress) {\n      clearTimeout(state.longPressTimeout);\n\n      state.longPress = false;\n\n      return;\n    }\n\n    const nodes = config.draggedNodes(state.pointerDown);\n\n    config.dragstartClasses(state.pointerDown.node, nodes, config, true);\n\n    const rect = state.pointerDown.node.el.getBoundingClientRect();\n\n    const synthDragState = initSynthDrag(\n      state.pointerDown.node,\n      state.pointerDown.parent,\n      e,\n      state,\n      nodes,\n      rect\n    );\n\n    synthMove(e, synthDragState, true);\n  } else if (isSynthDragState(state)) {\n    synthMove(e, state);\n  }\n}\n\n/**\n * Initializes the drag and drop functionality for a given parent.\n *\n * @param {DragAndDrop} dragAndDrop - The drag and drop configuration.\n *\n * @returns void\n */\nexport function dragAndDrop<T>({\n  parent,\n  getValues,\n  setValues,\n  config = {},\n}: DragAndDrop<T>): void {\n  if (!isBrowser) return;\n\n  if (!documentController) {\n    documentController = addEvents(document, {\n      dragover: handleRootDragover,\n      pointerdown: handleRootPointerdown,\n      pointerup: handleRootPointerup,\n      keydown: handleRootKeydown,\n      drop: handleRootDrop,\n      pointermove: handleRootPointermove,\n      pointercancel: nodeEventData(config.handlePointercancel),\n      touchmove: (e: TouchEvent) => {\n        if (isDragState(state) && e.cancelable) pd(e);\n      },\n      contextmenu: (e: Event) => {\n        if (isSynthDragState(state)) pd(e);\n      },\n    });\n  }\n\n  tearDown(parent);\n\n  const [emit, on] = createEmitter();\n\n  const parentData: ParentData<T> = {\n    getValues,\n    setValues,\n    config: {\n      dragDropEffect: config.dragDropEffect ?? \"move\",\n      dragEffectAllowed: config.dragEffectAllowed ?? \"move\",\n      draggedNodes,\n      dragstartClasses,\n      handleNodeKeydown,\n      handleDragstart,\n      handleNodeDragover,\n      handleParentDragover,\n      handleNodeDrop,\n      handleNodeFocus,\n      handleNodeBlur,\n      handlePointercancel,\n      handleEnd,\n      handleDragend,\n      handleParentFocus,\n      handleNodePointerup,\n      handleNodePointerover,\n      handleParentPointerover,\n      handleParentScroll,\n      handleNodePointerdown,\n      handleNodeDragenter,\n      handleNodeDragleave,\n      handleParentDrop,\n      multiDrag: config.multiDrag ?? false,\n      nativeDrag: config.nativeDrag ?? true,\n      performSort,\n      performTransfer,\n      root: config.root ?? document,\n      setupNode,\n      setupNodeRemap,\n      reapplyDragClasses,\n      tearDownNode,\n      tearDownNodeRemap,\n      remapFinished,\n      threshold: {\n        horizontal: 0,\n        vertical: 0,\n      },\n      ...config,\n    },\n    enabledNodes: [],\n    abortControllers: {},\n    privateClasses: [],\n    on,\n    emit,\n  };\n\n  const nodesObserver = new MutationObserver(nodesMutated);\n\n  nodesObserver.observe(parent, { childList: true });\n\n  parents.set(parent, parentData);\n\n  config.plugins?.forEach((plugin) => {\n    plugin(parent)?.tearDown?.();\n  });\n\n  config.plugins?.forEach((plugin) => {\n    plugin(parent)?.tearDown?.();\n  });\n\n  config.plugins?.forEach((plugin: DNDPlugin) => {\n    plugin(parent)?.setup?.();\n  });\n\n  setup(parent, parentData);\n\n  remapNodes(parent, true);\n}\n\nexport function dragStateProps<T>(\n  node: NodeRecord<T>,\n  parent: ParentRecord<T>,\n  e: PointerEvent | DragEvent,\n  draggedNodes: Array<NodeRecord<T>>,\n  offsetX?: number,\n  offsetY?: number\n): DragStateProps<T> {\n  const { x, y } = eventCoordinates(e);\n\n  const rect = node.el.getBoundingClientRect();\n\n  return {\n    affectedNodes: [],\n    ascendingDirection: false,\n    clonedDraggedEls: [],\n    coordinates: {\n      x,\n      y,\n    },\n    draggedNode: {\n      el: node.el,\n      data: node.data,\n    },\n    draggedNodes,\n    incomingDirection: undefined,\n    initialIndex: node.data.index,\n    initialParent: {\n      el: parent.el,\n      data: parent.data,\n    },\n    currentParent: {\n      el: parent.el,\n      data: parent.data,\n    },\n    longPress: parent.data.config.longPress ?? false,\n    longPressTimeout: undefined,\n    currentTargetValue: node.data.value,\n    scrollEls: [],\n    startLeft: offsetX ? offsetX : x - (rect?.left ?? 0),\n    startTop: offsetY ? offsetY : y - (rect?.top ?? 0),\n    targetIndex: node.data.index,\n    transferred: false,\n  };\n}\n\n/**\n * Perform the sort of the nodes.\n *\n * @param {ParentRecord<T>} parent - The parent record.\n * @param {Array<NodeRecord<T>>} draggedNodes - The dragged nodes.\n * @param {Array<NodeRecord<T>>} targetNodes - The target nodes.\n *\n * @returns void\n */\nexport function performSort<T>({\n  parent,\n  draggedNodes,\n  targetNodes,\n}: {\n  parent: ParentRecord<T>;\n  draggedNodes: Array<NodeRecord<T>>;\n  targetNodes: Array<NodeRecord<T>>;\n}) {\n  remapNodes(parent.el);\n\n  const draggedValues = draggedNodes.map((x) => x.data.value);\n\n  const targetParentValues = parentValues(parent.el, parent.data);\n\n  const originalIndex = draggedNodes[0].data.index;\n\n  const enabledNodes = [...parent.data.enabledNodes];\n\n  const newParentValues = [\n    ...targetParentValues.filter((x) => !draggedValues.some((y) => eq(x, y))),\n  ];\n  newParentValues.splice(targetNodes[0].data.index, 0, ...draggedValues);\n\n  if (\"draggedNode\" in state)\n    state.currentTargetValue = targetNodes[0].data.value;\n\n  setParentValues(parent.el, parent.data, [...newParentValues]);\n\n  if (parent.data.config.onSort) {\n    parent.data.config.onSort({\n      parent: {\n        el: parent.el,\n        data: parent.data,\n      } as ParentRecord<unknown>,\n      previousValues: [...targetParentValues],\n      previousNodes: [...enabledNodes],\n      nodes: [...parent.data.enabledNodes],\n      values: [...newParentValues],\n      draggedNodes: draggedNodes,\n      previousPosition: originalIndex,\n      position: targetNodes[0].data.index,\n      targetNodes,\n      state,\n    });\n  }\n}\n\n/**\n * This function sets the active node as well as removing any classes or\n * attribute set.\n *\n * @param {ParentEventData} data - The parent event data.\n * @param {NodeRecord} newActiveNode - The new active node.\n * @param {BaseDragState} state - The current drag state.\n */\nfunction setActive<T>(\n  parent: ParentRecord<T>,\n  newActiveNode: NodeRecord<T> | undefined,\n  state: BaseDragState<T>\n) {\n  if (!newActiveNode) {\n    state.activeState = undefined;\n\n    return;\n  }\n\n  state.activeState = {\n    node: newActiveNode,\n    parent,\n  };\n}\n\n/**\n * This function deselects the nodes. This will clean the prior selected state\n * as well as removing any classes or attributes set.\n *\n * @param {Array<NodeRecord<T>>} nodes - The nodes to deselect.\n * @param {ParentRecord<T>} parent - The parent record.\n * @param {BaseDragState<T>} state - The current drag state.\n */\nfunction deselect<T>(\n  nodes: Array<NodeRecord<T>>,\n  parent: ParentRecord<T>,\n  state: BaseDragState<T>\n) {\n  const selectedClass = parent.data.config.selectedClass;\n\n  if (!state.selectedState) return;\n\n  const iterativeNodes = Array.from(nodes);\n\n  removeClass(\n    nodes.map((x) => x.el),\n    selectedClass\n  );\n\n  for (const node of iterativeNodes) {\n    node.el.setAttribute(\"aria-selected\", \"false\");\n\n    const index = state.selectedState.nodes.findIndex((x) => x.el === node.el);\n\n    if (index === -1) continue;\n\n    state.selectedState.nodes.splice(index, 1);\n  }\n}\n\n/**\n * This function sets the selected nodes. This will clean the prior selected\n * state as well as removing any classes or attributes set.\n *\n * @param {ParentRecord<T>} parent - The parent record.\n * @param {Array<NodeRecord<T>>} selectedNodes - The nodes to select.\n * @param {NodeRecord<T> | undefined} newActiveNode - The new active node.\n * @param {BaseDragState<T>} state - The current drag state.\n * @param {boolean} pointerdown - Whether the pointerdown event was triggered.\n */\nfunction setSelected<T>(\n  parent: ParentRecord<T>,\n  selectedNodes: Array<NodeRecord<T>>,\n  newActiveNode: NodeRecord<T> | undefined,\n  state: BaseDragState<T>,\n  pointerdown = false\n) {\n  state.pointerSelection = pointerdown;\n\n  for (const node of selectedNodes) {\n    node.el.setAttribute(\"aria-selected\", \"true\");\n\n    addNodeClass([node.el], parent.data.config.selectedClass, true);\n  }\n\n  state.selectedState = {\n    nodes: selectedNodes,\n    parent,\n  };\n\n  setActive(parent, newActiveNode, state);\n}\n\n/**\n * Handle the parent focus event.\n *\n * @param {ParentEventData<T>} data - The parent event data.\n * @param {BaseDragState<T> | DragState<T> | SynthDragState<T>} state - The drag state.\n *\n * @returns void\n */\nexport function handleParentFocus<T>(\n  data: ParentEventData<T>,\n  state: BaseDragState<T> | DragState<T> | SynthDragState<T>\n) {\n  const firstEnabledNode = data.targetData.parent.data.enabledNodes[0];\n\n  if (!firstEnabledNode) return;\n\n  if (\n    state.selectedState &&\n    state.selectedState.parent.el !== data.targetData.parent.el\n  ) {\n    setActive(data.targetData.parent, firstEnabledNode, state);\n  } else if (!state.selectedState) {\n    setActive(data.targetData.parent, firstEnabledNode, state);\n  }\n}\n\n/**\n * Perform the transfer of the nodes.\n *\n * @param data - The transfer data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function performTransfer<T>({\n  currentParent,\n  targetParent,\n  initialParent,\n  draggedNodes,\n  initialIndex,\n  targetNodes,\n  state,\n}: {\n  currentParent: ParentRecord<T>;\n  targetParent: ParentRecord<T>;\n  initialParent: ParentRecord<T>;\n  draggedNodes: Array<NodeRecord<T>>;\n  initialIndex: number;\n  state: BaseDragState<T> | DragState<T> | SynthDragState<T>;\n  targetNodes: Array<NodeRecord<T>>;\n}) {\n  remapNodes(initialParent.el);\n\n  const draggedValues = draggedNodes.map((x) => x.data.value);\n\n  const currentParentValues = [\n    ...parentValues(currentParent.el, currentParent.data).filter(\n      (x) => !draggedValues.some((y) => eq(x, y))\n    ),\n  ];\n\n  const targetParentValues = parentValues(targetParent.el, targetParent.data);\n\n  const reset =\n    initialParent.el === targetParent.el &&\n    targetParent.data.config.sortable === false;\n\n  let targetIndex: number;\n\n  if (targetNodes.length) {\n    if (reset) {\n      targetIndex = initialIndex;\n    } else if (targetParent.data.config.sortable === false) {\n      targetIndex = targetParent.data.enabledNodes.length;\n    } else {\n      targetIndex = targetNodes[0].data.index;\n    }\n\n    targetParentValues.splice(targetIndex, 0, ...draggedValues);\n  } else {\n    targetIndex = reset ? initialIndex : targetParent.data.enabledNodes.length;\n\n    targetParentValues.splice(targetIndex, 0, ...draggedValues);\n  }\n\n  setParentValues(currentParent.el, currentParent.data, currentParentValues);\n\n  setParentValues(targetParent.el, targetParent.data, targetParentValues);\n\n  if (targetParent.data.config.onTransfer) {\n    targetParent.data.config.onTransfer({\n      sourceParent: currentParent,\n      targetParent,\n      initialParent,\n      draggedNodes,\n      targetIndex,\n      state,\n      targetNodes,\n    });\n  }\n\n  if (currentParent.data.config.onTransfer) {\n    currentParent.data.config.onTransfer({\n      sourceParent: currentParent,\n      targetParent,\n      initialParent,\n      draggedNodes,\n      targetIndex,\n      state,\n      targetNodes: targetNodes ? targetNodes : [],\n    });\n  }\n}\n\n/**\n * Get the values of the parent.\n *\n * @param parent - The parent element.\n * @param parentData - The parent data.\n *\n * @returns The values of the parent.\n */\nexport function parentValues<T>(\n  parent: HTMLElement,\n  parentData: ParentData<T>\n): Array<T> {\n  return [...parentData.getValues(parent)];\n}\n\n/**\n * Set the values of the parent.\n *\n * @param parent - The parent element.\n * @param parentData - The parent data.\n * @param values - The values to set.\n *\n * @returns void\n */\nexport function setParentValues<T>(\n  parent: HTMLElement,\n  parentData: ParentData<T>,\n  values: Array<any>\n): void {\n  parentData.setValues(values, parent);\n}\n\n/**\n * Get the values of the dragged nodes.\n *\n * @param state - The drag state.\n *\n * @returns The values of the dragged nodes.\n */\nexport function dragValues<T>(state: DragState<T>): Array<T> {\n  return [...state.draggedNodes.map((x) => x.data.value)];\n}\n\n/**\n * Utility function to update parent config.\n *\n * @param parent - The parent element.\n * @param config - The config to update.\n *\n * @returns void\n */\nexport function updateConfig<T>(\n  parent: HTMLElement,\n  config: Partial<ParentConfig<T>>\n) {\n  const parentData = parents.get(parent);\n\n  if (!parentData) return;\n\n  parents.set(parent, {\n    ...parentData,\n    config: { ...parentData.config, ...config },\n  });\n\n  dragAndDrop({\n    parent,\n    getValues: parentData.getValues,\n    setValues: parentData.setValues,\n    config,\n  });\n}\n\n/**\n * Handle the parent drop event.\n *\n * @param data - The parent event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleParentDrop<T>(\n  data: ParentEventData<T>,\n  state: DragState<T>\n) {\n  sp(data.e);\n\n  dropped = true;\n\n  const handleEnd = state.initialParent.data.config.handleEnd;\n\n  handleEnd(state);\n}\n\n/**\n * Tear down the parent.\n *\n * @param parent - The parent element.\n *\n * @returns void\n */\nexport function tearDown(parent: HTMLElement) {\n  const parentData = parents.get(parent);\n\n  if (!parentData) return;\n\n  if (parentData.abortControllers.mainParent)\n    parentData.abortControllers.mainParent.abort();\n}\n\n/**\n * Check if the state is a drag state.\n *\n * @param state - The state to check.\n *\n * @returns Whether the state is a drag state.\n */\nexport function isDragState<T>(\n  state: BaseDragState<T>\n): state is DragState<T> | SynthDragState<T> {\n  return \"draggedNode\" in state && !!state.draggedNode;\n}\n\n/**\n * Check if the state is a synth drag state.\n *\n * @param state - The state to check.\n *\n * @returns Whether the state is a synth drag state.\n */\nexport function isSynthDragState<T>(\n  state: BaseDragState<T>\n): state is SynthDragState<T> {\n  return \"synthDragging\" in state && !!state.synthDragging;\n}\n\n/**\n * Setup the parent.\n *\n * @param parent - The parent element.\n * @param parentData - The parent data.\n *\n * @returns void\n */\nfunction setup<T>(parent: HTMLElement, parentData: ParentData<T>): void {\n  parentData.abortControllers.mainParent = addEvents(parent, {\n    dragover: parentEventData(parentData.config.handleParentDragover),\n    handleParentPointerover: parentData.config.handleParentPointerover,\n    scroll: parentEventData(parentData.config.handleParentScroll),\n    drop: parentEventData(parentData.config.handleParentDrop),\n    hasNestedParent: (e: CustomEvent) => {\n      const parent = parents.get(e.target as HTMLElement);\n\n      if (!parent) return;\n\n      parent.nestedParent = e.detail.parent;\n    },\n    focus: parentEventData(parentData.config.handleParentFocus),\n  });\n\n  if (\n    parentData.config.externalDragHandle &&\n    parentData.config.externalDragHandle.el &&\n    parentData.config.externalDragHandle.callback\n  ) {\n    parentData.abortControllers.externalDragHandle = addEvents(\n      parentData.config.externalDragHandle.el,\n      {\n        pointerdown: (_e: PointerEvent) => {\n          if (\n            !parentData.config.externalDragHandle ||\n            !parentData.config.externalDragHandle.callback\n          )\n            return;\n\n          const draggableItem = parentData.config.externalDragHandle.callback();\n\n          if (!isNode(draggableItem)) {\n            console.warn(\n              \"No draggable item found from external drag handle callback\"\n            );\n\n            return;\n          }\n\n          const nodeData = nodes.get(draggableItem);\n\n          if (!nodeData) return;\n\n          const parentNode = draggableItem.parentNode;\n\n          if (!(parentNode instanceof HTMLElement)) return;\n\n          const parent = parents.get(parentNode);\n\n          if (!parent) return;\n\n          state.pointerDown = {\n            parent: {\n              el: parentNode,\n              data: parent,\n            },\n            node: {\n              el: draggableItem,\n              data: nodeData,\n            },\n            validated: true,\n          };\n\n          draggableItem.draggable = true;\n        },\n      }\n    );\n  }\n}\n\n/**\n * Set the attributes of the element.\n *\n * @param el - The element.\n * @param attrs - The attributes to set.\n *\n * @returns void\n */\nexport function setAttrs(el: HTMLElement, attrs: Record<string, string>) {\n  for (const key in attrs) el.setAttribute(key, attrs[key]);\n}\n\n/**\n * Setup the node.\n *\n * @param data - The setup node data.\n *\n * @returns void\n */\nexport function setupNode<T>(data: SetupNodeData<T>) {\n  const config = data.parent.data.config;\n\n  data.node.data.abortControllers.mainNode = addEvents(data.node.el, {\n    keydown: nodeEventData(config.handleNodeKeydown),\n    dragstart: nodeEventData(config.handleDragstart),\n    dragover: nodeEventData(config.handleNodeDragover),\n    dragenter: nodeEventData(config.handleNodeDragenter),\n    dragleave: nodeEventData(config.handleNodeDragleave),\n    dragend: nodeEventData(config.handleDragend),\n    drop: nodeEventData(config.handleNodeDrop),\n    focus: nodeEventData(config.handleNodeFocus),\n    blur: nodeEventData(config.handleNodeBlur),\n    pointerup: nodeEventData(config.handleNodePointerup),\n    pointercancel: nodeEventData(config.handlePointercancel),\n    pointerdown: nodeEventData(config.handleNodePointerdown),\n    handleNodePointerover: config.handleNodePointerover,\n    touchmove: (e: TouchEvent) => {\n      if (isDragState(state) && e.cancelable) pd(e);\n    },\n    contextmenu: (e: Event) => {\n      if (isSynthDragState(state)) pd(e);\n    },\n  });\n\n  data.node.el.draggable = true;\n\n  config.reapplyDragClasses(data.node.el, data.parent.data);\n\n  data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\n    plugin(data.parent.el)?.setupNode?.(data);\n  });\n}\n\n/**\n * Setup the node remap.\n *\n * @param data - The setup node data.\n *\n * @returns void\n */\nexport function setupNodeRemap<T>(data: SetupNodeData<T>) {\n  nodes.set(data.node.el, data.node.data);\n\n  data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\n    plugin(data.parent.el)?.setupNodeRemap?.(data);\n  });\n}\n\n/**\n * Reapply the drag classes to the node.\n *\n * @param node - The node.\n * @param parentData - The parent data.\n *\n * @returns void\n */\nfunction reapplyDragClasses<T>(node: Node, parentData: ParentData<T>) {\n  if (!isDragState(state)) return;\n\n  const dropZoneClass = isSynthDragState(state)\n    ? parentData.config.synthDropZoneClass\n    : parentData.config.dropZoneClass;\n\n  if (state.draggedNode.el !== node) return;\n\n  addNodeClass([node], dropZoneClass, true);\n}\n\n/**\n * Tear down the node remap.\n *\n * @param data - The tear down node data.\n *\n * @returns void\n */\nexport function tearDownNodeRemap<T>(data: TearDownNodeData<T>) {\n  data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\n    plugin(data.parent.el)?.tearDownNodeRemap?.(data);\n  });\n}\n\n/**\n * Tear down the node.\n *\n * @param data - The tear down node data.\n *\n * @returns void\n */\nexport function tearDownNode<T>(data: TearDownNodeData<T>) {\n  data.parent.data.config.plugins?.forEach((plugin: DNDPlugin) => {\n    plugin(data.parent.el)?.tearDownNode?.(data);\n  });\n\n  data.node.el.draggable = false;\n\n  if (data.node.data?.abortControllers?.mainNode)\n    data.node.data?.abortControllers?.mainNode.abort();\n}\n\n/**\n * Called when the nodes of a given parent element are mutated.\n *\n * @param mutationList - The list of mutations.\n *\n * @returns void\n *\n * @internal\n */\nfunction nodesMutated(mutationList: MutationRecord[]) {\n  // TODO: This could be better, but using it as a way to ignore comments and text\n  if (\n    mutationList.length === 1 &&\n    mutationList[0].addedNodes.length === 1 &&\n    !(mutationList[0].addedNodes[0] instanceof HTMLElement)\n  )\n    return;\n\n  const parentEl = mutationList[0].target;\n\n  if (!(parentEl instanceof HTMLElement)) return;\n\n  const parentData = parents.get(parentEl);\n\n  if (!parentData) return;\n\n  remapNodes(parentEl);\n}\n\n/**\n * Remaps the data of the parent element's children.\n *\n * @param parent - The parent element.\n *\n * @returns void\n *\n * @internal\n */\nexport function remapNodes<T>(parent: HTMLElement, force?: boolean) {\n  const parentData = parents.get(parent);\n\n  if (!parentData) return;\n\n  parentData.privateClasses = Array.from(parent.classList);\n\n  const enabledNodes: Array<Node> = [];\n\n  const config = parentData.config;\n\n  for (let x = 0; x < parent.children.length; x++) {\n    const node = parent.children[x];\n\n    if (!isNode(node) || node.id === \"dnd-dragged-node-clone\") continue;\n\n    const nodeData = nodes.get(node);\n\n    // Only tear down the node if we have explicitly called dragAndDrop\n    if (force || !nodeData)\n      config.tearDownNode({\n        parent: {\n          el: parent,\n          data: parentData,\n        },\n        node: {\n          el: node,\n          data: nodeData,\n        },\n      });\n\n    if (config.disabled) continue;\n\n    if (!config.draggable || (config.draggable && config.draggable(node))) {\n      enabledNodes.push(node);\n    }\n  }\n\n  if (\n    enabledNodes.length !== parentData.getValues(parent).length &&\n    !config.disabled\n  ) {\n    console.warn(\n      \"The number of draggable items defined in the parent element does not match the number of values. This may cause unexpected behavior.\"\n    );\n\n    return;\n  }\n\n  const values = parentData.getValues(parent);\n\n  const enabledNodeRecords: Array<NodeRecord<T>> = [];\n\n  for (let x = 0; x < enabledNodes.length; x++) {\n    const node = enabledNodes[x];\n\n    const prevNodeData = nodes.get(node);\n\n    if (config.draggableValue && !config.draggableValue(values[x])) continue;\n\n    const nodeData = Object.assign(\n      prevNodeData ?? {\n        privateClasses: [],\n        abortControllers: {},\n      },\n      {\n        value: values[x],\n        index: x,\n      }\n    );\n\n    if (\n      !isDragState(state) &&\n      state.activeState &&\n      eq(state.activeState.node.data.value, nodeData.value)\n    ) {\n      setActive(\n        {\n          data: parentData,\n          el: parent,\n        },\n        {\n          el: node,\n          data: nodeData,\n        },\n        state\n      );\n    }\n\n    if (\n      isDragState(state) &&\n      eq(state.draggedNode.data.value, nodeData.value)\n    ) {\n      state.draggedNode.data = nodeData;\n\n      state.draggedNode.el = node;\n\n      const draggedNode = state.draggedNodes.find(\n        (x) => x.data.value === nodeData.value\n      );\n\n      if (draggedNode) draggedNode.el = node;\n    }\n\n    enabledNodeRecords.push({\n      el: node,\n      data: nodeData,\n    });\n\n    if (force || !prevNodeData)\n      config.setupNode({\n        parent: {\n          el: parent,\n          data: parentData,\n        },\n        node: {\n          el: node,\n          data: nodeData,\n        },\n      });\n\n    setupNodeRemap({\n      parent: {\n        el: parent,\n        data: parentData,\n      },\n      node: {\n        el: node,\n        data: nodeData,\n      },\n    });\n  }\n\n  parents.set(parent, { ...parentData, enabledNodes: enabledNodeRecords });\n\n  config.remapFinished(parentData);\n\n  parentData.config.plugins?.forEach((plugin: DNDPlugin) => {\n    plugin(parent)?.remapFinished?.();\n  });\n}\n\n/**\n * Set the remap just finished flag.\n *\n * @returns void\n */\nexport function remapFinished() {\n  state.remapJustFinished = true;\n\n  if (\"draggedNode\" in state) state.affectedNodes = [];\n}\n\n/**\n * Validate the drag start.\n *\n * @param data - The node event data.\n *\n * @returns Whether the drag start is valid.\n */\nexport function validateDragstart(data: NodeEventData<any>): boolean {\n  return !!data.targetData.parent.data.config.nativeDrag;\n}\n\n/**\n * Get the dragged nodes.\n *\n * @param pointerDown - The pointer down data.\n *\n * @returns The dragged nodes.\n */\nfunction draggedNodes<T>(pointerDown: {\n  parent: ParentRecord<T>;\n  node: NodeRecord<T>;\n}): Array<NodeRecord<T>> {\n  if (!pointerDown.parent.data.config.multiDrag) {\n    return [pointerDown.node];\n  } else if (state.selectedState) {\n    return [\n      pointerDown.node,\n      ...(state.selectedState?.nodes.filter(\n        (x) => x.el !== pointerDown.node.el\n      ) as Array<NodeRecord<T>>),\n    ];\n  }\n\n  return [];\n}\n\n/**\n * Handle the parent scroll.\n *\n * @param data - The parent event data.\n *\n * @returns void\n */\nfunction handleParentScroll<T>(_data: ParentEventData<T>) {\n  if (!isDragState(state)) return;\n\n  state.emit(\"scrollStarted\", state);\n\n  if (isSynthDragState(state)) return;\n\n  state.preventEnter = true;\n\n  if (scrollTimeout) clearTimeout(scrollTimeout);\n\n  scrollTimeout = setTimeout(() => {\n    state.preventEnter = false;\n\n    state.emit(\"scrollEnded\", state);\n  }, 100);\n}\n\n/**\n * Responsible for assigning dragstart classes to the dragged nodes.\n */\nexport function handleDragstart<T>(\n  data: NodeDragEventData<T>,\n  _state: BaseDragState<T>\n) {\n  const config = data.targetData.parent.data.config;\n\n  if (\n    !config.nativeDrag ||\n    !validateDragstart(data) ||\n    !validateDragHandle({\n      x: data.e.clientX,\n      y: data.e.clientY,\n      node: data.targetData.node,\n      config,\n    })\n  ) {\n    pd(data.e);\n\n    return;\n  }\n\n  let nodes = config.draggedNodes({\n    parent: data.targetData.parent,\n    node: data.targetData.node,\n  });\n\n  // On Safari, pointerdown can sometimes not fire before the dragstart event.\n  if (nodes.length === 0) {\n    nodes = [data.targetData.node];\n  }\n\n  config.dragstartClasses(data.targetData.node, nodes, config);\n\n  const dragState = initDrag(data, nodes);\n\n  if (config.onDragstart) {\n    const dragstartData: DragstartEventData<T> = {\n      parent: data.targetData.parent,\n      values: parentValues(\n        data.targetData.parent.el,\n        data.targetData.parent.data\n      ),\n      draggedNode: dragState.draggedNode,\n      draggedNodes: dragState.draggedNodes,\n      position: dragState.initialIndex,\n      state: dragState,\n    };\n    config.onDragstart(dragstartData);\n  }\n}\n\nexport function handleNodePointerdown<T>(\n  data: NodePointerEventData<T>,\n  state: BaseDragState<T>\n) {\n  sp(data.e);\n\n  state.pointerDown = {\n    parent: data.targetData.parent,\n    node: data.targetData.node,\n    validated: false,\n  };\n\n  if (\n    !validateDragHandle({\n      x: data.e.clientX,\n      y: data.e.clientY,\n      node: data.targetData.node,\n      config: data.targetData.parent.data.config,\n    })\n  )\n    return;\n\n  state.pointerDown.validated = true;\n\n  handleLongPress(data, state, data.targetData.node);\n\n  const parentData = data.targetData.parent.data;\n\n  let selectedNodes = [data.targetData.node];\n\n  const commandKey = data.e.ctrlKey || data.e.metaKey;\n\n  const shiftKey = data.e.shiftKey;\n\n  const targetNode = data.targetData.node;\n\n  if (commandKey && parentData.config.multiDrag) {\n    if (state.selectedState) {\n      const idx = state.selectedState.nodes.findIndex(\n        (x) => x.el === targetNode.el\n      );\n\n      if (idx === -1) {\n        selectedNodes = [...state.selectedState.nodes, targetNode];\n      } else {\n        selectedNodes = state.selectedState.nodes.filter(\n          (x) => x.el !== targetNode.el\n        );\n      }\n    } else {\n      selectedNodes = [targetNode];\n    }\n\n    setSelected(\n      data.targetData.parent,\n      selectedNodes,\n      data.targetData.node,\n      state,\n      true\n    );\n\n    return;\n  }\n\n  if (shiftKey && parentData.config.multiDrag) {\n    const nodes = data.targetData.parent.data.enabledNodes;\n\n    if (state.selectedState && state.activeState) {\n      if (state.selectedState.parent.el !== data.targetData.parent.el) {\n        deselect(state.selectedState.nodes, state.selectedState.parent, state);\n\n        state.selectedState = undefined;\n\n        for (let x = 0; x <= targetNode.data.index; x++)\n          selectedNodes.push(nodes[x]);\n      } else {\n        const [minIndex, maxIndex] =\n          state.activeState.node.data.index < data.targetData.node.data.index\n            ? [\n                state.activeState.node.data.index,\n                data.targetData.node.data.index,\n              ]\n            : [\n                data.targetData.node.data.index,\n                state.activeState.node.data.index,\n              ];\n\n        selectedNodes = nodes.slice(minIndex, maxIndex + 1);\n      }\n    } else {\n      for (let x = 0; x <= targetNode.data.index; x++)\n        selectedNodes.push(nodes[x]);\n    }\n\n    setSelected(\n      data.targetData.parent,\n      selectedNodes,\n      data.targetData.node,\n      state,\n      true\n    );\n\n    return;\n  }\n\n  if (state.selectedState?.nodes?.length) {\n    const idx = state.selectedState.nodes.findIndex(\n      (x) => x.el === data.targetData.node.el\n    );\n\n    if (idx === -1) {\n      if (state.selectedState.parent.el !== data.targetData.parent.el) {\n        deselect(state.selectedState.nodes, data.targetData.parent, state);\n      } else if (parentData.config.multiDrag && isMobilePlatform()) {\n        selectedNodes.push(...state.selectedState.nodes);\n      } else {\n        deselect(state.selectedState.nodes, data.targetData.parent, state);\n      }\n\n      setSelected(\n        data.targetData.parent,\n        selectedNodes,\n        data.targetData.node,\n        state,\n        true\n      );\n    }\n  } else {\n    setSelected(\n      data.targetData.parent,\n      [data.targetData.node],\n      data.targetData.node,\n      state,\n      true\n    );\n  }\n}\n\n/**\n * Add dragstart classes to the nodes.\n *\n * @param node - The node.\n * @param nodes - The nodes.\n * @param config - The parent config.\n * @param isSynth - Whether the drag is synthetic.\n *\n * @returns void\n */\nexport function dragstartClasses<T>(\n  _node: NodeRecord<T>,\n  nodes: Array<NodeRecord<T>>,\n  config: ParentConfig<T>,\n  isSynth = false\n) {\n  addNodeClass(\n    nodes.map((x) => x.el),\n    isSynth ? config.synthDraggingClass : config.draggingClass\n  );\n\n  setTimeout(() => {\n    removeClass(\n      nodes.map((x) => x.el),\n      isSynth ? config.synthDraggingClass : config.draggingClass\n    );\n\n    addNodeClass(\n      nodes.map((x) => x.el),\n      isSynth ? config.synthDragPlaceholderClass : config.dragPlaceholderClass\n    );\n\n    addNodeClass(\n      nodes.map((x) => x.el),\n      isSynth ? config.synthDropZoneClass : config.dropZoneClass\n    );\n\n    removeClass(\n      nodes.map((x) => x.el),\n      config.selectedClass\n    );\n  });\n}\n\nexport function initDrag<T>(\n  data: NodeDragEventData<T>,\n  draggedNodes: Array<NodeRecord<T>>\n): DragState<T> {\n  sp(data.e);\n\n  const dragState = setDragState(\n    dragStateProps(\n      data.targetData.node,\n      data.targetData.parent,\n      data.e,\n      draggedNodes\n    )\n  );\n\n  if (data.e.dataTransfer) {\n    const config = data.targetData.parent.data.config;\n\n    data.e.dataTransfer.dropEffect = config.dragDropEffect;\n    data.e.dataTransfer.effectAllowed = config.dragEffectAllowed;\n\n    let dragImage: HTMLElement | undefined;\n\n    data.e.dataTransfer.setData(\"text/plain\", \"\");\n\n    if (config.dragImage) {\n      dragImage = config.dragImage(data, draggedNodes);\n    } else {\n      if (!config.multiDrag || draggedNodes.length === 1) {\n        data.targetData.node.el.style.zIndex = \"9999\";\n        data.targetData.node.el.style.boxSizing = \"border-box\";\n\n        data.e.dataTransfer.setDragImage(\n          data.targetData.node.el,\n          data.e.offsetX,\n          data.e.offsetY\n        );\n\n        dragState.originalZIndex = data.targetData.node.el.style.zIndex;\n\n        return dragState;\n      } else {\n        const wrapper = document.createElement(\"div\");\n\n        wrapper.setAttribute(\"id\", \"dnd-dragged-node-clone\");\n\n        wrapper.setAttribute(\"popover\", \"manual\");\n\n        for (const node of draggedNodes) {\n          const clone = node.el.cloneNode(true) as HTMLElement;\n\n          clone.id = node.el.id + \"-clone\";\n\n          clone.style.pointerEvents = \"none\";\n\n          wrapper.appendChild(clone);\n        }\n\n        const { width } = draggedNodes[0].el.getBoundingClientRect();\n\n        Object.assign(wrapper.style, {\n          display: \"flex\",\n          flexDirection: \"column\",\n          width: `${width}px`,\n          position: \"absolute\",\n          pointerEvents: \"none\",\n          zIndex: \"9999\",\n          left: \"-9999px\",\n          boxSizing: \"border-box\",\n          background: \"transparent\",\n          overflow: \"hidden\",\n        });\n\n        data.targetData.parent.el.appendChild(wrapper);\n\n        wrapper.showPopover();\n\n        wrapper.getBoundingClientRect(); // ← forces layout\n\n        dragImage = wrapper;\n\n        data.e.dataTransfer.setDragImage(\n          dragImage,\n          data.e.offsetX,\n          data.e.offsetY\n        );\n      }\n    }\n\n    setTimeout(() => {\n      dragImage?.remove();\n    });\n  }\n\n  return dragState;\n}\n\nexport function validateDragHandle<T>({\n  x,\n  y,\n  node,\n  config,\n}: {\n  x: number;\n  y: number;\n  node: NodeRecord<T>;\n  config: ParentConfig<T>;\n}): boolean {\n  if (config.externalDragHandle) return false;\n\n  if (!config.dragHandle) return true;\n\n  const dragHandles = node.el.querySelectorAll(config.dragHandle);\n\n  if (!dragHandles) return false;\n\n  const elFromPoint = config.root.elementFromPoint(x, y);\n\n  if (!elFromPoint) return false;\n\n  for (const handle of Array.from(dragHandles))\n    if (elFromPoint === handle || handle.contains(elFromPoint)) return true;\n\n  return false;\n}\n\nexport function handleClickNode<T>(_data: NodeEventData<T>) {}\n\nexport function handleClickParent<T>(_data: ParentEventData<T>) {}\n\nexport function handleNodeKeydown<T>(_data: NodeEventData<T>) {}\n\n/**\n * Prevent the sort on scroll.\n *\n * @returns A function to prevent the sort on scroll.\n */\nexport function preventSortOnScroll() {\n  let scrollTimeout: ReturnType<typeof setTimeout>;\n\n  return () => {\n    clearTimeout(scrollTimeout);\n\n    if (state) state.preventEnter = true;\n\n    scrollTimeout = setTimeout(() => {\n      if (state) state.preventEnter = false;\n    }, 100);\n  };\n}\n\n/**\n * Handle the node pointer over.\n *\n * @param e - The node pointer over event.\n *\n * @returns void\n */\nexport function handleNodePointerover<T>(e: PointeroverNodeEvent<T>) {\n  if (e.detail.targetData.parent.el === e.detail.state.currentParent.el)\n    sort(e.detail, e.detail.state);\n  else transfer(e.detail, e.detail.state);\n}\n\n/**\n * Handle the node drop.\n *\n * @param data - The node drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleNodeDrop<T>(\n  data: NodeDragEventData<T>,\n  state: DragState<T> | SynthDragState<T>\n) {\n  const config = data.targetData.parent.data.config;\n\n  if (!config.nativeDrag) return;\n\n  sp(data.e);\n\n  dropped = true;\n\n  config.handleEnd(state);\n}\n\nexport function handleNodeFocus<T>(data: NodeEventData<T>) {\n  if (data.e.target === data.e.currentTarget) return;\n\n  if (state.pointerDown) state.pointerDown.node.el.draggable = false;\n}\n\nexport function handleNodeBlur<T>(data: NodeEventData<T>) {\n  if (data.e.target === data.e.currentTarget) return;\n\n  if (state.pointerDown) state.pointerDown.node.el.draggable = true;\n}\n\n/**\n * Handle the drag end.\n *\n * @param data - The node drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleDragend<T>(\n  data: NodeDragEventData<T>,\n  state: DragState<T>\n) {\n  const config = data.targetData.parent.data.config;\n\n  if (!config.nativeDrag) return;\n\n  pd(data.e);\n\n  sp(data.e);\n\n  if (dropped) {\n    dropped = false;\n\n    return;\n  }\n\n  config.handleEnd(state);\n}\n\n/**\n * Handle the pointer cancel.\n *\n * @param data - The node event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handlePointercancel<T>(\n  data: NodeEventData<T>,\n  state: DragState<T> | SynthDragState<T> | BaseDragState<T>\n) {\n  if (!isSynthDragState(state)) return;\n\n  pd(data.e);\n\n  if (dropped) {\n    dropped = false;\n\n    return;\n  }\n\n  const config = parents.get(state.initialParent.el)?.config;\n\n  if (config?.onDragend) {\n    config.onDragend({\n      parent: state.currentParent,\n      values: parentValues(state.currentParent.el, state.currentParent.data),\n      draggedNode: state.draggedNode,\n      draggedNodes: state.draggedNodes,\n      state,\n    });\n  }\n\n  config?.handleEnd(state);\n}\n\n/**\n * Handle the drag end.\n *\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleEnd<T>(state: DragState<T> | SynthDragState<T>) {\n  if (state.draggedNode) state.draggedNode.el.draggable = true;\n\n  // --- Capture necessary data BEFORE resetState might affect it ---\n  const nodesToClean = state.draggedNodes.map((x) => x.el);\n  const initialParentData = state.initialParent.data;\n  const isSynth = isSynthDragState(state);\n  const config = parents.get(state.initialParent.el)?.config;\n  const dropZoneClass = isSynth\n    ? config?.synthDropZoneClass\n    : config?.dropZoneClass;\n  const longPressClass = initialParentData?.config?.longPressClass;\n  const placeholderClass = isSynth\n    ? initialParentData?.config?.synthDragPlaceholderClass // Corrected potential typo: used initialParentData\n    : initialParentData?.config?.dragPlaceholderClass;\n  const originalZIndex = state.originalZIndex;\n  // --- End data capture ---\n\n  if (isSynthDragState(state)) {\n    // Ensure cloned node removal happens reasonably quickly\n    if (state.clonedDraggedNode) {\n      // Check if it exists\n      state.clonedDraggedNode.remove();\n    }\n    if (state.longPressTimeout) {\n      // Check if timeout exists\n      clearTimeout(state.longPressTimeout);\n    }\n  }\n\n  // Ensure scrolling is properly cancelled (needs state, do before reset)\n  cancelSynthScroll(state);\n\n  // Clear any lingering scroll directions and timeouts (needs state, do before reset)\n  state.lastScrollDirectionX = undefined;\n  state.lastScrollDirectionY = undefined;\n  state.preventEnter = false;\n  if (state.scrollDebounceTimeout) {\n    clearTimeout(state.scrollDebounceTimeout);\n    state.scrollDebounceTimeout = undefined; // Ensure it's marked as cleared\n  }\n\n  // Apply z-index change synchronously if needed\n  if (originalZIndex !== undefined && state.draggedNode) {\n    state.draggedNode.el.style.zIndex = originalZIndex;\n  }\n\n  // Use single rAF with captured data for class removal\n  requestAnimationFrame(() => {\n    // Use the captured data, not the potentially reset global state\n    removeClass(nodesToClean, dropZoneClass);\n    removeClass(nodesToClean, longPressClass);\n    removeClass(nodesToClean, placeholderClass);\n  });\n\n  // Deselect and reset active state (needs state, do before reset)\n  deselect(state.draggedNodes, state.currentParent, state);\n  setActive(state.currentParent, undefined, state);\n\n  // Prepare data for callback/event *before* resetState\n  const finalStateForCallback = { ...state }; // Shallow copy for safety\n\n  // Call onDragend callback *before* resetState\n  config?.onDragend?.({\n    parent: finalStateForCallback.currentParent,\n    values: parentValues(\n      finalStateForCallback.currentParent.el,\n      finalStateForCallback.currentParent.data\n    ),\n    draggedNode: finalStateForCallback.draggedNode,\n    draggedNodes: finalStateForCallback.draggedNodes,\n    state: finalStateForCallback,\n  });\n\n  // Emit event *before* resetState\n  state.emit(\"dragEnded\", finalStateForCallback); // Emit with the final state representation\n\n  // Reset global state LAST\n  resetState();\n\n  // No need to set state.selectedState = undefined; resetState handles it.\n}\n\n/**\n * Handle the node pointer up.\n *\n * @param data - The node pointer event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleNodePointerup<T>(\n  data: NodePointerEventData<T>,\n  state: DragState<T> | SynthDragState<T> | BaseDragState<T>\n) {\n  sp(data.e);\n\n  if (!state.pointerSelection && state.selectedState)\n    deselect(state.selectedState.nodes, data.targetData.parent, state);\n\n  const config = data.targetData.parent.data.config;\n\n  state.pointerSelection = false;\n\n  if (\"longPressTimeout\" in state && state.longPressTimeout)\n    clearTimeout(state.longPressTimeout);\n\n  state.longPress = false;\n\n  removeClass(\n    data.targetData.parent.data.enabledNodes.map((x) => x.el),\n    config.longPressClass\n  );\n\n  if (!isDragState(state)) return;\n\n  config.handleEnd(state as DragState<T> | SynthDragState<T>);\n}\n\n/**\n * Initialize the synth drag.\n *\n * @param node - The node.\n * @param parent - The parent.\n * @param e - The pointer event.\n * @param _state - The drag state.\n * @param draggedNodes - The dragged nodes.\n * @param rect - The bounding rect of the original element\n *\n * @returns The synth drag state.\n */\nfunction initSynthDrag<T>(\n  node: NodeRecord<T>,\n  parent: ParentRecord<T>,\n  e: PointerEvent,\n  _state: BaseDragState<T>,\n  draggedNodes: Array<NodeRecord<T>>,\n  rect: DOMRect\n): SynthDragState<T> {\n  const config = parent.data.config;\n\n  let dragImage: HTMLElement;\n\n  let result:\n    | { dragImage: HTMLElement; offsetX?: number; offsetY?: number }\n    | undefined;\n\n  const criticalStyleProps = [\n    \"display\",\n    \"flexDirection\",\n    \"alignItems\",\n    \"justifyContent\",\n    \"padding\",\n    \"paddingTop\",\n    \"margin\",\n    \"marginTop\",\n    \"marginBottom\",\n    \"marginLeft\",\n    \"marginRight\",\n    \"paddingBottom\",\n    \"paddingLeft\",\n    \"paddingRight\",\n    \"border\",\n    \"borderRadius\",\n    \"background\",\n    \"backgroundColor\",\n    \"boxShadow\",\n    \"font\",\n    \"color\",\n    \"lineHeight\",\n    \"gap\",\n    \"width\",\n    \"height\",\n    \"boxSizing\",\n    \"overflow\",\n  ] as const;\n\n  const copyCriticalStyles = (src: HTMLElement, dest: HTMLElement) => {\n    const computed = window.getComputedStyle(src);\n    criticalStyleProps.forEach((prop) => {\n      dest.style[prop] = computed[prop]!;\n    });\n  };\n\n  // Helper to style the drag image\n  const applyBaseStyles = (\n    el: HTMLElement,\n    extraStyles: Partial<CSSStyleDeclaration> = {}\n  ) => {\n    Object.assign(el.style, {\n      position: \"absolute\",\n      zIndex: \"9999\",\n      pointerEvents: \"none\",\n      willChange: \"transform\",\n      boxSizing: \"border-box\",\n      opacity: \"0\",\n      overflow: \"hidden\",\n      width: `${rect.width}px`,\n      height: `${rect.height}px`,\n      ...extraStyles,\n    });\n  };\n\n  // Custom drag image\n  if (config.synthDragImage) {\n    result = config.synthDragImage(node, parent, e, draggedNodes);\n    dragImage = result.dragImage;\n    dragImage.setAttribute(\"popover\", \"manual\");\n    applyBaseStyles(dragImage);\n  }\n\n  // Single drag\n  else if (!config.multiDrag || draggedNodes.length === 1) {\n    dragImage = node.el.cloneNode(true) as HTMLElement;\n    copyCriticalStyles(node.el as HTMLElement, dragImage);\n    dragImage.setAttribute(\"popover\", \"manual\");\n    applyBaseStyles(dragImage);\n  }\n\n  // Multi-drag\n  else {\n    const wrapper = document.createElement(\"div\");\n\n    wrapper.setAttribute(\"popover\", \"manual\");\n\n    draggedNodes.forEach((dragged) => {\n      const clone = dragged.el.cloneNode(true) as HTMLElement;\n\n      copyCriticalStyles(dragged.el as HTMLElement, clone);\n\n      clone.style.pointerEvents = \"none\";\n\n      clone.style.margin = \"0\";\n\n      wrapper.append(clone);\n    });\n\n    wrapper.style.display = \"flex\";\n    wrapper.style.flexDirection = \"column\";\n    wrapper.style.padding = \"0\";\n    wrapper.style.margin = \"0\";\n    wrapper.style.position = \"absolute\";\n    wrapper.style.zIndex = \"9999\";\n    wrapper.style.pointerEvents = \"none\";\n\n    dragImage = wrapper;\n  }\n\n  dragImage.id = \"dnd-dragged-node-clone\";\n\n  parent.el.appendChild(dragImage);\n\n  dragImage.showPopover();\n\n  const synthDragStateProps = {\n    clonedDraggedEls: [],\n    clonedDraggedNode: dragImage,\n    synthDragScrolling: false,\n    synthDragging: true,\n    rootScrollWidth: document.scrollingElement?.scrollWidth,\n    rootScrollHeight: document.scrollingElement?.scrollHeight,\n  };\n\n  const synthDragState = setDragState({\n    ...dragStateProps(\n      node,\n      parent,\n      e,\n      draggedNodes,\n      result?.offsetX,\n      result?.offsetY\n    ),\n    ...synthDragStateProps,\n  }) as SynthDragState<T>;\n\n  return synthDragState;\n}\n\n/**\n * Handle the long press.\n *\n * @param data - The node pointer event data.\n * @param state - The drag state.\n * @param node - The node.\n *\n * @returns void\n */\nexport function handleLongPress<T>(\n  data: NodePointerEventData<T>,\n  state: BaseDragState<T>,\n  node: NodeRecord<T>\n) {\n  const config = data.targetData.parent.data.config;\n\n  state.longPressTimeout = setTimeout(() => {\n    if (!state) return;\n\n    state.longPress = true;\n\n    if (config.longPressClass && data.e.cancelable)\n      addNodeClass([node.el], config.longPressClass);\n\n    pd(data.e);\n  }, config.longPressDuration || 1000);\n}\n\nfunction cancelSynthScroll<T>(\n  state: DragState<T>,\n  cancelX = true,\n  cancelY = true\n) {\n  if (cancelX) {\n    if (state.frameIdX !== undefined) {\n      cancelAnimationFrame(state.frameIdX);\n      state.frameIdX = undefined;\n    }\n    state.lastScrollDirectionX = undefined;\n  }\n\n  if (cancelY) {\n    if (state.frameIdY !== undefined) {\n      cancelAnimationFrame(state.frameIdY);\n      state.frameIdY = undefined;\n    }\n    state.lastScrollDirectionY = undefined;\n  }\n\n  if (!state.frameIdX && !state.frameIdY) {\n    state.preventEnter = false;\n  }\n}\n\nfunction moveNode<T>(state: SynthDragState<T>, justStarted = false) {\n  const { x, y } = state.coordinates;\n\n  const startLeft = state.startLeft ?? 0;\n  const startTop = state.startTop ?? 0;\n\n  const currentScrollX = window.scrollX ?? 0;\n  const currentScrollY = window.scrollY ?? 0;\n\n  const translateX = x - startLeft + currentScrollX;\n  const translateY = y - startTop + currentScrollY;\n\n  state.clonedDraggedNode.style.transform = `translate3d(${translateX}px, ${translateY}px, 0px)`;\n\n  if (justStarted) {\n    state.clonedDraggedNode.style.opacity = \"1\";\n\n    removeClass(\n      state.draggedNodes.map((x) => x.el),\n      state.initialParent.data.config?.longPressClass\n    );\n  }\n}\n\nexport function synthMove<T>(\n  e: PointerEvent,\n  state: SynthDragState<T>,\n  justStarted = false\n) {\n  const coordinates = eventCoordinates(e);\n  state.coordinates.x = coordinates.x;\n  state.coordinates.y = coordinates.y;\n\n  moveNode(state, justStarted); // Pass only state now\n\n  // Clear any existing timeout to avoid multiple concurrent timeouts\n  if (state.scrollDebounceTimeout) {\n    clearTimeout(state.scrollDebounceTimeout);\n    state.scrollDebounceTimeout = undefined;\n  }\n\n  // Only set a new timeout if we're still in a valid drag state\n  state.scrollDebounceTimeout = setTimeout(() => {\n    // Only process if the drag state is still active\n    if (isSynthDragState(state)) {\n      handleSynthScroll(state.coordinates, e, state);\n    }\n  }, 16); // ~1 frame (60fps)\n\n  const elFromPoint = getElFromPoint(coordinates);\n\n  if (!elFromPoint) {\n    document.dispatchEvent(\n      new CustomEvent(\"handleRootPointerover\", {\n        detail: {\n          e,\n          state,\n        },\n      })\n    );\n\n    return;\n  }\n\n  const pointerMoveEventData = {\n    e,\n    targetData: elFromPoint,\n    state,\n  };\n\n  if (\"node\" in elFromPoint) {\n    elFromPoint.node.el.dispatchEvent(\n      new CustomEvent(\"handleNodePointerover\", {\n        detail: pointerMoveEventData,\n      })\n    );\n  } else {\n    elFromPoint.parent.el.dispatchEvent(\n      new CustomEvent(\"handleParentPointerover\", {\n        detail: pointerMoveEventData,\n      })\n    );\n  }\n}\n\n/**\n * Handle the node drag over.\n *\n * @param data - The node drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleNodeDragover<T>(\n  data: NodeDragEventData<T>,\n  state: DragState<T>\n) {\n  const config = data.targetData.parent.data.config;\n\n  if (!config.nativeDrag) return;\n\n  const { x, y } = eventCoordinates(data.e);\n\n  state.coordinates.y = y;\n\n  state.coordinates.x = x;\n\n  pd(data.e);\n\n  sp(data.e);\n\n  if (isDragState(state)) {\n    handleSynthScroll({ x, y }, data.e, state);\n  }\n\n  data.targetData.parent.el === state.currentParent?.el\n    ? sort(data, state)\n    : transfer(data, state);\n}\n\n/**\n * Handle the parent drag over.\n *\n * @param data - The parent drag event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function handleParentDragover<T>(\n  data: ParentDragEventData<T>,\n  state: DragState<T>\n) {\n  const config = data.targetData.parent.data.config;\n\n  if (!config.nativeDrag) return;\n\n  pd(data.e);\n\n  sp(data.e);\n\n  const { x, y } = eventCoordinates(data.e);\n\n  if (isDragState(state)) {\n    handleSynthScroll({ x, y }, data.e, state);\n  }\n\n  transfer(data, state);\n}\n\n/**\n * Handle the parent pointer over.\n *\n * @param e - The parent pointer over event.\n *\n * @returns void\n */\nexport function handleParentPointerover<T>(e: PointeroverParentEvent<T>) {\n  if (e.detail.targetData.parent.el !== e.detail.state.currentParent.el)\n    transfer(e.detail, e.detail.state);\n}\n\n/**\n * Validate the transfer.\n *\n * @param data - The transfer data.\n *\n * @returns Whether the transfer is valid.\n */\nexport function validateTransfer<T>({\n  currentParent,\n  targetParent,\n  initialParent,\n  draggedNodes,\n  state,\n}: {\n  currentParent: ParentRecord<T>;\n  targetParent: ParentRecord<T>;\n  initialParent: ParentRecord<T>;\n  draggedNodes: Array<NodeRecord<T>>;\n  state: BaseDragState<T>;\n}) {\n  if (targetParent.el === currentParent.el) return false;\n\n  const targetConfig = targetParent.data.config;\n\n  if (draggedNodes[0].el.contains(targetParent.el)) return false;\n\n  if (targetConfig.dropZone === false) return false;\n\n  const initialParentConfig = initialParent.data.config;\n\n  if (targetConfig.accepts) {\n    return targetConfig.accepts(\n      targetParent,\n      initialParent,\n      currentParent,\n      state\n    );\n  } else if (\n    !targetConfig.group ||\n    targetConfig.group !== initialParentConfig.group\n  ) {\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Handle the node drag enter.\n *\n * @param data - The node drag event data.\n * @param _state - The drag state.\n *\n * @returns void\n */\nfunction handleNodeDragenter<T>(\n  data: NodeDragEventData<T>,\n  _state: DragState<T>\n) {\n  pd(data.e);\n}\n\n/**\n * Handle the node drag leave.\n *\n * @param data - The node drag event data.\n * @param _state - The drag state.\n *\n * @returns void\n */\nfunction handleNodeDragleave<T>(\n  data: NodeDragEventData<T>,\n  _state: DragState<T>\n) {\n  pd(data.e);\n}\n\n/**\n * Validate the sort.\n *\n * @param data - The node drag event data or node pointer event data.\n * @param state - The drag state.\n * @param x - The x coordinate.\n * @param y - The y coordinate.\n *\n * @returns Whether the sort is valid.\n */\nexport function validateSort<T>(\n  data: NodeDragEventData<T> | NodePointerEventData<T>,\n  state: DragState<T>,\n  x: number,\n  y: number\n): boolean {\n  if (\n    state.affectedNodes\n      .map((x) => x.data.value)\n      .includes(data.targetData.node.data.value)\n  ) {\n    return false;\n  }\n\n  if (state.remapJustFinished) {\n    state.remapJustFinished = false;\n\n    if (\n      data.targetData.node.data.value === state.currentTargetValue ||\n      state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)\n    ) {\n      state.currentTargetValue = data.targetData.node.data.value;\n    }\n\n    return false;\n  }\n\n  if (state.preventEnter) return false;\n\n  if (state.draggedNodes.map((x) => x.el).includes(data.targetData.node.el)) {\n    state.currentTargetValue = undefined;\n\n    return false;\n  }\n\n  if (data.targetData.node.data.value === state.currentTargetValue)\n    return false;\n\n  if (\n    data.targetData.parent.el !== state.currentParent?.el ||\n    data.targetData.parent.data.config.sortable === false\n  )\n    return false;\n\n  if (data.targetData.node.el.contains(state.draggedNodes[0].el)) return false;\n\n  const targetRect = data.targetData.node.el.getBoundingClientRect();\n\n  const dragRect = state.draggedNode.el.getBoundingClientRect();\n\n  const yDiff = targetRect.y - dragRect.y;\n\n  const xDiff = targetRect.x - dragRect.x;\n\n  let incomingDirection: \"above\" | \"below\" | \"left\" | \"right\";\n\n  if (Math.abs(yDiff) > Math.abs(xDiff)) {\n    incomingDirection = yDiff > 0 ? \"above\" : \"below\";\n  } else {\n    incomingDirection = xDiff > 0 ? \"left\" : \"right\";\n  }\n\n  const threshold = state.currentParent.data.config.threshold;\n\n  switch (incomingDirection) {\n    case \"left\":\n      if (x > targetRect.x + targetRect.width * threshold.horizontal) {\n        state.incomingDirection = \"left\";\n\n        return true;\n      }\n      break;\n\n    case \"right\":\n      if (x < targetRect.x + targetRect.width * (1 - threshold.horizontal)) {\n        state.incomingDirection = \"right\";\n\n        return true;\n      }\n      break;\n\n    case \"above\":\n      if (y > targetRect.y + targetRect.height * threshold.vertical) {\n        state.incomingDirection = \"above\";\n\n        return true;\n      }\n      break;\n\n    case \"below\":\n      if (y < targetRect.y + targetRect.height * (1 - threshold.vertical)) {\n        state.incomingDirection = \"below\";\n\n        return true;\n      }\n      break;\n\n    default:\n      break;\n  }\n\n  return false;\n}\n\n/**\n * Sort the nodes.\n *\n * @param data - The node drag event data or node pointer event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function sort<T>(\n  data: NodeDragEventData<T> | NodePointerEventData<T>,\n  state: DragState<T>\n) {\n  const { x, y } = eventCoordinates(data.e);\n\n  if (!validateSort(data, state, x, y)) {\n    return;\n  }\n\n  const range =\n    state.draggedNode.data.index > data.targetData.node.data.index\n      ? [data.targetData.node.data.index, state.draggedNode.data.index]\n      : [state.draggedNode.data.index, data.targetData.node.data.index];\n\n  state.targetIndex = data.targetData.node.data.index;\n\n  state.affectedNodes = data.targetData.parent.data.enabledNodes.filter(\n    (node) => {\n      return (\n        range[0] <= node.data.index &&\n        node.data.index <= range[1] &&\n        node.el !== state.draggedNode.el\n      );\n    }\n  );\n\n  data.targetData.parent.data.config.performSort({\n    parent: data.targetData.parent,\n    draggedNodes: state.draggedNodes,\n    targetNodes: [data.targetData.node],\n  });\n}\n\n/**\n * Event listener used for all nodes.\n *\n * @param e - The event.\n *\n */\nexport function nodeEventData<T>(\n  callback: any\n): (e: Event) => NodeEventData<T> | undefined {\n  function nodeTargetData(node: Node): NodeTargetData<T> | undefined {\n    const nodeData = nodes.get(node);\n\n    if (!nodeData) return;\n\n    const parentData = parents.get(node.parentNode);\n\n    if (!parentData) return;\n\n    return {\n      node: {\n        el: node,\n        data: nodeData,\n      },\n      parent: {\n        el: node.parentNode,\n        data: parentData,\n      },\n    };\n  }\n\n  return (e: Event) => {\n    const targetData = nodeTargetData(e.currentTarget as Node);\n\n    if (!targetData) return;\n\n    return callback(\n      {\n        e,\n        targetData,\n      },\n      state\n    );\n  };\n}\n\n/**\n * Transfer the nodes.\n *\n * @param data - The node event data or parent event data.\n * @param state - The drag state.\n *\n * @returns void\n */\nexport function transfer<T>(\n  data: NodeEventData<T> | ParentEventData<T>,\n  state: DragState<T>\n): void {\n  pd(data.e);\n\n  if (\n    !validateTransfer({\n      currentParent: state.currentParent,\n      targetParent: data.targetData.parent as any,\n      initialParent: state.initialParent,\n      draggedNodes: state.draggedNodes,\n      state,\n    })\n  )\n    return;\n\n  data.targetData.parent.data.config.performTransfer({\n    currentParent: state.currentParent,\n    targetParent: data.targetData.parent,\n    initialParent: state.initialParent,\n    draggedNodes: state.draggedNodes,\n    initialIndex: state.initialIndex,\n    state,\n    targetNodes: \"node\" in data.targetData ? [data.targetData.node] : [],\n  });\n\n  state.currentParent = data.targetData.parent;\n\n  state.transferred = true;\n}\n\n/**\n * Event listener used for all parents.\n *\n * @param callback - The callback.\n *\n * @returns A function to get the parent event data.\n */\nexport function parentEventData<T>(\n  callback: any\n): (e: Event) => NodeEventData<T> | undefined {\n  function parentTargetData(\n    parent: HTMLElement\n  ): ParentTargetData<T> | undefined {\n    const parentData = parents.get(parent);\n\n    if (!parentData) return;\n\n    return {\n      parent: {\n        el: parent,\n        data: parentData as ParentData<T>,\n      },\n    };\n  }\n\n  return (e: Event) => {\n    const targetData = parentTargetData(e.currentTarget as HTMLElement);\n\n    if (!targetData) return;\n\n    return callback(\n      {\n        e,\n        targetData,\n      },\n      state\n    );\n  };\n}\n\n/**\n * Add class to the node.\n *\n * @param els - The nodes.\n * @param className - The class name.\n * @param omitAppendPrivateClass - Whether to omit append private class.\n *\n * @returns void\n */\nexport function addNodeClass<T>(\n  els: Array<Node | HTMLElement | Element>,\n  className: string | undefined,\n  omitAppendPrivateClass = false\n) {\n  function nodeSetter<T>(node: Node, nodeData: NodeData<T>) {\n    nodes.set(node, nodeData);\n  }\n\n  for (const el of els) {\n    const nodeData = nodes.get(el as Node);\n\n    const newData = addClass(el, className, nodeData, omitAppendPrivateClass);\n\n    if (!newData) continue;\n\n    nodeSetter(el as Node, newData as NodeData<T>);\n  }\n}\n\n/**\n * Add class to the parent.\n *\n * @param els - The parents.\n * @param className - The class name.\n * @param omitAppendPrivateClass - Whether to omit append private class.\n *\n * @returns void\n */\nexport function addParentClass<T>(\n  els: Array<HTMLElement>,\n  className: string | undefined,\n  omitAppendPrivateClass = false\n) {\n  function parentSetter<T>(parent: HTMLElement, parentData: ParentData<T>) {\n    parents.set(parent, parentData);\n  }\n\n  for (const el of els) {\n    const parentData = parents.get(el);\n\n    const newData = addClass(el, className, parentData, omitAppendPrivateClass);\n\n    if (!newData) continue;\n\n    parentSetter(el, newData as ParentData<T>);\n  }\n}\n\n/**\n * Add class to the node.\n *\n * @param el - The node.\n * @param className - The class name.\n * @param data - The node data.\n * @param omitAppendPrivateClass - Whether to omit append private class.\n *\n * @returns void\n */\nexport function addClass(\n  el: Node | HTMLElement | Element,\n  className: string | undefined,\n  data: NodeData<any> | ParentData<any> | undefined,\n  omitAppendPrivateClass = false\n) {\n  if (!className) return;\n\n  const classNames = splitClass(className);\n\n  if (!classNames.length) return;\n\n  if (!data) {\n    el.classList.add(...classNames);\n    return;\n  }\n  // Revert to original logic: Initialize privateClasses as empty for this call.\n  const privateClasses = [];\n\n  for (const currentClassName of classNames) {\n    if (!el.classList.contains(currentClassName)) {\n      el.classList.add(currentClassName);\n    } else if (\n      // Only add to privateClasses if the element already had the class\n      // AND omitAppendPrivateClass is specifically false for THIS call.\n      el.classList.contains(currentClassName) &&\n      omitAppendPrivateClass === false\n    ) {\n      privateClasses.push(currentClassName);\n    }\n  }\n  // Assign the newly computed privateClasses, overwriting any previous value.\n  data.privateClasses = privateClasses;\n  return data;\n}\n\n/**\n * Remove class from the nodes.\n *\n * @param els - The nodes.\n * @param className - The class name.\n *\n * @returns void\n */\nexport function removeClass(\n  els: Array<Node | HTMLElement | Element>,\n  className: string | undefined\n) {\n  if (!className) return;\n\n  const classNames = splitClass(className);\n\n  if (!classNames.length) return;\n\n  for (const node of els) {\n    if (!isNode(node)) {\n      node.classList.remove(...classNames);\n      continue;\n    }\n\n    const nodeData = nodes.get(node) || parents.get(node);\n\n    if (!nodeData) continue;\n\n    for (const className of classNames) {\n      if (!nodeData.privateClasses.includes(className)) {\n        node.classList.remove(className);\n      }\n    }\n  }\n}\n\ntype ScrollDirection<T> = { axis: \"x\"; state: DragState<T> } | { axis: \"y\" };\n\nfunction getScrollDirection<T>(\n  el: HTMLElement,\n  e: PointerEvent | DragEvent,\n  style: CSSStyleDeclaration,\n  rect: DOMRect,\n  opts: ScrollDirection<T>\n): Record<string, boolean> {\n  const threshold = 0.075;\n\n  const isX = opts.axis === \"x\";\n  const isRoot = el === document.scrollingElement;\n  const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\n  const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\n  const offsetProp = isX ? \"offsetWidth\" : \"offsetHeight\";\n  const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\n  const clientCoord = isX ? e.clientX : e.clientY;\n  const rectStart = isX ? rect.left : rect.top;\n  const overflow = isX ? style.overflowX : style.overflowY;\n\n  if (isRoot) {\n    const scrollPos = el[scrollProp];\n    const clientSize = el[sizeProp];\n    const canScrollBefore = scrollPos > 0;\n    const canScrollAfter =\n      scrollPos + clientSize <\n      (isX\n        ? (opts.state as SynthDragState<T>).rootScrollWidth || 0\n        : el[scrollSizeProp]);\n\n    return isX\n      ? {\n          left: canScrollBefore && clientCoord < clientSize * threshold,\n          right: canScrollAfter && clientCoord > clientSize * (1 - threshold),\n        }\n      : {\n          up: canScrollBefore && clientCoord < clientSize * threshold,\n          down: canScrollAfter && clientCoord > clientSize * (1 - threshold),\n        };\n  }\n\n  if (\n    (overflow === \"auto\" || overflow === \"scroll\") &&\n    el !== document.body &&\n    el !== document.documentElement\n  ) {\n    const scrollSize = el[scrollSizeProp];\n    const offsetSize = el[offsetProp];\n    const scrollPos = el[scrollProp];\n\n    const canScrollBefore = scrollPos > 0;\n    const canScrollAfter = scrollPos < scrollSize - offsetSize;\n\n    return isX\n      ? {\n          left:\n            canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\n          right:\n            canScrollAfter &&\n            clientCoord > rectStart + offsetSize * (1 - threshold),\n        }\n      : {\n          up:\n            canScrollBefore && clientCoord < rectStart + offsetSize * threshold,\n          down:\n            canScrollAfter &&\n            clientCoord > rectStart + offsetSize * (1 - threshold),\n        };\n  }\n\n  return isX ? { left: false, right: false } : { up: false, down: false };\n}\n\ntype Axis = \"x\" | \"y\";\n\nfunction scrollAxis<T>(\n  el: HTMLElement,\n  _e: PointerEvent | DragEvent,\n  state: DragState<T>,\n  options: {\n    axis: Axis;\n    direction: \"positive\" | \"negative\";\n  }\n) {\n  // Check if this is a stale call from a previous state\n  if (!isDragState(state) || !state.draggedNode) {\n    return; // State has been reset or is no longer in a drag state\n  }\n\n  state.preventEnter = true;\n\n  const isX = options.axis === \"x\";\n  const dirFactor = options.direction === \"positive\" ? 1 : -1;\n  const speed = 20;\n\n  const key = isX ? \"lastScrollDirectionX\" : \"lastScrollDirectionY\";\n  const idKey = isX ? \"frameIdX\" : \"frameIdY\";\n\n  // Cancel any existing animation first, regardless of direction\n  if (state[idKey] !== undefined) {\n    cancelAnimationFrame(state[idKey]!);\n    state[idKey] = undefined;\n  }\n\n  state[key] = options.direction;\n\n  const scrollLoop = () => {\n    // Check again if state is still valid\n    if (!isDragState(state) || !state.draggedNode) {\n      if (state[idKey] !== undefined) {\n        cancelAnimationFrame(state[idKey]!);\n        state[idKey] = undefined;\n      }\n      return;\n    }\n\n    const scrollProp = isX ? \"scrollLeft\" : \"scrollTop\";\n    const sizeProp = isX ? \"clientWidth\" : \"clientHeight\";\n    const scrollSizeProp = isX ? \"scrollWidth\" : \"scrollHeight\";\n\n    const scrollPos = el[scrollProp];\n    const clientSize = el[sizeProp];\n    const scrollSize = el[scrollSizeProp];\n\n    const canScroll =\n      dirFactor > 0 ? scrollPos + clientSize < scrollSize : scrollPos > 0;\n\n    if (!canScroll) {\n      state[idKey] = undefined;\n      state[key] = undefined;\n      return;\n    }\n\n    el[scrollProp] += speed * dirFactor;\n\n    if (isSynthDragState(state)) {\n      moveNode(state);\n    }\n\n    state[idKey] = requestAnimationFrame(scrollLoop);\n  };\n\n  state[idKey] = requestAnimationFrame(scrollLoop);\n}\n\nfunction isPointerInside(el: HTMLElement, x: number, y: number): boolean {\n  const rect = el.getBoundingClientRect();\n  return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n}\n\nfunction handleSynthScroll<T>(\n  coordinates: { x: number; y: number },\n  e: PointerEvent | DragEvent,\n  state: DragState<T>\n) {\n  // First check if this is a stale call from a previous state\n  if (!isDragState(state) || !state.draggedNode) {\n    return; // State has been reset or is no longer in a drag state\n  }\n\n  cancelSynthScroll(state);\n\n  const { x, y } = coordinates;\n\n  let scrolled = false;\n\n  const attemptScroll = (\n    axis: \"x\" | \"y\",\n    direction: \"positive\" | \"negative\",\n    container: HTMLElement\n  ) => {\n    scrollAxis(container, e, state, { axis, direction });\n    scrolled = true;\n  };\n\n  const checkAndScroll = (el: HTMLElement) => {\n    const style = window.getComputedStyle(el);\n    const rect = el.getBoundingClientRect();\n\n    const xResult = getScrollDirection(el, e, style, rect, {\n      axis: \"x\",\n      state,\n    });\n\n    const yResult = getScrollDirection(el, e, style, rect, { axis: \"y\" });\n\n    if (xResult.left || xResult.right) {\n      state.lastScrollContainerX = el;\n      attemptScroll(\"x\", xResult.right ? \"positive\" : \"negative\", el);\n    }\n\n    if (yResult.up || yResult.down) {\n      state.lastScrollContainerY = el;\n      attemptScroll(\"y\", yResult.down ? \"positive\" : \"negative\", el);\n    }\n  };\n\n  if (\n    state.lastScrollContainerX &&\n    isPointerInside(state.lastScrollContainerX, x, y)\n  ) {\n    checkAndScroll(state.lastScrollContainerX);\n  }\n\n  if (\n    !scrolled &&\n    state.lastScrollContainerY &&\n    isPointerInside(state.lastScrollContainerY, x, y)\n  ) {\n    checkAndScroll(state.lastScrollContainerY);\n  }\n\n  if (!scrolled) {\n    let el = document.elementFromPoint(x, y);\n    while (\n      el &&\n      !(scrolled && state.lastScrollContainerX && state.lastScrollContainerY)\n    ) {\n      if (el instanceof HTMLElement) {\n        checkAndScroll(el);\n      }\n      el = el.parentElement;\n    }\n  }\n\n  if (!scrolled) {\n    const root = document.scrollingElement;\n    if (root instanceof HTMLElement) {\n      checkAndScroll(root);\n    }\n  }\n\n  if (!scrolled) cancelSynthScroll(state);\n}\n\nexport function getElFromPoint<T>(coordinates: {\n  x: number;\n  y: number;\n}): NodeFromPoint<T> | ParentFromPoint<T> | undefined {\n  let target = document.elementFromPoint(coordinates.x, coordinates.y);\n\n  if (!isNode(target)) return;\n\n  let isParent;\n\n  let invalidEl = true;\n\n  while (target && invalidEl) {\n    if (nodes.has(target as Node) || parents.has(target as HTMLElement)) {\n      invalidEl = false;\n\n      isParent = parents.has(target as HTMLElement);\n\n      break;\n    }\n\n    target = target.parentNode as Node;\n  }\n\n  if (!isParent) {\n    const targetNodeData = nodes.get(target as Node);\n\n    if (!targetNodeData) return;\n\n    const targetParentData = parents.get(target.parentNode as Node);\n\n    if (!targetParentData) return;\n\n    return {\n      node: {\n        el: target as Node,\n        data: targetNodeData,\n      },\n      parent: {\n        el: target.parentNode as Node,\n        data: targetParentData as ParentData<T>,\n      },\n    };\n  } else {\n    const parentData = parents.get(target as HTMLElement);\n\n    if (!parentData) return;\n\n    return {\n      parent: {\n        el: target as HTMLElement,\n        data: parentData as ParentData<T>,\n      },\n    };\n  }\n}\n\n/**\n * Checks to see that a given element and its parent node is instance of\n * HTMLElement.\n *\n * @param {unknown} el - The element to check.\n *\n * @returns {boolean} - Whether or not provided element is of type Node.\n */\nexport function isNode(el: unknown): el is Node {\n  return el instanceof HTMLElement && el.parentNode instanceof HTMLElement;\n}\n\n/**\n * Takes a given el and event handlers, assigns them, and returns the used abort\n * controller.\n *\n * @param el - The element to add the event listeners to.\n * @param events - The events to add to the element.\n * @returns - The abort controller used for the event listeners.\n */\nexport function addEvents(\n  el: Document | ShadowRoot | Node | HTMLElement | Window,\n  events: EventHandlers | any\n): AbortController {\n  const abortController = new AbortController();\n\n  for (const eventName in events) {\n    const handler = events[eventName];\n\n    el.addEventListener(eventName, handler, {\n      signal: abortController.signal,\n      passive: false,\n      capture: eventName === \"focus\" || eventName === \"blur\",\n    });\n  }\n\n  return abortController;\n}\n","/**\n * Function to prevent default behavior of an event.\n *\n * @param {Event} e - The event to prevent default behavior of.\n */\nexport function pd(e: Event) {\n  e.preventDefault();\n}\n\n/**\n * Function to stop propagation of an event.\n *\n * @param {Event} e - The event to stop propagation of.\n */\nexport function sp(e: Event) {\n  e.stopPropagation();\n}\n\n/**\n * Function to get the bounding client rect of an element.\n *\n * @param {HTMLElement} el - The element to get the bounding client rect of.\n *\n * @returns {ClientRect} The bounding client rect of the element.\n */\nexport function rect(el: HTMLElement): ClientRect {\n  return el.getBoundingClientRect();\n}\n\n/**\n * Function to create an emitter.\n *\n * @returns {[Function, Function]} A tuple containing emit and on functions\n */\nexport function createEmitter<T>() {\n  const callbacks = new Map<string, Array<(data: T) => void>>();\n\n  const emit = function (eventName: string, data: T) {\n    if (!callbacks.get(eventName)) return;\n\n    callbacks.get(eventName)!.forEach((cb) => {\n      cb(data);\n    });\n  };\n\n  const on = function (eventName: string, callback: (data: T) => void) {\n    const cbs = callbacks.get(eventName) ?? [];\n\n    cbs.push(callback);\n\n    callbacks.set(eventName, cbs);\n  };\n\n  return [emit, on] as const;\n}\n\n/**\n * The emit and on functions for drag and drop.\n *\n * @type {[Function, Function]}\n */\nexport const [emit, on] = createEmitter();\n\n/**\n * A regular expression to test for a valid date string.\n *\n * @param x - A RegExp to compare.\n * @param y - A RegExp to compare.\n * @public\n */\nexport function eqRegExp(x: RegExp, y: RegExp): boolean {\n  return (\n    x.source === y.source &&\n    x.flags.split(\"\").sort().join(\"\") === y.flags.split(\"\").sort().join(\"\")\n  );\n}\n\n/**\n * Compare two values for equality, optionally at depth.\n *\n * @param valA - First value.\n * @param valB - Second value.\n * @param deep - If it will compare deeply if it's an object.\n * @param explicit - An array of keys to explicity check.\n *\n * @returns `boolean`\n *\n * @public\n */\nexport function eq(\n  valA: unknown,\n  valB: unknown,\n  deep = true,\n  explicit: string[] = [\"__key\"]\n): boolean {\n  if (valA === valB) return true;\n\n  if (\n    typeof valB === \"object\" &&\n    typeof valA === \"object\" &&\n    valA !== null &&\n    valB !== null\n  ) {\n    if (valA instanceof Map) return false;\n    if (valA instanceof Set) return false;\n    if (valA instanceof Date && valB instanceof Date)\n      return valA.getTime() === valB.getTime();\n    if (valA instanceof RegExp && valB instanceof RegExp)\n      return eqRegExp(valA, valB);\n    if (valA === null || valB === null) return false;\n\n    const objA = valA as Record<string, unknown>;\n    const objB = valB as Record<string, unknown>;\n\n    if (Object.keys(objA).length !== Object.keys(objB).length) return false;\n\n    for (const k of explicit) {\n      if ((k in objA || k in objB) && objA[k] !== objB[k]) return false;\n    }\n\n    for (const key in objA) {\n      if (!(key in objB)) return false;\n      if (objA[key] !== objB[key] && !deep) return false;\n      if (deep && !eq(objA[key], objB[key], deep, explicit)) return false;\n    }\n    return true;\n  }\n  return false;\n}\n\n/**\n * Split a class name into an array of class names.\n *\n * @param className - The class name to split.\n *\n * @returns An array of class names.\n */\nexport function splitClass(className: string): Array<string> {\n  return className.split(\" \").filter((x) => x);\n}\n\nexport function getRealCoords(el: HTMLElement): {\n  top: number;\n  bottom: number;\n  left: number;\n  right: number;\n  height: number;\n  width: number;\n} {\n  const { top, bottom, left, right, height, width } =\n    el.getBoundingClientRect();\n\n  const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n  const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n  return {\n    top: top + scrollTop,\n    bottom: bottom + scrollTop,\n    left: left + scrollLeft,\n    right: right + scrollLeft,\n    height,\n    width,\n  };\n}\n\nexport function eventCoordinates(data: DragEvent | PointerEvent) {\n  return { x: data.clientX, y: data.clientY };\n}\n","import type { SetupNodeData, Node } from \"../../types\";\nimport type { AnimationsConfig } from \"./types\";\nimport { state, parents, isDragState } from \"../../index\";\n\nexport function animations(animationsConfig: Partial<AnimationsConfig> = {}) {\n  const slideUp = [\n    {\n      transform: `translateY(${animationsConfig.yScale || 50}%)`,\n    },\n    {\n      transform: `translateY(${animationsConfig.yScale || 0}%)`,\n    },\n  ];\n\n  const slideDown = [\n    {\n      transform: `translateY(-${animationsConfig.yScale || 50}%)`,\n    },\n    {\n      transform: `translateY(${animationsConfig.yScale || 0}%)`,\n    },\n  ];\n\n  const slideLeft = [\n    {\n      transform: `translateX(${animationsConfig.xScale || 50}%)`,\n    },\n    {\n      transform: `translateX(${animationsConfig.xScale || 0}%)`,\n    },\n  ];\n\n  const slideRight = [\n    {\n      transform: `translateX(-${animationsConfig.xScale || 50}%)`,\n    },\n    {\n      transform: `translateX(${animationsConfig.xScale || 0}%)`,\n    },\n  ];\n  return (parent: HTMLElement) => {\n    const parentData = parents.get(parent);\n\n    if (!parentData) return;\n\n    return {\n      setup() {\n        if (document.head.querySelector(\"[data-drag-and-drop]\")) return;\n      },\n\n      setupNodeRemap<T>(data: SetupNodeData<T>) {\n        if (!isDragState(state)) return;\n\n        const duration = animationsConfig.duration || 150;\n\n        if (data.node.data.value === state.draggedNode.data.value) {\n          switch (state.incomingDirection) {\n            case \"below\":\n              animate(data.node.el, slideUp, duration);\n\n              break;\n            case \"above\":\n              animate(data.node.el, slideDown, duration);\n\n              break;\n            case \"left\":\n              animate(data.node.el, slideRight, duration);\n\n              break;\n            case \"right\":\n              animate(data.node.el, slideLeft, duration);\n\n              break;\n          }\n\n          return;\n        }\n\n        if (\n          !state.affectedNodes\n            .map((x) => x.data.value)\n            .includes(data.node.data.value)\n        )\n          return;\n\n        const nodeRect = data.node.el.getBoundingClientRect();\n\n        const nodeIndex = state.affectedNodes.findIndex(\n          (x) => x.data.value === data.node.data.value\n        );\n\n        const draggedNodeIndex = state.draggedNode.data.index;\n\n        const ascendingDirection = draggedNodeIndex >= state.targetIndex;\n\n        let adjacentNode;\n\n        if (ascendingDirection) {\n          adjacentNode = state.affectedNodes[nodeIndex + 1]\n            ? state.affectedNodes[nodeIndex + 1]\n            : state.affectedNodes[nodeIndex - 1];\n        } else {\n          adjacentNode = state.affectedNodes[nodeIndex - 1]\n            ? state.affectedNodes[nodeIndex - 1]\n            : state.affectedNodes[nodeIndex + 1];\n        }\n\n        if (adjacentNode) {\n          const xDiff = Math.abs(\n            nodeRect.x - adjacentNode.el.getBoundingClientRect().x\n          );\n\n          const yDiff = Math.abs(\n            nodeRect.y - adjacentNode.el.getBoundingClientRect().y\n          );\n\n          if (xDiff > yDiff && ascendingDirection) {\n            animate(data.node.el, slideRight, duration);\n          } else if (xDiff > yDiff && !ascendingDirection) {\n            animate(data.node.el, slideLeft, duration);\n          }\n        } else {\n          switch (state.incomingDirection) {\n            case \"below\":\n              animate(data.node.el, slideDown, duration);\n\n              break;\n            case \"above\":\n              animate(data.node.el, slideUp, duration);\n\n              break;\n            case \"left\":\n              animate(data.node.el, slideLeft, duration);\n\n              break;\n            case \"right\":\n              animate(data.node.el, slideRight, duration);\n\n              break;\n          }\n        }\n      },\n    };\n  };\n}\n\nfunction animate(\n  node: Node,\n  animation: Keyframe[] | PropertyIndexedKeyframes,\n  duration: number\n) {\n  if (!state) return;\n\n  state.preventEnter = true;\n\n  node.animate(animation, {\n    duration: duration,\n    easing: \"ease-in-out\",\n  });\n\n  setTimeout(() => {\n    if (!state) return;\n\n    state.preventEnter = false;\n  }, duration);\n}\n","import type { InsertConfig } from \"../../types\";\nimport type {\n  DragState,\n  NodeDragEventData,\n  NodeRecord,\n  ParentEventData,\n  PointeroverParentEvent,\n  ParentRecord,\n  SynthDragState,\n  InsertEvent,\n  BaseDragState,\n  InsertState,\n  Coordinates,\n  Node,\n} from \"../../types\";\n\nimport {\n  parents,\n  parentValues,\n  setParentValues,\n  state,\n  addParentClass,\n  isDragState,\n  isSynthDragState,\n  removeClass,\n  addEvents,\n  remapNodes,\n  nodes,\n} from \"../../index\";\n\nimport { eq, pd, eventCoordinates } from \"../../utils\";\n\nexport const insertState: InsertState<unknown> = {\n  draggedOverNodes: [],\n  draggedOverParent: null,\n  targetIndex: 0,\n  ascending: false,\n  insertPoint: null,\n  dragging: false,\n};\n\nlet documentController: AbortController | undefined;\n\n// WIP: This is a work in progress and not yet fully functional\nexport function insert<T>(insertConfig: InsertConfig<T>) {\n  return (parent: HTMLElement) => {\n    const parentData = parents.get(parent);\n\n    if (!parentData) return;\n\n    const insertParentConfig = {\n      ...parentData.config,\n      insertConfig,\n    };\n\n    return {\n      teardown() {\n        if (parentData.abortControllers.root) {\n          parentData.abortControllers.root.abort();\n        }\n      },\n      setup() {\n        insertParentConfig.handleNodeDragover =\n          insertConfig.handleNodeDragover || handleNodeDragover;\n\n        insertParentConfig.handleParentPointerover =\n          insertConfig.handleParentPointerover || handleParentPointerover;\n\n        insertParentConfig.handleNodePointerover =\n          insertConfig.handleNodePointerover || handleParentPointerover;\n\n        insertParentConfig.handleParentDragover =\n          insertConfig.handleParentDragover || handleParentDragover;\n\n        const originalHandleend = insertParentConfig.handleEnd;\n\n        insertParentConfig.handleEnd = (\n          state: DragState<T> | SynthDragState<T>\n        ) => {\n          handleEnd(state);\n\n          originalHandleend(state);\n        };\n\n        parentData.on(\"dragStarted\", () => {\n          documentController = addEvents(document, {\n            dragover: checkPosition,\n            pointermove: checkPosition,\n          });\n        });\n\n        parentData.on(\"dragEnded\", () => {\n          documentController?.abort();\n        });\n\n        parentData.config = insertParentConfig;\n\n        state.on(\"dragStarted\", () => {\n          defineRanges(parent);\n        });\n\n        state.on(\"scrollStarted\", () => {\n          if (insertState.insertPoint)\n            insertState.insertPoint.el.style.display = \"none\";\n        });\n\n        state.on(\"scrollEnded\", () => {\n          defineRanges(parent);\n        });\n\n        const firstScrollableParent = findFirstOverflowingParent(parent);\n\n        if (firstScrollableParent) {\n          firstScrollableParent.addEventListener(\n            \"scroll\",\n            defineRanges.bind(null, parent)\n          );\n        }\n\n        window.addEventListener(\"resize\", defineRanges.bind(null, parent));\n      },\n    };\n  };\n}\n\nfunction findFirstOverflowingParent(element: HTMLElement): HTMLElement | null {\n  let parent = element.parentElement;\n\n  while (parent) {\n    const { overflow, overflowY, overflowX } = getComputedStyle(parent);\n\n    // Check if the overflow property is set to scroll, auto, or hidden (anything other than visible)\n    const isOverflowSet =\n      overflow !== \"visible\" ||\n      overflowY !== \"visible\" ||\n      overflowX !== \"visible\";\n\n    // Check if there is actual overflow (scrolling)\n    const isOverflowing =\n      parent.scrollHeight > parent.clientHeight ||\n      parent.scrollWidth > parent.clientWidth;\n    const hasScrollPosition = parent.scrollTop > 0 || parent.scrollLeft > 0;\n\n    if (isOverflowSet && (isOverflowing || hasScrollPosition)) {\n      return parent;\n    }\n\n    parent = parent.parentElement;\n  }\n\n  return null; // No overflowing parent found\n}\n\nfunction checkPosition(e: DragEvent | PointerEvent) {\n  if (!isDragState(state)) return;\n\n  const el = document.elementFromPoint(e.clientX, e.clientY);\n\n  // 1. If the element is not an HTMLElement or is the insert point itself, do nothing.\n  if (!(el instanceof HTMLElement) || el === insertState.insertPoint?.el) {\n    return;\n  }\n\n  // 2. Traverse up the DOM from the element under the cursor\n  //    to see if any ancestor is a registered parent.\n  let isWithinAParent = false;\n  let current: HTMLElement | null = el;\n  while (current) {\n    if (nodes.has(current as Node) || parents.has(current)) {\n      isWithinAParent = true;\n      break; // Found a registered parent ancestor\n    }\n    if (current === document.body) break; // Stop if we reach the body\n    current = current.parentElement;\n  }\n\n  // 3. If the cursor is NOT within any registered parent...\n  if (!isWithinAParent) {\n    // Hide the insert point if it exists\n    if (insertState.insertPoint) {\n      insertState.insertPoint.el.style.display = \"none\";\n    }\n\n    // Remove drop zone class if a parent was previously being dragged over\n    if (insertState.draggedOverParent) {\n      removeClass(\n        [insertState.draggedOverParent.el],\n        insertState.draggedOverParent.data.config.dropZoneClass\n      );\n    }\n\n    // Reset insert state related to dragged over elements\n    insertState.draggedOverNodes = [];\n    insertState.draggedOverParent = null;\n\n    // Reset current parent in the main state back to the initial one\n    state.currentParent = state.initialParent;\n  }\n  // 4. If the cursor IS within a registered parent, do nothing in this function.\n  // Other event handlers will manage the insertion point positioning.\n}\n\ninterface Range {\n  x: [number, number];\n  y: [number, number];\n  vertical: boolean;\n}\n\nfunction createVerticalRange(\n  nodeCoords: Coordinates,\n  otherCoords: Coordinates | undefined,\n  isAscending: boolean\n): Range {\n  const center = nodeCoords.top + nodeCoords.height / 2;\n\n  if (!otherCoords) {\n    const offset = nodeCoords.height / 2 + 10;\n    return {\n      y: isAscending ? [center, center + offset] : [center - offset, center],\n      x: [nodeCoords.left, nodeCoords.right],\n      vertical: true,\n    };\n  }\n\n  const otherEdge = isAscending ? otherCoords.top : otherCoords.bottom;\n  const nodeEdge = isAscending ? nodeCoords.bottom : nodeCoords.top;\n\n  let midpoint: number;\n  let range: [number, number];\n\n  if (isAscending) {\n    // Midpoint between current node's bottom and next node's top\n    midpoint = nodeEdge + (otherEdge - nodeEdge) / 2; // nodeCoords.bottom + (otherCoords.top - nodeCoords.bottom) / 2\n    range = [center, midpoint]; // Range from node center down to midpoint\n  } else {\n    // Midpoint between previous node's bottom and current node's top\n    midpoint = otherEdge + (nodeEdge - otherEdge) / 2; // otherCoords.bottom + (nodeCoords.top - otherCoords.bottom) / 2\n    range = [midpoint, center]; // Range from midpoint down to node center\n  }\n\n  return {\n    y: range,\n    x: [nodeCoords.left, nodeCoords.right],\n    vertical: true,\n  };\n}\n\nfunction createHorizontalRange(\n  nodeCoords: Coordinates,\n  otherCoords: Coordinates | undefined,\n  isAscending: boolean,\n  lastInRow = false\n): Range {\n  const center = nodeCoords.left + nodeCoords.width / 2;\n\n  if (!otherCoords) {\n    if (isAscending) {\n      return {\n        x: [center, center + nodeCoords.width],\n        y: [nodeCoords.top, nodeCoords.bottom],\n        vertical: false,\n      };\n    } else {\n      return {\n        x: [nodeCoords.left - 10, center],\n        y: [nodeCoords.top, nodeCoords.bottom],\n        vertical: false,\n      };\n    }\n  }\n\n  if (isAscending && lastInRow) {\n    return {\n      x: [center, nodeCoords.right + 10],\n      y: [nodeCoords.top, nodeCoords.bottom],\n      vertical: false,\n    };\n  }\n\n  if (isAscending) {\n    const nextNodeCenter = otherCoords.left + otherCoords.width / 2;\n    return {\n      x: [center, center + Math.abs(center - nextNodeCenter) / 2],\n      y: [nodeCoords.top, nodeCoords.bottom],\n      vertical: false,\n    };\n  } else {\n    return {\n      x: [\n        otherCoords.right + Math.abs(otherCoords.right - nodeCoords.left) / 2,\n        center,\n      ],\n      y: [nodeCoords.top, nodeCoords.bottom],\n      vertical: false,\n    };\n  }\n}\n\nfunction getRealCoords(el: HTMLElement): Coordinates {\n  const { top, bottom, left, right, height, width } =\n    el.getBoundingClientRect();\n\n  const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n  const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n  return {\n    top: top + scrollTop,\n    bottom: bottom + scrollTop,\n    left: left + scrollLeft,\n    right: right + scrollLeft,\n    height,\n    width,\n  };\n}\n\nfunction defineRanges(parent: HTMLElement) {\n  if (!isDragState(state) && !isSynthDragState(state)) return;\n\n  const parentData = parents.get(parent);\n  if (!parentData) return;\n\n  const enabledNodes = parentData.enabledNodes;\n\n  enabledNodes.forEach((node, index) => {\n    node.data.range = {};\n\n    const prevNode = enabledNodes[index - 1];\n    const nextNode = enabledNodes[index + 1];\n    const nodeCoords = getRealCoords(node.el);\n    const prevNodeCoords = prevNode ? getRealCoords(prevNode.el) : undefined;\n    const nextNodeCoords = nextNode ? getRealCoords(nextNode.el) : undefined;\n\n    const aboveOrBelowPrevious =\n      prevNodeCoords &&\n      (nodeCoords.top > prevNodeCoords.bottom ||\n        nodeCoords.bottom < prevNodeCoords.top);\n\n    const aboveOrBelowAfter =\n      nextNodeCoords &&\n      (nodeCoords.top > nextNodeCoords.bottom ||\n        nodeCoords.bottom < nextNodeCoords.top);\n\n    const fullishWidth =\n      parent.getBoundingClientRect().width * 0.8 < nodeCoords.width;\n\n    if (fullishWidth) {\n      node.data.range.ascending = createVerticalRange(\n        nodeCoords,\n        nextNodeCoords,\n        true\n      );\n      node.data.range.descending = createVerticalRange(\n        nodeCoords,\n        prevNodeCoords,\n        false\n      );\n    } else if (aboveOrBelowAfter && !aboveOrBelowPrevious) {\n      node.data.range.ascending = createHorizontalRange(\n        nodeCoords,\n        nextNodeCoords,\n        true,\n        true\n      );\n      node.data.range.descending = createHorizontalRange(\n        nodeCoords,\n        prevNodeCoords,\n        false\n      );\n    } else if (!aboveOrBelowPrevious && !aboveOrBelowAfter) {\n      node.data.range.ascending = createHorizontalRange(\n        nodeCoords,\n        nextNodeCoords,\n        true\n      );\n      node.data.range.descending = createHorizontalRange(\n        nodeCoords,\n        prevNodeCoords,\n        false\n      );\n    } else if (aboveOrBelowPrevious && !nextNodeCoords) {\n      node.data.range.ascending = createHorizontalRange(\n        nodeCoords,\n        undefined,\n        true\n      );\n    } else if (aboveOrBelowPrevious && !aboveOrBelowAfter) {\n      node.data.range.ascending = createHorizontalRange(\n        nodeCoords,\n        nextNodeCoords,\n        true\n      );\n      node.data.range.descending = createHorizontalRange(\n        nodeCoords,\n        undefined,\n        false\n      );\n    }\n  });\n}\n\nexport function handleNodeDragover<T>(data: NodeDragEventData<T>) {\n  const config = data.targetData.parent.data.config;\n\n  if (!config.nativeDrag) return;\n\n  data.e.preventDefault();\n}\n\nfunction processParentDragEvent<T>(\n  e: DragEvent | PointerEvent,\n  targetData: ParentEventData<T>[\"targetData\"],\n  state: DragState<T>,\n  nativeDrag = false\n) {\n  pd(e);\n\n  if (nativeDrag && e instanceof PointerEvent) return;\n\n  const { x, y } = eventCoordinates(e);\n\n  // Calculate global coordinates\n  const clientX = x;\n  const clientY = y;\n\n  const scrollLeft = window.scrollX || document.documentElement.scrollLeft;\n  const scrollTop = window.scrollY || document.documentElement.scrollTop;\n\n  state.coordinates.x = clientX + scrollLeft;\n  state.coordinates.y = clientY + scrollTop;\n\n  const nestedParent = targetData.parent.data.nestedParent;\n\n  let realTargetParent = targetData.parent;\n\n  if (nestedParent) {\n    const rect = nestedParent.el.getBoundingClientRect();\n\n    if (state.coordinates.y > rect.top && state.coordinates.y < rect.bottom)\n      realTargetParent = nestedParent;\n  }\n\n  if (realTargetParent.el === state.currentParent?.el) {\n    moveBetween(realTargetParent, state);\n  } else {\n    moveOutside(realTargetParent, state);\n  }\n\n  state.currentParent = realTargetParent;\n}\n\nexport function handleParentDragover<T>(\n  data: ParentEventData<T>,\n  state: DragState<T>\n) {\n  processParentDragEvent(data.e as DragEvent, data.targetData, state, true);\n}\n\nexport function handleParentPointerover<T>(data: PointeroverParentEvent<T>) {\n  const { detail } = data;\n\n  const { state, targetData } = detail;\n\n  if (state.scrolling) return;\n\n  processParentDragEvent(detail.e, targetData, state);\n}\n\nexport function moveBetween<T>(data: ParentRecord<T>, state: DragState<T>) {\n  if (data.data.config.sortable === false) return;\n\n  if (\n    data.el === insertState.draggedOverParent?.el &&\n    insertState.draggedOverParent.data.getValues(data.el).length === 0\n  ) {\n    return;\n  } else if (insertState.draggedOverParent?.el) {\n    removeClass(\n      [insertState.draggedOverParent.el],\n      insertState.draggedOverParent.data.config.dropZoneClass\n    );\n    insertState.draggedOverParent = null;\n  }\n\n  const foundRange = findClosest(data.data.enabledNodes, state);\n\n  if (!foundRange) return;\n\n  const key = foundRange[1] as \"ascending\" | \"descending\";\n\n  if (foundRange) {\n    const position = foundRange[0].data.range\n      ? foundRange[0].data.range[key]\n      : undefined;\n\n    if (position)\n      positionInsertPoint(\n        data,\n        position,\n        foundRange[1] === \"ascending\",\n        foundRange[0],\n        insertState as InsertState<T>\n      );\n  }\n}\n\nfunction moveOutside<T>(data: ParentRecord<T>, state: DragState<T>) {\n  if (data.el === state.currentParent.el) return false;\n\n  const targetConfig = data.data.config;\n\n  if (state.draggedNode.el.contains(data.el)) return false;\n\n  if (targetConfig.dropZone === false) return;\n\n  const initialParentConfig = state.initialParent.data.config;\n\n  if (targetConfig.accepts) {\n    return targetConfig.accepts(\n      data,\n      state.initialParent,\n      state.currentParent,\n      state\n    );\n  } else if (\n    !targetConfig.group ||\n    targetConfig.group !== initialParentConfig.group\n  ) {\n    return false;\n  }\n\n  const values = data.data.getValues(data.el);\n\n  if (!values.length) {\n    addParentClass([data.el], targetConfig.dropZoneClass);\n\n    insertState.draggedOverParent = data as ParentRecord<unknown>;\n\n    const insertPoint = insertState.insertPoint;\n\n    if (insertPoint) insertPoint.el.style.display = \"none\";\n  } else {\n    removeClass([state.currentParent.el], targetConfig.dropZoneClass);\n\n    const enabledNodes = data.data.enabledNodes;\n\n    const foundRange = findClosest(enabledNodes, state);\n\n    if (!foundRange) return;\n\n    const key = foundRange[1] as \"ascending\" | \"descending\";\n\n    if (foundRange) {\n      const position = foundRange[0].data.range\n        ? foundRange[0].data.range[key]\n        : undefined;\n\n      if (position)\n        positionInsertPoint(\n          data,\n          position,\n          foundRange[1] === \"ascending\",\n          foundRange[0],\n          insertState as InsertState<T>\n        );\n    }\n  }\n}\n\nfunction findClosest<T>(enabledNodes: NodeRecord<T>[], state: DragState<T>) {\n  let foundRange: [NodeRecord<T>, string] | null = null;\n\n  for (let x = 0; x < enabledNodes.length; x++) {\n    if (!state || !enabledNodes[x].data.range) continue;\n\n    if (enabledNodes[x].data.range!.ascending) {\n      if (\n        state.coordinates.y > enabledNodes[x].data.range!.ascending!.y[0] &&\n        state.coordinates.y < enabledNodes[x].data.range!.ascending!.y[1] &&\n        state.coordinates.x > enabledNodes[x].data.range!.ascending!.x[0] &&\n        state.coordinates.x < enabledNodes[x].data.range!.ascending!.x[1]\n      ) {\n        foundRange = [enabledNodes[x], \"ascending\"];\n\n        return foundRange;\n      }\n    }\n\n    if (enabledNodes[x].data.range!.descending) {\n      if (\n        state.coordinates.y > enabledNodes[x].data.range!.descending!.y[0] &&\n        state.coordinates.y < enabledNodes[x].data.range!.descending!.y[1] &&\n        state.coordinates.x > enabledNodes[x].data.range!.descending!.x[0] &&\n        state.coordinates.x < enabledNodes[x].data.range!.descending!.x[1]\n      ) {\n        foundRange = [enabledNodes[x], \"descending\"];\n\n        return foundRange;\n      }\n    }\n  }\n}\n\nfunction createInsertPoint<T>(\n  parent: ParentRecord<T>,\n  insertState: InsertState<T>\n) {\n  const insertPoint = parent.data.config.insertConfig?.insertPoint({\n    el: parent.el,\n    data: parent.data,\n  });\n\n  if (!insertPoint)\n    throw new Error(\"Insert point not found\", { cause: parent });\n\n  insertState.insertPoint = {\n    parent,\n    el: insertPoint,\n  };\n\n  document.body.appendChild(insertPoint);\n\n  Object.assign(insertPoint.style, {\n    position: \"absolute\",\n    display: \"none\",\n  });\n}\n\nfunction removeInsertPoint<T>(insertState: InsertState<T>) {\n  if (insertState.insertPoint?.el) insertState.insertPoint.el.remove();\n\n  insertState.insertPoint = null;\n}\n\nfunction positionInsertPoint<T>(\n  parent: ParentRecord<T>,\n  position: { x: number[]; y: number[]; vertical: boolean },\n  ascending: boolean,\n  node: NodeRecord<T>,\n  insertState: InsertState<T>\n) {\n  if (insertState.insertPoint?.el !== parent.el) {\n    removeInsertPoint(insertState);\n\n    createInsertPoint(parent, insertState);\n  }\n\n  insertState.draggedOverNodes = [node];\n\n  if (!insertState.insertPoint) return;\n\n  insertState.insertPoint.el.style.display = \"block\";\n\n  if (position.vertical) {\n    const insertPointHeight =\n      insertState.insertPoint.el.getBoundingClientRect().height;\n    const targetY = position.y[ascending ? 1 : 0];\n    const topPosition = targetY - insertPointHeight / 2;\n\n    Object.assign(insertState.insertPoint.el.style, {\n      top: `${topPosition}px`,\n      left: `${position.x[0]}px`,\n      right: `${position.x[1]}px`,\n      width: `${position.x[1] - position.x[0]}px`,\n    });\n  } else {\n    const leftPosition =\n      position.x[ascending ? 1 : 0] -\n      insertState.insertPoint.el.getBoundingClientRect().width / 2;\n    insertState.insertPoint.el.style.left = `${leftPosition}px`;\n\n    Object.assign(insertState.insertPoint.el.style, {\n      top: `${position.y[0]}px`,\n      bottom: `${position.y[1]}px`,\n      height: `${position.y[1] - position.y[0]}px`,\n    });\n  }\n\n  insertState.targetIndex = node.data.index;\n\n  insertState.ascending = ascending;\n}\n\nexport function handleParentDrop<T>(_data: NodeDragEventData<T>) {}\n\n/**\n * Performs the actual insertion of the dragged nodes into the target parent.\n *\n * @param state - The current drag state.\n */\nexport function handleEnd<T>(\n  state: DragState<T> | SynthDragState<T> | BaseDragState<T>\n) {\n  if (!isDragState(state) && !isSynthDragState(state)) return;\n\n  const insertPoint = insertState.insertPoint;\n\n  if (!insertState.draggedOverParent) {\n    const draggedParentValues = parentValues(\n      state.initialParent.el,\n      state.initialParent.data\n    );\n\n    const transferred = state.initialParent.el !== state.currentParent.el;\n\n    remapNodes(state.initialParent.el);\n\n    const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n    const enabledNodes = [...state.initialParent.data.enabledNodes];\n\n    const originalIndex = state.draggedNodes[0].data.index;\n\n    const targetIndex = insertState.targetIndex;\n\n    if (\n      !transferred &&\n      insertState.draggedOverNodes[0] &&\n      insertState.draggedOverNodes[0].el !== state.draggedNodes[0].el\n    ) {\n      const newParentValues = [\n        ...draggedParentValues.filter(\n          (x) => !draggedValues.some((y) => eq(x, y))\n        ),\n      ];\n\n      let index = insertState.draggedOverNodes[0].data.index;\n\n      if (\n        insertState.targetIndex > state.draggedNodes[0].data.index &&\n        !insertState.ascending\n      ) {\n        index--;\n      } else if (\n        insertState.targetIndex < state.draggedNodes[0].data.index &&\n        insertState.ascending\n      ) {\n        index++;\n      }\n\n      newParentValues.splice(index, 0, ...draggedValues);\n\n      setParentValues(state.initialParent.el, state.initialParent.data, [\n        ...newParentValues,\n      ]);\n\n      if (state.initialParent.data.config.onSort) {\n        const sortEventData = {\n          parent: {\n            el: state.initialParent.el,\n            data: state.initialParent.data,\n          } as ParentRecord<unknown>,\n          previousValues: [...draggedParentValues],\n          previousNodes: [...enabledNodes],\n          nodes: [...state.initialParent.data.enabledNodes],\n          values: [...newParentValues],\n          draggedNodes: state.draggedNodes,\n          targetNodes: insertState.draggedOverNodes,\n          previousPosition: originalIndex,\n          position: index,\n          state: state as DragState<unknown>,\n        };\n\n        state.initialParent.data.config.onSort(sortEventData);\n      }\n    } else if (transferred && insertState.draggedOverNodes.length) {\n      const draggedParentValues = parentValues(\n        state.initialParent.el,\n        state.initialParent.data\n      );\n\n      // For the time being, we will not be remoing the value of the original dragged parent.\n      let index = insertState.draggedOverNodes[0].data.index || 0;\n\n      if (insertState.ascending) index++;\n\n      const insertValues = state.initialParent.data.config.insertConfig\n        ?.dynamicValues\n        ? state.initialParent.data.config.insertConfig.dynamicValues({\n            sourceParent: state.initialParent,\n            targetParent: state.currentParent,\n            draggedNodes: state.draggedNodes,\n            targetNodes: insertState.draggedOverNodes as NodeRecord<T>[],\n            targetIndex: index,\n          })\n        : draggedValues;\n\n      const newParentValues = [\n        ...draggedParentValues.filter(\n          (x) => !draggedValues.some((y) => eq(x, y))\n        ),\n      ];\n\n      if (state.currentParent.el.contains(state.initialParent.el)) {\n        // Update initial parent values first\n        setParentValues(state.initialParent.el, state.initialParent.data, [\n          ...newParentValues,\n        ]);\n\n        // Now get the target parent values.\n        const targetParentValues = parentValues(\n          state.currentParent.el,\n          state.currentParent.data\n        );\n\n        targetParentValues.splice(index, 0, ...insertValues);\n\n        setParentValues(state.currentParent.el, state.currentParent.data, [\n          ...targetParentValues,\n        ]);\n      } else {\n        setParentValues(state.initialParent.el, state.initialParent.data, [\n          ...newParentValues,\n        ]);\n\n        const targetParentValues = parentValues(\n          state.currentParent.el,\n          state.currentParent.data\n        );\n\n        targetParentValues.splice(index, 0, ...insertValues);\n\n        setParentValues(state.currentParent.el, state.currentParent.data, [\n          ...targetParentValues,\n        ]);\n      }\n\n      const data = {\n        sourceParent: state.initialParent,\n        targetParent: state.currentParent,\n        initialParent: state.initialParent,\n        draggedNodes: state.draggedNodes,\n        targetIndex,\n        targetNodes: insertState.draggedOverNodes as NodeRecord<T>[],\n        state,\n      };\n\n      if (state.initialParent.data.config.onTransfer)\n        state.initialParent.data.config.onTransfer(data);\n      if (state.currentParent.data.config.onTransfer)\n        state.currentParent.data.config.onTransfer(data);\n    }\n  } else if (insertState.draggedOverParent) {\n    if (state.currentParent.el.contains(state.initialParent.el)) {\n      const draggedParentValues = parentValues(\n        state.initialParent.el,\n        state.initialParent.data\n      );\n\n      const newParentValues = [\n        ...draggedParentValues.filter(\n          (x) => !draggedValues.some((y) => eq(x, y))\n        ),\n      ];\n\n      setParentValues(state.initialParent.el, state.initialParent.data, [\n        ...newParentValues,\n      ]);\n\n      const draggedOverParentValues = parentValues(\n        insertState.draggedOverParent.el,\n        insertState.draggedOverParent.data\n      );\n\n      const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n      const insertValues = state.initialParent.data.config.insertConfig\n        ?.dynamicValues\n        ? state.initialParent.data.config.insertConfig.dynamicValues({\n            sourceParent: state.initialParent,\n            targetParent: state.currentParent,\n            draggedNodes: state.draggedNodes,\n            targetNodes: insertState.draggedOverNodes as NodeRecord<T>[],\n          })\n        : draggedValues;\n\n      draggedOverParentValues.push(...insertValues);\n\n      setParentValues(\n        insertState.draggedOverParent.el,\n        insertState.draggedOverParent.data,\n        [...draggedOverParentValues]\n      );\n    } else {\n      const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n      const draggedOverParentValues = parentValues(\n        insertState.draggedOverParent.el,\n        insertState.draggedOverParent.data\n      );\n\n      const insertValues = state.initialParent.data.config.insertConfig\n        ?.dynamicValues\n        ? state.initialParent.data.config.insertConfig.dynamicValues({\n            sourceParent: state.initialParent,\n            targetParent: state.currentParent,\n            draggedNodes: state.draggedNodes,\n            targetNodes: insertState.draggedOverNodes as NodeRecord<T>[],\n          })\n        : draggedValues;\n\n      draggedOverParentValues.push(...insertValues);\n\n      setParentValues(\n        insertState.draggedOverParent.el,\n        insertState.draggedOverParent.data,\n        [...draggedOverParentValues]\n      );\n\n      const draggedParentValues = parentValues(\n        state.initialParent.el,\n        state.initialParent.data\n      );\n\n      const newParentValues = [\n        ...draggedParentValues.filter(\n          (x) => !draggedValues.some((y) => eq(x, y))\n        ),\n      ];\n\n      setParentValues(state.initialParent.el, state.initialParent.data, [\n        ...newParentValues,\n      ]);\n    }\n\n    const data: InsertEvent<T> = {\n      sourceParent: state.initialParent,\n      targetParent: state.currentParent,\n      draggedNodes: state.draggedNodes,\n      targetNodes: insertState.draggedOverNodes as NodeRecord<T>[],\n      state,\n    };\n\n    if (state.initialParent.data.config.insertConfig?.insertEvent)\n      state.initialParent.data.config.insertConfig.insertEvent(data);\n    if (state.currentParent.data.config.insertConfig?.insertEvent)\n      state.currentParent.data.config.insertConfig.insertEvent(data);\n\n    removeClass(\n      [insertState.draggedOverParent.el],\n      insertState.draggedOverParent.data.config.dropZoneClass\n    );\n  }\n\n  if (insertPoint) insertPoint.el.style.display = \"none\";\n\n  const dropZoneClass = isSynthDragState(state)\n    ? state.initialParent.data.config.synthDropZoneClass\n    : state.initialParent.data.config.dropZoneClass;\n\n  removeClass(\n    insertState.draggedOverNodes.map((node) => node.el),\n    dropZoneClass\n  );\n\n  const dragPlaceholderClass =\n    state.initialParent.data.config.dragPlaceholderClass;\n\n  removeClass(\n    state.draggedNodes.map((node) => node.el),\n    dragPlaceholderClass\n  );\n\n  insertState.draggedOverNodes = [];\n\n  insertState.draggedOverParent = null;\n}\n","import type {\n  DropSwapConfig,\n  NodeDragEventData,\n  DragState,\n  SynthDragState,\n  NodeRecord,\n  PointeroverNodeEvent,\n  ParentDragEventData,\n  PointeroverParentEvent,\n  DropSwapState,\n  ParentRecord,\n  BaseDragState,\n} from \"../../types\";\nimport {\n  parents,\n  parentValues,\n  setParentValues,\n  addNodeClass,\n  isSynthDragState,\n  removeClass,\n  addClass,\n  state,\n  addEvents,\n  isDragState,\n} from \"../../index\";\n\nexport const dropSwapState: DropSwapState<unknown> = {\n  draggedOverNodes: Array<NodeRecord<unknown>>(),\n  initialDraggedIndex: undefined,\n  transferred: false,\n  dragging: false,\n};\n\n/**\n * Abort controller for the document.\n */\nlet documentController: AbortController | undefined;\n\nexport function dropOrSwap<T>(dropSwapConfig: DropSwapConfig<T> = {}) {\n  return (parent: HTMLElement) => {\n    const parentData = parents.get(parent);\n\n    if (!parentData) return;\n\n    const dropSwapParentConfig = {\n      ...parentData.config,\n      dropSwapConfig,\n    };\n\n    return {\n      setup() {\n        dropSwapParentConfig.handleNodeDragover =\n          dropSwapConfig.handleNodeDragover || handleNodeDragover;\n\n        dropSwapParentConfig.handleParentDragover =\n          dropSwapConfig.handleParentDragover || handleParentDragover;\n\n        dropSwapParentConfig.handleNodePointerover =\n          dropSwapConfig.handleNodePointerover || handleNodePointerover;\n\n        dropSwapParentConfig.handleParentPointerover =\n          dropSwapConfig.handleParentPointerover || handeParentPointerover;\n\n        const originalHandleend = dropSwapParentConfig.handleEnd;\n\n        dropSwapParentConfig.handleEnd = (\n          state: DragState<T> | SynthDragState<T>\n        ) => {\n          handleEnd(state);\n\n          originalHandleend(state);\n        };\n\n        parentData.on(\"dragStarted\", () => {\n          documentController = addEvents(document, {\n            dragover: rootDragover,\n            handleRootPointerover: rootPointerover,\n          });\n        });\n\n        parentData.on(\"dragEnded\", () => {\n          documentController?.abort();\n        });\n\n        parentData.config = dropSwapParentConfig;\n      },\n    };\n  };\n}\n\nfunction rootDragover(_e: DragEvent) {\n  if (!isDragState(state)) return;\n\n  removeClass(\n    [state.currentParent.el],\n    state.currentParent.data.config.dropZoneParentClass\n  );\n\n  state.currentParent = state.initialParent;\n}\n\nfunction rootPointerover(_e: CustomEvent) {\n  if (!isSynthDragState(state)) return;\n\n  removeClass(\n    [state.currentParent.el],\n    state.currentParent.data.config.synthDropZoneParentClass\n  );\n\n  state.currentParent = state.initialParent;\n}\n\nfunction updateDraggedOverNodes<T>(\n  data: PointeroverNodeEvent<T> | NodeDragEventData<T>,\n  state: DragState<T> | SynthDragState<T>\n) {\n  const targetData =\n    \"detail\" in data ? data.detail.targetData : data.targetData;\n\n  const config = targetData.parent.data.config;\n\n  const dropZoneClass = isSynthDragState(state)\n    ? config.synthDropZoneClass\n    : config.dropZoneClass;\n\n  removeClass(\n    dropSwapState.draggedOverNodes.map((node) => node.el),\n    dropZoneClass\n  );\n\n  const enabledNodes = targetData.parent.data.enabledNodes;\n\n  if (!enabledNodes) return;\n\n  dropSwapState.draggedOverNodes = enabledNodes.slice(\n    targetData.node.data.index,\n    targetData.node.data.index + state.draggedNodes.length\n  );\n\n  addNodeClass(\n    dropSwapState.draggedOverNodes.map((node) => node.el),\n    dropZoneClass,\n    true\n  );\n\n  state.currentTargetValue = targetData.node.data.value;\n\n  state.currentParent = targetData.parent;\n\n  addClass(\n    state.currentParent.el,\n    isSynthDragState(state)\n      ? config.synthDropZoneParentClass\n      : config.dropZoneParentClass,\n    state.currentParent.data,\n    true\n  );\n}\n\nfunction handleNodeDragover<T>(\n  data: NodeDragEventData<T>,\n  state: DragState<T>\n) {\n  data.e.preventDefault();\n\n  data.e.stopPropagation();\n\n  updateDraggedOverNodes(data, state);\n}\n\nexport function handleParentDragover<T>(\n  data: ParentDragEventData<T>,\n  state: DragState<T>\n) {\n  data.e.preventDefault();\n\n  data.e.stopPropagation();\n\n  const currentConfig = state.currentParent.data.config;\n\n  removeClass(\n    dropSwapState.draggedOverNodes.map((node) => node.el),\n    currentConfig.dropZoneClass\n  );\n\n  removeClass([state.currentParent.el], currentConfig.dropZoneParentClass);\n\n  const config = data.targetData.parent.data.config;\n\n  addClass(\n    data.targetData.parent.el,\n    config.dropZoneParentClass,\n    data.targetData.parent.data,\n    true\n  );\n\n  dropSwapState.draggedOverNodes = [];\n\n  state.currentParent = data.targetData.parent;\n}\n\nexport function handeParentPointerover<T>(data: PointeroverParentEvent<T>) {\n  const currentConfig = data.detail.state.currentParent.data.config;\n\n  removeClass(\n    dropSwapState.draggedOverNodes.map((node) => node.el),\n    currentConfig.synthDropZoneClass\n  );\n\n  removeClass(\n    [data.detail.state.currentParent.el],\n    currentConfig.synthDropZoneParentClass\n  );\n\n  const config = data.detail.targetData.parent.data.config;\n\n  addClass(\n    data.detail.targetData.parent.el,\n    config.synthDropZoneParentClass,\n    data.detail.targetData.parent.data,\n    true\n  );\n\n  dropSwapState.draggedOverNodes = [];\n\n  data.detail.state.currentParent = data.detail.targetData.parent;\n}\n\nfunction handleNodePointerover<T>(data: PointeroverNodeEvent<T>) {\n  if (!isSynthDragState(data.detail.state)) return;\n\n  updateDraggedOverNodes(data, data.detail.state);\n}\n\nfunction swapElements<T>(\n  arr1: T[],\n  arr2: T[] | null,\n  index1: number | number[],\n  index2: number\n): T[] | [T[], T[]] {\n  const indices1 = Array.isArray(index1) ? index1 : [index1];\n\n  if (arr2 === null) {\n    const elementsFromArr1 = indices1.map((i) => arr1[i]);\n\n    const elementFromArr2 = arr1[index2];\n\n    arr1.splice(index2, 1, ...elementsFromArr1);\n\n    indices1.forEach((i, idx) => {\n      arr1[i] = idx === 0 ? elementFromArr2 : (undefined as unknown as T);\n    });\n\n    return arr1.filter((el) => el !== undefined);\n  } else {\n    const elementsFromArr1 = indices1.map((i) => arr1[i]);\n\n    const elementFromArr2 = arr2[index2];\n\n    arr2.splice(index2, 1, ...elementsFromArr1);\n\n    indices1.forEach((i, idx) => {\n      arr1[i] = idx === 0 ? elementFromArr2 : (undefined as unknown as T);\n    });\n\n    return [arr1.filter((el) => el !== undefined), arr2];\n  }\n}\n\nfunction handleEnd<T>(state: DragState<T> | SynthDragState<T>) {\n  const isSynth = isSynthDragState(state);\n\n  removeClass(\n    [state.currentParent.el],\n    isSynth\n      ? state.currentParent.data.config.synthDropZoneParentClass\n      : state.currentParent.data.config.dropZoneParentClass\n  );\n\n  removeClass(\n    dropSwapState.draggedOverNodes.map((node) => node.el),\n    isSynth\n      ? state.currentParent.data.config.synthDropZoneClass\n      : state.currentParent.data.config.dropZoneClass\n  );\n\n  const values = parentValues(state.currentParent.el, state.currentParent.data);\n\n  const draggedValues = state.draggedNodes.map((node) => node.data.value);\n\n  const newValues = values.filter((x) => !draggedValues.includes(x));\n\n  const targetIndex = dropSwapState.draggedOverNodes[0]?.data.index;\n\n  const draggedIndex = state.draggedNodes[0].data.index;\n\n  const initialParentValues = parentValues(\n    state.initialParent.el,\n    state.initialParent.data\n  );\n\n  if (targetIndex === undefined) {\n    if (state.initialParent.el === state.currentParent.el) return;\n\n    const newInitialValues = initialParentValues.filter(\n      (x) => !draggedValues.includes(x)\n    );\n\n    setParentValues(\n      state.initialParent.el,\n      state.initialParent.data,\n      newInitialValues\n    );\n\n    setParentValues(\n      state.currentParent.el,\n      state.currentParent.data,\n      values.concat(draggedValues)\n    );\n\n    return;\n  }\n\n  let swap = false;\n\n  const shouldSwap = state.initialParent.data.config.dropSwapConfig?.shouldSwap;\n\n  if (shouldSwap)\n    swap = shouldSwap({\n      sourceParent: state.initialParent,\n      targetParent: state.currentParent,\n      draggedNodes: state.draggedNodes,\n      targetNodes: dropSwapState.draggedOverNodes as NodeRecord<T>[],\n      state,\n    });\n\n  if (state.initialParent.el === state.currentParent.el) {\n    newValues.splice(targetIndex, 0, ...draggedValues);\n\n    setParentValues(\n      state.currentParent.el,\n      state.currentParent.data,\n      swap ? swapElements(values, null, draggedIndex, targetIndex) : newValues\n    );\n\n    if (state.initialParent.data.config.onSort) {\n      state.initialParent.data.config.onSort({\n        parent: {\n          el: state.initialParent.el,\n          data: state.initialParent.data,\n        } as ParentRecord<unknown>,\n        previousValues: [...initialParentValues],\n        previousNodes: [...state.initialParent.data.enabledNodes],\n        nodes: [...state.initialParent.data.enabledNodes],\n        values: [...newValues],\n        draggedNodes: state.draggedNodes,\n        previousPosition: draggedIndex,\n        position: targetIndex,\n        targetNodes: dropSwapState.draggedOverNodes as NodeRecord<T>[],\n        state: state as BaseDragState<unknown>,\n      });\n    }\n  } else {\n    if (swap) {\n      const res = swapElements(\n        initialParentValues,\n        newValues,\n        state.initialIndex,\n        targetIndex\n      );\n\n      setParentValues(\n        state.initialParent.el,\n        state.initialParent.data,\n        res[0] as T[]\n      );\n\n      setParentValues(\n        state.currentParent.el,\n        state.currentParent.data,\n        res[1] as T[]\n      );\n    } else {\n      const newInitialValues = initialParentValues.filter(\n        (x) => !draggedValues.includes(x)\n      );\n\n      setParentValues(\n        state.initialParent.el,\n        state.initialParent.data,\n        newInitialValues\n      );\n\n      newValues.splice(targetIndex, 0, ...draggedValues);\n\n      setParentValues(\n        state.currentParent.el,\n        state.currentParent.data,\n        newValues\n      );\n    }\n  }\n\n  if (state.currentParent.data.config.onTransfer) {\n    state.currentParent.data.config.onTransfer({\n      sourceParent: state.currentParent,\n      targetParent: state.initialParent,\n      initialParent: state.initialParent,\n      draggedNodes: state.draggedNodes,\n      targetIndex,\n      state,\n      targetNodes: dropSwapState.draggedOverNodes as NodeRecord<T>[],\n    });\n  }\n\n  if (state.initialParent.data.config.onTransfer) {\n    state.initialParent.data.config.onTransfer({\n      sourceParent: state.initialParent,\n      targetParent: state.currentParent,\n      initialParent: state.initialParent,\n      draggedNodes: state.draggedNodes,\n      targetIndex,\n      state,\n      targetNodes: dropSwapState.draggedOverNodes as NodeRecord<T>[],\n    });\n  }\n}\n"],"mappings":"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","names":["handleEnd","handleNodeDragover","handleNodePointerover","handleParentDragover","handleParentPointerover","emit","on","state","insertState","state","draggedParentValues","documentController","handleNodeDragover","handleParentDragover","state","handleEnd","documentController","baseDragState","dragStateProps","handleEnd","nodes","emit","on","handleNodeDragover","handleParentDragover","handleNodePointerover","handleParentPointerover","draggedNodes","state","parent","x","scrollTimeout","className"]}