@vue-dnd-kit/core 2.0.0-alpha1 → 2.0.0-alpha10

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.
Files changed (94) hide show
  1. package/README.md +72 -3
  2. package/dist/external/components/DefaultOverlay.vue.d.ts +0 -1
  3. package/dist/external/components/DnDProvider.vue.d.ts +2 -2
  4. package/dist/external/composables/makeAutoScroll.d.ts +13 -0
  5. package/dist/external/composables/makeConstraintArea.d.ts +7 -0
  6. package/dist/external/composables/makeDraggable.d.ts +6 -4
  7. package/dist/external/composables/makeDroppable.d.ts +9 -3
  8. package/dist/external/composables/{makeSelectableArea.d.ts → makeSelectionArea.d.ts} +2 -3
  9. package/dist/external/composables/makeSnappedOverlayPosition.d.ts +20 -0
  10. package/dist/external/composables/useDnDProvider.d.ts +0 -1
  11. package/dist/external/env.d.ts +7 -0
  12. package/dist/external/index.d.ts +7 -8
  13. package/dist/external/types/entities.d.ts +13 -0
  14. package/dist/external/types/index.d.ts +1 -1
  15. package/dist/external/types/placement.d.ts +8 -1
  16. package/dist/external/types/provider.d.ts +25 -5
  17. package/dist/internal/composables/useDnDProviderEvents.d.ts +0 -1
  18. package/dist/internal/composables/useDnDProviderInternal.d.ts +0 -1
  19. package/dist/internal/composables/useDnDProviderState.d.ts +2 -2
  20. package/dist/internal/composables/useSizeObserver.d.ts +0 -1
  21. package/dist/internal/composables/useViewportAutoScroll.d.ts +9 -0
  22. package/dist/internal/logic/hover.d.ts +0 -1
  23. package/dist/internal/logic/keyboard.d.ts +0 -1
  24. package/dist/internal/logic/payload.d.ts +6 -2
  25. package/dist/internal/logic/pointer.d.ts +0 -1
  26. package/dist/internal/logic/scroll.d.ts +0 -1
  27. package/dist/internal/sensors/{defaultCollision.d.ts → default-collision.d.ts} +1 -2
  28. package/dist/internal/sensors/index.d.ts +2 -2
  29. package/dist/internal/sensors/sensor.d.ts +16 -1
  30. package/dist/internal/sensors/steps.d.ts +8 -5
  31. package/dist/internal/types/auto-scroll.d.ts +19 -0
  32. package/dist/internal/types/provider.d.ts +2 -1
  33. package/dist/internal/utils/auto-scroll.d.ts +13 -0
  34. package/dist/internal/utils/constraints.d.ts +0 -1
  35. package/dist/internal/utils/disabled.d.ts +0 -1
  36. package/dist/internal/utils/dom.d.ts +0 -1
  37. package/dist/internal/utils/drag-activation.d.ts +0 -1
  38. package/dist/internal/utils/events.d.ts +2 -2
  39. package/dist/internal/utils/geometry.d.ts +0 -1
  40. package/dist/internal/utils/groups.d.ts +11 -1
  41. package/dist/internal/utils/hover.d.ts +29 -0
  42. package/dist/internal/utils/keyboard.d.ts +0 -1
  43. package/dist/internal/utils/namespaces.d.ts +0 -1
  44. package/dist/internal/utils/observer.d.ts +0 -1
  45. package/dist/internal/utils/placement.d.ts +5 -12
  46. package/dist/internal/utils/pointer.d.ts +0 -1
  47. package/dist/internal/utils/provider.d.ts +0 -1
  48. package/dist/internal/utils/selection.d.ts +0 -1
  49. package/dist/internal/utils/session.d.ts +0 -1
  50. package/dist/vue-dnd-kit-core.cjs.js +2 -2
  51. package/dist/vue-dnd-kit-core.es.js +902 -543
  52. package/package.json +4 -3
  53. package/dist/core.css +0 -1
  54. package/dist/external/components/DefaultOverlay.vue.d.ts.map +0 -1
  55. package/dist/external/components/DnDProvider.vue.d.ts.map +0 -1
  56. package/dist/external/composables/makeBoundingBox.d.ts +0 -8
  57. package/dist/external/composables/makeBoundingBox.d.ts.map +0 -1
  58. package/dist/external/composables/makeCustomOverlay.d.ts +0 -2
  59. package/dist/external/composables/makeCustomOverlay.d.ts.map +0 -1
  60. package/dist/external/composables/makeDraggable.d.ts.map +0 -1
  61. package/dist/external/composables/makeDroppable.d.ts.map +0 -1
  62. package/dist/external/composables/makeSelectableArea.d.ts.map +0 -1
  63. package/dist/external/composables/useDnDProvider.d.ts.map +0 -1
  64. package/dist/external/index.d.ts.map +0 -1
  65. package/dist/internal/composables/useDnDProviderEvents.d.ts.map +0 -1
  66. package/dist/internal/composables/useDnDProviderInternal.d.ts.map +0 -1
  67. package/dist/internal/composables/useDnDProviderState.d.ts.map +0 -1
  68. package/dist/internal/composables/useSizeObserver.d.ts.map +0 -1
  69. package/dist/internal/logic/hover.d.ts.map +0 -1
  70. package/dist/internal/logic/keyboard.d.ts.map +0 -1
  71. package/dist/internal/logic/payload.d.ts.map +0 -1
  72. package/dist/internal/logic/pointer.d.ts.map +0 -1
  73. package/dist/internal/logic/scroll.d.ts.map +0 -1
  74. package/dist/internal/sensors/defaultCollision.d.ts.map +0 -1
  75. package/dist/internal/sensors/index.d.ts.map +0 -1
  76. package/dist/internal/sensors/sensor.d.ts.map +0 -1
  77. package/dist/internal/sensors/steps.d.ts.map +0 -1
  78. package/dist/internal/utils/constraints.d.ts.map +0 -1
  79. package/dist/internal/utils/disabled.d.ts.map +0 -1
  80. package/dist/internal/utils/dom.d.ts.map +0 -1
  81. package/dist/internal/utils/drag-activation.d.ts.map +0 -1
  82. package/dist/internal/utils/events.d.ts.map +0 -1
  83. package/dist/internal/utils/geometry.d.ts.map +0 -1
  84. package/dist/internal/utils/groups.d.ts.map +0 -1
  85. package/dist/internal/utils/keyboard.d.ts.map +0 -1
  86. package/dist/internal/utils/namespaces.d.ts.map +0 -1
  87. package/dist/internal/utils/observer.d.ts.map +0 -1
  88. package/dist/internal/utils/placement.d.ts.map +0 -1
  89. package/dist/internal/utils/pointer.d.ts.map +0 -1
  90. package/dist/internal/utils/provider.d.ts.map +0 -1
  91. package/dist/internal/utils/selection.d.ts.map +0 -1
  92. package/dist/internal/utils/session.d.ts.map +0 -1
  93. package/dist/vue-dnd-kit-core.cjs.js.map +0 -1
  94. package/dist/vue-dnd-kit-core.es.js.map +0 -1
package/README.md CHANGED
@@ -1,5 +1,74 @@
1
- # Vue 3 + TypeScript + Vite
1
+ # Vue DnD Kit - Core Package
2
2
 
3
- This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
3
+ [![Release](https://img.shields.io/badge/status-release-green.svg)](https://github.com/zizigy/vue-dnd-kit)
4
+ [![npm version](https://img.shields.io/npm/v/@vue-dnd-kit/core.svg)](https://www.npmjs.com/package/@vue-dnd-kit/core)
4
5
 
5
- Learn more about the recommended Project Setup and IDE Support in the [Vue Docs TypeScript Guide](https://vuejs.org/guide/typescript/overview.html#project-setup).
6
+ <p align="center">
7
+ <a href="https://zizigy.github.io/vue-dnd-kit/">
8
+ <img src="https://raw.githubusercontent.com/ZiZiGY/vue-dnd-kit/v2/public/logo.svg" width="400" alt="Vue Drag & Drop Logo">
9
+ </a>
10
+ </p>
11
+
12
+ <p align="center">
13
+ Core package of the Vue Drag & Drop library with composables and provider-based API.
14
+ </p>
15
+
16
+ <p align="center">
17
+ <a href="https://zizigy.github.io/vue-dnd-kit/" target="_blank">
18
+ <img src="https://img.shields.io/badge/Documentation-Visit-blue?style=flat-square" alt="Documentation">
19
+ </a>
20
+ </p>
21
+
22
+ <p align="center">
23
+ Inspired by <a href="https://dndkit.com/" target="_blank">React DnD Kit</a>, adapted for Vue.js
24
+ </p>
25
+
26
+ ---
27
+
28
+ ## About
29
+
30
+ **Vue DnD Kit** — lightweight drag & drop library for Vue 3. Built around a provider (`DnDProvider`) and composables: `makeDraggable`, `makeDroppable`, `makeSelectionArea`, `makeConstraintArea`.
31
+
32
+ - **Lightweight** — small bundle size, no extra dependencies (Vue as peer only)
33
+ - **Flexible** — works with any layout and design system
34
+ - **Accessible** — full keyboard support (start, move, cancel, drop)
35
+ - **TypeScript** — fully typed
36
+
37
+ ---
38
+
39
+ ## Features
40
+
41
+ - **Composables API** — `makeDraggable`, `makeDroppable`, `makeSelectionArea`, `makeConstraintArea`
42
+ - **Provider-based** — `DnDProvider` + `useDnDProvider` for state access
43
+ - **Keyboard support** — Enter/Space for start and drop, arrows for movement, Escape to cancel
44
+ - **Modifier keys** — drag only when modifier held (e.g. Ctrl)
45
+ - **Custom overlay** — custom drag preview via slot or `render` option
46
+
47
+ ---
48
+
49
+ ## Installation
50
+
51
+ ```bash
52
+ npm install @vue-dnd-kit/core
53
+ ```
54
+
55
+ ```bash
56
+ yarn add @vue-dnd-kit/core
57
+ ```
58
+
59
+ ```bash
60
+ pnpm add @vue-dnd-kit/core
61
+ ```
62
+
63
+ **Peer dependency:** Vue 3
64
+
65
+ ---
66
+
67
+ ## License
68
+
69
+ [MIT](LICENSE) © [ZiZiGY](https://github.com/ZiZiGY)
70
+
71
+ ---
72
+
73
+ <p align="center">🎉 Congratulations on the official release! 🎉</p>
74
+ <p align="center">Made with ❤️ for the Vue.js community</p>
@@ -1,3 +1,2 @@
1
1
  declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
2
  export default _default;
3
- //# sourceMappingURL=DefaultOverlay.vue.d.ts.map
@@ -1,3 +1,4 @@
1
+ import { IDnDProviderProps } from '../types/provider';
1
2
  declare function __VLS_template(): {
2
3
  attrs: Partial<{}>;
3
4
  slots: {
@@ -12,7 +13,7 @@ declare function __VLS_template(): {
12
13
  rootEl: any;
13
14
  };
14
15
  type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
15
- declare const __VLS_component: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {
16
+ declare const __VLS_component: import('vue').DefineComponent<IDnDProviderProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<IDnDProviderProps> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
16
17
  overlayRef: HTMLDivElement;
17
18
  }, any>;
18
19
  declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
@@ -22,4 +23,3 @@ type __VLS_WithTemplateSlots<T, S> = T & {
22
23
  $slots: S;
23
24
  };
24
25
  };
25
- //# sourceMappingURL=DnDProvider.vue.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { Ref } from 'vue';
2
+ import { IAutoScrollOptions } from '../types';
3
+ export type { IAutoScrollOptions };
4
+ /**
5
+ * Auto-scroll when the drag overlay is near container edges. Element scroll only.
6
+ *
7
+ * @param container - Ref to the scrollable element
8
+ * @param options - threshold, speed, disabled
9
+ * @returns { isScrolling }
10
+ */
11
+ export declare const makeAutoScroll: (container: Ref<HTMLElement | null>, options?: IAutoScrollOptions) => {
12
+ isScrolling: import('vue').ShallowRef<boolean, boolean>;
13
+ };
@@ -0,0 +1,7 @@
1
+ import { TDnDNodeRef, TDragAxis } from '../types';
2
+ import { Ref } from 'vue';
3
+ export interface IMakeConstraintAreaOptions {
4
+ axis?: TDragAxis | Ref<TDragAxis>;
5
+ restrictToArea?: boolean | Ref<boolean>;
6
+ }
7
+ export declare function makeConstraintArea(ref: TDnDNodeRef, options?: IMakeConstraintAreaOptions): {};
@@ -1,17 +1,19 @@
1
- import { IBaseOptions, IDragActivationOptions, IDraggableEvents, IModifierOptions, IPlacementMargins, TDnDNodeRef, TDraggablePayload } from '../types';
2
- import { Component, Ref } from 'vue';
1
+ import { IBaseOptions, IDragActivationOptions, IDraggableEvents, IModifierOptions, IPlacement, IPlacementMargins, TDnDNodeRef, TDraggablePayload } from '../types';
2
+ import { Component, ComputedRef, Ref, WritableComputedRef } from 'vue';
3
3
  interface IMakeDraggableOptions extends IBaseOptions {
4
4
  events?: IDraggableEvents;
5
5
  modifier?: IModifierOptions;
6
6
  render?: Component;
7
7
  dragHandle?: string | Ref<string>;
8
8
  activation?: IDragActivationOptions;
9
- /** Margins for center zone. When pointer in center and element is also droppable, zone mode is used. */
10
9
  placementMargins?: IPlacementMargins;
11
10
  }
12
11
  interface IMakeDraggableReturnType {
12
+ selected: WritableComputedRef<boolean>;
13
+ isDragging: ComputedRef<boolean>;
14
+ isAllowed: ComputedRef<boolean>;
15
+ isDragOver: ComputedRef<IPlacement | undefined>;
13
16
  }
14
17
  export declare function makeDraggable(ref: TDnDNodeRef, payload?: TDraggablePayload): IMakeDraggableReturnType;
15
18
  export declare function makeDraggable(ref: TDnDNodeRef, options: IMakeDraggableOptions, payload?: TDraggablePayload): IMakeDraggableReturnType;
16
19
  export {};
17
- //# sourceMappingURL=makeDraggable.d.ts.map
@@ -1,7 +1,13 @@
1
- import { IBaseOptions, IDroppableEvents, TDnDNodeRef } from '../types';
1
+ import { IBaseOptions, IDroppableEvents, IPlacement, TDnDNodeRef, TDroppablePayload } from '../types';
2
+ import { ComputedRef } from 'vue';
2
3
  interface IMakeDroppableOptions extends IBaseOptions {
3
4
  events?: IDroppableEvents;
4
5
  }
5
- export declare function makeDroppable(ref: TDnDNodeRef, options?: IMakeDroppableOptions): void;
6
+ interface IMakeDroppableReturnType {
7
+ isAllowed: ComputedRef<boolean>;
8
+ isDragOver: ComputedRef<IPlacement | undefined>;
9
+ }
10
+ export declare function makeDroppable(ref: TDnDNodeRef): IMakeDroppableReturnType;
11
+ export declare function makeDroppable(ref: TDnDNodeRef, options: IMakeDroppableOptions, payload?: TDroppablePayload): IMakeDroppableReturnType;
12
+ export declare function makeDroppable(ref: TDnDNodeRef, payload: TDroppablePayload): IMakeDroppableReturnType;
6
13
  export {};
7
- //# sourceMappingURL=makeDroppable.d.ts.map
@@ -1,15 +1,14 @@
1
1
  import { Ref } from 'vue';
2
2
  import { IBaseOptions, ISelectableAreaEvents, TDnDNodeRef, TModifierKeys, TModifierMethod } from '../types';
3
- interface ISelectableAreaOptions extends IBaseOptions {
3
+ interface ISelectionAreaOptions extends IBaseOptions {
4
4
  modifier?: {
5
5
  keys: TModifierKeys | Ref<TModifierKeys>;
6
6
  method: TModifierMethod | Ref<TModifierMethod>;
7
7
  };
8
8
  events?: ISelectableAreaEvents;
9
9
  }
10
- export declare const makeSelectableArea: (nodeRef: TDnDNodeRef, options?: ISelectableAreaOptions) => {
10
+ export declare const makeSelectionArea: (nodeRef: TDnDNodeRef, options?: ISelectionAreaOptions) => {
11
11
  isSelecting: import('vue').ComputedRef<boolean>;
12
12
  style: import('vue').ComputedRef<import('vue').CSSProperties>;
13
13
  };
14
14
  export {};
15
- //# sourceMappingURL=makeSelectableArea.d.ts.map
@@ -0,0 +1,20 @@
1
+ import { ComputedRef } from 'vue';
2
+ import { ICoordinates } from '@vue-dnd-kit/core';
3
+ /** Per-axis grid (no grid = step 1, no snap) */
4
+ export type TSnapOverlayOptions = {
5
+ grid: number;
6
+ gridX?: never;
7
+ gridY?: never;
8
+ } | {
9
+ grid?: never;
10
+ gridX: number;
11
+ gridY: number;
12
+ };
13
+ /**
14
+ * Returns a computed that maps overlay position (x, y) to grid‑snapped coordinates.
15
+ * Core keeps writing raw coordinates; use this for overlay display only.
16
+ *
17
+ * @param options - grid (or gridX / gridY)
18
+ * @returns ComputedRef<ICoordinates> — use for --position-x / --position-y in overlay
19
+ */
20
+ export declare function makeSnappedOverlayPosition(position: ComputedRef<ICoordinates>, options?: TSnapOverlayOptions): ComputedRef<ICoordinates>;
@@ -1,3 +1,2 @@
1
1
  import { IDnDProviderExternal } from '../types';
2
2
  export declare const useDnDProvider: () => IDnDProviderExternal;
3
- //# sourceMappingURL=useDnDProvider.d.ts.map
@@ -0,0 +1,7 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ declare module '*.vue' {
4
+ import type { DefineComponent } from 'vue';
5
+ const component: DefineComponent<object, object, unknown>;
6
+ export default component;
7
+ }
@@ -1,12 +1,11 @@
1
- /**
2
- * Public API (external)
3
- * Re-exports from internal for future package consumers
4
- */
5
- export { default as DnDProvider } from './components/DnDProvider.vue';
1
+ import { default as DnDProvider } from './components/DnDProvider.vue';
2
+ export { DnDProvider };
6
3
  export { makeDraggable } from './composables/makeDraggable';
7
- export { makeSelectableArea } from './composables/makeSelectableArea';
8
- export { makeBoundingBox } from './composables/makeBoundingBox';
4
+ export { makeSelectionArea } from './composables/makeSelectionArea';
5
+ export { makeConstraintArea } from './composables/makeConstraintArea';
9
6
  export { makeDroppable } from './composables/makeDroppable';
10
7
  export { useDnDProvider } from './composables/useDnDProvider';
8
+ export { makeAutoScroll, type IAutoScrollOptions, } from './composables/makeAutoScroll';
9
+ export { makeSnappedOverlayPosition, type TSnapOverlayOptions, } from './composables/makeSnappedOverlayPosition';
10
+ export { createSensor, defaultCollisionDetection, type CollisionDetectionFn, type TMergeStrategy, } from '../internal/sensors';
11
11
  export type * from './types';
12
- //# sourceMappingURL=index.d.ts.map
@@ -13,6 +13,14 @@ export interface IDragPayload<T = unknown, D = unknown> {
13
13
  dropData?: D;
14
14
  }
15
15
 
16
+ export type TDroppablePayload<T = any, U = any> = () => [T[], U?];
17
+
18
+ /** Resolved payload from TDroppablePayload (items + optional userData) */
19
+ export interface IDropZonePayload<T = unknown, U = unknown> {
20
+ items: T[];
21
+ userData?: U;
22
+ }
23
+
16
24
  export interface IBaseOptions {
17
25
  disabled?: boolean | Ref<boolean>;
18
26
  groups?: string[] | Ref<string[]>;
@@ -39,6 +47,9 @@ export interface IEntities {
39
47
  modifiersDraggableSet: ComputedRef<Set<HTMLElement>>;
40
48
  modifiersSelectableAreaSet: ComputedRef<Set<HTMLElement>>;
41
49
 
50
+ allowedDroppableSet: ComputedRef<Set<HTMLElement>>;
51
+ allowedDraggableSet: ComputedRef<Set<HTMLElement>>;
52
+
42
53
  visibleDraggableSet: Set<HTMLElement>;
43
54
  visibleDroppableSet: Set<HTMLElement>;
44
55
  visibleSelectableAreaSet: Set<HTMLElement>;
@@ -137,8 +148,10 @@ export interface IDraggableEntity extends IBaseEntity {
137
148
  export interface IDraggingEntity extends IDraggableEntity {
138
149
  initialHTML: string;
139
150
  initialRect: DOMRect;
151
+ initialOuterHTML: string;
140
152
  }
141
153
 
142
154
  export interface IDroppableEntity extends IBaseEntity {
143
155
  events?: IDroppableEvents;
156
+ payload?: TDroppablePayload;
144
157
  }
@@ -1,4 +1,4 @@
1
1
  export type * from './pointer';
2
2
  export type * from './provider';
3
3
  export type * from './placement';
4
- export type * from './entities'
4
+ export type * from './entities';
@@ -4,7 +4,7 @@ export interface IPlacement {
4
4
  bottom: boolean;
5
5
  left: boolean;
6
6
  /** True when pointer is in center zone (inside placementMargins). Used for dual-role draggable+zone. */
7
- center?: boolean;
7
+ center: boolean;
8
8
  }
9
9
 
10
10
  export interface IPlacementMargins {
@@ -13,3 +13,10 @@ export interface IPlacementMargins {
13
13
  bottom?: number;
14
14
  left?: number;
15
15
  }
16
+
17
+ /** Options for makeAutoScroll and DnDProvider autoScrollViewport prop */
18
+ export interface IAutoScrollOptions {
19
+ threshold?: number | IPlacementMargins;
20
+ speed?: number;
21
+ disabled?: boolean;
22
+ }
@@ -1,10 +1,18 @@
1
- import { IConstraintsAreaEntity, IDragPayload, IDraggableEntity, IDroppableEntity, IEntities, ISelectableAreaEntity, TDnDNode } from './entities';
1
+ import { IConstraintsAreaEntity, IDragPayload, IDropZonePayload, IDraggableEntity, IDroppableEntity, IEntities, ISelectableAreaEntity, TDnDNode } from './entities';
2
2
  import { ICoordinates, TPointerState } from './pointer';
3
- import { IPlacement } from './placement';
4
- import { Component, ComputedRef, CSSProperties, Reactive, Ref, ShallowRef } from 'vue';
3
+ import { IAutoScrollOptions, IPlacement } from './placement';
4
+ import { Component, ComputedRef, CSSProperties, Reactive, Ref, ShallowRef, WritableComputedRef } from 'vue';
5
5
  /** Event object passed to drag/drop handlers */
6
- export interface IDragEvent<T = unknown, D = unknown> {
6
+ export interface IDragEvent<
7
+ T = unknown,
8
+ D = unknown,
9
+ U = unknown,
10
+ V = unknown,
11
+ > {
12
+ /** Payload from the dragged item (draggable payload) */
7
13
  payload: IDragPayload<T, D> | undefined;
14
+ /** Payload from the drop zone (droppable payload), set for onEnter/onDrop/onLeave */
15
+ dropZonePayload?: IDropZonePayload<U, V>;
8
16
  provider: IDnDProviderExternal;
9
17
  }
10
18
 
@@ -37,9 +45,10 @@ export interface IDnDProviderExternal {
37
45
  distanceProgress: ComputedRef<number>;
38
46
  overlay: {
39
47
  ref: Ref<HTMLElement | null>;
40
- style: ComputedRef<ICoordinates>;
48
+ position: ComputedRef<ICoordinates>;
41
49
  size: Ref<DOMRect | null>;
42
50
  render: Ref<Component | undefined>;
51
+ to: WritableComputedRef<string | false | null | undefined>;
43
52
  };
44
53
  hovered: IHovered;
45
54
  collision: {
@@ -49,6 +58,9 @@ export interface IDnDProviderExternal {
49
58
  };
50
59
  throttle: Ref<number>;
51
60
  };
61
+ autoScrollViewport: ComputedRef<
62
+ IAutoScrollOptions | true | false | null | undefined
63
+ >;
52
64
  }
53
65
 
54
66
  export interface IDelay {
@@ -62,3 +74,11 @@ export type TDnDState =
62
74
  | 'activating'
63
75
  | null
64
76
  | undefined;
77
+
78
+ /** DnDProvider props */
79
+ export interface IDnDProviderProps {
80
+ /** Enable viewport auto-scroll: true = defaults, object = options. false | null | undefined = disabled. */
81
+ autoScrollViewport?: IAutoScrollOptions | true | false | null;
82
+ /** Teleport overlay to element: 'body' = defaults, string = element id. false | null | undefined = disabled. */
83
+ overlayTo?: string | false | null;
84
+ }
@@ -1,3 +1,2 @@
1
1
  import { IDnDProviderInternal } from '../types/provider';
2
2
  export declare const useDnDProviderEvents: (provider: IDnDProviderInternal) => void;
3
- //# sourceMappingURL=useDnDProviderEvents.d.ts.map
@@ -1,3 +1,2 @@
1
1
  import { IDnDProviderInternal } from '../types/provider';
2
2
  export declare const useDnDProviderInternal: () => IDnDProviderInternal;
3
- //# sourceMappingURL=useDnDProviderInternal.d.ts.map
@@ -1,4 +1,4 @@
1
1
  import { Ref } from 'vue';
2
+ import { IDnDProviderProps } from '../../external/types/provider';
2
3
  import { IDnDProviderInternal } from '../types/provider';
3
- export declare function useDnDProviderState(overlayRef: Ref<HTMLElement | null>): IDnDProviderInternal;
4
- //# sourceMappingURL=useDnDProviderState.d.ts.map
4
+ export declare function useDnDProviderState(overlayRef: Ref<HTMLElement | null>, props?: IDnDProviderProps): IDnDProviderInternal;
@@ -31,4 +31,3 @@ export declare const useSizeObserver: (elementRef: Ref<HTMLElement | null>) => {
31
31
  disconnect: () => void;
32
32
  };
33
33
  };
34
- //# sourceMappingURL=useSizeObserver.d.ts.map
@@ -0,0 +1,9 @@
1
+ import { IAutoScrollOptionsInternal } from '../types/auto-scroll';
2
+ import { IDnDProviderInternal } from '../types/provider';
3
+ /**
4
+ * Internal composable: viewport (window) auto-scroll. Not exposed to user.
5
+ */
6
+ export declare function useViewportAutoScroll(provider: IDnDProviderInternal, options?: IAutoScrollOptionsInternal): {
7
+ isScrolling: import('vue').ShallowRef<boolean, boolean>;
8
+ stop: () => void;
9
+ };
@@ -5,4 +5,3 @@ export declare const applyCollisionResultToHovered: (provider: IDnDProviderInter
5
5
  elements: HTMLElement[];
6
6
  zones: HTMLElement[];
7
7
  }) => void;
8
- //# sourceMappingURL=hover.d.ts.map
@@ -4,4 +4,3 @@ export declare const handleKeyboardEvents: {
4
4
  keyUp: (provider: IDnDProviderInternal) => (event: KeyboardEvent) => void;
5
5
  clear: (provider: IDnDProviderInternal) => () => void;
6
6
  };
7
- //# sourceMappingURL=keyboard.d.ts.map
@@ -1,8 +1,12 @@
1
- import { IDragPayload } from '../../external/types';
1
+ import { IDragPayload, IDropZonePayload } from '../../external/types';
2
2
  import { IDnDProviderInternal } from '../types/provider';
3
3
  /**
4
4
  * Resolves payload from initiating draggable.
5
5
  * Calls entity.payload() and returns { index, items, dropData }.
6
6
  */
7
7
  export declare const createDragPayload: (provider: IDnDProviderInternal) => IDragPayload | undefined;
8
- //# sourceMappingURL=payload.d.ts.map
8
+ /**
9
+ * Resolves payload from a droppable zone.
10
+ * Calls zone entity.payload() and returns { items, userData }.
11
+ */
12
+ export declare const createDropZonePayload: (provider: IDnDProviderInternal, zone: HTMLElement) => IDropZonePayload | undefined;
@@ -7,4 +7,3 @@ export declare const createPointerHandlers: (provider: IDnDProviderInternal) =>
7
7
  pointerMove: (event: PointerEvent) => void;
8
8
  cleanup: () => void;
9
9
  };
10
- //# sourceMappingURL=pointer.d.ts.map
@@ -1,3 +1,2 @@
1
1
  import { IDnDProviderInternal } from '../types/provider';
2
2
  export declare const handleScrollEvent: (provider: IDnDProviderInternal) => () => void;
3
- //# sourceMappingURL=scroll.d.ts.map
@@ -2,7 +2,6 @@
2
2
  * Default collision: same logic as vue-dnd-box reference
3
3
  * - Filter: AABB overlap with container (overlay)
4
4
  * - Sort: pointer outside container → isPointerInElement + depth; else overlap % + centerDistance
5
- * - Returns full sorted list
5
+ * - Picks closest to pointer when both zone and element present
6
6
  */
7
7
  export declare const defaultCollisionDetection: import('./sensor').CollisionDetectionFn;
8
- //# sourceMappingURL=defaultCollision.d.ts.map
@@ -1,3 +1,3 @@
1
1
  export * from './steps';
2
- export { defaultCollisionDetection } from './defaultCollision';
3
- //# sourceMappingURL=index.d.ts.map
2
+ export { defaultCollisionDetection } from './default-collision';
3
+ export { createSensor, type CollisionDetectionFn, type TMergeStrategy, } from './sensor';
@@ -1,5 +1,14 @@
1
1
  import { IBoundingBox } from '../utils/geometry';
2
2
  import { IDnDProviderInternal } from '../types/provider';
3
+ /**
4
+ * Collision detection function signature.
5
+ * Returns sorted lists of colliding elements and zones.
6
+ *
7
+ * IMPORTANT: When implementing custom sensors, use:
8
+ * - `provider.entities.allowedDroppableSet` for zones (visible + filtered by groups)
9
+ * - `provider.entities.allowedDraggableSet` for draggables (visible + filtered by groups)
10
+ * OR use helper functions from `steps.ts`: `allowedVisibleZones()` and `visibleElements()`.
11
+ */
3
12
  export type CollisionDetectionFn = (provider: IDnDProviderInternal) => {
4
13
  elements: HTMLElement[];
5
14
  zones: HTMLElement[];
@@ -31,6 +40,8 @@ export type TSortCompareFn = (a: {
31
40
  y: number;
32
41
  };
33
42
  }) => number;
43
+ /** Merge strategy: how to combine elements and zones into final result */
44
+ export type TMergeStrategy = 'separate' | 'unified-closest';
34
45
  export interface ICollisionMeta {
35
46
  isPointerInElement: boolean;
36
47
  overlapPercent: number;
@@ -47,7 +58,11 @@ export interface ISensorBuilder {
47
58
  collision(fn: TCollisionCheckFn): ISensorBuilder;
48
59
  sortElements(fn: TSortCompareFn): ISensorBuilder;
49
60
  sortZones(fn: TSortCompareFn): ISensorBuilder;
61
+ mergeStrategy(strategy: TMergeStrategy): ISensorBuilder;
62
+ /** Pick closest between first zone and first element by distance to pointer */
63
+ pickClosestBetweenFirst(enable: boolean): ISensorBuilder;
64
+ /** Filter by minimum overlap percent (0-100). Applied after collision check. */
65
+ minOverlapPercent(percent: number): ISensorBuilder;
50
66
  build(): CollisionDetectionFn;
51
67
  }
52
68
  export declare const createSensor: () => ISensorBuilder;
53
- //# sourceMappingURL=sensor.d.ts.map
@@ -4,10 +4,10 @@ import { TSortCompareFn, TFilterFn, TCollisionCheckFn, TContainerBoxFn } from '.
4
4
  export declare const overlayContainer: (p: IDnDProviderInternal) => HTMLElement | null;
5
5
  /** Box from overlay style (x,y) + size — overlay uses fixed+transform, getBoundingClientRect is wrong */
6
6
  export declare const overlayBoxFromStyle: TContainerBoxFn;
7
- /** Visible draggables */
8
- export declare const visibleElements: (p: IDnDProviderInternal) => Set<HTMLElement> & Omit<Set<HTMLElement>, keyof Set<any>>;
9
- /** Visible droppables */
10
- export declare const visibleZones: (p: IDnDProviderInternal) => Set<HTMLElement> & Omit<Set<HTMLElement>, keyof Set<any>>;
7
+ /** Allowed draggables (visible + filtered by groups) */
8
+ export declare const visibleElements: (p: IDnDProviderInternal) => Set<HTMLElement>;
9
+ /** Allowed droppables (visible + filtered by groups) */
10
+ export declare const allowedVisibleZones: (p: IDnDProviderInternal) => Set<HTMLElement>;
11
11
  /** Exclude nodes being dragged */
12
12
  export declare const filterNotDragging: TFilterFn;
13
13
  /** Exclude nodes that are descendants of any dragged element (nesting into self) */
@@ -20,8 +20,11 @@ export declare const filterValidCollisionTarget: TFilterFn;
20
20
  export declare const aabbCollision: TCollisionCheckFn;
21
21
  /** Pointer-in-element: cursor must be inside element (AABB of element) */
22
22
  export declare const pointerInElementCollision: TCollisionCheckFn;
23
+ /** Always true — no container check (for "closest on screen" regardless of overlay position) */
24
+ export declare const noContainerCollision: TCollisionCheckFn;
23
25
  /** Sort: deepest first (topmost visible element under cursor) */
24
26
  export declare const sortByDepth: TSortCompareFn;
27
+ /** Sort: by distance from pointer to element center (closest first) */
28
+ export declare const sortByPointerDistance: TSortCompareFn;
25
29
  /** Sort: pointer-in-element + depth when pointer INSIDE container; overlap % + centerDistance when OUTSIDE */
26
30
  export declare const sortByOverlapAndPointer: TSortCompareFn;
27
- //# sourceMappingURL=steps.d.ts.map
@@ -0,0 +1,19 @@
1
+ /** Internal: options for auto-scroll controller (same shape as IAutoScrollOptions for compatibility) */
2
+ export interface IAutoScrollOptionsInternal {
3
+ threshold?: number | { top?: number; right?: number; bottom?: number; left?: number };
4
+ speed?: number;
5
+ disabled?: boolean;
6
+ }
7
+
8
+ export interface IScrollState {
9
+ scrollTop: number;
10
+ scrollLeft: number;
11
+ rect: DOMRect;
12
+ }
13
+
14
+ export interface IScrollAdapter {
15
+ getScrollState(el: HTMLElement): IScrollState;
16
+ setScroll(el: HTMLElement, scrollTop: number, scrollLeft: number): void;
17
+ }
18
+
19
+ export type TOverlayPoint = { x: number; y: number } | null;
@@ -1,5 +1,6 @@
1
1
  import { Ref } from 'vue';
2
2
  import { IDnDProviderExternal } from '../../external';
3
+ import { IAutoScrollOptions } from '../../external/types/placement';
3
4
  import { IIntersectionObserverWrapper } from './observer';
4
5
 
5
6
 
@@ -26,4 +27,4 @@ export interface IDnDProviderInternal extends IDnDProviderExternal {
26
27
  selectableAreaObserver: IIntersectionObserverWrapper;
27
28
  overlaySizeObserver: { disconnect: () => void };
28
29
  };
29
- }
30
+ }
@@ -0,0 +1,13 @@
1
+ import { IAutoScrollOptionsInternal, IScrollAdapter, TOverlayPoint } from '../types/auto-scroll';
2
+ export declare const defaultScrollAdapter: IScrollAdapter;
3
+ /**
4
+ * Creates run/stop controller for auto-scroll loop. Element scroll only (no viewport).
5
+ */
6
+ export declare function createAutoScrollController(containerRef: {
7
+ value: HTMLElement | null;
8
+ }, options: IAutoScrollOptionsInternal, getOverlayPoint: () => TOverlayPoint, scrollAdapter?: IScrollAdapter, isScrollingRef?: {
9
+ value: boolean;
10
+ }): {
11
+ run: () => void;
12
+ stop: () => void;
13
+ };
@@ -38,4 +38,3 @@ export declare function updatePointerWithConstraints(pointer: TPointerState, raw
38
38
  width: number;
39
39
  height: number;
40
40
  } | null): void;
41
- //# sourceMappingURL=constraints.d.ts.map
@@ -7,4 +7,3 @@ export type IEffectivelyDisabledContext = {
7
7
  export declare const isEffectivelyDisabledDraggable: (node: HTMLElement, ctx: IEffectivelyDisabledContext) => boolean;
8
8
  /** True if node is disabled as droppable (self or inside disabled droppable). O(droppableMap.size) */
9
9
  export declare const isEffectivelyDisabledDroppable: (node: HTMLElement, ctx: IEffectivelyDisabledContext) => boolean;
10
- //# sourceMappingURL=disabled.d.ts.map
@@ -42,4 +42,3 @@ export declare const enableInteractions: () => void;
42
42
  * Prevents default browser behavior for the event
43
43
  */
44
44
  export declare const preventEvent: (event: Event) => void;
45
- //# sourceMappingURL=dom.d.ts.map
@@ -27,4 +27,3 @@ export declare function tryStartDragIfActivationComplete(provider: IDnDProviderI
27
27
  export declare function createActivationDelayTimer(provider: IDnDProviderInternal, onComplete: () => void): {
28
28
  cancel: () => void;
29
29
  };
30
- //# sourceMappingURL=drag-activation.d.ts.map
@@ -1,10 +1,11 @@
1
1
  import { IDnDProviderInternal } from '../types/provider';
2
- import { IHovered } from '../../external/types/provider';
2
+ import { IDragEvent, IHovered } from '../../external/types/provider';
3
3
  export type TSelfDragEvent = 'onSelfDragStart' | 'onSelfDragMove' | 'onSelfDragEnd' | 'onSelfDragCancel';
4
4
  /** First key from Map or undefined */
5
5
  export declare const getFirstKey: <K>(map: Map<K, unknown>) => K | undefined;
6
6
  /** Closest draggable from event target */
7
7
  export declare const getClosestDraggableFromEvent: (event: PointerEvent) => HTMLElement | null;
8
+ export declare const getDragEvent: (provider: IDnDProviderInternal, dropZone?: HTMLElement) => IDragEvent;
8
9
  /** Triggers onSelf* for element from event if it's in draggingMap */
9
10
  export declare const triggerSelfDragFromEvent: (provider: IDnDProviderInternal, event: PointerEvent, eventName: TSelfDragEvent) => void;
10
11
  /** Triggers onSelf* only for the initiating element (event.target.closest), skip if disabled */
@@ -19,4 +20,3 @@ export declare const triggerDraggableHoverChange: (provider: IDnDProviderInterna
19
20
  export declare const triggerZoneLeave: (provider: IDnDProviderInternal, hovered: IHovered) => void;
20
21
  /** Triggers zone onLeave on drop failure, skip disabled */
21
22
  export declare const triggerDropCancelEvents: (provider: IDnDProviderInternal, hovered: IHovered) => void;
22
- //# sourceMappingURL=events.d.ts.map
@@ -21,4 +21,3 @@ export declare const getCenter: (box: IBoundingBox) => IPoint;
21
21
  export declare const getDistance: (pointA: IPoint, pointB: IPoint) => number;
22
22
  export declare const getOverlapPercent: (boxA: IBoundingBox, boxB: IBoundingBox) => number;
23
23
  export declare const containsPoint: (box: IBoundingBox, x: number, y: number) => boolean;
24
- //# sourceMappingURL=geometry.d.ts.map