@nuykon/basecoat-svelte 0.0.0-stage → 1.0.2
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/CHANGELOG.md +20 -0
- package/dist/Accordion.svelte +59 -0
- package/dist/Accordion.svelte.d.ts +13 -0
- package/dist/AccordionRoot.svelte +20 -0
- package/dist/AccordionRoot.svelte.d.ts +8 -0
- package/dist/Alert.svelte +33 -0
- package/dist/Alert.svelte.d.ts +13 -0
- package/dist/AlertDescription.svelte +33 -0
- package/dist/AlertDescription.svelte.d.ts +13 -0
- package/dist/AlertDialog.svelte +7 -0
- package/dist/AlertDialog.svelte.d.ts +17 -0
- package/dist/AlertDialogRoot.svelte +20 -0
- package/dist/AlertDialogRoot.svelte.d.ts +8 -0
- package/dist/AlertTitle.svelte +33 -0
- package/dist/AlertTitle.svelte.d.ts +13 -0
- package/dist/Avatar.svelte +33 -0
- package/dist/Avatar.svelte.d.ts +13 -0
- package/dist/AvatarFallback.svelte +33 -0
- package/dist/AvatarFallback.svelte.d.ts +13 -0
- package/dist/AvatarImage.svelte +31 -0
- package/dist/AvatarImage.svelte.d.ts +13 -0
- package/dist/Badge.svelte +33 -0
- package/dist/Badge.svelte.d.ts +13 -0
- package/dist/Breadcrumb.svelte +33 -0
- package/dist/Breadcrumb.svelte.d.ts +13 -0
- package/dist/BreadcrumbItem.svelte +33 -0
- package/dist/BreadcrumbItem.svelte.d.ts +13 -0
- package/dist/BreadcrumbLink.svelte +33 -0
- package/dist/BreadcrumbLink.svelte.d.ts +13 -0
- package/dist/BreadcrumbList.svelte +33 -0
- package/dist/BreadcrumbList.svelte.d.ts +13 -0
- package/dist/BreadcrumbSeparator.svelte +33 -0
- package/dist/BreadcrumbSeparator.svelte.d.ts +13 -0
- package/dist/Button.svelte +33 -0
- package/dist/Button.svelte.d.ts +13 -0
- package/dist/ButtonGroup.svelte +33 -0
- package/dist/ButtonGroup.svelte.d.ts +13 -0
- package/dist/Card.svelte +33 -0
- package/dist/Card.svelte.d.ts +13 -0
- package/dist/CardAction.svelte +33 -0
- package/dist/CardAction.svelte.d.ts +13 -0
- package/dist/CardContent.svelte +33 -0
- package/dist/CardContent.svelte.d.ts +13 -0
- package/dist/CardDescription.svelte +33 -0
- package/dist/CardDescription.svelte.d.ts +13 -0
- package/dist/CardFooter.svelte +33 -0
- package/dist/CardFooter.svelte.d.ts +13 -0
- package/dist/CardHeader.svelte +33 -0
- package/dist/CardHeader.svelte.d.ts +13 -0
- package/dist/CardTitle.svelte +33 -0
- package/dist/CardTitle.svelte.d.ts +13 -0
- package/dist/Chart.svelte +39 -0
- package/dist/Chart.svelte.d.ts +9 -0
- package/dist/ChartRoot.svelte +9 -0
- package/dist/ChartRoot.svelte.d.ts +4 -0
- package/dist/Checkbox.svelte +43 -0
- package/dist/Checkbox.svelte.d.ts +10 -0
- package/dist/Collapsible.svelte +36 -0
- package/dist/Collapsible.svelte.d.ts +11 -0
- package/dist/Combobox.svelte +7 -0
- package/dist/Combobox.svelte.d.ts +17 -0
- package/dist/ComboboxRoot.svelte +20 -0
- package/dist/ComboboxRoot.svelte.d.ts +8 -0
- package/dist/Command.svelte +79 -0
- package/dist/Command.svelte.d.ts +11 -0
- package/dist/CommandRoot.svelte +20 -0
- package/dist/CommandRoot.svelte.d.ts +8 -0
- package/dist/Dialog.svelte +104 -0
- package/dist/Dialog.svelte.d.ts +20 -0
- package/dist/DialogContent.svelte +33 -0
- package/dist/DialogContent.svelte.d.ts +13 -0
- package/dist/DialogDescription.svelte +33 -0
- package/dist/DialogDescription.svelte.d.ts +13 -0
- package/dist/DialogFooter.svelte +33 -0
- package/dist/DialogFooter.svelte.d.ts +13 -0
- package/dist/DialogHeader.svelte +33 -0
- package/dist/DialogHeader.svelte.d.ts +13 -0
- package/dist/DialogRoot.svelte +20 -0
- package/dist/DialogRoot.svelte.d.ts +8 -0
- package/dist/DialogTitle.svelte +33 -0
- package/dist/DialogTitle.svelte.d.ts +13 -0
- package/dist/Drawer.svelte +7 -0
- package/dist/Drawer.svelte.d.ts +17 -0
- package/dist/DrawerRoot.svelte +20 -0
- package/dist/DrawerRoot.svelte.d.ts +8 -0
- package/dist/DropdownMenu.svelte +133 -0
- package/dist/DropdownMenu.svelte.d.ts +15 -0
- package/dist/DropdownMenuRoot.svelte +20 -0
- package/dist/DropdownMenuRoot.svelte.d.ts +8 -0
- package/dist/Empty.svelte +33 -0
- package/dist/Empty.svelte.d.ts +13 -0
- package/dist/EmptyContent.svelte +33 -0
- package/dist/EmptyContent.svelte.d.ts +13 -0
- package/dist/EmptyDescription.svelte +33 -0
- package/dist/EmptyDescription.svelte.d.ts +13 -0
- package/dist/EmptyHeader.svelte +33 -0
- package/dist/EmptyHeader.svelte.d.ts +13 -0
- package/dist/EmptyTitle.svelte +33 -0
- package/dist/EmptyTitle.svelte.d.ts +13 -0
- package/dist/Field.svelte +33 -0
- package/dist/Field.svelte.d.ts +13 -0
- package/dist/FieldDescription.svelte +33 -0
- package/dist/FieldDescription.svelte.d.ts +13 -0
- package/dist/FieldError.svelte +33 -0
- package/dist/FieldError.svelte.d.ts +13 -0
- package/dist/FieldLabel.svelte +33 -0
- package/dist/FieldLabel.svelte.d.ts +13 -0
- package/dist/Input.svelte +31 -0
- package/dist/Input.svelte.d.ts +13 -0
- package/dist/InputGroup.svelte +33 -0
- package/dist/InputGroup.svelte.d.ts +13 -0
- package/dist/InputGroupAddon.svelte +33 -0
- package/dist/InputGroupAddon.svelte.d.ts +13 -0
- package/dist/Item.svelte +33 -0
- package/dist/Item.svelte.d.ts +13 -0
- package/dist/ItemActions.svelte +33 -0
- package/dist/ItemActions.svelte.d.ts +13 -0
- package/dist/ItemContent.svelte +33 -0
- package/dist/ItemContent.svelte.d.ts +13 -0
- package/dist/ItemDescription.svelte +33 -0
- package/dist/ItemDescription.svelte.d.ts +13 -0
- package/dist/ItemTitle.svelte +33 -0
- package/dist/ItemTitle.svelte.d.ts +13 -0
- package/dist/Kbd.svelte +33 -0
- package/dist/Kbd.svelte.d.ts +13 -0
- package/dist/Label.svelte +33 -0
- package/dist/Label.svelte.d.ts +13 -0
- package/dist/NativeSelect.svelte +33 -0
- package/dist/NativeSelect.svelte.d.ts +13 -0
- package/dist/Pagination.svelte +37 -0
- package/dist/Pagination.svelte.d.ts +9 -0
- package/dist/Popover.svelte +80 -0
- package/dist/Popover.svelte.d.ts +15 -0
- package/dist/PopoverRoot.svelte +20 -0
- package/dist/PopoverRoot.svelte.d.ts +8 -0
- package/dist/Progress.svelte +20 -0
- package/dist/Progress.svelte.d.ts +8 -0
- package/dist/RadioGroup.svelte +49 -0
- package/dist/RadioGroup.svelte.d.ts +14 -0
- package/dist/ScrollArea.svelte +33 -0
- package/dist/ScrollArea.svelte.d.ts +13 -0
- package/dist/Select.svelte +236 -0
- package/dist/Select.svelte.d.ts +20 -0
- package/dist/SelectRoot.svelte +20 -0
- package/dist/SelectRoot.svelte.d.ts +8 -0
- package/dist/Separator.svelte +31 -0
- package/dist/Separator.svelte.d.ts +13 -0
- package/dist/Sidebar.svelte +35 -0
- package/dist/Sidebar.svelte.d.ts +11 -0
- package/dist/SidebarContent.svelte +33 -0
- package/dist/SidebarContent.svelte.d.ts +13 -0
- package/dist/SidebarFooter.svelte +33 -0
- package/dist/SidebarFooter.svelte.d.ts +13 -0
- package/dist/SidebarGroup.svelte +33 -0
- package/dist/SidebarGroup.svelte.d.ts +13 -0
- package/dist/SidebarHeader.svelte +33 -0
- package/dist/SidebarHeader.svelte.d.ts +13 -0
- package/dist/SidebarItem.svelte +33 -0
- package/dist/SidebarItem.svelte.d.ts +13 -0
- package/dist/SidebarRoot.svelte +20 -0
- package/dist/SidebarRoot.svelte.d.ts +8 -0
- package/dist/Skeleton.svelte +33 -0
- package/dist/Skeleton.svelte.d.ts +13 -0
- package/dist/Slider.svelte +47 -0
- package/dist/Slider.svelte.d.ts +12 -0
- package/dist/Spinner.svelte +33 -0
- package/dist/Spinner.svelte.d.ts +13 -0
- package/dist/Switch.svelte +7 -0
- package/dist/Switch.svelte.d.ts +8 -0
- package/dist/Table.svelte +33 -0
- package/dist/Table.svelte.d.ts +13 -0
- package/dist/TableBody.svelte +33 -0
- package/dist/TableBody.svelte.d.ts +13 -0
- package/dist/TableCaption.svelte +33 -0
- package/dist/TableCaption.svelte.d.ts +13 -0
- package/dist/TableCell.svelte +33 -0
- package/dist/TableCell.svelte.d.ts +13 -0
- package/dist/TableFooter.svelte +33 -0
- package/dist/TableFooter.svelte.d.ts +13 -0
- package/dist/TableHead.svelte +33 -0
- package/dist/TableHead.svelte.d.ts +13 -0
- package/dist/TableHeader.svelte +33 -0
- package/dist/TableHeader.svelte.d.ts +13 -0
- package/dist/TableRow.svelte +33 -0
- package/dist/TableRow.svelte.d.ts +13 -0
- package/dist/Tabs.svelte +79 -0
- package/dist/Tabs.svelte.d.ts +17 -0
- package/dist/TabsRoot.svelte +20 -0
- package/dist/TabsRoot.svelte.d.ts +8 -0
- package/dist/Textarea.svelte +33 -0
- package/dist/Textarea.svelte.d.ts +13 -0
- package/dist/ThemeSwitcher.svelte +31 -0
- package/dist/ThemeSwitcher.svelte.d.ts +9 -0
- package/dist/Toast.svelte +52 -0
- package/dist/Toast.svelte.d.ts +8 -0
- package/dist/Toaster.svelte +23 -0
- package/dist/Toaster.svelte.d.ts +9 -0
- package/dist/Tooltip.svelte +54 -0
- package/dist/Tooltip.svelte.d.ts +11 -0
- package/dist/core.d.ts +145 -0
- package/dist/core.js +832 -0
- package/dist/index.d.ts +99 -0
- package/dist/index.js +98 -0
- package/package.json +46 -4
- package/README.md +0 -3
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
let {
|
|
4
|
+
open = $bindable(undefined),
|
|
5
|
+
defaultOpen = false,
|
|
6
|
+
onOpenChange,
|
|
7
|
+
trigger = 'Toggle',
|
|
8
|
+
children,
|
|
9
|
+
}: {
|
|
10
|
+
open?: boolean;
|
|
11
|
+
defaultOpen?: boolean;
|
|
12
|
+
onOpenChange?: (open: boolean) => void;
|
|
13
|
+
trigger?: string;
|
|
14
|
+
children?: Snippet;
|
|
15
|
+
} = $props();
|
|
16
|
+
const id = $props.id();
|
|
17
|
+
let internal = $state((() => defaultOpen)()),
|
|
18
|
+
current = $derived(open === undefined ? internal : open);
|
|
19
|
+
function set(next: boolean) {
|
|
20
|
+
if (open === undefined) internal = next;
|
|
21
|
+
else if (!onOpenChange) open = next;
|
|
22
|
+
onOpenChange?.(next);
|
|
23
|
+
}
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<div class="collapsible">
|
|
27
|
+
<button
|
|
28
|
+
type="button"
|
|
29
|
+
class="btn"
|
|
30
|
+
data-variant="ghost"
|
|
31
|
+
aria-expanded={current}
|
|
32
|
+
aria-controls={id}
|
|
33
|
+
onclick={() => set(!current)}>{trigger}</button
|
|
34
|
+
>
|
|
35
|
+
<div {id} hidden={!current}>{@render children?.()}</div>
|
|
36
|
+
</div>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
open?: boolean;
|
|
4
|
+
defaultOpen?: boolean;
|
|
5
|
+
onOpenChange?: (open: boolean) => void;
|
|
6
|
+
trigger?: string;
|
|
7
|
+
children?: Snippet;
|
|
8
|
+
};
|
|
9
|
+
declare const Collapsible: import("svelte").Component<$$ComponentProps, {}, "open">;
|
|
10
|
+
type Collapsible = ReturnType<typeof Collapsible>;
|
|
11
|
+
export default Collapsible;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
declare const Combobox: import("svelte").Component<{
|
|
2
|
+
options: readonly import("./core.js").Option[];
|
|
3
|
+
value?: string | string[];
|
|
4
|
+
defaultValue?: string | string[];
|
|
5
|
+
onValueChange?: (value: string | string[]) => void;
|
|
6
|
+
multiple?: boolean;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
required?: boolean;
|
|
9
|
+
name?: string;
|
|
10
|
+
label: string;
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
searchable?: boolean;
|
|
13
|
+
searchPlaceholder?: string;
|
|
14
|
+
emptyLabel?: string;
|
|
15
|
+
}, {}, "value">;
|
|
16
|
+
type Combobox = ReturnType<typeof Combobox>;
|
|
17
|
+
export default Combobox;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
4
|
+
import { attachWidget, cx } from './core.js';
|
|
5
|
+
let {
|
|
6
|
+
children,
|
|
7
|
+
class: className,
|
|
8
|
+
...rest
|
|
9
|
+
}: SvelteHTMLElements['div'] & { children?: Snippet } = $props();
|
|
10
|
+
let element: HTMLElement;
|
|
11
|
+
$effect(() => attachWidget(element));
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<div
|
|
15
|
+
{...rest}
|
|
16
|
+
bind:this={element}
|
|
17
|
+
class={cx('combobox', typeof className === 'string' ? className : undefined)}
|
|
18
|
+
>
|
|
19
|
+
{@render children?.()}
|
|
20
|
+
</div>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
3
|
+
type $$ComponentProps = SvelteHTMLElements['div'] & {
|
|
4
|
+
children?: Snippet;
|
|
5
|
+
};
|
|
6
|
+
declare const ComboboxRoot: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
7
|
+
type ComboboxRoot = ReturnType<typeof ComboboxRoot>;
|
|
8
|
+
export default ComboboxRoot;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { nextIndex, type MenuItem } from './core.js';
|
|
3
|
+
let {
|
|
4
|
+
items,
|
|
5
|
+
onSelect,
|
|
6
|
+
label = 'Commands',
|
|
7
|
+
placeholder = 'Search commands…',
|
|
8
|
+
emptyLabel = 'No results',
|
|
9
|
+
}: {
|
|
10
|
+
items: readonly MenuItem[];
|
|
11
|
+
onSelect?: (value: string) => void;
|
|
12
|
+
label?: string;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
emptyLabel?: string;
|
|
15
|
+
} = $props();
|
|
16
|
+
const id = $props.id();
|
|
17
|
+
let query = $state(''),
|
|
18
|
+
active = $state(0),
|
|
19
|
+
visible = $derived(
|
|
20
|
+
items.filter(
|
|
21
|
+
(item) =>
|
|
22
|
+
!item.separator && item.label.toLocaleLowerCase().includes(query.toLocaleLowerCase()),
|
|
23
|
+
),
|
|
24
|
+
);
|
|
25
|
+
function choose(index: number) {
|
|
26
|
+
const item = visible[index];
|
|
27
|
+
if (item && !item.disabled) {
|
|
28
|
+
item.onSelect?.();
|
|
29
|
+
onSelect?.(item.value);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<div class="command">
|
|
35
|
+
<header>
|
|
36
|
+
<input
|
|
37
|
+
class="input"
|
|
38
|
+
role="combobox"
|
|
39
|
+
aria-label={label}
|
|
40
|
+
aria-autocomplete="list"
|
|
41
|
+
aria-expanded="true"
|
|
42
|
+
aria-controls={id}
|
|
43
|
+
aria-activedescendant={visible[active] ? `${id}-${active}` : undefined}
|
|
44
|
+
value={query}
|
|
45
|
+
{placeholder}
|
|
46
|
+
oninput={(event) => {
|
|
47
|
+
query = event.currentTarget.value;
|
|
48
|
+
active = 0;
|
|
49
|
+
}}
|
|
50
|
+
onkeydown={(event) => {
|
|
51
|
+
if (['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) {
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
active = nextIndex(visible, active, event.key);
|
|
54
|
+
} else if (event.key === 'Enter') {
|
|
55
|
+
event.preventDefault();
|
|
56
|
+
choose(active);
|
|
57
|
+
}
|
|
58
|
+
}}
|
|
59
|
+
/>
|
|
60
|
+
</header>
|
|
61
|
+
<div {id} role="listbox" aria-label={label}>
|
|
62
|
+
{#each visible as item, index (item.value)}
|
|
63
|
+
<!-- svelte-ignore a11y_click_events_have_key_events a11y_no_noninteractive_element_interactions -->
|
|
64
|
+
<div
|
|
65
|
+
id={`${id}-${index}`}
|
|
66
|
+
role="option"
|
|
67
|
+
tabindex="-1"
|
|
68
|
+
aria-selected={active === index}
|
|
69
|
+
aria-disabled={item.disabled || undefined}
|
|
70
|
+
class:active={active === index}
|
|
71
|
+
onpointermove={() => {
|
|
72
|
+
if (!item.disabled) active = index;
|
|
73
|
+
}}
|
|
74
|
+
onclick={() => choose(index)}
|
|
75
|
+
>
|
|
76
|
+
{item.label}
|
|
77
|
+
</div>{/each}{#if !visible.length}<p role="status">{emptyLabel}</p>{/if}
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type MenuItem } from './core.js';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
items: readonly MenuItem[];
|
|
4
|
+
onSelect?: (value: string) => void;
|
|
5
|
+
label?: string;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
emptyLabel?: string;
|
|
8
|
+
};
|
|
9
|
+
declare const Command: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
10
|
+
type Command = ReturnType<typeof Command>;
|
|
11
|
+
export default Command;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
4
|
+
import { attachWidget, cx } from './core.js';
|
|
5
|
+
let {
|
|
6
|
+
children,
|
|
7
|
+
class: className,
|
|
8
|
+
...rest
|
|
9
|
+
}: SvelteHTMLElements['div'] & { children?: Snippet } = $props();
|
|
10
|
+
let element: HTMLElement;
|
|
11
|
+
$effect(() => attachWidget(element));
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<div
|
|
15
|
+
{...rest}
|
|
16
|
+
bind:this={element}
|
|
17
|
+
class={cx('command', typeof className === 'string' ? className : undefined)}
|
|
18
|
+
>
|
|
19
|
+
{@render children?.()}
|
|
20
|
+
</div>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
3
|
+
type $$ComponentProps = SvelteHTMLElements['div'] & {
|
|
4
|
+
children?: Snippet;
|
|
5
|
+
};
|
|
6
|
+
declare const CommandRoot: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
7
|
+
type CommandRoot = ReturnType<typeof CommandRoot>;
|
|
8
|
+
export default CommandRoot;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { tick } from 'svelte';
|
|
4
|
+
import { lockScroll, type Side } from './core.js';
|
|
5
|
+
type Props = {
|
|
6
|
+
open?: boolean;
|
|
7
|
+
defaultOpen?: boolean;
|
|
8
|
+
onOpenChange?: (open: boolean) => void;
|
|
9
|
+
trigger?: string;
|
|
10
|
+
title: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
footer?: Snippet;
|
|
14
|
+
closeOnOutside?: boolean;
|
|
15
|
+
closeOnEscape?: boolean;
|
|
16
|
+
closeLabel?: string;
|
|
17
|
+
kind?: 'dialog' | 'alert-dialog' | 'drawer';
|
|
18
|
+
side?: Side;
|
|
19
|
+
};
|
|
20
|
+
let {
|
|
21
|
+
open = $bindable(undefined),
|
|
22
|
+
defaultOpen = false,
|
|
23
|
+
onOpenChange,
|
|
24
|
+
trigger,
|
|
25
|
+
title,
|
|
26
|
+
description,
|
|
27
|
+
children,
|
|
28
|
+
footer,
|
|
29
|
+
closeOnOutside = true,
|
|
30
|
+
closeOnEscape = true,
|
|
31
|
+
closeLabel = 'Close',
|
|
32
|
+
kind = 'dialog',
|
|
33
|
+
side = 'right',
|
|
34
|
+
}: Props = $props();
|
|
35
|
+
const id = $props.id();
|
|
36
|
+
let internal = $state((() => defaultOpen)()),
|
|
37
|
+
current = $derived(open === undefined ? internal : open),
|
|
38
|
+
element: HTMLDialogElement;
|
|
39
|
+
function set(next: boolean) {
|
|
40
|
+
if (open === undefined) internal = next;
|
|
41
|
+
else if (!onOpenChange) open = next;
|
|
42
|
+
onOpenChange?.(next);
|
|
43
|
+
}
|
|
44
|
+
$effect(() => {
|
|
45
|
+
if (!current) {
|
|
46
|
+
if (element.open) element.close();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!element.open) element.showModal();
|
|
50
|
+
const unlock = lockScroll(element.ownerDocument);
|
|
51
|
+
return () => {
|
|
52
|
+
unlock();
|
|
53
|
+
if (element.open) element.close();
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
</script>
|
|
57
|
+
|
|
58
|
+
{#if trigger !== undefined}<button
|
|
59
|
+
type="button"
|
|
60
|
+
class="btn"
|
|
61
|
+
data-variant="outline"
|
|
62
|
+
onclick={() => set(true)}>{trigger}</button
|
|
63
|
+
>{/if}
|
|
64
|
+
<!-- svelte-ignore a11y_click_events_have_key_events a11y_no_noninteractive_element_interactions -->
|
|
65
|
+
<dialog
|
|
66
|
+
bind:this={element}
|
|
67
|
+
class={kind}
|
|
68
|
+
role={kind === 'alert-dialog' ? 'alertdialog' : undefined}
|
|
69
|
+
data-side={kind === 'drawer' ? side : undefined}
|
|
70
|
+
aria-labelledby={`${id}-title`}
|
|
71
|
+
aria-describedby={description ? `${id}-description` : undefined}
|
|
72
|
+
oncancel={(event) => {
|
|
73
|
+
event.preventDefault();
|
|
74
|
+
if (closeOnEscape) set(false);
|
|
75
|
+
}}
|
|
76
|
+
onclose={() => {
|
|
77
|
+
if (current) {
|
|
78
|
+
set(false);
|
|
79
|
+
void tick().then(() => {
|
|
80
|
+
if (current && element.isConnected && !element.open) element.showModal();
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}}
|
|
84
|
+
onclick={(event) => {
|
|
85
|
+
if (closeOnOutside && kind !== 'alert-dialog' && event.target === event.currentTarget)
|
|
86
|
+
set(false);
|
|
87
|
+
}}
|
|
88
|
+
>
|
|
89
|
+
<div class={kind === 'drawer' ? 'bc-drawer-surface' : 'bc-dialog-surface'}>
|
|
90
|
+
<header>
|
|
91
|
+
<h2 id={`${id}-title`}>{title}</h2>
|
|
92
|
+
{#if description}<p id={`${id}-description`}>{description}</p>{/if}
|
|
93
|
+
</header>
|
|
94
|
+
<section>{@render children?.()}</section>
|
|
95
|
+
{#if footer}<footer>{@render footer()}</footer>{/if}{#if kind !== 'alert-dialog'}<button
|
|
96
|
+
type="button"
|
|
97
|
+
class="btn"
|
|
98
|
+
data-variant="ghost"
|
|
99
|
+
data-size="icon-sm"
|
|
100
|
+
aria-label={closeLabel}
|
|
101
|
+
onclick={() => set(false)}>×</button
|
|
102
|
+
>{/if}
|
|
103
|
+
</div>
|
|
104
|
+
</dialog>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import { type Side } from './core.js';
|
|
3
|
+
type Props = {
|
|
4
|
+
open?: boolean;
|
|
5
|
+
defaultOpen?: boolean;
|
|
6
|
+
onOpenChange?: (open: boolean) => void;
|
|
7
|
+
trigger?: string;
|
|
8
|
+
title: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
children?: Snippet;
|
|
11
|
+
footer?: Snippet;
|
|
12
|
+
closeOnOutside?: boolean;
|
|
13
|
+
closeOnEscape?: boolean;
|
|
14
|
+
closeLabel?: string;
|
|
15
|
+
kind?: 'dialog' | 'alert-dialog' | 'drawer';
|
|
16
|
+
side?: Side;
|
|
17
|
+
};
|
|
18
|
+
declare const Dialog: import("svelte").Component<Props, {}, "open">;
|
|
19
|
+
type Dialog = ReturnType<typeof Dialog>;
|
|
20
|
+
export default Dialog;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
4
|
+
import { cx, type Variant, type Size } from './core.js';
|
|
5
|
+
type Props = Omit<SvelteHTMLElements['section'], 'children' | 'size'> & {
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
variant?: Variant;
|
|
8
|
+
size?: Size;
|
|
9
|
+
as?: keyof HTMLElementTagNameMap;
|
|
10
|
+
element?: HTMLElement | null;
|
|
11
|
+
};
|
|
12
|
+
let {
|
|
13
|
+
children,
|
|
14
|
+
variant,
|
|
15
|
+
size,
|
|
16
|
+
as = 'section',
|
|
17
|
+
element = $bindable(null),
|
|
18
|
+
class: className,
|
|
19
|
+
...rest
|
|
20
|
+
}: Props = $props();
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<svelte:element
|
|
24
|
+
this={as}
|
|
25
|
+
{...{}}
|
|
26
|
+
bind:this={element}
|
|
27
|
+
class={cx('', typeof className === 'string' ? className : undefined)}
|
|
28
|
+
data-variant={variant}
|
|
29
|
+
data-size={size}
|
|
30
|
+
{...rest}
|
|
31
|
+
>
|
|
32
|
+
{@render children?.()}
|
|
33
|
+
</svelte:element>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
3
|
+
import { type Variant, type Size } from './core.js';
|
|
4
|
+
type Props = Omit<SvelteHTMLElements['section'], 'children' | 'size'> & {
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
variant?: Variant;
|
|
7
|
+
size?: Size;
|
|
8
|
+
as?: keyof HTMLElementTagNameMap;
|
|
9
|
+
element?: HTMLElement | null;
|
|
10
|
+
};
|
|
11
|
+
declare const DialogContent: import("svelte").Component<Props, {}, "element">;
|
|
12
|
+
type DialogContent = ReturnType<typeof DialogContent>;
|
|
13
|
+
export default DialogContent;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
4
|
+
import { cx, type Variant, type Size } from './core.js';
|
|
5
|
+
type Props = Omit<SvelteHTMLElements['p'], 'children' | 'size'> & {
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
variant?: Variant;
|
|
8
|
+
size?: Size;
|
|
9
|
+
as?: keyof HTMLElementTagNameMap;
|
|
10
|
+
element?: HTMLElement | null;
|
|
11
|
+
};
|
|
12
|
+
let {
|
|
13
|
+
children,
|
|
14
|
+
variant,
|
|
15
|
+
size,
|
|
16
|
+
as = 'p',
|
|
17
|
+
element = $bindable(null),
|
|
18
|
+
class: className,
|
|
19
|
+
...rest
|
|
20
|
+
}: Props = $props();
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<svelte:element
|
|
24
|
+
this={as}
|
|
25
|
+
{...{}}
|
|
26
|
+
bind:this={element}
|
|
27
|
+
class={cx('', typeof className === 'string' ? className : undefined)}
|
|
28
|
+
data-variant={variant}
|
|
29
|
+
data-size={size}
|
|
30
|
+
{...rest}
|
|
31
|
+
>
|
|
32
|
+
{@render children?.()}
|
|
33
|
+
</svelte:element>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
3
|
+
import { type Variant, type Size } from './core.js';
|
|
4
|
+
type Props = Omit<SvelteHTMLElements['p'], 'children' | 'size'> & {
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
variant?: Variant;
|
|
7
|
+
size?: Size;
|
|
8
|
+
as?: keyof HTMLElementTagNameMap;
|
|
9
|
+
element?: HTMLElement | null;
|
|
10
|
+
};
|
|
11
|
+
declare const DialogDescription: import("svelte").Component<Props, {}, "element">;
|
|
12
|
+
type DialogDescription = ReturnType<typeof DialogDescription>;
|
|
13
|
+
export default DialogDescription;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
4
|
+
import { cx, type Variant, type Size } from './core.js';
|
|
5
|
+
type Props = Omit<SvelteHTMLElements['footer'], 'children' | 'size'> & {
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
variant?: Variant;
|
|
8
|
+
size?: Size;
|
|
9
|
+
as?: keyof HTMLElementTagNameMap;
|
|
10
|
+
element?: HTMLElement | null;
|
|
11
|
+
};
|
|
12
|
+
let {
|
|
13
|
+
children,
|
|
14
|
+
variant,
|
|
15
|
+
size,
|
|
16
|
+
as = 'footer',
|
|
17
|
+
element = $bindable(null),
|
|
18
|
+
class: className,
|
|
19
|
+
...rest
|
|
20
|
+
}: Props = $props();
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<svelte:element
|
|
24
|
+
this={as}
|
|
25
|
+
{...{}}
|
|
26
|
+
bind:this={element}
|
|
27
|
+
class={cx('', typeof className === 'string' ? className : undefined)}
|
|
28
|
+
data-variant={variant}
|
|
29
|
+
data-size={size}
|
|
30
|
+
{...rest}
|
|
31
|
+
>
|
|
32
|
+
{@render children?.()}
|
|
33
|
+
</svelte:element>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
3
|
+
import { type Variant, type Size } from './core.js';
|
|
4
|
+
type Props = Omit<SvelteHTMLElements['footer'], 'children' | 'size'> & {
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
variant?: Variant;
|
|
7
|
+
size?: Size;
|
|
8
|
+
as?: keyof HTMLElementTagNameMap;
|
|
9
|
+
element?: HTMLElement | null;
|
|
10
|
+
};
|
|
11
|
+
declare const DialogFooter: import("svelte").Component<Props, {}, "element">;
|
|
12
|
+
type DialogFooter = ReturnType<typeof DialogFooter>;
|
|
13
|
+
export default DialogFooter;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
4
|
+
import { cx, type Variant, type Size } from './core.js';
|
|
5
|
+
type Props = Omit<SvelteHTMLElements['header'], 'children' | 'size'> & {
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
variant?: Variant;
|
|
8
|
+
size?: Size;
|
|
9
|
+
as?: keyof HTMLElementTagNameMap;
|
|
10
|
+
element?: HTMLElement | null;
|
|
11
|
+
};
|
|
12
|
+
let {
|
|
13
|
+
children,
|
|
14
|
+
variant,
|
|
15
|
+
size,
|
|
16
|
+
as = 'header',
|
|
17
|
+
element = $bindable(null),
|
|
18
|
+
class: className,
|
|
19
|
+
...rest
|
|
20
|
+
}: Props = $props();
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<svelte:element
|
|
24
|
+
this={as}
|
|
25
|
+
{...{}}
|
|
26
|
+
bind:this={element}
|
|
27
|
+
class={cx('', typeof className === 'string' ? className : undefined)}
|
|
28
|
+
data-variant={variant}
|
|
29
|
+
data-size={size}
|
|
30
|
+
{...rest}
|
|
31
|
+
>
|
|
32
|
+
{@render children?.()}
|
|
33
|
+
</svelte:element>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
3
|
+
import { type Variant, type Size } from './core.js';
|
|
4
|
+
type Props = Omit<SvelteHTMLElements['header'], 'children' | 'size'> & {
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
variant?: Variant;
|
|
7
|
+
size?: Size;
|
|
8
|
+
as?: keyof HTMLElementTagNameMap;
|
|
9
|
+
element?: HTMLElement | null;
|
|
10
|
+
};
|
|
11
|
+
declare const DialogHeader: import("svelte").Component<Props, {}, "element">;
|
|
12
|
+
type DialogHeader = ReturnType<typeof DialogHeader>;
|
|
13
|
+
export default DialogHeader;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
4
|
+
import { attachWidget, cx } from './core.js';
|
|
5
|
+
let {
|
|
6
|
+
children,
|
|
7
|
+
class: className,
|
|
8
|
+
...rest
|
|
9
|
+
}: SvelteHTMLElements['dialog'] & { children?: Snippet } = $props();
|
|
10
|
+
let element: HTMLElement;
|
|
11
|
+
$effect(() => attachWidget(element));
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<dialog
|
|
15
|
+
{...rest}
|
|
16
|
+
bind:this={element}
|
|
17
|
+
class={cx('dialog', typeof className === 'string' ? className : undefined)}
|
|
18
|
+
>
|
|
19
|
+
{@render children?.()}
|
|
20
|
+
</dialog>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
3
|
+
type $$ComponentProps = SvelteHTMLElements['dialog'] & {
|
|
4
|
+
children?: Snippet;
|
|
5
|
+
};
|
|
6
|
+
declare const DialogRoot: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
7
|
+
type DialogRoot = ReturnType<typeof DialogRoot>;
|
|
8
|
+
export default DialogRoot;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
4
|
+
import { cx, type Variant, type Size } from './core.js';
|
|
5
|
+
type Props = Omit<SvelteHTMLElements['h2'], 'children' | 'size'> & {
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
variant?: Variant;
|
|
8
|
+
size?: Size;
|
|
9
|
+
as?: keyof HTMLElementTagNameMap;
|
|
10
|
+
element?: HTMLElement | null;
|
|
11
|
+
};
|
|
12
|
+
let {
|
|
13
|
+
children,
|
|
14
|
+
variant,
|
|
15
|
+
size,
|
|
16
|
+
as = 'h2',
|
|
17
|
+
element = $bindable(null),
|
|
18
|
+
class: className,
|
|
19
|
+
...rest
|
|
20
|
+
}: Props = $props();
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<svelte:element
|
|
24
|
+
this={as}
|
|
25
|
+
{...{}}
|
|
26
|
+
bind:this={element}
|
|
27
|
+
class={cx('', typeof className === 'string' ? className : undefined)}
|
|
28
|
+
data-variant={variant}
|
|
29
|
+
data-size={size}
|
|
30
|
+
{...rest}
|
|
31
|
+
>
|
|
32
|
+
{@render children?.()}
|
|
33
|
+
</svelte:element>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
3
|
+
import { type Variant, type Size } from './core.js';
|
|
4
|
+
type Props = Omit<SvelteHTMLElements['h2'], 'children' | 'size'> & {
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
variant?: Variant;
|
|
7
|
+
size?: Size;
|
|
8
|
+
as?: keyof HTMLElementTagNameMap;
|
|
9
|
+
element?: HTMLElement | null;
|
|
10
|
+
};
|
|
11
|
+
declare const DialogTitle: import("svelte").Component<Props, {}, "element">;
|
|
12
|
+
type DialogTitle = ReturnType<typeof DialogTitle>;
|
|
13
|
+
export default DialogTitle;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
declare const Drawer: import("svelte").Component<{
|
|
2
|
+
open?: boolean;
|
|
3
|
+
defaultOpen?: boolean;
|
|
4
|
+
onOpenChange?: (open: boolean) => void;
|
|
5
|
+
trigger?: string;
|
|
6
|
+
title: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
children?: import("svelte").Snippet;
|
|
9
|
+
footer?: import("svelte").Snippet;
|
|
10
|
+
closeOnOutside?: boolean;
|
|
11
|
+
closeOnEscape?: boolean;
|
|
12
|
+
closeLabel?: string;
|
|
13
|
+
kind?: "dialog" | "alert-dialog" | "drawer";
|
|
14
|
+
side?: import("./core.js").Side;
|
|
15
|
+
}, {}, "open">;
|
|
16
|
+
type Drawer = ReturnType<typeof Drawer>;
|
|
17
|
+
export default Drawer;
|