@vue-dnd-kit/core 2.0.0-alpha2 → 2.0.0-alpha3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/external/components/DefaultOverlay.vue.d.ts +0 -1
- package/dist/external/components/DnDProvider.vue.d.ts +0 -1
- package/dist/external/composables/makeBoundingBox.d.ts +0 -1
- package/dist/external/composables/makeCustomOverlay.d.ts +0 -1
- package/dist/external/composables/makeDraggable.d.ts +0 -1
- package/dist/external/composables/makeDroppable.d.ts +0 -1
- package/dist/external/composables/makeSelectableArea.d.ts +0 -1
- package/dist/external/composables/useDnDProvider.d.ts +0 -1
- package/dist/external/index.d.ts +0 -1
- package/dist/internal/composables/useDnDProviderEvents.d.ts +0 -1
- package/dist/internal/composables/useDnDProviderInternal.d.ts +0 -1
- package/dist/internal/composables/useDnDProviderState.d.ts +0 -1
- package/dist/internal/composables/useSizeObserver.d.ts +0 -1
- package/dist/internal/logic/hover.d.ts +0 -1
- package/dist/internal/logic/keyboard.d.ts +0 -1
- package/dist/internal/logic/payload.d.ts +0 -1
- package/dist/internal/logic/pointer.d.ts +0 -1
- package/dist/internal/logic/scroll.d.ts +0 -1
- package/dist/internal/sensors/defaultCollision.d.ts +0 -1
- package/dist/internal/sensors/index.d.ts +0 -1
- package/dist/internal/sensors/sensor.d.ts +0 -1
- package/dist/internal/sensors/steps.d.ts +0 -1
- package/dist/internal/utils/constraints.d.ts +0 -1
- package/dist/internal/utils/disabled.d.ts +0 -1
- package/dist/internal/utils/dom.d.ts +0 -1
- package/dist/internal/utils/drag-activation.d.ts +0 -1
- package/dist/internal/utils/events.d.ts +0 -1
- package/dist/internal/utils/geometry.d.ts +0 -1
- package/dist/internal/utils/groups.d.ts +0 -1
- package/dist/internal/utils/keyboard.d.ts +0 -1
- package/dist/internal/utils/namespaces.d.ts +0 -1
- package/dist/internal/utils/observer.d.ts +0 -1
- package/dist/internal/utils/placement.d.ts +0 -1
- package/dist/internal/utils/pointer.d.ts +0 -1
- package/dist/internal/utils/provider.d.ts +0 -1
- package/dist/internal/utils/selection.d.ts +0 -1
- package/dist/internal/utils/session.d.ts +0 -1
- package/dist/vue-dnd-kit-core.cjs.js +1 -1
- package/dist/vue-dnd-kit-core.cjs.js.map +1 -1
- package/dist/vue-dnd-kit-core.es.js +1 -1
- package/dist/vue-dnd-kit-core.es.js.map +1 -1
- package/package.json +3 -6
- package/dist/external/components/DefaultOverlay.vue.d.ts.map +0 -1
- package/dist/external/components/DnDProvider.vue.d.ts.map +0 -1
- package/dist/external/composables/makeBoundingBox.d.ts.map +0 -1
- package/dist/external/composables/makeCustomOverlay.d.ts.map +0 -1
- package/dist/external/composables/makeDraggable.d.ts.map +0 -1
- package/dist/external/composables/makeDroppable.d.ts.map +0 -1
- package/dist/external/composables/makeSelectableArea.d.ts.map +0 -1
- package/dist/external/composables/useDnDProvider.d.ts.map +0 -1
- package/dist/external/index.d.ts.map +0 -1
- package/dist/internal/composables/useDnDProviderEvents.d.ts.map +0 -1
- package/dist/internal/composables/useDnDProviderInternal.d.ts.map +0 -1
- package/dist/internal/composables/useDnDProviderState.d.ts.map +0 -1
- package/dist/internal/composables/useSizeObserver.d.ts.map +0 -1
- package/dist/internal/logic/hover.d.ts.map +0 -1
- package/dist/internal/logic/keyboard.d.ts.map +0 -1
- package/dist/internal/logic/payload.d.ts.map +0 -1
- package/dist/internal/logic/pointer.d.ts.map +0 -1
- package/dist/internal/logic/scroll.d.ts.map +0 -1
- package/dist/internal/sensors/defaultCollision.d.ts.map +0 -1
- package/dist/internal/sensors/index.d.ts.map +0 -1
- package/dist/internal/sensors/sensor.d.ts.map +0 -1
- package/dist/internal/sensors/steps.d.ts.map +0 -1
- package/dist/internal/utils/constraints.d.ts.map +0 -1
- package/dist/internal/utils/disabled.d.ts.map +0 -1
- package/dist/internal/utils/dom.d.ts.map +0 -1
- package/dist/internal/utils/drag-activation.d.ts.map +0 -1
- package/dist/internal/utils/events.d.ts.map +0 -1
- package/dist/internal/utils/geometry.d.ts.map +0 -1
- package/dist/internal/utils/groups.d.ts.map +0 -1
- package/dist/internal/utils/keyboard.d.ts.map +0 -1
- package/dist/internal/utils/namespaces.d.ts.map +0 -1
- package/dist/internal/utils/observer.d.ts.map +0 -1
- package/dist/internal/utils/placement.d.ts.map +0 -1
- package/dist/internal/utils/pointer.d.ts.map +0 -1
- package/dist/internal/utils/provider.d.ts.map +0 -1
- package/dist/internal/utils/selection.d.ts.map +0 -1
- package/dist/internal/utils/session.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue-dnd-kit-core.es.js","sources":["../src/internal/utils/namespaces.ts","../src/internal/utils/provider.ts","../src/internal/utils/dom.ts","../src/internal/utils/disabled.ts","../src/internal/utils/observer.ts","../src/internal/composables/useSizeObserver.ts","../src/internal/utils/pointer.ts","../src/internal/utils/drag-activation.ts","../src/internal/utils/constraints.ts","../src/internal/composables/useDnDProviderState.ts","../src/internal/utils/session.ts","../src/internal/logic/payload.ts","../src/internal/utils/events.ts","../src/internal/utils/groups.ts","../src/internal/utils/selection.ts","../src/internal/utils/placement.ts","../src/internal/logic/hover.ts","../src/internal/utils/geometry.ts","../src/internal/sensors/sensor.ts","../src/internal/sensors/steps.ts","../src/internal/sensors/defaultCollision.ts","../src/internal/logic/pointer.ts","../src/internal/logic/keyboard.ts","../src/internal/logic/scroll.ts","../src/internal/composables/useDnDProviderEvents.ts","../src/internal/composables/useDnDProviderInternal.ts","../src/external/composables/useDnDProvider.ts","../src/external/components/DefaultOverlay.vue","../src/external/components/DnDProvider.vue","../src/external/composables/makeDraggable.ts","../src/external/composables/makeSelectableArea.ts","../src/external/composables/makeBoundingBox.ts","../src/external/composables/makeDroppable.ts"],"sourcesContent":["/**\n * DnD Kit data attributes and CSS selectors\n */\nexport const DnDAttributes = {\n SELECT_AREA: 'data-dnd-kit-select-area',\n DRAGGABLE: 'data-dnd-kit-draggable',\n DROPPABLE: 'data-dnd-kit-droppable',\n CONSTRAINT_AREA: 'data-dnd-kit-constraint-area',\n CONTAINER: 'data-dnd-kit-container'\n} as const;\n\nexport const DnDSelectors = {\n SELECT_AREA: `[${DnDAttributes.SELECT_AREA}]`,\n DRAGGABLE: `[${DnDAttributes.DRAGGABLE}]`,\n DROPPABLE: `[${DnDAttributes.DROPPABLE}]`,\n CONSTRAINT_AREA: `[${DnDAttributes.CONSTRAINT_AREA}]`,\n CONTAINER: `[${DnDAttributes.CONTAINER}]`\n} as const;\n\nexport const injectionKey = 'VueDnDKitProvider' as const\n","import type {\r\n IDraggableEntity,\r\n ISelectableAreaEntity,\r\n} from '../../external/types';\r\n\r\nimport type { Ref } from 'vue';\r\n\r\n/**\r\n * Utility for filtering entities by modifier keys.\r\n *\r\n * @param entityMap - Map of entities (e.g. selectableAreaMap or draggableEntityMap)\r\n * @param visibleSet - Set of visible nodes\r\n * @param modifiers - Ref with pressed keys\r\n * @param isDisabled - Optional: override disabled check (e.g. isEffectivelyDisabledDraggable for draggables)\r\n * @returns Set of filtered nodes with matching modifiers\r\n */\r\nexport const filterByModifiers = (\r\n entityMap: Map<HTMLElement, IDraggableEntity | ISelectableAreaEntity>,\r\n visibleSet: Set<HTMLElement>,\r\n modifiers: Ref<Set<string>>,\r\n isDisabled?: (node: HTMLElement) => boolean\r\n): Set<HTMLElement> => {\r\n const result: Set<HTMLElement> = new Set();\r\n\r\n visibleSet.forEach((visibleNode) => {\r\n const entity = entityMap.get(visibleNode);\r\n const disabled = isDisabled ? isDisabled(visibleNode) : entity?.disabled;\r\n if (!entity || disabled) return;\r\n\r\n const keys = entity.modifier?.keys;\r\n const method = entity.modifier?.method;\r\n\r\n // If no modifier keys are specified, element is always available\r\n if (!keys || !method || keys.length === 0) {\r\n result.add(visibleNode);\r\n return;\r\n }\r\n\r\n const keysPressed = keys[method]((key) => modifiers.value.has(key));\r\n\r\n if (keysPressed) {\r\n result.add(visibleNode);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n","import type { ComponentPublicInstance } from 'vue';\r\nimport type { ICoordinates, TDnDNodeRef } from '../../external/types';\r\n\r\nlet originalUserSelect = '';\r\nlet originalTouchAction = '';\r\nlet originalOverscrollBehavior = '';\r\n\r\n/**\r\n * Resolves template ref to HTMLElement (handles both element and component refs)\r\n */\r\nexport const getNode = (node: TDnDNodeRef) => {\r\n if (!node.value) return null;\r\n if (node.value instanceof HTMLElement) {\r\n return node.value;\r\n } else {\r\n const component = node.value as ComponentPublicInstance;\r\n return component.$el as HTMLElement;\r\n }\r\n};\r\n\r\n/**\r\n * Checks if point (x, y) is inside rect\r\n */\r\nexport const containsPoint = (rect: DOMRect, x: number, y: number): boolean =>\r\n x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\r\n\r\n/**\r\n * True if child is a descendant of parent (parent.contains(child) and parent !== child)\r\n */\r\nexport const isDescendant = (parent: HTMLElement, child: HTMLElement): boolean =>\r\n parent !== child && parent.contains(child);\r\n\r\n/**\r\n * Checks if two DOMRects intersect\r\n */\r\nexport const checkIntersection = (rect1: DOMRect, rect2: DOMRect): boolean => {\r\n const noIntersection =\r\n rect1.right < rect2.left ||\r\n rect1.left > rect2.right ||\r\n rect1.bottom < rect2.top ||\r\n rect1.top > rect2.bottom;\r\n\r\n return !noIntersection;\r\n};\r\n\r\n/**\r\n * Returns true if event target is outside the container\r\n */\r\nexport const isNotDirectClick = (\r\n event: Event,\r\n container: HTMLElement | null\r\n): boolean => {\r\n return (\r\n container !== null &&\r\n event.target !== container &&\r\n !container.contains(event.target as Node)\r\n );\r\n};\r\n\r\n/**\r\n * Returns scroll direction based on cursor proximity to container edges\r\n */\r\nexport const getAutoScrollDirection = (\r\n coords: ICoordinates,\r\n container: HTMLElement,\r\n threshold: number = 50\r\n): { x: number; y: number } => {\r\n const rect = container.getBoundingClientRect();\r\n\r\n const distanceFromLeft = coords.x - rect.left;\r\n const distanceFromRight = rect.right - coords.x;\r\n const distanceFromTop = coords.y - rect.top;\r\n const distanceFromBottom = rect.bottom - coords.y;\r\n\r\n let scrollX = 0;\r\n let scrollY = 0;\r\n\r\n if (distanceFromLeft < threshold && distanceFromLeft > 0) {\r\n scrollX = -1;\r\n } else if (distanceFromRight < threshold && distanceFromRight > 0) {\r\n scrollX = 1;\r\n }\r\n\r\n if (distanceFromTop < threshold && distanceFromTop > 0) {\r\n scrollY = -1;\r\n } else if (distanceFromBottom < threshold && distanceFromBottom > 0) {\r\n scrollY = 1;\r\n }\r\n\r\n return { x: scrollX, y: scrollY };\r\n};\r\n\r\n/**\r\n * Returns true if running in browser environment\r\n */\r\nexport const isClient = () => typeof window !== 'undefined';\r\n\r\n/**\r\n * Disables user interactions during drag (user-select, context menu, etc.)\r\n */\r\nexport const disableInteractions = () => {\r\n const body = document.body;\r\n\r\n originalUserSelect = body.style.userSelect;\r\n\r\n body.style.userSelect = 'none';\r\n\r\n window.addEventListener('contextmenu', preventEvent);\r\n window.addEventListener('selectstart', preventEvent);\r\n window.addEventListener('touchstart', preventEvent);\r\n window.addEventListener('touchmove', preventEvent);\r\n};\r\n\r\n/**\r\n * Restores user interactions after drag ends\r\n */\r\nexport const enableInteractions = () => {\r\n const body = document.body;\r\n\r\n body.style.userSelect = originalUserSelect;\r\n body.style.touchAction = originalTouchAction;\r\n body.style.overscrollBehavior = originalOverscrollBehavior;\r\n\r\n window.removeEventListener('contextmenu', preventEvent);\r\n window.removeEventListener('selectstart', preventEvent);\r\n window.removeEventListener('touchstart', preventEvent);\r\n window.removeEventListener('touchmove', preventEvent);\r\n};\r\n\r\n/**\r\n * Prevents default browser behavior for the event\r\n */\r\nexport const preventEvent = (event: Event) => event.preventDefault();\r\n","/**\n * Disabled check — element is disabled if itself or any parent is disabled.\n * Split by context to avoid iterating both maps when only one is needed.\n */\n\nimport { isDescendant } from './dom';\nimport type { IEntities } from '../../external/types';\n\n/** Minimal context for draggable/droppable checks */\nexport type IEffectivelyDisabledContext = { entities: Pick<IEntities, 'draggableMap' | 'droppableMap'> };\n\n/** True if node is disabled as draggable (self or inside disabled draggable). O(draggableMap.size) */\nexport const isEffectivelyDisabledDraggable = (\n node: HTMLElement,\n ctx: IEffectivelyDisabledContext\n): boolean => {\n const entity = ctx.entities.draggableMap.get(node);\n if (entity?.disabled) return true;\n for (const [el, e] of ctx.entities.draggableMap) {\n if (e.disabled && isDescendant(el, node)) return true;\n }\n return false;\n};\n\n/** True if node is disabled as droppable (self or inside disabled droppable). O(droppableMap.size) */\nexport const isEffectivelyDisabledDroppable = (\n node: HTMLElement,\n ctx: IEffectivelyDisabledContext\n): boolean => {\n const entity = ctx.entities.droppableMap.get(node);\n if (entity?.disabled) return true;\n for (const [el, e] of ctx.entities.droppableMap) {\n if (e.disabled && isDescendant(el, node)) return true;\n }\n return false;\n};\n","/**\r\n * Observers — IntersectionObserver (visibility) and ResizeObserver (size)\r\n */\r\n\r\nexport interface IObserverWrapper {\r\n observe: (element: HTMLElement) => void;\r\n unobserve: (element: HTMLElement) => void;\r\n disconnect: () => void;\r\n}\r\n\r\n/**\r\n * Creates an IntersectionObserver that manages a Set of visible elements\r\n *\r\n * @param targetSet - Set to add/remove elements\r\n * @returns Object with observe/unobserve/disconnect methods\r\n */\r\nexport const createIntersectionObserver = (targetSet: Set<HTMLElement>): IObserverWrapper => {\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n const element = entry.target as HTMLElement;\r\n targetSet[entry.isIntersecting ? 'add' : 'delete'](element);\r\n });\r\n });\r\n\r\n return {\r\n observe: (el) => observer.observe(el),\r\n unobserve: (el) => observer.unobserve(el),\r\n disconnect: () => observer.disconnect(),\r\n };\r\n};\r\n\r\n/**\r\n * Creates a ResizeObserver that tracks element size and writes to target ref\r\n *\r\n * @param target - Ref to write { width, height } on resize\r\n * @returns Object with observe/unobserve/disconnect methods\r\n */\r\nexport const createSizeObserver = (\r\n target: { value: { width: number; height: number } | null }\r\n): IObserverWrapper => {\r\n const observer = new ResizeObserver((entries) => {\r\n const entry = entries[0];\r\n if (!entry) return;\r\n const { width, height } = entry.contentRect;\r\n target.value = { width, height };\r\n });\r\n\r\n return {\r\n observe: (el) => observer.observe(el),\r\n unobserve: (el) => observer.unobserve(el),\r\n disconnect: () => observer.disconnect(),\r\n };\r\n};\r\n","import { ref, watch, type Ref } from 'vue';\nimport { createSizeObserver } from '../utils/observer';\n\n/**\n * Tracks element size via ResizeObserver, writes to returned ref\n *\n * @param elementRef - Ref to element to observe\n * @returns { overlaySize, overlaySizeObserver } — ref with { width, height } and cleanup\n */\n\nexport const useSizeObserver = (\n elementRef: Ref<HTMLElement | null>\n) => {\n const overlaySize = ref<DOMRect | null>(null);\n const observer = createSizeObserver(overlaySize);\n\n const stopWatch = watch(\n elementRef,\n (el) => {\n observer.disconnect();\n if (el) observer.observe(el);\n },\n { immediate: true }\n );\n\n const overlaySizeObserver = {\n disconnect: () => {\n stopWatch();\n observer.disconnect();\n },\n };\n\n return { overlaySize, overlaySizeObserver };\n};\n","import type {\n IDraggableEntity,\n IDraggingEntity,\n TPointerState,\n} from '../../external/types';\nimport type { IDnDProviderInternal } from '../types/provider';\n\n/**\n * Creates initial pointer state from event\n */\nexport function createPointerState(\n event: PointerEvent,\n offsetX: number = 0,\n offsetY: number = 0\n): TPointerState {\n return {\n start: { x: event.clientX, y: event.clientY },\n current: { x: event.clientX, y: event.clientY },\n offset: { x: offsetX, y: offsetY },\n };\n}\n\n/**\n * Calculates cursor offset as ratio (0–1) relative to element size\n */\nexport function calculateCursorOffset(\n event: PointerEvent,\n element: HTMLElement\n): { x: number; y: number } {\n const rect = element.getBoundingClientRect();\n\n const x = rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0.5;\n const y = rect.height > 0 ? (event.clientY - rect.top) / rect.height : 0.5;\n return { x, y };\n}\n\n/**\n * Creates dragging entity with initial data\n */\nexport function createDraggingEntity(\n element: HTMLElement,\n draggableEntity?: IDraggableEntity\n): IDraggingEntity {\n return {\n ...draggableEntity,\n initialHTML: element.innerHTML,\n initialRect: element.getBoundingClientRect(),\n };\n}\n\n/**\n * Инициализирует dragging для выбранных элементов\n */\nexport function initializeDraggingFromSelection(\n selectedSet: Set<HTMLElement>,\n draggableMap: Map<HTMLElement, IDraggableEntity>,\n draggingMap: Map<HTMLElement, IDraggingEntity>\n): void {\n selectedSet.forEach((selected) => {\n const draggingEntity = draggableMap.get(selected);\n draggingMap.set(selected, createDraggingEntity(selected, draggingEntity));\n });\n selectedSet.clear();\n}\n\n/**\n * Initializes dragging for single element\n */\nexport function initializeDraggingFromElement(\n element: HTMLElement,\n draggableMap: Map<HTMLElement, IDraggableEntity>,\n draggingMap: Map<HTMLElement, IDraggingEntity>\n): void {\n draggingMap.clear();\n const draggingEntity = draggableMap.get(element);\n draggingMap.set(element, createDraggingEntity(element, draggingEntity));\n}\n\n/**\n * Starts dragging for the current provider state (initiatingDraggable + selectedSet)\n */\nexport function startDraggingForProvider(provider: IDnDProviderInternal): void {\n if (!provider.entities.initiatingDraggable) return;\n provider.state.value = 'dragging';\n initializeDragging(\n provider.entities.initiatingDraggable,\n provider.entities.selectedSet,\n provider.entities.draggableMap,\n provider.entities.draggingMap\n );\n}\n\n/**\n * Initializes dragging (chooses between selection and single element)\n */\nexport function initializeDragging(\n initiatingElement: HTMLElement,\n selectedSet: Set<HTMLElement>,\n draggableMap: Map<HTMLElement, IDraggableEntity>,\n draggingMap: Map<HTMLElement, IDraggingEntity>\n): void {\n if (selectedSet.has(initiatingElement)) {\n initializeDraggingFromSelection(selectedSet, draggableMap, draggingMap);\n } else {\n selectedSet.clear();\n initializeDraggingFromElement(initiatingElement, draggableMap, draggingMap);\n }\n}\n","import type { IDragActivation, TPointerState } from '../../external/types';\nimport type { IDnDProviderInternal } from '../types/provider';\nimport { startDraggingForProvider } from './pointer';\n\n/**\n * Checks if the click target is within the drag handle (if specified)\n * @param skipHandle - when true (e.g. keyboard drag), bypass handle check\n */\nexport function checkDragHandle(\n target: HTMLElement,\n draggable: HTMLElement,\n handleSelector?: string,\n skipHandle?: boolean\n): boolean {\n if (skipHandle || !handleSelector) return true;\n\n const handleElement = target.closest(handleSelector) as HTMLElement | null;\n\n if (!handleElement) return false;\n\n return draggable.contains(handleElement);\n}\n\n/**\n * Calculates distance progress (0-1) for activation threshold\n */\nexport function calculateDistanceProgress(\n pointer: TPointerState,\n distanceThreshold: IDragActivation['distance']\n): number {\n if (!pointer || !distanceThreshold) return 1;\n\n const deltaX = Math.abs(pointer.current.x - pointer.start.x);\n const deltaY = Math.abs(pointer.current.y - pointer.start.y);\n\n if (typeof distanceThreshold === 'number') {\n const movedDistance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n return Math.min(movedDistance / distanceThreshold, 1);\n }\n\n const {\n x: distanceX = 0,\n y: distanceY = 0,\n condition = 'any',\n } = distanceThreshold;\n\n if (distanceX === 0 && distanceY === 0) return 1;\n\n const progressX = distanceX > 0 ? Math.min(deltaX / distanceX, 1) : 1;\n const progressY = distanceY > 0 ? Math.min(deltaY / distanceY, 1) : 1;\n\n return condition === 'both'\n ? Math.min(progressX, progressY)\n : Math.max(progressX, progressY);\n}\n\n/**\n * Returns true if distance threshold is met\n */\nexport function isDistanceThresholdPassed(\n pointer: TPointerState,\n distanceThreshold: IDragActivation['distance']\n): boolean {\n return calculateDistanceProgress(pointer, distanceThreshold) >= 1;\n}\n\n/**\n * Returns true if activation conditions are met (distance + delay, respecting condition)\n */\nexport function isActivationComplete(\n distanceProgress: number,\n delayProgress: number,\n activation?: IDragActivation\n): boolean {\n if (!activation) return true;\n\n const hasDistance = activation.distance != null;\n const hasDelay = activation.delay != null;\n\n if (!hasDistance && !hasDelay) return true;\n if (hasDistance && !hasDelay) return distanceProgress >= 1;\n if (!hasDistance && hasDelay) return delayProgress >= 1;\n\n const condition = activation.condition ?? 'both';\n return condition === 'both'\n ? distanceProgress >= 1 && delayProgress >= 1\n : distanceProgress >= 1 || delayProgress >= 1;\n}\n\n/**\n * If activation is complete, starts dragging. Returns true if drag was started\n */\nexport function tryStartDragIfActivationComplete(\n provider: IDnDProviderInternal\n): boolean {\n if (\n provider.state.value !== 'activating' ||\n !provider.entities.initiatingDraggable\n )\n return false;\n const entity = provider.entities.draggableMap.get(\n provider.entities.initiatingDraggable\n );\n if (\n !isActivationComplete(\n provider.distanceProgress.value,\n provider.delay.progress,\n entity?.activation\n )\n ) {\n return false;\n }\n startDraggingForProvider(provider);\n return true;\n}\n\n/**\n * Creates RAF-based delay timer that ticks until activation is complete, then calls onComplete\n */\nexport function createActivationDelayTimer(\n provider: IDnDProviderInternal,\n onComplete: () => void\n): { cancel: () => void } {\n let rafId: number | null = null;\n const tick = () => {\n if (\n provider.state.value !== 'activating' ||\n !provider.entities.initiatingDraggable\n ) {\n rafId = null;\n return;\n }\n const entity = provider.entities.draggableMap.get(\n provider.entities.initiatingDraggable\n );\n const delay = entity?.activation?.delay;\n if (!delay) {\n rafId = null;\n return;\n }\n provider.delay.progress = Math.min(\n (Date.now() - provider.delay.startTime) / (delay * 1000),\n 1\n );\n if (\n isActivationComplete(\n provider.distanceProgress.value,\n provider.delay.progress,\n entity?.activation\n )\n ) {\n onComplete();\n rafId = null;\n } else {\n rafId = requestAnimationFrame(tick);\n }\n };\n rafId = requestAnimationFrame(tick);\n return {\n cancel: () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n },\n };\n}\n","import type {\n IConstraintsAreaEntity,\n TPointerState,\n} from '../../external/types';\nimport { DnDSelectors } from './namespaces';\n\n/**\n * Finds constraint area for a draggable element\n */\nexport function findConstraintArea(\n draggable: HTMLElement,\n constraintsAreaMap: Map<HTMLElement, IConstraintsAreaEntity>\n): { element: HTMLElement; entity: IConstraintsAreaEntity } | null {\n const constraintElement = draggable.closest(\n DnDSelectors.CONSTRAINT_AREA\n ) as HTMLElement | null;\n\n if (!constraintElement || !constraintsAreaMap.has(constraintElement)) {\n return null;\n }\n\n return {\n element: constraintElement,\n entity: constraintsAreaMap.get(constraintElement)!,\n };\n}\n\n/**\n * Applies axis constraint\n */\nexport function applyAxisConstraint(\n targetX: number,\n targetY: number,\n axis: 'x' | 'y' | 'both',\n draggableRect: DOMRect\n): { x: number; y: number } {\n if (axis === 'x') {\n // Horizontal movement only\n return { x: targetX, y: draggableRect.top };\n } else if (axis === 'y') {\n // Vertical movement only\n return { x: draggableRect.left, y: targetY };\n }\n\n return { x: targetX, y: targetY };\n}\n\n/**\n * Applies bounds constraint within container\n */\nexport function applyBoundsConstraint(\n targetX: number,\n targetY: number,\n axis: 'x' | 'y' | 'both',\n constraintRect: DOMRect,\n overlayRect: DOMRect\n): { x: number; y: number } {\n let x = targetX;\n let y = targetY;\n\n // Constrain X (if axis is not Y only)\n if (axis !== 'y') {\n x = Math.max(\n constraintRect.left,\n Math.min(constraintRect.right - overlayRect.width, targetX)\n );\n }\n\n // Constrain Y (if axis is not X only)\n if (axis !== 'x') {\n y = Math.max(\n constraintRect.top,\n Math.min(constraintRect.bottom - overlayRect.height, targetY)\n );\n }\n\n return { x, y };\n}\n\n/**\n * Calculates final overlay position with all constraints applied\n */\nexport function calculateConstrainedPosition(\n pointer: TPointerState,\n overlayElement: HTMLElement | null,\n firstDraggable: HTMLElement | null,\n constraintsAreaMap: Map<HTMLElement, IConstraintsAreaEntity>,\n overlaySizeFallback?: { width: number; height: number } | null\n): { x: number; y: number } {\n if (!pointer || !overlayElement) {\n return { x: 0, y: 0 };\n }\n\n const overlayRect = overlayElement.getBoundingClientRect();\n const width = overlayRect.width || overlaySizeFallback?.width || 0;\n const height = overlayRect.height || overlaySizeFallback?.height || 0;\n // offset is ratio (0–1)\n let targetX = pointer.current.x - width * pointer.offset.x;\n let targetY = pointer.current.y - height * pointer.offset.y;\n\n if (!firstDraggable) {\n return { x: targetX, y: targetY };\n }\n\n // Find constraint area\n const constraint = findConstraintArea(firstDraggable, constraintsAreaMap);\n if (!constraint) {\n return { x: targetX, y: targetY };\n }\n\n const { element: constraintElement, entity } = constraint;\n const constraintRect = constraintElement.getBoundingClientRect();\n const draggableRect = firstDraggable.getBoundingClientRect();\n\n // Apply axis constraint\n const axisConstrained = applyAxisConstraint(\n targetX,\n targetY,\n entity.axis || 'both',\n draggableRect\n );\n\n // Apply bounds constraint\n if (entity.restrictToArea) {\n return applyBoundsConstraint(\n axisConstrained.x,\n axisConstrained.y,\n entity.axis || 'both',\n constraintRect,\n overlayRect\n );\n }\n\n return axisConstrained;\n}\n\n/**\n * Updates pointer.current with constraint-applied coordinates.\n * When constraints exist, stores the \"effective\" position so pointer matches overlay.\n */\nexport function updatePointerWithConstraints(\n pointer: TPointerState,\n rawX: number,\n rawY: number,\n overlayElement: HTMLElement | null,\n firstDraggable: HTMLElement | null,\n constraintsAreaMap: Map<HTMLElement, IConstraintsAreaEntity>,\n overlaySizeFallback?: { width: number; height: number } | null\n): void {\n if (!pointer) return;\n\n const overlayRect = overlayElement?.getBoundingClientRect();\n const width = overlayRect?.width ?? overlaySizeFallback?.width ?? 0;\n const height = overlayRect?.height ?? overlaySizeFallback?.height ?? 0;\n\n const tempPointer = {\n start: pointer.start,\n current: { x: rawX, y: rawY },\n offset: pointer.offset,\n };\n\n const constrained = calculateConstrainedPosition(\n tempPointer,\n overlayElement,\n firstDraggable,\n constraintsAreaMap,\n overlaySizeFallback\n );\n\n pointer.current.x = constrained.x + width * pointer.offset.x;\n pointer.current.y = constrained.y + height * pointer.offset.y;\n}\n","import {\r\n computed,\r\n reactive,\r\n ref,\r\n shallowRef,\r\n type Component,\r\n type Ref,\r\n} from 'vue';\r\nimport type {\r\n ICoordinates,\r\n IDelay,\r\n IEntities,\r\n TDnDState,\r\n TPointerState,\r\n} from '../../external/types';\r\nimport type { IHovered } from '../../external/types/provider';\r\nimport { filterByModifiers } from '../utils/provider';\r\nimport { isEffectivelyDisabledDraggable } from '../utils/disabled';\r\nimport { createIntersectionObserver } from '../utils/observer';\r\nimport { useSizeObserver } from './useSizeObserver';\r\nimport { calculateDistanceProgress } from '../utils/drag-activation';\r\nimport { calculateConstrainedPosition } from '../utils/constraints';\r\nimport type { IDnDProviderInternal } from '../types/provider';\r\n\r\nconst DEFAULT_KEYS = {\r\n forDrag: ['Enter', 'Space'],\r\n forCancel: ['Escape'],\r\n forDrop: ['Enter', 'Space'],\r\n forMove: [\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'KeyW',\r\n 'KeyA',\r\n 'KeyS',\r\n 'KeyD',\r\n ],\r\n forMoveFaster: ['ShiftLeft', 'ShiftRight'],\r\n} as const;\r\n\r\nexport function useDnDProviderState(\r\n overlayRef: Ref<HTMLElement | null>\r\n): IDnDProviderInternal {\r\n const state = shallowRef<TDnDState>();\r\n const pointer = ref<TPointerState | undefined>();\r\n const pressedKeys = ref<Set<string>>(new Set());\r\n\r\n const keyboard = {\r\n keys: {\r\n pressedKeys,\r\n forDrag: [...DEFAULT_KEYS.forDrag],\r\n forCancel: [...DEFAULT_KEYS.forCancel],\r\n forDrop: [...DEFAULT_KEYS.forDrop],\r\n forMove: [...DEFAULT_KEYS.forMove],\r\n forMoveFaster: [...DEFAULT_KEYS.forMoveFaster],\r\n },\r\n step: 8,\r\n moveFaster: 4,\r\n };\r\n\r\n const entities = reactive<IEntities>({\r\n draggableMap: new Map(),\r\n droppableMap: new Map(),\r\n selectableAreaMap: new Map(),\r\n constraintsAreaMap: new Map(),\r\n\r\n initiatingDraggable: undefined,\r\n selectingArea: undefined,\r\n\r\n draggingMap: new Map(),\r\n selectedSet: new Set(),\r\n\r\n modifiersSelectableAreaSet: computed(() => {\r\n const selectableSet = filterByModifiers(\r\n entities.selectableAreaMap,\r\n entities.visibleSelectableAreaSet,\r\n keyboard.keys.pressedKeys\r\n );\r\n return selectableSet;\r\n }),\r\n modifiersDraggableSet: computed(() => {\r\n const draggableSet = filterByModifiers(\r\n entities.draggableMap,\r\n entities.visibleDraggableSet,\r\n keyboard.keys.pressedKeys,\r\n (node) => isEffectivelyDisabledDraggable(node, { entities })\r\n );\r\n return draggableSet;\r\n }),\r\n\r\n visibleDraggableSet: new Set(),\r\n visibleDroppableSet: new Set(),\r\n visibleSelectableAreaSet: new Set(),\r\n });\r\n\r\n const scrollPosition = reactive<ICoordinates>({\r\n x: window.scrollX,\r\n y: window.scrollY,\r\n });\r\n\r\n const delay = reactive<IDelay>({\r\n progress: 0,\r\n startTime: 0,\r\n });\r\n\r\n const distanceProgress = computed(() => {\r\n if (!pointer.value || !entities.initiatingDraggable) return 0;\r\n\r\n const entity = entities.draggableMap.get(entities.initiatingDraggable);\r\n const distanceThreshold = entity?.activation?.distance;\r\n\r\n if (!distanceThreshold) return 1;\r\n\r\n return calculateDistanceProgress(pointer.value, distanceThreshold);\r\n });\r\n\r\n const draggableObserver = createIntersectionObserver(\r\n entities.visibleDraggableSet\r\n );\r\n const droppableObserver = createIntersectionObserver(\r\n entities.visibleDroppableSet\r\n );\r\n const selectableAreaObserver = createIntersectionObserver(\r\n entities.visibleSelectableAreaSet\r\n );\r\n\r\n const { overlaySize, overlaySizeObserver } = useSizeObserver(overlayRef);\r\n\r\n const overlayRender = ref<Component>();\r\n\r\n const hovered = reactive<IHovered>({\r\n draggable: new Map(),\r\n droppable: new Map(),\r\n });\r\n\r\n const collision = {\r\n throttle: shallowRef(0),\r\n };\r\n\r\n const overlayStyle = computed(() => {\r\n scrollPosition.y;\r\n scrollPosition.x;\r\n\r\n const draggable = entities.initiatingDraggable;\r\n\r\n return calculateConstrainedPosition(\r\n pointer.value,\r\n overlayRef.value,\r\n draggable || null,\r\n entities.constraintsAreaMap,\r\n overlaySize.value\r\n );\r\n });\r\n\r\n return {\r\n state,\r\n pointer,\r\n entities,\r\n keyboard,\r\n scrollPosition,\r\n delay,\r\n distanceProgress,\r\n hovered,\r\n collision,\r\n overlay: {\r\n size: overlaySize,\r\n style: overlayStyle,\r\n render: overlayRender,\r\n ref: overlayRef,\r\n },\r\n lib: {\r\n draggableObserver,\r\n droppableObserver,\r\n selectableAreaObserver,\r\n overlaySizeObserver,\r\n },\r\n };\r\n}\r\n","import type { IDnDProviderInternal } from '../types/provider';\n\n/**\n * Resets DnD session state after pointer up or cancel\n */\nexport const resetDnDSession = (provider: IDnDProviderInternal): void => {\n provider.pointer.value = undefined;\n provider.state.value = undefined;\n provider.entities.selectingArea = undefined;\n provider.entities.initiatingDraggable = undefined;\n provider.delay.progress = 0;\n provider.delay.startTime = 0;\n provider.entities.draggingMap.clear();\n provider.hovered.draggable.clear();\n provider.hovered.droppable.clear();\n};\n","/**\r\n * Creates drag payload from initiating draggable\r\n */\r\n\r\nimport type { IDragPayload, TDraggablePayload } from '../../external/types';\r\nimport type { IDnDProviderInternal } from '../types/provider';\r\n\r\n/**\r\n * Resolves payload from initiating draggable.\r\n * Calls entity.payload() and returns { index, items, dropData }.\r\n */\r\nexport const createDragPayload = (\r\n provider: IDnDProviderInternal\r\n): IDragPayload | undefined => {\r\n const initiating = provider.entities.initiatingDraggable;\r\n if (!initiating) return undefined;\r\n\r\n const entity = provider.entities.draggableMap.get(initiating);\r\n const payloadFn = entity?.payload as TDraggablePayload | undefined;\r\n if (!payloadFn) return undefined;\r\n\r\n const result = payloadFn();\r\n if (!Array.isArray(result) || result.length < 2) return undefined;\r\n\r\n const [index, items, dropData] = result;\r\n return {\r\n index: Number(index),\r\n items: Array.isArray(items) ? items : [],\r\n dropData,\r\n };\r\n};\r\n","/**\n * DnD event triggering utilities\n */\n\nimport { DnDSelectors } from './namespaces';\nimport {\n isEffectivelyDisabledDraggable,\n isEffectivelyDisabledDroppable,\n} from './disabled';\nimport { createDragPayload } from '../logic/payload';\nimport type { IDnDProviderInternal } from '../types/provider';\nimport type { IDragEvent, IHovered } from '../../external/types/provider';\n\nexport type TSelfDragEvent = 'onSelfDragStart' | 'onSelfDragMove' | 'onSelfDragEnd' | 'onSelfDragCancel';\n\n/** First key from Map or undefined */\nexport const getFirstKey = <K>(map: Map<K, unknown>): K | undefined =>\n map.keys().next().value;\n\n/** Closest draggable from event target */\nexport const getClosestDraggableFromEvent = (event: PointerEvent): HTMLElement | null =>\n (event.target as HTMLElement).closest(DnDSelectors.DRAGGABLE) as HTMLElement | null;\n\nconst getDragEvent = (provider: IDnDProviderInternal): IDragEvent => ({\n payload: createDragPayload(provider),\n provider,\n});\n\n/** Triggers onSelf* for element from event if it's in draggingMap */\nexport const triggerSelfDragFromEvent = (\n provider: IDnDProviderInternal,\n event: PointerEvent,\n eventName: TSelfDragEvent\n): void => {\n const el = getClosestDraggableFromEvent(event);\n if (!el || !provider.entities.draggingMap.has(el)) return;\n const dragEvent = getDragEvent(provider);\n provider.entities.draggingMap.get(el)?.events?.[eventName]?.(dragEvent);\n};\n\n/** Triggers onSelf* only for the initiating element (event.target.closest), skip if disabled */\nexport const triggerSelfDragForElement = (\n provider: IDnDProviderInternal,\n element: HTMLElement | undefined,\n eventName: TSelfDragEvent\n): void => {\n if (!element || isEffectivelyDisabledDraggable(element, provider)) return;\n const dragEvent = getDragEvent(provider);\n provider.entities.draggableMap.get(element)?.events?.[eventName]?.(dragEvent);\n};\n\n/** Triggers onDrag* for ALL non-disabled draggable elements */\nexport const triggerDragForAll = (\n provider: IDnDProviderInternal,\n eventName: 'onDragStart' | 'onDragMove' | 'onDragEnd' | 'onDragCancel'\n): void => {\n const dragEvent = getDragEvent(provider);\n provider.entities.draggableMap.forEach((entity, node) => {\n if (isEffectivelyDisabledDraggable(node, provider)) return;\n entity.events?.[eventName]?.(dragEvent);\n });\n};\n\n/** Triggers zone onEnter/onLeave when zone changes, skip disabled zones */\nexport const triggerZoneEnterLeave = (\n provider: IDnDProviderInternal,\n prevZone: HTMLElement | undefined,\n newZone: HTMLElement | undefined\n): void => {\n if (prevZone !== newZone) {\n const dragEvent = getDragEvent(provider);\n if (prevZone && !isEffectivelyDisabledDroppable(prevZone, provider))\n provider.entities.droppableMap.get(prevZone)?.events?.onLeave?.(dragEvent);\n if (newZone && !isEffectivelyDisabledDroppable(newZone, provider))\n provider.entities.droppableMap.get(newZone)?.events?.onEnter?.(dragEvent);\n }\n};\n\n/** Triggers onHover/onLeave when hovered draggable changes, skip disabled */\nexport const triggerDraggableHoverChange = (\n provider: IDnDProviderInternal,\n prevEl: HTMLElement | undefined,\n newEl: HTMLElement | undefined\n): void => {\n if (prevEl !== newEl) {\n const dragEvent = getDragEvent(provider);\n if (prevEl && !isEffectivelyDisabledDraggable(prevEl, provider))\n provider.entities.draggableMap.get(prevEl)?.events?.onLeave?.(dragEvent);\n if (newEl && !isEffectivelyDisabledDraggable(newEl, provider))\n provider.entities.draggableMap.get(newEl)?.events?.onHover?.(dragEvent);\n }\n};\n\n/** Triggers zone onLeave on drag end, skip disabled */\nexport const triggerZoneLeave = (provider: IDnDProviderInternal, hovered: IHovered): void => {\n const zone = getFirstKey(hovered.droppable);\n if (zone && !isEffectivelyDisabledDroppable(zone, provider)) {\n const dragEvent = getDragEvent(provider);\n provider.entities.droppableMap.get(zone)?.events?.onLeave?.(dragEvent);\n }\n};\n\n/** Triggers zone onLeave on drop failure, skip disabled */\nexport const triggerDropCancelEvents = (\n provider: IDnDProviderInternal,\n hovered: IHovered\n): void => {\n const zone = getFirstKey(hovered.droppable);\n if (zone && !isEffectivelyDisabledDroppable(zone, provider)) {\n const dragEvent = getDragEvent(provider);\n provider.entities.droppableMap.get(zone)?.events?.onLeave?.(dragEvent);\n }\n};\n","/**\n * Checks compatibility between two group sets.\n * Used for selection area, zones, droppable, etc.\n *\n * - Empty array = global (compatible with any)\n * - Otherwise requires at least one shared group\n */\nexport const areGroupsCompatible = (\n groupsA: string[],\n groupsB: string[]\n): boolean => {\n if (!groupsA.length || !groupsB.length) return true;\n return groupsA.some((g) => groupsB.includes(g));\n};\n","import type { CSSProperties } from 'vue';\nimport type { ICoordinates } from '../../external/types';\nimport { DnDSelectors } from './namespaces';\nimport { areGroupsCompatible } from './groups';\nimport { checkIntersection } from './dom';\nimport { isEffectivelyDisabledDraggable } from './disabled';\nimport type { IDnDProviderInternal } from '../types/provider';\n\n/**\n * Converts viewport coordinates to container-relative coordinates.\n * scroll - page scroll position (window.scrollX, window.scrollY)\n */\nexport const getRelativeCoordinates = (\n event: ICoordinates,\n container: HTMLElement | null,\n scroll: { x: number; y: number } = { x: 0, y: 0 }\n) => {\n if (!container) {\n return event;\n }\n\n const rect = container.getBoundingClientRect();\n const scrollLeft = container.scrollLeft || scroll.x;\n const scrollTop = container.scrollTop || scroll.y;\n\n const x = event.x - rect.left + scrollLeft + scroll.x;\n const y = event.y - rect.top + scrollTop + scroll.y;\n\n return { x, y };\n};\n\n/**\n * Returns CSS properties for bounded selection box within container\n */\nexport const getBoundedSelectionArea = (\n start: ICoordinates,\n current: ICoordinates,\n container: HTMLElement | null\n): CSSProperties => {\n if (!container) return {};\n\n const containerRect = container.getBoundingClientRect();\n \n const left = Math.max(containerRect.left, Math.min(start.x, current.x));\n const top = Math.max(containerRect.top, Math.min(start.y, current.y));\n const right = Math.min(containerRect.right, Math.max(start.x, current.x));\n const bottom = Math.min(containerRect.bottom, Math.max(start.y, current.y));\n\n const width = Math.max(0, right - left);\n const height = Math.max(0, bottom - top);\n\n return {\n left: `${left}px`,\n top: `${top}px`,\n width: `${width}px`,\n height: `${height}px`,\n position: 'fixed', \n pointerEvents: 'none',\n border: '1px solid #3b82f6',\n backgroundColor: '#3b82f61a'\n };\n};\n\n/**\n * Checks if the event target is within the correct selectable area\n */\nexport const checkIsSelectableArea = (\n event: PointerEvent,\n container: HTMLElement\n): boolean => {\n const target = event.target as HTMLElement;\n\n const closestSelectableArea = target.closest(\n DnDSelectors.SELECT_AREA\n ) as HTMLElement | null;\n\n if (closestSelectableArea && closestSelectableArea !== container)\n return false;\n\n return true;\n};\n\n/**\n * Updates selectedSet based on selection box (pointer start → current)\n */\nexport const updateSelectionByBox = (provider: IDnDProviderInternal): void => {\n if (!provider.pointer.value || !provider.entities.selectingArea) return;\n const { selectingArea } = provider.entities;\n const selectionBoxRect = getSelectionBoxRect(\n provider.pointer.value.start,\n provider.pointer.value.current\n );\n const selectionAreaGroups = provider.entities.selectableAreaMap.get(selectingArea)?.groups ?? [];\n\n provider.entities.visibleDraggableSet.forEach((el) => {\n if (!selectingArea.contains(el)) return;\n if (isEffectivelyDisabledDraggable(el, provider)) {\n provider.entities.selectedSet.delete(el);\n return;\n }\n const draggableEntity = provider.entities.draggableMap.get(el);\n const draggableGroups = draggableEntity?.groups ?? [];\n if (!areGroupsCompatible(selectionAreaGroups, draggableGroups)) {\n provider.entities.selectedSet.delete(el);\n return;\n }\n checkIntersection(selectionBoxRect, el.getBoundingClientRect())\n ? provider.entities.selectedSet.add(el)\n : provider.entities.selectedSet.delete(el);\n });\n};\n\n/**\n * Creates a DOMRect for the selection box from pointer coordinates\n */\nexport const getSelectionBoxRect = (\n start: ICoordinates,\n current: ICoordinates\n): DOMRect => {\n const left = Math.min(start.x, current.x);\n const top = Math.min(start.y, current.y);\n const right = Math.max(start.x, current.x);\n const bottom = Math.max(start.y, current.y);\n \n const width = right - left;\n const height = bottom - top;\n \n return new DOMRect(left, top, width, height);\n};\n","/**\n * Placement — closest edge/area (top, right, bottom, left, center) for drop insertion\n */\n\nimport type { IDnDProviderExternal, IPlacementMargins } from '../../external';\n\nexport interface IPlacement {\n top: boolean;\n right: boolean;\n bottom: boolean;\n left: boolean;\n center?: boolean;\n}\n\nexport interface IRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * Creates pointer box from coordinates (e.g. cursor as 5×5)\n */\nexport const createPointerBox = (\n x: number,\n y: number,\n size: number = 5\n): IRect => {\n const half = size / 2;\n return {\n left: x - half,\n top: y - half,\n width: size,\n height: size,\n };\n};\n\n/**\n * Creates pointer box from provider (cursor as 5×5)\n */\nexport const getPointerBoxFromProvider = (provider: IDnDProviderExternal): IRect => {\n const p = provider.pointer.value?.current;\n const x = p?.x ?? 0;\n const y = p?.y ?? 0;\n return createPointerBox(x, y, 5);\n};\n\n/**\n * Returns which edge of element is closest to pointer box center.\n * With placementMargins: if pointer in center zone, returns center: true.\n * Else exactly one of top/right/bottom/left is true.\n */\nexport const getClosestPlacement = (\n pointerBox: IRect,\n elementRect: DOMRect,\n margins?: IPlacementMargins\n): IPlacement => {\n const cx = pointerBox.left + pointerBox.width / 2;\n const cy = pointerBox.top + pointerBox.height / 2;\n\n if (margins) {\n const t = margins.top ?? 0;\n const r = margins.right ?? 0;\n const b = margins.bottom ?? 0;\n const l = margins.left ?? 0;\n const innerLeft = elementRect.left + l;\n const innerRight = elementRect.right - r;\n const innerTop = elementRect.top + t;\n const innerBottom = elementRect.bottom - b;\n if (\n innerLeft < innerRight &&\n innerTop < innerBottom &&\n cx >= innerLeft &&\n cx <= innerRight &&\n cy >= innerTop &&\n cy <= innerBottom\n ) {\n return { top: false, right: false, bottom: false, left: false, center: true };\n }\n }\n\n const dTop = cy - elementRect.top;\n const dBottom = elementRect.bottom - cy;\n const dLeft = cx - elementRect.left;\n const dRight = elementRect.right - cx;\n\n const min = Math.min(dTop, dBottom, dLeft, dRight);\n\n return {\n top: dTop === min,\n bottom: dBottom === min,\n left: dLeft === min,\n right: dRight === min,\n };\n};\n","/**\n * Hover detection — applies collision result and triggers enter/leave events\n */\n\nimport {\n getClosestPlacement,\n getPointerBoxFromProvider,\n} from '../utils/placement';\nimport {\n getFirstKey,\n triggerZoneEnterLeave,\n triggerDraggableHoverChange,\n} from '../utils/events';\nimport { isDescendant } from '../utils/dom';\nimport type { IDnDProviderInternal } from '../types/provider';\nimport type { IHovered } from '../../external/types/provider';\n\n/** First draggable inside zone (nested under cursor) or undefined */\nconst findNestedDraggable = (\n elements: HTMLElement[],\n zone: HTMLElement\n): HTMLElement | undefined =>\n elements.find((el) => el !== zone && isDescendant(zone, el));\n\n/** Applies collision result to hovered and triggers zone/draggable events */\nexport const applyCollisionResultToHovered = (\n provider: IDnDProviderInternal,\n hovered: IHovered,\n result: { elements: HTMLElement[]; zones: HTMLElement[] }\n): void => {\n const prevZone = getFirstKey(hovered.droppable);\n const prevElement = getFirstKey(hovered.draggable);\n\n hovered.draggable.clear();\n hovered.droppable.clear();\n\n const pointerBox = getPointerBoxFromProvider(provider);\n const newZone = result.zones[0];\n const newElement = result.elements[0];\n\n const isDualRole =\n newZone &&\n newElement &&\n newZone === newElement &&\n provider.entities.droppableMap.has(newZone);\n\n if (isDualRole && newZone) {\n const rect = newZone.getBoundingClientRect();\n const margins =\n provider.entities.draggableMap.get(newZone)?.placementMargins;\n const placement = getClosestPlacement(pointerBox, rect, margins);\n\n if (placement.center) {\n hovered.droppable.set(newZone, placement);\n const nested = findNestedDraggable(result.elements, newZone);\n if (nested) {\n const nestedRect = nested.getBoundingClientRect();\n hovered.draggable.set(\n nested,\n getClosestPlacement(pointerBox, nestedRect, undefined)\n );\n }\n } else {\n hovered.draggable.set(newElement, placement);\n hovered.droppable.set(newZone, placement);\n }\n } else {\n if (newZone) {\n const rect = newZone.getBoundingClientRect();\n hovered.droppable.set(newZone, getClosestPlacement(pointerBox, rect));\n }\n if (newElement) {\n const rect = newElement.getBoundingClientRect();\n const margins =\n provider.entities.draggableMap.get(newElement)?.placementMargins;\n hovered.draggable.set(\n newElement,\n getClosestPlacement(pointerBox, rect, margins)\n );\n }\n }\n\n const finalZone = getFirstKey(hovered.droppable);\n const finalElement = getFirstKey(hovered.draggable);\n\n triggerZoneEnterLeave(provider, prevZone, finalZone);\n triggerDraggableHoverChange(provider, prevElement, finalElement);\n};\n","/**\n * AABB geometry utilities for collision detection\n */\n\nexport interface IBoundingBox {\n x: number;\n y: number;\n width: number;\n height: number;\n top: number;\n left: number;\n right: number;\n bottom: number;\n}\n\nexport interface IPoint {\n x: number;\n y: number;\n}\n\nexport const checkCollision = (boxA: IBoundingBox, boxB: IBoundingBox): boolean =>\n boxA.x < boxB.x + boxB.width &&\n boxA.x + boxA.width > boxB.x &&\n boxA.y < boxB.y + boxB.height &&\n boxA.y + boxA.height > boxB.y;\n\nexport const getBoundingBox = (element: HTMLElement | null): IBoundingBox => {\n if (!element)\n return { x: 0, y: 0, width: 0, height: 0, top: 0, left: 0, right: 0, bottom: 0 };\n const rect = element.getBoundingClientRect();\n return {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n };\n};\n\nexport const getCenter = (box: IBoundingBox): IPoint => ({\n x: box.x + box.width / 2,\n y: box.y + box.height / 2,\n});\n\nexport const getDistance = (pointA: IPoint, pointB: IPoint): number =>\n Math.hypot(pointB.x - pointA.x, pointB.y - pointA.y);\n\nexport const getOverlapPercent = (boxA: IBoundingBox, boxB: IBoundingBox): number => {\n const xOverlap = Math.max(\n 0,\n Math.min(boxA.x + boxA.width, boxB.x + boxB.width) - Math.max(boxA.x, boxB.x)\n );\n const yOverlap = Math.max(\n 0,\n Math.min(boxA.y + boxA.height, boxB.y + boxB.height) - Math.max(boxA.y, boxB.y)\n );\n const overlapArea = xOverlap * yOverlap;\n const boxAArea = boxA.width * boxA.height;\n const boxBArea = boxB.width * boxB.height;\n if (boxAArea === 0 || boxBArea === 0) return 0;\n return ((overlapArea / boxAArea) * 100 + (overlapArea / boxBArea) * 100) / 2;\n};\n\nexport const containsPoint = (box: IBoundingBox, x: number, y: number): boolean =>\n x >= box.x && x <= box.x + box.width && y >= box.y && y <= box.y + box.height;\n","import {\n getBoundingBox,\n getCenter,\n getDistance,\n getOverlapPercent,\n containsPoint,\n type IBoundingBox,\n} from '../utils/geometry';\nimport { isDescendant } from '../utils/dom';\nimport type { IDnDProviderInternal } from '../types/provider';\n\nexport type CollisionDetectionFn = (\n provider: IDnDProviderInternal\n) => { elements: HTMLElement[]; zones: HTMLElement[] };\n\nexport type TContainerFn = (provider: IDnDProviderInternal) => HTMLElement | null;\nexport type TContainerBoxFn = (provider: IDnDProviderInternal) => IBoundingBox;\nexport type TCandidatesFn = (provider: IDnDProviderInternal) => Iterable<HTMLElement>;\nexport type TFilterFn = (node: HTMLElement, provider: IDnDProviderInternal) => boolean;\nexport type TCollisionContext = { containerBox: IBoundingBox; pointer: { x: number; y: number } };\nexport type TCollisionCheckFn = (nodeBox: IBoundingBox, ctx: TCollisionContext) => boolean;\nexport type TSortCompareFn = (\n a: { node: HTMLElement; box: IBoundingBox; meta: ICollisionMeta },\n b: { node: HTMLElement; box: IBoundingBox; meta: ICollisionMeta },\n ctx: { containerBox: IBoundingBox; pointer: { x: number; y: number } }\n) => number;\n\nexport interface ICollisionMeta {\n isPointerInElement: boolean;\n overlapPercent: number;\n depth: number;\n centerDistance: number;\n}\n\ninterface ISensorConfig {\n container: TContainerFn;\n containerBox?: TContainerBoxFn;\n elements: TCandidatesFn;\n zones: TCandidatesFn;\n filterElements: TFilterFn;\n filterZones: TFilterFn;\n collision: TCollisionCheckFn;\n sortElements: TSortCompareFn;\n sortZones: TSortCompareFn;\n}\n\nconst defaultFilter = () => true;\nconst defaultSort = () => 0;\n\nconst createBuilder = (): ISensorBuilder => {\n const config: Partial<ISensorConfig> = {\n filterElements: defaultFilter,\n filterZones: defaultFilter,\n sortElements: defaultSort,\n sortZones: defaultSort,\n };\n\n const run = (\n provider: IDnDProviderInternal,\n containerBox: IBoundingBox,\n pointer: { x: number; y: number },\n candidates: Iterable<HTMLElement>,\n filter: TFilterFn,\n sortFn: TSortCompareFn,\n collisionCheck: TCollisionCheckFn\n ): HTMLElement[] => {\n const nodeSet = new Set(candidates);\n const ctx = { containerBox, pointer };\n\n const entries = [...candidates]\n .filter((node) => filter(node, provider))\n .map((node) => {\n const nodeBox = getBoundingBox(node);\n if (!collisionCheck(nodeBox, ctx)) return null;\n\n let depth = 0;\n for (const parent of nodeSet) {\n if (parent !== node && isDescendant(parent, node)) depth++;\n }\n\n return {\n node,\n box: nodeBox,\n meta: {\n isPointerInElement: containsPoint(nodeBox, pointer.x, pointer.y),\n overlapPercent: getOverlapPercent(nodeBox, containerBox),\n depth,\n centerDistance: getDistance(getCenter(containerBox), getCenter(nodeBox)),\n },\n };\n })\n .filter((e): e is NonNullable<typeof e> => e !== null);\n\n entries.sort((a, b) => sortFn(a, b, ctx));\n\n return entries.map((e) => e.node);\n };\n\n const builder: ISensorBuilder = {\n container(fn) {\n config.container = fn;\n return builder;\n },\n\n containerBox(fn) {\n config.containerBox = fn;\n return builder;\n },\n\n elements(fn) {\n config.elements = fn;\n return builder;\n },\n\n zones(fn) {\n config.zones = fn;\n return builder;\n },\n\n filterElements(fn) {\n config.filterElements = fn;\n return builder;\n },\n\n filterZones(fn) {\n config.filterZones = fn;\n return builder;\n },\n\n collision(fn) {\n config.collision = fn;\n return builder;\n },\n\n sortElements(fn) {\n config.sortElements = fn;\n return builder;\n },\n\n sortZones(fn) {\n config.sortZones = fn;\n return builder;\n },\n\n build(): CollisionDetectionFn {\n const cfg = config as ISensorConfig;\n if (!cfg.container || !cfg.elements || !cfg.zones || !cfg.collision) {\n throw new Error('sensor: container, elements, zones, collision are required');\n }\n\n return (provider: IDnDProviderInternal) => {\n const containerEl = cfg.container(provider);\n if (!containerEl) return { elements: [], zones: [] };\n\n const containerBox = cfg.containerBox\n ? cfg.containerBox(provider)\n : getBoundingBox(containerEl);\n const pointer = provider.pointer.value?.current ?? { x: 0, y: 0 };\n\n return {\n elements: run(\n provider,\n containerBox,\n pointer,\n cfg.elements(provider),\n cfg.filterElements,\n cfg.sortElements,\n cfg.collision\n ),\n zones: run(\n provider,\n containerBox,\n pointer,\n cfg.zones(provider),\n cfg.filterZones,\n cfg.sortZones,\n cfg.collision\n ),\n };\n };\n },\n };\n\n return builder;\n};\n\nexport interface ISensorBuilder {\n container(fn: TContainerFn): ISensorBuilder;\n containerBox(fn: TContainerBoxFn): ISensorBuilder;\n elements(fn: TCandidatesFn): ISensorBuilder;\n zones(fn: TCandidatesFn): ISensorBuilder;\n filterElements(fn: TFilterFn): ISensorBuilder;\n filterZones(fn: TFilterFn): ISensorBuilder;\n collision(fn: TCollisionCheckFn): ISensorBuilder;\n sortElements(fn: TSortCompareFn): ISensorBuilder;\n sortZones(fn: TSortCompareFn): ISensorBuilder;\n build(): CollisionDetectionFn;\n}\n\nexport const createSensor = () => createBuilder();\n","/**\n * Reusable sensor steps for the chainable builder\n */\n\nimport {\n checkCollision,\n containsPoint,\n type IBoundingBox,\n} from '../utils/geometry';\nimport { isDescendant } from '../utils/dom';\nimport {\n isEffectivelyDisabledDraggable,\n isEffectivelyDisabledDroppable,\n} from '../utils/disabled';\nimport type { IDnDProviderInternal } from '../types/provider';\nimport type {\n TSortCompareFn,\n TFilterFn,\n TCollisionCheckFn,\n TContainerBoxFn,\n} from './sensor';\n\n/** Container from overlay ref */\nexport const overlayContainer: (\n p: IDnDProviderInternal\n) => HTMLElement | null = (provider) => provider.overlay.ref?.value ?? null;\n\n/** Box from overlay style (x,y) + size — overlay uses fixed+transform, getBoundingClientRect is wrong */\nexport const overlayBoxFromStyle: TContainerBoxFn = (\n provider\n): IBoundingBox => {\n const style = provider.overlay.style?.value ?? { x: 0, y: 0 };\n const size = provider.overlay.size?.value ?? null;\n const { x, y } = style;\n const w = size?.width ?? 0;\n const h = size?.height ?? 0;\n return {\n x,\n y,\n width: w,\n height: h,\n top: y,\n left: x,\n right: x + w,\n bottom: y + h,\n };\n};\n\n/** Visible draggables */\nexport const visibleElements = (p: IDnDProviderInternal) =>\n p.entities.visibleDraggableSet;\n\n/** Visible droppables */\nexport const visibleZones = (p: IDnDProviderInternal) =>\n p.entities.visibleDroppableSet;\n\n/** Exclude nodes being dragged */\nexport const filterNotDragging: TFilterFn = (node, provider) =>\n !provider.entities.draggingMap.has(node);\n\n/** Exclude nodes that are descendants of any dragged element (nesting into self) */\nexport const filterNotDescendantOfDragged: TFilterFn = (node, provider) =>\n ![...provider.entities.draggingMap.keys()].some((dragged) =>\n isDescendant(dragged, node)\n );\n\n/** Exclude disabled draggables and zones (including those inside disabled parents) */\nexport const filterNotDisabled: TFilterFn = (node, provider) => {\n if (provider.entities.draggableMap.has(node))\n return !isEffectivelyDisabledDraggable(node, provider);\n if (provider.entities.droppableMap.has(node))\n return !isEffectivelyDisabledDroppable(node, provider);\n return true;\n};\n\n/** Exclude: not dragging, not descendant of dragged, not disabled */\nexport const filterValidCollisionTarget: TFilterFn = (node, provider) =>\n filterNotDragging(node, provider) &&\n filterNotDescendantOfDragged(node, provider) &&\n filterNotDisabled(node, provider);\n\n/** AABB overlap check (element vs container) — legacy */\nexport const aabbCollision: TCollisionCheckFn = (nodeBox, ctx) =>\n checkCollision(nodeBox, ctx.containerBox);\n\n/** Pointer-in-element: cursor must be inside element (AABB of element) */\nexport const pointerInElementCollision: TCollisionCheckFn = (nodeBox, ctx) =>\n containsPoint(nodeBox, ctx.pointer.x, ctx.pointer.y);\n\n/** Sort: deepest first (topmost visible element under cursor) */\nexport const sortByDepth: TSortCompareFn = (a, b) =>\n b.meta.depth - a.meta.depth;\n\n/** Sort: pointer-in-element + depth when pointer INSIDE container; overlap % + centerDistance when OUTSIDE */\nexport const sortByOverlapAndPointer: TSortCompareFn = (a, b, ctx) => {\n const pointerInContainer =\n ctx.pointer.x >= ctx.containerBox.x &&\n ctx.pointer.x <= ctx.containerBox.x + ctx.containerBox.width &&\n ctx.pointer.y >= ctx.containerBox.y &&\n ctx.pointer.y <= ctx.containerBox.y + ctx.containerBox.height;\n\n // When pointer inside container: prioritize element under cursor (isPointerInElement + depth)\n // When pointer outside: use overlap % and center distance\n if (pointerInContainer) {\n if (a.meta.isPointerInElement && b.meta.isPointerInElement)\n return b.meta.depth - a.meta.depth;\n if (a.meta.isPointerInElement !== b.meta.isPointerInElement)\n return a.meta.isPointerInElement ? -1 : 1;\n }\n\n if (Math.abs(a.meta.overlapPercent - b.meta.overlapPercent) <= 1)\n return a.meta.centerDistance - b.meta.centerDistance;\n\n return b.meta.overlapPercent - a.meta.overlapPercent;\n};\n","/**\n * Default collision: same logic as vue-dnd-box reference\n * - Filter: AABB overlap with container (overlay)\n * - Sort: pointer outside container → isPointerInElement + depth; else overlap % + centerDistance\n * - Returns full sorted list\n */\n\nimport { createSensor } from './sensor';\nimport {\n overlayContainer,\n overlayBoxFromStyle,\n visibleElements,\n visibleZones,\n filterValidCollisionTarget,\n aabbCollision,\n sortByOverlapAndPointer,\n} from './steps';\n\nexport const defaultCollisionDetection = createSensor()\n .container(overlayContainer)\n .containerBox(overlayBoxFromStyle)\n .elements(visibleElements)\n .zones(visibleZones)\n .filterElements(filterValidCollisionTarget)\n .filterZones(filterValidCollisionTarget)\n .collision(aabbCollision)\n .sortElements(sortByOverlapAndPointer)\n .sortZones(sortByOverlapAndPointer)\n .build();\n","import { DnDSelectors } from '../utils/namespaces';\r\nimport { disableInteractions, enableInteractions } from '../utils/dom';\r\nimport {\r\n createPointerState,\r\n calculateCursorOffset,\r\n startDraggingForProvider,\r\n} from '../utils/pointer';\r\nimport {\r\n checkDragHandle,\r\n tryStartDragIfActivationComplete,\r\n createActivationDelayTimer,\r\n} from '../utils/drag-activation';\r\nimport { resetDnDSession } from '../utils/session';\r\nimport { updateSelectionByBox } from '../utils/selection';\r\nimport {\r\n triggerSelfDragFromEvent,\r\n triggerSelfDragForElement,\r\n triggerDragForAll,\r\n triggerZoneLeave,\r\n triggerDropCancelEvents,\r\n} from '../utils/events';\r\nimport { createDragPayload } from './payload';\r\nimport { isEffectivelyDisabledDroppable } from '../utils/disabled';\r\nimport { applyCollisionResultToHovered } from './hover';\r\nimport { defaultCollisionDetection } from '../sensors/defaultCollision';\r\nimport type { IDnDProviderInternal } from '../types/provider';\r\n\r\nfunction runCollisionAndApply(provider: IDnDProviderInternal): void {\r\n const run = provider.collision?.run ?? defaultCollisionDetection;\r\n const result = run(provider);\r\n applyCollisionResultToHovered(provider, provider.hovered, result);\r\n}\r\n\r\nfunction runThrottledCollision(\r\n provider: IDnDProviderInternal,\r\n lastRun: { value: number }\r\n): void {\r\n const throttleMs = provider.collision?.throttle?.value ?? 0;\r\n if (throttleMs <= 0) {\r\n runCollisionAndApply(provider);\r\n return;\r\n }\r\n const now = Date.now();\r\n if (now - lastRun.value >= throttleMs) {\r\n lastRun.value = now;\r\n runCollisionAndApply(provider);\r\n }\r\n}\r\n\r\nexport async function handleDropAndFinish(\r\n provider: IDnDProviderInternal\r\n): Promise<boolean> {\r\n const hoveredZone = provider.hovered.droppable.keys().next().value;\r\n if (!hoveredZone) return true;\r\n\r\n if (isEffectivelyDisabledDroppable(hoveredZone, provider)) return true;\r\n\r\n const zoneEntity = provider.entities.droppableMap.get(hoveredZone);\r\n const dragEvent = {\r\n payload: createDragPayload(provider),\r\n provider,\r\n };\r\n\r\n const result = zoneEntity?.events?.onDrop?.(dragEvent);\r\n\r\n const isPromise =\r\n result != null && typeof (result as Promise<unknown>).then === 'function';\r\n if (isPromise) {\r\n try {\r\n await (result as Promise<unknown>);\r\n return true;\r\n } catch {\r\n const initiating = provider.entities.initiatingDraggable;\r\n triggerSelfDragForElement(provider, initiating, 'onSelfDragCancel');\r\n triggerDragForAll(provider, 'onDragCancel');\r\n triggerDropCancelEvents(provider, provider.hovered);\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport function finishDragSession(provider: IDnDProviderInternal): void {\r\n const initiating = provider.entities.initiatingDraggable;\r\n triggerSelfDragForElement(provider, initiating, 'onSelfDragEnd');\r\n triggerDragForAll(provider, 'onDragEnd');\r\n triggerZoneLeave(provider, provider.hovered);\r\n}\r\n\r\nfunction finishSelectionSession(provider: IDnDProviderInternal): void {\r\n const selectingArea = provider.entities.selectingArea;\r\n if (!selectingArea) return;\r\n\r\n const areaEntity = provider.entities.selectableAreaMap.get(selectingArea);\r\n const selected = [...provider.entities.selectedSet];\r\n areaEntity?.events?.onSelected?.(selected);\r\n}\r\n\r\nexport const createPointerHandlers = (provider: IDnDProviderInternal) => {\r\n const delayTimer = {\r\n current: null as ReturnType<typeof createActivationDelayTimer> | null,\r\n };\r\n const lastCollisionRun = { value: 0 };\r\n\r\n const pointerUp = async () => {\r\n enableInteractions();\r\n\r\n delayTimer.current?.cancel();\r\n delayTimer.current = null;\r\n\r\n const state = provider.state.value;\r\n\r\n if (state === 'dragging') {\r\n const dropOk = await handleDropAndFinish(provider);\r\n if (!dropOk) {\r\n resetDnDSession(provider);\r\n document.removeEventListener('pointerup', pointerUp);\r\n document.removeEventListener('pointermove', pointerMove);\r\n return;\r\n }\r\n finishDragSession(provider);\r\n } else if (state === 'selecting') {\r\n finishSelectionSession(provider);\r\n }\r\n\r\n resetDnDSession(provider);\r\n document.removeEventListener('pointerup', pointerUp);\r\n document.removeEventListener('pointermove', pointerMove);\r\n };\r\n\r\n const pointerMove = (event: PointerEvent) => {\r\n if (!provider.pointer.value) return;\r\n provider.pointer.value.current = { x: event.clientX, y: event.clientY };\r\n\r\n if (tryStartDragIfActivationComplete(provider)) {\r\n triggerSelfDragFromEvent(provider, event, 'onSelfDragStart');\r\n triggerDragForAll(provider, 'onDragStart');\r\n return;\r\n }\r\n\r\n if (provider.state.value === 'dragging') {\r\n runThrottledCollision(provider, lastCollisionRun);\r\n const initiating = provider.entities.initiatingDraggable;\r\n triggerSelfDragForElement(provider, initiating, 'onSelfDragMove');\r\n triggerDragForAll(provider, 'onDragMove');\r\n }\r\n\r\n if (provider.state.value === 'selecting') {\r\n updateSelectionByBox(provider);\r\n }\r\n };\r\n\r\n const pointerDown = (event: PointerEvent) => {\r\n document.addEventListener('pointerup', pointerUp);\r\n document.addEventListener('pointermove', pointerMove);\r\n\r\n const target = event.target as HTMLElement;\r\n const closestSelectionArea = target.closest(\r\n DnDSelectors.SELECT_AREA\r\n ) as HTMLElement;\r\n const closestDraggable = target.closest(\r\n DnDSelectors.DRAGGABLE\r\n ) as HTMLElement;\r\n\r\n if (\r\n provider.entities.modifiersSelectableAreaSet.size > 0 &&\r\n provider.entities.modifiersSelectableAreaSet.has(closestSelectionArea)\r\n ) {\r\n disableInteractions();\r\n provider.pointer.value = createPointerState(event);\r\n provider.state.value = 'selecting';\r\n provider.entities.selectingArea = closestSelectionArea;\r\n return;\r\n }\r\n\r\n if (\r\n provider.entities.modifiersDraggableSet.size > 0 &&\r\n provider.entities.modifiersDraggableSet.has(closestDraggable)\r\n ) {\r\n const entity = provider.entities.draggableMap.get(closestDraggable);\r\n if (!checkDragHandle(target, closestDraggable, entity?.dragHandle))\r\n return;\r\n\r\n disableInteractions();\r\n provider.entities.initiatingDraggable = closestDraggable;\r\n const offset = calculateCursorOffset(event, closestDraggable);\r\n provider.pointer.value = createPointerState(event, offset.x, offset.y);\r\n\r\n const hasActivation =\r\n entity?.activation?.distance || entity?.activation?.delay;\r\n\r\n if (hasActivation) {\r\n provider.state.value = 'activating';\r\n if (entity?.activation?.delay) {\r\n provider.delay.startTime = Date.now();\r\n delayTimer.current = createActivationDelayTimer(provider, () => {\r\n startDraggingForProvider(provider);\r\n triggerSelfDragFromEvent(provider, event, 'onSelfDragStart');\r\n triggerDragForAll(provider, 'onDragStart');\r\n });\r\n }\r\n } else {\r\n startDraggingForProvider(provider);\r\n triggerSelfDragFromEvent(provider, event, 'onSelfDragStart');\r\n triggerDragForAll(provider, 'onDragStart');\r\n }\r\n }\r\n };\r\n\r\n const cleanup = () => {\r\n delayTimer.current?.cancel();\r\n document.removeEventListener('pointerup', pointerUp);\r\n document.removeEventListener('pointermove', pointerMove);\r\n provider.lib.draggableObserver.disconnect();\r\n provider.lib.droppableObserver.disconnect();\r\n provider.lib.selectableAreaObserver.disconnect();\r\n provider.lib.overlaySizeObserver.disconnect();\r\n };\r\n\r\n return { pointerDown, pointerUp, pointerMove, cleanup };\r\n};\r\n","import { DnDSelectors } from '../utils/namespaces';\nimport { disableInteractions, enableInteractions } from '../utils/dom';\nimport {\n createPointerState,\n calculateCursorOffset,\n startDraggingForProvider,\n} from '../utils/pointer';\nimport { checkDragHandle } from '../utils/drag-activation';\nimport { resetDnDSession } from '../utils/session';\nimport {\n triggerSelfDragForElement,\n triggerDragForAll,\n triggerDropCancelEvents,\n} from '../utils/events';\nimport { handleDropAndFinish, finishDragSession } from './pointer';\nimport { applyCollisionResultToHovered } from './hover';\nimport { defaultCollisionDetection } from '../sensors/defaultCollision';\nimport type { IDnDProviderInternal } from '../types/provider';\n\nconst MOVE_MAP: Record<string, { dx: number; dy: number }> = {\n ArrowUp: { dx: 0, dy: -1 },\n ArrowDown: { dx: 0, dy: 1 },\n ArrowLeft: { dx: -1, dy: 0 },\n ArrowRight: { dx: 1, dy: 0 },\n KeyW: { dx: 0, dy: -1 },\n KeyA: { dx: -1, dy: 0 },\n KeyS: { dx: 0, dy: 1 },\n KeyD: { dx: 1, dy: 0 },\n};\n\nconst handleKeyDown = (provider: IDnDProviderInternal) => (event: KeyboardEvent) => {\n const { keys } = provider.keyboard;\n\n keys.pressedKeys.value.add(event.code);\n\n const state = provider.state.value;\n\n if (state === 'dragging') {\n if (keys.forCancel.includes(event.code)) {\n event.preventDefault();\n enableInteractions();\n triggerSelfDragForElement(provider, provider.entities.initiatingDraggable, 'onSelfDragCancel');\n triggerDragForAll(provider, 'onDragCancel');\n triggerDropCancelEvents(provider, provider.hovered);\n resetDnDSession(provider);\n return;\n }\n if (keys.forDrop.includes(event.code)) {\n event.preventDefault();\n (async () => {\n const ok = await handleDropAndFinish(provider);\n if (ok) finishDragSession(provider);\n enableInteractions();\n resetDnDSession(provider);\n })();\n return;\n }\n const move = MOVE_MAP[event.code];\n if (move && keys.forMove.includes(event.code) && provider.pointer.value) {\n event.preventDefault();\n const faster = keys.forMoveFaster.some((k) => keys.pressedKeys.value.has(k));\n const dist = provider.keyboard.step * (faster ? provider.keyboard.moveFaster : 1);\n provider.pointer.value.current = {\n x: provider.pointer.value.current.x + move.dx * dist,\n y: provider.pointer.value.current.y + move.dy * dist,\n };\n\n const run = provider.collision?.run ?? defaultCollisionDetection;\n const result = run(provider);\n applyCollisionResultToHovered(provider, provider.hovered, result);\n triggerSelfDragForElement(provider, provider.entities.initiatingDraggable, 'onSelfDragMove');\n triggerDragForAll(provider, 'onDragMove');\n return;\n }\n return;\n }\n\n if (keys.forDrag.includes(event.code)) {\n const active = document.activeElement as HTMLElement | null;\n if (!active) return;\n\n const closestDraggable = active.closest(DnDSelectors.DRAGGABLE) as HTMLElement | null;\n if (!closestDraggable) return;\n\n if (\n provider.entities.modifiersDraggableSet.size === 0 ||\n !provider.entities.modifiersDraggableSet.has(closestDraggable)\n )\n return;\n\n const entity = provider.entities.draggableMap.get(closestDraggable);\n if (!checkDragHandle(active, closestDraggable, entity?.dragHandle, true)) return;\n\n event.preventDefault();\n disableInteractions();\n\n const rect = closestDraggable.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n const syntheticEvent = {\n clientX: centerX,\n clientY: centerY,\n target: closestDraggable,\n } as unknown as PointerEvent;\n\n provider.entities.initiatingDraggable = closestDraggable;\n const offset = calculateCursorOffset(syntheticEvent, closestDraggable);\n provider.pointer.value = createPointerState(syntheticEvent, offset.x, offset.y);\n\n startDraggingForProvider(provider);\n\n const run = provider.collision?.run ?? defaultCollisionDetection;\n const result = run(provider);\n applyCollisionResultToHovered(provider, provider.hovered, result);\n\n triggerSelfDragForElement(provider, closestDraggable, 'onSelfDragStart');\n triggerDragForAll(provider, 'onDragStart');\n }\n};\n\nconst handleKeyUp = (provider: IDnDProviderInternal) => (event: KeyboardEvent) => {\n provider.keyboard.keys.pressedKeys.value.delete(event.code);\n};\n\nconst handleClear = (provider: IDnDProviderInternal) => () => {\n provider.keyboard.keys.pressedKeys.value.clear();\n};\n\nexport const handleKeyboardEvents = {\n keyDown: handleKeyDown,\n keyUp: handleKeyUp,\n clear: handleClear,\n};\n","import type { IDnDProviderInternal } from '../types/provider';\r\n\r\nexport const handleScrollEvent = (provider: IDnDProviderInternal) => () => {\r\n if (provider.state.value) {\r\n provider.scrollPosition.x = window.scrollX;\r\n provider.scrollPosition.y = window.scrollY;\r\n }\r\n};\r\n","import { onBeforeUnmount, onMounted } from 'vue';\nimport { handleKeyboardEvents } from '../logic/keyboard';\nimport { createPointerHandlers } from '../logic/pointer';\nimport { handleScrollEvent } from '../logic/scroll';\nimport type { IDnDProviderInternal } from '../types/provider';\n\nexport const useDnDProviderEvents = (provider: IDnDProviderInternal) => {\n const handlers = createPointerHandlers(provider);\n const keyDown = handleKeyboardEvents.keyDown(provider);\n const keyUp = handleKeyboardEvents.keyUp(provider);\n const clear = handleKeyboardEvents.clear(provider);\n const scrollHandler = handleScrollEvent(provider);\n\n onMounted(() => {\n document.addEventListener('pointerdown', handlers.pointerDown);\n document.addEventListener('keydown', keyDown);\n document.addEventListener('keyup', keyUp);\n document.addEventListener('blur', clear);\n document.addEventListener('scroll', scrollHandler, true);\n });\n\n onBeforeUnmount(() => {\n document.removeEventListener('pointerdown', handlers.pointerDown);\n document.removeEventListener('pointerup', handlers.pointerUp);\n document.removeEventListener('pointermove', handlers.pointerMove);\n document.removeEventListener('keydown', keyDown);\n document.removeEventListener('keyup', keyUp);\n document.removeEventListener('blur', clear);\n document.removeEventListener('scroll', scrollHandler, true);\n handlers.cleanup();\n });\n};\n","import { inject } from \"vue\"\r\nimport { injectionKey } from \"../../internal/utils/namespaces\"\r\nimport type { IDnDProviderInternal } from \"../types/provider\";\r\n\r\nexport const useDnDProviderInternal = () => {\r\n const provider = inject<IDnDProviderInternal>(injectionKey)\r\n if (!provider) throw Error('DnD provider not found');\r\n \r\n return provider;\r\n}","import type { IDnDProviderExternal } from '../types';\r\nimport { useDnDProviderInternal } from '../../internal/composables/useDnDProviderInternal';\r\n\r\nexport const useDnDProvider = (): IDnDProviderExternal => {\r\n const provider = useDnDProviderInternal();\r\n\r\n return {\r\n overlay: provider.overlay,\r\n delay: provider.delay,\r\n distanceProgress: provider.distanceProgress,\r\n entities: provider.entities,\r\n pointer: provider.pointer,\r\n state: provider.state,\r\n scrollPosition: provider.scrollPosition,\r\n keyboard: provider.keyboard,\r\n hovered: provider.hovered,\r\n collision: provider.collision,\r\n };\r\n};\r\n","<script setup lang=\"ts\">\r\n import { useDnDProvider } from '../composables/useDnDProvider';\r\n\r\n const { entities, state, overlay } = useDnDProvider();\r\n</script>\r\n\r\n<template>\r\n <div\r\n v-if=\"state === 'dragging'\"\r\n class=\"dnd-kit-default-overlay\"\r\n :style=\"{\r\n '--position-x': overlay.style.value.x + 'px',\r\n '--position-y': overlay.style.value.y + 'px'\r\n }\"\r\n >\r\n <template v-for=\"[node, draggable] in entities.draggingMap\">\r\n <component\r\n v-if=\"entities.draggableMap.get(node)?.render\"\r\n :is=\"entities.draggableMap.get(node)?.render\"\r\n class=\"test\"\r\n />\r\n <component\r\n v-else\r\n :is=\"node.tagName\"\r\n v-html=\"draggable.initialHTML\"\r\n class=\"test\"\r\n :style=\"{\r\n width: draggable.initialRect.width + 'px',\r\n height: draggable.initialRect.height + 'px'\r\n }\"\r\n />\r\n </template>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n .dnd-kit-default-overlay {\r\n transform: translate3d(var(--position-x), var(--position-y), 0px);\r\n }\r\n</style>","<script setup lang=\"ts\">\n import { computed, provide, useTemplateRef } from 'vue';\n\n import { injectionKey } from '../../internal/utils/namespaces';\n import { useDnDProviderState } from '../../internal/composables/useDnDProviderState';\n import { useDnDProviderEvents } from '../../internal/composables/useDnDProviderEvents';\n\n import DefaultOverlay from './DefaultOverlay.vue';\n\n const overlayRef = useTemplateRef<HTMLElement>('overlayRef');\n const provider = useDnDProviderState(overlayRef);\n useDnDProviderEvents(provider);\n\n const overlay = computed(\n () => provider.overlay.render.value ?? DefaultOverlay\n );\n\n provide(injectionKey, provider);\n</script>\n\n<template>\n <slot />\n\n <div\n ref=\"overlayRef\"\n class=\"dnd-kit-overlay-container\"\n >\n <slot\n name=\"overlay\"\n :overlay\n >\n <component :is=\"overlay\" />\n </slot>\n </div>\n</template>\n\n<style>\n pre {\n position: fixed;\n top: 0;\n right: 0;\n height: 100svh;\n overflow: auto;\n }\n .dnd-kit-overlay-container {\n position: fixed;\n top: 0;\n left: 0;\n pointer-events: none;\n cursor: grabbing;\n }\n</style>\n","import type {\r\n IBaseOptions,\r\n IDragActivation,\r\n IDragActivationOptions,\r\n IDraggableEvents,\r\n IModifier,\r\n IModifierOptions,\r\n IPlacementMargins,\r\n TDnDNodeRef,\r\n TDraggablePayload,\r\n} from '../types';\r\nimport { onBeforeUnmount, onMounted, type Component, type Ref } from 'vue';\r\n\r\nimport { DnDAttributes } from '../../internal/utils/namespaces';\r\nimport { getNode, preventEvent } from '../../internal/utils/dom';\r\nimport { useDnDProviderInternal } from '../../internal/composables/useDnDProviderInternal';\r\n\r\ninterface IMakeDraggableOptions extends IBaseOptions {\r\n events?: IDraggableEvents;\r\n modifier?: IModifierOptions;\r\n render?: Component;\r\n dragHandle?: string | Ref<string>;\r\n activation?: IDragActivationOptions;\r\n /** Margins for center zone. When pointer in center and element is also droppable, zone mode is used. */\r\n placementMargins?: IPlacementMargins;\r\n}\r\n\r\ninterface IMakeDraggableReturnType {}\r\n\r\nexport function makeDraggable(\r\n ref: TDnDNodeRef,\r\n payload?: TDraggablePayload\r\n): IMakeDraggableReturnType;\r\nexport function makeDraggable(\r\n ref: TDnDNodeRef,\r\n options: IMakeDraggableOptions,\r\n payload?: TDraggablePayload\r\n): IMakeDraggableReturnType;\r\nexport function makeDraggable(\r\n ref: TDnDNodeRef,\r\n optionsOrPayload?: IMakeDraggableOptions | TDraggablePayload,\r\n payload?: TDraggablePayload\r\n): IMakeDraggableReturnType {\r\n const provider = useDnDProviderInternal();\r\n\r\n let options: IMakeDraggableOptions;\r\n let finalPayload: TDraggablePayload | undefined;\r\n let container: HTMLElement | null;\r\n\r\n if (typeof optionsOrPayload === 'function') {\r\n options = {};\r\n finalPayload = optionsOrPayload;\r\n } else {\r\n options = optionsOrPayload ?? {};\r\n finalPayload = payload;\r\n }\r\n\r\n onMounted(() => {\r\n container = getNode(ref);\r\n if (!container) return;\r\n\r\n container.addEventListener('dragstart', preventEvent);\r\n container.addEventListener('drag', preventEvent);\r\n container.addEventListener('dragend', preventEvent);\r\n\r\n container.setAttribute(DnDAttributes.DRAGGABLE, '');\r\n\r\n provider.lib.draggableObserver.observe(container);\r\n\r\n provider.entities.draggableMap.set(container, {\r\n render: options.render,\r\n disabled: (options.disabled as boolean) ?? false,\r\n groups: (options.groups as string[]) ?? [],\r\n modifier: options.modifier as IModifier,\r\n events: options.events,\r\n payload: finalPayload,\r\n dragHandle: options.dragHandle as string,\r\n activation: options.activation as IDragActivation,\r\n placementMargins: options.placementMargins,\r\n });\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n if (!container) return;\r\n\r\n provider.lib.draggableObserver.unobserve(container);\r\n provider.entities.visibleDraggableSet.delete(container);\r\n provider.entities.draggableMap.delete(container);\r\n provider.entities.modifiersDraggableSet.delete(container);\r\n });\r\n\r\n return {};\r\n}\r\n","import { computed, onBeforeUnmount, onMounted, type Ref } from 'vue';\r\nimport { getNode } from '../../internal/utils/dom';\r\nimport { DnDAttributes } from '../../internal/utils/namespaces';\r\n\r\nimport type {\r\n IBaseOptions,\r\n IModifier,\r\n ISelectableAreaEvents,\r\n TDnDNodeRef,\r\n TModifierKeys,\r\n TModifierMethod,\r\n} from '../types';\r\nimport { getBoundedSelectionArea } from '../../internal/utils/selection';\r\nimport { useDnDProviderInternal } from '../../internal/composables/useDnDProviderInternal';\r\n\r\ninterface ISelectableAreaOptions extends IBaseOptions {\r\n modifier?: {\r\n keys: TModifierKeys | Ref<TModifierKeys>;\r\n method: TModifierMethod | Ref<TModifierMethod>;\r\n };\r\n events?: ISelectableAreaEvents;\r\n}\r\n\r\nexport const makeSelectableArea = (\r\n nodeRef: TDnDNodeRef,\r\n options?: ISelectableAreaOptions\r\n) => {\r\n const provider = useDnDProviderInternal()\r\n\r\n const isSelecting = computed(() => {\r\n return nodeRef.value === provider.entities.selectingArea;\r\n });\r\n\r\n let container: HTMLElement | null = null;\r\n\r\n onMounted(() => {\r\n container = getNode(nodeRef);\r\n if (!container) return;\r\n container.setAttribute(DnDAttributes.SELECT_AREA, '');\r\n\r\n provider.lib.selectableAreaObserver.observe(container);\r\n provider.entities.selectableAreaMap.set(container, {\r\n modifier: (options?.modifier as IModifier) ?? {\r\n keys: ['ControlLeft'],\r\n method: 'every',\r\n },\r\n events: options?.events,\r\n disabled: (options?.disabled as boolean) ?? false,\r\n groups: (options?.groups as string[]) ?? [],\r\n });\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n if (!container) return;\r\n\r\n provider.lib.selectableAreaObserver.unobserve(container);\r\n provider.entities.visibleSelectableAreaSet.delete(container);\r\n provider.entities.modifiersSelectableAreaSet.delete(container);\r\n provider.entities.selectableAreaMap.delete(container);\r\n });\r\n\r\n const style = computed(() => {\r\n provider.scrollPosition.x;\r\n provider.scrollPosition.y;\r\n\r\n const pointer = provider.pointer.value;\r\n if (!pointer || provider.state.value !== 'selecting' || !container) {\r\n return {};\r\n }\r\n\r\n return getBoundedSelectionArea(pointer.start, pointer.current, container);\r\n });\r\n\r\n return {\r\n isSelecting,\r\n style,\r\n };\r\n};\r\n","import type {\r\n IDnDProviderExternal,\r\n TDnDNodeRef,\r\n TDragAxis,\r\n} from '../types';\r\nimport { inject, onBeforeUnmount, onMounted, type Ref } from 'vue';\r\nimport { DnDAttributes, injectionKey } from '../../internal/utils/namespaces';\r\nimport { getNode } from '../../internal/utils/dom';\r\n\r\nexport interface IMakeBoundingBoxOptions {\r\n axis?: TDragAxis | Ref<TDragAxis>;\r\n restrictToArea?: boolean | Ref<boolean>;\r\n}\r\n\r\nexport function makeBoundingBox(\r\n ref: TDnDNodeRef,\r\n options?: IMakeBoundingBoxOptions\r\n) {\r\n const provider = inject<IDnDProviderExternal>(injectionKey);\r\n if (!provider) throw Error('DnD provider not found');\r\n let container: HTMLElement | null = null;\r\n\r\n onMounted(() => {\r\n container = getNode(ref);\r\n if (!container) return;\r\n\r\n container.setAttribute(DnDAttributes.CONSTRAINT_AREA, '');\r\n\r\n provider.entities.constraintsAreaMap.set(container, {\r\n axis: (options?.axis || 'both') as TDragAxis,\r\n restrictToArea: (options?.restrictToArea || false) as boolean,\r\n });\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n if (!container) return;\r\n provider.entities.constraintsAreaMap.delete(container);\r\n });\r\n\r\n return {};\r\n}\r\n","import type { IBaseOptions, IDroppableEvents, TDnDNodeRef } from '../types';\r\nimport { onBeforeUnmount, onMounted } from 'vue';\r\n\r\nimport { DnDAttributes } from '../../internal/utils/namespaces';\r\nimport { getNode } from '../../internal/utils/dom';\r\nimport { useDnDProviderInternal } from '../../internal/composables/useDnDProviderInternal';\r\n\r\ninterface IMakeDroppableOptions extends IBaseOptions {\r\n events?: IDroppableEvents;\r\n}\r\n\r\nexport function makeDroppable(ref: TDnDNodeRef, options: IMakeDroppableOptions = {}): void {\r\n const provider = useDnDProviderInternal();\r\n let container: HTMLElement | null = null;\r\n\r\n onMounted(() => {\r\n container = getNode(ref);\r\n if (!container) return;\r\n\r\n container.setAttribute(DnDAttributes.DROPPABLE, '');\r\n provider.lib.droppableObserver.observe(container);\r\n\r\n provider.entities.droppableMap.set(container, {\r\n disabled: (options.disabled as boolean) ?? false,\r\n groups: (options.groups as string[]) ?? [],\r\n events: options.events,\r\n });\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n if (!container) return;\r\n\r\n provider.lib.droppableObserver.unobserve(container);\r\n provider.entities.visibleDroppableSet.delete(container);\r\n provider.entities.droppableMap.delete(container);\r\n });\r\n}\r\n"],"names":["DnDAttributes","DnDSelectors","injectionKey","filterByModifiers","entityMap","visibleSet","modifiers","isDisabled","result","visibleNode","entity","disabled","keys","method","key","originalUserSelect","originalTouchAction","originalOverscrollBehavior","getNode","node","isDescendant","parent","child","checkIntersection","rect1","rect2","disableInteractions","body","preventEvent","enableInteractions","event","isEffectivelyDisabledDraggable","ctx","el","e","isEffectivelyDisabledDroppable","createIntersectionObserver","targetSet","observer","entries","entry","element","createSizeObserver","target","width","height","useSizeObserver","elementRef","overlaySize","ref","stopWatch","watch","createPointerState","offsetX","offsetY","calculateCursorOffset","rect","x","y","createDraggingEntity","draggableEntity","initializeDraggingFromSelection","selectedSet","draggableMap","draggingMap","selected","draggingEntity","initializeDraggingFromElement","startDraggingForProvider","provider","initializeDragging","initiatingElement","checkDragHandle","draggable","handleSelector","skipHandle","handleElement","calculateDistanceProgress","pointer","distanceThreshold","deltaX","deltaY","movedDistance","distanceX","distanceY","condition","progressX","progressY","isActivationComplete","distanceProgress","delayProgress","activation","hasDistance","hasDelay","tryStartDragIfActivationComplete","createActivationDelayTimer","onComplete","rafId","tick","delay","findConstraintArea","constraintsAreaMap","constraintElement","applyAxisConstraint","targetX","targetY","axis","draggableRect","applyBoundsConstraint","constraintRect","overlayRect","calculateConstrainedPosition","overlayElement","firstDraggable","overlaySizeFallback","constraint","axisConstrained","DEFAULT_KEYS","useDnDProviderState","overlayRef","state","shallowRef","keyboard","entities","reactive","computed","scrollPosition","draggableObserver","droppableObserver","selectableAreaObserver","overlaySizeObserver","overlayRender","hovered","collision","overlayStyle","resetDnDSession","createDragPayload","initiating","payloadFn","index","items","dropData","getFirstKey","map","getClosestDraggableFromEvent","getDragEvent","triggerSelfDragFromEvent","eventName","dragEvent","triggerSelfDragForElement","triggerDragForAll","triggerZoneEnterLeave","prevZone","newZone","triggerDraggableHoverChange","prevEl","newEl","triggerZoneLeave","zone","triggerDropCancelEvents","areGroupsCompatible","groupsA","groupsB","g","getBoundedSelectionArea","start","current","container","containerRect","left","top","right","bottom","updateSelectionByBox","selectingArea","selectionBoxRect","getSelectionBoxRect","selectionAreaGroups","draggableGroups","createPointerBox","size","half","getPointerBoxFromProvider","p","getClosestPlacement","pointerBox","elementRect","margins","cx","cy","t","r","b","l","innerLeft","innerRight","innerTop","innerBottom","dTop","dBottom","dLeft","dRight","min","findNestedDraggable","elements","applyCollisionResultToHovered","prevElement","newElement","placement","nested","nestedRect","finalZone","finalElement","checkCollision","boxA","boxB","getBoundingBox","getCenter","box","getDistance","pointA","pointB","getOverlapPercent","xOverlap","yOverlap","overlapArea","boxAArea","boxBArea","containsPoint","defaultFilter","defaultSort","createBuilder","config","run","containerBox","candidates","filter","sortFn","collisionCheck","nodeSet","nodeBox","depth","a","builder","fn","cfg","containerEl","createSensor","overlayContainer","overlayBoxFromStyle","style","w","h","visibleElements","visibleZones","filterNotDragging","filterNotDescendantOfDragged","dragged","filterNotDisabled","filterValidCollisionTarget","aabbCollision","sortByOverlapAndPointer","defaultCollisionDetection","runCollisionAndApply","runThrottledCollision","lastRun","throttleMs","now","handleDropAndFinish","hoveredZone","zoneEntity","finishDragSession","finishSelectionSession","areaEntity","createPointerHandlers","delayTimer","lastCollisionRun","pointerUp","pointerMove","closestSelectionArea","closestDraggable","offset","MOVE_MAP","handleKeyDown","move","faster","k","dist","active","centerX","centerY","syntheticEvent","handleKeyUp","handleClear","handleKeyboardEvents","handleScrollEvent","useDnDProviderEvents","handlers","keyDown","keyUp","clear","scrollHandler","onMounted","onBeforeUnmount","useDnDProviderInternal","inject","useDnDProvider","overlay","_unref","_createElementBlock","_normalizeStyle","_openBlock","_Fragment","_createBlock","_resolveDynamicComponent","useTemplateRef","DefaultOverlay","provide","_renderSlot","_ctx","_createElementVNode","makeDraggable","optionsOrPayload","payload","options","finalPayload","makeSelectableArea","nodeRef","isSelecting","makeBoundingBox","makeDroppable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vue-dnd-kit-core.es.js","sources":["../src/internal/utils/namespaces.ts","../src/internal/utils/provider.ts","../src/internal/utils/dom.ts","../src/internal/utils/disabled.ts","../src/internal/utils/observer.ts","../src/internal/composables/useSizeObserver.ts","../src/internal/utils/pointer.ts","../src/internal/utils/drag-activation.ts","../src/internal/utils/constraints.ts","../src/internal/composables/useDnDProviderState.ts","../src/internal/utils/session.ts","../src/internal/logic/payload.ts","../src/internal/utils/events.ts","../src/internal/utils/groups.ts","../src/internal/utils/selection.ts","../src/internal/utils/placement.ts","../src/internal/logic/hover.ts","../src/internal/utils/geometry.ts","../src/internal/sensors/sensor.ts","../src/internal/sensors/steps.ts","../src/internal/sensors/defaultCollision.ts","../src/internal/logic/pointer.ts","../src/internal/logic/keyboard.ts","../src/internal/logic/scroll.ts","../src/internal/composables/useDnDProviderEvents.ts","../src/internal/composables/useDnDProviderInternal.ts","../src/external/composables/useDnDProvider.ts","../src/external/components/DefaultOverlay.vue","../src/external/components/DnDProvider.vue","../src/external/composables/makeDraggable.ts","../src/external/composables/makeSelectableArea.ts","../src/external/composables/makeBoundingBox.ts","../src/external/composables/makeDroppable.ts"],"sourcesContent":["/**\n * DnD Kit data attributes and CSS selectors\n */\nexport const DnDAttributes = {\n SELECT_AREA: 'data-dnd-kit-select-area',\n DRAGGABLE: 'data-dnd-kit-draggable',\n DROPPABLE: 'data-dnd-kit-droppable',\n CONSTRAINT_AREA: 'data-dnd-kit-constraint-area',\n CONTAINER: 'data-dnd-kit-container'\n} as const;\n\nexport const DnDSelectors = {\n SELECT_AREA: `[${DnDAttributes.SELECT_AREA}]`,\n DRAGGABLE: `[${DnDAttributes.DRAGGABLE}]`,\n DROPPABLE: `[${DnDAttributes.DROPPABLE}]`,\n CONSTRAINT_AREA: `[${DnDAttributes.CONSTRAINT_AREA}]`,\n CONTAINER: `[${DnDAttributes.CONTAINER}]`\n} as const;\n\nexport const injectionKey = 'VueDnDKitProvider' as const\n","import type {\r\n IDraggableEntity,\r\n ISelectableAreaEntity,\r\n} from '../../external/types';\r\n\r\nimport type { Ref } from 'vue';\r\n\r\n/**\r\n * Utility for filtering entities by modifier keys.\r\n *\r\n * @param entityMap - Map of entities (e.g. selectableAreaMap or draggableEntityMap)\r\n * @param visibleSet - Set of visible nodes\r\n * @param modifiers - Ref with pressed keys\r\n * @param isDisabled - Optional: override disabled check (e.g. isEffectivelyDisabledDraggable for draggables)\r\n * @returns Set of filtered nodes with matching modifiers\r\n */\r\nexport const filterByModifiers = (\r\n entityMap: Map<HTMLElement, IDraggableEntity | ISelectableAreaEntity>,\r\n visibleSet: Set<HTMLElement>,\r\n modifiers: Ref<Set<string>>,\r\n isDisabled?: (node: HTMLElement) => boolean\r\n): Set<HTMLElement> => {\r\n const result: Set<HTMLElement> = new Set();\r\n\r\n visibleSet.forEach((visibleNode) => {\r\n const entity = entityMap.get(visibleNode);\r\n const disabled = isDisabled ? isDisabled(visibleNode) : entity?.disabled;\r\n if (!entity || disabled) return;\r\n\r\n const keys = entity.modifier?.keys;\r\n const method = entity.modifier?.method;\r\n\r\n // If no modifier keys are specified, element is always available\r\n if (!keys || !method || keys.length === 0) {\r\n result.add(visibleNode);\r\n return;\r\n }\r\n\r\n const keysPressed = keys[method]((key) => modifiers.value.has(key));\r\n\r\n if (keysPressed) {\r\n result.add(visibleNode);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n","import type { ComponentPublicInstance } from 'vue';\r\nimport type { ICoordinates, TDnDNodeRef } from '../../external/types';\r\n\r\nlet originalUserSelect = '';\r\nlet originalTouchAction = '';\r\nlet originalOverscrollBehavior = '';\r\n\r\n/**\r\n * Resolves template ref to HTMLElement (handles both element and component refs)\r\n */\r\nexport const getNode = (node: TDnDNodeRef) => {\r\n if (!node.value) return null;\r\n if (node.value instanceof HTMLElement) {\r\n return node.value;\r\n } else {\r\n const component = node.value as ComponentPublicInstance;\r\n return component.$el as HTMLElement;\r\n }\r\n};\r\n\r\n/**\r\n * Checks if point (x, y) is inside rect\r\n */\r\nexport const containsPoint = (rect: DOMRect, x: number, y: number): boolean =>\r\n x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\r\n\r\n/**\r\n * True if child is a descendant of parent (parent.contains(child) and parent !== child)\r\n */\r\nexport const isDescendant = (parent: HTMLElement, child: HTMLElement): boolean =>\r\n parent !== child && parent.contains(child);\r\n\r\n/**\r\n * Checks if two DOMRects intersect\r\n */\r\nexport const checkIntersection = (rect1: DOMRect, rect2: DOMRect): boolean => {\r\n const noIntersection =\r\n rect1.right < rect2.left ||\r\n rect1.left > rect2.right ||\r\n rect1.bottom < rect2.top ||\r\n rect1.top > rect2.bottom;\r\n\r\n return !noIntersection;\r\n};\r\n\r\n/**\r\n * Returns true if event target is outside the container\r\n */\r\nexport const isNotDirectClick = (\r\n event: Event,\r\n container: HTMLElement | null\r\n): boolean => {\r\n return (\r\n container !== null &&\r\n event.target !== container &&\r\n !container.contains(event.target as Node)\r\n );\r\n};\r\n\r\n/**\r\n * Returns scroll direction based on cursor proximity to container edges\r\n */\r\nexport const getAutoScrollDirection = (\r\n coords: ICoordinates,\r\n container: HTMLElement,\r\n threshold: number = 50\r\n): { x: number; y: number } => {\r\n const rect = container.getBoundingClientRect();\r\n\r\n const distanceFromLeft = coords.x - rect.left;\r\n const distanceFromRight = rect.right - coords.x;\r\n const distanceFromTop = coords.y - rect.top;\r\n const distanceFromBottom = rect.bottom - coords.y;\r\n\r\n let scrollX = 0;\r\n let scrollY = 0;\r\n\r\n if (distanceFromLeft < threshold && distanceFromLeft > 0) {\r\n scrollX = -1;\r\n } else if (distanceFromRight < threshold && distanceFromRight > 0) {\r\n scrollX = 1;\r\n }\r\n\r\n if (distanceFromTop < threshold && distanceFromTop > 0) {\r\n scrollY = -1;\r\n } else if (distanceFromBottom < threshold && distanceFromBottom > 0) {\r\n scrollY = 1;\r\n }\r\n\r\n return { x: scrollX, y: scrollY };\r\n};\r\n\r\n/**\r\n * Returns true if running in browser environment\r\n */\r\nexport const isClient = () => typeof window !== 'undefined';\r\n\r\n/**\r\n * Disables user interactions during drag (user-select, context menu, etc.)\r\n */\r\nexport const disableInteractions = () => {\r\n const body = document.body;\r\n\r\n originalUserSelect = body.style.userSelect;\r\n\r\n body.style.userSelect = 'none';\r\n\r\n window.addEventListener('contextmenu', preventEvent);\r\n window.addEventListener('selectstart', preventEvent);\r\n window.addEventListener('touchstart', preventEvent);\r\n window.addEventListener('touchmove', preventEvent);\r\n};\r\n\r\n/**\r\n * Restores user interactions after drag ends\r\n */\r\nexport const enableInteractions = () => {\r\n const body = document.body;\r\n\r\n body.style.userSelect = originalUserSelect;\r\n body.style.touchAction = originalTouchAction;\r\n body.style.overscrollBehavior = originalOverscrollBehavior;\r\n\r\n window.removeEventListener('contextmenu', preventEvent);\r\n window.removeEventListener('selectstart', preventEvent);\r\n window.removeEventListener('touchstart', preventEvent);\r\n window.removeEventListener('touchmove', preventEvent);\r\n};\r\n\r\n/**\r\n * Prevents default browser behavior for the event\r\n */\r\nexport const preventEvent = (event: Event) => event.preventDefault();\r\n","/**\n * Disabled check — element is disabled if itself or any parent is disabled.\n * Split by context to avoid iterating both maps when only one is needed.\n */\n\nimport { isDescendant } from './dom';\nimport type { IEntities } from '../../external/types';\n\n/** Minimal context for draggable/droppable checks */\nexport type IEffectivelyDisabledContext = { entities: Pick<IEntities, 'draggableMap' | 'droppableMap'> };\n\n/** True if node is disabled as draggable (self or inside disabled draggable). O(draggableMap.size) */\nexport const isEffectivelyDisabledDraggable = (\n node: HTMLElement,\n ctx: IEffectivelyDisabledContext\n): boolean => {\n const entity = ctx.entities.draggableMap.get(node);\n if (entity?.disabled) return true;\n for (const [el, e] of ctx.entities.draggableMap) {\n if (e.disabled && isDescendant(el, node)) return true;\n }\n return false;\n};\n\n/** True if node is disabled as droppable (self or inside disabled droppable). O(droppableMap.size) */\nexport const isEffectivelyDisabledDroppable = (\n node: HTMLElement,\n ctx: IEffectivelyDisabledContext\n): boolean => {\n const entity = ctx.entities.droppableMap.get(node);\n if (entity?.disabled) return true;\n for (const [el, e] of ctx.entities.droppableMap) {\n if (e.disabled && isDescendant(el, node)) return true;\n }\n return false;\n};\n","/**\r\n * Observers — IntersectionObserver (visibility) and ResizeObserver (size)\r\n */\r\n\r\nexport interface IObserverWrapper {\r\n observe: (element: HTMLElement) => void;\r\n unobserve: (element: HTMLElement) => void;\r\n disconnect: () => void;\r\n}\r\n\r\n/**\r\n * Creates an IntersectionObserver that manages a Set of visible elements\r\n *\r\n * @param targetSet - Set to add/remove elements\r\n * @returns Object with observe/unobserve/disconnect methods\r\n */\r\nexport const createIntersectionObserver = (targetSet: Set<HTMLElement>): IObserverWrapper => {\r\n const observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n const element = entry.target as HTMLElement;\r\n targetSet[entry.isIntersecting ? 'add' : 'delete'](element);\r\n });\r\n });\r\n\r\n return {\r\n observe: (el) => observer.observe(el),\r\n unobserve: (el) => observer.unobserve(el),\r\n disconnect: () => observer.disconnect(),\r\n };\r\n};\r\n\r\n/**\r\n * Creates a ResizeObserver that tracks element size and writes to target ref\r\n *\r\n * @param target - Ref to write { width, height } on resize\r\n * @returns Object with observe/unobserve/disconnect methods\r\n */\r\nexport const createSizeObserver = (\r\n target: { value: { width: number; height: number } | null }\r\n): IObserverWrapper => {\r\n const observer = new ResizeObserver((entries) => {\r\n const entry = entries[0];\r\n if (!entry) return;\r\n const { width, height } = entry.contentRect;\r\n target.value = { width, height };\r\n });\r\n\r\n return {\r\n observe: (el) => observer.observe(el),\r\n unobserve: (el) => observer.unobserve(el),\r\n disconnect: () => observer.disconnect(),\r\n };\r\n};\r\n","import { ref, watch, type Ref } from 'vue';\nimport { createSizeObserver } from '../utils/observer';\n\n/**\n * Tracks element size via ResizeObserver, writes to returned ref\n *\n * @param elementRef - Ref to element to observe\n * @returns { overlaySize, overlaySizeObserver } — ref with { width, height } and cleanup\n */\n\nexport const useSizeObserver = (\n elementRef: Ref<HTMLElement | null>\n) => {\n const overlaySize = ref<DOMRect | null>(null);\n const observer = createSizeObserver(overlaySize);\n\n const stopWatch = watch(\n elementRef,\n (el) => {\n observer.disconnect();\n if (el) observer.observe(el);\n },\n { immediate: true }\n );\n\n const overlaySizeObserver = {\n disconnect: () => {\n stopWatch();\n observer.disconnect();\n },\n };\n\n return { overlaySize, overlaySizeObserver };\n};\n","import type {\n IDraggableEntity,\n IDraggingEntity,\n TPointerState,\n} from '../../external/types';\nimport type { IDnDProviderInternal } from '../types/provider';\n\n/**\n * Creates initial pointer state from event\n */\nexport function createPointerState(\n event: PointerEvent,\n offsetX: number = 0,\n offsetY: number = 0\n): TPointerState {\n return {\n start: { x: event.clientX, y: event.clientY },\n current: { x: event.clientX, y: event.clientY },\n offset: { x: offsetX, y: offsetY },\n };\n}\n\n/**\n * Calculates cursor offset as ratio (0–1) relative to element size\n */\nexport function calculateCursorOffset(\n event: PointerEvent,\n element: HTMLElement\n): { x: number; y: number } {\n const rect = element.getBoundingClientRect();\n\n const x = rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0.5;\n const y = rect.height > 0 ? (event.clientY - rect.top) / rect.height : 0.5;\n return { x, y };\n}\n\n/**\n * Creates dragging entity with initial data\n */\nexport function createDraggingEntity(\n element: HTMLElement,\n draggableEntity?: IDraggableEntity\n): IDraggingEntity {\n return {\n ...draggableEntity,\n initialHTML: element.innerHTML,\n initialRect: element.getBoundingClientRect(),\n };\n}\n\n/**\n * Инициализирует dragging для выбранных элементов\n */\nexport function initializeDraggingFromSelection(\n selectedSet: Set<HTMLElement>,\n draggableMap: Map<HTMLElement, IDraggableEntity>,\n draggingMap: Map<HTMLElement, IDraggingEntity>\n): void {\n selectedSet.forEach((selected) => {\n const draggingEntity = draggableMap.get(selected);\n draggingMap.set(selected, createDraggingEntity(selected, draggingEntity));\n });\n selectedSet.clear();\n}\n\n/**\n * Initializes dragging for single element\n */\nexport function initializeDraggingFromElement(\n element: HTMLElement,\n draggableMap: Map<HTMLElement, IDraggableEntity>,\n draggingMap: Map<HTMLElement, IDraggingEntity>\n): void {\n draggingMap.clear();\n const draggingEntity = draggableMap.get(element);\n draggingMap.set(element, createDraggingEntity(element, draggingEntity));\n}\n\n/**\n * Starts dragging for the current provider state (initiatingDraggable + selectedSet)\n */\nexport function startDraggingForProvider(provider: IDnDProviderInternal): void {\n if (!provider.entities.initiatingDraggable) return;\n provider.state.value = 'dragging';\n initializeDragging(\n provider.entities.initiatingDraggable,\n provider.entities.selectedSet,\n provider.entities.draggableMap,\n provider.entities.draggingMap\n );\n}\n\n/**\n * Initializes dragging (chooses between selection and single element)\n */\nexport function initializeDragging(\n initiatingElement: HTMLElement,\n selectedSet: Set<HTMLElement>,\n draggableMap: Map<HTMLElement, IDraggableEntity>,\n draggingMap: Map<HTMLElement, IDraggingEntity>\n): void {\n if (selectedSet.has(initiatingElement)) {\n initializeDraggingFromSelection(selectedSet, draggableMap, draggingMap);\n } else {\n selectedSet.clear();\n initializeDraggingFromElement(initiatingElement, draggableMap, draggingMap);\n }\n}\n","import type { IDragActivation, TPointerState } from '../../external/types';\nimport type { IDnDProviderInternal } from '../types/provider';\nimport { startDraggingForProvider } from './pointer';\n\n/**\n * Checks if the click target is within the drag handle (if specified)\n * @param skipHandle - when true (e.g. keyboard drag), bypass handle check\n */\nexport function checkDragHandle(\n target: HTMLElement,\n draggable: HTMLElement,\n handleSelector?: string,\n skipHandle?: boolean\n): boolean {\n if (skipHandle || !handleSelector) return true;\n\n const handleElement = target.closest(handleSelector) as HTMLElement | null;\n\n if (!handleElement) return false;\n\n return draggable.contains(handleElement);\n}\n\n/**\n * Calculates distance progress (0-1) for activation threshold\n */\nexport function calculateDistanceProgress(\n pointer: TPointerState,\n distanceThreshold: IDragActivation['distance']\n): number {\n if (!pointer || !distanceThreshold) return 1;\n\n const deltaX = Math.abs(pointer.current.x - pointer.start.x);\n const deltaY = Math.abs(pointer.current.y - pointer.start.y);\n\n if (typeof distanceThreshold === 'number') {\n const movedDistance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n return Math.min(movedDistance / distanceThreshold, 1);\n }\n\n const {\n x: distanceX = 0,\n y: distanceY = 0,\n condition = 'any',\n } = distanceThreshold;\n\n if (distanceX === 0 && distanceY === 0) return 1;\n\n const progressX = distanceX > 0 ? Math.min(deltaX / distanceX, 1) : 1;\n const progressY = distanceY > 0 ? Math.min(deltaY / distanceY, 1) : 1;\n\n return condition === 'both'\n ? Math.min(progressX, progressY)\n : Math.max(progressX, progressY);\n}\n\n/**\n * Returns true if distance threshold is met\n */\nexport function isDistanceThresholdPassed(\n pointer: TPointerState,\n distanceThreshold: IDragActivation['distance']\n): boolean {\n return calculateDistanceProgress(pointer, distanceThreshold) >= 1;\n}\n\n/**\n * Returns true if activation conditions are met (distance + delay, respecting condition)\n */\nexport function isActivationComplete(\n distanceProgress: number,\n delayProgress: number,\n activation?: IDragActivation\n): boolean {\n if (!activation) return true;\n\n const hasDistance = activation.distance != null;\n const hasDelay = activation.delay != null;\n\n if (!hasDistance && !hasDelay) return true;\n if (hasDistance && !hasDelay) return distanceProgress >= 1;\n if (!hasDistance && hasDelay) return delayProgress >= 1;\n\n const condition = activation.condition ?? 'both';\n return condition === 'both'\n ? distanceProgress >= 1 && delayProgress >= 1\n : distanceProgress >= 1 || delayProgress >= 1;\n}\n\n/**\n * If activation is complete, starts dragging. Returns true if drag was started\n */\nexport function tryStartDragIfActivationComplete(\n provider: IDnDProviderInternal\n): boolean {\n if (\n provider.state.value !== 'activating' ||\n !provider.entities.initiatingDraggable\n )\n return false;\n const entity = provider.entities.draggableMap.get(\n provider.entities.initiatingDraggable\n );\n if (\n !isActivationComplete(\n provider.distanceProgress.value,\n provider.delay.progress,\n entity?.activation\n )\n ) {\n return false;\n }\n startDraggingForProvider(provider);\n return true;\n}\n\n/**\n * Creates RAF-based delay timer that ticks until activation is complete, then calls onComplete\n */\nexport function createActivationDelayTimer(\n provider: IDnDProviderInternal,\n onComplete: () => void\n): { cancel: () => void } {\n let rafId: number | null = null;\n const tick = () => {\n if (\n provider.state.value !== 'activating' ||\n !provider.entities.initiatingDraggable\n ) {\n rafId = null;\n return;\n }\n const entity = provider.entities.draggableMap.get(\n provider.entities.initiatingDraggable\n );\n const delay = entity?.activation?.delay;\n if (!delay) {\n rafId = null;\n return;\n }\n provider.delay.progress = Math.min(\n (Date.now() - provider.delay.startTime) / (delay * 1000),\n 1\n );\n if (\n isActivationComplete(\n provider.distanceProgress.value,\n provider.delay.progress,\n entity?.activation\n )\n ) {\n onComplete();\n rafId = null;\n } else {\n rafId = requestAnimationFrame(tick);\n }\n };\n rafId = requestAnimationFrame(tick);\n return {\n cancel: () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n },\n };\n}\n","import type {\n IConstraintsAreaEntity,\n TPointerState,\n} from '../../external/types';\nimport { DnDSelectors } from './namespaces';\n\n/**\n * Finds constraint area for a draggable element\n */\nexport function findConstraintArea(\n draggable: HTMLElement,\n constraintsAreaMap: Map<HTMLElement, IConstraintsAreaEntity>\n): { element: HTMLElement; entity: IConstraintsAreaEntity } | null {\n const constraintElement = draggable.closest(\n DnDSelectors.CONSTRAINT_AREA\n ) as HTMLElement | null;\n\n if (!constraintElement || !constraintsAreaMap.has(constraintElement)) {\n return null;\n }\n\n return {\n element: constraintElement,\n entity: constraintsAreaMap.get(constraintElement)!,\n };\n}\n\n/**\n * Applies axis constraint\n */\nexport function applyAxisConstraint(\n targetX: number,\n targetY: number,\n axis: 'x' | 'y' | 'both',\n draggableRect: DOMRect\n): { x: number; y: number } {\n if (axis === 'x') {\n // Horizontal movement only\n return { x: targetX, y: draggableRect.top };\n } else if (axis === 'y') {\n // Vertical movement only\n return { x: draggableRect.left, y: targetY };\n }\n\n return { x: targetX, y: targetY };\n}\n\n/**\n * Applies bounds constraint within container\n */\nexport function applyBoundsConstraint(\n targetX: number,\n targetY: number,\n axis: 'x' | 'y' | 'both',\n constraintRect: DOMRect,\n overlayRect: DOMRect\n): { x: number; y: number } {\n let x = targetX;\n let y = targetY;\n\n // Constrain X (if axis is not Y only)\n if (axis !== 'y') {\n x = Math.max(\n constraintRect.left,\n Math.min(constraintRect.right - overlayRect.width, targetX)\n );\n }\n\n // Constrain Y (if axis is not X only)\n if (axis !== 'x') {\n y = Math.max(\n constraintRect.top,\n Math.min(constraintRect.bottom - overlayRect.height, targetY)\n );\n }\n\n return { x, y };\n}\n\n/**\n * Calculates final overlay position with all constraints applied\n */\nexport function calculateConstrainedPosition(\n pointer: TPointerState,\n overlayElement: HTMLElement | null,\n firstDraggable: HTMLElement | null,\n constraintsAreaMap: Map<HTMLElement, IConstraintsAreaEntity>,\n overlaySizeFallback?: { width: number; height: number } | null\n): { x: number; y: number } {\n if (!pointer || !overlayElement) {\n return { x: 0, y: 0 };\n }\n\n const overlayRect = overlayElement.getBoundingClientRect();\n const width = overlayRect.width || overlaySizeFallback?.width || 0;\n const height = overlayRect.height || overlaySizeFallback?.height || 0;\n // offset is ratio (0–1)\n let targetX = pointer.current.x - width * pointer.offset.x;\n let targetY = pointer.current.y - height * pointer.offset.y;\n\n if (!firstDraggable) {\n return { x: targetX, y: targetY };\n }\n\n // Find constraint area\n const constraint = findConstraintArea(firstDraggable, constraintsAreaMap);\n if (!constraint) {\n return { x: targetX, y: targetY };\n }\n\n const { element: constraintElement, entity } = constraint;\n const constraintRect = constraintElement.getBoundingClientRect();\n const draggableRect = firstDraggable.getBoundingClientRect();\n\n // Apply axis constraint\n const axisConstrained = applyAxisConstraint(\n targetX,\n targetY,\n entity.axis || 'both',\n draggableRect\n );\n\n // Apply bounds constraint\n if (entity.restrictToArea) {\n return applyBoundsConstraint(\n axisConstrained.x,\n axisConstrained.y,\n entity.axis || 'both',\n constraintRect,\n overlayRect\n );\n }\n\n return axisConstrained;\n}\n\n/**\n * Updates pointer.current with constraint-applied coordinates.\n * When constraints exist, stores the \"effective\" position so pointer matches overlay.\n */\nexport function updatePointerWithConstraints(\n pointer: TPointerState,\n rawX: number,\n rawY: number,\n overlayElement: HTMLElement | null,\n firstDraggable: HTMLElement | null,\n constraintsAreaMap: Map<HTMLElement, IConstraintsAreaEntity>,\n overlaySizeFallback?: { width: number; height: number } | null\n): void {\n if (!pointer) return;\n\n const overlayRect = overlayElement?.getBoundingClientRect();\n const width = overlayRect?.width ?? overlaySizeFallback?.width ?? 0;\n const height = overlayRect?.height ?? overlaySizeFallback?.height ?? 0;\n\n const tempPointer = {\n start: pointer.start,\n current: { x: rawX, y: rawY },\n offset: pointer.offset,\n };\n\n const constrained = calculateConstrainedPosition(\n tempPointer,\n overlayElement,\n firstDraggable,\n constraintsAreaMap,\n overlaySizeFallback\n );\n\n pointer.current.x = constrained.x + width * pointer.offset.x;\n pointer.current.y = constrained.y + height * pointer.offset.y;\n}\n","import {\r\n computed,\r\n reactive,\r\n ref,\r\n shallowRef,\r\n type Component,\r\n type Ref,\r\n} from 'vue';\r\nimport type {\r\n ICoordinates,\r\n IDelay,\r\n IEntities,\r\n TDnDState,\r\n TPointerState,\r\n} from '../../external/types';\r\nimport type { IHovered } from '../../external/types/provider';\r\nimport { filterByModifiers } from '../utils/provider';\r\nimport { isEffectivelyDisabledDraggable } from '../utils/disabled';\r\nimport { createIntersectionObserver } from '../utils/observer';\r\nimport { useSizeObserver } from './useSizeObserver';\r\nimport { calculateDistanceProgress } from '../utils/drag-activation';\r\nimport { calculateConstrainedPosition } from '../utils/constraints';\r\nimport type { IDnDProviderInternal } from '../types/provider';\r\n\r\nconst DEFAULT_KEYS = {\r\n forDrag: ['Enter', 'Space'],\r\n forCancel: ['Escape'],\r\n forDrop: ['Enter', 'Space'],\r\n forMove: [\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'KeyW',\r\n 'KeyA',\r\n 'KeyS',\r\n 'KeyD',\r\n ],\r\n forMoveFaster: ['ShiftLeft', 'ShiftRight'],\r\n} as const;\r\n\r\nexport function useDnDProviderState(\r\n overlayRef: Ref<HTMLElement | null>\r\n): IDnDProviderInternal {\r\n const state = shallowRef<TDnDState>();\r\n const pointer = ref<TPointerState | undefined>();\r\n const pressedKeys = ref<Set<string>>(new Set());\r\n\r\n const keyboard = {\r\n keys: {\r\n pressedKeys,\r\n forDrag: [...DEFAULT_KEYS.forDrag],\r\n forCancel: [...DEFAULT_KEYS.forCancel],\r\n forDrop: [...DEFAULT_KEYS.forDrop],\r\n forMove: [...DEFAULT_KEYS.forMove],\r\n forMoveFaster: [...DEFAULT_KEYS.forMoveFaster],\r\n },\r\n step: 8,\r\n moveFaster: 4,\r\n };\r\n\r\n const entities = reactive<IEntities>({\r\n draggableMap: new Map(),\r\n droppableMap: new Map(),\r\n selectableAreaMap: new Map(),\r\n constraintsAreaMap: new Map(),\r\n\r\n initiatingDraggable: undefined,\r\n selectingArea: undefined,\r\n\r\n draggingMap: new Map(),\r\n selectedSet: new Set(),\r\n\r\n modifiersSelectableAreaSet: computed(() => {\r\n const selectableSet = filterByModifiers(\r\n entities.selectableAreaMap,\r\n entities.visibleSelectableAreaSet,\r\n keyboard.keys.pressedKeys\r\n );\r\n return selectableSet;\r\n }),\r\n modifiersDraggableSet: computed(() => {\r\n const draggableSet = filterByModifiers(\r\n entities.draggableMap,\r\n entities.visibleDraggableSet,\r\n keyboard.keys.pressedKeys,\r\n (node) => isEffectivelyDisabledDraggable(node, { entities })\r\n );\r\n return draggableSet;\r\n }),\r\n\r\n visibleDraggableSet: new Set(),\r\n visibleDroppableSet: new Set(),\r\n visibleSelectableAreaSet: new Set(),\r\n });\r\n\r\n const scrollPosition = reactive<ICoordinates>({\r\n x: window.scrollX,\r\n y: window.scrollY,\r\n });\r\n\r\n const delay = reactive<IDelay>({\r\n progress: 0,\r\n startTime: 0,\r\n });\r\n\r\n const distanceProgress = computed(() => {\r\n if (!pointer.value || !entities.initiatingDraggable) return 0;\r\n\r\n const entity = entities.draggableMap.get(entities.initiatingDraggable);\r\n const distanceThreshold = entity?.activation?.distance;\r\n\r\n if (!distanceThreshold) return 1;\r\n\r\n return calculateDistanceProgress(pointer.value, distanceThreshold);\r\n });\r\n\r\n const draggableObserver = createIntersectionObserver(\r\n entities.visibleDraggableSet\r\n );\r\n const droppableObserver = createIntersectionObserver(\r\n entities.visibleDroppableSet\r\n );\r\n const selectableAreaObserver = createIntersectionObserver(\r\n entities.visibleSelectableAreaSet\r\n );\r\n\r\n const { overlaySize, overlaySizeObserver } = useSizeObserver(overlayRef);\r\n\r\n const overlayRender = ref<Component>();\r\n\r\n const hovered = reactive<IHovered>({\r\n draggable: new Map(),\r\n droppable: new Map(),\r\n });\r\n\r\n const collision = {\r\n throttle: shallowRef(0),\r\n };\r\n\r\n const overlayStyle = computed(() => {\r\n scrollPosition.y;\r\n scrollPosition.x;\r\n\r\n const draggable = entities.initiatingDraggable;\r\n\r\n return calculateConstrainedPosition(\r\n pointer.value,\r\n overlayRef.value,\r\n draggable || null,\r\n entities.constraintsAreaMap,\r\n overlaySize.value\r\n );\r\n });\r\n\r\n return {\r\n state,\r\n pointer,\r\n entities,\r\n keyboard,\r\n scrollPosition,\r\n delay,\r\n distanceProgress,\r\n hovered,\r\n collision,\r\n overlay: {\r\n size: overlaySize,\r\n style: overlayStyle,\r\n render: overlayRender,\r\n ref: overlayRef,\r\n },\r\n lib: {\r\n draggableObserver,\r\n droppableObserver,\r\n selectableAreaObserver,\r\n overlaySizeObserver,\r\n },\r\n };\r\n}\r\n","import type { IDnDProviderInternal } from '../types/provider';\n\n/**\n * Resets DnD session state after pointer up or cancel\n */\nexport const resetDnDSession = (provider: IDnDProviderInternal): void => {\n provider.pointer.value = undefined;\n provider.state.value = undefined;\n provider.entities.selectingArea = undefined;\n provider.entities.initiatingDraggable = undefined;\n provider.delay.progress = 0;\n provider.delay.startTime = 0;\n provider.entities.draggingMap.clear();\n provider.hovered.draggable.clear();\n provider.hovered.droppable.clear();\n};\n","/**\r\n * Creates drag payload from initiating draggable\r\n */\r\n\r\nimport type { IDragPayload, TDraggablePayload } from '../../external/types';\r\nimport type { IDnDProviderInternal } from '../types/provider';\r\n\r\n/**\r\n * Resolves payload from initiating draggable.\r\n * Calls entity.payload() and returns { index, items, dropData }.\r\n */\r\nexport const createDragPayload = (\r\n provider: IDnDProviderInternal\r\n): IDragPayload | undefined => {\r\n const initiating = provider.entities.initiatingDraggable;\r\n if (!initiating) return undefined;\r\n\r\n const entity = provider.entities.draggableMap.get(initiating);\r\n const payloadFn = entity?.payload as TDraggablePayload | undefined;\r\n if (!payloadFn) return undefined;\r\n\r\n const result = payloadFn();\r\n if (!Array.isArray(result) || result.length < 2) return undefined;\r\n\r\n const [index, items, dropData] = result;\r\n return {\r\n index: Number(index),\r\n items: Array.isArray(items) ? items : [],\r\n dropData,\r\n };\r\n};\r\n","/**\n * DnD event triggering utilities\n */\n\nimport { DnDSelectors } from './namespaces';\nimport {\n isEffectivelyDisabledDraggable,\n isEffectivelyDisabledDroppable,\n} from './disabled';\nimport { createDragPayload } from '../logic/payload';\nimport type { IDnDProviderInternal } from '../types/provider';\nimport type { IDragEvent, IHovered } from '../../external/types/provider';\n\nexport type TSelfDragEvent = 'onSelfDragStart' | 'onSelfDragMove' | 'onSelfDragEnd' | 'onSelfDragCancel';\n\n/** First key from Map or undefined */\nexport const getFirstKey = <K>(map: Map<K, unknown>): K | undefined =>\n map.keys().next().value;\n\n/** Closest draggable from event target */\nexport const getClosestDraggableFromEvent = (event: PointerEvent): HTMLElement | null =>\n (event.target as HTMLElement).closest(DnDSelectors.DRAGGABLE) as HTMLElement | null;\n\nconst getDragEvent = (provider: IDnDProviderInternal): IDragEvent => ({\n payload: createDragPayload(provider),\n provider,\n});\n\n/** Triggers onSelf* for element from event if it's in draggingMap */\nexport const triggerSelfDragFromEvent = (\n provider: IDnDProviderInternal,\n event: PointerEvent,\n eventName: TSelfDragEvent\n): void => {\n const el = getClosestDraggableFromEvent(event);\n if (!el || !provider.entities.draggingMap.has(el)) return;\n const dragEvent = getDragEvent(provider);\n provider.entities.draggingMap.get(el)?.events?.[eventName]?.(dragEvent);\n};\n\n/** Triggers onSelf* only for the initiating element (event.target.closest), skip if disabled */\nexport const triggerSelfDragForElement = (\n provider: IDnDProviderInternal,\n element: HTMLElement | undefined,\n eventName: TSelfDragEvent\n): void => {\n if (!element || isEffectivelyDisabledDraggable(element, provider)) return;\n const dragEvent = getDragEvent(provider);\n provider.entities.draggableMap.get(element)?.events?.[eventName]?.(dragEvent);\n};\n\n/** Triggers onDrag* for ALL non-disabled draggable elements */\nexport const triggerDragForAll = (\n provider: IDnDProviderInternal,\n eventName: 'onDragStart' | 'onDragMove' | 'onDragEnd' | 'onDragCancel'\n): void => {\n const dragEvent = getDragEvent(provider);\n provider.entities.draggableMap.forEach((entity, node) => {\n if (isEffectivelyDisabledDraggable(node, provider)) return;\n entity.events?.[eventName]?.(dragEvent);\n });\n};\n\n/** Triggers zone onEnter/onLeave when zone changes, skip disabled zones */\nexport const triggerZoneEnterLeave = (\n provider: IDnDProviderInternal,\n prevZone: HTMLElement | undefined,\n newZone: HTMLElement | undefined\n): void => {\n if (prevZone !== newZone) {\n const dragEvent = getDragEvent(provider);\n if (prevZone && !isEffectivelyDisabledDroppable(prevZone, provider))\n provider.entities.droppableMap.get(prevZone)?.events?.onLeave?.(dragEvent);\n if (newZone && !isEffectivelyDisabledDroppable(newZone, provider))\n provider.entities.droppableMap.get(newZone)?.events?.onEnter?.(dragEvent);\n }\n};\n\n/** Triggers onHover/onLeave when hovered draggable changes, skip disabled */\nexport const triggerDraggableHoverChange = (\n provider: IDnDProviderInternal,\n prevEl: HTMLElement | undefined,\n newEl: HTMLElement | undefined\n): void => {\n if (prevEl !== newEl) {\n const dragEvent = getDragEvent(provider);\n if (prevEl && !isEffectivelyDisabledDraggable(prevEl, provider))\n provider.entities.draggableMap.get(prevEl)?.events?.onLeave?.(dragEvent);\n if (newEl && !isEffectivelyDisabledDraggable(newEl, provider))\n provider.entities.draggableMap.get(newEl)?.events?.onHover?.(dragEvent);\n }\n};\n\n/** Triggers zone onLeave on drag end, skip disabled */\nexport const triggerZoneLeave = (provider: IDnDProviderInternal, hovered: IHovered): void => {\n const zone = getFirstKey(hovered.droppable);\n if (zone && !isEffectivelyDisabledDroppable(zone, provider)) {\n const dragEvent = getDragEvent(provider);\n provider.entities.droppableMap.get(zone)?.events?.onLeave?.(dragEvent);\n }\n};\n\n/** Triggers zone onLeave on drop failure, skip disabled */\nexport const triggerDropCancelEvents = (\n provider: IDnDProviderInternal,\n hovered: IHovered\n): void => {\n const zone = getFirstKey(hovered.droppable);\n if (zone && !isEffectivelyDisabledDroppable(zone, provider)) {\n const dragEvent = getDragEvent(provider);\n provider.entities.droppableMap.get(zone)?.events?.onLeave?.(dragEvent);\n }\n};\n","/**\n * Checks compatibility between two group sets.\n * Used for selection area, zones, droppable, etc.\n *\n * - Empty array = global (compatible with any)\n * - Otherwise requires at least one shared group\n */\nexport const areGroupsCompatible = (\n groupsA: string[],\n groupsB: string[]\n): boolean => {\n if (!groupsA.length || !groupsB.length) return true;\n return groupsA.some((g) => groupsB.includes(g));\n};\n","import type { CSSProperties } from 'vue';\nimport type { ICoordinates } from '../../external/types';\nimport { DnDSelectors } from './namespaces';\nimport { areGroupsCompatible } from './groups';\nimport { checkIntersection } from './dom';\nimport { isEffectivelyDisabledDraggable } from './disabled';\nimport type { IDnDProviderInternal } from '../types/provider';\n\n/**\n * Converts viewport coordinates to container-relative coordinates.\n * scroll - page scroll position (window.scrollX, window.scrollY)\n */\nexport const getRelativeCoordinates = (\n event: ICoordinates,\n container: HTMLElement | null,\n scroll: { x: number; y: number } = { x: 0, y: 0 }\n) => {\n if (!container) {\n return event;\n }\n\n const rect = container.getBoundingClientRect();\n const scrollLeft = container.scrollLeft || scroll.x;\n const scrollTop = container.scrollTop || scroll.y;\n\n const x = event.x - rect.left + scrollLeft + scroll.x;\n const y = event.y - rect.top + scrollTop + scroll.y;\n\n return { x, y };\n};\n\n/**\n * Returns CSS properties for bounded selection box within container\n */\nexport const getBoundedSelectionArea = (\n start: ICoordinates,\n current: ICoordinates,\n container: HTMLElement | null\n): CSSProperties => {\n if (!container) return {};\n\n const containerRect = container.getBoundingClientRect();\n \n const left = Math.max(containerRect.left, Math.min(start.x, current.x));\n const top = Math.max(containerRect.top, Math.min(start.y, current.y));\n const right = Math.min(containerRect.right, Math.max(start.x, current.x));\n const bottom = Math.min(containerRect.bottom, Math.max(start.y, current.y));\n\n const width = Math.max(0, right - left);\n const height = Math.max(0, bottom - top);\n\n return {\n left: `${left}px`,\n top: `${top}px`,\n width: `${width}px`,\n height: `${height}px`,\n position: 'fixed', \n pointerEvents: 'none',\n border: '1px solid #3b82f6',\n backgroundColor: '#3b82f61a'\n };\n};\n\n/**\n * Checks if the event target is within the correct selectable area\n */\nexport const checkIsSelectableArea = (\n event: PointerEvent,\n container: HTMLElement\n): boolean => {\n const target = event.target as HTMLElement;\n\n const closestSelectableArea = target.closest(\n DnDSelectors.SELECT_AREA\n ) as HTMLElement | null;\n\n if (closestSelectableArea && closestSelectableArea !== container)\n return false;\n\n return true;\n};\n\n/**\n * Updates selectedSet based on selection box (pointer start → current)\n */\nexport const updateSelectionByBox = (provider: IDnDProviderInternal): void => {\n if (!provider.pointer.value || !provider.entities.selectingArea) return;\n const { selectingArea } = provider.entities;\n const selectionBoxRect = getSelectionBoxRect(\n provider.pointer.value.start,\n provider.pointer.value.current\n );\n const selectionAreaGroups = provider.entities.selectableAreaMap.get(selectingArea)?.groups ?? [];\n\n provider.entities.visibleDraggableSet.forEach((el) => {\n if (!selectingArea.contains(el)) return;\n if (isEffectivelyDisabledDraggable(el, provider)) {\n provider.entities.selectedSet.delete(el);\n return;\n }\n const draggableEntity = provider.entities.draggableMap.get(el);\n const draggableGroups = draggableEntity?.groups ?? [];\n if (!areGroupsCompatible(selectionAreaGroups, draggableGroups)) {\n provider.entities.selectedSet.delete(el);\n return;\n }\n checkIntersection(selectionBoxRect, el.getBoundingClientRect())\n ? provider.entities.selectedSet.add(el)\n : provider.entities.selectedSet.delete(el);\n });\n};\n\n/**\n * Creates a DOMRect for the selection box from pointer coordinates\n */\nexport const getSelectionBoxRect = (\n start: ICoordinates,\n current: ICoordinates\n): DOMRect => {\n const left = Math.min(start.x, current.x);\n const top = Math.min(start.y, current.y);\n const right = Math.max(start.x, current.x);\n const bottom = Math.max(start.y, current.y);\n \n const width = right - left;\n const height = bottom - top;\n \n return new DOMRect(left, top, width, height);\n};\n","/**\n * Placement — closest edge/area (top, right, bottom, left, center) for drop insertion\n */\n\nimport type { IDnDProviderExternal, IPlacementMargins } from '../../external';\n\nexport interface IPlacement {\n top: boolean;\n right: boolean;\n bottom: boolean;\n left: boolean;\n center?: boolean;\n}\n\nexport interface IRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * Creates pointer box from coordinates (e.g. cursor as 5×5)\n */\nexport const createPointerBox = (\n x: number,\n y: number,\n size: number = 5\n): IRect => {\n const half = size / 2;\n return {\n left: x - half,\n top: y - half,\n width: size,\n height: size,\n };\n};\n\n/**\n * Creates pointer box from provider (cursor as 5×5)\n */\nexport const getPointerBoxFromProvider = (provider: IDnDProviderExternal): IRect => {\n const p = provider.pointer.value?.current;\n const x = p?.x ?? 0;\n const y = p?.y ?? 0;\n return createPointerBox(x, y, 5);\n};\n\n/**\n * Returns which edge of element is closest to pointer box center.\n * With placementMargins: if pointer in center zone, returns center: true.\n * Else exactly one of top/right/bottom/left is true.\n */\nexport const getClosestPlacement = (\n pointerBox: IRect,\n elementRect: DOMRect,\n margins?: IPlacementMargins\n): IPlacement => {\n const cx = pointerBox.left + pointerBox.width / 2;\n const cy = pointerBox.top + pointerBox.height / 2;\n\n if (margins) {\n const t = margins.top ?? 0;\n const r = margins.right ?? 0;\n const b = margins.bottom ?? 0;\n const l = margins.left ?? 0;\n const innerLeft = elementRect.left + l;\n const innerRight = elementRect.right - r;\n const innerTop = elementRect.top + t;\n const innerBottom = elementRect.bottom - b;\n if (\n innerLeft < innerRight &&\n innerTop < innerBottom &&\n cx >= innerLeft &&\n cx <= innerRight &&\n cy >= innerTop &&\n cy <= innerBottom\n ) {\n return { top: false, right: false, bottom: false, left: false, center: true };\n }\n }\n\n const dTop = cy - elementRect.top;\n const dBottom = elementRect.bottom - cy;\n const dLeft = cx - elementRect.left;\n const dRight = elementRect.right - cx;\n\n const min = Math.min(dTop, dBottom, dLeft, dRight);\n\n return {\n top: dTop === min,\n bottom: dBottom === min,\n left: dLeft === min,\n right: dRight === min,\n };\n};\n","/**\n * Hover detection — applies collision result and triggers enter/leave events\n */\n\nimport {\n getClosestPlacement,\n getPointerBoxFromProvider,\n} from '../utils/placement';\nimport {\n getFirstKey,\n triggerZoneEnterLeave,\n triggerDraggableHoverChange,\n} from '../utils/events';\nimport { isDescendant } from '../utils/dom';\nimport type { IDnDProviderInternal } from '../types/provider';\nimport type { IHovered } from '../../external/types/provider';\n\n/** First draggable inside zone (nested under cursor) or undefined */\nconst findNestedDraggable = (\n elements: HTMLElement[],\n zone: HTMLElement\n): HTMLElement | undefined =>\n elements.find((el) => el !== zone && isDescendant(zone, el));\n\n/** Applies collision result to hovered and triggers zone/draggable events */\nexport const applyCollisionResultToHovered = (\n provider: IDnDProviderInternal,\n hovered: IHovered,\n result: { elements: HTMLElement[]; zones: HTMLElement[] }\n): void => {\n const prevZone = getFirstKey(hovered.droppable);\n const prevElement = getFirstKey(hovered.draggable);\n\n hovered.draggable.clear();\n hovered.droppable.clear();\n\n const pointerBox = getPointerBoxFromProvider(provider);\n const newZone = result.zones[0];\n const newElement = result.elements[0];\n\n const isDualRole =\n newZone &&\n newElement &&\n newZone === newElement &&\n provider.entities.droppableMap.has(newZone);\n\n if (isDualRole && newZone) {\n const rect = newZone.getBoundingClientRect();\n const margins =\n provider.entities.draggableMap.get(newZone)?.placementMargins;\n const placement = getClosestPlacement(pointerBox, rect, margins);\n\n if (placement.center) {\n hovered.droppable.set(newZone, placement);\n const nested = findNestedDraggable(result.elements, newZone);\n if (nested) {\n const nestedRect = nested.getBoundingClientRect();\n hovered.draggable.set(\n nested,\n getClosestPlacement(pointerBox, nestedRect, undefined)\n );\n }\n } else {\n hovered.draggable.set(newElement, placement);\n hovered.droppable.set(newZone, placement);\n }\n } else {\n if (newZone) {\n const rect = newZone.getBoundingClientRect();\n hovered.droppable.set(newZone, getClosestPlacement(pointerBox, rect));\n }\n if (newElement) {\n const rect = newElement.getBoundingClientRect();\n const margins =\n provider.entities.draggableMap.get(newElement)?.placementMargins;\n hovered.draggable.set(\n newElement,\n getClosestPlacement(pointerBox, rect, margins)\n );\n }\n }\n\n const finalZone = getFirstKey(hovered.droppable);\n const finalElement = getFirstKey(hovered.draggable);\n\n triggerZoneEnterLeave(provider, prevZone, finalZone);\n triggerDraggableHoverChange(provider, prevElement, finalElement);\n};\n","/**\n * AABB geometry utilities for collision detection\n */\n\nexport interface IBoundingBox {\n x: number;\n y: number;\n width: number;\n height: number;\n top: number;\n left: number;\n right: number;\n bottom: number;\n}\n\nexport interface IPoint {\n x: number;\n y: number;\n}\n\nexport const checkCollision = (boxA: IBoundingBox, boxB: IBoundingBox): boolean =>\n boxA.x < boxB.x + boxB.width &&\n boxA.x + boxA.width > boxB.x &&\n boxA.y < boxB.y + boxB.height &&\n boxA.y + boxA.height > boxB.y;\n\nexport const getBoundingBox = (element: HTMLElement | null): IBoundingBox => {\n if (!element)\n return { x: 0, y: 0, width: 0, height: 0, top: 0, left: 0, right: 0, bottom: 0 };\n const rect = element.getBoundingClientRect();\n return {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n };\n};\n\nexport const getCenter = (box: IBoundingBox): IPoint => ({\n x: box.x + box.width / 2,\n y: box.y + box.height / 2,\n});\n\nexport const getDistance = (pointA: IPoint, pointB: IPoint): number =>\n Math.hypot(pointB.x - pointA.x, pointB.y - pointA.y);\n\nexport const getOverlapPercent = (boxA: IBoundingBox, boxB: IBoundingBox): number => {\n const xOverlap = Math.max(\n 0,\n Math.min(boxA.x + boxA.width, boxB.x + boxB.width) - Math.max(boxA.x, boxB.x)\n );\n const yOverlap = Math.max(\n 0,\n Math.min(boxA.y + boxA.height, boxB.y + boxB.height) - Math.max(boxA.y, boxB.y)\n );\n const overlapArea = xOverlap * yOverlap;\n const boxAArea = boxA.width * boxA.height;\n const boxBArea = boxB.width * boxB.height;\n if (boxAArea === 0 || boxBArea === 0) return 0;\n return ((overlapArea / boxAArea) * 100 + (overlapArea / boxBArea) * 100) / 2;\n};\n\nexport const containsPoint = (box: IBoundingBox, x: number, y: number): boolean =>\n x >= box.x && x <= box.x + box.width && y >= box.y && y <= box.y + box.height;\n","import {\n getBoundingBox,\n getCenter,\n getDistance,\n getOverlapPercent,\n containsPoint,\n type IBoundingBox,\n} from '../utils/geometry';\nimport { isDescendant } from '../utils/dom';\nimport type { IDnDProviderInternal } from '../types/provider';\n\nexport type CollisionDetectionFn = (\n provider: IDnDProviderInternal\n) => { elements: HTMLElement[]; zones: HTMLElement[] };\n\nexport type TContainerFn = (provider: IDnDProviderInternal) => HTMLElement | null;\nexport type TContainerBoxFn = (provider: IDnDProviderInternal) => IBoundingBox;\nexport type TCandidatesFn = (provider: IDnDProviderInternal) => Iterable<HTMLElement>;\nexport type TFilterFn = (node: HTMLElement, provider: IDnDProviderInternal) => boolean;\nexport type TCollisionContext = { containerBox: IBoundingBox; pointer: { x: number; y: number } };\nexport type TCollisionCheckFn = (nodeBox: IBoundingBox, ctx: TCollisionContext) => boolean;\nexport type TSortCompareFn = (\n a: { node: HTMLElement; box: IBoundingBox; meta: ICollisionMeta },\n b: { node: HTMLElement; box: IBoundingBox; meta: ICollisionMeta },\n ctx: { containerBox: IBoundingBox; pointer: { x: number; y: number } }\n) => number;\n\nexport interface ICollisionMeta {\n isPointerInElement: boolean;\n overlapPercent: number;\n depth: number;\n centerDistance: number;\n}\n\ninterface ISensorConfig {\n container: TContainerFn;\n containerBox?: TContainerBoxFn;\n elements: TCandidatesFn;\n zones: TCandidatesFn;\n filterElements: TFilterFn;\n filterZones: TFilterFn;\n collision: TCollisionCheckFn;\n sortElements: TSortCompareFn;\n sortZones: TSortCompareFn;\n}\n\nconst defaultFilter = () => true;\nconst defaultSort = () => 0;\n\nconst createBuilder = (): ISensorBuilder => {\n const config: Partial<ISensorConfig> = {\n filterElements: defaultFilter,\n filterZones: defaultFilter,\n sortElements: defaultSort,\n sortZones: defaultSort,\n };\n\n const run = (\n provider: IDnDProviderInternal,\n containerBox: IBoundingBox,\n pointer: { x: number; y: number },\n candidates: Iterable<HTMLElement>,\n filter: TFilterFn,\n sortFn: TSortCompareFn,\n collisionCheck: TCollisionCheckFn\n ): HTMLElement[] => {\n const nodeSet = new Set(candidates);\n const ctx = { containerBox, pointer };\n\n const entries = [...candidates]\n .filter((node) => filter(node, provider))\n .map((node) => {\n const nodeBox = getBoundingBox(node);\n if (!collisionCheck(nodeBox, ctx)) return null;\n\n let depth = 0;\n for (const parent of nodeSet) {\n if (parent !== node && isDescendant(parent, node)) depth++;\n }\n\n return {\n node,\n box: nodeBox,\n meta: {\n isPointerInElement: containsPoint(nodeBox, pointer.x, pointer.y),\n overlapPercent: getOverlapPercent(nodeBox, containerBox),\n depth,\n centerDistance: getDistance(getCenter(containerBox), getCenter(nodeBox)),\n },\n };\n })\n .filter((e): e is NonNullable<typeof e> => e !== null);\n\n entries.sort((a, b) => sortFn(a, b, ctx));\n\n return entries.map((e) => e.node);\n };\n\n const builder: ISensorBuilder = {\n container(fn) {\n config.container = fn;\n return builder;\n },\n\n containerBox(fn) {\n config.containerBox = fn;\n return builder;\n },\n\n elements(fn) {\n config.elements = fn;\n return builder;\n },\n\n zones(fn) {\n config.zones = fn;\n return builder;\n },\n\n filterElements(fn) {\n config.filterElements = fn;\n return builder;\n },\n\n filterZones(fn) {\n config.filterZones = fn;\n return builder;\n },\n\n collision(fn) {\n config.collision = fn;\n return builder;\n },\n\n sortElements(fn) {\n config.sortElements = fn;\n return builder;\n },\n\n sortZones(fn) {\n config.sortZones = fn;\n return builder;\n },\n\n build(): CollisionDetectionFn {\n const cfg = config as ISensorConfig;\n if (!cfg.container || !cfg.elements || !cfg.zones || !cfg.collision) {\n throw new Error('sensor: container, elements, zones, collision are required');\n }\n\n return (provider: IDnDProviderInternal) => {\n const containerEl = cfg.container(provider);\n if (!containerEl) return { elements: [], zones: [] };\n\n const containerBox = cfg.containerBox\n ? cfg.containerBox(provider)\n : getBoundingBox(containerEl);\n const pointer = provider.pointer.value?.current ?? { x: 0, y: 0 };\n\n return {\n elements: run(\n provider,\n containerBox,\n pointer,\n cfg.elements(provider),\n cfg.filterElements,\n cfg.sortElements,\n cfg.collision\n ),\n zones: run(\n provider,\n containerBox,\n pointer,\n cfg.zones(provider),\n cfg.filterZones,\n cfg.sortZones,\n cfg.collision\n ),\n };\n };\n },\n };\n\n return builder;\n};\n\nexport interface ISensorBuilder {\n container(fn: TContainerFn): ISensorBuilder;\n containerBox(fn: TContainerBoxFn): ISensorBuilder;\n elements(fn: TCandidatesFn): ISensorBuilder;\n zones(fn: TCandidatesFn): ISensorBuilder;\n filterElements(fn: TFilterFn): ISensorBuilder;\n filterZones(fn: TFilterFn): ISensorBuilder;\n collision(fn: TCollisionCheckFn): ISensorBuilder;\n sortElements(fn: TSortCompareFn): ISensorBuilder;\n sortZones(fn: TSortCompareFn): ISensorBuilder;\n build(): CollisionDetectionFn;\n}\n\nexport const createSensor = () => createBuilder();\n","/**\n * Reusable sensor steps for the chainable builder\n */\n\nimport {\n checkCollision,\n containsPoint,\n type IBoundingBox,\n} from '../utils/geometry';\nimport { isDescendant } from '../utils/dom';\nimport {\n isEffectivelyDisabledDraggable,\n isEffectivelyDisabledDroppable,\n} from '../utils/disabled';\nimport type { IDnDProviderInternal } from '../types/provider';\nimport type {\n TSortCompareFn,\n TFilterFn,\n TCollisionCheckFn,\n TContainerBoxFn,\n} from './sensor';\n\n/** Container from overlay ref */\nexport const overlayContainer: (\n p: IDnDProviderInternal\n) => HTMLElement | null = (provider) => provider.overlay.ref?.value ?? null;\n\n/** Box from overlay style (x,y) + size — overlay uses fixed+transform, getBoundingClientRect is wrong */\nexport const overlayBoxFromStyle: TContainerBoxFn = (\n provider\n): IBoundingBox => {\n const style = provider.overlay.style?.value ?? { x: 0, y: 0 };\n const size = provider.overlay.size?.value ?? null;\n const { x, y } = style;\n const w = size?.width ?? 0;\n const h = size?.height ?? 0;\n return {\n x,\n y,\n width: w,\n height: h,\n top: y,\n left: x,\n right: x + w,\n bottom: y + h,\n };\n};\n\n/** Visible draggables */\nexport const visibleElements = (p: IDnDProviderInternal) =>\n p.entities.visibleDraggableSet;\n\n/** Visible droppables */\nexport const visibleZones = (p: IDnDProviderInternal) =>\n p.entities.visibleDroppableSet;\n\n/** Exclude nodes being dragged */\nexport const filterNotDragging: TFilterFn = (node, provider) =>\n !provider.entities.draggingMap.has(node);\n\n/** Exclude nodes that are descendants of any dragged element (nesting into self) */\nexport const filterNotDescendantOfDragged: TFilterFn = (node, provider) =>\n ![...provider.entities.draggingMap.keys()].some((dragged) =>\n isDescendant(dragged, node)\n );\n\n/** Exclude disabled draggables and zones (including those inside disabled parents) */\nexport const filterNotDisabled: TFilterFn = (node, provider) => {\n if (provider.entities.draggableMap.has(node))\n return !isEffectivelyDisabledDraggable(node, provider);\n if (provider.entities.droppableMap.has(node))\n return !isEffectivelyDisabledDroppable(node, provider);\n return true;\n};\n\n/** Exclude: not dragging, not descendant of dragged, not disabled */\nexport const filterValidCollisionTarget: TFilterFn = (node, provider) =>\n filterNotDragging(node, provider) &&\n filterNotDescendantOfDragged(node, provider) &&\n filterNotDisabled(node, provider);\n\n/** AABB overlap check (element vs container) — legacy */\nexport const aabbCollision: TCollisionCheckFn = (nodeBox, ctx) =>\n checkCollision(nodeBox, ctx.containerBox);\n\n/** Pointer-in-element: cursor must be inside element (AABB of element) */\nexport const pointerInElementCollision: TCollisionCheckFn = (nodeBox, ctx) =>\n containsPoint(nodeBox, ctx.pointer.x, ctx.pointer.y);\n\n/** Sort: deepest first (topmost visible element under cursor) */\nexport const sortByDepth: TSortCompareFn = (a, b) =>\n b.meta.depth - a.meta.depth;\n\n/** Sort: pointer-in-element + depth when pointer INSIDE container; overlap % + centerDistance when OUTSIDE */\nexport const sortByOverlapAndPointer: TSortCompareFn = (a, b, ctx) => {\n const pointerInContainer =\n ctx.pointer.x >= ctx.containerBox.x &&\n ctx.pointer.x <= ctx.containerBox.x + ctx.containerBox.width &&\n ctx.pointer.y >= ctx.containerBox.y &&\n ctx.pointer.y <= ctx.containerBox.y + ctx.containerBox.height;\n\n // When pointer inside container: prioritize element under cursor (isPointerInElement + depth)\n // When pointer outside: use overlap % and center distance\n if (pointerInContainer) {\n if (a.meta.isPointerInElement && b.meta.isPointerInElement)\n return b.meta.depth - a.meta.depth;\n if (a.meta.isPointerInElement !== b.meta.isPointerInElement)\n return a.meta.isPointerInElement ? -1 : 1;\n }\n\n if (Math.abs(a.meta.overlapPercent - b.meta.overlapPercent) <= 1)\n return a.meta.centerDistance - b.meta.centerDistance;\n\n return b.meta.overlapPercent - a.meta.overlapPercent;\n};\n","/**\n * Default collision: same logic as vue-dnd-box reference\n * - Filter: AABB overlap with container (overlay)\n * - Sort: pointer outside container → isPointerInElement + depth; else overlap % + centerDistance\n * - Returns full sorted list\n */\n\nimport { createSensor } from './sensor';\nimport {\n overlayContainer,\n overlayBoxFromStyle,\n visibleElements,\n visibleZones,\n filterValidCollisionTarget,\n aabbCollision,\n sortByOverlapAndPointer,\n} from './steps';\n\nexport const defaultCollisionDetection = createSensor()\n .container(overlayContainer)\n .containerBox(overlayBoxFromStyle)\n .elements(visibleElements)\n .zones(visibleZones)\n .filterElements(filterValidCollisionTarget)\n .filterZones(filterValidCollisionTarget)\n .collision(aabbCollision)\n .sortElements(sortByOverlapAndPointer)\n .sortZones(sortByOverlapAndPointer)\n .build();\n","import { DnDSelectors } from '../utils/namespaces';\r\nimport { disableInteractions, enableInteractions } from '../utils/dom';\r\nimport {\r\n createPointerState,\r\n calculateCursorOffset,\r\n startDraggingForProvider,\r\n} from '../utils/pointer';\r\nimport {\r\n checkDragHandle,\r\n tryStartDragIfActivationComplete,\r\n createActivationDelayTimer,\r\n} from '../utils/drag-activation';\r\nimport { resetDnDSession } from '../utils/session';\r\nimport { updateSelectionByBox } from '../utils/selection';\r\nimport {\r\n triggerSelfDragFromEvent,\r\n triggerSelfDragForElement,\r\n triggerDragForAll,\r\n triggerZoneLeave,\r\n triggerDropCancelEvents,\r\n} from '../utils/events';\r\nimport { createDragPayload } from './payload';\r\nimport { isEffectivelyDisabledDroppable } from '../utils/disabled';\r\nimport { applyCollisionResultToHovered } from './hover';\r\nimport { defaultCollisionDetection } from '../sensors/defaultCollision';\r\nimport type { IDnDProviderInternal } from '../types/provider';\r\n\r\nfunction runCollisionAndApply(provider: IDnDProviderInternal): void {\r\n const run = provider.collision?.run ?? defaultCollisionDetection;\r\n const result = run(provider);\r\n applyCollisionResultToHovered(provider, provider.hovered, result);\r\n}\r\n\r\nfunction runThrottledCollision(\r\n provider: IDnDProviderInternal,\r\n lastRun: { value: number }\r\n): void {\r\n const throttleMs = provider.collision?.throttle?.value ?? 0;\r\n if (throttleMs <= 0) {\r\n runCollisionAndApply(provider);\r\n return;\r\n }\r\n const now = Date.now();\r\n if (now - lastRun.value >= throttleMs) {\r\n lastRun.value = now;\r\n runCollisionAndApply(provider);\r\n }\r\n}\r\n\r\nexport async function handleDropAndFinish(\r\n provider: IDnDProviderInternal\r\n): Promise<boolean> {\r\n const hoveredZone = provider.hovered.droppable.keys().next().value;\r\n if (!hoveredZone) return true;\r\n\r\n if (isEffectivelyDisabledDroppable(hoveredZone, provider)) return true;\r\n\r\n const zoneEntity = provider.entities.droppableMap.get(hoveredZone);\r\n const dragEvent = {\r\n payload: createDragPayload(provider),\r\n provider,\r\n };\r\n\r\n const result = zoneEntity?.events?.onDrop?.(dragEvent);\r\n\r\n const isPromise =\r\n result != null && typeof (result as Promise<unknown>).then === 'function';\r\n if (isPromise) {\r\n try {\r\n await (result as Promise<unknown>);\r\n return true;\r\n } catch {\r\n const initiating = provider.entities.initiatingDraggable;\r\n triggerSelfDragForElement(provider, initiating, 'onSelfDragCancel');\r\n triggerDragForAll(provider, 'onDragCancel');\r\n triggerDropCancelEvents(provider, provider.hovered);\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport function finishDragSession(provider: IDnDProviderInternal): void {\r\n const initiating = provider.entities.initiatingDraggable;\r\n triggerSelfDragForElement(provider, initiating, 'onSelfDragEnd');\r\n triggerDragForAll(provider, 'onDragEnd');\r\n triggerZoneLeave(provider, provider.hovered);\r\n}\r\n\r\nfunction finishSelectionSession(provider: IDnDProviderInternal): void {\r\n const selectingArea = provider.entities.selectingArea;\r\n if (!selectingArea) return;\r\n\r\n const areaEntity = provider.entities.selectableAreaMap.get(selectingArea);\r\n const selected = [...provider.entities.selectedSet];\r\n areaEntity?.events?.onSelected?.(selected);\r\n}\r\n\r\nexport const createPointerHandlers = (provider: IDnDProviderInternal) => {\r\n const delayTimer = {\r\n current: null as ReturnType<typeof createActivationDelayTimer> | null,\r\n };\r\n const lastCollisionRun = { value: 0 };\r\n\r\n const pointerUp = async () => {\r\n enableInteractions();\r\n\r\n delayTimer.current?.cancel();\r\n delayTimer.current = null;\r\n\r\n const state = provider.state.value;\r\n\r\n if (state === 'dragging') {\r\n const dropOk = await handleDropAndFinish(provider);\r\n if (!dropOk) {\r\n resetDnDSession(provider);\r\n document.removeEventListener('pointerup', pointerUp);\r\n document.removeEventListener('pointermove', pointerMove);\r\n return;\r\n }\r\n finishDragSession(provider);\r\n } else if (state === 'selecting') {\r\n finishSelectionSession(provider);\r\n }\r\n\r\n resetDnDSession(provider);\r\n document.removeEventListener('pointerup', pointerUp);\r\n document.removeEventListener('pointermove', pointerMove);\r\n };\r\n\r\n const pointerMove = (event: PointerEvent) => {\r\n if (!provider.pointer.value) return;\r\n provider.pointer.value.current = { x: event.clientX, y: event.clientY };\r\n\r\n if (tryStartDragIfActivationComplete(provider)) {\r\n triggerSelfDragFromEvent(provider, event, 'onSelfDragStart');\r\n triggerDragForAll(provider, 'onDragStart');\r\n return;\r\n }\r\n\r\n if (provider.state.value === 'dragging') {\r\n runThrottledCollision(provider, lastCollisionRun);\r\n const initiating = provider.entities.initiatingDraggable;\r\n triggerSelfDragForElement(provider, initiating, 'onSelfDragMove');\r\n triggerDragForAll(provider, 'onDragMove');\r\n }\r\n\r\n if (provider.state.value === 'selecting') {\r\n updateSelectionByBox(provider);\r\n }\r\n };\r\n\r\n const pointerDown = (event: PointerEvent) => {\r\n document.addEventListener('pointerup', pointerUp);\r\n document.addEventListener('pointermove', pointerMove);\r\n\r\n const target = event.target as HTMLElement;\r\n const closestSelectionArea = target.closest(\r\n DnDSelectors.SELECT_AREA\r\n ) as HTMLElement;\r\n const closestDraggable = target.closest(\r\n DnDSelectors.DRAGGABLE\r\n ) as HTMLElement;\r\n\r\n if (\r\n provider.entities.modifiersSelectableAreaSet.size > 0 &&\r\n provider.entities.modifiersSelectableAreaSet.has(closestSelectionArea)\r\n ) {\r\n disableInteractions();\r\n provider.pointer.value = createPointerState(event);\r\n provider.state.value = 'selecting';\r\n provider.entities.selectingArea = closestSelectionArea;\r\n return;\r\n }\r\n\r\n if (\r\n provider.entities.modifiersDraggableSet.size > 0 &&\r\n provider.entities.modifiersDraggableSet.has(closestDraggable)\r\n ) {\r\n const entity = provider.entities.draggableMap.get(closestDraggable);\r\n if (!checkDragHandle(target, closestDraggable, entity?.dragHandle))\r\n return;\r\n\r\n disableInteractions();\r\n provider.entities.initiatingDraggable = closestDraggable;\r\n const offset = calculateCursorOffset(event, closestDraggable);\r\n provider.pointer.value = createPointerState(event, offset.x, offset.y);\r\n\r\n const hasActivation =\r\n entity?.activation?.distance || entity?.activation?.delay;\r\n\r\n if (hasActivation) {\r\n provider.state.value = 'activating';\r\n if (entity?.activation?.delay) {\r\n provider.delay.startTime = Date.now();\r\n delayTimer.current = createActivationDelayTimer(provider, () => {\r\n startDraggingForProvider(provider);\r\n triggerSelfDragFromEvent(provider, event, 'onSelfDragStart');\r\n triggerDragForAll(provider, 'onDragStart');\r\n });\r\n }\r\n } else {\r\n startDraggingForProvider(provider);\r\n triggerSelfDragFromEvent(provider, event, 'onSelfDragStart');\r\n triggerDragForAll(provider, 'onDragStart');\r\n }\r\n }\r\n };\r\n\r\n const cleanup = () => {\r\n delayTimer.current?.cancel();\r\n document.removeEventListener('pointerup', pointerUp);\r\n document.removeEventListener('pointermove', pointerMove);\r\n provider.lib.draggableObserver.disconnect();\r\n provider.lib.droppableObserver.disconnect();\r\n provider.lib.selectableAreaObserver.disconnect();\r\n provider.lib.overlaySizeObserver.disconnect();\r\n };\r\n\r\n return { pointerDown, pointerUp, pointerMove, cleanup };\r\n};\r\n","import { DnDSelectors } from '../utils/namespaces';\nimport { disableInteractions, enableInteractions } from '../utils/dom';\nimport {\n createPointerState,\n calculateCursorOffset,\n startDraggingForProvider,\n} from '../utils/pointer';\nimport { checkDragHandle } from '../utils/drag-activation';\nimport { resetDnDSession } from '../utils/session';\nimport {\n triggerSelfDragForElement,\n triggerDragForAll,\n triggerDropCancelEvents,\n} from '../utils/events';\nimport { handleDropAndFinish, finishDragSession } from './pointer';\nimport { applyCollisionResultToHovered } from './hover';\nimport { defaultCollisionDetection } from '../sensors/defaultCollision';\nimport type { IDnDProviderInternal } from '../types/provider';\n\nconst MOVE_MAP: Record<string, { dx: number; dy: number }> = {\n ArrowUp: { dx: 0, dy: -1 },\n ArrowDown: { dx: 0, dy: 1 },\n ArrowLeft: { dx: -1, dy: 0 },\n ArrowRight: { dx: 1, dy: 0 },\n KeyW: { dx: 0, dy: -1 },\n KeyA: { dx: -1, dy: 0 },\n KeyS: { dx: 0, dy: 1 },\n KeyD: { dx: 1, dy: 0 },\n};\n\nconst handleKeyDown = (provider: IDnDProviderInternal) => (event: KeyboardEvent) => {\n const { keys } = provider.keyboard;\n\n keys.pressedKeys.value.add(event.code);\n\n const state = provider.state.value;\n\n if (state === 'dragging') {\n if (keys.forCancel.includes(event.code)) {\n event.preventDefault();\n enableInteractions();\n triggerSelfDragForElement(provider, provider.entities.initiatingDraggable, 'onSelfDragCancel');\n triggerDragForAll(provider, 'onDragCancel');\n triggerDropCancelEvents(provider, provider.hovered);\n resetDnDSession(provider);\n return;\n }\n if (keys.forDrop.includes(event.code)) {\n event.preventDefault();\n (async () => {\n const ok = await handleDropAndFinish(provider);\n if (ok) finishDragSession(provider);\n enableInteractions();\n resetDnDSession(provider);\n })();\n return;\n }\n const move = MOVE_MAP[event.code];\n if (move && keys.forMove.includes(event.code) && provider.pointer.value) {\n event.preventDefault();\n const faster = keys.forMoveFaster.some((k) => keys.pressedKeys.value.has(k));\n const dist = provider.keyboard.step * (faster ? provider.keyboard.moveFaster : 1);\n provider.pointer.value.current = {\n x: provider.pointer.value.current.x + move.dx * dist,\n y: provider.pointer.value.current.y + move.dy * dist,\n };\n\n const run = provider.collision?.run ?? defaultCollisionDetection;\n const result = run(provider);\n applyCollisionResultToHovered(provider, provider.hovered, result);\n triggerSelfDragForElement(provider, provider.entities.initiatingDraggable, 'onSelfDragMove');\n triggerDragForAll(provider, 'onDragMove');\n return;\n }\n return;\n }\n\n if (keys.forDrag.includes(event.code)) {\n const active = document.activeElement as HTMLElement | null;\n if (!active) return;\n\n const closestDraggable = active.closest(DnDSelectors.DRAGGABLE) as HTMLElement | null;\n if (!closestDraggable) return;\n\n if (\n provider.entities.modifiersDraggableSet.size === 0 ||\n !provider.entities.modifiersDraggableSet.has(closestDraggable)\n )\n return;\n\n const entity = provider.entities.draggableMap.get(closestDraggable);\n if (!checkDragHandle(active, closestDraggable, entity?.dragHandle, true)) return;\n\n event.preventDefault();\n disableInteractions();\n\n const rect = closestDraggable.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n const syntheticEvent = {\n clientX: centerX,\n clientY: centerY,\n target: closestDraggable,\n } as unknown as PointerEvent;\n\n provider.entities.initiatingDraggable = closestDraggable;\n const offset = calculateCursorOffset(syntheticEvent, closestDraggable);\n provider.pointer.value = createPointerState(syntheticEvent, offset.x, offset.y);\n\n startDraggingForProvider(provider);\n\n const run = provider.collision?.run ?? defaultCollisionDetection;\n const result = run(provider);\n applyCollisionResultToHovered(provider, provider.hovered, result);\n\n triggerSelfDragForElement(provider, closestDraggable, 'onSelfDragStart');\n triggerDragForAll(provider, 'onDragStart');\n }\n};\n\nconst handleKeyUp = (provider: IDnDProviderInternal) => (event: KeyboardEvent) => {\n provider.keyboard.keys.pressedKeys.value.delete(event.code);\n};\n\nconst handleClear = (provider: IDnDProviderInternal) => () => {\n provider.keyboard.keys.pressedKeys.value.clear();\n};\n\nexport const handleKeyboardEvents = {\n keyDown: handleKeyDown,\n keyUp: handleKeyUp,\n clear: handleClear,\n};\n","import type { IDnDProviderInternal } from '../types/provider';\r\n\r\nexport const handleScrollEvent = (provider: IDnDProviderInternal) => () => {\r\n if (provider.state.value) {\r\n provider.scrollPosition.x = window.scrollX;\r\n provider.scrollPosition.y = window.scrollY;\r\n }\r\n};\r\n","import { onBeforeUnmount, onMounted } from 'vue';\nimport { handleKeyboardEvents } from '../logic/keyboard';\nimport { createPointerHandlers } from '../logic/pointer';\nimport { handleScrollEvent } from '../logic/scroll';\nimport type { IDnDProviderInternal } from '../types/provider';\n\nexport const useDnDProviderEvents = (provider: IDnDProviderInternal) => {\n const handlers = createPointerHandlers(provider);\n const keyDown = handleKeyboardEvents.keyDown(provider);\n const keyUp = handleKeyboardEvents.keyUp(provider);\n const clear = handleKeyboardEvents.clear(provider);\n const scrollHandler = handleScrollEvent(provider);\n\n onMounted(() => {\n document.addEventListener('pointerdown', handlers.pointerDown);\n document.addEventListener('keydown', keyDown);\n document.addEventListener('keyup', keyUp);\n document.addEventListener('blur', clear);\n document.addEventListener('scroll', scrollHandler, true);\n });\n\n onBeforeUnmount(() => {\n document.removeEventListener('pointerdown', handlers.pointerDown);\n document.removeEventListener('pointerup', handlers.pointerUp);\n document.removeEventListener('pointermove', handlers.pointerMove);\n document.removeEventListener('keydown', keyDown);\n document.removeEventListener('keyup', keyUp);\n document.removeEventListener('blur', clear);\n document.removeEventListener('scroll', scrollHandler, true);\n handlers.cleanup();\n });\n};\n","import { inject } from \"vue\"\r\nimport { injectionKey } from \"../../internal/utils/namespaces\"\r\nimport type { IDnDProviderInternal } from \"../types/provider\";\r\n\r\nexport const useDnDProviderInternal = () => {\r\n const provider = inject<IDnDProviderInternal>(injectionKey)\r\n if (!provider) throw Error('DnD provider not found');\r\n \r\n return provider;\r\n}","import type { IDnDProviderExternal } from '../types';\r\nimport { useDnDProviderInternal } from '../../internal/composables/useDnDProviderInternal';\r\n\r\nexport const useDnDProvider = (): IDnDProviderExternal => {\r\n const provider = useDnDProviderInternal();\r\n\r\n return {\r\n overlay: provider.overlay,\r\n delay: provider.delay,\r\n distanceProgress: provider.distanceProgress,\r\n entities: provider.entities,\r\n pointer: provider.pointer,\r\n state: provider.state,\r\n scrollPosition: provider.scrollPosition,\r\n keyboard: provider.keyboard,\r\n hovered: provider.hovered,\r\n collision: provider.collision,\r\n };\r\n};\r\n","<script setup lang=\"ts\">\r\n import { useDnDProvider } from '../composables/useDnDProvider';\r\n\r\n const { entities, state, overlay } = useDnDProvider();\r\n</script>\r\n\r\n<template>\r\n <div\r\n v-if=\"state === 'dragging'\"\r\n class=\"dnd-kit-default-overlay\"\r\n :style=\"{\r\n '--position-x': overlay.style.value.x + 'px',\r\n '--position-y': overlay.style.value.y + 'px'\r\n }\"\r\n >\r\n <template v-for=\"[node, draggable] in entities.draggingMap\">\r\n <component\r\n v-if=\"entities.draggableMap.get(node)?.render\"\r\n :is=\"entities.draggableMap.get(node)?.render\"\r\n class=\"test\"\r\n />\r\n <component\r\n v-else\r\n :is=\"node.tagName\"\r\n v-html=\"draggable.initialHTML\"\r\n class=\"test\"\r\n :style=\"{\r\n width: draggable.initialRect.width + 'px',\r\n height: draggable.initialRect.height + 'px'\r\n }\"\r\n />\r\n </template>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n .dnd-kit-default-overlay {\r\n transform: translate3d(var(--position-x), var(--position-y), 0px);\r\n }\r\n</style>","<script setup lang=\"ts\">\n import { computed, provide, useTemplateRef } from 'vue';\n\n import { injectionKey } from '../../internal/utils/namespaces';\n import { useDnDProviderState } from '../../internal/composables/useDnDProviderState';\n import { useDnDProviderEvents } from '../../internal/composables/useDnDProviderEvents';\n\n import DefaultOverlay from './DefaultOverlay.vue';\n\n const overlayRef = useTemplateRef<HTMLElement>('overlayRef');\n const provider = useDnDProviderState(overlayRef);\n useDnDProviderEvents(provider);\n\n const overlay = computed(\n () => provider.overlay.render.value ?? DefaultOverlay\n );\n\n provide(injectionKey, provider);\n</script>\n\n<template>\n <slot />\n\n <div\n ref=\"overlayRef\"\n class=\"dnd-kit-overlay-container\"\n >\n <slot\n name=\"overlay\"\n :overlay\n >\n <component :is=\"overlay\" />\n </slot>\n </div>\n</template>\n\n<style>\n .dnd-kit-overlay-container {\n position: fixed;\n top: 0;\n left: 0;\n pointer-events: none;\n cursor: grabbing;\n }\n</style>\n","import type {\r\n IBaseOptions,\r\n IDragActivation,\r\n IDragActivationOptions,\r\n IDraggableEvents,\r\n IModifier,\r\n IModifierOptions,\r\n IPlacementMargins,\r\n TDnDNodeRef,\r\n TDraggablePayload,\r\n} from '../types';\r\nimport { onBeforeUnmount, onMounted, type Component, type Ref } from 'vue';\r\n\r\nimport { DnDAttributes } from '../../internal/utils/namespaces';\r\nimport { getNode, preventEvent } from '../../internal/utils/dom';\r\nimport { useDnDProviderInternal } from '../../internal/composables/useDnDProviderInternal';\r\n\r\ninterface IMakeDraggableOptions extends IBaseOptions {\r\n events?: IDraggableEvents;\r\n modifier?: IModifierOptions;\r\n render?: Component;\r\n dragHandle?: string | Ref<string>;\r\n activation?: IDragActivationOptions;\r\n /** Margins for center zone. When pointer in center and element is also droppable, zone mode is used. */\r\n placementMargins?: IPlacementMargins;\r\n}\r\n\r\ninterface IMakeDraggableReturnType {}\r\n\r\nexport function makeDraggable(\r\n ref: TDnDNodeRef,\r\n payload?: TDraggablePayload\r\n): IMakeDraggableReturnType;\r\nexport function makeDraggable(\r\n ref: TDnDNodeRef,\r\n options: IMakeDraggableOptions,\r\n payload?: TDraggablePayload\r\n): IMakeDraggableReturnType;\r\nexport function makeDraggable(\r\n ref: TDnDNodeRef,\r\n optionsOrPayload?: IMakeDraggableOptions | TDraggablePayload,\r\n payload?: TDraggablePayload\r\n): IMakeDraggableReturnType {\r\n const provider = useDnDProviderInternal();\r\n\r\n let options: IMakeDraggableOptions;\r\n let finalPayload: TDraggablePayload | undefined;\r\n let container: HTMLElement | null;\r\n\r\n if (typeof optionsOrPayload === 'function') {\r\n options = {};\r\n finalPayload = optionsOrPayload;\r\n } else {\r\n options = optionsOrPayload ?? {};\r\n finalPayload = payload;\r\n }\r\n\r\n onMounted(() => {\r\n container = getNode(ref);\r\n if (!container) return;\r\n\r\n container.addEventListener('dragstart', preventEvent);\r\n container.addEventListener('drag', preventEvent);\r\n container.addEventListener('dragend', preventEvent);\r\n\r\n container.setAttribute(DnDAttributes.DRAGGABLE, '');\r\n\r\n provider.lib.draggableObserver.observe(container);\r\n\r\n provider.entities.draggableMap.set(container, {\r\n render: options.render,\r\n disabled: (options.disabled as boolean) ?? false,\r\n groups: (options.groups as string[]) ?? [],\r\n modifier: options.modifier as IModifier,\r\n events: options.events,\r\n payload: finalPayload,\r\n dragHandle: options.dragHandle as string,\r\n activation: options.activation as IDragActivation,\r\n placementMargins: options.placementMargins,\r\n });\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n if (!container) return;\r\n\r\n provider.lib.draggableObserver.unobserve(container);\r\n provider.entities.visibleDraggableSet.delete(container);\r\n provider.entities.draggableMap.delete(container);\r\n provider.entities.modifiersDraggableSet.delete(container);\r\n });\r\n\r\n return {};\r\n}\r\n","import { computed, onBeforeUnmount, onMounted, type Ref } from 'vue';\r\nimport { getNode } from '../../internal/utils/dom';\r\nimport { DnDAttributes } from '../../internal/utils/namespaces';\r\n\r\nimport type {\r\n IBaseOptions,\r\n IModifier,\r\n ISelectableAreaEvents,\r\n TDnDNodeRef,\r\n TModifierKeys,\r\n TModifierMethod,\r\n} from '../types';\r\nimport { getBoundedSelectionArea } from '../../internal/utils/selection';\r\nimport { useDnDProviderInternal } from '../../internal/composables/useDnDProviderInternal';\r\n\r\ninterface ISelectableAreaOptions extends IBaseOptions {\r\n modifier?: {\r\n keys: TModifierKeys | Ref<TModifierKeys>;\r\n method: TModifierMethod | Ref<TModifierMethod>;\r\n };\r\n events?: ISelectableAreaEvents;\r\n}\r\n\r\nexport const makeSelectableArea = (\r\n nodeRef: TDnDNodeRef,\r\n options?: ISelectableAreaOptions\r\n) => {\r\n const provider = useDnDProviderInternal()\r\n\r\n const isSelecting = computed(() => {\r\n return nodeRef.value === provider.entities.selectingArea;\r\n });\r\n\r\n let container: HTMLElement | null = null;\r\n\r\n onMounted(() => {\r\n container = getNode(nodeRef);\r\n if (!container) return;\r\n container.setAttribute(DnDAttributes.SELECT_AREA, '');\r\n\r\n provider.lib.selectableAreaObserver.observe(container);\r\n provider.entities.selectableAreaMap.set(container, {\r\n modifier: (options?.modifier as IModifier) ?? {\r\n keys: ['ControlLeft'],\r\n method: 'every',\r\n },\r\n events: options?.events,\r\n disabled: (options?.disabled as boolean) ?? false,\r\n groups: (options?.groups as string[]) ?? [],\r\n });\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n if (!container) return;\r\n\r\n provider.lib.selectableAreaObserver.unobserve(container);\r\n provider.entities.visibleSelectableAreaSet.delete(container);\r\n provider.entities.modifiersSelectableAreaSet.delete(container);\r\n provider.entities.selectableAreaMap.delete(container);\r\n });\r\n\r\n const style = computed(() => {\r\n provider.scrollPosition.x;\r\n provider.scrollPosition.y;\r\n\r\n const pointer = provider.pointer.value;\r\n if (!pointer || provider.state.value !== 'selecting' || !container) {\r\n return {};\r\n }\r\n\r\n return getBoundedSelectionArea(pointer.start, pointer.current, container);\r\n });\r\n\r\n return {\r\n isSelecting,\r\n style,\r\n };\r\n};\r\n","import type {\r\n IDnDProviderExternal,\r\n TDnDNodeRef,\r\n TDragAxis,\r\n} from '../types';\r\nimport { inject, onBeforeUnmount, onMounted, type Ref } from 'vue';\r\nimport { DnDAttributes, injectionKey } from '../../internal/utils/namespaces';\r\nimport { getNode } from '../../internal/utils/dom';\r\n\r\nexport interface IMakeBoundingBoxOptions {\r\n axis?: TDragAxis | Ref<TDragAxis>;\r\n restrictToArea?: boolean | Ref<boolean>;\r\n}\r\n\r\nexport function makeBoundingBox(\r\n ref: TDnDNodeRef,\r\n options?: IMakeBoundingBoxOptions\r\n) {\r\n const provider = inject<IDnDProviderExternal>(injectionKey);\r\n if (!provider) throw Error('DnD provider not found');\r\n let container: HTMLElement | null = null;\r\n\r\n onMounted(() => {\r\n container = getNode(ref);\r\n if (!container) return;\r\n\r\n container.setAttribute(DnDAttributes.CONSTRAINT_AREA, '');\r\n\r\n provider.entities.constraintsAreaMap.set(container, {\r\n axis: (options?.axis || 'both') as TDragAxis,\r\n restrictToArea: (options?.restrictToArea || false) as boolean,\r\n });\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n if (!container) return;\r\n provider.entities.constraintsAreaMap.delete(container);\r\n });\r\n\r\n return {};\r\n}\r\n","import type { IBaseOptions, IDroppableEvents, TDnDNodeRef } from '../types';\r\nimport { onBeforeUnmount, onMounted } from 'vue';\r\n\r\nimport { DnDAttributes } from '../../internal/utils/namespaces';\r\nimport { getNode } from '../../internal/utils/dom';\r\nimport { useDnDProviderInternal } from '../../internal/composables/useDnDProviderInternal';\r\n\r\ninterface IMakeDroppableOptions extends IBaseOptions {\r\n events?: IDroppableEvents;\r\n}\r\n\r\nexport function makeDroppable(ref: TDnDNodeRef, options: IMakeDroppableOptions = {}): void {\r\n const provider = useDnDProviderInternal();\r\n let container: HTMLElement | null = null;\r\n\r\n onMounted(() => {\r\n container = getNode(ref);\r\n if (!container) return;\r\n\r\n container.setAttribute(DnDAttributes.DROPPABLE, '');\r\n provider.lib.droppableObserver.observe(container);\r\n\r\n provider.entities.droppableMap.set(container, {\r\n disabled: (options.disabled as boolean) ?? false,\r\n groups: (options.groups as string[]) ?? [],\r\n events: options.events,\r\n });\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n if (!container) return;\r\n\r\n provider.lib.droppableObserver.unobserve(container);\r\n provider.entities.visibleDroppableSet.delete(container);\r\n provider.entities.droppableMap.delete(container);\r\n });\r\n}\r\n"],"names":["DnDAttributes","DnDSelectors","injectionKey","filterByModifiers","entityMap","visibleSet","modifiers","isDisabled","result","visibleNode","entity","disabled","keys","method","key","originalUserSelect","originalTouchAction","originalOverscrollBehavior","getNode","node","isDescendant","parent","child","checkIntersection","rect1","rect2","disableInteractions","body","preventEvent","enableInteractions","event","isEffectivelyDisabledDraggable","ctx","el","e","isEffectivelyDisabledDroppable","createIntersectionObserver","targetSet","observer","entries","entry","element","createSizeObserver","target","width","height","useSizeObserver","elementRef","overlaySize","ref","stopWatch","watch","createPointerState","offsetX","offsetY","calculateCursorOffset","rect","x","y","createDraggingEntity","draggableEntity","initializeDraggingFromSelection","selectedSet","draggableMap","draggingMap","selected","draggingEntity","initializeDraggingFromElement","startDraggingForProvider","provider","initializeDragging","initiatingElement","checkDragHandle","draggable","handleSelector","skipHandle","handleElement","calculateDistanceProgress","pointer","distanceThreshold","deltaX","deltaY","movedDistance","distanceX","distanceY","condition","progressX","progressY","isActivationComplete","distanceProgress","delayProgress","activation","hasDistance","hasDelay","tryStartDragIfActivationComplete","createActivationDelayTimer","onComplete","rafId","tick","delay","findConstraintArea","constraintsAreaMap","constraintElement","applyAxisConstraint","targetX","targetY","axis","draggableRect","applyBoundsConstraint","constraintRect","overlayRect","calculateConstrainedPosition","overlayElement","firstDraggable","overlaySizeFallback","constraint","axisConstrained","DEFAULT_KEYS","useDnDProviderState","overlayRef","state","shallowRef","keyboard","entities","reactive","computed","scrollPosition","draggableObserver","droppableObserver","selectableAreaObserver","overlaySizeObserver","overlayRender","hovered","collision","overlayStyle","resetDnDSession","createDragPayload","initiating","payloadFn","index","items","dropData","getFirstKey","map","getClosestDraggableFromEvent","getDragEvent","triggerSelfDragFromEvent","eventName","dragEvent","triggerSelfDragForElement","triggerDragForAll","triggerZoneEnterLeave","prevZone","newZone","triggerDraggableHoverChange","prevEl","newEl","triggerZoneLeave","zone","triggerDropCancelEvents","areGroupsCompatible","groupsA","groupsB","g","getBoundedSelectionArea","start","current","container","containerRect","left","top","right","bottom","updateSelectionByBox","selectingArea","selectionBoxRect","getSelectionBoxRect","selectionAreaGroups","draggableGroups","createPointerBox","size","half","getPointerBoxFromProvider","p","getClosestPlacement","pointerBox","elementRect","margins","cx","cy","t","r","b","l","innerLeft","innerRight","innerTop","innerBottom","dTop","dBottom","dLeft","dRight","min","findNestedDraggable","elements","applyCollisionResultToHovered","prevElement","newElement","placement","nested","nestedRect","finalZone","finalElement","checkCollision","boxA","boxB","getBoundingBox","getCenter","box","getDistance","pointA","pointB","getOverlapPercent","xOverlap","yOverlap","overlapArea","boxAArea","boxBArea","containsPoint","defaultFilter","defaultSort","createBuilder","config","run","containerBox","candidates","filter","sortFn","collisionCheck","nodeSet","nodeBox","depth","a","builder","fn","cfg","containerEl","createSensor","overlayContainer","overlayBoxFromStyle","style","w","h","visibleElements","visibleZones","filterNotDragging","filterNotDescendantOfDragged","dragged","filterNotDisabled","filterValidCollisionTarget","aabbCollision","sortByOverlapAndPointer","defaultCollisionDetection","runCollisionAndApply","runThrottledCollision","lastRun","throttleMs","now","handleDropAndFinish","hoveredZone","zoneEntity","finishDragSession","finishSelectionSession","areaEntity","createPointerHandlers","delayTimer","lastCollisionRun","pointerUp","pointerMove","closestSelectionArea","closestDraggable","offset","MOVE_MAP","handleKeyDown","move","faster","k","dist","active","centerX","centerY","syntheticEvent","handleKeyUp","handleClear","handleKeyboardEvents","handleScrollEvent","useDnDProviderEvents","handlers","keyDown","keyUp","clear","scrollHandler","onMounted","onBeforeUnmount","useDnDProviderInternal","inject","useDnDProvider","overlay","_unref","_createElementBlock","_normalizeStyle","_openBlock","_Fragment","_createBlock","_resolveDynamicComponent","useTemplateRef","DefaultOverlay","provide","_renderSlot","_ctx","_createElementVNode","makeDraggable","optionsOrPayload","payload","options","finalPayload","makeSelectableArea","nodeRef","isSelecting","makeBoundingBox","makeDroppable"],"mappings":"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"}
|