@sveltekitchen/sveltekitchen 0.0.0-stage → 1.0.1
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 +137 -2
- package/dist/components/Accordion.svelte +36 -0
- package/dist/components/Accordion.svelte.d.ts +15 -0
- package/dist/components/AccordionItem.svelte +73 -0
- package/dist/components/AccordionItem.svelte.d.ts +21 -0
- package/dist/components/Alert.svelte +23 -0
- package/dist/components/Alert.svelte.d.ts +15 -0
- package/dist/components/Badge.svelte +16 -0
- package/dist/components/Badge.svelte.d.ts +15 -0
- package/dist/components/Button.svelte +43 -0
- package/dist/components/Button.svelte.d.ts +25 -0
- package/dist/components/Calendar.svelte +88 -0
- package/dist/components/Calendar.svelte.d.ts +13 -0
- package/dist/components/Card.svelte +68 -0
- package/dist/components/Card.svelte.d.ts +25 -0
- package/dist/components/Chevron.svelte +36 -0
- package/dist/components/Chevron.svelte.d.ts +19 -0
- package/dist/components/Collapsible.svelte +46 -0
- package/dist/components/Collapsible.svelte.d.ts +19 -0
- package/dist/components/ConfirmDialog.svelte +70 -0
- package/dist/components/ConfirmDialog.svelte.d.ts +27 -0
- package/dist/components/DatePicker.svelte +60 -0
- package/dist/components/DatePicker.svelte.d.ts +17 -0
- package/dist/components/Divider.svelte +25 -0
- package/dist/components/Divider.svelte.d.ts +17 -0
- package/dist/components/Dropdown.svelte +100 -0
- package/dist/components/Dropdown.svelte.d.ts +21 -0
- package/dist/components/Form/Checkbox.svelte +37 -0
- package/dist/components/Form/Checkbox.svelte.d.ts +19 -0
- package/dist/components/Form/Field.svelte +28 -0
- package/dist/components/Form/Field.svelte.d.ts +21 -0
- package/dist/components/Form/Input.svelte +56 -0
- package/dist/components/Form/Input.svelte.d.ts +29 -0
- package/dist/components/Form/MaskedInput.svelte +152 -0
- package/dist/components/Form/MaskedInput.svelte.d.ts +25 -0
- package/dist/components/Form/Radio.svelte +28 -0
- package/dist/components/Form/Radio.svelte.d.ts +19 -0
- package/dist/components/Form/RadioGroup.svelte +28 -0
- package/dist/components/Form/RadioGroup.svelte.d.ts +19 -0
- package/dist/components/Form/Select.svelte +20 -0
- package/dist/components/Form/Select.svelte.d.ts +19 -0
- package/dist/components/Form/Textarea.svelte +30 -0
- package/dist/components/Form/Textarea.svelte.d.ts +25 -0
- package/dist/components/Form/Toggle.svelte +21 -0
- package/dist/components/Form/Toggle.svelte.d.ts +17 -0
- package/dist/components/Modal.svelte +77 -0
- package/dist/components/Modal.svelte.d.ts +27 -0
- package/dist/components/Pagination.svelte +77 -0
- package/dist/components/Pagination.svelte.d.ts +17 -0
- package/dist/components/Progress.svelte +34 -0
- package/dist/components/Progress.svelte.d.ts +21 -0
- package/dist/components/Spinner.svelte +24 -0
- package/dist/components/Spinner.svelte.d.ts +13 -0
- package/dist/components/Table.svelte +100 -0
- package/dist/components/Table.svelte.d.ts +21 -0
- package/dist/components/ThemeToggle.svelte +22 -0
- package/dist/components/ThemeToggle.svelte.d.ts +11 -0
- package/dist/components/Tooltip.svelte +45 -0
- package/dist/components/Tooltip.svelte.d.ts +15 -0
- package/dist/css/base/root.css +103 -0
- package/dist/css/base.css +47 -0
- package/dist/css/components/accordion.css +151 -0
- package/dist/css/components/alert.css +56 -0
- package/dist/css/components/badge.css +56 -0
- package/dist/css/components/button.css +171 -0
- package/dist/css/components/calendar.css +105 -0
- package/dist/css/components/card.css +128 -0
- package/dist/css/components/checkbox-radio.css +105 -0
- package/dist/css/components/collapsible.css +61 -0
- package/dist/css/components/divider.css +42 -0
- package/dist/css/components/dock-layout.css +111 -0
- package/dist/css/components/dropdown.css +68 -0
- package/dist/css/components/floating-shell.css +93 -0
- package/dist/css/components/form.css +286 -0
- package/dist/css/components/login.css +145 -0
- package/dist/css/components/modal.css +179 -0
- package/dist/css/components/nav.css +190 -0
- package/dist/css/components/nestable.css +187 -0
- package/dist/css/components/pagination.css +50 -0
- package/dist/css/components/progress.css +50 -0
- package/dist/css/components/sidebar.css +78 -0
- package/dist/css/components/spinner.css +36 -0
- package/dist/css/components/table.css +98 -0
- package/dist/css/components/tooltip.css +77 -0
- package/dist/css/components/topbar-layout.css +108 -0
- package/dist/css/icons/icons.css +52 -0
- package/dist/css/index.css +20 -0
- package/dist/css/layout/container.css +12 -0
- package/dist/css/layout/grid.css +40 -0
- package/dist/css/layout/shell.css +185 -0
- package/dist/css/overlay/default.css +27 -0
- package/dist/css/tokens/colors.css +81 -0
- package/dist/css/tokens/radius.css +8 -0
- package/dist/css/tokens/shadows.css +23 -0
- package/dist/css/tokens/spacing.css +30 -0
- package/dist/css/tokens/transitions.css +10 -0
- package/dist/css/tokens/typography.css +44 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +52 -0
- package/dist/layout/NavItem.svelte +84 -0
- package/dist/layout/NavItem.svelte.d.ts +25 -0
- package/dist/layout/Shell.svelte +7 -0
- package/dist/layout/Shell.svelte.d.ts +13 -0
- package/dist/layout/SidebarProfile.svelte +31 -0
- package/dist/layout/SidebarProfile.svelte.d.ts +19 -0
- package/dist/layouts/AppShell.svelte +60 -0
- package/dist/layouts/AppShell.svelte.d.ts +21 -0
- package/dist/layouts/BarLayout.svelte +60 -0
- package/dist/layouts/BarLayout.svelte.d.ts +21 -0
- package/dist/layouts/BottomBarLayout.svelte +23 -0
- package/dist/layouts/BottomBarLayout.svelte.d.ts +15 -0
- package/dist/layouts/DockLayout.svelte +81 -0
- package/dist/layouts/DockLayout.svelte.d.ts +15 -0
- package/dist/layouts/FloatingDockLayout.svelte +56 -0
- package/dist/layouts/FloatingDockLayout.svelte.d.ts +13 -0
- package/dist/layouts/FloatingLayout.svelte +80 -0
- package/dist/layouts/FloatingLayout.svelte.d.ts +19 -0
- package/dist/layouts/FloatingLeftLayout.svelte +59 -0
- package/dist/layouts/FloatingLeftLayout.svelte.d.ts +15 -0
- package/dist/layouts/FloatingShell.svelte +80 -0
- package/dist/layouts/FloatingShell.svelte.d.ts +19 -0
- package/dist/layouts/FloatingTopLayout.svelte +68 -0
- package/dist/layouts/FloatingTopLayout.svelte.d.ts +15 -0
- package/dist/layouts/HybridLayout.svelte +20 -0
- package/dist/layouts/HybridLayout.svelte.d.ts +17 -0
- package/dist/layouts/IconRailLayout.svelte +75 -0
- package/dist/layouts/IconRailLayout.svelte.d.ts +15 -0
- package/dist/layouts/LeftBarLayout.svelte +19 -0
- package/dist/layouts/LeftBarLayout.svelte.d.ts +15 -0
- package/dist/layouts/RightBarLayout.svelte +21 -0
- package/dist/layouts/RightBarLayout.svelte.d.ts +15 -0
- package/dist/layouts/SideBar.svelte +86 -0
- package/dist/layouts/SideBar.svelte.d.ts +17 -0
- package/dist/layouts/SidebarLayout.svelte +11 -0
- package/dist/layouts/SidebarLayout.svelte.d.ts +15 -0
- package/dist/layouts/TopBar.svelte +90 -0
- package/dist/layouts/TopBar.svelte.d.ts +21 -0
- package/dist/layouts/TopBarLayout.svelte +26 -0
- package/dist/layouts/TopBarLayout.svelte.d.ts +15 -0
- package/dist/theme/theme.svelte.d.ts +11 -0
- package/dist/theme/theme.svelte.js +48 -0
- package/package.json +56 -4
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
// Collapsible — a chevron + trigger row that shows/hides child content.
|
|
3
|
+
// Batteries-included version of Chevron: manages its own open state.
|
|
4
|
+
//
|
|
5
|
+
// <Collapsible title="Details">
|
|
6
|
+
// …content…
|
|
7
|
+
// </Collapsible>
|
|
8
|
+
let {
|
|
9
|
+
open = $bindable(false),
|
|
10
|
+
title = undefined, // simple text trigger
|
|
11
|
+
disabled = false,
|
|
12
|
+
trigger, // optional snippet(open) for custom trigger content
|
|
13
|
+
children,
|
|
14
|
+
...restProps
|
|
15
|
+
} = $props();
|
|
16
|
+
|
|
17
|
+
function toggle() {
|
|
18
|
+
if (disabled) return;
|
|
19
|
+
open = !open;
|
|
20
|
+
}
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<div class="collapsible" {...restProps}>
|
|
24
|
+
<button
|
|
25
|
+
type="button"
|
|
26
|
+
class="collapsible-trigger"
|
|
27
|
+
{disabled}
|
|
28
|
+
aria-expanded={open}
|
|
29
|
+
onclick={toggle}
|
|
30
|
+
>
|
|
31
|
+
<span class="chevron collapsible-chevron" class:expanded={open} aria-hidden="true">
|
|
32
|
+
<span class="material-symbols-outlined">chevron_right</span>
|
|
33
|
+
</span>
|
|
34
|
+
{#if trigger}
|
|
35
|
+
{@render trigger(open)}
|
|
36
|
+
{:else}
|
|
37
|
+
<span class="collapsible-title">{title}</span>
|
|
38
|
+
{/if}
|
|
39
|
+
</button>
|
|
40
|
+
|
|
41
|
+
{#if open}
|
|
42
|
+
<div class="collapsible-content">
|
|
43
|
+
{@render children?.()}
|
|
44
|
+
</div>
|
|
45
|
+
{/if}
|
|
46
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export default Collapsible;
|
|
2
|
+
type Collapsible = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const Collapsible: import("svelte").Component<{
|
|
7
|
+
open?: boolean;
|
|
8
|
+
title?: any;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
trigger: any;
|
|
11
|
+
children: any;
|
|
12
|
+
} & Record<string, any>, {}, "open">;
|
|
13
|
+
type $$ComponentProps = {
|
|
14
|
+
open?: boolean;
|
|
15
|
+
title?: any;
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
trigger: any;
|
|
18
|
+
children: any;
|
|
19
|
+
} & Record<string, any>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
let {
|
|
3
|
+
open = $bindable(false),
|
|
4
|
+
variant = 'danger',
|
|
5
|
+
title = 'Are you sure?',
|
|
6
|
+
message = '',
|
|
7
|
+
confirmLabel = 'Confirm',
|
|
8
|
+
cancelLabel = 'Cancel',
|
|
9
|
+
onconfirm = () => {},
|
|
10
|
+
oncancel = () => {},
|
|
11
|
+
children,
|
|
12
|
+
} = $props();
|
|
13
|
+
|
|
14
|
+
const icons = { danger: 'delete', warning: 'warning', info: 'info' };
|
|
15
|
+
|
|
16
|
+
let closing = $state(false);
|
|
17
|
+
|
|
18
|
+
function close() {
|
|
19
|
+
closing = true;
|
|
20
|
+
setTimeout(() => { closing = false; open = false; }, 200);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function confirm() {
|
|
24
|
+
onconfirm();
|
|
25
|
+
close();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function cancel() {
|
|
29
|
+
oncancel();
|
|
30
|
+
close();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let backdropClass = $derived(
|
|
34
|
+
['modal-backdrop', closing ? 'closing' : ''].filter(Boolean).join(' ')
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
let confirmClass = $derived(
|
|
38
|
+
['btn',
|
|
39
|
+
variant === 'danger' ? 'btn-danger' : '',
|
|
40
|
+
variant === 'warning' ? 'btn-primary' : '',
|
|
41
|
+
variant === 'info' ? 'btn-primary' : '',
|
|
42
|
+
].filter(Boolean).join(' ')
|
|
43
|
+
);
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
{#if open || closing}
|
|
47
|
+
<!-- svelte-ignore a11y_click_events_have_key_events a11y_no_static_element_interactions -->
|
|
48
|
+
<div class={backdropClass} onclick={cancel} role="dialog" aria-modal="true">
|
|
49
|
+
<!-- svelte-ignore a11y_click_events_have_key_events a11y_no_static_element_interactions -->
|
|
50
|
+
<div class="modal modal-sm modal-confirm" onclick={(e) => e.stopPropagation()}>
|
|
51
|
+
|
|
52
|
+
<div class="modal-body">
|
|
53
|
+
<div class="modal-confirm-icon modal-confirm-icon-{variant}">
|
|
54
|
+
<span class="material-symbols-outlined">{icons[variant]}</span>
|
|
55
|
+
</div>
|
|
56
|
+
<div>
|
|
57
|
+
<p class="modal-confirm-title">{title}</p>
|
|
58
|
+
{#if message}<p class="modal-confirm-message">{message}</p>{/if}
|
|
59
|
+
{@render children?.()}
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
<div class="modal-footer modal-footer-split">
|
|
64
|
+
<button class="btn btn-secondary" onclick={cancel}>{cancelLabel}</button>
|
|
65
|
+
<button class={confirmClass} onclick={confirm}>{confirmLabel}</button>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
{/if}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export default ConfirmDialog;
|
|
2
|
+
type ConfirmDialog = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const ConfirmDialog: import("svelte").Component<{
|
|
7
|
+
open?: boolean;
|
|
8
|
+
variant?: string;
|
|
9
|
+
title?: string;
|
|
10
|
+
message?: string;
|
|
11
|
+
confirmLabel?: string;
|
|
12
|
+
cancelLabel?: string;
|
|
13
|
+
onconfirm?: Function;
|
|
14
|
+
oncancel?: Function;
|
|
15
|
+
children: any;
|
|
16
|
+
}, {}, "open">;
|
|
17
|
+
type $$ComponentProps = {
|
|
18
|
+
open?: boolean;
|
|
19
|
+
variant?: string;
|
|
20
|
+
title?: string;
|
|
21
|
+
message?: string;
|
|
22
|
+
confirmLabel?: string;
|
|
23
|
+
cancelLabel?: string;
|
|
24
|
+
onconfirm?: Function;
|
|
25
|
+
oncancel?: Function;
|
|
26
|
+
children: any;
|
|
27
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import Calendar from './Calendar.svelte';
|
|
3
|
+
|
|
4
|
+
// DatePicker — a field that opens a Calendar popover to pick a date.
|
|
5
|
+
// Simple: no keyboard nav, no min/max, no time.
|
|
6
|
+
let {
|
|
7
|
+
value = $bindable(null), // JS Date or null
|
|
8
|
+
placeholder = 'Select a date',
|
|
9
|
+
disabled = false,
|
|
10
|
+
format = defaultFormat, // (date) => string
|
|
11
|
+
...restProps
|
|
12
|
+
} = $props();
|
|
13
|
+
|
|
14
|
+
let open = $state(false);
|
|
15
|
+
let root;
|
|
16
|
+
|
|
17
|
+
function defaultFormat(d) {
|
|
18
|
+
if (!d) return '';
|
|
19
|
+
return d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let display = $derived(value ? format(value) : '');
|
|
23
|
+
|
|
24
|
+
function toggle() { if (!disabled) open = !open; }
|
|
25
|
+
function onSelect() { open = false; }
|
|
26
|
+
|
|
27
|
+
$effect(() => {
|
|
28
|
+
if (!open) return;
|
|
29
|
+
function onDoc(e) { if (root && !root.contains(e.target)) open = false; }
|
|
30
|
+
function onKey(e) { if (e.key === 'Escape') open = false; }
|
|
31
|
+
document.addEventListener('pointerdown', onDoc);
|
|
32
|
+
document.addEventListener('keydown', onKey);
|
|
33
|
+
return () => {
|
|
34
|
+
document.removeEventListener('pointerdown', onDoc);
|
|
35
|
+
document.removeEventListener('keydown', onKey);
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<div class="datepicker" bind:this={root}>
|
|
41
|
+
<button
|
|
42
|
+
type="button"
|
|
43
|
+
class="input datepicker-trigger"
|
|
44
|
+
class:datepicker-placeholder={!value}
|
|
45
|
+
{disabled}
|
|
46
|
+
onclick={toggle}
|
|
47
|
+
aria-haspopup="dialog"
|
|
48
|
+
aria-expanded={open}
|
|
49
|
+
{...restProps}
|
|
50
|
+
>
|
|
51
|
+
<span class="material-symbols-outlined datepicker-icon">calendar_today</span>
|
|
52
|
+
<span class="datepicker-value">{display || placeholder}</span>
|
|
53
|
+
</button>
|
|
54
|
+
|
|
55
|
+
{#if open}
|
|
56
|
+
<div class="datepicker-popover">
|
|
57
|
+
<Calendar bind:value onselect={onSelect} />
|
|
58
|
+
</div>
|
|
59
|
+
{/if}
|
|
60
|
+
</div>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export default DatePicker;
|
|
2
|
+
type DatePicker = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const DatePicker: import("svelte").Component<{
|
|
7
|
+
value?: any;
|
|
8
|
+
placeholder?: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
format?: (d: any) => any;
|
|
11
|
+
} & Record<string, any>, {}, "value">;
|
|
12
|
+
type $$ComponentProps = {
|
|
13
|
+
value?: any;
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
format?: (d: any) => any;
|
|
17
|
+
} & Record<string, any>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
// Divider — a horizontal or vertical separator, optionally with a
|
|
3
|
+
// centered label. Uses the existing divider tokens.
|
|
4
|
+
let {
|
|
5
|
+
vertical = false,
|
|
6
|
+
strong = false,
|
|
7
|
+
label = undefined,
|
|
8
|
+
children,
|
|
9
|
+
...restProps
|
|
10
|
+
} = $props();
|
|
11
|
+
|
|
12
|
+
const hasLabel = $derived(!!(label || children));
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
{#if vertical}
|
|
16
|
+
<span class="divider-vertical" class:divider-strong={strong} role="separator" aria-orientation="vertical" {...restProps}></span>
|
|
17
|
+
{:else if hasLabel}
|
|
18
|
+
<div class="divider-labeled" role="separator" {...restProps}>
|
|
19
|
+
<span class="divider-line" class:divider-strong={strong}></span>
|
|
20
|
+
<span class="divider-text">{#if label}{label}{:else}{@render children?.()}{/if}</span>
|
|
21
|
+
<span class="divider-line" class:divider-strong={strong}></span>
|
|
22
|
+
</div>
|
|
23
|
+
{:else}
|
|
24
|
+
<hr class="divider" class:divider-strong={strong} {...restProps} />
|
|
25
|
+
{/if}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export default Divider;
|
|
2
|
+
type Divider = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const Divider: import("svelte").Component<{
|
|
7
|
+
vertical?: boolean;
|
|
8
|
+
strong?: boolean;
|
|
9
|
+
label?: any;
|
|
10
|
+
children: any;
|
|
11
|
+
} & Record<string, any>, {}, "">;
|
|
12
|
+
type $$ComponentProps = {
|
|
13
|
+
vertical?: boolean;
|
|
14
|
+
strong?: boolean;
|
|
15
|
+
label?: any;
|
|
16
|
+
children: any;
|
|
17
|
+
} & Record<string, any>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
// Dropdown — a menu of actions triggered by a button/element.
|
|
3
|
+
// Distinct from Select (which is a form field). Use for row actions,
|
|
4
|
+
// overflow "⋯" menus, etc.
|
|
5
|
+
//
|
|
6
|
+
// items: [{ label, icon?, onclick?, href?, danger?, disabled?, divider? }]
|
|
7
|
+
// Or use the `trigger` and `menu` snippets for full control.
|
|
8
|
+
|
|
9
|
+
let {
|
|
10
|
+
items = [],
|
|
11
|
+
align = 'start', // 'start' | 'end'
|
|
12
|
+
label = 'Options',
|
|
13
|
+
disabled = false,
|
|
14
|
+
trigger, // optional snippet(open) for a custom trigger
|
|
15
|
+
menu, // optional snippet(close) for custom menu content
|
|
16
|
+
...restProps
|
|
17
|
+
} = $props();
|
|
18
|
+
|
|
19
|
+
let open = $state(false);
|
|
20
|
+
let root;
|
|
21
|
+
|
|
22
|
+
function toggle() { if (!disabled) open = !open; }
|
|
23
|
+
function close() { open = false; }
|
|
24
|
+
|
|
25
|
+
function runItem(item) {
|
|
26
|
+
if (item.disabled) return;
|
|
27
|
+
close();
|
|
28
|
+
item.onclick?.();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
$effect(() => {
|
|
32
|
+
if (!open) return;
|
|
33
|
+
function onDoc(e) { if (root && !root.contains(e.target)) close(); }
|
|
34
|
+
function onKey(e) { if (e.key === 'Escape') close(); }
|
|
35
|
+
document.addEventListener('pointerdown', onDoc);
|
|
36
|
+
document.addEventListener('keydown', onKey);
|
|
37
|
+
return () => {
|
|
38
|
+
document.removeEventListener('pointerdown', onDoc);
|
|
39
|
+
document.removeEventListener('keydown', onKey);
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
<div class="dropdown" bind:this={root}>
|
|
45
|
+
{#if trigger}
|
|
46
|
+
<div class="dropdown-trigger-wrap" onclick={toggle} role="button" tabindex="0">
|
|
47
|
+
{@render trigger(open)}
|
|
48
|
+
</div>
|
|
49
|
+
{:else}
|
|
50
|
+
<button
|
|
51
|
+
type="button"
|
|
52
|
+
class="btn btn-secondary dropdown-trigger"
|
|
53
|
+
aria-haspopup="menu"
|
|
54
|
+
aria-expanded={open}
|
|
55
|
+
{disabled}
|
|
56
|
+
onclick={toggle}
|
|
57
|
+
{...restProps}
|
|
58
|
+
>
|
|
59
|
+
{label}
|
|
60
|
+
<span class="material-symbols-outlined dropdown-caret" class:open>expand_more</span>
|
|
61
|
+
</button>
|
|
62
|
+
{/if}
|
|
63
|
+
|
|
64
|
+
{#if open}
|
|
65
|
+
<div class="dropdown-menu" class:dropdown-menu-end={align === 'end'} role="menu">
|
|
66
|
+
{#if menu}
|
|
67
|
+
{@render menu(close)}
|
|
68
|
+
{:else}
|
|
69
|
+
{#each items as item}
|
|
70
|
+
{#if item.divider}
|
|
71
|
+
<div class="dropdown-divider"></div>
|
|
72
|
+
{:else if item.href}
|
|
73
|
+
<a
|
|
74
|
+
class="dropdown-item"
|
|
75
|
+
class:dropdown-item-danger={item.danger}
|
|
76
|
+
href={item.href}
|
|
77
|
+
role="menuitem"
|
|
78
|
+
onclick={close}
|
|
79
|
+
>
|
|
80
|
+
{#if item.icon}<span class="material-symbols-outlined">{item.icon}</span>{/if}
|
|
81
|
+
<span class="dropdown-item-label">{item.label}</span>
|
|
82
|
+
</a>
|
|
83
|
+
{:else}
|
|
84
|
+
<button
|
|
85
|
+
type="button"
|
|
86
|
+
class="dropdown-item"
|
|
87
|
+
class:dropdown-item-danger={item.danger}
|
|
88
|
+
disabled={item.disabled}
|
|
89
|
+
role="menuitem"
|
|
90
|
+
onclick={() => runItem(item)}
|
|
91
|
+
>
|
|
92
|
+
{#if item.icon}<span class="material-symbols-outlined">{item.icon}</span>{/if}
|
|
93
|
+
<span class="dropdown-item-label">{item.label}</span>
|
|
94
|
+
</button>
|
|
95
|
+
{/if}
|
|
96
|
+
{/each}
|
|
97
|
+
{/if}
|
|
98
|
+
</div>
|
|
99
|
+
{/if}
|
|
100
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export default Dropdown;
|
|
2
|
+
type Dropdown = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const Dropdown: import("svelte").Component<{
|
|
7
|
+
items?: any[];
|
|
8
|
+
align?: string;
|
|
9
|
+
label?: string;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
trigger: any;
|
|
12
|
+
menu: any;
|
|
13
|
+
} & Record<string, any>, {}, "">;
|
|
14
|
+
type $$ComponentProps = {
|
|
15
|
+
items?: any[];
|
|
16
|
+
align?: string;
|
|
17
|
+
label?: string;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
trigger: any;
|
|
20
|
+
menu: any;
|
|
21
|
+
} & Record<string, any>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
let {
|
|
3
|
+
checked = $bindable(false),
|
|
4
|
+
indeterminate = false,
|
|
5
|
+
label = undefined,
|
|
6
|
+
disabled = false,
|
|
7
|
+
children,
|
|
8
|
+
...restProps
|
|
9
|
+
} = $props();
|
|
10
|
+
|
|
11
|
+
let inputEl = $state();
|
|
12
|
+
|
|
13
|
+
// Reflect the indeterminate prop onto the DOM node (not an HTML attribute).
|
|
14
|
+
$effect(() => {
|
|
15
|
+
if (inputEl) inputEl.indeterminate = indeterminate;
|
|
16
|
+
});
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<label class="checkbox" class:checkbox-disabled={disabled}>
|
|
20
|
+
<input
|
|
21
|
+
bind:this={inputEl}
|
|
22
|
+
type="checkbox"
|
|
23
|
+
bind:checked
|
|
24
|
+
{disabled}
|
|
25
|
+
{...restProps}
|
|
26
|
+
/>
|
|
27
|
+
<span class="checkbox-box">
|
|
28
|
+
<span class="material-symbols-outlined checkbox-icon">
|
|
29
|
+
{indeterminate ? 'remove' : 'check'}
|
|
30
|
+
</span>
|
|
31
|
+
</span>
|
|
32
|
+
{#if label}
|
|
33
|
+
<span class="checkbox-label">{label}</span>
|
|
34
|
+
{:else if children}
|
|
35
|
+
<span class="checkbox-label">{@render children()}</span>
|
|
36
|
+
{/if}
|
|
37
|
+
</label>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export default Checkbox;
|
|
2
|
+
type Checkbox = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const Checkbox: import("svelte").Component<{
|
|
7
|
+
checked?: boolean;
|
|
8
|
+
indeterminate?: boolean;
|
|
9
|
+
label?: any;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
children: any;
|
|
12
|
+
} & Record<string, any>, {}, "checked">;
|
|
13
|
+
type $$ComponentProps = {
|
|
14
|
+
checked?: boolean;
|
|
15
|
+
indeterminate?: boolean;
|
|
16
|
+
label?: any;
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
children: any;
|
|
19
|
+
} & Record<string, any>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
let {
|
|
3
|
+
label = undefined,
|
|
4
|
+
required = false,
|
|
5
|
+
optional = false,
|
|
6
|
+
hint = undefined,
|
|
7
|
+
error = undefined,
|
|
8
|
+
children,
|
|
9
|
+
...restProps
|
|
10
|
+
} = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<div class="field" {...restProps}>
|
|
14
|
+
{#if label}
|
|
15
|
+
<label class="label" class:label-required={required} class:label-optional={optional}>
|
|
16
|
+
{label}
|
|
17
|
+
</label>
|
|
18
|
+
{/if}
|
|
19
|
+
{@render children?.()}
|
|
20
|
+
{#if error}
|
|
21
|
+
<span class="field-error">
|
|
22
|
+
<span class="material-symbols-outlined" style="font-size:0.9rem">error</span>
|
|
23
|
+
{error}
|
|
24
|
+
</span>
|
|
25
|
+
{:else if hint}
|
|
26
|
+
<span class="field-hint">{hint}</span>
|
|
27
|
+
{/if}
|
|
28
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export default Field;
|
|
2
|
+
type Field = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const Field: import("svelte").Component<{
|
|
7
|
+
label?: any;
|
|
8
|
+
required?: boolean;
|
|
9
|
+
optional?: boolean;
|
|
10
|
+
hint?: any;
|
|
11
|
+
error?: any;
|
|
12
|
+
children: any;
|
|
13
|
+
} & Record<string, any>, {}, "">;
|
|
14
|
+
type $$ComponentProps = {
|
|
15
|
+
label?: any;
|
|
16
|
+
required?: boolean;
|
|
17
|
+
optional?: boolean;
|
|
18
|
+
hint?: any;
|
|
19
|
+
error?: any;
|
|
20
|
+
children: any;
|
|
21
|
+
} & Record<string, any>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
let {
|
|
3
|
+
value = $bindable(''),
|
|
4
|
+
type = 'text',
|
|
5
|
+
placeholder = '',
|
|
6
|
+
disabled = false,
|
|
7
|
+
readonly = false,
|
|
8
|
+
error = false,
|
|
9
|
+
success = false,
|
|
10
|
+
iconLeft = undefined,
|
|
11
|
+
iconRight = undefined,
|
|
12
|
+
size = 'md',
|
|
13
|
+
...restProps
|
|
14
|
+
} = $props();
|
|
15
|
+
|
|
16
|
+
const sizeClass = { sm: 'input-sm', md: '', lg: 'input-lg' };
|
|
17
|
+
|
|
18
|
+
let inputClass = $derived([
|
|
19
|
+
'input',
|
|
20
|
+
sizeClass[size],
|
|
21
|
+
error ? 'input-error' : '',
|
|
22
|
+
success ? 'input-success' : '',
|
|
23
|
+
iconLeft ? 'input-has-icon-left' : '',
|
|
24
|
+
iconRight ? 'input-has-icon-right' : '',
|
|
25
|
+
].filter(Boolean).join(' '));
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
{#if iconLeft || iconRight}
|
|
29
|
+
<div class="input-wrapper">
|
|
30
|
+
{#if iconLeft}
|
|
31
|
+
<span class="material-symbols-outlined input-icon-left">{iconLeft}</span>
|
|
32
|
+
{/if}
|
|
33
|
+
<input
|
|
34
|
+
class={inputClass}
|
|
35
|
+
{type}
|
|
36
|
+
{placeholder}
|
|
37
|
+
{disabled}
|
|
38
|
+
{readonly}
|
|
39
|
+
bind:value
|
|
40
|
+
{...restProps}
|
|
41
|
+
/>
|
|
42
|
+
{#if iconRight}
|
|
43
|
+
<span class="material-symbols-outlined input-icon-right">{iconRight}</span>
|
|
44
|
+
{/if}
|
|
45
|
+
</div>
|
|
46
|
+
{:else}
|
|
47
|
+
<input
|
|
48
|
+
class={inputClass}
|
|
49
|
+
{type}
|
|
50
|
+
{placeholder}
|
|
51
|
+
{disabled}
|
|
52
|
+
{readonly}
|
|
53
|
+
bind:value
|
|
54
|
+
{...restProps}
|
|
55
|
+
/>
|
|
56
|
+
{/if}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export default Input;
|
|
2
|
+
type Input = {
|
|
3
|
+
$on?(type: string, callback: (e: any) => void): () => void;
|
|
4
|
+
$set?(props: Partial<$$ComponentProps>): void;
|
|
5
|
+
};
|
|
6
|
+
declare const Input: import("svelte").Component<{
|
|
7
|
+
value?: string;
|
|
8
|
+
type?: string;
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
readonly?: boolean;
|
|
12
|
+
error?: boolean;
|
|
13
|
+
success?: boolean;
|
|
14
|
+
iconLeft?: any;
|
|
15
|
+
iconRight?: any;
|
|
16
|
+
size?: string;
|
|
17
|
+
} & Record<string, any>, {}, "value">;
|
|
18
|
+
type $$ComponentProps = {
|
|
19
|
+
value?: string;
|
|
20
|
+
type?: string;
|
|
21
|
+
placeholder?: string;
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
readonly?: boolean;
|
|
24
|
+
error?: boolean;
|
|
25
|
+
success?: boolean;
|
|
26
|
+
iconLeft?: any;
|
|
27
|
+
iconRight?: any;
|
|
28
|
+
size?: string;
|
|
29
|
+
} & Record<string, any>;
|