@hkdigital/lib-sveltekit 0.2.8 → 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -135
- package/dist/assets/autospuiten/car-paint-picker.js +41 -41
- package/dist/assets/autospuiten/labels.js +7 -7
- package/dist/classes/cache/IndexedDbCache.js +1407 -1407
- package/dist/classes/cache/MemoryResponseCache.js +138 -138
- package/dist/classes/cache/index.js +5 -5
- package/dist/classes/cache/typedef.js +41 -41
- package/dist/classes/data/IterableTree.js +243 -243
- package/dist/classes/data/Selector.js +190 -190
- package/dist/classes/data/index.js +2 -2
- package/dist/classes/events/EventEmitter.js +275 -275
- package/dist/classes/events/index.js +2 -2
- package/dist/classes/index.js +4 -4
- package/dist/classes/logging/Logger.js +158 -158
- package/dist/classes/logging/constants.js +18 -18
- package/dist/classes/logging/index.js +4 -4
- package/dist/classes/promise/HkPromise.js +377 -377
- package/dist/classes/promise/index.js +1 -1
- package/dist/classes/services/ServiceBase.js +409 -409
- package/dist/classes/services/ServiceManager.js +1114 -1114
- package/dist/classes/services/constants.js +12 -12
- package/dist/classes/services/index.js +5 -5
- package/dist/classes/stores/SubscribersCount.js +107 -107
- package/dist/classes/stores/index.js +1 -1
- package/dist/classes/streams/LogTransformStream.js +19 -19
- package/dist/classes/streams/ServerEventsStore.js +110 -110
- package/dist/classes/streams/TimeStampSource.js +26 -26
- package/dist/classes/streams/index.js +3 -3
- package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
- package/dist/classes/svelte/audio/AudioScene.svelte.js +324 -324
- package/dist/classes/svelte/audio/mocks.js +35 -35
- package/dist/classes/svelte/finite-state-machine/FiniteStateMachine.svelte.js +133 -133
- package/dist/classes/svelte/finite-state-machine/index.js +1 -1
- package/dist/classes/svelte/image/ImageLoader.svelte.js +45 -45
- package/dist/classes/svelte/image/ImageScene.svelte.js +249 -249
- package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
- package/dist/classes/svelte/image/index.js +4 -4
- package/dist/classes/svelte/image/mocks.js +35 -35
- package/dist/classes/svelte/image/typedef.js +8 -8
- package/dist/classes/svelte/index.js +14 -14
- package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
- package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
- package/dist/classes/svelte/loading-state-machine/index.js +3 -3
- package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +338 -338
- package/dist/classes/svelte/network-loader/constants.js +3 -3
- package/dist/classes/svelte/network-loader/index.js +3 -3
- package/dist/classes/svelte/network-loader/mocks.js +30 -30
- package/dist/classes/svelte/network-loader/typedef.js +8 -8
- package/dist/components/area/HkArea.svelte +49 -49
- package/dist/components/area/HkGridArea.svelte +77 -77
- package/dist/components/area/index.js +2 -2
- package/dist/components/buttons/button/Button.svelte +82 -82
- package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -30
- package/dist/components/buttons/button-text/TextButton.svelte +21 -21
- package/dist/components/buttons/index.js +3 -3
- package/dist/components/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte +146 -146
- package/dist/components/debug/index.js +1 -1
- package/dist/components/drag-drop/DragController.js +44 -44
- package/dist/components/drag-drop/DragDropContext.svelte +111 -110
- package/dist/components/drag-drop/Draggable.svelte +502 -512
- package/dist/components/drag-drop/{Dropzone.svelte → DropZone.svelte} +258 -258
- package/dist/components/drag-drop/DropZoneArea.svelte +119 -119
- package/dist/components/drag-drop/DropZoneList.svelte +125 -125
- package/dist/components/drag-drop/actions.d.ts +9 -0
- package/dist/components/drag-drop/actions.js +26 -0
- package/dist/components/drag-drop/drag-state.svelte.d.ts +3 -1
- package/dist/components/drag-drop/drag-state.svelte.js +322 -319
- package/dist/components/drag-drop/drag-state.svelte.js__ +319 -0
- package/dist/components/drag-drop/index.js +7 -7
- package/dist/components/drag-drop/util.d.ts +0 -32
- package/dist/components/drag-drop/util.js +85 -85
- package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
- package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
- package/dist/components/icons/HkIcon.svelte +86 -86
- package/dist/components/icons/HkTabIcon.svelte +116 -116
- package/dist/components/icons/SteezeIcon.svelte +97 -97
- package/dist/components/icons/index.js +6 -6
- package/dist/components/icons/typedef.js +16 -16
- package/dist/components/index.js +2 -2
- package/dist/components/inputs/index.js +1 -1
- package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
- package/dist/components/inputs/text-input/TextInput.svelte +223 -223
- package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
- package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
- package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
- package/dist/components/layout/grid-layers/GridLayers.svelte +63 -63
- package/dist/components/layout/grid-layers/GridLayers.svelte__heightFrom__ +372 -0
- package/dist/components/layout/grid-layers/util.js +74 -74
- package/dist/components/layout/index.js +1 -1
- package/dist/components/panels/index.js +1 -1
- package/dist/components/panels/panel/Panel.svelte +43 -43
- package/dist/components/rows/index.js +3 -3
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
- package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
- package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
- package/dist/components/tab-bar/HkTabBar.svelte +74 -74
- package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
- package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
- package/dist/components/tab-bar/index.js +17 -17
- package/dist/components/tab-bar/typedef.js +11 -11
- package/dist/config/imagetools-config.js +189 -189
- package/dist/config/imagetools.d.ts +72 -72
- package/dist/constants/bases.js +13 -13
- package/dist/constants/errors/api.js +9 -9
- package/dist/constants/errors/generic.js +5 -5
- package/dist/constants/errors/index.js +3 -3
- package/dist/constants/errors/jwt.js +5 -5
- package/dist/constants/http/headers.js +6 -6
- package/dist/constants/http/index.js +2 -2
- package/dist/constants/http/methods.js +2 -2
- package/dist/constants/index.js +3 -3
- package/dist/constants/mime/application.js +5 -5
- package/dist/constants/mime/audio.js +13 -13
- package/dist/constants/mime/image.js +3 -3
- package/dist/constants/mime/index.js +4 -4
- package/dist/constants/mime/text.js +2 -2
- package/dist/constants/regexp/index.js +31 -31
- package/dist/constants/regexp/inspiratie.js__ +95 -95
- package/dist/constants/regexp/text.js +49 -49
- package/dist/constants/regexp/user.js +32 -32
- package/dist/constants/regexp/web.js +3 -3
- package/dist/constants/state-labels/drag-states.js +6 -6
- package/dist/constants/state-labels/drop-states.js +6 -6
- package/dist/constants/state-labels/input-states.js +11 -11
- package/dist/constants/state-labels/submit-states.js +4 -4
- package/dist/constants/time.js +28 -28
- package/dist/css/utilities.css +43 -43
- package/dist/design/design-config.js +73 -73
- package/dist/design/tailwind-theme-extend.js +158 -158
- package/dist/features/button-group/ButtonGroup.svelte +82 -82
- package/dist/features/button-group/typedef.js +10 -10
- package/dist/features/compare-left-right/CompareLeftRight.svelte +179 -179
- package/dist/features/compare-left-right/index.js +1 -1
- package/dist/features/game-box/GameBox.svelte +577 -577
- package/dist/features/game-box/gamebox.util.js +83 -83
- package/dist/features/hk-app-layout/HkAppLayout.state.svelte.js +25 -25
- package/dist/features/hk-app-layout/HkAppLayout.svelte +251 -251
- package/dist/features/image-box/ImageBox.svelte +210 -210
- package/dist/features/image-box/index.js +5 -5
- package/dist/features/image-box/typedef.js +32 -32
- package/dist/features/index.js +23 -23
- package/dist/features/presenter/ImageSlide.svelte +64 -64
- package/dist/features/presenter/Presenter.state.svelte.js +638 -638
- package/dist/features/presenter/Presenter.svelte +142 -142
- package/dist/features/presenter/constants.js +7 -7
- package/dist/features/presenter/index.js +10 -10
- package/dist/features/presenter/typedef.js +106 -106
- package/dist/features/presenter/util.js +210 -210
- package/dist/features/virtual-viewport/VirtualViewport.svelte +196 -196
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/validate-url.js +180 -180
- package/dist/server/index.js +1 -1
- package/dist/server/logger.js +94 -94
- package/dist/states/index.js +1 -1
- package/dist/states/navigation.svelte.js +55 -55
- package/dist/stores/index.js +1 -1
- package/dist/stores/theme.js +80 -80
- package/dist/themes/hkdev/components/blocks/text-block.css +41 -41
- package/dist/themes/hkdev/components/boxes/game-box.css +12 -12
- package/dist/themes/hkdev/components/buttons/button-icon-steeze.css +22 -22
- package/dist/themes/hkdev/components/buttons/button-text.css +32 -32
- package/dist/themes/hkdev/components/buttons/button.css +146 -146
- package/dist/themes/hkdev/components/buttons/skip-button.css +6 -6
- package/dist/themes/hkdev/components/drag-drop/draggable.css +73 -73
- package/dist/themes/hkdev/components/drag-drop/drop-zone.css +48 -48
- package/dist/themes/hkdev/components/icons/icon-steeze.css +22 -22
- package/dist/themes/hkdev/components/inputs/text-input.css +104 -104
- package/dist/themes/hkdev/components/panels/panel.css +27 -27
- package/dist/themes/hkdev/components/rows/panel-grid-row.css +6 -6
- package/dist/themes/hkdev/components/rows/panel-row-2.css +7 -7
- package/dist/themes/hkdev/components.css +53 -53
- package/dist/themes/hkdev/debug.css +1 -1
- package/dist/themes/hkdev/global/layout.css +39 -39
- package/dist/themes/hkdev/global/on-colors.css +53 -53
- package/dist/themes/hkdev/globals.css +11 -11
- package/dist/themes/hkdev/responsive.css +12 -12
- package/dist/themes/hkdev/theme-ext.js +15 -15
- package/dist/themes/hkdev/theme.js +235 -235
- package/dist/themes/index.js +1 -1
- package/dist/typedef/context.js +6 -6
- package/dist/typedef/drag.js +25 -25
- package/dist/typedef/drop.js +12 -12
- package/dist/typedef/image.js +38 -38
- package/dist/typedef/index.js +4 -4
- package/dist/util/array/index.js +436 -436
- package/dist/util/bases/base58.js +262 -262
- package/dist/util/bases/index.js +1 -1
- package/dist/util/compare/index.js +247 -247
- package/dist/util/css/css-vars.js +83 -83
- package/dist/util/css/index.js +1 -1
- package/dist/util/design-system/components/states.js +22 -22
- package/dist/util/design-system/css/clamp.js +66 -66
- package/dist/util/design-system/css/root-design-vars.js +102 -102
- package/dist/util/design-system/index.js +5 -5
- package/dist/util/design-system/layout/scaling.js +228 -228
- package/dist/util/design-system/skeleton.js +208 -208
- package/dist/util/design-system/tailwind.js +288 -288
- package/dist/util/env/index.js +9 -9
- package/dist/util/expect/arrays.js +47 -47
- package/dist/util/expect/index.js +259 -259
- package/dist/util/expect/primitives.js +55 -55
- package/dist/util/expect/url.js +60 -60
- package/dist/util/function/index.js +218 -218
- package/dist/util/geo/index.js +26 -26
- package/dist/util/http/caching.js +263 -263
- package/dist/util/http/errors.js +97 -97
- package/dist/util/http/headers.js +75 -75
- package/dist/util/http/http-request.js +379 -379
- package/dist/util/http/index.js +22 -22
- package/dist/util/http/json-request.js +224 -224
- package/dist/util/http/mocks.js +65 -65
- package/dist/util/http/response.js +294 -294
- package/dist/util/http/test-data__/content-length-test-hkdigital-small.V4HfZyBQ.avif +0 -0
- package/dist/util/http/typedef.js +93 -93
- package/dist/util/http/url.js +52 -52
- package/dist/util/image/index.js +86 -86
- package/dist/util/index.js +2 -2
- package/dist/util/is/index.js +140 -140
- package/dist/util/iterate/index.js +234 -234
- package/dist/util/object/index.js +1361 -1361
- package/dist/util/singleton/index.js +97 -97
- package/dist/util/string/array-path.js +75 -75
- package/dist/util/string/convert.js +54 -54
- package/dist/util/string/fs.js +226 -226
- package/dist/util/string/index.js +5 -5
- package/dist/util/string/interpolate.js +61 -61
- package/dist/util/string/pad.js +10 -10
- package/dist/util/svelte/index.js +4 -4
- package/dist/util/svelte/loading/loading-tracker.svelte.js +108 -108
- package/dist/util/svelte/observe/index.js +49 -49
- package/dist/util/svelte/state-context/index.js +117 -117
- package/dist/util/svelte/wait/index.js +38 -38
- package/dist/util/sveltekit/index.js +1 -1
- package/dist/util/sveltekit/route-folders/index.js +101 -101
- package/dist/util/time/index.js +323 -323
- package/dist/util/unique/index.js +249 -249
- package/dist/valibot/date.js__ +10 -10
- package/dist/valibot/index.js +9 -9
- package/dist/valibot/url.js +95 -95
- package/dist/valibot/user.js +23 -23
- package/dist/zod/all.js +33 -33
- package/dist/zod/generic.js +11 -11
- package/dist/zod/javascript.js +32 -32
- package/dist/zod/user.js +16 -16
- package/dist/zod/web.js +52 -52
- package/package.json +112 -112
@@ -0,0 +1,319 @@
|
|
1
|
+
// drag-state.svelte.js
|
2
|
+
import { defineStateContext } from '$lib/util/svelte/state-context/index.js';
|
3
|
+
|
4
|
+
/** @typedef {import('$lib/typedef').SimulatedDragEvent} SimulatedDragEvent */
|
5
|
+
|
6
|
+
class DragState {
|
7
|
+
// Existing draggables map
|
8
|
+
draggables = $state(new Map());
|
9
|
+
|
10
|
+
// New: Registry for dropzones
|
11
|
+
dropZones = $state(new Map());
|
12
|
+
|
13
|
+
// Track which dropzone is currently active
|
14
|
+
activeDropZone = $state(null);
|
15
|
+
|
16
|
+
// Track the last active drop zone
|
17
|
+
// - activeDropZone gets cleared by dragLeavr
|
18
|
+
// - but we need it in 'end'
|
19
|
+
lastActiveDropZone = null;
|
20
|
+
|
21
|
+
/**
|
22
|
+
* Register a dropzone
|
23
|
+
* @param {string} zoneId
|
24
|
+
* @param {Object} config
|
25
|
+
* @param {string} config.zone
|
26
|
+
* @param {string} config.group
|
27
|
+
* @param {Function} config.accepts
|
28
|
+
* @param {Function} config.onDragEnter
|
29
|
+
* @param {Function} config.onDragOver
|
30
|
+
* @param {Function} config.onDragLeave
|
31
|
+
* @param {(DropData) => void} config.onDrop
|
32
|
+
* @param {HTMLElement} config.element
|
33
|
+
*/
|
34
|
+
registerDropZone(zoneId, config) {
|
35
|
+
if (this.dropZones.has(zoneId)) {
|
36
|
+
throw new Error(`Zone [${zoneId}] is already registered`);
|
37
|
+
}
|
38
|
+
|
39
|
+
this.dropZones.set(zoneId, {
|
40
|
+
...config,
|
41
|
+
isOver: false,
|
42
|
+
canDrop: false
|
43
|
+
});
|
44
|
+
}
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Unregister a dropzone
|
48
|
+
* @param {string} zoneId
|
49
|
+
*/
|
50
|
+
unregisterDropZone(zoneId) {
|
51
|
+
if (this.activeDropZone === zoneId) {
|
52
|
+
this.activeDropZone = null;
|
53
|
+
}
|
54
|
+
this.dropZones.delete(zoneId);
|
55
|
+
}
|
56
|
+
|
57
|
+
/**
|
58
|
+
* Get dropzone at coordinates
|
59
|
+
* @param {number} x
|
60
|
+
* @param {number} y
|
61
|
+
* @returns {Object|null}
|
62
|
+
*/
|
63
|
+
getDropZoneAtPoint(x, y) {
|
64
|
+
// Check all registered dropzones
|
65
|
+
for (const [zoneId, config] of this.dropZones) {
|
66
|
+
const rect = config.element.getBoundingClientRect();
|
67
|
+
|
68
|
+
if (
|
69
|
+
x >= rect.left &&
|
70
|
+
x <= rect.right &&
|
71
|
+
y >= rect.top &&
|
72
|
+
y <= rect.bottom
|
73
|
+
) {
|
74
|
+
// Found a dropzone at this point
|
75
|
+
// Check if it's the deepest one (for nested zones)
|
76
|
+
let deepestZone = { zoneId, config, depth: 0 };
|
77
|
+
|
78
|
+
// Check for nested dropzones
|
79
|
+
for (const [otherId, otherConfig] of this.dropZones) {
|
80
|
+
if (otherId === zoneId) continue;
|
81
|
+
|
82
|
+
const otherRect = otherConfig.element.getBoundingClientRect();
|
83
|
+
if (
|
84
|
+
x >= otherRect.left &&
|
85
|
+
x <= otherRect.right &&
|
86
|
+
y >= otherRect.top &&
|
87
|
+
y <= otherRect.bottom
|
88
|
+
) {
|
89
|
+
// Check if this zone is nested inside our current zone
|
90
|
+
if (config.element.contains(otherConfig.element)) {
|
91
|
+
deepestZone = {
|
92
|
+
zoneId: otherId,
|
93
|
+
config: otherConfig,
|
94
|
+
depth: deepestZone.depth + 1
|
95
|
+
};
|
96
|
+
}
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
return { zoneId: deepestZone.zoneId, config: deepestZone.config };
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
return null;
|
105
|
+
}
|
106
|
+
|
107
|
+
/**
|
108
|
+
* Update active dropzone based on coordinates
|
109
|
+
*
|
110
|
+
* @param {number} x
|
111
|
+
* @param {number} y
|
112
|
+
* @param {DragEvent|SimulatedDragEvent} event
|
113
|
+
*/
|
114
|
+
updateActiveDropZone(x, y, event) {
|
115
|
+
const dropZone = this.getDropZoneAtPoint(x, y);
|
116
|
+
const newActiveId = dropZone?.zoneId || null;
|
117
|
+
|
118
|
+
// Handle leave/enter transitions
|
119
|
+
if (this.activeDropZone !== newActiveId) {
|
120
|
+
// Leave previous zone
|
121
|
+
if (this.activeDropZone) {
|
122
|
+
this.lastActiveDropZone = this.activeDropZone;
|
123
|
+
|
124
|
+
const prevConfig = this.dropZones.get(this.activeDropZone);
|
125
|
+
if (prevConfig) {
|
126
|
+
prevConfig.isOver = false;
|
127
|
+
prevConfig.canDrop = false;
|
128
|
+
prevConfig.onDragLeave?.({ event, zone: prevConfig.zone });
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|
132
|
+
// Enter new zone
|
133
|
+
if (newActiveId && dropZone) {
|
134
|
+
const dragData = this.getDraggable(event);
|
135
|
+
const canDrop = dragData && dropZone.config.accepts(dragData);
|
136
|
+
|
137
|
+
dropZone.config.isOver = true;
|
138
|
+
dropZone.config.canDrop = canDrop;
|
139
|
+
dropZone.config.onDragEnter?.({
|
140
|
+
event,
|
141
|
+
zone: dropZone.config.zone,
|
142
|
+
canDrop
|
143
|
+
});
|
144
|
+
}
|
145
|
+
|
146
|
+
this.activeDropZone = newActiveId;
|
147
|
+
} else if (newActiveId) {
|
148
|
+
// Still in the same zone, just send dragOver
|
149
|
+
dropZone.config.onDragOver?.({ event, zone: dropZone.config.zone });
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
/**
|
154
|
+
* Handle drop at coordinates
|
155
|
+
* @param {number} x
|
156
|
+
* @param {number} y
|
157
|
+
* @param {DragEvent|SimulatedDragEvent} event
|
158
|
+
*/
|
159
|
+
handleDropAtPoint(x, y, event) {
|
160
|
+
const dropZone = this.getDropZoneAtPoint(x, y);
|
161
|
+
|
162
|
+
if (dropZone && dropZone.config.canDrop) {
|
163
|
+
const dragData = this.getDraggable(event);
|
164
|
+
|
165
|
+
if (dragData && dropZone.config.element) {
|
166
|
+
// Calculate drop position relative to dropzone
|
167
|
+
const rect = dropZone.config.element.getBoundingClientRect();
|
168
|
+
|
169
|
+
const style = window.getComputedStyle(dropZone.config.element);
|
170
|
+
|
171
|
+
const borderLeftWidth = parseInt(style.borderLeftWidth, 10) || 0;
|
172
|
+
const borderTopWidth = parseInt(style.borderTopWidth, 10) || 0;
|
173
|
+
|
174
|
+
const dropOffsetX = x - rect.left - borderLeftWidth;
|
175
|
+
const dropOffsetY = y - rect.top - borderTopWidth;
|
176
|
+
|
177
|
+
const dropX = dropOffsetX - (dragData.offsetX ?? 0);
|
178
|
+
const dropY = dropOffsetY - (dragData.offsetY ?? 0);
|
179
|
+
|
180
|
+
// Call the dropzone's drop handler
|
181
|
+
dropZone.config.onDrop?.({
|
182
|
+
zone: dropZone.config.zone,
|
183
|
+
source: dragData.source,
|
184
|
+
item: dragData.item,
|
185
|
+
x: dropX,
|
186
|
+
y: dropY,
|
187
|
+
drag: dragData,
|
188
|
+
drop: {
|
189
|
+
offsetX: dropOffsetX,
|
190
|
+
offsetY: dropOffsetY,
|
191
|
+
target: dropZone.config.element
|
192
|
+
}
|
193
|
+
});
|
194
|
+
}
|
195
|
+
}
|
196
|
+
|
197
|
+
// Ensure we notify the active dropzone that drag ended
|
198
|
+
if (this.activeDropZone) {
|
199
|
+
const config = this.dropZones.get(this.activeDropZone);
|
200
|
+
if (config) {
|
201
|
+
config.isOver = false;
|
202
|
+
config.canDrop = false;
|
203
|
+
config.onDragLeave?.({ event, zone: config.zone });
|
204
|
+
}
|
205
|
+
}
|
206
|
+
|
207
|
+
// Reset active dropzone
|
208
|
+
this.activeDropZone = null;
|
209
|
+
}
|
210
|
+
|
211
|
+
/**
|
212
|
+
* @param {string} draggableId
|
213
|
+
* @param {import('$lib/typedef/drag.js').DragData} dragData
|
214
|
+
*/
|
215
|
+
start(draggableId, dragData) {
|
216
|
+
this.draggables.set(draggableId, dragData);
|
217
|
+
}
|
218
|
+
|
219
|
+
/**
|
220
|
+
* @param {string} draggableId
|
221
|
+
*/
|
222
|
+
end(draggableId) {
|
223
|
+
this.draggables.delete(draggableId);
|
224
|
+
|
225
|
+
// Check both current AND last active dropzone
|
226
|
+
const zoneToNotify = this.activeDropZone || this.lastActiveDropZone;
|
227
|
+
|
228
|
+
if (zoneToNotify) {
|
229
|
+
const config = this.dropZones.get(zoneToNotify);
|
230
|
+
if (config && (config.isOver || config.canDrop)) {
|
231
|
+
config.isOver = false;
|
232
|
+
config.canDrop = false;
|
233
|
+
config.onDragLeave?.({
|
234
|
+
event: new DragEvent('dragend'),
|
235
|
+
zone: config.zone
|
236
|
+
});
|
237
|
+
}
|
238
|
+
}
|
239
|
+
|
240
|
+
this.activeDropZone = null;
|
241
|
+
this.lastActiveDropZone = null;
|
242
|
+
}
|
243
|
+
|
244
|
+
/**
|
245
|
+
* Get a drag data by draggable id
|
246
|
+
*
|
247
|
+
* @param {string} draggableId
|
248
|
+
* @returns {import('$lib/typedef/drag.js').DragData|undefined}
|
249
|
+
*/
|
250
|
+
getDraggableById(draggableId) {
|
251
|
+
return this.draggables.get(draggableId);
|
252
|
+
}
|
253
|
+
|
254
|
+
/**
|
255
|
+
* Get a drag data. Extracts draggable id from the supplied DragEvent
|
256
|
+
*
|
257
|
+
* @param {DragEvent|SimulatedDragEvent} event
|
258
|
+
*
|
259
|
+
* @returns {Object|null} The drag data, or null for file drops
|
260
|
+
*/
|
261
|
+
getDraggable(event) {
|
262
|
+
// Check if this is a file drop first
|
263
|
+
if (event.dataTransfer && event.dataTransfer.types) {
|
264
|
+
// Check if types is an array or DOMStringList
|
265
|
+
const types = Array.from(event.dataTransfer.types);
|
266
|
+
if (types.includes('Files')) {
|
267
|
+
return null; // This is a file drop, not an internal drag
|
268
|
+
}
|
269
|
+
}
|
270
|
+
|
271
|
+
// For dragover events, we can't read dataTransfer.getData in Chrome
|
272
|
+
// Instead, check if we have an active drag operation
|
273
|
+
if (event.type === 'dragover'|| event.type === 'dragenter') {
|
274
|
+
if (this.draggables.size > 0) {
|
275
|
+
// Return the most recent drag operation
|
276
|
+
return this.current;
|
277
|
+
}
|
278
|
+
}
|
279
|
+
|
280
|
+
// For drop events, we can read the data
|
281
|
+
if (event.type === 'drop' && event.dataTransfer) {
|
282
|
+
try {
|
283
|
+
const jsonData = event.dataTransfer.getData('application/json');
|
284
|
+
if (jsonData) {
|
285
|
+
const transferData = JSON.parse(jsonData);
|
286
|
+
const draggableId = transferData.draggableId;
|
287
|
+
|
288
|
+
if (draggableId) {
|
289
|
+
return this.getDraggableById(draggableId);
|
290
|
+
}
|
291
|
+
}
|
292
|
+
} catch (error) {
|
293
|
+
console.error('Error getting drag data from drop:', error);
|
294
|
+
}
|
295
|
+
}
|
296
|
+
|
297
|
+
// Fallback to checking active drags
|
298
|
+
return this.current;
|
299
|
+
}
|
300
|
+
|
301
|
+
/**
|
302
|
+
* Get the most recently started drag operation (convenience method)
|
303
|
+
* @returns {import('$lib/typedef/drag.js').DragData|undefined}
|
304
|
+
*/
|
305
|
+
get current() {
|
306
|
+
const entries = Array.from(this.draggables.entries());
|
307
|
+
return entries.length > 0 ? entries[entries.length - 1][1] : undefined;
|
308
|
+
}
|
309
|
+
|
310
|
+
/**
|
311
|
+
* @returns {boolean}
|
312
|
+
*/
|
313
|
+
isDragging() {
|
314
|
+
return this.draggables.size > 0;
|
315
|
+
}
|
316
|
+
}
|
317
|
+
|
318
|
+
export const [createOrGetDragState, createDragState, getDragState] =
|
319
|
+
defineStateContext(DragState);
|
@@ -1,7 +1,7 @@
|
|
1
|
-
export { default as Draggable } from './Draggable.svelte';
|
2
|
-
export { default as DropZone } from './DropZone.svelte';
|
3
|
-
export { default as DropZoneList } from './DropZoneList.svelte';
|
4
|
-
export { default as DropZoneArea } from './DropZoneArea.svelte';
|
5
|
-
export { default as DragDropContext } from './DragDropContext.svelte';
|
6
|
-
|
7
|
-
export * from './drag-state.svelte.js';
|
1
|
+
export { default as Draggable } from './Draggable.svelte';
|
2
|
+
export { default as DropZone } from './DropZone.svelte';
|
3
|
+
export { default as DropZoneList } from './DropZoneList.svelte';
|
4
|
+
export { default as DropZoneArea } from './DropZoneArea.svelte';
|
5
|
+
export { default as DragDropContext } from './DragDropContext.svelte';
|
6
|
+
|
7
|
+
export * from './drag-state.svelte.js';
|
@@ -1,32 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Find the source draggable element from an event
|
3
|
-
*
|
4
|
-
* @param {DragEvent} event
|
5
|
-
* @returns {HTMLElement|null}
|
6
|
-
*/
|
7
|
-
export function findDraggableSource(event: DragEvent): HTMLElement | null;
|
8
|
-
/**
|
9
|
-
* Get draggable ID from an event, if available
|
10
|
-
* @param {DragEvent} event
|
11
|
-
* @returns {string|null}
|
12
|
-
*/
|
13
|
-
export function getDraggableIdFromEvent(event: DragEvent): string | null;
|
14
|
-
/**
|
15
|
-
* Process a drop event with the provided data and handlers
|
16
|
-
* @param {DragEvent} event
|
17
|
-
* @param {any} data The drag data
|
18
|
-
* @param {Object} options
|
19
|
-
* @param {Function} options.onDropStart Optional drop start handler
|
20
|
-
* @param {Function} options.onDrop Main drop handler
|
21
|
-
* @param {Function} options.onDropEnd Optional drop end handler
|
22
|
-
* @param {string} options.zone The drop zone identifier
|
23
|
-
* @param {Function} options.setState Function to update component state
|
24
|
-
* @returns {Promise<boolean>} Success status
|
25
|
-
*/
|
26
|
-
export function processDropWithData(event: DragEvent, data: any, { onDropStart, onDrop, onDropEnd, zone, setState }: {
|
27
|
-
onDropStart: Function;
|
28
|
-
onDrop: Function;
|
29
|
-
onDropEnd: Function;
|
30
|
-
zone: string;
|
31
|
-
setState: Function;
|
32
|
-
}): Promise<boolean>;
|
@@ -1,85 +1,85 @@
|
|
1
|
-
import { createOrGetDragState } from './drag-state.svelte.js';
|
2
|
-
|
3
|
-
/**
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
export function findDraggableSource(event) {
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
}
|
30
|
-
|
31
|
-
/**
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
export function getDraggableIdFromEvent(event) {
|
37
|
-
|
38
|
-
|
39
|
-
}
|
40
|
-
|
41
|
-
/**
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
export async function processDropWithData(
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
) {
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
}
|
1
|
+
// import { createOrGetDragState } from './drag-state.svelte.js';
|
2
|
+
|
3
|
+
// /**
|
4
|
+
// * Find the source draggable element from an event
|
5
|
+
// *
|
6
|
+
// * @param {DragEvent} event
|
7
|
+
// * @returns {HTMLElement|null}
|
8
|
+
// */
|
9
|
+
// export function findDraggableSource(event) {
|
10
|
+
// const target = /** @type {Element|EventTarget|null} */ (event.target);
|
11
|
+
|
12
|
+
// if (!(target instanceof Element)) {
|
13
|
+
// return null;
|
14
|
+
// }
|
15
|
+
|
16
|
+
// let element = /** @type {Element|null} */ (target);
|
17
|
+
|
18
|
+
// // Walk up the DOM tree
|
19
|
+
// while (element !== null && element !== document.body) {
|
20
|
+
// if (element.hasAttribute('data-id')) {
|
21
|
+
// // Return as HTMLElement if needed
|
22
|
+
// return /** @type {HTMLElement} */ (element);
|
23
|
+
// }
|
24
|
+
|
25
|
+
// element = element.parentElement;
|
26
|
+
// }
|
27
|
+
|
28
|
+
// return null;
|
29
|
+
// }
|
30
|
+
|
31
|
+
// /**
|
32
|
+
// * Get draggable ID from an event, if available
|
33
|
+
// * @param {DragEvent} event
|
34
|
+
// * @returns {string|null}
|
35
|
+
// */
|
36
|
+
// export function getDraggableIdFromEvent(event) {
|
37
|
+
// const element = findDraggableSource(event);
|
38
|
+
// return element ? element.getAttribute('data-id') : null;
|
39
|
+
// }
|
40
|
+
|
41
|
+
// /**
|
42
|
+
// * Process a drop event with the provided data and handlers
|
43
|
+
// * @param {DragEvent} event
|
44
|
+
// * @param {any} data The drag data
|
45
|
+
// * @param {Object} options
|
46
|
+
// * @param {Function} options.onDropStart Optional drop start handler
|
47
|
+
// * @param {Function} options.onDrop Main drop handler
|
48
|
+
// * @param {Function} options.onDropEnd Optional drop end handler
|
49
|
+
// * @param {string} options.zone The drop zone identifier
|
50
|
+
// * @param {Function} options.setState Function to update component state
|
51
|
+
// * @returns {Promise<boolean>} Success status
|
52
|
+
// */
|
53
|
+
// export async function processDropWithData(
|
54
|
+
// event,
|
55
|
+
// data,
|
56
|
+
// { onDropStart, onDrop, onDropEnd, zone, setState }
|
57
|
+
// ) {
|
58
|
+
// try {
|
59
|
+
// // Update state and notify listeners
|
60
|
+
// setState('ACTIVE_DROP');
|
61
|
+
// onDropStart?.({ event, zone, data });
|
62
|
+
|
63
|
+
// // Call the onDrop handler
|
64
|
+
// const dropResult = onDrop?.({
|
65
|
+
// event,
|
66
|
+
// zone,
|
67
|
+
// item: data.item,
|
68
|
+
// source: data.source,
|
69
|
+
// metadata: data.metadata
|
70
|
+
// });
|
71
|
+
|
72
|
+
// // Handle async or sync results
|
73
|
+
// await Promise.resolve(dropResult);
|
74
|
+
|
75
|
+
// // Success path
|
76
|
+
// setState('READY');
|
77
|
+
// onDropEnd?.({ event, zone, data, success: true });
|
78
|
+
// return true;
|
79
|
+
// } catch (error) {
|
80
|
+
// // Error path
|
81
|
+
// setState('READY');
|
82
|
+
// onDropEnd?.({ event, zone, data, success: false, error });
|
83
|
+
// return false;
|
84
|
+
// }
|
85
|
+
// }
|
@@ -1,47 +1,47 @@
|
|
1
|
-
<script>
|
2
|
-
/**
|
3
|
-
* @type {{
|
4
|
-
* base?: string,
|
5
|
-
* bg?: string,
|
6
|
-
* classes?: string,
|
7
|
-
* title?: import('svelte').Snippet,
|
8
|
-
* content?: import('svelte').Snippet,
|
9
|
-
* footer?: import('svelte').Snippet
|
10
|
-
* } & { [attr: string]: * }}
|
11
|
-
*/
|
12
|
-
let {
|
13
|
-
// Style
|
14
|
-
base,
|
15
|
-
bg,
|
16
|
-
classes,
|
17
|
-
|
18
|
-
// Content
|
19
|
-
title,
|
20
|
-
content,
|
21
|
-
footer,
|
22
|
-
|
23
|
-
// Attributes
|
24
|
-
...attrs
|
25
|
-
} = $props();
|
26
|
-
</script>
|
27
|
-
|
28
|
-
<div data-title-text-button-block class="{base} {bg} {classes}" {...attrs}>
|
29
|
-
{#if title}
|
30
|
-
<h1 class="title-box h1">
|
31
|
-
{@render title()}
|
32
|
-
</h1>
|
33
|
-
{/if}
|
34
|
-
|
35
|
-
{#if content}
|
36
|
-
<div class="content-box">
|
37
|
-
{@render content()}
|
38
|
-
</div>
|
39
|
-
{/if}
|
40
|
-
|
41
|
-
{#if footer}
|
42
|
-
<div class="footer-box">
|
43
|
-
{@render footer()}
|
44
|
-
</div>
|
45
|
-
{/if}
|
46
|
-
</div>
|
1
|
+
<script>
|
2
|
+
/**
|
3
|
+
* @type {{
|
4
|
+
* base?: string,
|
5
|
+
* bg?: string,
|
6
|
+
* classes?: string,
|
7
|
+
* title?: import('svelte').Snippet,
|
8
|
+
* content?: import('svelte').Snippet,
|
9
|
+
* footer?: import('svelte').Snippet
|
10
|
+
* } & { [attr: string]: * }}
|
11
|
+
*/
|
12
|
+
let {
|
13
|
+
// Style
|
14
|
+
base,
|
15
|
+
bg,
|
16
|
+
classes,
|
17
|
+
|
18
|
+
// Content
|
19
|
+
title,
|
20
|
+
content,
|
21
|
+
footer,
|
22
|
+
|
23
|
+
// Attributes
|
24
|
+
...attrs
|
25
|
+
} = $props();
|
26
|
+
</script>
|
27
|
+
|
28
|
+
<div data-title-text-button-block class="{base} {bg} {classes}" {...attrs}>
|
29
|
+
{#if title}
|
30
|
+
<h1 class="title-box h1">
|
31
|
+
{@render title()}
|
32
|
+
</h1>
|
33
|
+
{/if}
|
34
|
+
|
35
|
+
{#if content}
|
36
|
+
<div class="content-box">
|
37
|
+
{@render content()}
|
38
|
+
</div>
|
39
|
+
{/if}
|
40
|
+
|
41
|
+
{#if footer}
|
42
|
+
<div class="footer-box">
|
43
|
+
{@render footer()}
|
44
|
+
</div>
|
45
|
+
{/if}
|
46
|
+
</div>
|
47
47
|
|