@hkdigital/lib-sveltekit 0.1.75 → 0.1.77
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/assets/autospuiten/car-paint-picker.d.ts +7 -7
- package/dist/components/drag-drop/Draggable.svelte +217 -0
- package/dist/components/drag-drop/Draggable.svelte.d.ts +74 -0
- package/dist/components/drag-drop/Dropzone.svelte +320 -0
- package/dist/components/drag-drop/Dropzone.svelte.d.ts +112 -0
- package/dist/components/drag-drop/Dropzone.svelte__ +282 -0
- package/dist/components/drag-drop/drag-state.svelte.d.ts +6 -0
- package/dist/components/drag-drop/drag-state.svelte.js +19 -0
- package/dist/components/drag-drop/index.d.ts +2 -0
- package/dist/components/drag-drop/index.js +2 -0
- package/dist/config/imagetools.d.ts +14 -13
- package/dist/constants/state-labels/drag-states.d.ts +5 -0
- package/dist/constants/state-labels/drag-states.js +6 -0
- package/dist/constants/state-labels/drop-states.d.ts +6 -0
- package/dist/constants/state-labels/drop-states.js +6 -0
- package/dist/themes/hkdev/components/drag-drop/draggable.css +51 -0
- package/dist/themes/hkdev/components/drag-drop/dropzone.css +73 -0
- package/dist/themes/hkdev/components.css +6 -0
- package/dist/typedef/drag.d.ts +20 -0
- package/dist/typedef/drag.js +9 -0
- package/dist/typedef/drop.d.ts +20 -0
- package/dist/typedef/drop.js +9 -0
- package/dist/{config/typedef.d.ts → typedef/image.d.ts} +4 -0
- package/dist/{config/typedef.js → typedef/image.js} +5 -0
- package/dist/typedef/index.d.ts +3 -0
- package/dist/typedef/index.js +3 -0
- package/dist/util/geo/index.d.ts +10 -0
- package/dist/util/geo/index.js +26 -0
- package/dist/util/image/index.d.ts +1 -1
- package/dist/widgets/image-box/ImageBox.svelte +1 -1
- package/dist/widgets/image-box/ImageBox.svelte.d.ts +2 -2
- package/dist/widgets/image-box/index.d.ts +1 -1
- package/package.json +1 -1
@@ -0,0 +1,112 @@
|
|
1
|
+
export default Dropzone;
|
2
|
+
type Dropzone = {
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
4
|
+
$set?(props: Partial<{
|
5
|
+
[key: string]: any;
|
6
|
+
zone?: string;
|
7
|
+
group?: string;
|
8
|
+
disabled?: boolean;
|
9
|
+
accepts?: (item: any) => boolean;
|
10
|
+
maxItems?: number;
|
11
|
+
base?: string;
|
12
|
+
classes?: string;
|
13
|
+
children?: Snippet<[]>;
|
14
|
+
empty?: Snippet<[]>;
|
15
|
+
preview?: Snippet<[{
|
16
|
+
item: any;
|
17
|
+
source: string;
|
18
|
+
group: string;
|
19
|
+
metadata?: any;
|
20
|
+
}]>;
|
21
|
+
isDragOver?: boolean;
|
22
|
+
canDrop?: boolean;
|
23
|
+
isDropping?: boolean;
|
24
|
+
itemCount?: number;
|
25
|
+
onDragEnter?: (detail: {
|
26
|
+
event: DragEvent;
|
27
|
+
zone: string;
|
28
|
+
canDrop: boolean;
|
29
|
+
}) => void;
|
30
|
+
onDragOver?: (detail: {
|
31
|
+
event: DragEvent;
|
32
|
+
zone: string;
|
33
|
+
}) => void;
|
34
|
+
onDragLeave?: (detail: {
|
35
|
+
event: DragEvent;
|
36
|
+
zone: string;
|
37
|
+
}) => void;
|
38
|
+
onDrop?: (detail: {
|
39
|
+
event: DragEvent;
|
40
|
+
zone: string;
|
41
|
+
item: any;
|
42
|
+
source: string;
|
43
|
+
metadata?: any;
|
44
|
+
}) => any;
|
45
|
+
onDropStart?: (detail: {
|
46
|
+
event: DragEvent;
|
47
|
+
zone: string;
|
48
|
+
data: any;
|
49
|
+
}) => void;
|
50
|
+
onDropEnd?: (detail: {
|
51
|
+
event: DragEvent;
|
52
|
+
zone: string;
|
53
|
+
data: any;
|
54
|
+
success: boolean;
|
55
|
+
error?: Error;
|
56
|
+
}) => void;
|
57
|
+
}>): void;
|
58
|
+
};
|
59
|
+
declare const Dropzone: import("svelte").Component<{
|
60
|
+
[key: string]: any;
|
61
|
+
zone?: string;
|
62
|
+
group?: string;
|
63
|
+
disabled?: boolean;
|
64
|
+
accepts?: (item: any) => boolean;
|
65
|
+
maxItems?: number;
|
66
|
+
base?: string;
|
67
|
+
classes?: string;
|
68
|
+
children?: import("svelte").Snippet;
|
69
|
+
empty?: import("svelte").Snippet;
|
70
|
+
preview?: import("svelte").Snippet<[{
|
71
|
+
item: any;
|
72
|
+
source: string;
|
73
|
+
group: string;
|
74
|
+
metadata?: any;
|
75
|
+
}]>;
|
76
|
+
isDragOver?: boolean;
|
77
|
+
canDrop?: boolean;
|
78
|
+
isDropping?: boolean;
|
79
|
+
itemCount?: number;
|
80
|
+
onDragEnter?: (detail: {
|
81
|
+
event: DragEvent;
|
82
|
+
zone: string;
|
83
|
+
canDrop: boolean;
|
84
|
+
}) => void;
|
85
|
+
onDragOver?: (detail: {
|
86
|
+
event: DragEvent;
|
87
|
+
zone: string;
|
88
|
+
}) => void;
|
89
|
+
onDragLeave?: (detail: {
|
90
|
+
event: DragEvent;
|
91
|
+
zone: string;
|
92
|
+
}) => void;
|
93
|
+
onDrop?: (detail: {
|
94
|
+
event: DragEvent;
|
95
|
+
zone: string;
|
96
|
+
item: any;
|
97
|
+
source: string;
|
98
|
+
metadata?: any;
|
99
|
+
}) => any | Promise<any>;
|
100
|
+
onDropStart?: (detail: {
|
101
|
+
event: DragEvent;
|
102
|
+
zone: string;
|
103
|
+
data: any;
|
104
|
+
}) => void;
|
105
|
+
onDropEnd?: (detail: {
|
106
|
+
event: DragEvent;
|
107
|
+
zone: string;
|
108
|
+
data: any;
|
109
|
+
success: boolean;
|
110
|
+
error?: Error;
|
111
|
+
}) => void;
|
112
|
+
}, {}, "isDropping" | "isDragOver" | "canDrop" | "itemCount">;
|
@@ -0,0 +1,282 @@
|
|
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>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
let currentDrag = $state(null);
|
2
|
+
|
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
|
+
};
|
19
|
+
}
|
@@ -1,4 +1,5 @@
|
|
1
|
-
type ImageMeta = import('
|
1
|
+
type ImageMeta = import('../typedef').ImageMeta;
|
2
|
+
type ImageSource = import('../typedef').ImageSource;
|
2
3
|
|
3
4
|
declare module '*?responsive' {
|
4
5
|
const out: ImageMeta[];
|
@@ -11,61 +12,61 @@ declare module '*&responsive' {
|
|
11
12
|
}
|
12
13
|
|
13
14
|
declare module '*?preset=photo' {
|
14
|
-
const out:
|
15
|
+
const out: ImageSource;
|
15
16
|
export default out;
|
16
17
|
}
|
17
18
|
|
18
19
|
declare module '*&preset=photo' {
|
19
|
-
const out:
|
20
|
+
const out: ImageSource;
|
20
21
|
export default out;
|
21
22
|
}
|
22
23
|
|
23
24
|
declare module '*?preset=render' {
|
24
|
-
const out:
|
25
|
+
const out: ImageSource;
|
25
26
|
export default out;
|
26
27
|
}
|
27
28
|
|
28
29
|
declare module '*&preset=render' {
|
29
|
-
const out:
|
30
|
+
const out: ImageSource;
|
30
31
|
export default out;
|
31
32
|
}
|
32
33
|
|
33
34
|
declare module '*?preset=gradient' {
|
34
|
-
const out:
|
35
|
+
const out: ImageSource;
|
35
36
|
export default out;
|
36
37
|
}
|
37
38
|
|
38
39
|
declare module '*&preset=gradient' {
|
39
|
-
const out:
|
40
|
+
const out: ImageSource;
|
40
41
|
export default out;
|
41
42
|
}
|
42
43
|
|
43
44
|
declare module '*?preset=drawing' {
|
44
|
-
const out:
|
45
|
+
const out: ImageSource;
|
45
46
|
export default out;
|
46
47
|
}
|
47
48
|
|
48
49
|
declare module '*&preset=drawing' {
|
49
|
-
const out:
|
50
|
+
const out: ImageSource;
|
50
51
|
export default out;
|
51
52
|
}
|
52
53
|
|
53
54
|
declare module '*?preset=savedata' {
|
54
|
-
const out:
|
55
|
+
const out: ImageSource;
|
55
56
|
export default out;
|
56
57
|
}
|
57
58
|
|
58
59
|
declare module '*&preset=savedata' {
|
59
|
-
const out:
|
60
|
+
const out: IImageSource;
|
60
61
|
export default out;
|
61
62
|
}
|
62
63
|
|
63
64
|
declare module '*?preset=blur' {
|
64
|
-
const out:
|
65
|
+
const out: ImageSource;
|
65
66
|
export default out;
|
66
67
|
}
|
67
68
|
|
68
69
|
declare module '*&preset=blur' {
|
69
|
-
const out:
|
70
|
+
const out: ImageSource;
|
70
71
|
export default out;
|
71
72
|
}
|
@@ -0,0 +1,6 @@
|
|
1
|
+
// Draggable states
|
2
|
+
export const IDLE = 'idle'; // Not being dragged
|
3
|
+
export const DRAGGING = 'dragging'; // Currently being dragged
|
4
|
+
export const DRAG_PREVIEW = 'drag-preview'; // Mouse down, before drag
|
5
|
+
export const DROPPING = 'dropping'; // Just dropped, animating
|
6
|
+
export const DRAG_DISABLED = 'drag-disabled'; // Dragging not allowed
|
@@ -0,0 +1,6 @@
|
|
1
|
+
export const READY = 'ready'; // Waiting for drag
|
2
|
+
export const DRAG_OVER = 'drag-over'; // Item dragged over zone
|
3
|
+
export const CAN_DROP = 'can-drop'; // Valid drop target
|
4
|
+
export const CANNOT_DROP = 'cannot-drop'; // Invalid drop target
|
5
|
+
export const DROP_DISABLED = 'drop-disabled'; // Dropping not allowed
|
6
|
+
export const ACTIVE_DROP = 'active-drop'; // Currently processing drop
|
@@ -0,0 +1,51 @@
|
|
1
|
+
@define-mixin component-draggable {
|
2
|
+
[data-component='draggable'] {
|
3
|
+
cursor: move;
|
4
|
+
user-select: none;
|
5
|
+
transition:
|
6
|
+
opacity 0.2s ease,
|
7
|
+
transform 0.2s ease;
|
8
|
+
}
|
9
|
+
|
10
|
+
/* State-based styling using state classes */
|
11
|
+
[data-component='draggable'].state-idle {
|
12
|
+
opacity: 1;
|
13
|
+
transform: scale(1);
|
14
|
+
}
|
15
|
+
|
16
|
+
[data-component='draggable'].state-dragging {
|
17
|
+
opacity: 0.5;
|
18
|
+
transform: scale(0.95);
|
19
|
+
}
|
20
|
+
|
21
|
+
[data-component='draggable'].state-drag-preview {
|
22
|
+
transform: scale(0.98);
|
23
|
+
filter: brightness(0.95);
|
24
|
+
}
|
25
|
+
|
26
|
+
[data-component='draggable'].state-dropping {
|
27
|
+
animation: drop-finish 0.2s ease-out;
|
28
|
+
}
|
29
|
+
|
30
|
+
[data-component='draggable'].state-drag-disabled {
|
31
|
+
cursor: not-allowed;
|
32
|
+
opacity: 0.6;
|
33
|
+
filter: grayscale(0.5);
|
34
|
+
}
|
35
|
+
|
36
|
+
/* Animations */
|
37
|
+
@keyframes drop-finish {
|
38
|
+
0% {
|
39
|
+
transform: scale(0.95);
|
40
|
+
opacity: 0.8;
|
41
|
+
}
|
42
|
+
50% {
|
43
|
+
transform: scale(1.05);
|
44
|
+
opacity: 1;
|
45
|
+
}
|
46
|
+
100% {
|
47
|
+
transform: scale(1);
|
48
|
+
opacity: 1;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
@@ -0,0 +1,73 @@
|
|
1
|
+
@define-mixin component-dropzone {
|
2
|
+
[data-component='dropzone'] {
|
3
|
+
min-height: 100px;
|
4
|
+
border: 2px dashed rgb(var(--color-surface-400));
|
5
|
+
border-radius: var(--theme-rounded-container);
|
6
|
+
padding: 1rem;
|
7
|
+
transition: all 0.2s ease;
|
8
|
+
position: relative;
|
9
|
+
background-color: rgb(var(--color-surface-50) / 0.5);
|
10
|
+
}
|
11
|
+
|
12
|
+
/* State-based styling using state classes */
|
13
|
+
[data-component='dropzone'].state-ready {
|
14
|
+
border-color: rgb(var(--color-surface-400));
|
15
|
+
background-color: transparent;
|
16
|
+
}
|
17
|
+
|
18
|
+
[data-component='dropzone'].state-drag-over {
|
19
|
+
border-color: rgb(var(--color-primary-400));
|
20
|
+
background-color: rgb(var(--color-primary-500) / 0.05);
|
21
|
+
}
|
22
|
+
|
23
|
+
[data-component='dropzone'].state-can-drop {
|
24
|
+
border-color: rgb(var(--color-success-500));
|
25
|
+
background-color: rgb(var(--color-success-500) / 0.08);
|
26
|
+
transform: scale(1.01);
|
27
|
+
box-shadow: 0 0 0 3px rgb(var(--color-success-500) / 0.2);
|
28
|
+
}
|
29
|
+
|
30
|
+
[data-component='dropzone'].state-cannot-drop {
|
31
|
+
border-color: rgb(var(--color-error-500));
|
32
|
+
background-color: rgb(var(--color-error-500) / 0.08);
|
33
|
+
cursor: not-allowed;
|
34
|
+
}
|
35
|
+
|
36
|
+
[data-component='dropzone'].state-active-drop {
|
37
|
+
animation: drop-pulse 0.3s ease-out;
|
38
|
+
border-color: rgb(var(--color-success-500));
|
39
|
+
background-color: rgb(var(--color-success-500) / 0.1);
|
40
|
+
}
|
41
|
+
|
42
|
+
[data-component='dropzone'].state-drop-disabled {
|
43
|
+
opacity: 0.5;
|
44
|
+
cursor: not-allowed;
|
45
|
+
background-color: rgb(var(--color-surface-100));
|
46
|
+
}
|
47
|
+
|
48
|
+
/* Empty state */
|
49
|
+
[data-element='drop-zone-empty'] {
|
50
|
+
display: flex;
|
51
|
+
align-items: center;
|
52
|
+
justify-content: center;
|
53
|
+
height: 100%;
|
54
|
+
color: rgb(var(--color-surface-500));
|
55
|
+
font-style: italic;
|
56
|
+
}
|
57
|
+
|
58
|
+
/* Animations */
|
59
|
+
@keyframes drop-pulse {
|
60
|
+
0% {
|
61
|
+
transform: scale(1);
|
62
|
+
box-shadow: 0 0 0 0 rgb(var(--color-success-500) / 0.4);
|
63
|
+
}
|
64
|
+
50% {
|
65
|
+
transform: scale(1.02);
|
66
|
+
box-shadow: 0 0 0 8px rgb(var(--color-success-500) / 0);
|
67
|
+
}
|
68
|
+
100% {
|
69
|
+
transform: scale(1);
|
70
|
+
box-shadow: 0 0 0 0 rgb(var(--color-success-500) / 0);
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}
|
@@ -11,6 +11,9 @@
|
|
11
11
|
|
12
12
|
/*@import "./components/buttons/skip-button.css";*/
|
13
13
|
|
14
|
+
@import './components/drag-drop/draggable.css';
|
15
|
+
@import './components/drag-drop/dropzone.css';
|
16
|
+
|
14
17
|
/* Icons */
|
15
18
|
@import './components/icons/icon-steeze.css';
|
16
19
|
|
@@ -36,6 +39,9 @@
|
|
36
39
|
@mixin component-button-icon-steeze;
|
37
40
|
/* @mixin buttons-skip-button;*/
|
38
41
|
|
42
|
+
@mixin component-draggable;
|
43
|
+
@mixin component-dropzone;
|
44
|
+
|
39
45
|
@mixin component-icon-steeze;
|
40
46
|
|
41
47
|
@mixin component-panel;
|