@vue-dnd-kit/core 2.0.0-alpha8 → 2.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/dist/external/composables/makeDraggable.d.ts +2 -1
- package/dist/external/composables/makeDroppable.d.ts +2 -1
- package/dist/external/env.d.ts +7 -0
- package/dist/external/index.d.ts +3 -5
- package/dist/external/types/entities.d.ts +34 -7
- package/dist/external/types/index.d.ts +5 -4
- package/dist/external/types/operations.d.ts +184 -0
- package/dist/external/types/placement.d.ts +13 -1
- package/dist/external/types/provider.d.ts +28 -18
- package/dist/internal/logic/hover.d.ts +0 -1
- package/dist/internal/logic/operations.d.ts +35 -0
- package/dist/internal/logic/payload.d.ts +3 -10
- package/dist/internal/logic/pointer.d.ts +3 -1
- package/dist/internal/sensors/collision-worker.d.ts +28 -0
- package/dist/internal/sensors/default-collision.d.ts +2 -7
- package/dist/internal/sensors/index.d.ts +1 -0
- package/dist/internal/sensors/sensor.d.ts +8 -1
- package/dist/internal/sensors/steps.d.ts +24 -4
- package/dist/internal/types/auto-scroll.d.ts +2 -1
- package/dist/internal/types/provider.d.ts +2 -0
- package/dist/internal/utils/createInternalWorker.d.ts +9 -0
- package/dist/internal/utils/disabled.d.ts +3 -3
- package/dist/internal/utils/events.d.ts +6 -6
- package/dist/internal/utils/hover.d.ts +15 -0
- package/dist/internal/utils/observer.d.ts +5 -9
- package/dist/internal/utils/placement.d.ts +5 -11
- package/dist/internal/utils/provider.d.ts +1 -1
- package/dist/internal/utils/selection.d.ts +2 -1
- package/dist/vue-dnd-kit-core.cjs.js +6 -2
- package/dist/vue-dnd-kit-core.es.js +1298 -759
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IBaseOptions, IDragActivationOptions, IDraggableEvents, IModifierOptions, IPlacementMargins, TDnDNodeRef, TDraggablePayload } from '../types';
|
|
1
|
+
import { IBaseOptions, IDragActivationOptions, IDraggableEvents, IModifierOptions, IPlacement, IPlacementMargins, TDnDNodeRef, TDraggablePayload } from '../types';
|
|
2
2
|
import { Component, ComputedRef, Ref, WritableComputedRef } from 'vue';
|
|
3
3
|
interface IMakeDraggableOptions extends IBaseOptions {
|
|
4
4
|
events?: IDraggableEvents;
|
|
@@ -12,6 +12,7 @@ interface IMakeDraggableReturnType {
|
|
|
12
12
|
selected: WritableComputedRef<boolean>;
|
|
13
13
|
isDragging: ComputedRef<boolean>;
|
|
14
14
|
isAllowed: ComputedRef<boolean>;
|
|
15
|
+
isDragOver: ComputedRef<IPlacement | undefined>;
|
|
15
16
|
}
|
|
16
17
|
export declare function makeDraggable(ref: TDnDNodeRef, payload?: TDraggablePayload): IMakeDraggableReturnType;
|
|
17
18
|
export declare function makeDraggable(ref: TDnDNodeRef, options: IMakeDraggableOptions, payload?: TDraggablePayload): IMakeDraggableReturnType;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { IBaseOptions, IDroppableEvents, TDnDNodeRef, TDroppablePayload } from '../types';
|
|
1
|
+
import { IBaseOptions, IDroppableEvents, IPlacement, TDnDNodeRef, TDroppablePayload } from '../types';
|
|
2
2
|
import { ComputedRef } from 'vue';
|
|
3
3
|
interface IMakeDroppableOptions extends IBaseOptions {
|
|
4
4
|
events?: IDroppableEvents;
|
|
5
5
|
}
|
|
6
6
|
interface IMakeDroppableReturnType {
|
|
7
7
|
isAllowed: ComputedRef<boolean>;
|
|
8
|
+
isDragOver: ComputedRef<IPlacement | undefined>;
|
|
8
9
|
}
|
|
9
10
|
export declare function makeDroppable(ref: TDnDNodeRef): IMakeDroppableReturnType;
|
|
10
11
|
export declare function makeDroppable(ref: TDnDNodeRef, options: IMakeDroppableOptions, payload?: TDroppablePayload): IMakeDroppableReturnType;
|
package/dist/external/index.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
4
|
export { makeSelectionArea } from './composables/makeSelectionArea';
|
|
8
5
|
export { makeConstraintArea } from './composables/makeConstraintArea';
|
|
@@ -10,4 +7,5 @@ export { makeDroppable } from './composables/makeDroppable';
|
|
|
10
7
|
export { useDnDProvider } from './composables/useDnDProvider';
|
|
11
8
|
export { makeAutoScroll, type IAutoScrollOptions, } from './composables/makeAutoScroll';
|
|
12
9
|
export { makeSnappedOverlayPosition, type TSnapOverlayOptions, } from './composables/makeSnappedOverlayPosition';
|
|
10
|
+
export { createSensor, defaultCollisionDetection, type CollisionDetectionFn, type TMergeStrategy, } from '../internal/sensors';
|
|
13
11
|
export type * from './types';
|
|
@@ -1,26 +1,51 @@
|
|
|
1
|
-
import { ComponentPublicInstance, ComputedRef, Ref } from 'vue';
|
|
2
|
-
import { IPlacementMargins } from './placement';
|
|
1
|
+
import { ComponentPublicInstance, ComputedRef, Ref, ShallowRef } from 'vue';
|
|
2
|
+
import { IPlacement, IPlacementMargins } from './placement';
|
|
3
3
|
import { IDragEvent } from './provider';
|
|
4
4
|
export type TDnDNode = HTMLElement | ComponentPublicInstance | null;
|
|
5
5
|
export type TDnDNodeRef = Readonly<Ref<TDnDNode>>;
|
|
6
6
|
export type TDragAxis = 'x' | 'y' | 'both';
|
|
7
|
+
/** Factory registered on a draggable: returns [index, items, dropData?] */
|
|
7
8
|
export type TDraggablePayload<T = any, D = any> = () => [number, T[], D?];
|
|
8
9
|
|
|
9
|
-
/**
|
|
10
|
+
/** Factory registered on a droppable zone: returns [items, userData?] */
|
|
11
|
+
export type TDroppablePayload<T = any, U = any> = () => [T[], U?];
|
|
12
|
+
|
|
13
|
+
// ─── Internal resolved types (used by entity system) ──────────────────────────
|
|
14
|
+
|
|
15
|
+
/** @internal */
|
|
10
16
|
export interface IDragPayload<T = unknown, D = unknown> {
|
|
11
17
|
index: number;
|
|
12
18
|
items: T[];
|
|
13
19
|
dropData?: D;
|
|
14
20
|
}
|
|
15
21
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
/** Resolved payload from TDroppablePayload (items + optional userData) */
|
|
22
|
+
/** @internal */
|
|
19
23
|
export interface IDropZonePayload<T = unknown, U = unknown> {
|
|
20
24
|
items: T[];
|
|
21
25
|
userData?: U;
|
|
22
26
|
}
|
|
23
27
|
|
|
28
|
+
// ─── Public event types ────────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
/** One dragged item — always carries its source array and position */
|
|
31
|
+
export interface IDragItem<T = unknown, D = unknown> {
|
|
32
|
+
/** Index of this item in `items` */
|
|
33
|
+
index: number;
|
|
34
|
+
/** The actual object: `items[index]` */
|
|
35
|
+
item: T;
|
|
36
|
+
/** Source array (same reference as passed to the draggable payload factory) */
|
|
37
|
+
items: T[];
|
|
38
|
+
dropData?: D;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Drop zone context — present in onEnter / onDrop / onLeave */
|
|
42
|
+
export interface IDropZoneContext<T = unknown, U = unknown> {
|
|
43
|
+
items: T[];
|
|
44
|
+
userData?: U;
|
|
45
|
+
/** Cursor position relative to the zone boundary */
|
|
46
|
+
placement: IPlacement | undefined;
|
|
47
|
+
}
|
|
48
|
+
|
|
24
49
|
export interface IBaseOptions {
|
|
25
50
|
disabled?: boolean | Ref<boolean>;
|
|
26
51
|
groups?: string[] | Ref<string[]>;
|
|
@@ -104,7 +129,7 @@ export interface IDraggableEvents {
|
|
|
104
129
|
|
|
105
130
|
export interface IDroppableEvents {
|
|
106
131
|
onEnter?: (event: IDragEvent) => void;
|
|
107
|
-
onDrop?: (event: IDragEvent) => void | Promise<void>;
|
|
132
|
+
onDrop?: (event: IDragEvent) => void | boolean | Promise<void | boolean>;
|
|
108
133
|
onLeave?: (event: IDragEvent) => void;
|
|
109
134
|
}
|
|
110
135
|
|
|
@@ -143,6 +168,7 @@ export interface IDraggableEntity extends IBaseEntity {
|
|
|
143
168
|
activation?: IDragActivation;
|
|
144
169
|
/** Margins for center zone. When pointer in center and element is also droppable, zone mode is used. */
|
|
145
170
|
placementMargins?: IPlacementMargins;
|
|
171
|
+
hoveredPlacement?: IPlacement;
|
|
146
172
|
}
|
|
147
173
|
|
|
148
174
|
export interface IDraggingEntity extends IDraggableEntity {
|
|
@@ -154,4 +180,5 @@ export interface IDraggingEntity extends IDraggableEntity {
|
|
|
154
180
|
export interface IDroppableEntity extends IBaseEntity {
|
|
155
181
|
events?: IDroppableEvents;
|
|
156
182
|
payload?: TDroppablePayload;
|
|
183
|
+
hoveredPlacement: IPlacement | undefined;
|
|
157
184
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export type * from './pointer';
|
|
2
|
-
export type * from './provider';
|
|
3
|
-
export type * from './placement';
|
|
4
|
-
export type * from './entities';
|
|
1
|
+
export type * from './pointer';
|
|
2
|
+
export type * from './provider';
|
|
3
|
+
export type * from './placement';
|
|
4
|
+
export type * from './entities';
|
|
5
|
+
export type * from './operations';
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { IPlacement, TInsertSide, TPlacementOrientation } from './placement';
|
|
2
|
+
// ── Result types ───────────────────────────────────────────────────────────────
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Result of suggestSort.
|
|
6
|
+
* Same-list: sourceItems === targetItems (one array, reordered).
|
|
7
|
+
* Cross-list: two different arrays — apply both.
|
|
8
|
+
*/
|
|
9
|
+
export interface ISuggestSortResult<T = unknown> {
|
|
10
|
+
/** Source list after removing dragged items. Same ref as targetItems when sameList. */
|
|
11
|
+
sourceItems: T[];
|
|
12
|
+
/** Target list after inserting dragged items at targetIndex. */
|
|
13
|
+
targetItems: T[];
|
|
14
|
+
/** The items that were moved (in original order). */
|
|
15
|
+
draggedItems: T[];
|
|
16
|
+
sourceIndexes: number[];
|
|
17
|
+
targetIndex: number;
|
|
18
|
+
mode: 'insert' | 'append' | 'prepend';
|
|
19
|
+
sameList: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Result of suggestSwap.
|
|
24
|
+
* Same-list: one array with positions swapped (sourceItems === targetItems).
|
|
25
|
+
* Cross-list: two arrays with the items exchanged.
|
|
26
|
+
* Multi-drag: dragged group exchanges with the single hovered item.
|
|
27
|
+
*/
|
|
28
|
+
export interface ISuggestSwapResult<T = unknown> {
|
|
29
|
+
/** Source list after swap. */
|
|
30
|
+
sourceItems: T[];
|
|
31
|
+
/** Target list after swap. Same ref as sourceItems when sameList. */
|
|
32
|
+
targetItems: T[];
|
|
33
|
+
sourceIndexes: number[];
|
|
34
|
+
targetIndex: number;
|
|
35
|
+
sameList: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Result of suggestCopy.
|
|
40
|
+
* Source list is NEVER modified — only target receives new items.
|
|
41
|
+
*/
|
|
42
|
+
export interface ISuggestCopyResult<T = unknown> {
|
|
43
|
+
/** Target list after inserting copies. */
|
|
44
|
+
targetItems: T[];
|
|
45
|
+
/** Shallow copies of the dragged items that were inserted. */
|
|
46
|
+
copiedItems: T[];
|
|
47
|
+
targetIndex: number;
|
|
48
|
+
mode: 'insert' | 'append' | 'prepend';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Result of suggestRemove.
|
|
53
|
+
*/
|
|
54
|
+
export interface ISuggestRemoveResult<T = unknown> {
|
|
55
|
+
/** Source list after removing dragged items. */
|
|
56
|
+
sourceItems: T[];
|
|
57
|
+
/** The items that were removed. */
|
|
58
|
+
removedItems: T[];
|
|
59
|
+
sourceIndexes: number[];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Draggable element currently under the cursor (inside the drop zone). */
|
|
63
|
+
export interface IHoveredDraggableContext<T = unknown, D = unknown> {
|
|
64
|
+
element: HTMLElement;
|
|
65
|
+
/** Cursor position relative to this element. */
|
|
66
|
+
placement: IPlacement;
|
|
67
|
+
index: number;
|
|
68
|
+
/** The actual object: items[index]. */
|
|
69
|
+
item: T;
|
|
70
|
+
items: T[];
|
|
71
|
+
dropData?: D;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Placement helpers: interpret placement flags by list orientation. */
|
|
75
|
+
export interface IPlacementHelpers {
|
|
76
|
+
/** 'before' = top (vertical) / left (horizontal). 'after' = bottom / right. */
|
|
77
|
+
getInsertSide(
|
|
78
|
+
placement: IPlacement | undefined,
|
|
79
|
+
orientation: TPlacementOrientation
|
|
80
|
+
): TInsertSide | null;
|
|
81
|
+
isAtZoneStart(
|
|
82
|
+
placement: IPlacement | undefined,
|
|
83
|
+
orientation: TPlacementOrientation
|
|
84
|
+
): boolean;
|
|
85
|
+
isAtZoneEnd(
|
|
86
|
+
placement: IPlacement | undefined,
|
|
87
|
+
orientation: TPlacementOrientation
|
|
88
|
+
): boolean;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Helpers object available on every drag event via `event.helpers`.
|
|
93
|
+
*
|
|
94
|
+
* ── Low-level (stateless, no event context) ─────────────────────────────────
|
|
95
|
+
* Array primitives and placement interpreters. Use these to build custom logic.
|
|
96
|
+
*
|
|
97
|
+
* ── High-level (event-bound) ────────────────────────────────────────────────
|
|
98
|
+
* Preset operations that read the current event context.
|
|
99
|
+
* The user decides which one to call based on `event.hoveredDraggable`:
|
|
100
|
+
*
|
|
101
|
+
* ```ts
|
|
102
|
+
* onDrop(event) {
|
|
103
|
+
* if (event.hoveredDraggable) {
|
|
104
|
+
* // hovering over an element → sort / swap / copy into position
|
|
105
|
+
* const r = event.helpers.suggestSort()
|
|
106
|
+
* if (r) list.value = r.targetItems
|
|
107
|
+
* } else {
|
|
108
|
+
* // hovering over zone only → append / prepend / copy to zone
|
|
109
|
+
* const r = event.helpers.suggestSort()
|
|
110
|
+
* if (r) list.value = r.targetItems
|
|
111
|
+
* }
|
|
112
|
+
* }
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export interface IHelpers {
|
|
116
|
+
// ── Low-level: array ops ──────────────────────────────────────────────────
|
|
117
|
+
/** Insert toInsert items into items at index. Returns new array. */
|
|
118
|
+
insertAt<T>(items: T[], index: number, toInsert: T[]): T[];
|
|
119
|
+
/** Remove count items at index. Returns new array. */
|
|
120
|
+
removeAt<T>(items: T[], index: number, count?: number): T[];
|
|
121
|
+
/** Remove multiple indexes (high → low, safe). Returns new array. */
|
|
122
|
+
removeIndexes<T>(items: T[], indexes: number[]): T[];
|
|
123
|
+
/** Swap items at positions i and j. Returns new array. */
|
|
124
|
+
swapAt<T>(items: T[], i: number, j: number): T[];
|
|
125
|
+
|
|
126
|
+
// ── Low-level: placement ──────────────────────────────────────────────────
|
|
127
|
+
/** 'before' or 'after' relative to the orientation axis, or null if ambiguous. */
|
|
128
|
+
getInsertSide(
|
|
129
|
+
placement: IPlacement | undefined,
|
|
130
|
+
orientation: TPlacementOrientation
|
|
131
|
+
): TInsertSide | null;
|
|
132
|
+
/** True when pointer is at the very start edge of the zone (no center). */
|
|
133
|
+
isAtZoneStart(
|
|
134
|
+
placement: IPlacement | undefined,
|
|
135
|
+
orientation: TPlacementOrientation
|
|
136
|
+
): boolean;
|
|
137
|
+
/** True when pointer is at the very end edge of the zone (no center). */
|
|
138
|
+
isAtZoneEnd(
|
|
139
|
+
placement: IPlacement | undefined,
|
|
140
|
+
orientation: TPlacementOrientation
|
|
141
|
+
): boolean;
|
|
142
|
+
|
|
143
|
+
// ── High-level: event-bound presets ───────────────────────────────────────
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* **Sort / Transfer** — universal insert.
|
|
147
|
+
*
|
|
148
|
+
* - With `hoveredDraggable`: inserts dragged items before or after the
|
|
149
|
+
* hovered element (determined by cursor placement).
|
|
150
|
+
* - Without `hoveredDraggable`: appends to zone start/end based on zone placement.
|
|
151
|
+
* - Same-list: reorders in place. Cross-list: transfers (removes from source, inserts into target).
|
|
152
|
+
*
|
|
153
|
+
* Returns null when context is insufficient (no draggedItems or no dropZone).
|
|
154
|
+
* Cast result arrays to your item type: `r.targetItems as MyItem[]`.
|
|
155
|
+
*/
|
|
156
|
+
suggestSort(orientation?: TPlacementOrientation): ISuggestSortResult | null;
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* **Swap** — exchange the single dragged item with the hovered element.
|
|
160
|
+
*
|
|
161
|
+
* - Same-list: swaps two positions in one array.
|
|
162
|
+
* - Cross-list: exchanges items between two arrays.
|
|
163
|
+
*
|
|
164
|
+
* Returns null when multi-drag or no `hoveredDraggable`.
|
|
165
|
+
*/
|
|
166
|
+
suggestSwap(): ISuggestSwapResult | null;
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* **Copy** — insert copies of dragged items at target position WITHOUT removing from source.
|
|
170
|
+
*
|
|
171
|
+
* Position logic is identical to `suggestSort`.
|
|
172
|
+
* Useful for copy-on-drag (e.g. held Ctrl key).
|
|
173
|
+
*
|
|
174
|
+
* Returns null when context is insufficient.
|
|
175
|
+
*/
|
|
176
|
+
suggestCopy(orientation?: TPlacementOrientation): ISuggestCopyResult | null;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* **Remove** — remove dragged items from their source list.
|
|
180
|
+
*
|
|
181
|
+
* Returns null when there are no draggedItems.
|
|
182
|
+
*/
|
|
183
|
+
suggestRemove(): ISuggestRemoveResult | null;
|
|
184
|
+
}
|
|
@@ -1,12 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which side(s) of the element/zone the pointer is in.
|
|
3
|
+
* Multiple flags can be true (e.g. top + right for corner). Do not normalize.
|
|
4
|
+
* - vertical list: top = before, bottom = after
|
|
5
|
+
* - horizontal list: left = before, right = after
|
|
6
|
+
* - center: pointer in center zone (dual-role draggable+zone)
|
|
7
|
+
*/
|
|
1
8
|
export interface IPlacement {
|
|
2
9
|
top: boolean;
|
|
3
10
|
right: boolean;
|
|
4
11
|
bottom: boolean;
|
|
5
12
|
left: boolean;
|
|
6
13
|
/** True when pointer is in center zone (inside placementMargins). Used for dual-role draggable+zone. */
|
|
7
|
-
center
|
|
14
|
+
center: boolean;
|
|
8
15
|
}
|
|
9
16
|
|
|
17
|
+
export type TPlacementOrientation = 'vertical' | 'horizontal';
|
|
18
|
+
|
|
19
|
+
/** 'before' | 'after' for insert position along one axis */
|
|
20
|
+
export type TInsertSide = 'before' | 'after';
|
|
21
|
+
|
|
10
22
|
export interface IPlacementMargins {
|
|
11
23
|
top?: number;
|
|
12
24
|
right?: number;
|
|
@@ -1,19 +1,24 @@
|
|
|
1
|
-
import { IConstraintsAreaEntity,
|
|
1
|
+
import { IConstraintsAreaEntity, IDraggableEntity, IDroppableEntity, IEntities, ISelectableAreaEntity, TDnDNode, IDragItem, IDropZoneContext } from './entities';
|
|
2
2
|
import { ICoordinates, TPointerState } from './pointer';
|
|
3
|
-
import { IAutoScrollOptions
|
|
3
|
+
import { IAutoScrollOptions } from './placement';
|
|
4
|
+
import { IHelpers, IHoveredDraggableContext } from './operations';
|
|
4
5
|
import { Component, ComputedRef, CSSProperties, Reactive, Ref, ShallowRef, WritableComputedRef } from 'vue';
|
|
5
|
-
/** Event object passed to drag/drop handlers */
|
|
6
|
+
/** Event object passed to all drag/drop handlers */
|
|
6
7
|
export interface IDragEvent<
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
DragT = unknown,
|
|
9
|
+
DragD = unknown,
|
|
10
|
+
ZoneT = unknown,
|
|
11
|
+
ZoneU = unknown,
|
|
11
12
|
> {
|
|
12
|
-
/**
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
|
|
13
|
+
/** All dragged items sorted by index. Length > 1 means multi-drag. */
|
|
14
|
+
draggedItems: IDragItem<DragT, DragD>[];
|
|
15
|
+
/** Drop zone context — present in onEnter / onDrop / onLeave. */
|
|
16
|
+
dropZone: IDropZoneContext<ZoneT, ZoneU> | undefined;
|
|
17
|
+
/** Draggable element under cursor inside the zone — use for insert-before/after. */
|
|
18
|
+
hoveredDraggable: IHoveredDraggableContext | undefined;
|
|
16
19
|
provider: IDnDProviderExternal;
|
|
20
|
+
/** Helpers bound to this event. Low-level array ops + high-level suggest* presets. */
|
|
21
|
+
helpers: IHelpers;
|
|
17
22
|
}
|
|
18
23
|
|
|
19
24
|
/** Map element → placement for elements under cursor during drag */
|
|
@@ -24,6 +29,14 @@ export interface IHovered {
|
|
|
24
29
|
droppable: THoveredMap;
|
|
25
30
|
}
|
|
26
31
|
|
|
32
|
+
export interface ICollision {
|
|
33
|
+
run?: (provider: any) => {
|
|
34
|
+
elements: HTMLElement[];
|
|
35
|
+
zones: HTMLElement[];
|
|
36
|
+
};
|
|
37
|
+
throttle: Ref<number>;
|
|
38
|
+
}
|
|
39
|
+
|
|
27
40
|
export interface IDnDProviderExternal {
|
|
28
41
|
state: Ref<TDnDState | undefined>;
|
|
29
42
|
pointer: Ref<TPointerState | undefined>;
|
|
@@ -51,13 +64,7 @@ export interface IDnDProviderExternal {
|
|
|
51
64
|
to: WritableComputedRef<string | false | null | undefined>;
|
|
52
65
|
};
|
|
53
66
|
hovered: IHovered;
|
|
54
|
-
collision:
|
|
55
|
-
run?: (provider: any) => {
|
|
56
|
-
elements: HTMLElement[];
|
|
57
|
-
zones: HTMLElement[];
|
|
58
|
-
};
|
|
59
|
-
throttle: Ref<number>;
|
|
60
|
-
};
|
|
67
|
+
collision: ICollision;
|
|
61
68
|
autoScrollViewport: ComputedRef<
|
|
62
69
|
IAutoScrollOptions | true | false | null | undefined
|
|
63
70
|
>;
|
|
@@ -72,9 +79,12 @@ export type TDnDState =
|
|
|
72
79
|
| 'dragging'
|
|
73
80
|
| 'selecting'
|
|
74
81
|
| 'activating'
|
|
82
|
+
| 'pending' /** awaiting async onDrop (e.g. confirm); drag still active */
|
|
75
83
|
| null
|
|
76
84
|
| undefined;
|
|
77
85
|
|
|
86
|
+
export type TDropResult = 'accept' | 'cancel' | 'decline';
|
|
87
|
+
|
|
78
88
|
/** DnDProvider props */
|
|
79
89
|
export interface IDnDProviderProps {
|
|
80
90
|
/** Enable viewport auto-scroll: true = defaults, object = options. false | null | undefined = disabled. */
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { IDnDProviderInternal } from '../types/provider';
|
|
2
2
|
import { IHovered } from '../../external/types/provider';
|
|
3
|
-
/** Applies collision result to hovered and triggers zone/draggable events */
|
|
4
3
|
export declare const applyCollisionResultToHovered: (provider: IDnDProviderInternal, hovered: IHovered, result: {
|
|
5
4
|
elements: HTMLElement[];
|
|
6
5
|
zones: HTMLElement[];
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { IHelpers, IPlacementHelpers, ISuggestCopyResult, ISuggestRemoveResult, ISuggestSortResult, ISuggestSwapResult } from '../../external/types/operations';
|
|
2
|
+
import { TPlacementOrientation, IPlacement } from '../../external/types/placement';
|
|
3
|
+
/** Minimal event shape used by internal suggest* (avoids circular import). */
|
|
4
|
+
export interface IDropEventContext {
|
|
5
|
+
draggedItems: Array<{
|
|
6
|
+
index: number;
|
|
7
|
+
item: unknown;
|
|
8
|
+
items: unknown[];
|
|
9
|
+
dropData?: unknown;
|
|
10
|
+
}>;
|
|
11
|
+
dropZone?: {
|
|
12
|
+
items: unknown[];
|
|
13
|
+
userData?: unknown;
|
|
14
|
+
placement: IPlacement | undefined;
|
|
15
|
+
};
|
|
16
|
+
hoveredDraggable?: {
|
|
17
|
+
element: HTMLElement;
|
|
18
|
+
placement: IPlacement;
|
|
19
|
+
index: number;
|
|
20
|
+
item: unknown;
|
|
21
|
+
items: unknown[];
|
|
22
|
+
dropData?: unknown;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare function insertAt<T>(items: T[], index: number, toInsert: T[]): T[];
|
|
26
|
+
export declare function removeAt<T>(items: T[], index: number, count?: number): T[];
|
|
27
|
+
/** Remove multiple indexes (order-safe: removes high → low). Returns new array. */
|
|
28
|
+
export declare function removeIndexes<T>(items: T[], indexes: number[]): T[];
|
|
29
|
+
export declare function swapAt<T>(items: T[], i: number, j: number): T[];
|
|
30
|
+
export declare const placementHelpers: IPlacementHelpers;
|
|
31
|
+
export declare function _suggestSort(event: IDropEventContext, orientation?: TPlacementOrientation): ISuggestSortResult | null;
|
|
32
|
+
export declare function _suggestSwap(event: IDropEventContext): ISuggestSwapResult | null;
|
|
33
|
+
export declare function _suggestCopy(event: IDropEventContext, orientation?: TPlacementOrientation): ISuggestCopyResult | null;
|
|
34
|
+
export declare function _suggestRemove(event: IDropEventContext): ISuggestRemoveResult | null;
|
|
35
|
+
export declare function createHelpers(ctx: IDropEventContext): IHelpers;
|
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import { IDnDProviderInternal } from '../types/provider';
|
|
1
|
+
export {};
|
|
3
2
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* @internal — legacy helpers kept for compatibility with any code that might import them.
|
|
4
|
+
* The main drag event is now built directly in events.ts via buildDraggedItems().
|
|
6
5
|
*/
|
|
7
|
-
export declare const createDragPayload: (provider: IDnDProviderInternal) => IDragPayload | undefined;
|
|
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;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { IDnDProviderInternal } from '../types/provider';
|
|
2
|
-
|
|
2
|
+
import { TDropResult } from '../../external';
|
|
3
|
+
export declare function runCollisionAndApply(provider: IDnDProviderInternal): void;
|
|
4
|
+
export declare function handleDropAndFinish(provider: IDnDProviderInternal): Promise<TDropResult>;
|
|
3
5
|
export declare function finishDragSession(provider: IDnDProviderInternal): void;
|
|
4
6
|
export declare const createPointerHandlers: (provider: IDnDProviderInternal) => {
|
|
5
7
|
pointerDown: (event: PointerEvent) => void;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { IInternalWorker } from '../utils/createInternalWorker';
|
|
2
|
+
export interface ICollisionBox {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ICollisionWorkerInput {
|
|
9
|
+
containerBox: ICollisionBox;
|
|
10
|
+
pointer: {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
};
|
|
14
|
+
/** Packed as [x, y, width, height, ...] — 4 values per element */
|
|
15
|
+
elements: number[];
|
|
16
|
+
elementCount: number;
|
|
17
|
+
zones: number[];
|
|
18
|
+
zoneCount: number;
|
|
19
|
+
config: {
|
|
20
|
+
minOverlapPercent: number;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface ICollisionWorkerResult {
|
|
24
|
+
elementIndices: number[];
|
|
25
|
+
zoneIndices: number[];
|
|
26
|
+
}
|
|
27
|
+
export declare function getCollisionWorker(): IInternalWorker<ICollisionWorkerInput, ICollisionWorkerResult>;
|
|
28
|
+
export declare function terminateCollisionWorker(): void;
|
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* - Filter: AABB overlap with container (overlay)
|
|
4
|
-
* - Sort: pointer outside container → isPointerInElement + depth; else overlap % + centerDistance
|
|
5
|
-
* - Returns full sorted list
|
|
6
|
-
*/
|
|
7
|
-
export declare const defaultCollisionDetection: import('./sensor').CollisionDetectionFn;
|
|
1
|
+
import { CollisionDetectionFn } from './sensor';
|
|
2
|
+
export declare const defaultCollisionDetection: CollisionDetectionFn;
|
|
@@ -6,7 +6,7 @@ import { IDnDProviderInternal } from '../types/provider';
|
|
|
6
6
|
*
|
|
7
7
|
* IMPORTANT: When implementing custom sensors, use:
|
|
8
8
|
* - `provider.entities.allowedDroppableSet` for zones (visible + filtered by groups)
|
|
9
|
-
* - `provider.entities.allowedDraggableSet` for
|
|
9
|
+
* - `provider.entities.allowedDraggableSet` for draggedItems (visible + filtered by groups)
|
|
10
10
|
* OR use helper functions from `steps.ts`: `allowedVisibleZones()` and `visibleElements()`.
|
|
11
11
|
*/
|
|
12
12
|
export type CollisionDetectionFn = (provider: IDnDProviderInternal) => {
|
|
@@ -40,6 +40,8 @@ export type TSortCompareFn = (a: {
|
|
|
40
40
|
y: number;
|
|
41
41
|
};
|
|
42
42
|
}) => number;
|
|
43
|
+
/** Merge strategy: how to combine elements and zones into final result */
|
|
44
|
+
export type TMergeStrategy = 'separate' | 'unified-closest';
|
|
43
45
|
export interface ICollisionMeta {
|
|
44
46
|
isPointerInElement: boolean;
|
|
45
47
|
overlapPercent: number;
|
|
@@ -56,6 +58,11 @@ export interface ISensorBuilder {
|
|
|
56
58
|
collision(fn: TCollisionCheckFn): ISensorBuilder;
|
|
57
59
|
sortElements(fn: TSortCompareFn): ISensorBuilder;
|
|
58
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;
|
|
59
66
|
build(): CollisionDetectionFn;
|
|
60
67
|
}
|
|
61
68
|
export declare const createSensor: () => ISensorBuilder;
|
|
@@ -2,9 +2,18 @@ import { IDnDProviderInternal } from '../types/provider';
|
|
|
2
2
|
import { TSortCompareFn, TFilterFn, TCollisionCheckFn, TContainerBoxFn } from './sensor';
|
|
3
3
|
/** Container from overlay ref */
|
|
4
4
|
export declare const overlayContainer: (p: IDnDProviderInternal) => HTMLElement | null;
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* Box from overlay style (x,y) + size.
|
|
7
|
+
* The overlay is `position:fixed; top:0; left:0; transform:translate(x,y)`, so
|
|
8
|
+
* getBoundingClientRect() is unreliable for the position (transform offsets it from 0,0).
|
|
9
|
+
* However the SIZE from getBoundingClientRect IS correct and is used as a fallback
|
|
10
|
+
* when the ResizeObserver hasn't fired yet (`overlay.size.value` is still null).
|
|
11
|
+
*
|
|
12
|
+
* Without the fallback: size=0 → containerBox is a zero-size point → pointer.x <= box.x+0
|
|
13
|
+
* fails whenever offset.x>0 (grabbed away from left edge) → pointerInContainer=false always.
|
|
14
|
+
*/
|
|
6
15
|
export declare const overlayBoxFromStyle: TContainerBoxFn;
|
|
7
|
-
/** Allowed
|
|
16
|
+
/** Allowed draggedItems (visible + filtered by groups) */
|
|
8
17
|
export declare const visibleElements: (p: IDnDProviderInternal) => Set<HTMLElement>;
|
|
9
18
|
/** Allowed droppables (visible + filtered by groups) */
|
|
10
19
|
export declare const allowedVisibleZones: (p: IDnDProviderInternal) => Set<HTMLElement>;
|
|
@@ -12,7 +21,7 @@ export declare const allowedVisibleZones: (p: IDnDProviderInternal) => Set<HTMLE
|
|
|
12
21
|
export declare const filterNotDragging: TFilterFn;
|
|
13
22
|
/** Exclude nodes that are descendants of any dragged element (nesting into self) */
|
|
14
23
|
export declare const filterNotDescendantOfDragged: TFilterFn;
|
|
15
|
-
/** Exclude disabled
|
|
24
|
+
/** Exclude disabled draggedItems and zones (including those inside disabled parents) */
|
|
16
25
|
export declare const filterNotDisabled: TFilterFn;
|
|
17
26
|
/** Exclude: not dragging, not descendant of dragged, not disabled */
|
|
18
27
|
export declare const filterValidCollisionTarget: TFilterFn;
|
|
@@ -20,7 +29,18 @@ export declare const filterValidCollisionTarget: TFilterFn;
|
|
|
20
29
|
export declare const aabbCollision: TCollisionCheckFn;
|
|
21
30
|
/** Pointer-in-element: cursor must be inside element (AABB of element) */
|
|
22
31
|
export declare const pointerInElementCollision: TCollisionCheckFn;
|
|
32
|
+
/** Always true — no container check (for "closest on screen" regardless of overlay position) */
|
|
33
|
+
export declare const noContainerCollision: TCollisionCheckFn;
|
|
23
34
|
/** Sort: deepest first (topmost visible element under cursor) */
|
|
24
35
|
export declare const sortByDepth: TSortCompareFn;
|
|
25
|
-
/** Sort:
|
|
36
|
+
/** Sort: by distance from pointer to element center (closest first) */
|
|
37
|
+
export declare const sortByPointerDistance: TSortCompareFn;
|
|
38
|
+
/**
|
|
39
|
+
* Sort: pointer-in-element + depth when pointer inside container; overlap % + centerDistance when outside.
|
|
40
|
+
*
|
|
41
|
+
* The container box MUST be computed via overlayBoxFromStyle (not getBoundingClientRect) so that
|
|
42
|
+
* position is correct for a fixed+transform overlay. The size fallback in overlayBoxFromStyle ensures
|
|
43
|
+
* the box is never zero-sized on the first frame, making `pointerInContainer` reliably true whenever
|
|
44
|
+
* the cursor is above the drag ghost.
|
|
45
|
+
*/
|
|
26
46
|
export declare const sortByOverlapAndPointer: TSortCompareFn;
|
|
@@ -8,12 +8,13 @@ export interface IAutoScrollOptionsInternal {
|
|
|
8
8
|
export interface IScrollState {
|
|
9
9
|
scrollTop: number;
|
|
10
10
|
scrollLeft: number;
|
|
11
|
-
rect: DOMRect;
|
|
12
11
|
}
|
|
13
12
|
|
|
14
13
|
export interface IScrollAdapter {
|
|
15
14
|
getScrollState(el: HTMLElement): IScrollState;
|
|
16
15
|
setScroll(el: HTMLElement, scrollTop: number, scrollLeft: number): void;
|
|
16
|
+
/** Override rect calculation. Defaults to el.getBoundingClientRect(). */
|
|
17
|
+
getRect?(el: HTMLElement): DOMRect;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
export type TOverlayPoint = { x: number; y: number } | null;
|
|
@@ -26,5 +26,7 @@ export interface IDnDProviderInternal extends IDnDProviderExternal {
|
|
|
26
26
|
droppableObserver: IIntersectionObserverWrapper;
|
|
27
27
|
selectableAreaObserver: IIntersectionObserverWrapper;
|
|
28
28
|
overlaySizeObserver: { disconnect: () => void };
|
|
29
|
+
/** BoundingClientRect cache — invalidated on scroll and session reset */
|
|
30
|
+
rectCache: Map<HTMLElement, DOMRect>;
|
|
29
31
|
};
|
|
30
32
|
}
|