@hkdigital/lib-sveltekit 0.1.77 → 0.1.78
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/components/drag-drop/DragDropContext.svelte +26 -0
- package/dist/components/drag-drop/DragDropContext.svelte.d.ts +18 -0
- package/dist/components/drag-drop/Draggable.svelte +16 -6
- package/dist/components/drag-drop/Draggable.svelte.d.ts +2 -0
- package/dist/components/drag-drop/{Dropzone.svelte → DropZone.svelte} +147 -90
- package/dist/components/drag-drop/{Dropzone.svelte.d.ts → DropZone.svelte.d.ts} +5 -3
- package/dist/components/drag-drop/drag-state.svelte.d.ts +29 -5
- package/dist/components/drag-drop/drag-state.svelte.js +48 -17
- package/dist/components/drag-drop/index.d.ts +2 -0
- package/dist/components/drag-drop/index.js +3 -0
- package/dist/components/drag-drop/util.d.ts +32 -0
- package/dist/components/drag-drop/util.js +85 -0
- package/dist/components/tab-bar/HkTabBar.state.svelte.d.ts +4 -4
- package/dist/components/tab-bar/HkTabBar.svelte +3 -3
- package/dist/components/tab-bar/HkTabBar.svelte.d.ts +2 -2
- package/dist/components/tab-bar/HkTabBarSelector.state.svelte.d.ts +3 -3
- package/dist/components/tab-bar/HkTabBarSelector.svelte +3 -3
- package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +2 -2
- package/dist/components/tab-bar/index.d.ts +1 -0
- package/dist/components/tab-bar/typedef.d.ts +3 -1
- package/dist/components/tab-bar/typedef.js +3 -0
- package/dist/typedef/context.d.ts +3 -0
- package/dist/typedef/context.js +6 -0
- package/dist/typedef/index.d.ts +1 -0
- package/dist/typedef/index.js +1 -0
- package/dist/util/svelte/state-context/index.d.ts +2 -1
- package/dist/util/svelte/state-context/index.js +46 -12
- package/dist/widgets/game-box/GameBox.svelte +1 -0
- package/dist/widgets/hk-app-layout/HkAppLayout.state.svelte.d.ts +3 -3
- package/dist/widgets/image-box/ImageBox.svelte +2 -4
- package/package.json +3 -1
- package/dist/components/drag-drop/Dropzone.svelte__ +0 -282
@@ -1,282 +0,0 @@
|
|
1
|
-
<script>
|
2
|
-
import { onMount, onDestroy } from 'svelte';
|
3
|
-
import { toStateClasses } from '$lib/util/design-system/index.js';
|
4
|
-
import { useDragState } from './drag-state.svelte.js';
|
5
|
-
|
6
|
-
import {
|
7
|
-
READY,
|
8
|
-
DRAG_OVER,
|
9
|
-
CAN_DROP,
|
10
|
-
CANNOT_DROP,
|
11
|
-
DROP_DISABLED,
|
12
|
-
ACTIVE_DROP
|
13
|
-
} from '$lib/constants/state-labels/drop-states.js';
|
14
|
-
|
15
|
-
const dragState = useDragState();
|
16
|
-
|
17
|
-
/**
|
18
|
-
* @type {{
|
19
|
-
* zone?: string,
|
20
|
-
* group?: string,
|
21
|
-
* disabled?: boolean,
|
22
|
-
* accepts?: (item: any) => boolean,
|
23
|
-
* maxItems?: number,
|
24
|
-
* base?: string,
|
25
|
-
* classes?: string,
|
26
|
-
* children?: import('svelte').Snippet,
|
27
|
-
* empty?: import('svelte').Snippet,
|
28
|
-
* preview?: import('svelte').Snippet<[{
|
29
|
-
* item: any,
|
30
|
-
* source: string,
|
31
|
-
* group: string,
|
32
|
-
* metadata?: any
|
33
|
-
* }]>,
|
34
|
-
* isDragOver?: boolean,
|
35
|
-
* canDrop?: boolean,
|
36
|
-
* isDropping?: boolean,
|
37
|
-
* itemCount?: number,
|
38
|
-
* onDragEnter?: (detail: {
|
39
|
-
* event: DragEvent,
|
40
|
-
* zone: string,
|
41
|
-
* canDrop: boolean
|
42
|
-
* }) => void,
|
43
|
-
* onDragOver?: (detail: {
|
44
|
-
* event: DragEvent,
|
45
|
-
* zone: string
|
46
|
-
* }) => void,
|
47
|
-
* onDragLeave?: (detail: {
|
48
|
-
* event: DragEvent,
|
49
|
-
* zone: string
|
50
|
-
* }) => void,
|
51
|
-
* onDrop?: (detail: {
|
52
|
-
* event: DragEvent,
|
53
|
-
* zone: string,
|
54
|
-
* item: any,
|
55
|
-
* source: string,
|
56
|
-
* metadata?: any
|
57
|
-
* }) => any | Promise<any>,
|
58
|
-
* onDropStart?: (detail: {
|
59
|
-
* event: DragEvent,
|
60
|
-
* zone: string,
|
61
|
-
* data: any
|
62
|
-
* }) => void,
|
63
|
-
* onDropEnd?: (detail: {
|
64
|
-
* event: DragEvent,
|
65
|
-
* zone: string,
|
66
|
-
* data: any,
|
67
|
-
* success: boolean,
|
68
|
-
* error?: Error
|
69
|
-
* }) => void,
|
70
|
-
* [key: string]: any
|
71
|
-
* }}
|
72
|
-
*/
|
73
|
-
let {
|
74
|
-
zone = 'default',
|
75
|
-
group = 'default',
|
76
|
-
disabled = false,
|
77
|
-
accepts = () => true,
|
78
|
-
maxItems = Infinity,
|
79
|
-
base = '',
|
80
|
-
classes = '',
|
81
|
-
children,
|
82
|
-
empty,
|
83
|
-
preview,
|
84
|
-
isDragOver = $bindable(false),
|
85
|
-
canDrop = $bindable(false),
|
86
|
-
isDropping = $bindable(false),
|
87
|
-
itemCount = $bindable(0),
|
88
|
-
onDragEnter,
|
89
|
-
onDragOver,
|
90
|
-
onDragLeave,
|
91
|
-
onDrop,
|
92
|
-
onDropStart,
|
93
|
-
onDropEnd,
|
94
|
-
...attrs
|
95
|
-
} = $props();
|
96
|
-
|
97
|
-
let currentState = $state(READY);
|
98
|
-
let dragCounter = 0;
|
99
|
-
|
100
|
-
// Cleanup function
|
101
|
-
let cleanup;
|
102
|
-
|
103
|
-
onMount(() => {
|
104
|
-
// Global dragend listener to ensure state cleanup
|
105
|
-
const handleGlobalDragEnd = () => {
|
106
|
-
dragCounter = 0;
|
107
|
-
currentState = READY;
|
108
|
-
};
|
109
|
-
|
110
|
-
document.addEventListener('dragend', handleGlobalDragEnd);
|
111
|
-
|
112
|
-
cleanup = () => {
|
113
|
-
document.removeEventListener('dragend', handleGlobalDragEnd);
|
114
|
-
};
|
115
|
-
});
|
116
|
-
|
117
|
-
onDestroy(() => {
|
118
|
-
cleanup?.();
|
119
|
-
});
|
120
|
-
|
121
|
-
// Computed state object for CSS classes
|
122
|
-
let stateObject = $derived({
|
123
|
-
ready: currentState === READY,
|
124
|
-
'drag-over': currentState === DRAG_OVER,
|
125
|
-
'can-drop': currentState === CAN_DROP,
|
126
|
-
'cannot-drop': currentState === CANNOT_DROP,
|
127
|
-
'drop-disabled': disabled,
|
128
|
-
'active-drop': currentState === ACTIVE_DROP
|
129
|
-
});
|
130
|
-
|
131
|
-
let stateClasses = $derived(toStateClasses(stateObject));
|
132
|
-
|
133
|
-
// Update bindable props
|
134
|
-
$effect(() => {
|
135
|
-
isDragOver = [
|
136
|
-
DRAG_OVER,
|
137
|
-
CAN_DROP,
|
138
|
-
CANNOT_DROP
|
139
|
-
].includes(currentState);
|
140
|
-
|
141
|
-
canDrop = currentState === CAN_DROP;
|
142
|
-
isDropping = currentState === ACTIVE_DROP;
|
143
|
-
});
|
144
|
-
|
145
|
-
/**
|
146
|
-
* Check if we can accept the dragged item
|
147
|
-
* @param {Object} data
|
148
|
-
* @returns {boolean}
|
149
|
-
*/
|
150
|
-
function canAcceptDrop(data) {
|
151
|
-
if (disabled) return false;
|
152
|
-
if (!data) return false;
|
153
|
-
if (data.group !== group) return false;
|
154
|
-
if (!accepts(data.item)) return false;
|
155
|
-
if (itemCount >= maxItems) return false;
|
156
|
-
return true;
|
157
|
-
}
|
158
|
-
|
159
|
-
/**
|
160
|
-
* Handle drag enter
|
161
|
-
* @param {DragEvent} event
|
162
|
-
*/
|
163
|
-
function handleDragEnter(event) {
|
164
|
-
event.preventDefault();
|
165
|
-
dragCounter++;
|
166
|
-
|
167
|
-
if (dragCounter === 1) {
|
168
|
-
const dragData = dragState.current;
|
169
|
-
|
170
|
-
if (dragData) {
|
171
|
-
currentState = canAcceptDrop(dragData)
|
172
|
-
? CAN_DROP
|
173
|
-
: CANNOT_DROP;
|
174
|
-
} else {
|
175
|
-
currentState = DRAG_OVER;
|
176
|
-
}
|
177
|
-
|
178
|
-
onDragEnter?.({ event, zone, canDrop: currentState === CAN_DROP });
|
179
|
-
}
|
180
|
-
}
|
181
|
-
|
182
|
-
/**
|
183
|
-
* Handle drag over
|
184
|
-
* @param {DragEvent} event
|
185
|
-
*/
|
186
|
-
function handleDragOver(event) {
|
187
|
-
event.preventDefault();
|
188
|
-
|
189
|
-
// Re-evaluate on each dragover in case state changed
|
190
|
-
const dragData = dragState.current;
|
191
|
-
|
192
|
-
if (dragData && currentState === DRAG_OVER) {
|
193
|
-
currentState = canAcceptDrop(dragData)
|
194
|
-
? CAN_DROP
|
195
|
-
: CANNOT_DROP;
|
196
|
-
}
|
197
|
-
|
198
|
-
if (currentState === CAN_DROP) {
|
199
|
-
event.dataTransfer.dropEffect = 'move';
|
200
|
-
} else if (currentState === CANNOT_DROP) {
|
201
|
-
event.dataTransfer.dropEffect = 'none';
|
202
|
-
}
|
203
|
-
|
204
|
-
onDragOver?.({ event, zone });
|
205
|
-
}
|
206
|
-
|
207
|
-
/**
|
208
|
-
* Handle drag leave
|
209
|
-
* @param {DragEvent} event
|
210
|
-
*/
|
211
|
-
function handleDragLeave(event) {
|
212
|
-
if (!event.currentTarget.contains(event.relatedTarget)) {
|
213
|
-
dragCounter--;
|
214
|
-
|
215
|
-
if (dragCounter <= 0) {
|
216
|
-
dragCounter = 0;
|
217
|
-
currentState = READY;
|
218
|
-
onDragLeave?.({ event, zone });
|
219
|
-
}
|
220
|
-
}
|
221
|
-
}
|
222
|
-
|
223
|
-
/**
|
224
|
-
* Handle drop
|
225
|
-
* @param {DragEvent} event
|
226
|
-
*/
|
227
|
-
function handleDrop(event) {
|
228
|
-
event.preventDefault();
|
229
|
-
dragCounter = 0;
|
230
|
-
|
231
|
-
try {
|
232
|
-
const data = JSON.parse(event.dataTransfer.getData('application/json'));
|
233
|
-
|
234
|
-
if (canAcceptDrop(data)) {
|
235
|
-
currentState = ACTIVE_DROP;
|
236
|
-
onDropStart?.({ event, zone, data });
|
237
|
-
|
238
|
-
const dropResult = onDrop?.({
|
239
|
-
event,
|
240
|
-
zone,
|
241
|
-
item: data.item,
|
242
|
-
source: data.source,
|
243
|
-
metadata: data.metadata
|
244
|
-
});
|
245
|
-
|
246
|
-
Promise.resolve(dropResult).then(() => {
|
247
|
-
currentState = READY;
|
248
|
-
onDropEnd?.({ event, zone, data, success: true });
|
249
|
-
}).catch((error) => {
|
250
|
-
currentState = READY;
|
251
|
-
onDropEnd?.({ event, zone, data, success: false, error });
|
252
|
-
});
|
253
|
-
} else {
|
254
|
-
currentState = READY;
|
255
|
-
}
|
256
|
-
} catch (error) {
|
257
|
-
console.error('Drop error:', error);
|
258
|
-
currentState = READY;
|
259
|
-
}
|
260
|
-
}
|
261
|
-
</script>
|
262
|
-
|
263
|
-
<div
|
264
|
-
data-component="dropzone"
|
265
|
-
ondragenter={handleDragEnter}
|
266
|
-
ondragover={handleDragOver}
|
267
|
-
ondragleave={handleDragLeave}
|
268
|
-
ondrop={handleDrop}
|
269
|
-
class="{base} {classes} {stateClasses}"
|
270
|
-
data-zone={zone}
|
271
|
-
{...attrs}
|
272
|
-
>
|
273
|
-
{#if children}
|
274
|
-
{@render children()}
|
275
|
-
{:else if currentState === CAN_DROP && preview}
|
276
|
-
{@render preview(dragState.current)}
|
277
|
-
{:else if itemCount === 0 && empty}
|
278
|
-
{@render empty()}
|
279
|
-
{:else}
|
280
|
-
<div data-element="drop-zone-empty">Drop items here</div>
|
281
|
-
{/if}
|
282
|
-
</div>
|