@vue-dnd-kit/core 0.5.8 → 1.0.0
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/LICENSE +21 -21
- package/README.md +306 -260
- package/dist/index.d.ts +9 -9
- package/dist/vue-dnd-kit-core.cjs.js.map +1 -1
- package/dist/vue-dnd-kit-core.es.js.map +1 -1
- package/package.json +73 -73
|
@@ -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';\n\nexport class DnDOperations {\n static remove = (source?: any[], index?: number) => {\n if (!source || index === undefined) return;\n const [item] = source.splice(index, 1);\n return item;\n };\n static insert = (target?: any[], index?: number, item?: any) => {\n if (!target || index === undefined) return;\n target.splice(index, 0, item);\n };\n static move = (\n source?: any[],\n sourceIndex?: number,\n target?: any[],\n targetIndex?: number\n ) => {\n if (\n !source ||\n !target ||\n sourceIndex === undefined ||\n targetIndex === undefined\n )\n return;\n const item = DnDOperations.remove(source, sourceIndex);\n DnDOperations.insert(target, targetIndex, item);\n };\n static swap = (\n source?: any[],\n sourceIndex?: number,\n target?: any[],\n targetIndex?: number\n ) => {\n if (\n !source ||\n !target ||\n sourceIndex === undefined ||\n targetIndex === undefined\n )\n return;\n\n const sourceItem = source[sourceIndex];\n const targetItem = target[targetIndex];\n\n source[sourceIndex] = targetItem;\n target[targetIndex] = sourceItem;\n };\n static copy = (\n source?: any[],\n index?: number,\n target?: any[],\n targetIndex?: number\n ) => {\n if (!source || index === undefined || !target || targetIndex === undefined)\n return;\n const item = source[index];\n DnDOperations.insert(target, targetIndex, item);\n };\n static applyTransfer = (store: IDnDStore) => {\n const hoveredElement = store.hovered.element.value;\n const hoveredZone = store.hovered.zone.value;\n\n if (hoveredElement) {\n store.draggingElements.value.forEach((element) =>\n DnDOperations.move(\n element.data?.source,\n element.data?.index,\n store.elementsMap.value.get(hoveredElement)?.data?.source,\n store.elementsMap.value.get(hoveredElement)?.data?.index\n )\n );\n } else if (hoveredZone) {\n store.draggingElements.value.forEach((element) =>\n DnDOperations.move(\n element.data?.source,\n element.data?.index,\n store.zonesMap.value.get(hoveredZone)?.data?.source,\n store.zonesMap.value.get(hoveredZone)?.data?.source?.length\n )\n );\n }\n };\n\n static applyCopy = (store: IDnDStore) => {\n const hoveredElement = store.hovered.element.value;\n const hoveredZone = store.hovered.zone.value;\n\n if (hoveredElement) {\n store.draggingElements.value.forEach((element) =>\n DnDOperations.copy(\n element.data?.source,\n element.data?.index,\n store.elementsMap.value.get(hoveredElement)?.data?.source,\n store.elementsMap.value.get(hoveredElement)?.data?.index\n )\n );\n } else if (hoveredZone) {\n store.draggingElements.value.forEach((element) =>\n DnDOperations.copy(\n element.data?.source,\n element.data?.index,\n store.zonesMap.value.get(hoveredZone)?.data?.source,\n store.zonesMap.value.get(hoveredZone)?.data?.source?.length\n )\n );\n }\n };\n static applySwap = (store: IDnDStore) => {\n const hoveredElement = store.hovered.element.value;\n const hoveredZone = store.hovered.zone.value;\n if (hoveredElement && store.draggingElements.value.size === 1) {\n const element = store.draggingElements.value.values().next().value;\n DnDOperations.swap(\n element?.data?.source,\n element?.data?.index,\n store.elementsMap.value.get(hoveredElement)?.data?.source,\n store.elementsMap.value.get(hoveredElement)?.data?.index\n );\n } else if (hoveredZone) {\n store.draggingElements.value.forEach((element) =>\n DnDOperations.move(\n element.data?.source,\n element.data?.index,\n store.zonesMap.value.get(hoveredZone)?.data?.source,\n store.zonesMap.value.get(hoveredZone)?.data?.source?.length\n )\n );\n }\n };\n static applyRemove = (store: IDnDStore) => {\n store.draggingElements.value.forEach((element) => {\n if (element.data?.source && element.data?.index !== undefined) {\n DnDOperations.remove(element.data.source, element.data.index);\n }\n });\n };\n static applyInsert = (store: IDnDStore, items: any[]) => {\n const hoveredElement = store.hovered.element.value;\n const hoveredZone = store.hovered.zone.value;\n if (hoveredElement && items.length > 0) {\n items.forEach((item) => {\n DnDOperations.insert(\n store.elementsMap.value.get(hoveredElement)?.data?.source,\n store.elementsMap.value.get(hoveredElement)?.data?.index,\n item\n );\n });\n } else if (hoveredZone) {\n items.forEach((item) => {\n DnDOperations.insert(\n store.zonesMap.value.get(hoveredZone)?.data?.source,\n store.zonesMap.value.get(hoveredZone)?.data?.source?.length,\n item\n );\n });\n }\n };\n}\n","import type {\n IDragElement,\n IDraggingElement,\n IDropZone,\n IPoint,\n} from '../types';\nimport { computed, ref, shallowRef, type Component, onUnmounted } from 'vue';\nimport { createGlobalState, useMagicKeys } from '@vueuse/core';\n\nexport const useDnDStore = createGlobalState(() => {\n const draggingElements = ref<Map<HTMLElement | Element, IDraggingElement>>(\n new Map()\n );\n const isDragging = computed<boolean>(() => draggingElements.value.size > 0);\n\n const activeContainer = {\n component: ref<Component | null>(null),\n ref: shallowRef<HTMLElement | null>(null),\n };\n\n const elementsMap = ref<Map<HTMLElement | Element, IDragElement>>(new Map());\n const selectedElementsMap = ref<Map<HTMLElement | Element, IDragElement>>(\n new Map()\n );\n const zonesMap = ref<Map<HTMLElement | Element, IDropZone>>(new Map());\n const visibleZones = ref<Set<HTMLElement | Element>>(new Set());\n const visibleElements = ref<Set<HTMLElement | Element>>(new Set());\n\n // Создаем IntersectionObserver для отслеживания видимости элементов\n const elementObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) =>\n visibleElements.value[entry.isIntersecting ? 'add' : 'delete'](\n entry.target\n )\n );\n });\n const zoneObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) =>\n visibleZones.value[entry.isIntersecting ? 'add' : 'delete'](entry.target)\n );\n });\n\n const handleDragElementIntersection = (\n action: 'add' | 'remove',\n element: HTMLElement | Element\n ) => {\n if (action === 'add') {\n elementObserver.observe(element);\n } else {\n elementObserver.unobserve(element);\n visibleElements.value.delete(element);\n }\n };\n\n const handleDropZoneIntersection = (\n action: 'add' | 'remove',\n element: HTMLElement | Element\n ) => {\n if (action === 'add') {\n zoneObserver.observe(element);\n } else {\n zoneObserver.unobserve(element);\n visibleZones.value.delete(element);\n }\n };\n\n onUnmounted(() => {\n elementObserver.disconnect();\n zoneObserver.disconnect();\n });\n\n const pointerPosition = {\n start: shallowRef<IPoint | null>(null),\n current: shallowRef<IPoint | null>(null),\n offset: {\n percent: shallowRef<IPoint | null>(null),\n pixel: shallowRef<IPoint | null>(null),\n },\n };\n\n const { w, s, a, d, ctrl, shift, alt, meta } = useMagicKeys();\n\n const hovered = {\n zone: shallowRef<HTMLElement | Element | null>(null),\n element: shallowRef<HTMLElement | Element | null>(null),\n };\n\n return {\n draggingElements,\n isDragging,\n activeContainer,\n elementsMap,\n selectedElementsMap,\n zonesMap,\n visibleZones,\n visibleElements,\n pointerPosition,\n keyboard: {\n w,\n s,\n a,\n d,\n ctrl,\n shift,\n alt,\n meta,\n },\n hovered,\n handleDragElementIntersection,\n handleDropZoneIntersection,\n };\n});\n","import { onBeforeUnmount, onMounted, ref } from 'vue';\n\nimport { useDnDStore } from './useDnDStore';\n\n/**\n * Hook for creating custom drag container with overlay management.\n * Provides functionality for controlling drag visualization and element positioning.\n *\n * This hook is typically used to create custom drag overlays, layers,\n * and control how dragged elements are displayed during drag operations.\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { computed } from 'vue';\n * import { useDragContainer } from '../composables/useDragContainer';\n *\n * const { elementRef, pointerPosition, isDragging, draggingElements } =\n * useDragContainer();\n *\n * const computedStyle = computed(() => ({\n * transform: `translate3d(${\n * (pointerPosition.current.value?.x ?? 0) -\n * (pointerPosition.offset.pixel.value?.x ?? 0)\n * }px, ${\n * (pointerPosition.current.value?.y ?? 0) -\n * (pointerPosition.offset.pixel.value?.y ?? 0)\n * }px, 0)`,\n * }));\n *</script>\n *\n *<template>\n * <Teleport to=\"body\">\n * <div\n * v-if=\"isDragging\"\n * ref=\"elementRef\"\n * :style=\"computedStyle\"\n * class=\"default-drag-overlay\"\n * >\n * <div\n * v-for=\"(element, index) in draggingElements\"\n * :key=\"index\"\n * v-html=\"element.initialHTML\"\n * :style=\"{\n * width: `${element.initialRect?.width}px`,\n * height: `${element.initialRect?.height}px`,\n * }\"\n * />\n * </div>\n * </Teleport>\n *</template>\n *\n *<style scoped>\n * .default-drag-overlay {\n * position: fixed;\n * top: 0;\n * left: 0;\n * background-color: rgba(0, 0, 0, 0.5);\n * transition: 0.3s cubic-bezier(0.165, 0.84, 0.44, 1);\n * z-index: 1000;\n * }\n *</style>\n *\n * ```\n *\n * @returns {Object} Container controls and state\n * @property {Ref<HTMLElement | null>} elementRef - Reference to be bound to container element\n * @property {Ref<IDragElement[]>} draggingElements - Currently dragged elements\n * @property {IPointerPosition} pointerPosition - Current pointer coordinates and offsets\n * @property {Ref<boolean>} isDragging - Whether drag operation is in progress\n */\nexport const useDragContainer = () => {\n const elementRef = ref<HTMLElement | null>(null);\n\n const { draggingElements, pointerPosition, isDragging, activeContainer } =\n useDnDStore();\n\n onMounted(() => {\n activeContainer.ref = elementRef;\n });\n\n onBeforeUnmount(() => {\n activeContainer.ref.value = null;\n });\n\n return {\n elementRef,\n draggingElements,\n pointerPosition,\n isDragging,\n };\n};\n","<script setup lang=\"ts\">\n import { computed, CSSProperties } from 'vue';\n import { useDragContainer } from '../composables/useDragContainer';\n\n const { elementRef, pointerPosition, isDragging, draggingElements } =\n useDragContainer();\n\n const computedStyle = computed<CSSProperties>(() => ({\n transform: `translate3d(${\n (pointerPosition.current.value?.x ?? 0) -\n (pointerPosition.offset.pixel.value?.x ?? 0)\n }px, ${\n (pointerPosition.current.value?.y ?? 0) -\n (pointerPosition.offset.pixel.value?.y ?? 0)\n }px, 0)`,\n zIndex: 1000,\n position: 'fixed',\n top: 0,\n left: 0,\n transition: '0.3s cubic-bezier(0.165, 0.84, 0.44, 1)',\n }));\n</script>\n\n<template>\n <div\n v-if=\"isDragging\"\n ref=\"elementRef\"\n :style=\"computedStyle\"\n >\n <div\n v-for=\"[_, element] in draggingElements\"\n :key=\"element.id\"\n v-html=\"element.initialHTML\"\n :style=\"{\n width: `${element.initialRect?.width}px`,\n height: `${element.initialRect?.height}px`,\n }\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from 'vue';\n import { useDnDStore } from '../composables/useDnDStore';\n import DefaultOverlay from './DefaultOverlay.vue';\n\n const { activeContainer } = useDnDStore();\n\n const overlay = computed(\n () => activeContainer.component.value ?? DefaultOverlay\n );\n</script>\n\n<template>\n <component :is=\"overlay\" />\n</template>\n","import { createVNode, render } from 'vue';\n\nimport type { App } from 'vue';\nimport DragOverlay from './components/DragOverlay.vue';\n\nexport const VueDndKitPlugin = {\n install(app: App) {\n app.component('DragOverlay', DragOverlay);\n const originalMount = app.mount;\n app.mount = function (rootContainer) {\n const instance = originalMount.call(this, rootContainer);\n\n const rootEl =\n typeof rootContainer === 'string'\n ? document.querySelector(rootContainer)\n : rootContainer;\n\n if (rootEl && rootEl instanceof Element) {\n if (!rootEl.querySelector('#vue-dnd-kit-overlay')) {\n const overlayContainer = document.createElement('div');\n\n overlayContainer.id = 'vue-dnd-kit-overlay';\n overlayContainer.style.pointerEvents = 'none';\n\n rootEl.appendChild(overlayContainer);\n const vnode = createVNode(DragOverlay);\n render(vnode, overlayContainer);\n app.__VUE_DND_KIT_OVERLAY__ = {\n container: overlayContainer,\n vnode,\n };\n }\n }\n\n return instance;\n };\n\n // Модифицируем метод unmount для очистки\n const originalUnmount = app.unmount;\n app.unmount = function () {\n if (app.__VUE_DND_KIT_OVERLAY__) {\n render(null, app.__VUE_DND_KIT_OVERLAY__.container);\n delete app.__VUE_DND_KIT_OVERLAY__;\n }\n return originalUnmount.call(this);\n };\n },\n};\n\ndeclare module '@vue/runtime-core' {\n export interface App {\n __VUE_DND_KIT_OVERLAY__?: {\n container: HTMLElement;\n vnode: any;\n };\n }\n}\n","import type { IBoundingBox, IPoint } from '../types';\n\nexport const checkCollision = (\n boxA: IBoundingBox,\n boxB: IBoundingBox\n): boolean => {\n return (\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 );\n};\n\nexport const getBoundingBox = (element: HTMLElement | null): IBoundingBox => {\n if (!element)\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n };\n\n const rect = element.getBoundingClientRect();\n\n return {\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n top: rect.top,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\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 getOffset = (element: HTMLElement | null, pointer: IPoint) => {\n const rect = getBoundingBox(element);\n return {\n pixel: {\n x: pointer.x - rect.x,\n y: pointer.y - rect.y,\n },\n percent: {\n x: ((pointer.x - rect.x) / rect.width) * 100,\n y: ((pointer.y - rect.y) / rect.height) * 100,\n },\n };\n};\n\nexport const getDistance = (pointA: IPoint, pointB: IPoint): number => {\n const dx = pointB.x - pointA.x;\n const dy = pointB.y - pointA.y;\n return Math.sqrt(dx * dx + dy * dy);\n};\n\nexport const getOverlapPercent = (\n boxA: IBoundingBox,\n boxB: IBoundingBox\n): number => {\n const xOverlap = Math.max(\n 0,\n Math.min(boxA.x + boxA.width, boxB.x + boxB.width) -\n 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) -\n Math.max(boxA.y, boxB.y)\n );\n\n const overlapArea = xOverlap * yOverlap;\n\n const boxAArea = boxA.width * boxA.height;\n const boxBArea = boxB.width * boxB.height;\n\n // Возвращаем среднее значение процентов перекрытия относительно обоих элементов\n return ((overlapArea / boxAArea) * 100 + (overlapArea / boxBArea) * 100) / 2;\n};\n","export const draggableDataName = 'data-vue-dnd-kit-draggable';\nexport const droppableDataName = 'data-vue-dnd-kit-droppable';\n","export const preventEvent = (event: Event) => {\n event.preventDefault();\n \n};\n\n","import { computed, ref, shallowRef, useId } from 'vue';\n\nimport type { IUseDragOptions } from '../types';\nimport { draggableDataName } from '../utils/namespaces';\nimport { preventEvent } from '../utils/events';\nimport { useDnDStore } from '../composables/useDnDStore';\n\nexport const useElementManager = (options?: IUseDragOptions) => {\n const {\n elementsMap,\n draggingElements,\n hovered,\n selectedElementsMap,\n isDragging: isDragStarted,\n visibleElements,\n handleDragElementIntersection,\n } = useDnDStore();\n\n const elementRef = ref<HTMLElement | null>(null);\n const isOvered = computed<boolean>(\n () =>\n visibleElements.value.has(elementRef.value as HTMLElement) &&\n hovered.element.value === elementRef.value\n );\n\n const id = shallowRef(options?.id || useId());\n\n const isDragging = computed<boolean>(() => {\n if (!elementRef.value) return false;\n if (!visibleElements.value.has(elementRef.value)) return false;\n return draggingElements.value.has(elementRef.value);\n });\n\n const isAllowed = computed<boolean>(() => {\n if (!elementRef.value) return false;\n if (!isDragStarted.value) return false;\n if (!visibleElements.value.has(elementRef.value)) return false;\n\n const currentElement = elementsMap.value.get(elementRef.value);\n if (!currentElement?.groups.length) return true;\n\n return !Array.from(draggingElements.value.entries()).some(\n ([_, draggingElement]) => {\n if (!draggingElement.groups.length) return false;\n return !draggingElement.groups.some((group) =>\n currentElement.groups.includes(group)\n );\n }\n );\n });\n\n const registerElement = () => {\n if (!elementRef.value) throw new Error('ElementRef is not set');\n\n elementsMap.value.set(elementRef.value, {\n node: elementRef.value,\n groups: options?.groups ?? [],\n layer: options?.layer ?? null,\n defaultLayer: options?.layer ?? null,\n events: options?.events ?? {},\n data: options?.data ?? null,\n id: id.value,\n });\n\n handleDragElementIntersection('add', elementRef.value);\n\n elementRef.value.addEventListener('dragstart', preventEvent);\n elementRef.value.addEventListener('drag', preventEvent);\n elementRef.value.setAttribute(draggableDataName, 'true');\n elementRef.value.setAttribute('draggable', 'false');\n };\n\n const unregisterElement = () => {\n if (!elementRef.value) return;\n\n handleDragElementIntersection('remove', elementRef.value);\n\n elementsMap.value.delete(elementRef.value);\n selectedElementsMap.value.delete(elementRef.value);\n\n elementRef.value.removeEventListener('dragstart', preventEvent);\n elementRef.value.removeEventListener('drag', preventEvent);\n elementRef.value.removeAttribute(draggableDataName);\n elementRef.value.removeAttribute('draggable');\n };\n\n return {\n elementRef,\n registerElement,\n unregisterElement,\n isDragging,\n isOvered,\n isAllowed,\n id,\n };\n};\n","export const isDescendant = (\n element: HTMLElement | Element | null,\n container: HTMLElement | Element\n): boolean => {\n if (!element) return false;\n return container.contains(element);\n};\n","import {\n checkCollision,\n getBoundingBox,\n getCenter,\n getDistance,\n getOverlapPercent,\n} from './geometry';\n\nimport { IDnDStore } from '../types';\nimport { isDescendant } from './dom';\n\nexport const defaultCollisionDetection = (store: IDnDStore) => {\n const containerRect = getBoundingBox(store.activeContainer.ref.value);\n const containerCenter = getCenter(containerRect);\n const pointerX = store.pointerPosition.current.value?.x ?? 0;\n const pointerY = store.pointerPosition.current.value?.y ?? 0;\n\n const isPointerInActiveContainer =\n containerRect &&\n pointerX >= containerRect.x &&\n pointerX <= containerRect.x + containerRect.width &&\n pointerY >= containerRect.y &&\n pointerY <= containerRect.y + containerRect.height;\n\n const shouldUseNormalPriority = !isPointerInActiveContainer;\n\n const activeDragNodes = Array.from(store.draggingElements.value.keys());\n\n const allCollidingElements = Array.from(store.visibleElements.value.entries())\n .filter(([node, _]) => {\n if (!node) return false;\n\n const rect = getBoundingBox(node as HTMLElement);\n return rect && containerRect && checkCollision(rect, containerRect);\n })\n .map(([node, element]) => {\n const rect = getBoundingBox(node as HTMLElement);\n const elementCenter = getCenter(rect);\n\n const isPointerInElement =\n pointerX >= rect.x &&\n pointerX <= rect.x + rect.width &&\n pointerY >= rect.y &&\n pointerY <= rect.y + rect.height;\n\n const overlapPercent = getOverlapPercent(rect, containerRect);\n const centerDistance = getDistance(containerCenter, elementCenter);\n\n // Вычисляем глубину вложенности\n let depth = 0;\n for (const [parentNode, _] of store.visibleElements.value.entries()) {\n if (\n parentNode !== node &&\n parentNode &&\n node &&\n isDescendant(node as HTMLElement, parentNode as HTMLElement)\n ) {\n depth++;\n }\n }\n\n return {\n element,\n node: node as HTMLElement,\n isPointerInElement,\n overlapPercent,\n depth,\n centerDistance,\n };\n })\n .sort((a, b) => {\n if (!shouldUseNormalPriority) {\n if (a.isPointerInElement && b.isPointerInElement)\n return b.depth - a.depth;\n if (a.isPointerInElement !== b.isPointerInElement)\n return a.isPointerInElement ? -1 : 1;\n }\n if (Math.abs(a.overlapPercent - b.overlapPercent) <= 1)\n return a.centerDistance - b.centerDistance;\n return b.overlapPercent - a.overlapPercent;\n });\n\n const allCollidingZones = Array.from(store.visibleZones.value.entries())\n .filter(([node, _]) => {\n if (\n !node ||\n activeDragNodes.some(\n (dragNode) =>\n dragNode &&\n isDescendant(node as HTMLElement, dragNode as HTMLElement)\n )\n )\n return false;\n\n const rect = getBoundingBox(node as HTMLElement);\n return rect && containerRect && checkCollision(rect, containerRect);\n })\n .map(([node, zone]) => {\n const rect = getBoundingBox(node as HTMLElement);\n const zoneCenter = getCenter(rect);\n\n const isPointerInElement =\n pointerX >= rect.x &&\n pointerX <= rect.x + rect.width &&\n pointerY >= rect.y &&\n pointerY <= rect.y + rect.height;\n\n const overlapPercent = getOverlapPercent(rect, containerRect);\n const centerDistance = getDistance(containerCenter, zoneCenter);\n\n // Вычисляем глубину вложенности\n let depth = 0;\n for (const [parentNode, _] of store.visibleZones.value.entries()) {\n if (\n parentNode !== node &&\n parentNode &&\n node &&\n isDescendant(node as HTMLElement, parentNode as HTMLElement)\n ) {\n depth++;\n }\n }\n\n return {\n zone,\n node: node as HTMLElement,\n isPointerInElement,\n overlapPercent,\n depth,\n centerDistance,\n };\n })\n .sort((a, b) => {\n if (!shouldUseNormalPriority) {\n if (a.isPointerInElement && b.isPointerInElement)\n return b.depth - a.depth;\n if (a.isPointerInElement !== b.isPointerInElement)\n return a.isPointerInElement ? -1 : 1;\n }\n if (Math.abs(a.overlapPercent - b.overlapPercent) <= 1)\n return a.centerDistance - b.centerDistance;\n return b.overlapPercent - a.overlapPercent;\n });\n\n return [\n ...allCollidingElements.map((item) => item.node),\n ...allCollidingZones.map((item) => item.node),\n ];\n};\n","import type { Ref } from 'vue';\nimport { getBoundingBox } from '../utils/geometry';\nimport { preventEvent } from '../utils/events';\nimport { useDnDStore } from './useDnDStore';\n\nexport interface IKeyboardOptions {\n moveStep?: number;\n}\n\nexport const useKeyboard = (\n elementRef: Ref<HTMLElement | null>,\n options?: IKeyboardOptions\n) => {\n const { pointerPosition, keyboard } = useDnDStore();\n const moveStep = options?.moveStep || 10;\n\n const onKeyboardStart = (event: KeyboardEvent) => {\n preventEvent(event);\n\n const rect = getBoundingBox(elementRef.value);\n\n elementRef.value?.blur();\n\n const centerX = rect.x + rect.width / 2;\n const centerY = rect.y + rect.height / 2;\n\n pointerPosition.start.value = {\n x: centerX,\n y: centerY,\n };\n\n pointerPosition.current.value = {\n x: centerX,\n y: centerY,\n };\n\n pointerPosition.offset.pixel.value = {\n x: rect.width / 2,\n y: rect.height / 2,\n };\n\n pointerPosition.offset.percent.value = {\n x: 50,\n y: 50,\n };\n };\n\n const onKeyboardMove = () => {\n if (!pointerPosition.current.value) return;\n\n const currentX = pointerPosition.current.value.x;\n const currentY = pointerPosition.current.value.y;\n\n let newX = currentX;\n let newY = currentY;\n\n if (keyboard.w.value) newY -= moveStep;\n if (keyboard.s.value) newY += moveStep;\n if (keyboard.a.value) newX -= moveStep;\n if (keyboard.d.value) newX += moveStep;\n\n pointerPosition.current.value = {\n x: newX,\n y: newY,\n };\n };\n\n const onKeyboardEnd = () => {\n pointerPosition.current.value = null;\n pointerPosition.start.value = null;\n pointerPosition.offset.pixel.value = null;\n pointerPosition.offset.percent.value = null;\n };\n\n return {\n onKeyboardStart,\n onKeyboardMove,\n onKeyboardEnd,\n };\n};\n","import type { Ref } from 'vue';\nimport { getOffset } from '../utils/geometry';\nimport { useDnDStore } from './useDnDStore';\n\nexport const usePointer = (elementRef: Ref<HTMLElement | null>) => {\n const store = useDnDStore();\n\n const onPointerStart = (event: PointerEvent) => {\n store.pointerPosition.start.value = { x: event.clientX, y: event.clientY };\n store.pointerPosition.current.value = {\n x: event.clientX,\n y: event.clientY,\n };\n\n const { pixel, percent } = getOffset(elementRef.value, {\n x: event.clientX,\n y: event.clientY,\n });\n\n store.pointerPosition.offset.pixel.value = pixel;\n store.pointerPosition.offset.percent.value = percent;\n };\n\n const onPointerMove = (event: PointerEvent | WheelEvent) => {\n store.pointerPosition.current.value = {\n x: event.clientX,\n y: event.clientY,\n };\n };\n\n const onPointerEnd = () => {\n store.pointerPosition.current.value = null;\n store.pointerPosition.start.value = null;\n store.pointerPosition.offset.pixel.value = null;\n store.pointerPosition.offset.percent.value = null;\n };\n\n return {\n onPointerStart,\n onPointerMove,\n onPointerEnd,\n };\n};\n","import type {\n ICollisionDetectionResult,\n IDraggingElement,\n IUseDragOptions,\n} from '../types';\n\nimport type { Ref } from 'vue';\nimport { defaultCollisionDetection } from '../utils/sensor';\nimport { isDescendant } from '../utils/dom';\nimport { useDnDStore } from './useDnDStore';\nimport { useKeyboard } from './useKeyboard';\nimport { usePointer } from './usePointer';\nimport { useThrottleFn } from '@vueuse/core';\n\nexport const useSensor = (\n elementRef: Ref<HTMLElement | null>,\n options?: IUseDragOptions\n) => {\n const store = useDnDStore();\n\n const { onPointerStart, onPointerMove, onPointerEnd } =\n usePointer(elementRef);\n\n const { onKeyboardStart, onKeyboardMove, onKeyboardEnd } = useKeyboard(\n elementRef,\n options?.keyboard\n );\n\n let animationFrameId: number | null = null;\n\n const getDraggingElements = (\n draggableElement: HTMLElement | null\n ): Map<HTMLElement | Element, IDraggingElement> => {\n if (!draggableElement) return new Map();\n\n const isDraggableInSelection =\n store.selectedElementsMap.value.has(draggableElement);\n\n if (store.selectedElementsMap.value.size > 0 && isDraggableInSelection) {\n const result = new Map<HTMLElement | Element, IDraggingElement>();\n\n Array.from(store.selectedElementsMap.value.entries()).forEach(\n ([node, element]) => {\n result.set(node, {\n ...element,\n initialHTML: element.node?.outerHTML ?? '',\n initialRect: element.node?.getBoundingClientRect(),\n });\n }\n );\n\n return result;\n }\n\n store.selectedElementsMap.value.clear();\n\n const element = store.elementsMap.value.get(draggableElement);\n if (!element) return new Map();\n\n const result = new Map<HTMLElement | Element, IDraggingElement>();\n result.set(draggableElement, {\n ...element,\n initialHTML: element.node?.outerHTML ?? '',\n initialRect: element.node?.getBoundingClientRect(),\n });\n\n return result;\n };\n\n const processUserCollisionResults = (\n htmlElements: HTMLElement | HTMLElement[] | Element | Element[] | null\n ) => {\n if (!htmlElements) {\n return { element: null, zone: null };\n }\n\n const elements = Array.isArray(htmlElements)\n ? htmlElements\n : [htmlElements];\n\n const activeDragNodes = Array.from(store.draggingElements.value.keys());\n\n const filteredZoneElement = elements.find((htmlElement) => {\n if (!store.visibleZones.value.has(htmlElement)) return false;\n\n const zone = store.zonesMap.value.get(htmlElement);\n if (!zone) return false;\n\n if (\n activeDragNodes.some(\n (dragNode) =>\n dragNode &&\n (dragNode === zone.node ||\n isDescendant(zone.node as HTMLElement, dragNode as HTMLElement))\n )\n )\n return false;\n\n if (zone.groups.length) {\n const isCompatible = !Array.from(\n store.draggingElements.value.values()\n ).some((element) => {\n if (!element.groups.length) return false;\n return !element.groups.some((group) => zone.groups.includes(group));\n });\n if (!isCompatible) return false;\n }\n\n return true;\n });\n\n if (!filteredZoneElement) {\n return { element: null, zone: null };\n }\n\n const possibleElement = elements.find(\n (htmlElement) =>\n store.visibleElements.value.has(htmlElement) &&\n store.elementsMap.value.has(htmlElement) &&\n !activeDragNodes.some(\n (dragNode) =>\n dragNode &&\n (dragNode === htmlElement ||\n isDescendant(\n htmlElement as HTMLElement,\n dragNode as HTMLElement\n ) ||\n isDescendant(dragNode as HTMLElement, htmlElement as HTMLElement))\n ) &&\n (htmlElement === filteredZoneElement ||\n isDescendant(\n htmlElement as HTMLElement,\n filteredZoneElement as HTMLElement\n ))\n );\n\n return {\n element: possibleElement || null,\n zone: filteredZoneElement,\n };\n };\n\n const detectCollisions = options?.sensor?.setup || defaultCollisionDetection;\n\n const processCollisionResults = (results: ICollisionDetectionResult) => {\n const previousElement = store.hovered.element.value;\n const previousZone = store.hovered.zone.value;\n\n store.hovered.element.value = results.element;\n store.hovered.zone.value = results.zone;\n\n if (previousElement) {\n if (store.hovered.element.value !== previousElement) {\n store.elementsMap.value.get(previousElement)?.events?.onLeave?.(store);\n\n if (store.hovered.element.value)\n store.elementsMap.value\n .get(store.hovered.element.value)\n ?.events?.onHover?.(store);\n }\n }\n\n if (previousZone) {\n if (store.hovered.zone.value !== previousZone) {\n store.zonesMap.value.get(previousZone)?.events?.onLeave?.(store);\n\n if (store.hovered.zone.value)\n store.zonesMap.value\n .get(store.hovered.zone.value)\n ?.events?.onHover?.(store);\n }\n }\n };\n\n const throttledDetectAndProcess = useThrottleFn(() => {\n const htmlElements = detectCollisions(store);\n const processedResults = processUserCollisionResults(htmlElements);\n processCollisionResults(processedResults);\n }, options?.sensor?.throttle ?? 0);\n\n const animationLoop = () => {\n throttledDetectAndProcess();\n\n animationFrameId = requestAnimationFrame(animationLoop);\n };\n\n const startDetection = () => animationLoop();\n\n const stopDetection = () => {\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId);\n animationFrameId = null;\n }\n };\n\n const activate = (event: PointerEvent | KeyboardEvent) => {\n store.draggingElements.value = getDraggingElements(elementRef.value);\n\n if (event instanceof PointerEvent) {\n onPointerStart(event);\n } else {\n onKeyboardStart(event);\n }\n\n startDetection();\n };\n\n const track = (event: PointerEvent | WheelEvent | KeyboardEvent) => {\n if (event instanceof KeyboardEvent) {\n onKeyboardMove();\n } else {\n onPointerMove(event);\n }\n };\n\n const deactivate = (triggerEvents = true) => {\n onPointerEnd();\n onKeyboardEnd();\n\n if (triggerEvents) {\n if (store.hovered.zone.value) {\n const zone = store.zonesMap.value.get(store.hovered.zone.value);\n zone?.events.onDrop?.(store);\n } else {\n Array.from(store.draggingElements.value.values()).forEach((element) =>\n element.events.onEnd?.(store)\n );\n }\n\n store.selectedElementsMap.value.clear();\n }\n store.draggingElements.value.clear();\n\n store.hovered.zone.value = null;\n store.hovered.element.value = null;\n\n stopDetection();\n };\n\n return {\n activate,\n track,\n deactivate,\n };\n};\n","import { Ref, markRaw } from 'vue';\n\nimport type { IUseDragOptions } from '../types';\nimport { createGlobalState } from '@vueuse/core';\nimport { preventEvent } from '../utils/events';\nimport { useDnDStore } from '../composables/useDnDStore';\nimport { useSensor } from '../composables/useSensor';\n\nenum EKeyboardKey {\n ESCAPE = 'Escape',\n SPACE = 'Space',\n ENTER = 'Enter',\n W = 'KeyW',\n A = 'KeyA',\n S = 'KeyS',\n D = 'KeyD',\n CONTROL = 'ControlLeft',\n ALT = 'AltLeft',\n SHIFT = 'ShiftLeft',\n META = 'MetaLeft',\n}\n\nexport const useEventManager = createGlobalState(() => {\n let originalUserSelect = '';\n let originalTouchAction = '';\n let originalOverscrollBehavior = '';\n\n let currentMoveHandler: ((event: any) => void) | null = null;\n let currentEndHandler: (() => void) | null = null;\n let currentCancelHandler: (() => void) | null = null;\n let currentScrollHandler: ((event: WheelEvent) => void) | null = null;\n let currentKeyHandler: ((event: KeyboardEvent) => void) | null = null;\n\n const { activeContainer } = useDnDStore();\n\n const disableInteractions = () => {\n const body = document.body;\n\n originalUserSelect = body.style.userSelect;\n\n body.style.userSelect = 'none';\n\n window.addEventListener('contextmenu', preventEvent);\n window.addEventListener('selectstart', preventEvent);\n window.addEventListener('touchstart', preventEvent);\n window.addEventListener('touchmove', preventEvent);\n };\n\n const enableInteractions = () => {\n const body = document.body;\n\n body.style.userSelect = originalUserSelect;\n body.style.touchAction = originalTouchAction;\n body.style.overscrollBehavior = originalOverscrollBehavior;\n\n window.removeEventListener('contextmenu', preventEvent);\n window.removeEventListener('selectstart', preventEvent);\n window.removeEventListener('touchstart', preventEvent);\n window.removeEventListener('touchmove', preventEvent);\n };\n\n const clearAllListeners = () => {\n if (currentMoveHandler) {\n document.removeEventListener('pointermove', currentMoveHandler);\n currentMoveHandler = null;\n }\n\n if (currentEndHandler) {\n document.removeEventListener('pointerup', currentEndHandler);\n currentEndHandler = null;\n }\n\n if (currentCancelHandler) {\n currentCancelHandler = null;\n }\n\n if (currentScrollHandler) {\n document.removeEventListener('wheel', currentScrollHandler);\n currentScrollHandler = null;\n }\n\n if (currentKeyHandler) {\n document.removeEventListener('keydown', currentKeyHandler);\n document.removeEventListener('keypress', currentKeyHandler);\n document.removeEventListener('keyup', currentKeyHandler);\n currentKeyHandler = null;\n }\n };\n\n const handleDragStart = (\n event: PointerEvent | KeyboardEvent,\n elementRef: Ref<HTMLElement | null>,\n options?: IUseDragOptions\n ) => {\n clearAllListeners();\n\n (event.target as HTMLElement).blur();\n\n if (options?.container)\n activeContainer.component.value = markRaw(options.container);\n\n const { activate, track, deactivate } = useSensor(elementRef, options);\n\n currentEndHandler = () => {\n activeContainer.component.value = null;\n enableInteractions();\n deactivate(true);\n clearAllListeners();\n };\n\n currentCancelHandler = () => {\n activeContainer.component.value = null;\n enableInteractions();\n deactivate(false);\n clearAllListeners();\n };\n\n currentMoveHandler = (event: PointerEvent | KeyboardEvent) => track(event);\n currentScrollHandler = (event: WheelEvent) => track(event);\n currentKeyHandler = (event: KeyboardEvent) => {\n if (event.type === 'keyup') {\n if (event.code === EKeyboardKey.ESCAPE) currentCancelHandler?.();\n if (event.code === EKeyboardKey.ENTER) currentEndHandler?.();\n }\n\n track(event);\n };\n\n disableInteractions();\n activate(event);\n\n document.addEventListener('pointermove', currentMoveHandler);\n document.addEventListener('pointerup', currentEndHandler);\n document.addEventListener('wheel', currentScrollHandler);\n document.addEventListener('keydown', currentKeyHandler);\n document.addEventListener('keypress', currentKeyHandler);\n document.addEventListener('keyup', currentKeyHandler);\n };\n\n return {\n handleDragStart,\n };\n});\n","import { onBeforeUnmount, onMounted } from 'vue';\n\nimport type { IUseDragOptions } from '../types';\nimport { useDnDStore } from './useDnDStore';\nimport { useElementManager } from '../managers/useElementManager';\nimport { useEventManager } from '../managers/useEventManager';\n\nexport const useDraggable = (options?: IUseDragOptions) => {\n const {\n id,\n elementRef,\n isDragging,\n isOvered,\n isAllowed,\n registerElement,\n unregisterElement,\n } = useElementManager(options);\n\n const { pointerPosition } = useDnDStore();\n const { handleDragStart: start } = useEventManager();\n\n const handleDragStart = (event: PointerEvent | KeyboardEvent) =>\n start(event, elementRef, options);\n\n onMounted(registerElement);\n onBeforeUnmount(unregisterElement);\n\n return {\n pointerPosition,\n elementRef,\n isDragging,\n isOvered,\n isAllowed,\n handleDragStart,\n id,\n };\n};\n","import { computed, ref } from 'vue';\n\nimport type { IUseDropOptions } from '../types';\nimport { useDnDStore } from '../composables/useDnDStore';\n\nexport const useZoneManager = (options?: IUseDropOptions) => {\n const {\n zonesMap,\n hovered,\n draggingElements,\n isDragging,\n handleDropZoneIntersection,\n } = useDnDStore();\n\n const elementRef = ref<HTMLElement | null>(null);\n\n const isOvered = computed<boolean>(() => {\n return hovered.zone.value === elementRef.value;\n });\n\n const isAllowed = computed<boolean>(() => {\n if (!elementRef.value || !isDragging.value) return false;\n\n const currentZone = zonesMap.value.get(elementRef.value);\n if (!currentZone?.groups.length) return true;\n\n return !Array.from(draggingElements.value.values()).some((element) => {\n if (!element.groups.length) return false;\n return !element.groups.some((group) =>\n currentZone.groups.includes(group)\n );\n });\n });\n\n const registerZone = () => {\n if (!elementRef.value) throw new Error('elementRef is not set');\n\n handleDropZoneIntersection('add', elementRef.value);\n\n zonesMap.value.set(elementRef.value, {\n node: elementRef.value,\n groups: options?.groups ?? [],\n events: options?.events ?? {},\n data: options?.data ?? undefined,\n });\n\n elementRef.value.setAttribute('data-dnd-droppable', 'true');\n };\n\n const unregisterZone = () => {\n if (!elementRef.value) return;\n\n handleDropZoneIntersection('remove', elementRef.value);\n\n zonesMap.value.delete(elementRef.value);\n };\n\n return { elementRef, registerZone, unregisterZone, isOvered, isAllowed };\n};\n","import { onBeforeUnmount, onMounted } from 'vue';\n\nimport type { IUseDropOptions } from '../types';\nimport { useZoneManager } from '../managers/useZoneManager';\n\n/**\n * Hook for creating drop zones that can accept dragged elements.\n * Manages drop zone registration and interaction states.\n *\n * @param options - Configuration options for drop zone\n * @param options.groups - Groups that this zone accepts. Elements can only be\n * dropped if they share at least one group with the zone\n * @param options.events - Event handlers for drop zone lifecycle\n * @param options.events.onDrop - Called when compatible element is dropped\n * @param options.events.onHover - Called when compatible element hovers\n * @param options.events.onLeave - Called when element leaves zone\n * @param options.data - Custom data accessible in event handlers\n *\n * @returns Object containing:\n * - elementRef: Reference to be bound to drop zone element\n * - isOvered: Whether zone is currently being hovered by dragged element\n * - isAllowed: Whether currently dragged element can be dropped (groups match)\n *\n * @example\n * ```vue\n * <template>\n * <div\n * ref=\"elementRef\"\n * :class=\"{\n * 'drop-zone': true,\n * 'zone-hovered': isOvered,\n * 'drop-allowed': isAllowed && isOvered,\n * 'drop-forbidden': !isAllowed && isOvered\n * }\"\n * >\n * <slot />\n * </div>\n * </template>\n *\n * <script setup lang=\"ts\">\n * const { elementRef, isOvered, isAllowed } = useDrop({\n * // Зона принимает только элементы из группы 'items'\n * groups: ['items'],\n * events: {\n * onDrop: (store) => {\n * const droppedElements = store.draggingElements.value;\n * console.log('Elements dropped!', droppedElements);\n * },\n * onHover: (store) => {\n * // Подсветка зоны при наведении совместимого элемента\n * if (isAllowed.value) {\n * console.log('Compatible element hovering!');\n * }\n * },\n * onLeave: () => {\n * console.log('Element left drop zone');\n * }\n * },\n * // Пользовательские данные доступны в обработчиках\n * data: {\n * zoneId: 'main-drop-zone',\n * acceptLimit: 5\n * }\n * });\n * </script>\n *\n * <style scoped>\n * .drop-zone {\n * border: 2px dashed #ccc;\n * padding: 20px;\n * transition: all 0.3s;\n * }\n *\n * .zone-hovered {\n * background: #f0f0f0;\n * }\n *\n * .drop-allowed {\n * border-color: #4CAF50;\n * background: #E8F5E9;\n * }\n *\n * .drop-forbidden {\n * border-color: #F44336;\n * background: #FFEBEE;\n * }\n * </style>\n * ```\n */\nexport const useDroppable = (options?: IUseDropOptions) => {\n const { elementRef, registerZone, unregisterZone, isOvered, isAllowed } =\n useZoneManager(options);\n\n // Register/unregister drop zone with store\n onMounted(registerZone);\n onBeforeUnmount(unregisterZone);\n\n return { elementRef, isOvered, isAllowed };\n};\n","import { computed, type Ref } from 'vue';\nimport { useDnDStore } from './useDnDStore';\nimport { isDescendant } from '../utils/dom';\n\nexport const useSelection = (elementRef: Ref<HTMLElement | null>) => {\n const { selectedElementsMap, elementsMap } = useDnDStore();\n\n const isSelected = computed<boolean>(() =>\n elementRef.value ? selectedElementsMap.value.has(elementRef.value) : false\n );\n\n const isParentOfSelected = computed(() => {\n if (!elementRef.value) return false;\n\n for (const [node, _] of selectedElementsMap.value.entries()) {\n if (\n node &&\n isDescendant(node as HTMLElement, elementRef.value as HTMLElement)\n ) {\n return true;\n }\n }\n return false;\n });\n\n const hasSelectedParent = computed(() => {\n if (!elementRef.value) return false;\n\n for (const [node, _] of selectedElementsMap.value.entries()) {\n if (\n node &&\n isDescendant(elementRef.value as HTMLElement, node as HTMLElement)\n ) {\n return true;\n }\n }\n return false;\n });\n\n const handleUnselect = () => {\n if (!elementRef.value) return;\n selectedElementsMap.value.delete(elementRef.value);\n };\n\n const handleSelect = () => {\n if (!elementRef.value) return;\n const element = elementsMap.value.get(elementRef.value);\n if (!element) return;\n\n if (isParentOfSelected.value) {\n // Удаляем все дочерние выбранные элементы\n for (const [node, _] of [...selectedElementsMap.value.entries()]) {\n if (\n node &&\n isDescendant(node as HTMLElement, elementRef.value as HTMLElement)\n ) {\n selectedElementsMap.value.delete(node);\n }\n }\n }\n\n if (hasSelectedParent.value) {\n // Удаляем все родительские выбранные элементы\n for (const [node, _] of [...selectedElementsMap.value.entries()]) {\n if (\n node &&\n isDescendant(elementRef.value as HTMLElement, node as HTMLElement)\n ) {\n selectedElementsMap.value.delete(node);\n }\n }\n }\n\n selectedElementsMap.value.set(elementRef.value, element);\n };\n\n const handleToggleSelect = () => {\n if (!elementRef.value) return;\n\n selectedElementsMap.value.has(elementRef.value)\n ? handleUnselect()\n : handleSelect();\n };\n\n return {\n handleUnselect,\n handleSelect,\n handleToggleSelect,\n isSelected,\n isParentOfSelected,\n };\n};\n"],"names":["_DnDOperations","__publicField","source","index","item","target","sourceIndex","targetIndex","sourceItem","targetItem","store","hoveredElement","hoveredZone","element","_a","_b","_d","_c","_f","_e","_g","items","DnDOperations","useDnDStore","createGlobalState","draggingElements","ref","isDragging","computed","activeContainer","shallowRef","elementsMap","selectedElementsMap","zonesMap","visibleZones","visibleElements","elementObserver","entries","entry","zoneObserver","handleDragElementIntersection","action","handleDropZoneIntersection","onUnmounted","pointerPosition","w","s","a","d","ctrl","shift","alt","meta","useMagicKeys","hovered","useDragContainer","elementRef","onMounted","onBeforeUnmount","computedStyle","overlay","DefaultOverlay","VueDndKitPlugin","app","DragOverlay","originalMount","rootContainer","instance","rootEl","overlayContainer","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","useElementManager","options","isDragStarted","isOvered","id","useId","isAllowed","currentElement","_","draggingElement","group","isDescendant","container","defaultCollisionDetection","containerRect","containerCenter","pointerX","pointerY","shouldUseNormalPriority","activeDragNodes","allCollidingElements","node","elementCenter","isPointerInElement","overlapPercent","centerDistance","depth","parentNode","b","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","processUserCollisionResults","htmlElements","elements","filteredZoneElement","htmlElement","detectCollisions","processCollisionResults","results","previousElement","previousZone","_i","_h","_l","_k","_j","throttledDetectAndProcess","useThrottleFn","processedResults","animationLoop","startDetection","stopDetection","triggerEvents","useEventManager","originalUserSelect","originalTouchAction","originalOverscrollBehavior","currentMoveHandler","currentEndHandler","currentCancelHandler","currentScrollHandler","currentKeyHandler","disableInteractions","body","enableInteractions","clearAllListeners","markRaw","activate","track","deactivate","useDraggable","registerElement","unregisterElement","start","handleDragStart","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/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 store.draggingElements.value.forEach((element) =>\r\n DnDOperations.move(\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 );\r\n } else if (hoveredZone) {\r\n store.draggingElements.value.forEach((element) =>\r\n DnDOperations.move(\r\n element.data?.source,\r\n element.data?.index,\r\n store.zonesMap.value.get(hoveredZone)?.data?.source,\r\n store.zonesMap.value.get(hoveredZone)?.data?.source?.length\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 store.draggingElements.value.forEach((element) =>\r\n DnDOperations.copy(\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 );\r\n } else if (hoveredZone) {\r\n store.draggingElements.value.forEach((element) =>\r\n DnDOperations.copy(\r\n element.data?.source,\r\n element.data?.index,\r\n store.zonesMap.value.get(hoveredZone)?.data?.source,\r\n store.zonesMap.value.get(hoveredZone)?.data?.source?.length\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 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 store.draggingElements.value.forEach((element) =>\r\n DnDOperations.move(\r\n element.data?.source,\r\n element.data?.index,\r\n store.zonesMap.value.get(hoveredZone)?.data?.source,\r\n store.zonesMap.value.get(hoveredZone)?.data?.source?.length\r\n )\r\n );\r\n }\r\n };\r\n static applyRemove = (store: IDnDStore) => {\r\n store.draggingElements.value.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 if (hoveredElement && items.length > 0) {\r\n items.forEach((item) => {\r\n DnDOperations.insert(\r\n store.elementsMap.value.get(hoveredElement)?.data?.source,\r\n store.elementsMap.value.get(hoveredElement)?.data?.index,\r\n item\r\n );\r\n });\r\n } else if (hoveredZone) {\r\n items.forEach((item) => {\r\n DnDOperations.insert(\r\n store.zonesMap.value.get(hoveredZone)?.data?.source,\r\n store.zonesMap.value.get(hoveredZone)?.data?.source?.length,\r\n item\r\n );\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 { computed, ref, shallowRef, type Component, onUnmounted } from 'vue';\r\nimport { createGlobalState, useMagicKeys } from '@vueuse/core';\r\n\r\nexport const useDnDStore = createGlobalState(() => {\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 };\r\n\r\n const elementsMap = ref<Map<HTMLElement | Element, IDragElement>>(new Map());\r\n const selectedElementsMap = ref<Map<HTMLElement | Element, IDragElement>>(\r\n new Map()\r\n );\r\n const zonesMap = ref<Map<HTMLElement | Element, IDropZone>>(new Map());\r\n const visibleZones = ref<Set<HTMLElement | Element>>(new Set());\r\n const visibleElements = ref<Set<HTMLElement | Element>>(new Set());\r\n\r\n // Создаем IntersectionObserver для отслеживания видимости элементов\r\n const elementObserver = 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 const zoneObserver = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) =>\r\n visibleZones.value[entry.isIntersecting ? 'add' : 'delete'](entry.target)\r\n );\r\n });\r\n\r\n const handleDragElementIntersection = (\r\n action: 'add' | 'remove',\r\n element: HTMLElement | Element\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 (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 onUnmounted(() => {\r\n elementObserver.disconnect();\r\n zoneObserver.disconnect();\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 { w, s, a, d, 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 selectedElementsMap,\r\n zonesMap,\r\n visibleZones,\r\n visibleElements,\r\n pointerPosition,\r\n keyboard: {\r\n w,\r\n s,\r\n a,\r\n d,\r\n ctrl,\r\n shift,\r\n alt,\r\n meta,\r\n },\r\n hovered,\r\n handleDragElementIntersection,\r\n handleDropZoneIntersection,\r\n };\r\n});\r\n","import { onBeforeUnmount, onMounted, ref } from 'vue';\r\n\r\nimport { useDnDStore } from './useDnDStore';\r\n\r\n/**\r\n * Hook for creating custom drag container with overlay management.\r\n * Provides functionality for controlling drag visualization and element positioning.\r\n *\r\n * This hook is typically used to create custom drag overlays, layers,\r\n * and control how dragged elements are displayed during drag operations.\r\n *\r\n * @example\r\n * ```vue\r\n * <script setup lang=\"ts\">\r\n * import { computed } 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 computedStyle = computed(() => ({\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 * }));\r\n *</script>\r\n *\r\n *<template>\r\n * <Teleport to=\"body\">\r\n * <div\r\n * v-if=\"isDragging\"\r\n * ref=\"elementRef\"\r\n * :style=\"computedStyle\"\r\n * class=\"default-drag-overlay\"\r\n * >\r\n * <div\r\n * v-for=\"(element, index) in draggingElements\"\r\n * :key=\"index\"\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 * </div>\r\n * </Teleport>\r\n *</template>\r\n *\r\n *<style scoped>\r\n * .default-drag-overlay {\r\n * position: fixed;\r\n * top: 0;\r\n * left: 0;\r\n * background-color: rgba(0, 0, 0, 0.5);\r\n * transition: 0.3s cubic-bezier(0.165, 0.84, 0.44, 1);\r\n * z-index: 1000;\r\n * }\r\n *</style>\r\n *\r\n * ```\r\n *\r\n * @returns {Object} Container controls and state\r\n * @property {Ref<HTMLElement | null>} elementRef - Reference to be bound to container element\r\n * @property {Ref<IDragElement[]>} draggingElements - Currently dragged elements\r\n * @property {IPointerPosition} pointerPosition - Current pointer coordinates and offsets\r\n * @property {Ref<boolean>} isDragging - Whether drag operation is in progress\r\n */\r\nexport const useDragContainer = () => {\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 });\r\n\r\n onBeforeUnmount(() => {\r\n activeContainer.ref.value = null;\r\n });\r\n\r\n return {\r\n elementRef,\r\n draggingElements,\r\n pointerPosition,\r\n isDragging,\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 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 }));\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 <div\r\n v-for=\"[_, element] in draggingElements\"\r\n :key=\"element.id\"\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 </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\n import { computed } from 'vue';\r\n import { useDnDStore } from '../composables/useDnDStore';\r\n import DefaultOverlay from './DefaultOverlay.vue';\r\n\r\n const { activeContainer } = useDnDStore();\r\n\r\n const overlay = computed(\r\n () => activeContainer.component.value ?? DefaultOverlay\r\n );\r\n</script>\r\n\r\n<template>\r\n <component :is=\"overlay\" />\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\n\r\nexport const VueDndKitPlugin = {\r\n install(app: App) {\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 rootEl.appendChild(overlayContainer);\r\n const vnode = createVNode(DragOverlay);\r\n render(vnode, overlayContainer);\r\n app.__VUE_DND_KIT_OVERLAY__ = {\r\n container: overlayContainer,\r\n vnode,\r\n };\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 };\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","export const preventEvent = (event: Event) => {\r\n event.preventDefault();\r\n \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 selectedElementsMap,\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 () =>\r\n visibleElements.value.has(elementRef.value as HTMLElement) &&\r\n hovered.element.value === elementRef.value\r\n );\r\n\r\n const id = shallowRef(options?.id || useId());\r\n\r\n const isDragging = computed<boolean>(() => {\r\n if (!elementRef.value) return false;\r\n if (!visibleElements.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 (!elementRef.value) return false;\r\n if (!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 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 ?? [],\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 });\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 handleDragElementIntersection('remove', elementRef.value);\r\n\r\n elementsMap.value.delete(elementRef.value);\r\n selectedElementsMap.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 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 // Вычисляем глубину вложенности\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 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 { 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.selectedElementsMap.value.has(draggableElement);\r\n\r\n if (store.selectedElementsMap.value.size > 0 && isDraggableInSelection) {\r\n const result = new Map<HTMLElement | Element, IDraggingElement>();\r\n\r\n Array.from(store.selectedElementsMap.value.entries()).forEach(\r\n ([node, element]) => {\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\r\n return result;\r\n }\r\n\r\n store.selectedElementsMap.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 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 processUserCollisionResults = (\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\r\n const activeDragNodes = Array.from(store.draggingElements.value.keys());\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 (\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 possibleElement = elements.find(\r\n (htmlElement) =>\r\n store.visibleElements.value.has(htmlElement) &&\r\n store.elementsMap.value.has(htmlElement) &&\r\n !activeDragNodes.some(\r\n (dragNode) =>\r\n dragNode &&\r\n (dragNode === htmlElement ||\r\n isDescendant(\r\n htmlElement as HTMLElement,\r\n dragNode as HTMLElement\r\n ) ||\r\n isDescendant(dragNode as HTMLElement, htmlElement as HTMLElement))\r\n ) &&\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 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 store.hovered.element.value = results.element;\r\n store.hovered.zone.value = results.zone;\r\n\r\n if (previousElement) {\r\n if (store.hovered.element.value !== previousElement) {\r\n store.elementsMap.value.get(previousElement)?.events?.onLeave?.(store);\r\n\r\n if (store.hovered.element.value)\r\n store.elementsMap.value\r\n .get(store.hovered.element.value)\r\n ?.events?.onHover?.(store);\r\n }\r\n }\r\n\r\n if (previousZone) {\r\n if (store.hovered.zone.value !== previousZone) {\r\n store.zonesMap.value.get(previousZone)?.events?.onLeave?.(store);\r\n\r\n if (store.hovered.zone.value)\r\n store.zonesMap.value\r\n .get(store.hovered.zone.value)\r\n ?.events?.onHover?.(store);\r\n }\r\n }\r\n };\r\n\r\n const throttledDetectAndProcess = useThrottleFn(() => {\r\n const htmlElements = detectCollisions(store);\r\n const processedResults = processUserCollisionResults(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 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\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 if (event instanceof KeyboardEvent) {\r\n onKeyboardMove();\r\n } else {\r\n onPointerMove(event);\r\n }\r\n };\r\n\r\n const deactivate = (triggerEvents = true) => {\r\n onPointerEnd();\r\n onKeyboardEnd();\r\n\r\n if (triggerEvents) {\r\n if (store.hovered.zone.value) {\r\n const zone = store.zonesMap.value.get(store.hovered.zone.value);\r\n zone?.events.onDrop?.(store);\r\n } else {\r\n Array.from(store.draggingElements.value.values()).forEach((element) =>\r\n element.events.onEnd?.(store)\r\n );\r\n }\r\n\r\n store.selectedElementsMap.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 {\r\n activate,\r\n track,\r\n deactivate,\r\n };\r\n};\r\n","import { Ref, markRaw } from 'vue';\r\n\r\nimport type { IUseDragOptions } from '../types';\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 } = 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 clearAllListeners();\r\n\r\n (event.target as HTMLElement).blur();\r\n\r\n if (options?.container)\r\n activeContainer.component.value = markRaw(options.container);\r\n\r\n const { activate, track, deactivate } = useSensor(elementRef, options);\r\n\r\n currentEndHandler = () => {\r\n activeContainer.component.value = null;\r\n enableInteractions();\r\n deactivate(true);\r\n clearAllListeners();\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 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 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 return 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 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 });\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 { elementRef, registerZone, unregisterZone, isOvered, isAllowed };\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\n/**\r\n * Hook for creating drop zones that can accept dragged elements.\r\n * Manages drop zone registration and interaction states.\r\n *\r\n * @param options - Configuration options for drop zone\r\n * @param options.groups - Groups that this zone accepts. Elements can only be\r\n * dropped if they share at least one group with the zone\r\n * @param options.events - Event handlers for drop zone lifecycle\r\n * @param options.events.onDrop - Called when compatible element is dropped\r\n * @param options.events.onHover - Called when compatible element hovers\r\n * @param options.events.onLeave - Called when element leaves zone\r\n * @param options.data - Custom data accessible in event handlers\r\n *\r\n * @returns Object containing:\r\n * - elementRef: Reference to be bound to drop zone element\r\n * - isOvered: Whether zone is currently being hovered by dragged element\r\n * - isAllowed: Whether currently dragged element can be dropped (groups match)\r\n *\r\n * @example\r\n * ```vue\r\n * <template>\r\n * <div\r\n * ref=\"elementRef\"\r\n * :class=\"{\r\n * 'drop-zone': true,\r\n * 'zone-hovered': isOvered,\r\n * 'drop-allowed': isAllowed && isOvered,\r\n * 'drop-forbidden': !isAllowed && isOvered\r\n * }\"\r\n * >\r\n * <slot />\r\n * </div>\r\n * </template>\r\n *\r\n * <script setup lang=\"ts\">\r\n * const { elementRef, isOvered, isAllowed } = useDrop({\r\n * // Зона принимает только элементы из группы 'items'\r\n * groups: ['items'],\r\n * events: {\r\n * onDrop: (store) => {\r\n * const droppedElements = store.draggingElements.value;\r\n * console.log('Elements dropped!', droppedElements);\r\n * },\r\n * onHover: (store) => {\r\n * // Подсветка зоны при наведении совместимого элемента\r\n * if (isAllowed.value) {\r\n * console.log('Compatible element hovering!');\r\n * }\r\n * },\r\n * onLeave: () => {\r\n * console.log('Element left drop zone');\r\n * }\r\n * },\r\n * // Пользовательские данные доступны в обработчиках\r\n * data: {\r\n * zoneId: 'main-drop-zone',\r\n * acceptLimit: 5\r\n * }\r\n * });\r\n * </script>\r\n *\r\n * <style scoped>\r\n * .drop-zone {\r\n * border: 2px dashed #ccc;\r\n * padding: 20px;\r\n * transition: all 0.3s;\r\n * }\r\n *\r\n * .zone-hovered {\r\n * background: #f0f0f0;\r\n * }\r\n *\r\n * .drop-allowed {\r\n * border-color: #4CAF50;\r\n * background: #E8F5E9;\r\n * }\r\n *\r\n * .drop-forbidden {\r\n * border-color: #F44336;\r\n * background: #FFEBEE;\r\n * }\r\n * </style>\r\n * ```\r\n */\r\nexport const useDroppable = (options?: IUseDropOptions) => {\r\n const { elementRef, registerZone, unregisterZone, isOvered, isAllowed } =\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 };\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 { selectedElementsMap, elementsMap } = useDnDStore();\r\n\r\n const isSelected = computed<boolean>(() =>\r\n elementRef.value ? selectedElementsMap.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 selectedElementsMap.value.entries()) {\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 selectedElementsMap.value.entries()) {\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 selectedElementsMap.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 [...selectedElementsMap.value.entries()]) {\r\n if (\r\n node &&\r\n isDescendant(node as HTMLElement, elementRef.value as HTMLElement)\r\n ) {\r\n selectedElementsMap.value.delete(node);\r\n }\r\n }\r\n }\r\n\r\n if (hasSelectedParent.value) {\r\n // Удаляем все родительские выбранные элементы\r\n for (const [node, _] of [...selectedElementsMap.value.entries()]) {\r\n if (\r\n node &&\r\n isDescendant(elementRef.value as HTMLElement, node as HTMLElement)\r\n ) {\r\n selectedElementsMap.value.delete(node);\r\n }\r\n }\r\n }\r\n\r\n selectedElementsMap.value.set(elementRef.value, element);\r\n };\r\n\r\n const handleToggleSelect = () => {\r\n if (!elementRef.value) return;\r\n\r\n selectedElementsMap.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","element","_a","_b","_d","_c","_f","_e","_g","items","DnDOperations","useDnDStore","createGlobalState","draggingElements","ref","isDragging","computed","activeContainer","shallowRef","elementsMap","selectedElementsMap","zonesMap","visibleZones","visibleElements","elementObserver","entries","entry","zoneObserver","handleDragElementIntersection","action","handleDropZoneIntersection","onUnmounted","pointerPosition","w","s","a","d","ctrl","shift","alt","meta","useMagicKeys","hovered","useDragContainer","elementRef","onMounted","onBeforeUnmount","computedStyle","overlay","DefaultOverlay","VueDndKitPlugin","app","DragOverlay","originalMount","rootContainer","instance","rootEl","overlayContainer","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","useElementManager","options","isDragStarted","isOvered","id","useId","isAllowed","currentElement","_","draggingElement","group","isDescendant","container","defaultCollisionDetection","containerRect","containerCenter","pointerX","pointerY","shouldUseNormalPriority","activeDragNodes","allCollidingElements","node","elementCenter","isPointerInElement","overlapPercent","centerDistance","depth","parentNode","b","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","processUserCollisionResults","htmlElements","elements","filteredZoneElement","htmlElement","detectCollisions","processCollisionResults","results","previousElement","previousZone","_i","_h","_l","_k","_j","throttledDetectAndProcess","useThrottleFn","processedResults","animationLoop","startDetection","stopDetection","triggerEvents","useEventManager","originalUserSelect","originalTouchAction","originalOverscrollBehavior","currentMoveHandler","currentEndHandler","currentCancelHandler","currentScrollHandler","currentKeyHandler","disableInteractions","body","enableInteractions","clearAllListeners","markRaw","activate","track","deactivate","useDraggable","registerElement","unregisterElement","start","handleDragStart","useZoneManager","currentZone","useDroppable","registerZone","unregisterZone","useSelection","isSelected","isParentOfSelected","hasSelectedParent","handleUnselect","handleSelect"],"mappings":"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"}
|