@hkdigital/lib-sveltekit 0.1.77 → 0.1.79

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 (33) hide show
  1. package/dist/components/drag-drop/DragDropContext.svelte +26 -0
  2. package/dist/components/drag-drop/DragDropContext.svelte.d.ts +18 -0
  3. package/dist/components/drag-drop/Draggable.svelte +49 -27
  4. package/dist/components/drag-drop/Draggable.svelte.d.ts +2 -0
  5. package/dist/components/drag-drop/{Dropzone.svelte → DropZone.svelte} +147 -90
  6. package/dist/components/drag-drop/{Dropzone.svelte.d.ts → DropZone.svelte.d.ts} +5 -3
  7. package/dist/components/drag-drop/drag-state.svelte.d.ts +29 -5
  8. package/dist/components/drag-drop/drag-state.svelte.js +48 -17
  9. package/dist/components/drag-drop/index.d.ts +2 -0
  10. package/dist/components/drag-drop/index.js +3 -0
  11. package/dist/components/drag-drop/util.d.ts +32 -0
  12. package/dist/components/drag-drop/util.js +85 -0
  13. package/dist/components/tab-bar/HkTabBar.state.svelte.d.ts +4 -4
  14. package/dist/components/tab-bar/HkTabBar.svelte +3 -3
  15. package/dist/components/tab-bar/HkTabBar.svelte.d.ts +2 -2
  16. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.d.ts +3 -3
  17. package/dist/components/tab-bar/HkTabBarSelector.svelte +3 -3
  18. package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +2 -2
  19. package/dist/components/tab-bar/index.d.ts +1 -0
  20. package/dist/components/tab-bar/typedef.d.ts +3 -1
  21. package/dist/components/tab-bar/typedef.js +3 -0
  22. package/dist/themes/hkdev/components/drag-drop/draggable.css +10 -1
  23. package/dist/typedef/context.d.ts +3 -0
  24. package/dist/typedef/context.js +6 -0
  25. package/dist/typedef/index.d.ts +1 -0
  26. package/dist/typedef/index.js +1 -0
  27. package/dist/util/svelte/state-context/index.d.ts +2 -1
  28. package/dist/util/svelte/state-context/index.js +46 -12
  29. package/dist/widgets/game-box/GameBox.svelte +1 -0
  30. package/dist/widgets/hk-app-layout/HkAppLayout.state.svelte.d.ts +3 -3
  31. package/dist/widgets/image-box/ImageBox.svelte +2 -4
  32. package/package.json +3 -1
  33. package/dist/components/drag-drop/Dropzone.svelte__ +0 -282
@@ -0,0 +1,26 @@
1
+ <script>
2
+ import { createDragState } from './drag-state.svelte.js';
3
+
4
+ /**
5
+ * @type {{
6
+ * contextKey?: import('../../typedef').ContextKey,
7
+ * base?: string,
8
+ * classes?: string,
9
+ * children: import('svelte').Snippet,
10
+ * [key: string]: any
11
+ * }}
12
+ */
13
+ let { contextKey, base = '', classes = '', children, ...attrs } = $props();
14
+
15
+ // Create the state context at this level to ensure all children
16
+ // have access to the same state instance
17
+ const dragState = createDragState(contextKey);
18
+ </script>
19
+
20
+ <div
21
+ data-component="drag-drop-context"
22
+ class="{base} {classes}"
23
+ {...attrs}
24
+ >
25
+ {@render children()}
26
+ </div>
@@ -0,0 +1,18 @@
1
+ export default DragDropContext;
2
+ type DragDropContext = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<{
5
+ [key: string]: any;
6
+ contextKey?: ContextKey;
7
+ base?: string;
8
+ classes?: string;
9
+ children: Snippet<[]>;
10
+ }>): void;
11
+ };
12
+ declare const DragDropContext: import("svelte").Component<{
13
+ [key: string]: any;
14
+ contextKey?: import("../../typedef").ContextKey;
15
+ base?: string;
16
+ classes?: string;
17
+ children: import("svelte").Snippet;
18
+ }, {}, "">;
@@ -1,6 +1,9 @@
1
1
  <script>
2
2
  import { toStateClasses } from '../../util/design-system/index.js';
3
- import { useDragState } from './drag-state.svelte.js';
3
+
4
+ import { createOrGetDragState } from './drag-state.svelte.js';
5
+
6
+ import { generateLocalId } from '../../util/unique';
4
7
 
5
8
  import {
6
9
  IDLE,
@@ -10,8 +13,6 @@
10
13
  DRAG_DISABLED
11
14
  } from '../../constants/state-labels/drag-states.js';
12
15
 
13
- const dragState = useDragState();
14
-
15
16
  /**
16
17
  * @type {{
17
18
  * item: any,
@@ -22,6 +23,7 @@
22
23
  * base?: string,
23
24
  * classes?: string,
24
25
  * children: import('svelte').Snippet,
26
+ * contextKey?: import('../../typedef').ContextKey,
25
27
  * isDragging?: boolean,
26
28
  * isDropping?: boolean,
27
29
  * isDragPreview?: boolean,
@@ -58,6 +60,7 @@
58
60
  base = '',
59
61
  classes = '',
60
62
  children,
63
+ contextKey,
61
64
  isDragging = $bindable(false),
62
65
  isDropping = $bindable(false),
63
66
  isDragPreview = $bindable(false),
@@ -69,6 +72,12 @@
69
72
  ...attrs
70
73
  } = $props();
71
74
 
75
+ const dragState = createOrGetDragState(contextKey);
76
+
77
+ const draggableId = generateLocalId();
78
+
79
+ // console.debug('Draggable contextKey:', contextKey);
80
+
72
81
  let dragTimeout = null;
73
82
  let currentState = $state(IDLE);
74
83
 
@@ -128,15 +137,27 @@
128
137
  metadata: { timestamp: Date.now() }
129
138
  };
130
139
 
131
- // Set global drag state
132
- dragState.start(item, source, group);
140
+ // Set shared drag state
141
+ dragState.start(draggableId, dragData);
133
142
 
134
143
  event.dataTransfer.effectAllowed = 'move';
135
144
  event.dataTransfer.setData('application/json', JSON.stringify(dragData));
136
145
 
137
146
  // Set custom drag image if needed
138
147
  if (event.dataTransfer.setDragImage) {
139
- // Could set custom drag image here
148
+ // Custom drag image
149
+ const dragEl = /** @type {HTMLElement} */ (event.currentTarget);
150
+
151
+
152
+ // Get the bounding rectangle of the element
153
+ const rect = dragEl.getBoundingClientRect();
154
+
155
+ // Calculate offsets relative to the element's top-left corner
156
+ const offsetX = event.clientX - rect.left;
157
+ const offsetY = event.clientY - rect.top;
158
+
159
+ // Use the element as drag image with calculated offsets
160
+ event.dataTransfer.setDragImage(dragEl, offsetX, offsetY);
140
161
  }
141
162
 
142
163
  onDragStart?.({ event, item, source, group });
@@ -152,34 +173,34 @@
152
173
  }
153
174
  }
154
175
 
155
- /**
156
- * Handle drag end
157
- * @param {DragEvent} event
158
- */
159
- function handleDragEnd(event) {
160
- clearTimeout(dragTimeout);
176
+ /**
177
+ * Handle drag end
178
+ * @param {DragEvent} event
179
+ */
180
+ function handleDragEnd(event) {
181
+ clearTimeout(dragTimeout);
161
182
 
162
- // Clear global drag state
163
- dragState.end();
183
+ // Clear global drag state
184
+ dragState.end(draggableId);
164
185
 
165
- // Check if drop was successful
166
- const wasDropped = event.dataTransfer.dropEffect !== 'none';
186
+ // Check if drop was successful
187
+ const wasDropped = event.dataTransfer.dropEffect !== 'none';
167
188
 
168
- if (wasDropped) {
169
- currentState = DROPPING;
170
- onDrop?.({ event, item, wasDropped: true });
189
+ if (wasDropped) {
190
+ currentState = DROPPING;
191
+ onDrop?.({ event, item, wasDropped: true });
171
192
 
172
- // Brief dropping state before returning to idle
173
- setTimeout(() => {
174
- currentState = IDLE;
175
- }, 100);
176
- } else {
193
+ // Brief dropping state before returning to idle
194
+ setTimeout(() => {
177
195
  currentState = IDLE;
178
- }
179
-
180
- onDragEnd?.({ event, item, wasDropped });
196
+ }, 100);
197
+ } else {
198
+ currentState = IDLE;
181
199
  }
182
200
 
201
+ onDragEnd?.({ event, item, wasDropped });
202
+ }
203
+
183
204
  /**
184
205
  * Handle mouse down for drag delay
185
206
  * @param {MouseEvent} event
@@ -204,6 +225,7 @@
204
225
 
205
226
  <div
206
227
  data-component="draggable"
228
+ data-id={draggableId}
207
229
  draggable={!disabled && canDrag(item)}
208
230
  ondragstart={handleDragStart}
209
231
  ondrag={handleDrag}
@@ -11,6 +11,7 @@ type Draggable = {
11
11
  base?: string;
12
12
  classes?: string;
13
13
  children: Snippet<[]>;
14
+ contextKey?: ContextKey;
14
15
  isDragging?: boolean;
15
16
  isDropping?: boolean;
16
17
  isDragPreview?: boolean;
@@ -47,6 +48,7 @@ declare const Draggable: import("svelte").Component<{
47
48
  base?: string;
48
49
  classes?: string;
49
50
  children: import("svelte").Snippet;
51
+ contextKey?: import("../../typedef").ContextKey;
50
52
  isDragging?: boolean;
51
53
  isDropping?: boolean;
52
54
  isDragPreview?: boolean;
@@ -1,7 +1,14 @@
1
1
  <script>
2
2
  import { onMount, onDestroy } from 'svelte';
3
3
  import { toStateClasses } from '../../util/design-system/index.js';
4
- import { useDragState } from './drag-state.svelte.js';
4
+
5
+ import { createOrGetDragState } from './drag-state.svelte.js';
6
+
7
+ import {
8
+ findDraggableSource,
9
+ getDraggableIdFromEvent,
10
+ processDropWithData
11
+ } from './util.js';
5
12
 
6
13
  import {
7
14
  READY,
@@ -12,8 +19,6 @@
12
19
  ACTIVE_DROP
13
20
  } from '../../constants/state-labels/drop-states.js';
14
21
 
15
- const dragState = useDragState();
16
-
17
22
  /**
18
23
  * @type {{
19
24
  * zone?: string,
@@ -24,6 +29,7 @@
24
29
  * base?: string,
25
30
  * classes?: string,
26
31
  * children?: import('svelte').Snippet,
32
+ * contextKey?: import('../../typedef').ContextKey,
27
33
  * empty?: import('svelte').Snippet,
28
34
  * preview?: import('svelte').Snippet<[{
29
35
  * item: any,
@@ -79,6 +85,7 @@
79
85
  base = '',
80
86
  classes = '',
81
87
  children,
88
+ contextKey,
82
89
  empty,
83
90
  preview,
84
91
  isDragOver = $bindable(false),
@@ -94,6 +101,11 @@
94
101
  ...attrs
95
102
  } = $props();
96
103
 
104
+
105
+ const dragState = createOrGetDragState(contextKey);
106
+
107
+ // console.debug('DropZone contextKey:', contextKey);
108
+
97
109
  let currentState = $state(READY);
98
110
  let dropzoneElement; // Reference to the dropzone DOM element
99
111
 
@@ -148,10 +160,14 @@
148
160
 
149
161
  /**
150
162
  * Check if we can accept the dragged item
163
+ *
151
164
  * @param {Object} data
165
+ *
152
166
  * @returns {boolean}
153
167
  */
154
168
  function canAcceptDrop(data) {
169
+ // console.debug('canAcceptDrop', data, {group});
170
+
155
171
  if (disabled) return false;
156
172
  if (!data) return false;
157
173
  if (data.group !== group) return false;
@@ -160,22 +176,26 @@
160
176
  return true;
161
177
  }
162
178
 
163
- /**
164
- * Handle drag enter with improved DOM traversal check
165
- * @param {DragEvent} event
166
- */
167
- function handleDragEnter(event) {
168
- // Prevent default to allow drop
169
- event.preventDefault();
179
+ /**
180
+ * Handle drag enter with improved DOM traversal check
181
+ * @param {DragEvent} event
182
+ */
183
+ function handleDragEnter(event) {
184
+ // Prevent default to allow drop
185
+ event.preventDefault();
170
186
 
171
- // If we're already in a drag-over state, don't reset anything
172
- if (isCurrentlyOver) return;
187
+ // If we're already in a drag-over state, don't reset anything
188
+ if (isCurrentlyOver) return;
173
189
 
174
- // Now we're over this dropzone
175
- isCurrentlyOver = true;
190
+ // Now we're over this dropzone
191
+ isCurrentlyOver = true;
176
192
 
177
- // Get the current drag data
178
- const dragData = dragState.current;
193
+ // Get the draggable ID from the event
194
+ const draggableId = getDraggableIdFromEvent(event);
195
+
196
+ if (draggableId) {
197
+ // Get the drag data for this specific draggable
198
+ const dragData = dragState.getDraggable(draggableId);
179
199
 
180
200
  // Update state based on acceptance
181
201
  if (dragData) {
@@ -185,46 +205,68 @@
185
205
  } else {
186
206
  currentState = DRAG_OVER;
187
207
  }
188
-
189
- // Notify listeners
190
- onDragEnter?.({ event, zone, canDrop: currentState === CAN_DROP });
191
- }
192
-
193
- /**
194
- * Handle drag over
195
- * @param {DragEvent} event
196
- */
197
- function handleDragOver(event) {
198
- // Prevent default to allow drop
199
- event.preventDefault();
200
-
201
- // If we're not currently over this dropzone (despite dragover firing),
202
- // treat it as an enter event
203
- if (!isCurrentlyOver) {
204
- handleDragEnter(event);
205
- return;
206
- }
207
-
208
- // Re-evaluate acceptance on each dragover in case state changed
208
+ } else {
209
+ // Fallback to the current drag data (for compatibility)
209
210
  const dragData = dragState.current;
210
211
 
211
- if (dragData && [DRAG_OVER, CAN_DROP, CANNOT_DROP].includes(currentState)) {
212
+ if (dragData) {
212
213
  currentState = canAcceptDrop(dragData)
213
214
  ? CAN_DROP
214
215
  : CANNOT_DROP;
216
+ } else {
217
+ currentState = DRAG_OVER;
215
218
  }
219
+ }
216
220
 
217
- // Set visual feedback based on drop acceptance
218
- if (currentState === CAN_DROP) {
219
- event.dataTransfer.dropEffect = 'move';
220
- } else if (currentState === CANNOT_DROP) {
221
- event.dataTransfer.dropEffect = 'none';
222
- }
221
+ // Notify listeners
222
+ onDragEnter?.({ event, zone, canDrop: currentState === CAN_DROP });
223
+ }
224
+
225
+ /**
226
+ * Handle drag over
227
+ * @param {DragEvent} event
228
+ */
229
+ function handleDragOver(event) {
230
+ // Prevent default to allow drop
231
+ event.preventDefault();
232
+
233
+ // If we're not currently over this dropzone (despite dragover firing),
234
+ // treat it as an enter event
235
+ if (!isCurrentlyOver) {
236
+ handleDragEnter(event);
237
+ return;
238
+ }
239
+
240
+ // Get the draggable ID from the event
241
+ const draggableId = getDraggableIdFromEvent(event);
242
+ let dragData;
223
243
 
224
- // Notify listeners
225
- onDragOver?.({ event, zone });
244
+ if (draggableId) {
245
+ // Get the drag data for this specific draggable
246
+ dragData = dragState.getDraggable(draggableId);
247
+ } else {
248
+ // Fallback to the current drag data (for compatibility)
249
+ dragData = dragState.current;
226
250
  }
227
251
 
252
+ // Re-evaluate acceptance
253
+ if (dragData && [DRAG_OVER, CAN_DROP, CANNOT_DROP].includes(currentState)) {
254
+ currentState = canAcceptDrop(dragData)
255
+ ? CAN_DROP
256
+ : CANNOT_DROP;
257
+ }
258
+
259
+ // Set visual feedback based on drop acceptance
260
+ if (currentState === CAN_DROP) {
261
+ event.dataTransfer.dropEffect = 'move';
262
+ } else if (currentState === CANNOT_DROP) {
263
+ event.dataTransfer.dropEffect = 'none';
264
+ }
265
+
266
+ // Notify listeners
267
+ onDragOver?.({ event, zone });
268
+ }
269
+
228
270
  /**
229
271
  * Handle drag leave with improved DOM traversal check
230
272
  * @param {DragEvent} event
@@ -247,54 +289,69 @@
247
289
  }
248
290
  }
249
291
 
250
- /**
251
- * Handle drop
252
- * @param {DragEvent} event
253
- */
254
- function handleDrop(event) {
255
- // Prevent default browser actions
256
- event.preventDefault();
257
-
258
- // Reset our tracking state
259
- isCurrentlyOver = false;
260
-
261
- try {
262
- // Parse the JSON data from the dataTransfer object
263
- const data = JSON.parse(event.dataTransfer.getData('application/json'));
264
-
265
- // Check if we can accept this drop
266
- if (canAcceptDrop(data)) {
267
- // Update state and notify listeners
268
- currentState = ACTIVE_DROP;
269
- onDropStart?.({ event, zone, data });
270
-
271
- // Call the onDrop handler and handle Promise resolution
272
- const dropResult = onDrop?.({
273
- event,
274
- zone,
275
- item: data.item,
276
- source: data.source,
277
- metadata: data.metadata
278
- });
279
-
280
- // Handle async or sync results
281
- Promise.resolve(dropResult).then(() => {
282
- currentState = READY;
283
- onDropEnd?.({ event, zone, data, success: true });
284
- }).catch((error) => {
285
- currentState = READY;
286
- onDropEnd?.({ event, zone, data, success: false, error });
287
- });
288
- } else {
289
- // Not a valid drop, reset state
290
- currentState = READY;
292
+ /**
293
+ * Handle drop
294
+ * @param {DragEvent} event
295
+ */
296
+ function handleDrop(event) {
297
+ // Prevent default browser actions
298
+ event.preventDefault();
299
+
300
+ // Reset our tracking state
301
+ isCurrentlyOver = false;
302
+
303
+ try {
304
+ // First try to get the draggable ID from the event
305
+ const draggableId = getDraggableIdFromEvent(event);
306
+ let dragData;
307
+
308
+ if (draggableId) {
309
+ // Get the drag data from state using the draggable ID
310
+ dragData = dragState.getDraggable(draggableId);
311
+ }
312
+
313
+ // If we couldn't get it from the element attribute, try dataTransfer
314
+ if (!dragData) {
315
+ // Parse the JSON data from the dataTransfer object (only works during drop)
316
+ const jsonData = event.dataTransfer.getData('application/json');
317
+ if (jsonData) {
318
+ dragData = JSON.parse(jsonData);
291
319
  }
292
- } catch (error) {
293
- // Handle parsing errors
294
- console.error('Drop error:', error);
320
+ }
321
+
322
+ // Check if we can accept this drop
323
+ if (dragData && canAcceptDrop(dragData)) {
324
+ // Update state and notify listeners
325
+ currentState = ACTIVE_DROP;
326
+ onDropStart?.({ event, zone, data: dragData });
327
+
328
+ // Call the onDrop handler and handle Promise resolution
329
+ const dropResult = onDrop?.({
330
+ event,
331
+ zone,
332
+ item: dragData.item,
333
+ source: dragData.source,
334
+ metadata: dragData.metadata
335
+ });
336
+
337
+ // Handle async or sync results
338
+ Promise.resolve(dropResult).then(() => {
339
+ currentState = READY;
340
+ onDropEnd?.({ event, zone, data: dragData, success: true });
341
+ }).catch((error) => {
342
+ currentState = READY;
343
+ onDropEnd?.({ event, zone, data: dragData, success: false, error });
344
+ });
345
+ } else {
346
+ // Not a valid drop, reset state
295
347
  currentState = READY;
296
348
  }
349
+ } catch (error) {
350
+ // Handle parsing errors
351
+ console.error('Drop error:', error);
352
+ currentState = READY;
297
353
  }
354
+ }
298
355
  </script>
299
356
 
300
357
  <div
@@ -1,5 +1,5 @@
1
- export default Dropzone;
2
- type Dropzone = {
1
+ export default DropZone;
2
+ type DropZone = {
3
3
  $on?(type: string, callback: (e: any) => void): () => void;
4
4
  $set?(props: Partial<{
5
5
  [key: string]: any;
@@ -11,6 +11,7 @@ type Dropzone = {
11
11
  base?: string;
12
12
  classes?: string;
13
13
  children?: Snippet<[]>;
14
+ contextKey?: ContextKey;
14
15
  empty?: Snippet<[]>;
15
16
  preview?: Snippet<[{
16
17
  item: any;
@@ -56,7 +57,7 @@ type Dropzone = {
56
57
  }) => void;
57
58
  }>): void;
58
59
  };
59
- declare const Dropzone: import("svelte").Component<{
60
+ declare const DropZone: import("svelte").Component<{
60
61
  [key: string]: any;
61
62
  zone?: string;
62
63
  group?: string;
@@ -66,6 +67,7 @@ declare const Dropzone: import("svelte").Component<{
66
67
  base?: string;
67
68
  classes?: string;
68
69
  children?: import("svelte").Snippet;
70
+ contextKey?: import("../../typedef").ContextKey;
69
71
  empty?: import("svelte").Snippet;
70
72
  preview?: import("svelte").Snippet<[{
71
73
  item: any;
@@ -1,6 +1,30 @@
1
- export function useDragState(): {
2
- readonly current: any;
3
- start(item: any, source: any, group: any): void;
4
- end(): void;
1
+ export const createOrGetDragState: (contextKey: import("../../typedef").ContextKey) => DragState;
2
+ export const createDragState: (contextKey: import("../../typedef").ContextKey) => DragState;
3
+ export const getDragState: (contextKey: import("../../typedef").ContextKey) => DragState;
4
+ declare class DragState {
5
+ draggables: Map<any, any>;
6
+ /**
7
+ * @param {string} draggableId
8
+ * @param {import('../../typedef/drag.js').DragData} dragData
9
+ */
10
+ start(draggableId: string, dragData: import("../../typedef/drag.js").DragData): void;
11
+ /**
12
+ * @param {string} draggableId
13
+ */
14
+ end(draggableId: string): void;
15
+ /**
16
+ * @param {string} draggableId
17
+ * @returns {import('../../typedef/drag.js').DragData|undefined}
18
+ */
19
+ getDraggable(draggableId: string): import("../../typedef/drag.js").DragData | undefined;
20
+ /**
21
+ * Get the most recently started drag operation (convenience method)
22
+ * @returns {import('../../typedef/drag.js').DragData|undefined}
23
+ */
24
+ get current(): import("../../typedef/drag.js").DragData | undefined;
25
+ /**
26
+ * @returns {boolean}
27
+ */
5
28
  isDragging(): boolean;
6
- };
29
+ }
30
+ export {};
@@ -1,19 +1,50 @@
1
- let currentDrag = $state(null);
1
+ // drag-state.svelte.js
2
+ import { defineStateContext } from '../../util/svelte/state-context/index.js';
2
3
 
3
- export function useDragState() {
4
- return {
5
- get current() { return currentDrag; },
6
-
7
- start(item, source, group) {
8
- currentDrag = { item, source, group };
9
- },
10
-
11
- end() {
12
- currentDrag = null;
13
- },
14
-
15
- isDragging() {
16
- return currentDrag !== null;
17
- }
18
- };
4
+ class DragState {
5
+ // Replace the single 'current' with a Map of draggable IDs
6
+ draggables = $state(new Map());
7
+
8
+ /**
9
+ * @param {string} draggableId
10
+ * @param {import('../../typedef/drag.js').DragData} dragData
11
+ */
12
+ start(draggableId, dragData) {
13
+ this.draggables.set(draggableId, dragData);
14
+ }
15
+
16
+ /**
17
+ * @param {string} draggableId
18
+ */
19
+ end(draggableId) {
20
+ this.draggables.delete(draggableId);
21
+ }
22
+
23
+ /**
24
+ * @param {string} draggableId
25
+ * @returns {import('../../typedef/drag.js').DragData|undefined}
26
+ */
27
+ getDraggable(draggableId) {
28
+ return this.draggables.get(draggableId);
29
+ }
30
+
31
+ /**
32
+ * Get the most recently started drag operation (convenience method)
33
+ * @returns {import('../../typedef/drag.js').DragData|undefined}
34
+ */
35
+ get current() {
36
+ // For backward compatibility with existing code
37
+ const entries = Array.from(this.draggables.entries());
38
+ return entries.length > 0 ? entries[entries.length - 1][1] : undefined;
39
+ }
40
+
41
+ /**
42
+ * @returns {boolean}
43
+ */
44
+ isDragging() {
45
+ return this.draggables.size > 0;
46
+ }
19
47
  }
48
+
49
+ export const [createOrGetDragState, createDragState, getDragState] =
50
+ defineStateContext(DragState);
@@ -1,2 +1,4 @@
1
1
  export { default as Draggable } from "./Draggable.svelte";
2
2
  export { default as DropZone } from "./DropZone.svelte";
3
+ export { default as DragDropContext } from "./DragDropContext.svelte";
4
+ export * from "./drag-state.svelte.js";
@@ -1,2 +1,5 @@
1
1
  export { default as Draggable } from './Draggable.svelte';
2
2
  export { default as DropZone } from './DropZone.svelte';
3
+ export { default as DragDropContext } from './DragDropContext.svelte';
4
+
5
+ export * from './drag-state.svelte.js';