@svelte-atoms/core 1.0.0-alpha.31 → 1.0.0-alpha.32
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/LICENSE +21 -0
- package/README.md +289 -853
- package/dist/attachments/index.d.ts +1 -0
- package/dist/attachments/index.js +1 -0
- package/dist/components/accordion/accordion-root.svelte +65 -65
- package/dist/components/accordion/accordion.stories.svelte +70 -70
- package/dist/components/accordion/item/accordion-item-body.svelte +44 -44
- package/dist/components/accordion/item/accordion-item-header.svelte +51 -51
- package/dist/components/accordion/item/accordion-item-indicator.svelte +51 -51
- package/dist/components/accordion/item/accordion-item-root.svelte +66 -66
- package/dist/components/alert/alert-close-button.svelte +66 -66
- package/dist/components/alert/alert-description.svelte +42 -42
- package/dist/components/alert/alert-root.svelte +68 -68
- package/dist/components/atom/html-atom.svelte +26 -194
- package/dist/components/atom/types.d.ts +3 -2
- package/dist/components/atom/utils.d.ts +37 -0
- package/dist/components/atom/utils.js +208 -0
- package/dist/components/breadcrumb/breadcrumb-item.svelte +1 -1
- package/dist/components/breadcrumb/breadcrumb-separator.svelte +5 -1
- package/dist/components/breadcrumb/breadcrumb.stories.svelte +16 -16
- package/dist/components/calendar/calendar-day.svelte +101 -101
- package/dist/components/checkbox/checkbox.svelte +159 -159
- package/dist/components/collapsible/bond.svelte.js +2 -1
- package/dist/components/collapsible/collapsible-body.svelte +3 -2
- package/dist/components/collapsible/motion.svelte.d.ts +6 -0
- package/dist/components/collapsible/motion.svelte.js +15 -0
- package/dist/components/combobox/atoms.d.ts +3 -3
- package/dist/components/combobox/atoms.js +3 -3
- package/dist/components/combobox/bond.svelte.d.ts +6 -6
- package/dist/components/combobox/bond.svelte.js +3 -26
- package/dist/components/combobox/combobox-control.svelte +52 -52
- package/dist/components/combobox/{compobox-item.svelte → combobox-item.svelte} +62 -68
- package/dist/components/combobox/combobox-item.svelte.d.ts +12 -0
- package/dist/components/combobox/combobox.stories.svelte +50 -0
- package/dist/components/combobox/combobox.stories.svelte.d.ts +3 -0
- package/dist/components/datagrid/tr/datagrid-tr.svelte +90 -90
- package/dist/components/date-picker/bond.svelte.d.ts +15 -5
- package/dist/components/date-picker/bond.svelte.js +5 -11
- package/dist/components/date-picker/date-picker-calendar.svelte +67 -67
- package/dist/components/dialog/bond.svelte.js +5 -20
- package/dist/components/dialog/dialog-content.svelte +44 -44
- package/dist/components/dialog/dialog-root.svelte +91 -91
- package/dist/components/drawer/bond.svelte.d.ts +18 -16
- package/dist/components/drawer/bond.svelte.js +8 -18
- package/dist/components/drawer/drawer-content.svelte +49 -49
- package/dist/components/drawer/drawer-root.svelte +5 -4
- package/dist/components/drawer/drawer.stories.svelte +141 -144
- package/dist/components/drawer/motion.js +1 -1
- package/dist/components/dropdown/atoms.d.ts +1 -1
- package/dist/components/dropdown/atoms.js +1 -1
- package/dist/components/dropdown/bond.svelte.d.ts +21 -22
- package/dist/components/dropdown/bond.svelte.js +29 -53
- package/dist/components/dropdown/dropdown-root.svelte +65 -59
- package/dist/components/dropdown/dropdown-values.svelte +17 -17
- package/dist/components/dropdown/dropdown-values.svelte.d.ts +1 -2
- package/dist/components/dropdown/dropdown.stories.svelte +83 -80
- package/dist/components/dropdown/index.d.ts +1 -0
- package/dist/components/dropdown/index.js +1 -0
- package/dist/components/dropdown/item/attachments.svelte.d.ts +2 -2
- package/dist/components/dropdown/item/attachments.svelte.js +2 -2
- package/dist/components/dropdown/item/controller.svelte.d.ts +34 -0
- package/dist/components/dropdown/item/controller.svelte.js +82 -0
- package/dist/components/dropdown/item/dropdown-item.svelte +109 -102
- package/dist/components/dropdown/item/dropdown-item.svelte.d.ts +13 -28
- package/dist/components/dropdown/item/index.d.ts +3 -0
- package/dist/components/dropdown/item/index.js +3 -0
- package/dist/components/dropdown/item/types.d.ts +29 -0
- package/dist/components/dropdown/item/types.js +1 -0
- package/dist/components/list/list-item.svelte +20 -20
- package/dist/components/menu/atoms.d.ts +8 -3
- package/dist/components/menu/atoms.js +8 -3
- package/dist/components/menu/bond.svelte.d.ts +54 -0
- package/dist/components/menu/bond.svelte.js +132 -0
- package/dist/components/menu/index.d.ts +1 -0
- package/dist/components/menu/index.js +1 -0
- package/dist/components/menu/item/controller.svelte.d.ts +26 -0
- package/dist/components/menu/item/controller.svelte.js +69 -0
- package/dist/components/menu/item/index.d.ts +2 -0
- package/dist/components/menu/item/index.js +2 -0
- package/dist/components/menu/item/menu-item.svelte +103 -0
- package/dist/components/menu/item/menu-item.svelte.d.ts +31 -0
- package/dist/components/menu/item/types.d.ts +62 -0
- package/dist/components/menu/item/types.js +1 -0
- package/dist/components/menu/{menu-list.svelte → menu-content.svelte} +40 -40
- package/dist/components/menu/{menu-list.svelte.d.ts → menu-content.svelte.d.ts} +3 -3
- package/dist/components/menu/menu-root.svelte +15 -0
- package/dist/components/menu/menu-root.svelte.d.ts +8 -0
- package/dist/components/menu/menu.stories.svelte +33 -33
- package/dist/components/menu/types.d.ts +0 -7
- package/dist/components/popover/bond.svelte.d.ts +11 -14
- package/dist/components/popover/bond.svelte.js +27 -44
- package/dist/components/popover/popover-content.svelte +137 -137
- package/dist/components/popover/popover.stories.svelte +37 -49
- package/dist/components/portal/active-portal.svelte +29 -29
- package/dist/components/portal/portal-root.svelte +76 -76
- package/dist/components/portal/teleport.svelte +49 -49
- package/dist/components/radio/radio.svelte +109 -109
- package/dist/components/root/index.d.ts +1 -0
- package/dist/components/root/index.js +1 -0
- package/dist/components/root/l0-portal.svelte +8 -0
- package/dist/components/root/l0-portal.svelte.d.ts +26 -0
- package/dist/components/root/l1-portal.svelte +7 -0
- package/dist/components/root/l1-portal.svelte.d.ts +26 -0
- package/dist/components/root/root.css +119 -119
- package/dist/components/root/root.svelte +17 -18
- package/dist/components/root/root.svelte.d.ts +2 -6
- package/dist/components/root/toasts-portal.svelte +7 -0
- package/dist/components/root/toasts-portal.svelte.d.ts +26 -0
- package/dist/components/root/types.d.ts +17 -0
- package/dist/components/sidebar/motion.svelte.js +3 -3
- package/dist/components/sidebar/sidebar-content.svelte +40 -40
- package/dist/components/textarea/textarea-input.svelte +9 -9
- package/dist/components/textarea/textarea-root.svelte +9 -9
- package/dist/components/tooltip/tooltip-trigger.svelte +39 -39
- package/dist/components/tree/index.d.ts +1 -0
- package/dist/components/tree/index.js +1 -0
- package/dist/components/tree/motion.svelte.d.ts +6 -0
- package/dist/components/tree/motion.svelte.js +14 -0
- package/dist/components/tree/tree-body.svelte +4 -3
- package/dist/context/preset.svelte.d.ts +3 -1
- package/dist/icons/icon-copy.svelte +6 -6
- package/dist/utils/dom.svelte.d.ts +2 -0
- package/dist/utils/dom.svelte.js +21 -0
- package/dist/utils/function.d.ts +1 -1
- package/dist/utils/promise.svelte.d.ts +5 -0
- package/dist/utils/promise.svelte.js +20 -0
- package/package.json +4 -2
- package/dist/components/combobox/compobox-item.svelte.d.ts +0 -34
- package/dist/components/combobox/compobox.stories.svelte +0 -51
- package/dist/components/combobox/compobox.stories.svelte.d.ts +0 -3
- package/dist/components/dropdown/item/bond.svelte.d.ts +0 -42
- package/dist/components/dropdown/item/bond.svelte.js +0 -99
- package/dist/components/menu/menu-item.svelte +0 -69
- package/dist/components/menu/menu-item.svelte.d.ts +0 -37
- package/dist/utils/markdown-to-llm.d.ts +0 -28
- package/dist/utils/markdown-to-llm.js +0 -76
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { Content } from '../popover/atoms';
|
|
3
|
-
import {
|
|
4
|
-
Root,
|
|
5
|
-
Header as CalendarHeader,
|
|
6
|
-
Body as CalendarBody,
|
|
7
|
-
Day as CalendarDay
|
|
8
|
-
} from '../calendar/atoms';
|
|
9
|
-
import { DatePickerBond } from './bond.svelte';
|
|
10
|
-
import DatePickerHeader from './date-picker-header.svelte';
|
|
11
|
-
import DatePickerMonths from './date-picker-months.svelte';
|
|
12
|
-
import DatePickerYears from './date-picker-years.svelte';
|
|
13
|
-
import { HtmlAtom } from '../atom';
|
|
14
|
-
import type { CalendarRange, Day as CalendarDayType } from '../calendar/types';
|
|
15
|
-
import type { DatePickerCalendarProps } from './types';
|
|
16
|
-
|
|
17
|
-
const datePickerBond = DatePickerBond.get();
|
|
18
|
-
const datePickerBondProps = $derived(datePickerBond?.state.props);
|
|
19
|
-
|
|
20
|
-
let {
|
|
21
|
-
class: klass = '',
|
|
22
|
-
preset = 'datepicker.calendar',
|
|
23
|
-
children: childrenProp,
|
|
24
|
-
Header = DatePickerHeader,
|
|
25
|
-
Weekdays = CalendarHeader,
|
|
26
|
-
Body = CalendarBody,
|
|
27
|
-
Day = CalendarDay,
|
|
28
|
-
Months = DatePickerMonths,
|
|
29
|
-
Years = DatePickerYears,
|
|
30
|
-
...restProps
|
|
31
|
-
}: DatePickerCalendarProps = $props();
|
|
32
|
-
|
|
33
|
-
const calendarProps = $derived({
|
|
34
|
-
...datePickerBond?.content(),
|
|
35
|
-
...datePickerBondProps,
|
|
36
|
-
...restProps
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
function handleChange(_: CustomEvent, { range, pivote }: { range: CalendarRange; pivote: Date }) {
|
|
40
|
-
if (!datePickerBond) return;
|
|
41
|
-
|
|
42
|
-
datePickerBond.state.props.range = range;
|
|
43
|
-
datePickerBond.state.props.pivote = pivote;
|
|
44
|
-
}
|
|
45
|
-
</script>
|
|
46
|
-
|
|
47
|
-
<Content
|
|
48
|
-
class={['relative overflow-hidden p-0', klass]}
|
|
49
|
-
base={Root}
|
|
50
|
-
onchange={handleChange}
|
|
51
|
-
{preset}
|
|
52
|
-
{...calendarProps}
|
|
53
|
-
>
|
|
54
|
-
<HtmlAtom base={Header} class="col-span-full" />
|
|
55
|
-
<HtmlAtom base={Weekdays} class="border-0" />
|
|
56
|
-
|
|
57
|
-
<HtmlAtom base={Body}>
|
|
58
|
-
{#snippet children({ day }: { day: CalendarDayType })}
|
|
59
|
-
<HtmlAtom base={Day} {day} class="flex items-center justify-center border-0">
|
|
60
|
-
<span class="value">{day.dayOfMonth}</span>
|
|
61
|
-
</HtmlAtom>
|
|
62
|
-
{/snippet}
|
|
63
|
-
</HtmlAtom>
|
|
64
|
-
|
|
65
|
-
<HtmlAtom base={Months} />
|
|
66
|
-
<HtmlAtom base={Years} />
|
|
67
|
-
</Content>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Content } from '../popover/atoms';
|
|
3
|
+
import {
|
|
4
|
+
Root,
|
|
5
|
+
Header as CalendarHeader,
|
|
6
|
+
Body as CalendarBody,
|
|
7
|
+
Day as CalendarDay
|
|
8
|
+
} from '../calendar/atoms';
|
|
9
|
+
import { DatePickerBond } from './bond.svelte';
|
|
10
|
+
import DatePickerHeader from './date-picker-header.svelte';
|
|
11
|
+
import DatePickerMonths from './date-picker-months.svelte';
|
|
12
|
+
import DatePickerYears from './date-picker-years.svelte';
|
|
13
|
+
import { HtmlAtom } from '../atom';
|
|
14
|
+
import type { CalendarRange, Day as CalendarDayType } from '../calendar/types';
|
|
15
|
+
import type { DatePickerCalendarProps } from './types';
|
|
16
|
+
|
|
17
|
+
const datePickerBond = DatePickerBond.get();
|
|
18
|
+
const datePickerBondProps = $derived(datePickerBond?.state.props);
|
|
19
|
+
|
|
20
|
+
let {
|
|
21
|
+
class: klass = '',
|
|
22
|
+
preset = 'datepicker.calendar',
|
|
23
|
+
children: childrenProp,
|
|
24
|
+
Header = DatePickerHeader,
|
|
25
|
+
Weekdays = CalendarHeader,
|
|
26
|
+
Body = CalendarBody,
|
|
27
|
+
Day = CalendarDay,
|
|
28
|
+
Months = DatePickerMonths,
|
|
29
|
+
Years = DatePickerYears,
|
|
30
|
+
...restProps
|
|
31
|
+
}: DatePickerCalendarProps = $props();
|
|
32
|
+
|
|
33
|
+
const calendarProps = $derived({
|
|
34
|
+
...datePickerBond?.content(),
|
|
35
|
+
...datePickerBondProps,
|
|
36
|
+
...restProps
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
function handleChange(_: CustomEvent, { range, pivote }: { range: CalendarRange; pivote: Date }) {
|
|
40
|
+
if (!datePickerBond) return;
|
|
41
|
+
|
|
42
|
+
datePickerBond.state.props.range = range;
|
|
43
|
+
datePickerBond.state.props.pivote = pivote;
|
|
44
|
+
}
|
|
45
|
+
</script>
|
|
46
|
+
|
|
47
|
+
<Content
|
|
48
|
+
class={['relative overflow-hidden p-0', klass]}
|
|
49
|
+
base={Root}
|
|
50
|
+
onchange={handleChange}
|
|
51
|
+
{preset}
|
|
52
|
+
{...calendarProps}
|
|
53
|
+
>
|
|
54
|
+
<HtmlAtom base={Header} class="col-span-full" />
|
|
55
|
+
<HtmlAtom base={Weekdays} class="border-0" />
|
|
56
|
+
|
|
57
|
+
<HtmlAtom base={Body}>
|
|
58
|
+
{#snippet children({ day }: { day: CalendarDayType })}
|
|
59
|
+
<HtmlAtom base={Day} {day} class="flex items-center justify-center border-0">
|
|
60
|
+
<span class="value">{day.dayOfMonth}</span>
|
|
61
|
+
</HtmlAtom>
|
|
62
|
+
{/snippet}
|
|
63
|
+
</HtmlAtom>
|
|
64
|
+
|
|
65
|
+
<HtmlAtom base={Months} />
|
|
66
|
+
<HtmlAtom base={Years} />
|
|
67
|
+
</Content>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createAttachmentKey } from 'svelte/attachments';
|
|
2
2
|
import { getContext, setContext } from 'svelte';
|
|
3
|
-
import { getElementId } from '../../utils/dom.svelte';
|
|
3
|
+
import { focusTrap, getElementId } from '../../utils/dom.svelte';
|
|
4
4
|
import { Bond, BondState } from '../../shared/bond.svelte';
|
|
5
5
|
const DIALOG_ELEMENTS_KIND = {
|
|
6
6
|
root: 'dialog-root',
|
|
@@ -26,23 +26,8 @@ export class DialogBond extends Bond {
|
|
|
26
26
|
const isOpen = this.state.props.open ?? false;
|
|
27
27
|
const isDisabled = this.state.props.disabled ?? false;
|
|
28
28
|
// Focus trap handler
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
if (ev.key === 'Tab') {
|
|
32
|
-
const focusableElements = node.querySelectorAll('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])');
|
|
33
|
-
const firstElement = focusableElements[0];
|
|
34
|
-
const lastElement = focusableElements[focusableElements.length - 1];
|
|
35
|
-
if (focusableElements.length === 0)
|
|
36
|
-
return;
|
|
37
|
-
if (ev.shiftKey && document.activeElement === firstElement) {
|
|
38
|
-
ev.preventDefault();
|
|
39
|
-
lastElement?.focus();
|
|
40
|
-
}
|
|
41
|
-
else if (!ev.shiftKey && document.activeElement === lastElement) {
|
|
42
|
-
ev.preventDefault();
|
|
43
|
-
firstElement?.focus();
|
|
44
|
-
}
|
|
45
|
-
}
|
|
29
|
+
const focusManager = (ev) => {
|
|
30
|
+
focusTrap(ev);
|
|
46
31
|
};
|
|
47
32
|
let previousActiveElement = null;
|
|
48
33
|
return {
|
|
@@ -61,12 +46,12 @@ export class DialogBond extends Bond {
|
|
|
61
46
|
}
|
|
62
47
|
},
|
|
63
48
|
onkeydown: (ev) => {
|
|
64
|
-
focusTrap(ev);
|
|
65
49
|
// Close on Escape key
|
|
66
|
-
if (ev.key === 'Escape'
|
|
50
|
+
if (ev.key === 'Escape') {
|
|
67
51
|
ev.preventDefault();
|
|
68
52
|
this.state.close();
|
|
69
53
|
}
|
|
54
|
+
focusManager(ev);
|
|
70
55
|
},
|
|
71
56
|
[createAttachmentKey()]: (node) => {
|
|
72
57
|
this.elements.root = node;
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
<script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
|
|
2
|
-
import { HtmlAtom, type Base } from '../atom';
|
|
3
|
-
import { DialogBond } from './bond.svelte';
|
|
4
|
-
import type { DialogContentProps } from './types';
|
|
5
|
-
import { animateDialogContent } from './motion.svelte';
|
|
6
|
-
|
|
7
|
-
const bond = DialogBond.get();
|
|
8
|
-
|
|
9
|
-
let {
|
|
10
|
-
class: klass = '',
|
|
11
|
-
children = undefined,
|
|
12
|
-
onmount = undefined,
|
|
13
|
-
ondestroy = undefined,
|
|
14
|
-
animate = animateDialogContent(),
|
|
15
|
-
enter = undefined,
|
|
16
|
-
exit = undefined,
|
|
17
|
-
initial = undefined,
|
|
18
|
-
...restProps
|
|
19
|
-
}: DialogContentProps<E, B> = $props();
|
|
20
|
-
|
|
21
|
-
const dialogProps = $derived({
|
|
22
|
-
...bond?.content({}),
|
|
23
|
-
...restProps
|
|
24
|
-
});
|
|
25
|
-
</script>
|
|
26
|
-
|
|
27
|
-
<HtmlAtom
|
|
28
|
-
preset="dialog.content"
|
|
29
|
-
class={[
|
|
30
|
-
'bg-card text-foreground border-border flex h-fit w-full max-w-[90svw] flex-col rounded-md border py-4 shadow-sm',
|
|
31
|
-
'$preset',
|
|
32
|
-
klass
|
|
33
|
-
]}
|
|
34
|
-
{bond}
|
|
35
|
-
enter={enter?.bind(bond.state)}
|
|
36
|
-
exit={exit?.bind(bond.state)}
|
|
37
|
-
initial={initial?.bind(bond.state)}
|
|
38
|
-
animate={animate?.bind(bond.state)}
|
|
39
|
-
onmount={onmount?.bind(bond.state)}
|
|
40
|
-
ondestroy={ondestroy?.bind(bond.state)}
|
|
41
|
-
{...dialogProps}
|
|
42
|
-
>
|
|
43
|
-
{@render children?.({ dialog: bond })}
|
|
44
|
-
</HtmlAtom>
|
|
1
|
+
<script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
|
|
2
|
+
import { HtmlAtom, type Base } from '../atom';
|
|
3
|
+
import { DialogBond } from './bond.svelte';
|
|
4
|
+
import type { DialogContentProps } from './types';
|
|
5
|
+
import { animateDialogContent } from './motion.svelte';
|
|
6
|
+
|
|
7
|
+
const bond = DialogBond.get();
|
|
8
|
+
|
|
9
|
+
let {
|
|
10
|
+
class: klass = '',
|
|
11
|
+
children = undefined,
|
|
12
|
+
onmount = undefined,
|
|
13
|
+
ondestroy = undefined,
|
|
14
|
+
animate = animateDialogContent(),
|
|
15
|
+
enter = undefined,
|
|
16
|
+
exit = undefined,
|
|
17
|
+
initial = undefined,
|
|
18
|
+
...restProps
|
|
19
|
+
}: DialogContentProps<E, B> = $props();
|
|
20
|
+
|
|
21
|
+
const dialogProps = $derived({
|
|
22
|
+
...bond?.content({}),
|
|
23
|
+
...restProps
|
|
24
|
+
});
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<HtmlAtom
|
|
28
|
+
preset="dialog.content"
|
|
29
|
+
class={[
|
|
30
|
+
'bg-card text-foreground border-border flex h-fit w-full max-w-[90svw] flex-col rounded-md border py-4 shadow-sm',
|
|
31
|
+
'$preset',
|
|
32
|
+
klass
|
|
33
|
+
]}
|
|
34
|
+
{bond}
|
|
35
|
+
enter={enter?.bind(bond.state)}
|
|
36
|
+
exit={exit?.bind(bond.state)}
|
|
37
|
+
initial={initial?.bind(bond.state)}
|
|
38
|
+
animate={animate?.bind(bond.state)}
|
|
39
|
+
onmount={onmount?.bind(bond.state)}
|
|
40
|
+
ondestroy={ondestroy?.bind(bond.state)}
|
|
41
|
+
{...dialogProps}
|
|
42
|
+
>
|
|
43
|
+
{@render children?.({ dialog: bond })}
|
|
44
|
+
</HtmlAtom>
|
|
@@ -1,91 +1,91 @@
|
|
|
1
|
-
<script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
|
|
2
|
-
import { Teleport, ActivePortal } from '../portal';
|
|
3
|
-
import { defineProperty, defineState } from '../../utils';
|
|
4
|
-
import type { Base } from '../atom';
|
|
5
|
-
import { DialogBond, DialogBondState, type DialogBondProps } from './bond.svelte';
|
|
6
|
-
import type { DialogProps } from './types';
|
|
7
|
-
import { animateDialogRoot } from './motion.svelte';
|
|
8
|
-
|
|
9
|
-
let {
|
|
10
|
-
class: klass = '',
|
|
11
|
-
open = $bindable(false),
|
|
12
|
-
disabled = false,
|
|
13
|
-
as = 'dialog' as E,
|
|
14
|
-
portal = undefined,
|
|
15
|
-
factory = _factory,
|
|
16
|
-
onmount = undefined,
|
|
17
|
-
ondestroy = undefined,
|
|
18
|
-
animate = animateDialogRoot(),
|
|
19
|
-
enter = undefined,
|
|
20
|
-
exit = undefined,
|
|
21
|
-
initial = undefined,
|
|
22
|
-
children = undefined,
|
|
23
|
-
...restProps
|
|
24
|
-
}: DialogProps<E, B> = $props();
|
|
25
|
-
|
|
26
|
-
const bondProps = defineState<DialogBondProps>(
|
|
27
|
-
[
|
|
28
|
-
defineProperty(
|
|
29
|
-
'open',
|
|
30
|
-
() => open,
|
|
31
|
-
(v) => {
|
|
32
|
-
open = v;
|
|
33
|
-
}
|
|
34
|
-
)
|
|
35
|
-
],
|
|
36
|
-
() => ({ disabled })
|
|
37
|
-
);
|
|
38
|
-
const bond = _factory(bondProps).share();
|
|
39
|
-
|
|
40
|
-
const rootProps = $derived({
|
|
41
|
-
...bond?.root(),
|
|
42
|
-
...restProps
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
function _factory(props: typeof bondProps) {
|
|
46
|
-
const bondState = new DialogBondState(() => props);
|
|
47
|
-
return new DialogBond(bondState);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function onclickDialogElement(ev: MouseEvent) {
|
|
51
|
-
if (bond?.elements?.content?.contains(ev.target)) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Clicked the backdrop
|
|
56
|
-
bond.state.close();
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function getBond() {
|
|
60
|
-
return bond;
|
|
61
|
-
}
|
|
62
|
-
</script>
|
|
63
|
-
|
|
64
|
-
<Teleport
|
|
65
|
-
{as}
|
|
66
|
-
{bond}
|
|
67
|
-
preset="dialog"
|
|
68
|
-
portal={portal ?? 'root.l1'}
|
|
69
|
-
class={[
|
|
70
|
-
'border-border pointer-events-auto fixed top-0 left-0 flex h-full w-full items-center justify-center bg-neutral-900/10 opacity-0',
|
|
71
|
-
!open && 'pointer-events-none',
|
|
72
|
-
'$preset',
|
|
73
|
-
klass
|
|
74
|
-
]}
|
|
75
|
-
enter={enter?.bind(bond.state)}
|
|
76
|
-
exit={exit?.bind(bond.state)}
|
|
77
|
-
initial={initial?.bind(bond.state)}
|
|
78
|
-
animate={animate?.bind(bond.state)}
|
|
79
|
-
onmount={onmount?.bind(bond.state)}
|
|
80
|
-
ondestroy={ondestroy?.bind(bond.state)}
|
|
81
|
-
onclick={onclickDialogElement}
|
|
82
|
-
oncancel={(ev) => {
|
|
83
|
-
ev.preventDefault();
|
|
84
|
-
open = false;
|
|
85
|
-
}}
|
|
86
|
-
{...rootProps}
|
|
87
|
-
>
|
|
88
|
-
<ActivePortal portal={portal ?? 'root.l1'}>
|
|
89
|
-
{@render children?.({ dialog: bond })}
|
|
90
|
-
</ActivePortal>
|
|
91
|
-
</Teleport>
|
|
1
|
+
<script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
|
|
2
|
+
import { Teleport, ActivePortal } from '../portal';
|
|
3
|
+
import { defineProperty, defineState } from '../../utils';
|
|
4
|
+
import type { Base } from '../atom';
|
|
5
|
+
import { DialogBond, DialogBondState, type DialogBondProps } from './bond.svelte';
|
|
6
|
+
import type { DialogProps } from './types';
|
|
7
|
+
import { animateDialogRoot } from './motion.svelte';
|
|
8
|
+
|
|
9
|
+
let {
|
|
10
|
+
class: klass = '',
|
|
11
|
+
open = $bindable(false),
|
|
12
|
+
disabled = false,
|
|
13
|
+
as = 'dialog' as E,
|
|
14
|
+
portal = undefined,
|
|
15
|
+
factory = _factory,
|
|
16
|
+
onmount = undefined,
|
|
17
|
+
ondestroy = undefined,
|
|
18
|
+
animate = animateDialogRoot(),
|
|
19
|
+
enter = undefined,
|
|
20
|
+
exit = undefined,
|
|
21
|
+
initial = undefined,
|
|
22
|
+
children = undefined,
|
|
23
|
+
...restProps
|
|
24
|
+
}: DialogProps<E, B> = $props();
|
|
25
|
+
|
|
26
|
+
const bondProps = defineState<DialogBondProps>(
|
|
27
|
+
[
|
|
28
|
+
defineProperty(
|
|
29
|
+
'open',
|
|
30
|
+
() => open,
|
|
31
|
+
(v) => {
|
|
32
|
+
open = v;
|
|
33
|
+
}
|
|
34
|
+
)
|
|
35
|
+
],
|
|
36
|
+
() => ({ disabled })
|
|
37
|
+
);
|
|
38
|
+
const bond = _factory(bondProps).share();
|
|
39
|
+
|
|
40
|
+
const rootProps = $derived({
|
|
41
|
+
...bond?.root(),
|
|
42
|
+
...restProps
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
function _factory(props: typeof bondProps) {
|
|
46
|
+
const bondState = new DialogBondState(() => props);
|
|
47
|
+
return new DialogBond(bondState);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function onclickDialogElement(ev: MouseEvent) {
|
|
51
|
+
if (bond?.elements?.content?.contains(ev.target)) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Clicked the backdrop
|
|
56
|
+
bond.state.close();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function getBond() {
|
|
60
|
+
return bond;
|
|
61
|
+
}
|
|
62
|
+
</script>
|
|
63
|
+
|
|
64
|
+
<Teleport
|
|
65
|
+
{as}
|
|
66
|
+
{bond}
|
|
67
|
+
preset="dialog"
|
|
68
|
+
portal={portal ?? 'root.l1'}
|
|
69
|
+
class={[
|
|
70
|
+
'border-border pointer-events-auto fixed top-0 left-0 flex h-full w-full items-center justify-center bg-neutral-900/10 opacity-0',
|
|
71
|
+
!open && 'pointer-events-none',
|
|
72
|
+
'$preset',
|
|
73
|
+
klass
|
|
74
|
+
]}
|
|
75
|
+
enter={enter?.bind(bond.state)}
|
|
76
|
+
exit={exit?.bind(bond.state)}
|
|
77
|
+
initial={initial?.bind(bond.state)}
|
|
78
|
+
animate={animate?.bind(bond.state)}
|
|
79
|
+
onmount={onmount?.bind(bond.state)}
|
|
80
|
+
ondestroy={ondestroy?.bind(bond.state)}
|
|
81
|
+
onclick={onclickDialogElement}
|
|
82
|
+
oncancel={(ev) => {
|
|
83
|
+
ev.preventDefault();
|
|
84
|
+
open = false;
|
|
85
|
+
}}
|
|
86
|
+
{...rootProps}
|
|
87
|
+
>
|
|
88
|
+
<ActivePortal portal={portal ?? 'root.l1'}>
|
|
89
|
+
{@render children?.({ dialog: bond })}
|
|
90
|
+
</ActivePortal>
|
|
91
|
+
</Teleport>
|
|
@@ -18,12 +18,8 @@ export type DrawerBondElements = {
|
|
|
18
18
|
export declare class DrawerBond<Props extends DrawerBondProps = DrawerBondProps, State extends DrawerBondState<Props> = DrawerBondState<Props>> extends Bond<Props, State, DrawerBondElements> {
|
|
19
19
|
static CONTEXT_KEY: string;
|
|
20
20
|
constructor(state: State);
|
|
21
|
-
root(
|
|
22
|
-
|
|
23
|
-
onkeydown?: (ev: KeyboardEvent) => void;
|
|
24
|
-
}): {
|
|
25
|
-
onclick?: (ev: MouseEvent) => void;
|
|
26
|
-
onkeydown: (ev: KeyboardEvent) => void;
|
|
21
|
+
root(): {
|
|
22
|
+
[x: symbol]: (node: HTMLElement) => void;
|
|
27
23
|
id: string;
|
|
28
24
|
role: string;
|
|
29
25
|
'aria-modal': boolean;
|
|
@@ -35,44 +31,50 @@ export declare class DrawerBond<Props extends DrawerBondProps = DrawerBondProps,
|
|
|
35
31
|
'data-active': boolean;
|
|
36
32
|
'data-open': boolean;
|
|
37
33
|
'data-kind': string;
|
|
34
|
+
onkeydown: (ev: KeyboardEvent) => void;
|
|
38
35
|
};
|
|
39
|
-
content(
|
|
36
|
+
content(): {
|
|
37
|
+
[x: symbol]: (node: HTMLElement) => void;
|
|
40
38
|
id: string;
|
|
41
39
|
role: string;
|
|
42
40
|
'data-kind': string;
|
|
43
41
|
};
|
|
44
|
-
body(
|
|
42
|
+
body(): {
|
|
43
|
+
[x: symbol]: (node: HTMLElement) => void;
|
|
45
44
|
id: string;
|
|
46
45
|
role: string;
|
|
47
46
|
'data-kind': string;
|
|
48
47
|
};
|
|
49
|
-
header(
|
|
48
|
+
header(): {
|
|
49
|
+
[x: symbol]: (node: HTMLElement) => void;
|
|
50
50
|
id: string;
|
|
51
51
|
role: string;
|
|
52
52
|
'data-kind': string;
|
|
53
53
|
};
|
|
54
|
-
title(
|
|
54
|
+
title(): {
|
|
55
|
+
[x: symbol]: (node: HTMLElement) => void;
|
|
55
56
|
id: string;
|
|
56
57
|
role: string;
|
|
57
58
|
'aria-level': number;
|
|
58
59
|
'data-kind': string;
|
|
59
60
|
};
|
|
60
|
-
description(
|
|
61
|
+
description(): {
|
|
62
|
+
[x: symbol]: (node: HTMLElement) => void;
|
|
61
63
|
id: string;
|
|
62
64
|
'data-kind': string;
|
|
63
65
|
};
|
|
64
|
-
footer(
|
|
66
|
+
footer(): {
|
|
67
|
+
[x: symbol]: (node: HTMLElement) => void;
|
|
65
68
|
id: string;
|
|
66
69
|
role: string;
|
|
67
70
|
'data-kind': string;
|
|
68
71
|
};
|
|
69
|
-
backdrop(
|
|
70
|
-
|
|
71
|
-
}): {
|
|
72
|
-
onclick: (ev: MouseEvent) => void;
|
|
72
|
+
backdrop(): {
|
|
73
|
+
[x: symbol]: (node: HTMLElement) => void;
|
|
73
74
|
role: string;
|
|
74
75
|
'aria-hidden': boolean;
|
|
75
76
|
'data-kind': string;
|
|
77
|
+
onclick: (ev: MouseEvent) => void;
|
|
76
78
|
};
|
|
77
79
|
share(): this;
|
|
78
80
|
static get(): DrawerBond | undefined;
|
|
@@ -17,7 +17,7 @@ export class DrawerBond extends Bond {
|
|
|
17
17
|
constructor(state) {
|
|
18
18
|
super(state);
|
|
19
19
|
}
|
|
20
|
-
root(
|
|
20
|
+
root() {
|
|
21
21
|
const id = getElementId(this.id, DRAWER_ELEMENTS_KIND.root);
|
|
22
22
|
const drawerTitleId = getElementId(this.id, DRAWER_ELEMENTS_KIND.title);
|
|
23
23
|
const drawerDescriptionId = getElementId(this.id, DRAWER_ELEMENTS_KIND.description);
|
|
@@ -65,9 +65,7 @@ export class DrawerBond extends Bond {
|
|
|
65
65
|
ev.preventDefault();
|
|
66
66
|
this.state.close();
|
|
67
67
|
}
|
|
68
|
-
props.onkeydown?.(ev);
|
|
69
68
|
},
|
|
70
|
-
...props,
|
|
71
69
|
[createAttachmentKey()]: (node) => {
|
|
72
70
|
this.elements.root = node;
|
|
73
71
|
if (this.state.props.open) {
|
|
@@ -93,79 +91,73 @@ export class DrawerBond extends Bond {
|
|
|
93
91
|
}
|
|
94
92
|
};
|
|
95
93
|
}
|
|
96
|
-
content(
|
|
94
|
+
content() {
|
|
97
95
|
const id = getElementId(this.id, DRAWER_ELEMENTS_KIND.content);
|
|
98
96
|
return {
|
|
99
97
|
id: id,
|
|
100
98
|
role: 'document',
|
|
101
99
|
'data-kind': DRAWER_ELEMENTS_KIND.content,
|
|
102
|
-
...props,
|
|
103
100
|
[createAttachmentKey()]: (node) => {
|
|
104
101
|
this.elements.content = node;
|
|
105
102
|
}
|
|
106
103
|
};
|
|
107
104
|
}
|
|
108
|
-
body(
|
|
105
|
+
body() {
|
|
109
106
|
const id = getElementId(this.id, DRAWER_ELEMENTS_KIND.body);
|
|
110
107
|
return {
|
|
111
108
|
id: id,
|
|
112
109
|
role: 'region',
|
|
113
110
|
'data-kind': DRAWER_ELEMENTS_KIND.body,
|
|
114
|
-
...props,
|
|
115
111
|
[createAttachmentKey()]: (node) => {
|
|
116
112
|
this.elements.body = node;
|
|
117
113
|
}
|
|
118
114
|
};
|
|
119
115
|
}
|
|
120
|
-
header(
|
|
116
|
+
header() {
|
|
121
117
|
const id = getElementId(this.id, DRAWER_ELEMENTS_KIND.header);
|
|
122
118
|
return {
|
|
123
119
|
id: id,
|
|
124
120
|
role: 'banner',
|
|
125
121
|
'data-kind': DRAWER_ELEMENTS_KIND.header,
|
|
126
|
-
...props,
|
|
127
122
|
[createAttachmentKey()]: (node) => {
|
|
128
123
|
this.elements.header = node;
|
|
129
124
|
}
|
|
130
125
|
};
|
|
131
126
|
}
|
|
132
|
-
title(
|
|
127
|
+
title() {
|
|
133
128
|
const id = getElementId(this.id, DRAWER_ELEMENTS_KIND.title);
|
|
134
129
|
return {
|
|
135
130
|
id: id,
|
|
136
131
|
role: 'heading',
|
|
137
132
|
'aria-level': 2,
|
|
138
133
|
'data-kind': DRAWER_ELEMENTS_KIND.title,
|
|
139
|
-
...props,
|
|
140
134
|
[createAttachmentKey()]: (node) => {
|
|
141
135
|
this.elements.title = node;
|
|
142
136
|
}
|
|
143
137
|
};
|
|
144
138
|
}
|
|
145
|
-
description(
|
|
139
|
+
description() {
|
|
146
140
|
const id = getElementId(this.id, DRAWER_ELEMENTS_KIND.description);
|
|
147
141
|
return {
|
|
148
142
|
id: id,
|
|
149
143
|
'data-kind': DRAWER_ELEMENTS_KIND.description,
|
|
150
|
-
...props,
|
|
151
144
|
[createAttachmentKey()]: (node) => {
|
|
152
145
|
this.elements.description = node;
|
|
153
146
|
}
|
|
154
147
|
};
|
|
155
148
|
}
|
|
156
|
-
footer(
|
|
149
|
+
footer() {
|
|
157
150
|
const id = getElementId(this.id, DRAWER_ELEMENTS_KIND.footer);
|
|
158
151
|
return {
|
|
159
152
|
id: id,
|
|
160
153
|
role: 'contentinfo',
|
|
161
154
|
'data-kind': DRAWER_ELEMENTS_KIND.footer,
|
|
162
|
-
...props,
|
|
163
155
|
[createAttachmentKey()]: (node) => {
|
|
164
156
|
this.elements.footer = node;
|
|
165
157
|
}
|
|
166
158
|
};
|
|
167
159
|
}
|
|
168
|
-
backdrop(
|
|
160
|
+
backdrop() {
|
|
169
161
|
const isDisabled = this.state?.props?.disabled ?? false;
|
|
170
162
|
return {
|
|
171
163
|
role: 'presentation',
|
|
@@ -176,9 +168,7 @@ export class DrawerBond extends Bond {
|
|
|
176
168
|
if (!isDisabled) {
|
|
177
169
|
this.state.close();
|
|
178
170
|
}
|
|
179
|
-
props.onclick?.(ev);
|
|
180
171
|
},
|
|
181
|
-
...props,
|
|
182
172
|
[createAttachmentKey()]: (node) => {
|
|
183
173
|
this.elements.backdrop = node;
|
|
184
174
|
}
|