@vue-dnd-kit/core 1.7.0 → 2.0.0-alpha2
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/README.md +5 -305
- package/dist/external/components/DefaultOverlay.vue.d.ts +3 -0
- package/dist/external/components/DefaultOverlay.vue.d.ts.map +1 -0
- package/dist/external/components/DnDProvider.vue.d.ts +25 -0
- package/dist/external/components/DnDProvider.vue.d.ts.map +1 -0
- package/dist/external/composables/makeBoundingBox.d.ts +8 -0
- package/dist/external/composables/makeBoundingBox.d.ts.map +1 -0
- package/dist/external/composables/makeCustomOverlay.d.ts +2 -0
- package/dist/external/composables/makeCustomOverlay.d.ts.map +1 -0
- package/dist/external/composables/makeDraggable.d.ts +17 -0
- package/dist/external/composables/makeDraggable.d.ts.map +1 -0
- package/dist/external/composables/makeDroppable.d.ts +7 -0
- package/dist/external/composables/makeDroppable.d.ts.map +1 -0
- package/dist/external/composables/makeSelectableArea.d.ts +15 -0
- package/dist/external/composables/makeSelectableArea.d.ts.map +1 -0
- package/dist/external/composables/useDnDProvider.d.ts +3 -0
- package/dist/external/composables/useDnDProvider.d.ts.map +1 -0
- package/dist/external/index.d.ts +12 -0
- package/dist/external/index.d.ts.map +1 -0
- package/dist/external/types/entities.d.ts +144 -0
- package/dist/external/types/index.d.ts +4 -0
- package/dist/external/types/placement.d.ts +15 -0
- package/dist/external/types/pointer.d.ts +10 -0
- package/dist/external/types/provider.d.ts +64 -0
- package/dist/index.d.ts +2 -2141
- package/dist/internal/composables/useDnDProviderEvents.d.ts +3 -0
- package/dist/internal/composables/useDnDProviderEvents.d.ts.map +1 -0
- package/dist/internal/composables/useDnDProviderInternal.d.ts +3 -0
- package/dist/internal/composables/useDnDProviderInternal.d.ts.map +1 -0
- package/dist/internal/composables/useDnDProviderState.d.ts +4 -0
- package/dist/internal/composables/useDnDProviderState.d.ts.map +1 -0
- package/dist/internal/composables/useSizeObserver.d.ts +34 -0
- package/dist/internal/composables/useSizeObserver.d.ts.map +1 -0
- package/dist/internal/logic/hover.d.ts +8 -0
- package/dist/internal/logic/hover.d.ts.map +1 -0
- package/dist/internal/logic/keyboard.d.ts +7 -0
- package/dist/internal/logic/keyboard.d.ts.map +1 -0
- package/dist/internal/logic/payload.d.ts +8 -0
- package/dist/internal/logic/payload.d.ts.map +1 -0
- package/dist/internal/logic/pointer.d.ts +10 -0
- package/dist/internal/logic/pointer.d.ts.map +1 -0
- package/dist/internal/logic/scroll.d.ts +3 -0
- package/dist/internal/logic/scroll.d.ts.map +1 -0
- package/dist/internal/sensors/defaultCollision.d.ts +8 -0
- package/dist/internal/sensors/defaultCollision.d.ts.map +1 -0
- package/dist/internal/sensors/index.d.ts +3 -0
- package/dist/internal/sensors/index.d.ts.map +1 -0
- package/dist/internal/sensors/sensor.d.ts +53 -0
- package/dist/internal/sensors/sensor.d.ts.map +1 -0
- package/dist/internal/sensors/steps.d.ts +27 -0
- package/dist/internal/sensors/steps.d.ts.map +1 -0
- package/dist/internal/types/observer.d.ts +11 -0
- package/dist/internal/types/provider.d.ts +29 -0
- package/dist/internal/utils/constraints.d.ts +41 -0
- package/dist/internal/utils/constraints.d.ts.map +1 -0
- package/dist/internal/utils/disabled.d.ts +10 -0
- package/dist/internal/utils/disabled.d.ts.map +1 -0
- package/dist/internal/utils/dom.d.ts +45 -0
- package/dist/internal/utils/dom.d.ts.map +1 -0
- package/dist/internal/utils/drag-activation.d.ts +30 -0
- package/dist/internal/utils/drag-activation.d.ts.map +1 -0
- package/dist/internal/utils/events.d.ts +22 -0
- package/dist/internal/utils/events.d.ts.map +1 -0
- package/dist/internal/utils/geometry.d.ts +24 -0
- package/dist/internal/utils/geometry.d.ts.map +1 -0
- package/dist/internal/utils/groups.d.ts +9 -0
- package/dist/internal/utils/groups.d.ts.map +1 -0
- package/dist/internal/utils/keyboard.d.ts +6 -0
- package/dist/internal/utils/keyboard.d.ts.map +1 -0
- package/dist/internal/utils/namespaces.d.ts +19 -0
- package/dist/internal/utils/namespaces.d.ts.map +1 -0
- package/dist/internal/utils/observer.d.ts +28 -0
- package/dist/internal/utils/observer.d.ts.map +1 -0
- package/dist/internal/utils/placement.d.ts +29 -0
- package/dist/internal/utils/placement.d.ts.map +1 -0
- package/dist/internal/utils/pointer.d.ts +34 -0
- package/dist/internal/utils/pointer.d.ts.map +1 -0
- package/dist/internal/utils/provider.d.ts +13 -0
- package/dist/internal/utils/provider.d.ts.map +1 -0
- package/dist/internal/utils/selection.d.ts +28 -0
- package/dist/internal/utils/selection.d.ts.map +1 -0
- package/dist/internal/utils/session.d.ts +6 -0
- package/dist/internal/utils/session.d.ts.map +1 -0
- package/dist/vite.svg +1 -0
- package/dist/vue-dnd-kit-core.cjs.js +2 -1
- package/dist/vue-dnd-kit-core.cjs.js.map +1 -1
- package/dist/vue-dnd-kit-core.es.js +886 -857
- package/dist/vue-dnd-kit-core.es.js.map +1 -1
- package/package.json +78 -73
- package/LICENSE +0 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue-dnd-kit-core.cjs.js","sources":["../src/utils/operations.ts","../src/composables/useDnDStore.ts","../src/composables/useDragContainer.ts","../src/components/DefaultOverlay.vue","../src/components/DragOverlay.vue","../src/plugin.ts","../src/utils/geometry.ts","../src/utils/namespaces.ts","../src/utils/events.ts","../src/managers/useElementManager.ts","../src/utils/dom.ts","../src/utils/sensor.ts","../src/composables/useKeyboard.ts","../src/composables/usePointer.ts","../src/composables/useSensor.ts","../src/managers/useEventManager.ts","../src/composables/useDraggable.ts","../src/managers/useZoneManager.ts","../src/composables/useDroppable.ts","../src/composables/useSelection.ts"],"sourcesContent":["import { IDnDStore } from '../types';\r\n\r\nexport class DnDOperations {\r\n static remove = (source?: any[], index?: number) => {\r\n if (!source || index === undefined) return;\r\n const [item] = source.splice(index, 1);\r\n return item;\r\n };\r\n static insert = (target?: any[], index?: number, item?: any) => {\r\n if (!target || index === undefined) return;\r\n target.splice(index, 0, item);\r\n };\r\n static move = (\r\n source?: any[],\r\n sourceIndex?: number,\r\n target?: any[],\r\n targetIndex?: number\r\n ) => {\r\n if (\r\n !source ||\r\n !target ||\r\n sourceIndex === undefined ||\r\n targetIndex === undefined\r\n )\r\n return;\r\n const item = DnDOperations.remove(source, sourceIndex);\r\n DnDOperations.insert(target, targetIndex, item);\r\n };\r\n static swap = (\r\n source?: any[],\r\n sourceIndex?: number,\r\n target?: any[],\r\n targetIndex?: number\r\n ) => {\r\n if (\r\n !source ||\r\n !target ||\r\n sourceIndex === undefined ||\r\n targetIndex === undefined\r\n )\r\n return;\r\n\r\n const sourceItem = source[sourceIndex];\r\n const targetItem = target[targetIndex];\r\n\r\n source[sourceIndex] = targetItem;\r\n target[targetIndex] = sourceItem;\r\n };\r\n static copy = (\r\n source?: any[],\r\n index?: number,\r\n target?: any[],\r\n targetIndex?: number\r\n ) => {\r\n if (!source || index === undefined || !target || targetIndex === undefined)\r\n return;\r\n const item = source[index];\r\n DnDOperations.insert(target, targetIndex, item);\r\n };\r\n static applyTransfer = (store: IDnDStore) => {\r\n const hoveredElement = store.hovered.element.value;\r\n const hoveredZone = store.hovered.zone.value;\r\n\r\n if (hoveredElement) {\r\n const targetSource =\r\n store.elementsMap.value.get(hoveredElement)?.data?.source;\r\n const targetIndex =\r\n store.elementsMap.value.get(hoveredElement)?.data?.index;\r\n\r\n const firstElement = store.draggingElements.value.values().next().value;\r\n const firstIndex = firstElement?.data?.index;\r\n\r\n const sortDirection =\r\n firstIndex !== undefined &&\r\n targetIndex !== undefined &&\r\n firstIndex > targetIndex\r\n ? 1\r\n : -1;\r\n\r\n const sortedElements = Array.from(\r\n store.draggingElements.value.values()\r\n ).sort(\r\n (a, b) => sortDirection * ((a.data?.index || 0) - (b.data?.index || 0))\r\n );\r\n\r\n sortedElements.forEach((element) =>\r\n DnDOperations.move(\r\n element.data?.source,\r\n element.data?.index,\r\n targetSource,\r\n targetIndex\r\n )\r\n );\r\n } else if (hoveredZone) {\r\n const targetSource = store.zonesMap.value.get(hoveredZone)?.data?.source;\r\n const targetIndex = targetSource?.length;\r\n\r\n const sortedElements = Array.from(\r\n store.draggingElements.value.values()\r\n ).sort((a, b) => (b.data?.index || 0) - (a.data?.index || 0));\r\n\r\n sortedElements.forEach((element) =>\r\n DnDOperations.move(\r\n element.data?.source,\r\n element.data?.index,\r\n targetSource,\r\n targetIndex\r\n )\r\n );\r\n }\r\n };\r\n\r\n static applyCopy = (store: IDnDStore) => {\r\n const hoveredElement = store.hovered.element.value;\r\n const hoveredZone = store.hovered.zone.value;\r\n\r\n if (hoveredElement) {\r\n const targetSource =\r\n store.elementsMap.value.get(hoveredElement)?.data?.source;\r\n const targetIndex =\r\n store.elementsMap.value.get(hoveredElement)?.data?.index;\r\n\r\n const sortedElements = Array.from(\r\n store.draggingElements.value.values()\r\n ).sort((a, b) => (b.data?.index || 0) - (a.data?.index || 0));\r\n\r\n sortedElements.forEach((element) =>\r\n DnDOperations.copy(\r\n element.data?.source,\r\n element.data?.index,\r\n targetSource,\r\n targetIndex\r\n )\r\n );\r\n } else if (hoveredZone) {\r\n const targetSource = store.zonesMap.value.get(hoveredZone)?.data?.source;\r\n const targetIndex = targetSource?.length;\r\n\r\n const sortedElements = Array.from(\r\n store.draggingElements.value.values()\r\n ).sort((a, b) => (b.data?.index || 0) - (a.data?.index || 0));\r\n\r\n sortedElements.forEach((element) =>\r\n DnDOperations.copy(\r\n element.data?.source,\r\n element.data?.index,\r\n targetSource,\r\n targetIndex\r\n )\r\n );\r\n }\r\n };\r\n static applySwap = (store: IDnDStore) => {\r\n const hoveredElement = store.hovered.element.value;\r\n const hoveredZone = store.hovered.zone.value;\r\n\r\n if (hoveredElement && store.draggingElements.value.size === 1) {\r\n const element = store.draggingElements.value.values().next().value;\r\n DnDOperations.swap(\r\n element?.data?.source,\r\n element?.data?.index,\r\n store.elementsMap.value.get(hoveredElement)?.data?.source,\r\n store.elementsMap.value.get(hoveredElement)?.data?.index\r\n );\r\n } else if (hoveredZone) {\r\n const targetSource = store.zonesMap.value.get(hoveredZone)?.data?.source;\r\n const targetIndex = targetSource?.length;\r\n\r\n const sortedElements = Array.from(\r\n store.draggingElements.value.values()\r\n ).sort((a, b) => (b.data?.index || 0) - (a.data?.index || 0));\r\n\r\n sortedElements.forEach((element) =>\r\n DnDOperations.move(\r\n element.data?.source,\r\n element.data?.index,\r\n targetSource,\r\n targetIndex\r\n )\r\n );\r\n }\r\n };\r\n static applyRemove = (store: IDnDStore) => {\r\n const sortedElements = Array.from(\r\n store.draggingElements.value.values()\r\n ).sort((a, b) => (b.data?.index || 0) - (a.data?.index || 0));\r\n\r\n sortedElements.forEach((element) => {\r\n if (element.data?.source && element.data?.index !== undefined) {\r\n DnDOperations.remove(element.data.source, element.data.index);\r\n }\r\n });\r\n };\r\n static applyInsert = (store: IDnDStore, items: any[]) => {\r\n const hoveredElement = store.hovered.element.value;\r\n const hoveredZone = store.hovered.zone.value;\r\n\r\n if (hoveredElement && items.length > 0) {\r\n const targetSource =\r\n store.elementsMap.value.get(hoveredElement)?.data?.source;\r\n const targetIndex =\r\n store.elementsMap.value.get(hoveredElement)?.data?.index;\r\n\r\n items.forEach((item) => {\r\n DnDOperations.insert(targetSource, targetIndex, item);\r\n });\r\n } else if (hoveredZone) {\r\n const targetSource = store.zonesMap.value.get(hoveredZone)?.data?.source;\r\n const targetIndex = targetSource?.length;\r\n\r\n items.forEach((item) => {\r\n DnDOperations.insert(targetSource, targetIndex, item);\r\n });\r\n }\r\n };\r\n}\r\n","import type {\r\n IDragElement,\r\n IDraggingElement,\r\n IDropZone,\r\n IPoint,\r\n} from '../types';\r\nimport {\r\n computed,\r\n ref,\r\n shallowRef,\r\n type Component,\r\n type TransitionProps,\r\n} from 'vue';\r\nimport { createGlobalState, useMagicKeys } from '@vueuse/core';\r\n\r\nexport const useDnDStore = createGlobalState(() => {\r\n const isPending = shallowRef<boolean>(false);\r\n const draggingElements = ref<Map<HTMLElement | Element, IDraggingElement>>(\r\n new Map()\r\n );\r\n const isDragging = computed<boolean>(() => draggingElements.value.size > 0);\r\n\r\n const activeContainer = {\r\n component: ref<Component | null>(null),\r\n ref: shallowRef<HTMLElement | null>(null),\r\n options: shallowRef<TransitionProps | null>(null),\r\n props: shallowRef<Record<string, any> | null>(null),\r\n animating: {\r\n enter: shallowRef<boolean>(false),\r\n leave: shallowRef<boolean>(false),\r\n appear: shallowRef<boolean>(false),\r\n },\r\n };\r\n\r\n const elementsMap = ref<Map<HTMLElement | Element, IDragElement>>(new Map());\r\n const selectedElements = ref<Set<HTMLElement | Element>>(new Set());\r\n const zonesMap = ref<Map<HTMLElement | Element, IDropZone>>(new Map());\r\n const visibleZones = shallowRef<Set<HTMLElement | Element>>(new Set());\r\n const visibleElements = shallowRef<Set<HTMLElement | Element>>(new Set());\r\n\r\n const hasIntersectionObserver =\r\n typeof window !== 'undefined' && 'IntersectionObserver' in window;\r\n\r\n const elementObserver = hasIntersectionObserver\r\n ? new IntersectionObserver((entries) => {\r\n entries.forEach((entry) =>\r\n visibleElements.value[entry.isIntersecting ? 'add' : 'delete'](\r\n entry.target\r\n )\r\n );\r\n })\r\n : null;\r\n\r\n const zoneObserver = hasIntersectionObserver\r\n ? new IntersectionObserver((entries) => {\r\n entries.forEach((entry) =>\r\n visibleZones.value[entry.isIntersecting ? 'add' : 'delete'](\r\n entry.target\r\n )\r\n );\r\n })\r\n : null;\r\n\r\n const handleDragElementIntersection = (\r\n action: 'add' | 'remove',\r\n element: HTMLElement | Element\r\n ) => {\r\n if (!elementObserver) return;\r\n\r\n if (action === 'add') {\r\n elementObserver.observe(element);\r\n } else {\r\n elementObserver.unobserve(element);\r\n visibleElements.value.delete(element);\r\n }\r\n };\r\n\r\n const handleDropZoneIntersection = (\r\n action: 'add' | 'remove',\r\n element: HTMLElement | Element\r\n ) => {\r\n if (!zoneObserver) return;\r\n\r\n if (action === 'add') {\r\n zoneObserver.observe(element);\r\n } else {\r\n zoneObserver.unobserve(element);\r\n visibleZones.value.delete(element);\r\n }\r\n };\r\n\r\n const pointerPosition = {\r\n start: shallowRef<IPoint | null>(null),\r\n current: shallowRef<IPoint | null>(null),\r\n offset: {\r\n percent: shallowRef<IPoint | null>(null),\r\n pixel: shallowRef<IPoint | null>(null),\r\n },\r\n };\r\n\r\n const { KeyW, KeyS, KeyA, KeyD, ctrl, shift, alt, meta } = useMagicKeys();\r\n\r\n const hovered = {\r\n zone: shallowRef<HTMLElement | Element | null>(null),\r\n element: shallowRef<HTMLElement | Element | null>(null),\r\n };\r\n\r\n return {\r\n draggingElements,\r\n isDragging,\r\n activeContainer,\r\n elementsMap,\r\n selectedElements,\r\n zonesMap,\r\n visibleZones,\r\n visibleElements,\r\n pointerPosition,\r\n keyboard: {\r\n w: KeyW,\r\n s: KeyS,\r\n a: KeyA,\r\n d: KeyD,\r\n ctrl,\r\n shift,\r\n alt,\r\n meta,\r\n },\r\n hovered,\r\n isPending,\r\n handleDragElementIntersection,\r\n handleDropZoneIntersection,\r\n };\r\n});\r\n","import { onUnmounted, onMounted, ref, type TransitionProps } from 'vue';\r\n\r\nimport { useDnDStore } from './useDnDStore';\r\n\r\nexport const useDragContainer = (options?: Omit<TransitionProps, 'appear'>) => {\r\n const elementRef = ref<HTMLElement | null>(null);\r\n\r\n const { draggingElements, pointerPosition, isDragging, activeContainer } =\r\n useDnDStore();\r\n\r\n onMounted(() => {\r\n activeContainer.ref = elementRef;\r\n activeContainer.options.value = options ?? null;\r\n });\r\n\r\n onUnmounted(() => {\r\n activeContainer.ref.value = null;\r\n activeContainer.options.value = null;\r\n });\r\n\r\n return {\r\n elementRef,\r\n draggingElements,\r\n pointerPosition,\r\n isDragging,\r\n animating: activeContainer.animating,\r\n };\r\n};\r\n","<script setup lang=\"ts\">\r\n import { computed, CSSProperties } from 'vue';\r\n import { useDragContainer } from '../composables/useDragContainer';\r\n\r\n const { elementRef, pointerPosition, isDragging, draggingElements } =\r\n useDragContainer();\r\n\r\n const { styles } = defineProps<{\r\n styles?: CSSProperties;\r\n }>();\r\n\r\n const computedStyle = computed<CSSProperties>(() => ({\r\n transform: `translate3d(${\r\n (pointerPosition.current.value?.x ?? 0) -\r\n (pointerPosition.offset.pixel.value?.x ?? 0)\r\n }px, ${\r\n (pointerPosition.current.value?.y ?? 0) -\r\n (pointerPosition.offset.pixel.value?.y ?? 0)\r\n }px, 0)`,\r\n zIndex: 1000,\r\n position: 'fixed',\r\n top: 0,\r\n left: 0,\r\n transition: '0.3s cubic-bezier(0.165, 0.84, 0.44, 1)',\r\n ...styles,\r\n }));\r\n</script>\r\n\r\n<template>\r\n <div\r\n v-if=\"isDragging\"\r\n ref=\"elementRef\"\r\n :style=\"computedStyle\"\r\n >\r\n <template\r\n v-for=\"[node, element] in draggingElements\"\r\n :key=\"element.id\"\r\n >\r\n <component\r\n v-if=\"element.layer\"\r\n :is=\"element.layer\"\r\n :node=\"node\"\r\n :data=\"element.data\"\r\n :id=\"element.id\"\r\n :groups=\"element.groups\"\r\n />\r\n <div\r\n v-else\r\n v-html=\"element.initialHTML\"\r\n :style=\"{\r\n width: `${element.initialRect?.width}px`,\r\n height: `${element.initialRect?.height}px`,\r\n }\"\r\n />\r\n </template>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\n import { computed, CSSProperties } from 'vue';\r\n import { useDnDStore } from '../composables/useDnDStore';\r\n import DefaultOverlay from './DefaultOverlay.vue';\r\n\r\n const props = defineProps<{\r\n styles?: CSSProperties;\r\n }>();\r\n\r\n const { activeContainer } = useDnDStore();\r\n\r\n const overlay = computed(() => ({\r\n component: activeContainer.component.value ?? DefaultOverlay,\r\n props: {\r\n ...props,\r\n ...activeContainer.props.value,\r\n },\r\n }));\r\n</script>\r\n\r\n<template>\r\n <Transition\r\n v-if=\"activeContainer.options.value\"\r\n :name=\"activeContainer.options.value.name\"\r\n :duration=\"activeContainer.options.value.duration\"\r\n :enter-from-class=\"activeContainer.options.value.enterFromClass\"\r\n :enter-to-class=\"activeContainer.options.value.enterToClass\"\r\n :enter-active-class=\"activeContainer.options.value.enterActiveClass\"\r\n :leave-from-class=\"activeContainer.options.value.leaveFromClass\"\r\n :leave-to-class=\"activeContainer.options.value.leaveToClass\"\r\n :leave-active-class=\"activeContainer.options.value.leaveActiveClass\"\r\n :appear-active-class=\"activeContainer.options.value.appearActiveClass\"\r\n :appear-from-class=\"activeContainer.options.value.appearFromClass\"\r\n :appear-to-class=\"activeContainer.options.value.appearToClass\"\r\n :mode=\"activeContainer.options.value.mode\"\r\n :type=\"activeContainer.options.value.type\"\r\n :css=\"activeContainer.options.value.css\"\r\n :appear=\"true\"\r\n :persisted=\"activeContainer.options.value.persisted\"\r\n @enter=\"activeContainer.options.value.onEnter\"\r\n @leave=\"activeContainer.options.value.onLeave\"\r\n @before-enter=\"activeContainer.options.value.onBeforeEnter\"\r\n @before-leave=\"activeContainer.options.value.onBeforeLeave\"\r\n @before-appear=\"activeContainer.options.value.onBeforeAppear\"\r\n @after-enter=\"activeContainer.options.value.onAfterEnter\"\r\n @after-leave=\"activeContainer.options.value.onAfterLeave\"\r\n @after-appear=\"activeContainer.options.value.onAfterAppear\"\r\n >\r\n <component\r\n :is=\"overlay.component || overlay\"\r\n v-bind=\"overlay.props || {}\"\r\n />\r\n </Transition>\r\n\r\n <component\r\n v-else\r\n :is=\"overlay.component || overlay\"\r\n v-bind=\"overlay.props || {}\"\r\n />\r\n</template>\r\n","import { createVNode, render } from 'vue';\r\n\r\nimport type { App } from 'vue';\r\nimport DragOverlay from './components/DragOverlay.vue';\r\nimport { IPluginOptions } from './types';\r\nimport { useDnDStore } from './composables/useDnDStore';\r\n\r\nexport const VueDndKitPlugin = {\r\n install(app: App, options?: IPluginOptions) {\r\n app.component('DragOverlay', DragOverlay);\r\n const originalMount = app.mount;\r\n app.mount = function (rootContainer) {\r\n const instance = originalMount.call(this, rootContainer);\r\n\r\n const rootEl =\r\n typeof rootContainer === 'string'\r\n ? document.querySelector(rootContainer)\r\n : rootContainer;\r\n\r\n if (rootEl && rootEl instanceof Element) {\r\n if (!rootEl.querySelector('#vue-dnd-kit-overlay')) {\r\n const overlayContainer = document.createElement('div');\r\n\r\n overlayContainer.id = 'vue-dnd-kit-overlay';\r\n overlayContainer.style.pointerEvents = 'none';\r\n\r\n // Применяем кастомный z-index если указан\r\n if (options?.overlayPosition?.zIndex) {\r\n overlayContainer.style.zIndex =\r\n options.overlayPosition.zIndex.toString();\r\n }\r\n\r\n // Применяем кастомный класс если указан\r\n if (options?.overlayPosition?.className) {\r\n overlayContainer.className = options.overlayPosition.className;\r\n }\r\n\r\n // Определяем метод вставки overlay\r\n const insertMethod = options?.overlayPosition?.method || 'append';\r\n const targetElement = options?.overlayPosition?.target\r\n ? typeof options.overlayPosition.target === 'string'\r\n ? document.querySelector(options.overlayPosition.target)\r\n : options.overlayPosition.target\r\n : rootEl;\r\n\r\n if (targetElement && targetElement instanceof Element) {\r\n switch (insertMethod) {\r\n case 'prepend':\r\n targetElement.insertBefore(\r\n overlayContainer,\r\n targetElement.firstChild\r\n );\r\n break;\r\n case 'after':\r\n targetElement.parentNode?.insertBefore(\r\n overlayContainer,\r\n targetElement.nextSibling\r\n );\r\n break;\r\n case 'before':\r\n targetElement.parentNode?.insertBefore(\r\n overlayContainer,\r\n targetElement\r\n );\r\n break;\r\n case 'append':\r\n default:\r\n targetElement.appendChild(overlayContainer);\r\n break;\r\n }\r\n } else {\r\n // Fallback к старому поведению\r\n rootEl.appendChild(overlayContainer);\r\n }\r\n\r\n // Передаем опции напрямую в компонент\r\n const vnode = createVNode(DragOverlay, {\r\n styles: options?.defaultOverlay?.styles,\r\n });\r\n render(vnode, overlayContainer);\r\n\r\n app.__VUE_DND_KIT_OVERLAY__ = {\r\n container: overlayContainer,\r\n vnode,\r\n options: options?.defaultOverlay || {},\r\n };\r\n\r\n const store = useDnDStore();\r\n app.__VUE_DND_KIT_STORE__ = store;\r\n }\r\n }\r\n\r\n return instance;\r\n };\r\n\r\n // Модифицируем метод unmount для очистки\r\n const originalUnmount = app.unmount;\r\n app.unmount = function () {\r\n if (app.__VUE_DND_KIT_OVERLAY__) {\r\n render(null, app.__VUE_DND_KIT_OVERLAY__.container);\r\n delete app.__VUE_DND_KIT_OVERLAY__;\r\n }\r\n return originalUnmount.call(this);\r\n };\r\n },\r\n};\r\n\r\ndeclare module '@vue/runtime-core' {\r\n export interface App {\r\n __VUE_DND_KIT_OVERLAY__?: {\r\n container: HTMLElement;\r\n vnode: any;\r\n options: IPluginOptions['defaultOverlay'];\r\n };\r\n __VUE_DND_KIT_STORE__?: ReturnType<typeof useDnDStore>;\r\n }\r\n}\r\n","import type { IBoundingBox, IPoint } from '../types';\r\n\r\nexport const checkCollision = (\r\n boxA: IBoundingBox,\r\n boxB: IBoundingBox\r\n): boolean => {\r\n return (\r\n boxA.x < boxB.x + boxB.width &&\r\n boxA.x + boxA.width > boxB.x &&\r\n boxA.y < boxB.y + boxB.height &&\r\n boxA.y + boxA.height > boxB.y\r\n );\r\n};\r\n\r\nexport const getBoundingBox = (element: HTMLElement | null): IBoundingBox => {\r\n if (!element)\r\n return {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n top: 0,\r\n };\r\n\r\n const rect = element.getBoundingClientRect();\r\n\r\n return {\r\n bottom: rect.bottom,\r\n left: rect.left,\r\n right: rect.right,\r\n top: rect.top,\r\n x: rect.x,\r\n y: rect.y,\r\n width: rect.width,\r\n height: rect.height,\r\n };\r\n};\r\n\r\nexport const getCenter = (box: IBoundingBox): IPoint => ({\r\n x: box.x + box.width / 2,\r\n y: box.y + box.height / 2,\r\n});\r\n\r\nexport const getOffset = (element: HTMLElement | null, pointer: IPoint) => {\r\n const rect = getBoundingBox(element);\r\n return {\r\n pixel: {\r\n x: pointer.x - rect.x,\r\n y: pointer.y - rect.y,\r\n },\r\n percent: {\r\n x: ((pointer.x - rect.x) / rect.width) * 100,\r\n y: ((pointer.y - rect.y) / rect.height) * 100,\r\n },\r\n };\r\n};\r\n\r\nexport const getDistance = (pointA: IPoint, pointB: IPoint): number => {\r\n const dx = pointB.x - pointA.x;\r\n const dy = pointB.y - pointA.y;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n};\r\n\r\nexport const getOverlapPercent = (\r\n boxA: IBoundingBox,\r\n boxB: IBoundingBox\r\n): number => {\r\n const xOverlap = Math.max(\r\n 0,\r\n Math.min(boxA.x + boxA.width, boxB.x + boxB.width) -\r\n Math.max(boxA.x, boxB.x)\r\n );\r\n const yOverlap = Math.max(\r\n 0,\r\n Math.min(boxA.y + boxA.height, boxB.y + boxB.height) -\r\n Math.max(boxA.y, boxB.y)\r\n );\r\n\r\n const overlapArea = xOverlap * yOverlap;\r\n\r\n const boxAArea = boxA.width * boxA.height;\r\n const boxBArea = boxB.width * boxB.height;\r\n\r\n // Возвращаем среднее значение процентов перекрытия относительно обоих элементов\r\n return ((overlapArea / boxAArea) * 100 + (overlapArea / boxBArea) * 100) / 2;\r\n};\r\n","export const draggableDataName = 'data-vue-dnd-kit-draggable';\r\nexport const droppableDataName = 'data-vue-dnd-kit-droppable';\r\n\r\nexport const VUE_DND_KIT_OPTIONS = Symbol('vue-dnd-kit-options');\r\n","import { IDnDPayload, IDnDStore } from '../types';\r\n\r\nexport const preventEvent = (event: Event) => {\r\n event.preventDefault();\r\n};\r\n\r\nexport const createPayload = (store: IDnDStore): IDnDPayload => {\r\n return {\r\n items: Array.from(store.draggingElements.value.values()),\r\n };\r\n};\r\n","import { computed, ref, shallowRef, useId } from 'vue';\r\n\r\nimport type { IUseDragOptions } from '../types';\r\nimport { draggableDataName } from '../utils/namespaces';\r\nimport { preventEvent } from '../utils/events';\r\nimport { useDnDStore } from '../composables/useDnDStore';\r\n\r\nexport const useElementManager = (options?: IUseDragOptions) => {\r\n const {\r\n elementsMap,\r\n draggingElements,\r\n hovered,\r\n selectedElements,\r\n isDragging: isDragStarted,\r\n visibleElements,\r\n handleDragElementIntersection,\r\n } = useDnDStore();\r\n\r\n const elementRef = ref<HTMLElement | null>(null);\r\n const isOvered = computed<boolean>(() => {\r\n return hovered.element.value === elementRef.value;\r\n });\r\n\r\n const id = shallowRef(options?.id || useId());\r\n const disabled = shallowRef<boolean>((options?.disabled as boolean) ?? false);\r\n\r\n const isDragging = computed<boolean>(() => {\r\n if (disabled.value) return false;\r\n if (!elementRef.value) return false;\r\n if (!elementsMap.value.has(elementRef.value)) return false;\r\n return draggingElements.value.has(elementRef.value);\r\n });\r\n\r\n const isAllowed = computed<boolean>(() => {\r\n if (disabled.value) return false;\r\n if (!elementRef.value || !isDragStarted.value) return false;\r\n if (!visibleElements.value.has(elementRef.value)) return false;\r\n\r\n const currentElement = elementsMap.value.get(elementRef.value);\r\n if (!currentElement?.groups.length) return true;\r\n\r\n return !Array.from(draggingElements.value.entries()).some(\r\n ([_, draggingElement]) => {\r\n if (!draggingElement.groups.length) return false;\r\n return !draggingElement.groups.some((group) =>\r\n currentElement.groups.includes(group)\r\n );\r\n }\r\n );\r\n });\r\n\r\n const isLazyAllowed = computed<boolean>(() => {\r\n if (disabled.value) return false;\r\n if (!elementRef.value || !isDragStarted.value) return false;\r\n if (!visibleElements.value.has(elementRef.value)) return false;\r\n if (hovered.element.value !== elementRef.value) return false;\r\n\r\n const currentElement = elementsMap.value.get(elementRef.value);\r\n if (!currentElement?.groups.length) return true;\r\n\r\n return !Array.from(draggingElements.value.entries()).some(\r\n ([_, draggingElement]) => {\r\n if (!draggingElement.groups.length) return false;\r\n return !draggingElement.groups.some((group) =>\r\n currentElement.groups.includes(group)\r\n );\r\n }\r\n );\r\n });\r\n\r\n const registerElement = () => {\r\n if (!elementRef.value) throw new Error('ElementRef is not set');\r\n\r\n elementsMap.value.set(elementRef.value, {\r\n node: elementRef.value,\r\n groups: (options?.groups as string[]) ?? [],\r\n layer: options?.layer ?? null,\r\n defaultLayer: options?.layer ?? null,\r\n events: options?.events ?? {},\r\n data: options?.data ?? null,\r\n id: id.value,\r\n disabled: (disabled as unknown as boolean) ?? false,\r\n });\r\n\r\n handleDragElementIntersection('add', elementRef.value);\r\n\r\n elementRef.value.addEventListener('dragstart', preventEvent);\r\n elementRef.value.addEventListener('drag', preventEvent);\r\n elementRef.value.setAttribute(draggableDataName, 'true');\r\n elementRef.value.setAttribute('draggable', 'false');\r\n };\r\n\r\n const unregisterElement = () => {\r\n if (!elementRef.value) return;\r\n\r\n elementsMap.value.delete(elementRef.value);\r\n selectedElements.value.delete(elementRef.value);\r\n\r\n elementRef.value.removeEventListener('dragstart', preventEvent);\r\n elementRef.value.removeEventListener('drag', preventEvent);\r\n elementRef.value.removeAttribute(draggableDataName);\r\n elementRef.value.removeAttribute('draggable');\r\n };\r\n\r\n return {\r\n elementRef,\r\n registerElement,\r\n unregisterElement,\r\n isDragging,\r\n isOvered,\r\n isAllowed,\r\n isLazyAllowed,\r\n id,\r\n };\r\n};\r\n","export const isDescendant = (\r\n element: HTMLElement | Element | null,\r\n container: HTMLElement | Element\r\n): boolean => {\r\n if (!element) return false;\r\n return container.contains(element);\r\n};\r\n","import {\r\n checkCollision,\r\n getBoundingBox,\r\n getCenter,\r\n getDistance,\r\n getOverlapPercent,\r\n} from './geometry';\r\n\r\nimport { IDnDStore } from '../types';\r\nimport { isDescendant } from './dom';\r\n\r\nexport const defaultCollisionDetection = (store: IDnDStore) => {\r\n const containerRect = getBoundingBox(store.activeContainer.ref.value);\r\n const containerCenter = getCenter(containerRect);\r\n const pointerX = store.pointerPosition.current.value?.x ?? 0;\r\n const pointerY = store.pointerPosition.current.value?.y ?? 0;\r\n\r\n const isPointerInActiveContainer =\r\n containerRect &&\r\n pointerX >= containerRect.x &&\r\n pointerX <= containerRect.x + containerRect.width &&\r\n pointerY >= containerRect.y &&\r\n pointerY <= containerRect.y + containerRect.height;\r\n\r\n const shouldUseNormalPriority = !isPointerInActiveContainer;\r\n\r\n const activeDragNodes = Array.from(store.draggingElements.value.keys());\r\n\r\n const allCollidingElements = Array.from(store.visibleElements.value.entries())\r\n .filter(([node, _]) => {\r\n if (!node) return false;\r\n\r\n const rect = getBoundingBox(node as HTMLElement);\r\n return rect && containerRect && checkCollision(rect, containerRect);\r\n })\r\n .map(([node, element]) => {\r\n const rect = getBoundingBox(node as HTMLElement);\r\n const elementCenter = getCenter(rect);\r\n\r\n const isPointerInElement =\r\n pointerX >= rect.x &&\r\n pointerX <= rect.x + rect.width &&\r\n pointerY >= rect.y &&\r\n pointerY <= rect.y + rect.height;\r\n\r\n const overlapPercent = getOverlapPercent(rect, containerRect);\r\n const centerDistance = getDistance(containerCenter, elementCenter);\r\n\r\n let depth = 0;\r\n for (const [parentNode, _] of store.visibleElements.value.entries()) {\r\n if (\r\n parentNode !== node &&\r\n parentNode &&\r\n node &&\r\n isDescendant(node as HTMLElement, parentNode as HTMLElement)\r\n ) {\r\n depth++;\r\n }\r\n }\r\n\r\n return {\r\n element,\r\n node: node as HTMLElement,\r\n isPointerInElement,\r\n overlapPercent,\r\n depth,\r\n centerDistance,\r\n };\r\n })\r\n .sort((a, b) => {\r\n if (!shouldUseNormalPriority) {\r\n if (a.isPointerInElement && b.isPointerInElement)\r\n return b.depth - a.depth;\r\n if (a.isPointerInElement !== b.isPointerInElement)\r\n return a.isPointerInElement ? -1 : 1;\r\n }\r\n if (Math.abs(a.overlapPercent - b.overlapPercent) <= 1)\r\n return a.centerDistance - b.centerDistance;\r\n return b.overlapPercent - a.overlapPercent;\r\n });\r\n\r\n const allCollidingZones = Array.from(store.visibleZones.value.entries())\r\n .filter(([node, _]) => {\r\n if (\r\n !node ||\r\n activeDragNodes.some(\r\n (dragNode) =>\r\n dragNode &&\r\n isDescendant(node as HTMLElement, dragNode as HTMLElement)\r\n )\r\n )\r\n return false;\r\n\r\n const rect = getBoundingBox(node as HTMLElement);\r\n return rect && containerRect && checkCollision(rect, containerRect);\r\n })\r\n .map(([node, zone]) => {\r\n const rect = getBoundingBox(node as HTMLElement);\r\n const zoneCenter = getCenter(rect);\r\n\r\n const isPointerInElement =\r\n pointerX >= rect.x &&\r\n pointerX <= rect.x + rect.width &&\r\n pointerY >= rect.y &&\r\n pointerY <= rect.y + rect.height;\r\n\r\n const overlapPercent = getOverlapPercent(rect, containerRect);\r\n const centerDistance = getDistance(containerCenter, zoneCenter);\r\n\r\n // Вычисляем глубину вложенности\r\n let depth = 0;\r\n for (const [parentNode, _] of store.visibleZones.value.entries()) {\r\n if (\r\n parentNode !== node &&\r\n parentNode &&\r\n node &&\r\n isDescendant(node as HTMLElement, parentNode as HTMLElement)\r\n ) {\r\n depth++;\r\n }\r\n }\r\n\r\n return {\r\n zone,\r\n node: node as HTMLElement,\r\n isPointerInElement,\r\n overlapPercent,\r\n depth,\r\n centerDistance,\r\n };\r\n })\r\n .sort((a, b) => {\r\n if (!shouldUseNormalPriority) {\r\n if (a.isPointerInElement && b.isPointerInElement)\r\n return b.depth - a.depth;\r\n if (a.isPointerInElement !== b.isPointerInElement)\r\n return a.isPointerInElement ? -1 : 1;\r\n }\r\n if (Math.abs(a.overlapPercent - b.overlapPercent) <= 1)\r\n return a.centerDistance - b.centerDistance;\r\n return b.overlapPercent - a.overlapPercent;\r\n });\r\n\r\n return [\r\n ...allCollidingElements.map((item) => item.node),\r\n ...allCollidingZones.map((item) => item.node),\r\n ];\r\n};\r\n","import type { Ref } from 'vue';\r\nimport { getBoundingBox } from '../utils/geometry';\r\nimport { preventEvent } from '../utils/events';\r\nimport { useDnDStore } from './useDnDStore';\r\n\r\nexport interface IKeyboardOptions {\r\n moveStep?: number;\r\n}\r\n\r\nexport const useKeyboard = (\r\n elementRef: Ref<HTMLElement | null>,\r\n options?: IKeyboardOptions\r\n) => {\r\n const { pointerPosition, keyboard } = useDnDStore();\r\n const moveStep = options?.moveStep || 10;\r\n\r\n const onKeyboardStart = (event: KeyboardEvent) => {\r\n preventEvent(event);\r\n\r\n const rect = getBoundingBox(elementRef.value);\r\n\r\n elementRef.value?.blur();\r\n\r\n const centerX = rect.x + rect.width / 2;\r\n const centerY = rect.y + rect.height / 2;\r\n\r\n pointerPosition.start.value = {\r\n x: centerX,\r\n y: centerY,\r\n };\r\n\r\n pointerPosition.current.value = {\r\n x: centerX,\r\n y: centerY,\r\n };\r\n\r\n pointerPosition.offset.pixel.value = {\r\n x: rect.width / 2,\r\n y: rect.height / 2,\r\n };\r\n\r\n pointerPosition.offset.percent.value = {\r\n x: 50,\r\n y: 50,\r\n };\r\n };\r\n\r\n const onKeyboardMove = () => {\r\n if (!pointerPosition.current.value) return;\r\n\r\n const currentX = pointerPosition.current.value.x;\r\n const currentY = pointerPosition.current.value.y;\r\n\r\n let newX = currentX;\r\n let newY = currentY;\r\n\r\n if (keyboard.w.value) newY -= moveStep;\r\n if (keyboard.s.value) newY += moveStep;\r\n if (keyboard.a.value) newX -= moveStep;\r\n if (keyboard.d.value) newX += moveStep;\r\n\r\n pointerPosition.current.value = {\r\n x: newX,\r\n y: newY,\r\n };\r\n };\r\n\r\n const onKeyboardEnd = () => {\r\n pointerPosition.current.value = null;\r\n pointerPosition.start.value = null;\r\n pointerPosition.offset.pixel.value = null;\r\n pointerPosition.offset.percent.value = null;\r\n };\r\n\r\n return {\r\n onKeyboardStart,\r\n onKeyboardMove,\r\n onKeyboardEnd,\r\n };\r\n};\r\n","import type { Ref } from 'vue';\r\nimport { getOffset } from '../utils/geometry';\r\nimport { useDnDStore } from './useDnDStore';\r\n\r\nexport const usePointer = (elementRef: Ref<HTMLElement | null>) => {\r\n const store = useDnDStore();\r\n\r\n const onPointerStart = (event: PointerEvent) => {\r\n store.pointerPosition.start.value = { x: event.clientX, y: event.clientY };\r\n store.pointerPosition.current.value = {\r\n x: event.clientX,\r\n y: event.clientY,\r\n };\r\n\r\n const { pixel, percent } = getOffset(elementRef.value, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n\r\n store.pointerPosition.offset.pixel.value = pixel;\r\n store.pointerPosition.offset.percent.value = percent;\r\n };\r\n\r\n const onPointerMove = (event: PointerEvent | WheelEvent) => {\r\n if (store.isPending.value) return;\r\n\r\n store.pointerPosition.current.value = {\r\n x: event.clientX,\r\n y: event.clientY,\r\n };\r\n };\r\n\r\n const onPointerEnd = () => {\r\n store.pointerPosition.current.value = null;\r\n store.pointerPosition.start.value = null;\r\n store.pointerPosition.offset.pixel.value = null;\r\n store.pointerPosition.offset.percent.value = null;\r\n };\r\n\r\n return {\r\n onPointerStart,\r\n onPointerMove,\r\n onPointerEnd,\r\n };\r\n};\r\n","import type {\r\n ICollisionDetectionResult,\r\n IDraggingElement,\r\n IUseDragOptions,\r\n} from '../types';\r\n\r\nimport type { Ref } from 'vue';\r\nimport { createPayload } from '../utils/events';\r\nimport { defaultCollisionDetection } from '../utils/sensor';\r\nimport { isDescendant } from '../utils/dom';\r\nimport { useDnDStore } from './useDnDStore';\r\nimport { useKeyboard } from './useKeyboard';\r\nimport { usePointer } from './usePointer';\r\nimport { useThrottleFn } from '@vueuse/core';\r\n\r\nexport const useSensor = (\r\n elementRef: Ref<HTMLElement | null>,\r\n options?: IUseDragOptions\r\n) => {\r\n const store = useDnDStore();\r\n\r\n const { onPointerStart, onPointerMove, onPointerEnd } =\r\n usePointer(elementRef);\r\n\r\n const { onKeyboardStart, onKeyboardMove, onKeyboardEnd } = useKeyboard(\r\n elementRef,\r\n options?.keyboard\r\n );\r\n\r\n let animationFrameId: number | null = null;\r\n\r\n const getDraggingElements = (\r\n draggableElement: HTMLElement | null\r\n ): Map<HTMLElement | Element, IDraggingElement> => {\r\n if (!draggableElement) return new Map();\r\n\r\n const isDraggableInSelection =\r\n store.selectedElements.value.has(draggableElement);\r\n\r\n if (store.selectedElements.value.size > 0 && isDraggableInSelection) {\r\n const result = new Map<HTMLElement | Element, IDraggingElement>();\r\n\r\n store.selectedElements.value.forEach((node) => {\r\n const element = store.elementsMap.value.get(node);\r\n if (!element) return;\r\n\r\n result.set(node, {\r\n ...element,\r\n initialHTML: element.node?.outerHTML ?? '',\r\n initialRect: element.node?.getBoundingClientRect(),\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n store.selectedElements.value.clear();\r\n\r\n const element = store.elementsMap.value.get(draggableElement);\r\n if (!element) return new Map();\r\n\r\n const result = new Map<HTMLElement | Element, IDraggingElement>();\r\n\r\n result.set(draggableElement, {\r\n ...element,\r\n initialHTML: element.node?.outerHTML ?? '',\r\n initialRect: element.node?.getBoundingClientRect(),\r\n });\r\n\r\n return result;\r\n };\r\n\r\n const validateCollisionResults = (\r\n htmlElements: HTMLElement | HTMLElement[] | Element | Element[] | null\r\n ) => {\r\n if (!htmlElements) {\r\n return { element: null, zone: null };\r\n }\r\n\r\n const elements = Array.isArray(htmlElements)\r\n ? htmlElements\r\n : [htmlElements];\r\n const activeDragNodes = Array.from(store.draggingElements.value.keys());\r\n\r\n const disabledZones = Array.from(store.zonesMap.value.entries()).flatMap(\r\n ([element, zone]) => (zone.disabled ? [element] : [])\r\n );\r\n\r\n const disabledElements = Array.from(\r\n store.elementsMap.value.entries()\r\n ).flatMap(([element, data]) => (data.disabled ? [element] : []));\r\n\r\n const filteredZoneElement = elements.find((htmlElement) => {\r\n if (!store.visibleZones.value.has(htmlElement)) return false;\r\n\r\n const zone = store.zonesMap.value.get(htmlElement);\r\n if (!zone) return false;\r\n\r\n if (zone.disabled) return false;\r\n\r\n const isInsideDisabledZone = disabledZones.some(\r\n (disabledZone) =>\r\n htmlElement === disabledZone ||\r\n isDescendant(htmlElement as HTMLElement, disabledZone as HTMLElement)\r\n );\r\n\r\n if (isInsideDisabledZone) return false;\r\n\r\n if (\r\n activeDragNodes.some(\r\n (dragNode) =>\r\n dragNode &&\r\n (dragNode === zone.node ||\r\n isDescendant(zone.node as HTMLElement, dragNode as HTMLElement))\r\n )\r\n )\r\n return false;\r\n\r\n if (zone.groups.length) {\r\n const isCompatible = !Array.from(\r\n store.draggingElements.value.values()\r\n ).some((element) => {\r\n if (!element.groups.length) return false;\r\n return !element.groups.some((group) => zone.groups.includes(group));\r\n });\r\n if (!isCompatible) return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n if (!filteredZoneElement) {\r\n return { element: null, zone: null };\r\n }\r\n\r\n const filteredElements = elements.filter((htmlElement) => {\r\n if (!store.visibleElements.value.has(htmlElement)) return false;\r\n if (!store.elementsMap.value.has(htmlElement)) return false;\r\n\r\n const element = store.elementsMap.value.get(htmlElement);\r\n if (element?.disabled) return false;\r\n\r\n const isInsideDisabledZone = disabledZones.some(\r\n (disabledZone) =>\r\n htmlElement === disabledZone ||\r\n isDescendant(htmlElement as HTMLElement, disabledZone as HTMLElement)\r\n );\r\n\r\n const isInsideDisabledElement = disabledElements.some(\r\n (disabledElement) =>\r\n htmlElement === disabledElement ||\r\n isDescendant(\r\n htmlElement as HTMLElement,\r\n disabledElement as HTMLElement\r\n )\r\n );\r\n\r\n if (isInsideDisabledZone || isInsideDisabledElement) return false;\r\n\r\n const isGroupsCompatible = !Array.from(\r\n store.draggingElements.value.values()\r\n ).some((element) => {\r\n if (!element.groups.length) return false;\r\n return !element.groups.some((group) =>\r\n store.elementsMap.value.get(htmlElement)?.groups.includes(group)\r\n );\r\n });\r\n\r\n return isGroupsCompatible;\r\n });\r\n\r\n const possibleElement = filteredElements.find((htmlElement) => {\r\n const isCompatible = !activeDragNodes.some(\r\n (dragNode) =>\r\n dragNode &&\r\n (dragNode === htmlElement ||\r\n isDescendant(htmlElement as HTMLElement, dragNode as HTMLElement) ||\r\n isDescendant(dragNode as HTMLElement, htmlElement as HTMLElement))\r\n );\r\n\r\n if (!isCompatible) return false;\r\n\r\n return (\r\n htmlElement === filteredZoneElement ||\r\n isDescendant(\r\n htmlElement as HTMLElement,\r\n filteredZoneElement as HTMLElement\r\n )\r\n );\r\n });\r\n\r\n return {\r\n element: possibleElement || null,\r\n zone: filteredZoneElement,\r\n };\r\n };\r\n\r\n const detectCollisions = options?.sensor?.setup || defaultCollisionDetection;\r\n\r\n const processCollisionResults = (results: ICollisionDetectionResult) => {\r\n const previousElement = store.hovered.element.value;\r\n const previousZone = store.hovered.zone.value;\r\n\r\n const newElement = results.element;\r\n const newZone = results.zone;\r\n\r\n store.hovered.element.value = newElement;\r\n store.hovered.zone.value = newZone;\r\n\r\n if (previousElement !== newElement) {\r\n if (previousElement) {\r\n store.elementsMap.value\r\n .get(previousElement)\r\n ?.events?.onLeave?.(store, createPayload(store));\r\n }\r\n\r\n if (newElement) {\r\n store.elementsMap.value\r\n .get(newElement)\r\n ?.events?.onHover?.(store, createPayload(store));\r\n }\r\n }\r\n\r\n if (previousZone !== newZone) {\r\n if (previousZone) {\r\n store.zonesMap.value\r\n .get(previousZone)\r\n ?.events?.onLeave?.(store, createPayload(store));\r\n }\r\n\r\n if (newZone) {\r\n store.zonesMap.value\r\n .get(newZone)\r\n ?.events?.onHover?.(store, createPayload(store));\r\n }\r\n }\r\n };\r\n\r\n const throttledDetectAndProcess = useThrottleFn(() => {\r\n const htmlElements = detectCollisions(store);\r\n const processedResults = validateCollisionResults(htmlElements);\r\n processCollisionResults(processedResults);\r\n }, options?.sensor?.throttle ?? 0);\r\n\r\n const animationLoop = () => {\r\n throttledDetectAndProcess();\r\n\r\n animationFrameId = requestAnimationFrame(animationLoop);\r\n };\r\n\r\n const startDetection = () => animationLoop();\r\n\r\n const stopDetection = () => {\r\n if (animationFrameId !== null) {\r\n onPointerEnd();\r\n onKeyboardEnd();\r\n cancelAnimationFrame(animationFrameId);\r\n animationFrameId = null;\r\n }\r\n };\r\n\r\n const activate = (event: PointerEvent | KeyboardEvent) => {\r\n store.draggingElements.value = getDraggingElements(elementRef.value);\r\n store.draggingElements.value.forEach((element) =>\r\n element.events.onStart?.(store, createPayload(store))\r\n );\r\n\r\n if (event instanceof PointerEvent) {\r\n onPointerStart(event);\r\n } else {\r\n onKeyboardStart(event);\r\n }\r\n\r\n startDetection();\r\n };\r\n\r\n const track = (event: PointerEvent | WheelEvent | KeyboardEvent) => {\r\n store.draggingElements.value.forEach((element) =>\r\n element.events.onMove?.(store, createPayload(store))\r\n );\r\n\r\n if (event instanceof KeyboardEvent) {\r\n onKeyboardMove();\r\n } else {\r\n onPointerMove(event);\r\n }\r\n };\r\n\r\n const deactivate = async (triggerEvents = true) => {\r\n if (store.hovered.zone.value) {\r\n const zone = store.zonesMap.value.get(store.hovered.zone.value);\r\n const result = zone?.events.onDrop?.(store, createPayload(store));\r\n\r\n if (result instanceof Promise) {\r\n try {\r\n store.isPending.value = true;\r\n\r\n const promiseResult = await result;\r\n\r\n if (promiseResult) {\r\n if (triggerEvents) store.selectedElements.value.clear();\r\n\r\n store.draggingElements.value.clear();\r\n\r\n store.hovered.zone.value = null;\r\n store.hovered.element.value = null;\r\n\r\n stopDetection();\r\n }\r\n\r\n return promiseResult;\r\n } catch {\r\n return false;\r\n } finally {\r\n store.isPending.value = false;\r\n }\r\n } else {\r\n if (triggerEvents) store.selectedElements.value.clear();\r\n\r\n store.draggingElements.value.clear();\r\n\r\n store.hovered.zone.value = null;\r\n store.hovered.element.value = null;\r\n\r\n stopDetection();\r\n }\r\n } else {\r\n store.draggingElements.value.forEach((element) =>\r\n element.events.onEnd?.(store, createPayload(store))\r\n );\r\n\r\n if (triggerEvents) store.selectedElements.value.clear();\r\n\r\n store.draggingElements.value.clear();\r\n\r\n store.hovered.zone.value = null;\r\n store.hovered.element.value = null;\r\n\r\n stopDetection();\r\n }\r\n };\r\n\r\n return {\r\n activate,\r\n track,\r\n deactivate,\r\n };\r\n};\r\n","import type { IUseDragOptions } from '../types';\r\nimport { Ref } from 'vue';\r\nimport { createGlobalState } from '@vueuse/core';\r\nimport { preventEvent } from '../utils/events';\r\nimport { useDnDStore } from '../composables/useDnDStore';\r\nimport { useSensor } from '../composables/useSensor';\r\n\r\nenum EKeyboardKey {\r\n ESCAPE = 'Escape',\r\n SPACE = 'Space',\r\n ENTER = 'Enter',\r\n W = 'KeyW',\r\n A = 'KeyA',\r\n S = 'KeyS',\r\n D = 'KeyD',\r\n CONTROL = 'ControlLeft',\r\n ALT = 'AltLeft',\r\n SHIFT = 'ShiftLeft',\r\n META = 'MetaLeft',\r\n}\r\n\r\nexport const useEventManager = createGlobalState(() => {\r\n let originalUserSelect = '';\r\n let originalTouchAction = '';\r\n let originalOverscrollBehavior = '';\r\n\r\n let currentMoveHandler: ((event: any) => void) | null = null;\r\n let currentEndHandler: (() => void) | null = null;\r\n let currentCancelHandler: (() => void) | null = null;\r\n let currentScrollHandler: ((event: WheelEvent) => void) | null = null;\r\n let currentKeyHandler: ((event: KeyboardEvent) => void) | null = null;\r\n\r\n const { activeContainer, isPending, elementsMap } = useDnDStore();\r\n\r\n 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 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 const clearAllListeners = () => {\r\n if (currentMoveHandler) {\r\n document.removeEventListener('pointermove', currentMoveHandler);\r\n currentMoveHandler = null;\r\n }\r\n\r\n if (currentEndHandler) {\r\n document.removeEventListener('pointerup', currentEndHandler);\r\n currentEndHandler = null;\r\n }\r\n\r\n if (currentCancelHandler) {\r\n currentCancelHandler = null;\r\n }\r\n\r\n if (currentScrollHandler) {\r\n document.removeEventListener('wheel', currentScrollHandler);\r\n currentScrollHandler = null;\r\n }\r\n\r\n if (currentKeyHandler) {\r\n document.removeEventListener('keydown', currentKeyHandler);\r\n document.removeEventListener('keypress', currentKeyHandler);\r\n document.removeEventListener('keyup', currentKeyHandler);\r\n currentKeyHandler = null;\r\n }\r\n };\r\n\r\n const handleDragStart = (\r\n event: PointerEvent | KeyboardEvent,\r\n elementRef: Ref<HTMLElement | null>,\r\n options?: IUseDragOptions\r\n ) => {\r\n if (!elementRef.value) return;\r\n if (isPending.value) return;\r\n\r\n const element = elementsMap.value.get(elementRef.value);\r\n if (element?.disabled) return;\r\n\r\n clearAllListeners();\r\n\r\n (event.target as HTMLElement).blur();\r\n\r\n if (options?.container) activeContainer.component.value = options.container;\r\n if (options?.containerProps) {\r\n activeContainer.props.value = options.containerProps;\r\n }\r\n\r\n const { activate, track, deactivate } = useSensor(elementRef, options);\r\n\r\n currentEndHandler = () => {\r\n deactivate(true).then((response) => {\r\n if (response === false) return;\r\n\r\n activeContainer.component.value = null;\r\n enableInteractions();\r\n deactivate(true);\r\n clearAllListeners();\r\n });\r\n };\r\n\r\n currentCancelHandler = () => {\r\n activeContainer.component.value = null;\r\n enableInteractions();\r\n deactivate(false);\r\n clearAllListeners();\r\n };\r\n\r\n currentMoveHandler = (event: PointerEvent | KeyboardEvent) => track(event);\r\n currentScrollHandler = (event: WheelEvent) => track(event);\r\n currentKeyHandler = (event: KeyboardEvent) => {\r\n if (event.type === 'keyup') {\r\n if (event.code === EKeyboardKey.ESCAPE) currentCancelHandler?.();\r\n if (event.code === EKeyboardKey.ENTER) currentEndHandler?.();\r\n }\r\n\r\n track(event);\r\n };\r\n\r\n disableInteractions();\r\n activate(event);\r\n\r\n document.addEventListener('pointermove', currentMoveHandler);\r\n document.addEventListener('pointerup', currentEndHandler);\r\n document.addEventListener('wheel', currentScrollHandler);\r\n document.addEventListener('keydown', currentKeyHandler);\r\n document.addEventListener('keypress', currentKeyHandler);\r\n document.addEventListener('keyup', currentKeyHandler);\r\n };\r\n\r\n return {\r\n handleDragStart,\r\n };\r\n});\r\n","import { onBeforeUnmount, onMounted } from 'vue';\r\n\r\nimport type { IUseDragOptions } from '../types';\r\nimport { useDnDStore } from './useDnDStore';\r\nimport { useElementManager } from '../managers/useElementManager';\r\nimport { useEventManager } from '../managers/useEventManager';\r\n\r\nexport const useDraggable = (options?: IUseDragOptions) => {\r\n const {\r\n id,\r\n elementRef,\r\n isDragging,\r\n isOvered,\r\n isAllowed,\r\n isLazyAllowed,\r\n registerElement,\r\n unregisterElement,\r\n } = useElementManager(options);\r\n\r\n const { pointerPosition } = useDnDStore();\r\n const { handleDragStart: start } = useEventManager();\r\n\r\n const handleDragStart = (event: PointerEvent | KeyboardEvent) =>\r\n start(event, elementRef, options);\r\n\r\n onMounted(registerElement);\r\n onBeforeUnmount(unregisterElement);\r\n\r\n return {\r\n pointerPosition,\r\n elementRef,\r\n isDragging,\r\n isOvered,\r\n isAllowed,\r\n isLazyAllowed,\r\n handleDragStart,\r\n id,\r\n };\r\n};\r\n","import { computed, ref } from 'vue';\r\n\r\nimport type { IUseDropOptions } from '../types';\r\nimport { useDnDStore } from '../composables/useDnDStore';\r\n\r\nexport const useZoneManager = (options?: IUseDropOptions) => {\r\n const {\r\n zonesMap,\r\n hovered,\r\n draggingElements,\r\n isDragging,\r\n handleDropZoneIntersection,\r\n } = useDnDStore();\r\n\r\n const elementRef = ref<HTMLElement | null>(null);\r\n\r\n const isOvered = computed<boolean>(\r\n () => hovered.zone.value === elementRef.value\r\n );\r\n\r\n const isAllowed = computed<boolean>(() => {\r\n if (!elementRef.value || !isDragging.value) return false;\r\n\r\n const currentZone = zonesMap.value.get(elementRef.value);\r\n if (!currentZone?.groups.length) return true;\r\n\r\n return !Array.from(draggingElements.value.values()).some((element) => {\r\n if (!element.groups.length) return false;\r\n return !element.groups.some((group) =>\r\n currentZone.groups.includes(group)\r\n );\r\n });\r\n });\r\n\r\n const isLazyAllowed = computed<boolean>(() => {\r\n if (!elementRef.value || !isDragging.value) return false;\r\n if (hovered.zone.value !== elementRef.value) return false;\r\n\r\n const currentZone = zonesMap.value.get(elementRef.value);\r\n if (!currentZone?.groups.length) return true;\r\n\r\n return !Array.from(draggingElements.value.values()).some((element) => {\r\n return !element.groups.some((group) =>\r\n currentZone.groups.includes(group)\r\n );\r\n });\r\n });\r\n\r\n const registerZone = () => {\r\n if (!elementRef.value) throw new Error('elementRef is not set');\r\n\r\n handleDropZoneIntersection('add', elementRef.value);\r\n\r\n zonesMap.value.set(elementRef.value, {\r\n node: elementRef.value,\r\n groups: options?.groups ?? [],\r\n events: options?.events ?? {},\r\n data: options?.data ?? undefined,\r\n disabled: (options?.disabled as boolean) ?? false,\r\n });\r\n\r\n elementRef.value.setAttribute('data-dnd-droppable', 'true');\r\n };\r\n\r\n const unregisterZone = () => {\r\n if (!elementRef.value) return;\r\n\r\n handleDropZoneIntersection('remove', elementRef.value);\r\n\r\n zonesMap.value.delete(elementRef.value);\r\n };\r\n\r\n return {\r\n elementRef,\r\n registerZone,\r\n unregisterZone,\r\n isOvered,\r\n isAllowed,\r\n isLazyAllowed,\r\n };\r\n};\r\n","import { onBeforeUnmount, onMounted } from 'vue';\r\n\r\nimport type { IUseDropOptions } from '../types';\r\nimport { useZoneManager } from '../managers/useZoneManager';\r\n\r\nexport const useDroppable = (options?: IUseDropOptions) => {\r\n const {\r\n elementRef,\r\n registerZone,\r\n unregisterZone,\r\n isOvered,\r\n isAllowed,\r\n isLazyAllowed,\r\n } = useZoneManager(options);\r\n\r\n // Register/unregister drop zone with store\r\n onMounted(registerZone);\r\n onBeforeUnmount(unregisterZone);\r\n\r\n return { elementRef, isOvered, isAllowed, isLazyAllowed };\r\n};\r\n","import { computed, type Ref } from 'vue';\r\nimport { useDnDStore } from './useDnDStore';\r\nimport { isDescendant } from '../utils/dom';\r\n\r\nexport const useSelection = (elementRef: Ref<HTMLElement | null>) => {\r\n const { selectedElements, elementsMap } = useDnDStore();\r\n\r\n const isSelected = computed<boolean>(() =>\r\n elementRef.value ? selectedElements.value.has(elementRef.value) : false\r\n );\r\n\r\n const isParentOfSelected = computed(() => {\r\n if (!elementRef.value) return false;\r\n\r\n for (const node of selectedElements.value) {\r\n if (\r\n node &&\r\n isDescendant(node as HTMLElement, elementRef.value as HTMLElement)\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n const hasSelectedParent = computed(() => {\r\n if (!elementRef.value) return false;\r\n\r\n for (const node of selectedElements.value) {\r\n if (\r\n node &&\r\n isDescendant(elementRef.value as HTMLElement, node as HTMLElement)\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n const handleUnselect = () => {\r\n if (!elementRef.value) return;\r\n selectedElements.value.delete(elementRef.value);\r\n };\r\n\r\n const handleSelect = () => {\r\n if (!elementRef.value) return;\r\n const element = elementsMap.value.get(elementRef.value);\r\n if (!element) return;\r\n\r\n if (isParentOfSelected.value) {\r\n // Удаляем все дочерние выбранные элементы\r\n for (const node of selectedElements.value) {\r\n if (\r\n node &&\r\n isDescendant(node as HTMLElement, elementRef.value as HTMLElement)\r\n ) {\r\n selectedElements.value.delete(node);\r\n }\r\n }\r\n }\r\n\r\n if (hasSelectedParent.value) {\r\n // Удаляем все родительские выбранные элементы\r\n for (const node of selectedElements.value) {\r\n if (\r\n node &&\r\n isDescendant(elementRef.value as HTMLElement, node as HTMLElement)\r\n ) {\r\n selectedElements.value.delete(node);\r\n }\r\n }\r\n }\r\n\r\n selectedElements.value.add(elementRef.value);\r\n };\r\n\r\n const handleToggleSelect = () => {\r\n if (!elementRef.value) return;\r\n\r\n selectedElements.value.has(elementRef.value)\r\n ? handleUnselect()\r\n : handleSelect();\r\n };\r\n\r\n return {\r\n handleUnselect,\r\n handleSelect,\r\n handleToggleSelect,\r\n isSelected,\r\n isParentOfSelected,\r\n };\r\n};\r\n"],"names":["_DnDOperations","__publicField","source","index","item","target","sourceIndex","targetIndex","sourceItem","targetItem","store","hoveredElement","hoveredZone","targetSource","_b","_a","_d","_c","firstElement","firstIndex","_e","sortDirection","a","b","element","_g","_f","_h","items","DnDOperations","useDnDStore","createGlobalState","isPending","shallowRef","draggingElements","ref","isDragging","computed","activeContainer","elementsMap","selectedElements","zonesMap","visibleZones","visibleElements","hasIntersectionObserver","elementObserver","entries","entry","zoneObserver","handleDragElementIntersection","action","handleDropZoneIntersection","pointerPosition","KeyW","KeyS","KeyA","KeyD","ctrl","shift","alt","meta","useMagicKeys","hovered","useDragContainer","options","elementRef","onMounted","onUnmounted","computedStyle","__props","props","overlay","DefaultOverlay","VueDndKitPlugin","app","DragOverlay","originalMount","rootContainer","instance","rootEl","overlayContainer","insertMethod","targetElement","vnode","createVNode","render","originalUnmount","checkCollision","boxA","boxB","getBoundingBox","rect","getCenter","box","getOffset","pointer","getDistance","pointA","pointB","dx","dy","getOverlapPercent","xOverlap","yOverlap","overlapArea","boxAArea","boxBArea","draggableDataName","preventEvent","event","createPayload","useElementManager","isDragStarted","isOvered","id","useId","disabled","isAllowed","currentElement","_","draggingElement","group","isLazyAllowed","isDescendant","container","defaultCollisionDetection","containerRect","containerCenter","pointerX","pointerY","shouldUseNormalPriority","activeDragNodes","allCollidingElements","node","elementCenter","isPointerInElement","overlapPercent","centerDistance","depth","parentNode","allCollidingZones","dragNode","zone","zoneCenter","useKeyboard","keyboard","moveStep","centerX","centerY","currentX","currentY","newX","newY","usePointer","pixel","percent","useSensor","onPointerStart","onPointerMove","onPointerEnd","onKeyboardStart","onKeyboardMove","onKeyboardEnd","animationFrameId","getDraggingElements","draggableElement","isDraggableInSelection","result","validateCollisionResults","htmlElements","elements","disabledZones","disabledElements","data","filteredZoneElement","htmlElement","disabledZone","isInsideDisabledZone","isInsideDisabledElement","disabledElement","detectCollisions","processCollisionResults","results","previousElement","previousZone","newElement","newZone","_i","_l","_k","_j","throttledDetectAndProcess","useThrottleFn","processedResults","animationLoop","startDetection","stopDetection","triggerEvents","promiseResult","useEventManager","originalUserSelect","originalTouchAction","originalOverscrollBehavior","currentMoveHandler","currentEndHandler","currentCancelHandler","currentScrollHandler","currentKeyHandler","disableInteractions","body","enableInteractions","clearAllListeners","activate","track","deactivate","response","useDraggable","registerElement","unregisterElement","start","handleDragStart","onBeforeUnmount","useZoneManager","currentZone","useDroppable","registerZone","unregisterZone","useSelection","isSelected","isParentOfSelected","hasSelectedParent","handleUnselect","handleSelect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vue-dnd-kit-core.cjs.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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"}
|