@makolabs/ripple 0.0.1-dev.7 → 0.0.1-dev.8
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 +393 -53
- package/dist/button/Button.svelte +5 -3
- package/dist/button/Button.svelte.d.ts +1 -1
- package/dist/button/button.d.ts +40 -63
- package/dist/button/button.js +15 -14
- package/dist/charts/Chart.svelte +533 -0
- package/dist/charts/Chart.svelte.d.ts +4 -0
- package/dist/drawer/Drawer.svelte +13 -2
- package/dist/drawer/Drawer.svelte.d.ts +1 -1
- package/dist/drawer/drawer.d.ts +0 -17
- package/dist/elements/alert/Alert.svelte +53 -0
- package/dist/elements/alert/Alert.svelte.d.ts +4 -0
- package/dist/elements/badge/Badge.svelte +13 -5
- package/dist/elements/badge/Badge.svelte.d.ts +1 -1
- package/dist/elements/badge/badge.d.ts +0 -12
- package/dist/elements/dropdown/Dropdown.svelte +32 -37
- package/dist/elements/dropdown/Dropdown.svelte.d.ts +1 -1
- package/dist/elements/dropdown/Select.svelte +143 -59
- package/dist/elements/dropdown/Select.svelte.d.ts +1 -1
- package/dist/elements/dropdown/dropdown.d.ts +34 -57
- package/dist/elements/dropdown/dropdown.js +10 -4
- package/dist/elements/dropdown/select.d.ts +34 -54
- package/dist/elements/dropdown/select.js +22 -14
- package/dist/elements/file-upload/FileUpload.svelte +213 -0
- package/dist/elements/file-upload/FileUpload.svelte.d.ts +4 -0
- package/dist/elements/progress/Progress.svelte +87 -0
- package/dist/elements/progress/Progress.svelte.d.ts +4 -0
- package/dist/elements/timeline/Timeline.svelte +92 -0
- package/dist/elements/timeline/Timeline.svelte.d.ts +7 -0
- package/dist/forms/Checkbox.svelte +54 -0
- package/dist/forms/Checkbox.svelte.d.ts +4 -0
- package/dist/forms/DateRange.svelte +493 -0
- package/dist/forms/DateRange.svelte.d.ts +4 -0
- package/dist/forms/Form.svelte +39 -0
- package/dist/forms/Form.svelte.d.ts +4 -0
- package/dist/forms/Input.svelte +86 -0
- package/dist/forms/Input.svelte.d.ts +4 -0
- package/dist/forms/NumberInput.svelte +159 -0
- package/dist/forms/NumberInput.svelte.d.ts +4 -0
- package/dist/forms/RadioInputs.svelte +64 -0
- package/dist/forms/RadioInputs.svelte.d.ts +4 -0
- package/dist/forms/RadioPill.svelte +66 -0
- package/dist/forms/RadioPill.svelte.d.ts +4 -0
- package/dist/forms/Slider.svelte +342 -0
- package/dist/forms/Slider.svelte.d.ts +4 -0
- package/dist/forms/Tags.svelte +181 -0
- package/dist/forms/Tags.svelte.d.ts +4 -0
- package/dist/forms/Toggle.svelte +132 -0
- package/dist/forms/Toggle.svelte.d.ts +4 -0
- package/dist/forms/slider.d.ts +143 -0
- package/dist/forms/slider.js +62 -0
- package/dist/header/Breadcrumbs.svelte +2 -1
- package/dist/header/Breadcrumbs.svelte.d.ts +1 -1
- package/dist/header/PageHeader.svelte +2 -2
- package/dist/header/PageHeader.svelte.d.ts +1 -1
- package/dist/header/breadcrumbs.d.ts +20 -14
- package/dist/header/breadcrumbs.js +6 -0
- package/dist/header/pageheaders.d.ts +1 -1
- package/dist/helper/date.d.ts +7 -0
- package/dist/helper/date.js +15 -0
- package/dist/index.d.ts +742 -9
- package/dist/index.js +59 -16
- package/dist/layout/card/Card.svelte +5 -8
- package/dist/layout/card/Card.svelte.d.ts +1 -1
- package/dist/layout/card/StatsCard.svelte +116 -87
- package/dist/layout/card/card.d.ts +22 -33
- package/dist/layout/card/card.js +9 -8
- package/dist/layout/card/stats-card.d.ts +23 -25
- package/dist/layout/card/stats-card.js +13 -13
- package/dist/layout/navbar/navbar.d.ts +0 -23
- package/dist/layout/sidebar/NavGroup.svelte +20 -44
- package/dist/layout/sidebar/NavGroup.svelte.d.ts +1 -1
- package/dist/layout/sidebar/NavItem.svelte +1 -1
- package/dist/layout/sidebar/NavItem.svelte.d.ts +1 -1
- package/dist/layout/sidebar/Sidebar.svelte +19 -25
- package/dist/layout/sidebar/Sidebar.svelte.d.ts +1 -1
- package/dist/layout/table/table.d.ts +1 -1
- package/dist/layout/tabs/tabs.d.ts +1 -1
- package/dist/modal/Modal.svelte +2 -1
- package/dist/modal/Modal.svelte.d.ts +1 -1
- package/dist/modal/modal.d.ts +0 -23
- package/dist/sonner/sonner.svelte +13 -0
- package/dist/sonner/sonner.svelte.d.ts +4 -0
- package/dist/types/variants.d.ts +1 -21
- package/dist/types/variants.js +1 -19
- package/dist/variants.d.ts +20 -0
- package/dist/variants.js +19 -0
- package/package.json +6 -2
- package/dist/button/index.d.ts +0 -1
- package/dist/button/index.js +0 -1
- package/dist/drawer/index.d.ts +0 -2
- package/dist/drawer/index.js +0 -1
- package/dist/elements/badge/index.d.ts +0 -2
- package/dist/elements/badge/index.js +0 -2
- package/dist/elements/dropdown/index.d.ts +0 -3
- package/dist/elements/dropdown/index.js +0 -2
- package/dist/header/index.d.ts +0 -4
- package/dist/header/index.js +0 -2
- package/dist/layout/card/index.d.ts +0 -4
- package/dist/layout/card/index.js +0 -2
- package/dist/layout/index.d.ts +0 -5
- package/dist/layout/index.js +0 -5
- package/dist/layout/navbar/index.d.ts +0 -2
- package/dist/layout/navbar/index.js +0 -2
- package/dist/layout/sidebar/index.d.ts +0 -2
- package/dist/layout/sidebar/index.js +0 -1
- package/dist/layout/sidebar/sidebar.d.ts +0 -46
- package/dist/layout/sidebar/sidebar.js +0 -1
- package/dist/layout/table/index.d.ts +0 -3
- package/dist/layout/table/index.js +0 -2
- package/dist/layout/tabs/index.d.ts +0 -3
- package/dist/layout/tabs/index.js +0 -3
- package/dist/modal/index.d.ts +0 -1
- package/dist/modal/index.js +0 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../helper/cls.js';
|
|
3
|
+
import { Color } from '../../variants.js';
|
|
4
|
+
import type { AlertProps } from '../../index.js';
|
|
5
|
+
|
|
6
|
+
let {
|
|
7
|
+
title,
|
|
8
|
+
message,
|
|
9
|
+
color = Color.DEFAULT,
|
|
10
|
+
onclose,
|
|
11
|
+
class: className = ''
|
|
12
|
+
}: AlertProps = $props();
|
|
13
|
+
|
|
14
|
+
function handleClose() {
|
|
15
|
+
onclose?.();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const colorClasses = {
|
|
19
|
+
[Color.DEFAULT]: 'bg-gray-50 border-gray-200 text-gray-800',
|
|
20
|
+
[Color.PRIMARY]: 'bg-primary-50 border-primary-200 text-primary-800',
|
|
21
|
+
[Color.SUCCESS]: 'bg-success-50 border-success-200 text-success-800',
|
|
22
|
+
[Color.WARNING]: 'bg-warning-50 border-warning-200 text-warning-800',
|
|
23
|
+
[Color.DANGER]: 'bg-danger-50 border-danger-200 text-danger-800',
|
|
24
|
+
[Color.INFO]: 'bg-info-50 border-info-200 text-info-800'
|
|
25
|
+
};
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<div class={cn('relative rounded-lg border p-4', colorClasses[color], className)}>
|
|
29
|
+
<div class="flex items-start justify-between gap-4">
|
|
30
|
+
<div class="flex-1">
|
|
31
|
+
{#if title}
|
|
32
|
+
<h4 class="mb-2 font-semibold">{title}</h4>
|
|
33
|
+
{/if}
|
|
34
|
+
<p class="text-sm">{message}</p>
|
|
35
|
+
</div>
|
|
36
|
+
{#if onclose}
|
|
37
|
+
<button
|
|
38
|
+
type="button"
|
|
39
|
+
class="flex-shrink-0 cursor-pointer rounded-md p-1 hover:bg-gray-200/20"
|
|
40
|
+
onclick={handleClose}
|
|
41
|
+
aria-label="Close alert"
|
|
42
|
+
>
|
|
43
|
+
<svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">
|
|
44
|
+
<path
|
|
45
|
+
fill-rule="evenodd"
|
|
46
|
+
d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
|
|
47
|
+
clip-rule="evenodd"
|
|
48
|
+
/>
|
|
49
|
+
</svg>
|
|
50
|
+
</button>
|
|
51
|
+
{/if}
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { cn } from '../../helper/cls.js';
|
|
3
|
-
import { badge
|
|
3
|
+
import { badge } from './badge.js';
|
|
4
|
+
import type { BadgeProps } from '../../index.js';
|
|
4
5
|
|
|
5
6
|
let {
|
|
6
7
|
size = 'base',
|
|
@@ -18,13 +19,20 @@
|
|
|
18
19
|
);
|
|
19
20
|
|
|
20
21
|
const baseClass = $derived(cn(base(), className));
|
|
22
|
+
|
|
23
|
+
function handleOnClose(event) {
|
|
24
|
+
event.preventDefault();
|
|
25
|
+
onClose();
|
|
26
|
+
}
|
|
21
27
|
</script>
|
|
22
28
|
|
|
23
|
-
<
|
|
29
|
+
<span class={baseClass}>
|
|
24
30
|
{@render children()}
|
|
25
31
|
{#if onClose}
|
|
26
|
-
<button
|
|
27
|
-
|
|
32
|
+
<button
|
|
33
|
+
onclick={handleOnClose} class="cursor-pointer h-full flex items-center" aria-label="Close" title="Close"
|
|
34
|
+
tabindex="0" type="button">
|
|
35
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32" class="size-2">
|
|
28
36
|
<path
|
|
29
37
|
fill="currentColor"
|
|
30
38
|
d="M26.113 4.116a1.25 1.25 0 0 1 1.768 1.768L17.766 15.999l10.115 10.114a1.25 1.25 0 1 1-1.768 1.768L16 17.766L5.884 27.881a1.25 1.25 0 1 1-1.768-1.768L14.231 16L4.116 5.884a1.25 1.25 0 1 1 1.768-1.768l10.115 10.115z"
|
|
@@ -32,4 +40,4 @@
|
|
|
32
40
|
</svg>
|
|
33
41
|
</button>
|
|
34
42
|
{/if}
|
|
35
|
-
</
|
|
43
|
+
</span>
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import type { ClassValue } from 'tailwind-variants';
|
|
2
|
-
import type { VariantColors, VariantSizes } from '../../types/variants.js';
|
|
3
|
-
import type { Snippet } from 'svelte';
|
|
4
1
|
export declare const badge: import("tailwind-variants").TVReturnType<{
|
|
5
2
|
size: {
|
|
6
3
|
xs: {
|
|
@@ -182,12 +179,3 @@ export declare const badge: import("tailwind-variants").TVReturnType<{
|
|
|
182
179
|
base: string;
|
|
183
180
|
icon: string;
|
|
184
181
|
}, undefined, unknown, unknown, undefined>>;
|
|
185
|
-
export type BadgeProps = {
|
|
186
|
-
label?: string;
|
|
187
|
-
size?: VariantSizes;
|
|
188
|
-
color?: VariantColors;
|
|
189
|
-
class?: ClassValue;
|
|
190
|
-
contentClass?: ClassValue;
|
|
191
|
-
children: Snippet;
|
|
192
|
-
onclose?: (event: MouseEvent) => void;
|
|
193
|
-
};
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { cn } from '../../helper/cls.js';
|
|
3
3
|
import { fly } from 'svelte/transition';
|
|
4
|
-
import {
|
|
4
|
+
import type { DropdownMenuProps, DropdownItem } from '../../index.js';
|
|
5
|
+
import { dropdownMenu } from '../../index.js';
|
|
5
6
|
import { onMount, onDestroy } from 'svelte';
|
|
6
|
-
import { Size } from '../../
|
|
7
|
+
import { Size } from '../../variants.js';
|
|
7
8
|
|
|
8
9
|
let {
|
|
9
10
|
sections = [],
|
|
10
11
|
open: isOpen = $bindable(false),
|
|
11
|
-
label = '
|
|
12
|
+
label = '',
|
|
12
13
|
icon: Icon,
|
|
13
|
-
triggerContent,
|
|
14
|
-
triggerClass = '',
|
|
15
14
|
containerClass = '',
|
|
16
15
|
itemClass = '',
|
|
17
16
|
class: className = '',
|
|
@@ -22,6 +21,9 @@
|
|
|
22
21
|
header
|
|
23
22
|
}: DropdownMenuProps = $props();
|
|
24
23
|
|
|
24
|
+
// Determine if we're in icon-only mode
|
|
25
|
+
const iconOnly = $derived(!label && !!Icon);
|
|
26
|
+
|
|
25
27
|
let dropdownRef = $state<HTMLDivElement | undefined>();
|
|
26
28
|
let triggerRef = $state<HTMLDivElement | undefined>();
|
|
27
29
|
let portalEl = $state<HTMLDivElement | undefined>();
|
|
@@ -41,12 +43,13 @@
|
|
|
41
43
|
dropdownMenu({
|
|
42
44
|
position,
|
|
43
45
|
size,
|
|
44
|
-
isOpen
|
|
46
|
+
isOpen,
|
|
47
|
+
iconOnly
|
|
45
48
|
})
|
|
46
49
|
);
|
|
47
50
|
|
|
48
51
|
const baseClass = $derived(cn(base(), className));
|
|
49
|
-
const triggerClass_ = $derived(cn(trigger(),
|
|
52
|
+
const triggerClass_ = $derived(cn(trigger(), ''));
|
|
50
53
|
const containerClass_ = $derived(cn(container(), width, containerClass, 'shadow-lg'));
|
|
51
54
|
const sectionClass = $derived(cn(section()));
|
|
52
55
|
const itemClass_ = $derived(cn(item(), itemClass));
|
|
@@ -125,7 +128,6 @@
|
|
|
125
128
|
}
|
|
126
129
|
|
|
127
130
|
function handleItemClick(item: DropdownItem) {
|
|
128
|
-
if (item.disabled) return;
|
|
129
131
|
if (item.onclick) item.onclick();
|
|
130
132
|
isOpen = false;
|
|
131
133
|
}
|
|
@@ -178,35 +180,28 @@
|
|
|
178
180
|
|
|
179
181
|
<div class={baseClass}>
|
|
180
182
|
<div bind:this={triggerRef}>
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
{disabled}
|
|
192
|
-
>
|
|
183
|
+
<button
|
|
184
|
+
type="button"
|
|
185
|
+
id="menu-button"
|
|
186
|
+
aria-expanded={isOpen}
|
|
187
|
+
aria-haspopup="true"
|
|
188
|
+
class={triggerClass_}
|
|
189
|
+
onclick={handleToggle}
|
|
190
|
+
{disabled}
|
|
191
|
+
>
|
|
192
|
+
{#if label}
|
|
193
193
|
{label}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
/>
|
|
206
|
-
</svg>
|
|
207
|
-
{/if}
|
|
208
|
-
</button>
|
|
209
|
-
{/if}
|
|
194
|
+
{/if}
|
|
195
|
+
|
|
196
|
+
{#if Icon}
|
|
197
|
+
<Icon class="size-5 text-default-400" />
|
|
198
|
+
{:else if label}
|
|
199
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28" class="size-5">
|
|
200
|
+
<path fill="currentColor"
|
|
201
|
+
d="M4.22 9.47a.75.75 0 0 1 1.06 0L14 18.19l8.72-8.72a.75.75 0 1 1 1.06 1.06l-9.25 9.25a.75.75 0 0 1-1.06 0l-9.25-9.25a.75.75 0 0 1 0-1.06" />
|
|
202
|
+
</svg>
|
|
203
|
+
{/if}
|
|
204
|
+
</button>
|
|
210
205
|
</div>
|
|
211
206
|
</div>
|
|
212
207
|
|
|
@@ -253,7 +248,7 @@
|
|
|
253
248
|
<button
|
|
254
249
|
type="button"
|
|
255
250
|
onclick={() => handleItemClick(menuItem)}
|
|
256
|
-
disabled={menuItem.
|
|
251
|
+
disabled={!menuItem.onclick} {...itemProps}>
|
|
257
252
|
{@render DropItemContent(menuItem)}
|
|
258
253
|
</button>
|
|
259
254
|
{/if}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { DropdownMenuProps } from '../../index.js';
|
|
2
2
|
declare const Dropdown: import("svelte").Component<DropdownMenuProps, {}, "open">;
|
|
3
3
|
type Dropdown = ReturnType<typeof Dropdown>;
|
|
4
4
|
export default Dropdown;
|
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { tick } from 'svelte';
|
|
3
3
|
import { cn } from '../../helper/cls.js';
|
|
4
|
-
import { selectTV
|
|
4
|
+
import { selectTV } from './select.js';
|
|
5
|
+
import type { SelectItem, SelectProps } from '../../index.js';
|
|
6
|
+
import Badge from '../badge/Badge.svelte';
|
|
7
|
+
import { Size } from '../../variants.js';
|
|
5
8
|
|
|
6
9
|
let {
|
|
7
10
|
items = [],
|
|
8
11
|
value = $bindable(''),
|
|
12
|
+
multiple = false,
|
|
9
13
|
placeholder = 'Select an option',
|
|
10
14
|
searchable = false,
|
|
11
15
|
disabled = false,
|
|
12
|
-
size =
|
|
16
|
+
size = Size.BASE,
|
|
13
17
|
class: className = '',
|
|
14
|
-
triggerClass = '',
|
|
15
18
|
containerClass = '',
|
|
16
19
|
listClass = '',
|
|
17
20
|
itemClass = '',
|
|
18
21
|
searchInputClass = '',
|
|
19
22
|
icon: Icon,
|
|
20
23
|
iconClass = '',
|
|
21
|
-
|
|
24
|
+
triggerClass = '', // recently, just now
|
|
22
25
|
onselect = () => {},
|
|
23
26
|
onopen = () => {},
|
|
24
27
|
onclose = () => {}
|
|
@@ -30,10 +33,19 @@
|
|
|
30
33
|
let searchInputRef = $state<HTMLInputElement | null>(null);
|
|
31
34
|
let highlightedIndex = $state(-1);
|
|
32
35
|
|
|
36
|
+
// Convert value to array for internal processing if multiple is true
|
|
37
|
+
const valueArray = $derived.by(() => {
|
|
38
|
+
if (multiple) {
|
|
39
|
+
return Array.isArray(value) ? value : value ? [value] : [];
|
|
40
|
+
}
|
|
41
|
+
return typeof value === 'string' ? [value] : [];
|
|
42
|
+
});
|
|
43
|
+
|
|
33
44
|
const { base, trigger, triggerIcon, container, searchInput, list, item, emptyMessage } = $derived(
|
|
34
45
|
selectTV({
|
|
35
46
|
size,
|
|
36
|
-
disabled
|
|
47
|
+
disabled,
|
|
48
|
+
multiple
|
|
37
49
|
})
|
|
38
50
|
);
|
|
39
51
|
|
|
@@ -47,6 +59,7 @@
|
|
|
47
59
|
const emptyMessageClass = $derived(cn(emptyMessage()));
|
|
48
60
|
|
|
49
61
|
const selectedItem = $derived(items.find((item) => item.value === value));
|
|
62
|
+
const selectedItems = $derived(items.filter((item) => valueArray.includes(item.value)));
|
|
50
63
|
|
|
51
64
|
const filteredItems = $derived(
|
|
52
65
|
searchable && searchQuery
|
|
@@ -59,7 +72,7 @@
|
|
|
59
72
|
open = !open;
|
|
60
73
|
|
|
61
74
|
if (open) {
|
|
62
|
-
highlightedIndex = filteredItems.findIndex((item) => item.value === value);
|
|
75
|
+
highlightedIndex = !multiple ? filteredItems.findIndex((item) => item.value === value) : -1;
|
|
63
76
|
|
|
64
77
|
onopen();
|
|
65
78
|
|
|
@@ -76,9 +89,36 @@
|
|
|
76
89
|
|
|
77
90
|
function handleSelect(item: SelectItem) {
|
|
78
91
|
if (item.disabled) return;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
92
|
+
|
|
93
|
+
if (multiple) {
|
|
94
|
+
const isSelected = valueArray.includes(item.value);
|
|
95
|
+
|
|
96
|
+
if (isSelected) {
|
|
97
|
+
// Remove from selection
|
|
98
|
+
value = Array.isArray(value) ? value.filter((v) => v !== item.value) : [];
|
|
99
|
+
} else {
|
|
100
|
+
// Add to selection
|
|
101
|
+
value = Array.isArray(value) ? [...value, item.value] : [item.value];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Keep dropdown open when multiple selection is enabled
|
|
105
|
+
if (searchable && searchInputRef) {
|
|
106
|
+
searchInputRef.focus();
|
|
107
|
+
}
|
|
108
|
+
} else {
|
|
109
|
+
// Single selection
|
|
110
|
+
value = item.value;
|
|
111
|
+
open = false;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
onselect({ value });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function removeItem(itemValue: string) {
|
|
118
|
+
if (multiple && Array.isArray(value)) {
|
|
119
|
+
value = value.filter((v) => v !== itemValue);
|
|
120
|
+
onselect({ value });
|
|
121
|
+
}
|
|
82
122
|
}
|
|
83
123
|
|
|
84
124
|
function handleClickOutside(event: MouseEvent) {
|
|
@@ -143,55 +183,82 @@
|
|
|
143
183
|
<svelte:window onclick={handleClickOutside} onkeydown={handleKeydown} />
|
|
144
184
|
|
|
145
185
|
<div bind:this={selectRef} class={baseClass} data-state={open ? 'open' : 'closed'}>
|
|
146
|
-
<
|
|
147
|
-
type="button"
|
|
148
|
-
onclick={handleToggle}
|
|
149
|
-
{disabled}
|
|
186
|
+
<label
|
|
150
187
|
class={triggerClass_}
|
|
188
|
+
aria-disabled={disabled}
|
|
151
189
|
aria-haspopup="listbox"
|
|
152
|
-
aria-expanded={open}
|
|
153
190
|
aria-labelledby="select-label"
|
|
154
191
|
>
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
192
|
+
<button
|
|
193
|
+
type="button"
|
|
194
|
+
aria-label="Toggle dropdown"
|
|
195
|
+
{disabled}
|
|
196
|
+
aria-expanded={open}
|
|
197
|
+
onclick={handleToggle}
|
|
198
|
+
></button>
|
|
199
|
+
<span class="flex min-h-[1.5rem] flex-1 flex-wrap items-center gap-1 overflow-hidden">
|
|
200
|
+
{#if multiple && selectedItems.length > 0}
|
|
201
|
+
{#each selectedItems as item (item.value)}
|
|
202
|
+
<Badge {size} color="info" onclose={() => removeItem(item.value)}>
|
|
203
|
+
{item.value}
|
|
204
|
+
</Badge>
|
|
205
|
+
{/each}
|
|
206
|
+
{:else if !multiple && selectedItem}
|
|
207
|
+
<span id="select-label" class="flex-1 truncate text-left">
|
|
208
|
+
{selectedItem.label}
|
|
209
|
+
</span>
|
|
210
|
+
{:else}
|
|
211
|
+
<span id="select-label" class="text-default-500 px-1">
|
|
212
|
+
{placeholder}
|
|
213
|
+
</span>
|
|
214
|
+
{/if}
|
|
215
|
+
</span>
|
|
216
|
+
|
|
217
|
+
<span class="ml-auto flex flex-shrink-0 items-center pl-2">
|
|
218
|
+
{#if Icon}
|
|
219
|
+
<Icon class={triggerIconClass} />
|
|
220
|
+
{:else}
|
|
221
|
+
<svg
|
|
222
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
223
|
+
viewBox="0 0 20 20"
|
|
224
|
+
fill="currentColor"
|
|
225
|
+
class={cn(triggerIconClass, open && 'rotate-180 transform')}
|
|
226
|
+
>
|
|
227
|
+
<path
|
|
228
|
+
fill-rule="evenodd"
|
|
229
|
+
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
|
230
|
+
clip-rule="evenodd"
|
|
231
|
+
/>
|
|
232
|
+
</svg>
|
|
233
|
+
{/if}
|
|
234
|
+
</span>
|
|
235
|
+
</label>
|
|
236
|
+
|
|
237
|
+
{#if open}
|
|
238
|
+
<div class={containerClass_} role="listbox" aria-labelledby="select-label">
|
|
239
|
+
{#if searchable}
|
|
240
|
+
<div class={searchInputClass_}>
|
|
166
241
|
<svg
|
|
167
242
|
xmlns="http://www.w3.org/2000/svg"
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
243
|
+
width="12"
|
|
244
|
+
height="12"
|
|
245
|
+
viewBox="0 0 12 12"
|
|
246
|
+
class="size-4"
|
|
171
247
|
>
|
|
172
248
|
<path
|
|
173
|
-
fill
|
|
174
|
-
d="M5
|
|
175
|
-
clip-rule="evenodd"
|
|
249
|
+
fill="currentColor"
|
|
250
|
+
d="M5 1a4 4 0 1 0 2.452 7.16l2.694 2.693a.5.5 0 1 0 .707-.707L8.16 7.453A4 4 0 0 0 5 1M2 5a3 3 0 1 1 6 0a3 3 0 0 1-6 0"
|
|
176
251
|
/>
|
|
177
252
|
</svg>
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
<input
|
|
188
|
-
bind:this={searchInputRef}
|
|
189
|
-
bind:value={searchQuery}
|
|
190
|
-
type="text"
|
|
191
|
-
placeholder="Search..."
|
|
192
|
-
class={searchInputClass_}
|
|
193
|
-
aria-label="Search select options"
|
|
194
|
-
/>
|
|
253
|
+
<input
|
|
254
|
+
bind:this={searchInputRef}
|
|
255
|
+
bind:value={searchQuery}
|
|
256
|
+
type="text"
|
|
257
|
+
class="ring-0 outline-0"
|
|
258
|
+
placeholder="Search..."
|
|
259
|
+
aria-label="Search select options"
|
|
260
|
+
/>
|
|
261
|
+
</div>
|
|
195
262
|
{/if}
|
|
196
263
|
|
|
197
264
|
{#if filteredItems.length === 0}
|
|
@@ -206,20 +273,37 @@
|
|
|
206
273
|
disabled={item.disabled}
|
|
207
274
|
class={itemClass_}
|
|
208
275
|
role="option"
|
|
209
|
-
aria-selected={
|
|
210
|
-
data-selected={
|
|
276
|
+
aria-selected={valueArray.includes(item.value)}
|
|
277
|
+
data-selected={valueArray.includes(item.value)}
|
|
211
278
|
data-highlighted={index === highlightedIndex}
|
|
212
279
|
data-index={index}
|
|
213
280
|
>
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
281
|
+
<span class="flex w-full items-center justify-between">
|
|
282
|
+
<span class="flex items-center gap-2 overflow-hidden">
|
|
283
|
+
{#if item.icon}
|
|
284
|
+
{@const Icon = item.icon}
|
|
285
|
+
<Icon class="h-4 w-4 flex-shrink-0" />
|
|
286
|
+
{/if}
|
|
287
|
+
<span class="truncate">{item.label}</span>
|
|
288
|
+
</span>
|
|
289
|
+
|
|
290
|
+
{#if valueArray.includes(item.value)}
|
|
291
|
+
<svg
|
|
292
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
293
|
+
width="16"
|
|
294
|
+
height="16"
|
|
295
|
+
viewBox="0 0 24 24"
|
|
296
|
+
fill="none"
|
|
297
|
+
stroke="currentColor"
|
|
298
|
+
stroke-width="2"
|
|
299
|
+
stroke-linecap="round"
|
|
300
|
+
stroke-linejoin="round"
|
|
301
|
+
class="text-info-500"
|
|
302
|
+
>
|
|
303
|
+
<polyline points="20 6 9 17 4 12" />
|
|
304
|
+
</svg>
|
|
305
|
+
{/if}
|
|
306
|
+
</span>
|
|
223
307
|
</button>
|
|
224
308
|
</li>
|
|
225
309
|
{/each}
|