@getmicdrop/svelte-components 2.3.0 → 2.6.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/components/Accordion/AccordionItem.svelte +13 -1
- package/dist/components/Accordion/AccordionItem.svelte.d.ts +4 -0
- package/dist/components/Accordion/AccordionItem.svelte.d.ts.map +1 -1
- package/dist/components/Badges/Badge.svelte +139 -14
- package/dist/components/Badges/Badge.svelte.d.ts +10 -0
- package/dist/components/Badges/Badge.svelte.d.ts.map +1 -1
- package/dist/components/Breadcrumb/Breadcrumb.svelte +1 -1
- package/dist/components/Button/Button.svelte +135 -3
- package/dist/components/Button/Button.svelte.d.ts +2 -0
- package/dist/components/Button/Button.svelte.d.ts.map +1 -1
- package/dist/components/Card.svelte +2 -2
- package/dist/components/Card.svelte.d.ts +2 -2
- package/dist/components/Card.svelte.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.svelte +32 -58
- package/dist/components/Checkbox/Checkbox.svelte.d.ts +12 -0
- package/dist/components/Checkbox/Checkbox.svelte.d.ts.map +1 -1
- package/dist/components/Drawer/Drawer.svelte +18 -6
- package/dist/components/Drawer/Drawer.svelte.d.ts +6 -0
- package/dist/components/Drawer/Drawer.svelte.d.ts.map +1 -1
- package/dist/components/Dropdown/Dropdown.svelte +193 -0
- package/dist/components/Dropdown/Dropdown.svelte.d.ts +50 -0
- package/dist/components/Dropdown/Dropdown.svelte.d.ts.map +1 -0
- package/dist/components/Dropdown/DropdownItem.svelte +111 -0
- package/dist/components/Dropdown/DropdownItem.svelte.d.ts +48 -0
- package/dist/components/Dropdown/DropdownItem.svelte.d.ts.map +1 -0
- package/dist/components/Dropdown/SelectDropdown.svelte +301 -0
- package/dist/components/Dropdown/SelectDropdown.svelte.d.ts +51 -0
- package/dist/components/Dropdown/SelectDropdown.svelte.d.ts.map +1 -0
- package/dist/components/EmptyState/EmptyState.svelte +80 -0
- package/dist/components/EmptyState/EmptyState.svelte.d.ts +37 -0
- package/dist/components/EmptyState/EmptyState.svelte.d.ts.map +1 -0
- package/dist/components/ErrorDisplay.svelte.d.ts +2 -2
- package/dist/components/Input/Input.svelte +6 -1
- package/dist/components/Input/Input.svelte.d.ts +12 -8
- package/dist/components/Input/Input.svelte.d.ts.map +1 -1
- package/dist/components/Input/MultiSelect.svelte +4 -5
- package/dist/components/Input/MultiSelect.svelte.d.ts +4 -4
- package/dist/components/Input/MultiSelect.svelte.d.ts.map +1 -1
- package/dist/components/Input/Search.svelte +173 -0
- package/dist/components/Input/Search.svelte.d.ts +68 -0
- package/dist/components/Input/Search.svelte.d.ts.map +1 -0
- package/dist/components/Input/Select.svelte +4 -5
- package/dist/components/Input/Select.svelte.d.ts +4 -4
- package/dist/components/Input/Select.svelte.d.ts.map +1 -1
- package/dist/components/Input/Textarea.svelte +160 -0
- package/dist/components/Input/Textarea.svelte.d.ts +69 -0
- package/dist/components/Input/Textarea.svelte.d.ts.map +1 -0
- package/dist/components/Label/Label.svelte +60 -0
- package/dist/components/Label/Label.svelte.d.ts +48 -0
- package/dist/components/Label/Label.svelte.d.ts.map +1 -0
- package/dist/components/Layout/PageLayout.svelte +64 -0
- package/dist/components/Layout/PageLayout.svelte.d.ts +58 -0
- package/dist/components/Layout/PageLayout.svelte.d.ts.map +1 -0
- package/dist/components/Modal/InputModal.svelte +2 -1
- package/dist/components/Modal/InputModal.svelte.d.ts +2 -0
- package/dist/components/Modal/InputModal.svelte.d.ts.map +1 -1
- package/dist/components/Modal/Modal.svelte +3 -2
- package/dist/components/Modal/Modal.svelte.d.ts +2 -0
- package/dist/components/Modal/Modal.svelte.d.ts.map +1 -1
- package/dist/components/Modal/StatusModal.svelte.d.ts +2 -2
- package/dist/components/OrderSummary/OrderSummary.svelte +2 -2
- package/dist/components/OrderSummary/OrderSummary.svelte.d.ts.map +1 -1
- package/dist/components/Pagination/Pagination.svelte +27 -8
- package/dist/components/Pagination/Pagination.svelte.d.ts +16 -2
- package/dist/components/Pagination/Pagination.svelte.d.ts.map +1 -1
- package/dist/components/Radio/Radio.svelte +5 -2
- package/dist/components/Radio/Radio.svelte.d.ts +2 -0
- package/dist/components/Radio/Radio.svelte.d.ts.map +1 -1
- package/dist/components/Skeleton/Skeleton.svelte +11 -2
- package/dist/components/Skeleton/Skeleton.svelte.d.ts +2 -0
- package/dist/components/Skeleton/Skeleton.svelte.d.ts.map +1 -1
- package/dist/components/Tabs/TabItem.svelte +39 -0
- package/dist/components/Tabs/TabItem.svelte.d.ts +52 -0
- package/dist/components/Tabs/TabItem.svelte.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.svelte +181 -0
- package/dist/components/Tabs/Tabs.svelte.d.ts +46 -0
- package/dist/components/Tabs/Tabs.svelte.d.ts.map +1 -0
- package/dist/components/Typography/Typography.svelte +50 -0
- package/dist/components/Typography/Typography.svelte.d.ts +48 -0
- package/dist/components/Typography/Typography.svelte.d.ts.map +1 -0
- package/dist/components/pages/performers/ShowDetails.svelte.d.ts +2 -2
- package/dist/components/pages/performers/ShowItemCard.svelte.d.ts +2 -2
- package/dist/components/pages/settings/tabs/CustomImageDropzone.svelte.d.ts +2 -2
- package/dist/index.d.ts +11 -0
- package/dist/index.js +13 -0
- package/package.json +1 -1
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
export let name = "";
|
|
10
10
|
/** @type {boolean} Whether the checkbox is disabled */
|
|
11
11
|
export let disabled = false;
|
|
12
|
+
/** @type {string} Color variant */
|
|
13
|
+
export let color = "primary";
|
|
12
14
|
/** @type {string} Additional CSS classes */
|
|
13
15
|
let className = "";
|
|
14
16
|
export { className as class };
|
|
@@ -19,6 +21,23 @@
|
|
|
19
21
|
checked = event.target.checked;
|
|
20
22
|
dispatch("change", { checked, value });
|
|
21
23
|
}
|
|
24
|
+
|
|
25
|
+
// Color classes matching flowbite-svelte
|
|
26
|
+
const colorClasses = {
|
|
27
|
+
primary: "text-primary-600 focus:ring-primary-500 dark:focus:ring-primary-600",
|
|
28
|
+
red: "text-red-600 focus:ring-red-500 dark:focus:ring-red-600",
|
|
29
|
+
green: "text-green-600 focus:ring-green-500 dark:focus:ring-green-600",
|
|
30
|
+
blue: "text-blue-600 focus:ring-blue-500 dark:focus:ring-blue-600"
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
$: inputClasses = [
|
|
34
|
+
"w-4 h-4 rounded",
|
|
35
|
+
"bg-gray-100 border-gray-300",
|
|
36
|
+
"dark:bg-gray-700 dark:border-gray-600 dark:ring-offset-gray-800",
|
|
37
|
+
"focus:ring-2",
|
|
38
|
+
colorClasses[color] || colorClasses.primary,
|
|
39
|
+
disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"
|
|
40
|
+
].join(" ");
|
|
22
41
|
</script>
|
|
23
42
|
|
|
24
43
|
<label class="checkbox {className}" class:checkbox--disabled={disabled}>
|
|
@@ -29,13 +48,13 @@
|
|
|
29
48
|
{disabled}
|
|
30
49
|
bind:checked
|
|
31
50
|
on:change={handleChange}
|
|
32
|
-
|
|
51
|
+
on:click
|
|
52
|
+
on:focus
|
|
53
|
+
on:blur
|
|
54
|
+
on:keydown
|
|
55
|
+
on:keyup
|
|
56
|
+
class={inputClasses}
|
|
33
57
|
/>
|
|
34
|
-
<span class="checkbox__box">
|
|
35
|
-
<svg class="checkbox__check" viewBox="0 0 12 10" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
36
|
-
<path d="M1 5L4.5 8.5L11 1" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
37
|
-
</svg>
|
|
38
|
-
</span>
|
|
39
58
|
{#if $$slots.default}
|
|
40
59
|
<span class="checkbox__label">
|
|
41
60
|
<slot />
|
|
@@ -46,7 +65,7 @@
|
|
|
46
65
|
<style>
|
|
47
66
|
.checkbox {
|
|
48
67
|
display: inline-flex;
|
|
49
|
-
align-items:
|
|
68
|
+
align-items: center;
|
|
50
69
|
gap: 0.5rem;
|
|
51
70
|
cursor: pointer;
|
|
52
71
|
-webkit-user-select: none;
|
|
@@ -56,61 +75,16 @@
|
|
|
56
75
|
|
|
57
76
|
.checkbox--disabled {
|
|
58
77
|
cursor: not-allowed;
|
|
59
|
-
opacity: 0.5;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
.checkbox__input {
|
|
63
|
-
position: absolute;
|
|
64
|
-
opacity: 0;
|
|
65
|
-
width: 0;
|
|
66
|
-
height: 0;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
.checkbox__box {
|
|
70
|
-
flex-shrink: 0;
|
|
71
|
-
width: 1.125rem;
|
|
72
|
-
height: 1.125rem;
|
|
73
|
-
border: 2px solid hsl(var(--Stroke-Primary, 220 13% 85%));
|
|
74
|
-
border-radius: 0.25rem;
|
|
75
|
-
background-color: hsl(var(--BG-Primary, 0 0% 100%));
|
|
76
|
-
display: flex;
|
|
77
|
-
align-items: center;
|
|
78
|
-
justify-content: center;
|
|
79
|
-
transition: all 0.15s ease;
|
|
80
|
-
margin-top: 0.1875rem; /* Align with text baseline */
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
.checkbox__check {
|
|
84
|
-
width: 0.75rem;
|
|
85
|
-
height: 0.75rem;
|
|
86
|
-
color: white;
|
|
87
|
-
opacity: 0;
|
|
88
|
-
transform: scale(0.5);
|
|
89
|
-
transition: all 0.15s ease;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
.checkbox__input:checked + .checkbox__box {
|
|
93
|
-
background-color: hsl(var(--Brand-Primary, 221 83% 53%));
|
|
94
|
-
border-color: hsl(var(--Brand-Primary, 221 83% 53%));
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
.checkbox__input:checked + .checkbox__box .checkbox__check {
|
|
98
|
-
opacity: 1;
|
|
99
|
-
transform: scale(1);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
.checkbox__input:focus-visible + .checkbox__box {
|
|
103
|
-
outline: 2px solid hsl(var(--Brand-Primary, 221 83% 53%));
|
|
104
|
-
outline-offset: 2px;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
.checkbox__input:disabled + .checkbox__box {
|
|
108
|
-
background-color: hsl(var(--BG-Secondary, 220 14% 96%));
|
|
109
78
|
}
|
|
110
79
|
|
|
111
80
|
.checkbox__label {
|
|
112
|
-
color: hsl(var(--Text-Primary, 220 13% 13%));
|
|
113
81
|
font-size: 0.875rem;
|
|
114
82
|
line-height: 1.5;
|
|
83
|
+
color: var(--text-primary, #1f2937);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
:global(.dark) .checkbox__label,
|
|
87
|
+
:global(.micdrop.dark) .checkbox__label {
|
|
88
|
+
color: #f3f4f6;
|
|
115
89
|
}
|
|
116
90
|
</style>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export default Checkbox;
|
|
2
2
|
type Checkbox = SvelteComponent<$$__sveltets_2_PropsWithChildren<{
|
|
3
3
|
class?: string | undefined;
|
|
4
|
+
color?: string | undefined;
|
|
4
5
|
disabled?: boolean | undefined;
|
|
5
6
|
checked?: boolean | undefined;
|
|
6
7
|
value?: string | undefined;
|
|
@@ -8,6 +9,11 @@ type Checkbox = SvelteComponent<$$__sveltets_2_PropsWithChildren<{
|
|
|
8
9
|
}, {
|
|
9
10
|
default: {};
|
|
10
11
|
}>, {
|
|
12
|
+
click: PointerEvent;
|
|
13
|
+
focus: FocusEvent;
|
|
14
|
+
blur: FocusEvent;
|
|
15
|
+
keydown: KeyboardEvent;
|
|
16
|
+
keyup: KeyboardEvent;
|
|
11
17
|
change: CustomEvent<any>;
|
|
12
18
|
} & {
|
|
13
19
|
[evt: string]: CustomEvent<any>;
|
|
@@ -18,6 +24,7 @@ type Checkbox = SvelteComponent<$$__sveltets_2_PropsWithChildren<{
|
|
|
18
24
|
};
|
|
19
25
|
declare const Checkbox: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
|
|
20
26
|
class?: string | undefined;
|
|
27
|
+
color?: string | undefined;
|
|
21
28
|
disabled?: boolean | undefined;
|
|
22
29
|
checked?: boolean | undefined;
|
|
23
30
|
value?: string | undefined;
|
|
@@ -25,6 +32,11 @@ declare const Checkbox: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsW
|
|
|
25
32
|
}, {
|
|
26
33
|
default: {};
|
|
27
34
|
}>, {
|
|
35
|
+
click: PointerEvent;
|
|
36
|
+
focus: FocusEvent;
|
|
37
|
+
blur: FocusEvent;
|
|
38
|
+
keydown: KeyboardEvent;
|
|
39
|
+
keyup: KeyboardEvent;
|
|
28
40
|
change: CustomEvent<any>;
|
|
29
41
|
} & {
|
|
30
42
|
[evt: string]: CustomEvent<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Checkbox/Checkbox.svelte.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Checkbox.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Checkbox/Checkbox.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAgFA;;;;;;;;;;;;;;;;;;;;eAAiL;sCAT3I,KAAK,EAAE,KAAK;;;;;6CALL,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,eAAe,QAAQ,CAAC"}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
/** @type {boolean} Whether the drawer is visible */
|
|
7
7
|
export let show = false;
|
|
8
|
+
/** @type {boolean} Flowbite-style hidden prop (inverse of show) */
|
|
9
|
+
export let hidden = true;
|
|
8
10
|
/** @type {string} Optional title for the drawer header */
|
|
9
11
|
export let title = "";
|
|
10
12
|
/** @type {'left' | 'right' | 'top' | 'bottom'} Which side the drawer slides from */
|
|
@@ -19,10 +21,19 @@
|
|
|
19
21
|
export let closeOnBackdropClick = true;
|
|
20
22
|
/** @type {boolean} Whether pressing Escape closes the drawer */
|
|
21
23
|
export let closeOnEscape = true;
|
|
24
|
+
/** @type {string} Optional id for the drawer element */
|
|
25
|
+
export let id = "";
|
|
26
|
+
/** @type {object|undefined} Custom transition params (flowbite API) */
|
|
27
|
+
export let transitionParams = undefined;
|
|
22
28
|
|
|
23
29
|
const dispatch = createEventDispatcher();
|
|
24
30
|
|
|
31
|
+
// Support both show and hidden props (flowbite uses hidden)
|
|
32
|
+
$: isVisible = show || !hidden;
|
|
33
|
+
|
|
25
34
|
function close() {
|
|
35
|
+
hidden = true;
|
|
36
|
+
show = false;
|
|
26
37
|
dispatch("close");
|
|
27
38
|
}
|
|
28
39
|
|
|
@@ -33,13 +44,13 @@
|
|
|
33
44
|
}
|
|
34
45
|
|
|
35
46
|
function handleKeydown(e) {
|
|
36
|
-
if (closeOnEscape && e.key === "Escape" &&
|
|
47
|
+
if (closeOnEscape && e.key === "Escape" && isVisible) {
|
|
37
48
|
close();
|
|
38
49
|
}
|
|
39
50
|
}
|
|
40
51
|
|
|
41
|
-
// Calculate transition params based on placement
|
|
42
|
-
$:
|
|
52
|
+
// Calculate transition params based on placement (use custom if provided)
|
|
53
|
+
$: computedTransitionParams = transitionParams || (() => {
|
|
43
54
|
switch (placement) {
|
|
44
55
|
case "left":
|
|
45
56
|
return { x: -320, duration, easing: cubicOut };
|
|
@@ -56,7 +67,7 @@
|
|
|
56
67
|
|
|
57
68
|
// Lock body scroll when drawer is open
|
|
58
69
|
$: if (typeof document !== "undefined") {
|
|
59
|
-
if (
|
|
70
|
+
if (isVisible) {
|
|
60
71
|
document.body.style.overflow = "hidden";
|
|
61
72
|
} else {
|
|
62
73
|
document.body.style.overflow = "";
|
|
@@ -72,7 +83,7 @@
|
|
|
72
83
|
|
|
73
84
|
<svelte:window on:keydown={handleKeydown} />
|
|
74
85
|
|
|
75
|
-
{#if
|
|
86
|
+
{#if isVisible}
|
|
76
87
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
77
88
|
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
|
78
89
|
<div
|
|
@@ -81,10 +92,11 @@
|
|
|
81
92
|
transition:fade={{ duration: 150 }}
|
|
82
93
|
>
|
|
83
94
|
<div
|
|
95
|
+
{id}
|
|
84
96
|
class="drawer drawer--{placement}"
|
|
85
97
|
style="--drawer-width: {width}; --drawer-height: {height};"
|
|
86
98
|
on:click|stopPropagation
|
|
87
|
-
transition:fly={
|
|
99
|
+
transition:fly={computedTransitionParams}
|
|
88
100
|
>
|
|
89
101
|
<!-- Optional header with title -->
|
|
90
102
|
{#if title || $$slots.header}
|
|
@@ -3,11 +3,14 @@ type Drawer = SvelteComponent<$$__sveltets_2_PropsWithChildren<{
|
|
|
3
3
|
duration?: number | undefined;
|
|
4
4
|
title?: string | undefined;
|
|
5
5
|
show?: boolean | undefined;
|
|
6
|
+
hidden?: boolean | undefined;
|
|
6
7
|
placement?: "left" | "right" | "top" | "bottom" | undefined;
|
|
7
8
|
width?: string | undefined;
|
|
8
9
|
height?: string | undefined;
|
|
9
10
|
closeOnBackdropClick?: boolean | undefined;
|
|
10
11
|
closeOnEscape?: boolean | undefined;
|
|
12
|
+
id?: string | undefined;
|
|
13
|
+
transitionParams?: object | undefined;
|
|
11
14
|
}, {
|
|
12
15
|
header: {};
|
|
13
16
|
default: {};
|
|
@@ -28,11 +31,14 @@ declare const Drawer: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWit
|
|
|
28
31
|
duration?: number | undefined;
|
|
29
32
|
title?: string | undefined;
|
|
30
33
|
show?: boolean | undefined;
|
|
34
|
+
hidden?: boolean | undefined;
|
|
31
35
|
placement?: "left" | "right" | "top" | "bottom" | undefined;
|
|
32
36
|
width?: string | undefined;
|
|
33
37
|
height?: string | undefined;
|
|
34
38
|
closeOnBackdropClick?: boolean | undefined;
|
|
35
39
|
closeOnEscape?: boolean | undefined;
|
|
40
|
+
id?: string | undefined;
|
|
41
|
+
transitionParams?: object | undefined;
|
|
36
42
|
}, {
|
|
37
43
|
header: {};
|
|
38
44
|
default: {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Drawer.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Drawer/Drawer.svelte.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Drawer.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Drawer/Drawer.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwJA;;;;;;;;;;;uBAfW,MAAM,GAAC,SAAS;;;;;;;;;;;;;;eAe+N;sCATpN,KAAK,EAAE,KAAK;;;;;6CALL,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { createEventDispatcher, onMount, onDestroy, tick } from "svelte";
|
|
3
|
+
|
|
4
|
+
/** @type {boolean} Whether the dropdown is open */
|
|
5
|
+
export let open = false;
|
|
6
|
+
/** @type {string} Current active URL for highlighting (flowbite API) */
|
|
7
|
+
export let activeUrl = "";
|
|
8
|
+
/** @type {'bottom-start' | 'bottom-end' | 'bottom' | 'top-start' | 'top-end' | 'top'} Placement */
|
|
9
|
+
export let placement = "bottom-start";
|
|
10
|
+
/** @type {string} Additional CSS classes */
|
|
11
|
+
let className = "";
|
|
12
|
+
export { className as class };
|
|
13
|
+
/** @type {string} Accessible label for the dropdown menu */
|
|
14
|
+
export let ariaLabel = "Menu";
|
|
15
|
+
|
|
16
|
+
const dispatch = createEventDispatcher();
|
|
17
|
+
|
|
18
|
+
let dropdownRef;
|
|
19
|
+
let focusedIndex = -1;
|
|
20
|
+
let menuItems = [];
|
|
21
|
+
|
|
22
|
+
// Update menu items when dropdown opens
|
|
23
|
+
async function updateMenuItems() {
|
|
24
|
+
await tick();
|
|
25
|
+
if (dropdownRef) {
|
|
26
|
+
menuItems = Array.from(dropdownRef.querySelectorAll('[role="menuitem"]:not([disabled])'));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Focus a specific menu item by index
|
|
31
|
+
function focusItem(index) {
|
|
32
|
+
if (menuItems.length === 0) return;
|
|
33
|
+
if (index < 0) index = menuItems.length - 1;
|
|
34
|
+
if (index >= menuItems.length) index = 0;
|
|
35
|
+
focusedIndex = index;
|
|
36
|
+
menuItems[focusedIndex]?.focus();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Get trigger element (previous sibling)
|
|
40
|
+
function getTriggerElement() {
|
|
41
|
+
const parent = dropdownRef?.parentElement;
|
|
42
|
+
if (parent) {
|
|
43
|
+
const siblings = Array.from(parent.children);
|
|
44
|
+
const dropdownIndex = siblings.indexOf(dropdownRef);
|
|
45
|
+
if (dropdownIndex > 0) {
|
|
46
|
+
return siblings[dropdownIndex - 1];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function handleClickOutside(event) {
|
|
53
|
+
if (dropdownRef && !dropdownRef.contains(event.target)) {
|
|
54
|
+
const trigger = getTriggerElement();
|
|
55
|
+
if (trigger?.contains(event.target)) {
|
|
56
|
+
return; // Let the trigger handle toggling
|
|
57
|
+
}
|
|
58
|
+
open = false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function handleKeydown(event) {
|
|
63
|
+
if (!open) return;
|
|
64
|
+
|
|
65
|
+
// Only handle if event originated from within this dropdown or its trigger
|
|
66
|
+
const trigger = getTriggerElement();
|
|
67
|
+
if (!dropdownRef?.contains(event.target) && !trigger?.contains(event.target)) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
switch (event.key) {
|
|
72
|
+
case "Escape":
|
|
73
|
+
open = false;
|
|
74
|
+
trigger?.focus();
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
break;
|
|
77
|
+
case "ArrowDown":
|
|
78
|
+
focusItem(focusedIndex + 1);
|
|
79
|
+
event.preventDefault();
|
|
80
|
+
break;
|
|
81
|
+
case "ArrowUp":
|
|
82
|
+
focusItem(focusedIndex - 1);
|
|
83
|
+
event.preventDefault();
|
|
84
|
+
break;
|
|
85
|
+
case "Home":
|
|
86
|
+
focusItem(0);
|
|
87
|
+
event.preventDefault();
|
|
88
|
+
break;
|
|
89
|
+
case "End":
|
|
90
|
+
focusItem(menuItems.length - 1);
|
|
91
|
+
event.preventDefault();
|
|
92
|
+
break;
|
|
93
|
+
case "Tab":
|
|
94
|
+
open = false;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Watch for open state changes
|
|
100
|
+
$: if (open) {
|
|
101
|
+
focusedIndex = -1;
|
|
102
|
+
updateMenuItems();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
onMount(() => {
|
|
106
|
+
document.addEventListener("click", handleClickOutside, true);
|
|
107
|
+
document.addEventListener("keydown", handleKeydown);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
onDestroy(() => {
|
|
111
|
+
if (typeof document !== "undefined") {
|
|
112
|
+
document.removeEventListener("click", handleClickOutside, true);
|
|
113
|
+
document.removeEventListener("keydown", handleKeydown);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// Provide context for DropdownItem
|
|
118
|
+
import { setContext } from "svelte";
|
|
119
|
+
setContext("dropdown", {
|
|
120
|
+
activeUrl,
|
|
121
|
+
close: () => { open = false; }
|
|
122
|
+
});
|
|
123
|
+
</script>
|
|
124
|
+
|
|
125
|
+
{#if open}
|
|
126
|
+
<div
|
|
127
|
+
bind:this={dropdownRef}
|
|
128
|
+
class="dropdown dropdown--{placement} {className}"
|
|
129
|
+
role="menu"
|
|
130
|
+
aria-label={ariaLabel}
|
|
131
|
+
{...$$restProps}
|
|
132
|
+
>
|
|
133
|
+
<slot />
|
|
134
|
+
</div>
|
|
135
|
+
{/if}
|
|
136
|
+
|
|
137
|
+
<style>
|
|
138
|
+
.dropdown {
|
|
139
|
+
position: absolute;
|
|
140
|
+
z-index: 50;
|
|
141
|
+
min-width: 10rem;
|
|
142
|
+
background-color: hsl(var(--BG-Primary, 0 0% 100%));
|
|
143
|
+
border: 1px solid hsl(var(--Stroke-Primary, 220 13% 85%));
|
|
144
|
+
border-radius: 0.5rem;
|
|
145
|
+
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
|
|
146
|
+
padding: 0.25rem 0;
|
|
147
|
+
margin-top: 0.25rem;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.dropdown--bottom-start {
|
|
151
|
+
top: 100%;
|
|
152
|
+
left: 0;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.dropdown--bottom-end {
|
|
156
|
+
top: 100%;
|
|
157
|
+
right: 0;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.dropdown--bottom {
|
|
161
|
+
top: 100%;
|
|
162
|
+
left: 50%;
|
|
163
|
+
transform: translateX(-50%);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.dropdown--top-start {
|
|
167
|
+
bottom: 100%;
|
|
168
|
+
left: 0;
|
|
169
|
+
margin-top: 0;
|
|
170
|
+
margin-bottom: 0.25rem;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.dropdown--top-end {
|
|
174
|
+
bottom: 100%;
|
|
175
|
+
right: 0;
|
|
176
|
+
margin-top: 0;
|
|
177
|
+
margin-bottom: 0.25rem;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.dropdown--top {
|
|
181
|
+
bottom: 100%;
|
|
182
|
+
left: 50%;
|
|
183
|
+
transform: translateX(-50%);
|
|
184
|
+
margin-top: 0;
|
|
185
|
+
margin-bottom: 0.25rem;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* Dark mode */
|
|
189
|
+
:global(.dark) .dropdown {
|
|
190
|
+
background-color: hsl(var(--BG-Primary, 220 13% 15%));
|
|
191
|
+
border-color: hsl(var(--Stroke-Primary, 220 13% 30%));
|
|
192
|
+
}
|
|
193
|
+
</style>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export default Dropdown;
|
|
2
|
+
type Dropdown = SvelteComponent<$$__sveltets_2_PropsWithChildren<{
|
|
3
|
+
[x: string]: any;
|
|
4
|
+
class?: string | undefined;
|
|
5
|
+
open?: boolean | undefined;
|
|
6
|
+
placement?: "top" | "bottom" | "bottom-start" | "bottom-end" | "top-start" | "top-end" | undefined;
|
|
7
|
+
activeUrl?: string | undefined;
|
|
8
|
+
ariaLabel?: string | undefined;
|
|
9
|
+
}, {
|
|
10
|
+
default: {};
|
|
11
|
+
}>, {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
}, {
|
|
14
|
+
default: {};
|
|
15
|
+
}> & {
|
|
16
|
+
$$bindings?: string | undefined;
|
|
17
|
+
};
|
|
18
|
+
declare const Dropdown: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
|
|
19
|
+
[x: string]: any;
|
|
20
|
+
class?: string | undefined;
|
|
21
|
+
open?: boolean | undefined;
|
|
22
|
+
placement?: "top" | "bottom" | "bottom-start" | "bottom-end" | "top-start" | "top-end" | undefined;
|
|
23
|
+
activeUrl?: string | undefined;
|
|
24
|
+
ariaLabel?: string | undefined;
|
|
25
|
+
}, {
|
|
26
|
+
default: {};
|
|
27
|
+
}>, {
|
|
28
|
+
[evt: string]: CustomEvent<any>;
|
|
29
|
+
}, {
|
|
30
|
+
default: {};
|
|
31
|
+
}, {}, string>;
|
|
32
|
+
type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
|
|
33
|
+
default: any;
|
|
34
|
+
} ? Props extends Record<string, never> ? any : {
|
|
35
|
+
children?: any;
|
|
36
|
+
} : {});
|
|
37
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
38
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
39
|
+
$$bindings?: Bindings;
|
|
40
|
+
} & Exports;
|
|
41
|
+
(internal: unknown, props: Props & {
|
|
42
|
+
$$events?: Events;
|
|
43
|
+
$$slots?: Slots;
|
|
44
|
+
}): Exports & {
|
|
45
|
+
$set?: any;
|
|
46
|
+
$on?: any;
|
|
47
|
+
};
|
|
48
|
+
z_$$bindings?: Bindings;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=Dropdown.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dropdown.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Dropdown/Dropdown.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAgKA;;;;;;;;;;;;;eAAyL;sCATnJ,KAAK,EAAE,KAAK;;;;;6CALL,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { getContext, createEventDispatcher } from "svelte";
|
|
3
|
+
|
|
4
|
+
/** @type {string|undefined} Optional href to make the item a link */
|
|
5
|
+
export let href = undefined;
|
|
6
|
+
/** @type {boolean} Whether the item is disabled */
|
|
7
|
+
export let disabled = false;
|
|
8
|
+
/** @type {string} Additional CSS classes */
|
|
9
|
+
let className = "";
|
|
10
|
+
export { className as class };
|
|
11
|
+
|
|
12
|
+
const dispatch = createEventDispatcher();
|
|
13
|
+
const context = getContext("dropdown");
|
|
14
|
+
|
|
15
|
+
$: isActive = context?.activeUrl && href && context.activeUrl === href;
|
|
16
|
+
|
|
17
|
+
function handleClick(event) {
|
|
18
|
+
if (disabled) {
|
|
19
|
+
event.preventDefault();
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
dispatch("click", event);
|
|
23
|
+
// Close dropdown after click (unless it's a link that will navigate)
|
|
24
|
+
if (!href && context?.close) {
|
|
25
|
+
context.close();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function handleKeydown(event) {
|
|
30
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
31
|
+
handleClick(event);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
{#if href}
|
|
37
|
+
<a
|
|
38
|
+
{href}
|
|
39
|
+
class="dropdown-item {className}"
|
|
40
|
+
class:dropdown-item--active={isActive}
|
|
41
|
+
class:dropdown-item--disabled={disabled}
|
|
42
|
+
role="menuitem"
|
|
43
|
+
tabindex={disabled ? -1 : 0}
|
|
44
|
+
on:click={handleClick}
|
|
45
|
+
on:keydown={handleKeydown}
|
|
46
|
+
>
|
|
47
|
+
<slot />
|
|
48
|
+
</a>
|
|
49
|
+
{:else}
|
|
50
|
+
<button
|
|
51
|
+
type="button"
|
|
52
|
+
class="dropdown-item {className}"
|
|
53
|
+
class:dropdown-item--disabled={disabled}
|
|
54
|
+
role="menuitem"
|
|
55
|
+
tabindex={disabled ? -1 : 0}
|
|
56
|
+
{disabled}
|
|
57
|
+
on:click={handleClick}
|
|
58
|
+
on:keydown={handleKeydown}
|
|
59
|
+
>
|
|
60
|
+
<slot />
|
|
61
|
+
</button>
|
|
62
|
+
{/if}
|
|
63
|
+
|
|
64
|
+
<style>
|
|
65
|
+
.dropdown-item {
|
|
66
|
+
display: flex;
|
|
67
|
+
align-items: center;
|
|
68
|
+
width: 100%;
|
|
69
|
+
padding: 0.5rem 1rem;
|
|
70
|
+
font-size: 0.875rem;
|
|
71
|
+
color: hsl(var(--Text-Primary, 220 13% 13%));
|
|
72
|
+
background: transparent;
|
|
73
|
+
border: none;
|
|
74
|
+
text-align: left;
|
|
75
|
+
cursor: pointer;
|
|
76
|
+
text-decoration: none;
|
|
77
|
+
transition: background-color 0.15s ease;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.dropdown-item:hover:not(.dropdown-item--disabled) {
|
|
81
|
+
background-color: hsl(var(--BG-Secondary, 220 14% 96%));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.dropdown-item:focus {
|
|
85
|
+
outline: none;
|
|
86
|
+
background-color: hsl(var(--BG-Secondary, 220 14% 96%));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.dropdown-item--active {
|
|
90
|
+
background-color: hsl(var(--Brand-Primary, 221 83% 53%) / 0.1);
|
|
91
|
+
color: hsl(var(--Brand-Primary, 221 83% 53%));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.dropdown-item--disabled {
|
|
95
|
+
opacity: 0.5;
|
|
96
|
+
cursor: not-allowed;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* Dark mode */
|
|
100
|
+
:global(.dark) .dropdown-item {
|
|
101
|
+
color: hsl(var(--Text-Primary, 0 0% 95%));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
:global(.dark) .dropdown-item:hover:not(.dropdown-item--disabled) {
|
|
105
|
+
background-color: hsl(var(--BG-Secondary, 220 13% 20%));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
:global(.dark) .dropdown-item:focus {
|
|
109
|
+
background-color: hsl(var(--BG-Secondary, 220 13% 20%));
|
|
110
|
+
}
|
|
111
|
+
</style>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export default DropdownItem;
|
|
2
|
+
type DropdownItem = SvelteComponent<$$__sveltets_2_PropsWithChildren<{
|
|
3
|
+
class?: string | undefined;
|
|
4
|
+
disabled?: boolean | undefined;
|
|
5
|
+
href?: string | undefined;
|
|
6
|
+
}, {
|
|
7
|
+
default: {};
|
|
8
|
+
}>, {
|
|
9
|
+
click: CustomEvent<any>;
|
|
10
|
+
} & {
|
|
11
|
+
[evt: string]: CustomEvent<any>;
|
|
12
|
+
}, {
|
|
13
|
+
default: {};
|
|
14
|
+
}> & {
|
|
15
|
+
$$bindings?: string | undefined;
|
|
16
|
+
};
|
|
17
|
+
declare const DropdownItem: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
|
|
18
|
+
class?: string | undefined;
|
|
19
|
+
disabled?: boolean | undefined;
|
|
20
|
+
href?: string | undefined;
|
|
21
|
+
}, {
|
|
22
|
+
default: {};
|
|
23
|
+
}>, {
|
|
24
|
+
click: CustomEvent<any>;
|
|
25
|
+
} & {
|
|
26
|
+
[evt: string]: CustomEvent<any>;
|
|
27
|
+
}, {
|
|
28
|
+
default: {};
|
|
29
|
+
}, {}, string>;
|
|
30
|
+
type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
|
|
31
|
+
default: any;
|
|
32
|
+
} ? Props extends Record<string, never> ? any : {
|
|
33
|
+
children?: any;
|
|
34
|
+
} : {});
|
|
35
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
36
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
37
|
+
$$bindings?: Bindings;
|
|
38
|
+
} & Exports;
|
|
39
|
+
(internal: unknown, props: Props & {
|
|
40
|
+
$$events?: Events;
|
|
41
|
+
$$slots?: Slots;
|
|
42
|
+
}): Exports & {
|
|
43
|
+
$set?: any;
|
|
44
|
+
$on?: any;
|
|
45
|
+
};
|
|
46
|
+
z_$$bindings?: Bindings;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=DropdownItem.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DropdownItem.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Dropdown/DropdownItem.svelte.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAuEA;;;WAjBW,MAAM,GAAC,SAAS;;;;;;;;;eAiBgI;sCATrH,KAAK,EAAE,KAAK;;;;;6CALL,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,eAAe,QAAQ,CAAC"}
|