@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.
Files changed (136) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +289 -853
  3. package/dist/attachments/index.d.ts +1 -0
  4. package/dist/attachments/index.js +1 -0
  5. package/dist/components/accordion/accordion-root.svelte +65 -65
  6. package/dist/components/accordion/accordion.stories.svelte +70 -70
  7. package/dist/components/accordion/item/accordion-item-body.svelte +44 -44
  8. package/dist/components/accordion/item/accordion-item-header.svelte +51 -51
  9. package/dist/components/accordion/item/accordion-item-indicator.svelte +51 -51
  10. package/dist/components/accordion/item/accordion-item-root.svelte +66 -66
  11. package/dist/components/alert/alert-close-button.svelte +66 -66
  12. package/dist/components/alert/alert-description.svelte +42 -42
  13. package/dist/components/alert/alert-root.svelte +68 -68
  14. package/dist/components/atom/html-atom.svelte +26 -194
  15. package/dist/components/atom/types.d.ts +3 -2
  16. package/dist/components/atom/utils.d.ts +37 -0
  17. package/dist/components/atom/utils.js +208 -0
  18. package/dist/components/breadcrumb/breadcrumb-item.svelte +1 -1
  19. package/dist/components/breadcrumb/breadcrumb-separator.svelte +5 -1
  20. package/dist/components/breadcrumb/breadcrumb.stories.svelte +16 -16
  21. package/dist/components/calendar/calendar-day.svelte +101 -101
  22. package/dist/components/checkbox/checkbox.svelte +159 -159
  23. package/dist/components/collapsible/bond.svelte.js +2 -1
  24. package/dist/components/collapsible/collapsible-body.svelte +3 -2
  25. package/dist/components/collapsible/motion.svelte.d.ts +6 -0
  26. package/dist/components/collapsible/motion.svelte.js +15 -0
  27. package/dist/components/combobox/atoms.d.ts +3 -3
  28. package/dist/components/combobox/atoms.js +3 -3
  29. package/dist/components/combobox/bond.svelte.d.ts +6 -6
  30. package/dist/components/combobox/bond.svelte.js +3 -26
  31. package/dist/components/combobox/combobox-control.svelte +52 -52
  32. package/dist/components/combobox/{compobox-item.svelte → combobox-item.svelte} +62 -68
  33. package/dist/components/combobox/combobox-item.svelte.d.ts +12 -0
  34. package/dist/components/combobox/combobox.stories.svelte +50 -0
  35. package/dist/components/combobox/combobox.stories.svelte.d.ts +3 -0
  36. package/dist/components/datagrid/tr/datagrid-tr.svelte +90 -90
  37. package/dist/components/date-picker/bond.svelte.d.ts +15 -5
  38. package/dist/components/date-picker/bond.svelte.js +5 -11
  39. package/dist/components/date-picker/date-picker-calendar.svelte +67 -67
  40. package/dist/components/dialog/bond.svelte.js +5 -20
  41. package/dist/components/dialog/dialog-content.svelte +44 -44
  42. package/dist/components/dialog/dialog-root.svelte +91 -91
  43. package/dist/components/drawer/bond.svelte.d.ts +18 -16
  44. package/dist/components/drawer/bond.svelte.js +8 -18
  45. package/dist/components/drawer/drawer-content.svelte +49 -49
  46. package/dist/components/drawer/drawer-root.svelte +5 -4
  47. package/dist/components/drawer/drawer.stories.svelte +141 -144
  48. package/dist/components/drawer/motion.js +1 -1
  49. package/dist/components/dropdown/atoms.d.ts +1 -1
  50. package/dist/components/dropdown/atoms.js +1 -1
  51. package/dist/components/dropdown/bond.svelte.d.ts +21 -22
  52. package/dist/components/dropdown/bond.svelte.js +29 -53
  53. package/dist/components/dropdown/dropdown-root.svelte +65 -59
  54. package/dist/components/dropdown/dropdown-values.svelte +17 -17
  55. package/dist/components/dropdown/dropdown-values.svelte.d.ts +1 -2
  56. package/dist/components/dropdown/dropdown.stories.svelte +83 -80
  57. package/dist/components/dropdown/index.d.ts +1 -0
  58. package/dist/components/dropdown/index.js +1 -0
  59. package/dist/components/dropdown/item/attachments.svelte.d.ts +2 -2
  60. package/dist/components/dropdown/item/attachments.svelte.js +2 -2
  61. package/dist/components/dropdown/item/controller.svelte.d.ts +34 -0
  62. package/dist/components/dropdown/item/controller.svelte.js +82 -0
  63. package/dist/components/dropdown/item/dropdown-item.svelte +109 -102
  64. package/dist/components/dropdown/item/dropdown-item.svelte.d.ts +13 -28
  65. package/dist/components/dropdown/item/index.d.ts +3 -0
  66. package/dist/components/dropdown/item/index.js +3 -0
  67. package/dist/components/dropdown/item/types.d.ts +29 -0
  68. package/dist/components/dropdown/item/types.js +1 -0
  69. package/dist/components/list/list-item.svelte +20 -20
  70. package/dist/components/menu/atoms.d.ts +8 -3
  71. package/dist/components/menu/atoms.js +8 -3
  72. package/dist/components/menu/bond.svelte.d.ts +54 -0
  73. package/dist/components/menu/bond.svelte.js +132 -0
  74. package/dist/components/menu/index.d.ts +1 -0
  75. package/dist/components/menu/index.js +1 -0
  76. package/dist/components/menu/item/controller.svelte.d.ts +26 -0
  77. package/dist/components/menu/item/controller.svelte.js +69 -0
  78. package/dist/components/menu/item/index.d.ts +2 -0
  79. package/dist/components/menu/item/index.js +2 -0
  80. package/dist/components/menu/item/menu-item.svelte +103 -0
  81. package/dist/components/menu/item/menu-item.svelte.d.ts +31 -0
  82. package/dist/components/menu/item/types.d.ts +62 -0
  83. package/dist/components/menu/item/types.js +1 -0
  84. package/dist/components/menu/{menu-list.svelte → menu-content.svelte} +40 -40
  85. package/dist/components/menu/{menu-list.svelte.d.ts → menu-content.svelte.d.ts} +3 -3
  86. package/dist/components/menu/menu-root.svelte +15 -0
  87. package/dist/components/menu/menu-root.svelte.d.ts +8 -0
  88. package/dist/components/menu/menu.stories.svelte +33 -33
  89. package/dist/components/menu/types.d.ts +0 -7
  90. package/dist/components/popover/bond.svelte.d.ts +11 -14
  91. package/dist/components/popover/bond.svelte.js +27 -44
  92. package/dist/components/popover/popover-content.svelte +137 -137
  93. package/dist/components/popover/popover.stories.svelte +37 -49
  94. package/dist/components/portal/active-portal.svelte +29 -29
  95. package/dist/components/portal/portal-root.svelte +76 -76
  96. package/dist/components/portal/teleport.svelte +49 -49
  97. package/dist/components/radio/radio.svelte +109 -109
  98. package/dist/components/root/index.d.ts +1 -0
  99. package/dist/components/root/index.js +1 -0
  100. package/dist/components/root/l0-portal.svelte +8 -0
  101. package/dist/components/root/l0-portal.svelte.d.ts +26 -0
  102. package/dist/components/root/l1-portal.svelte +7 -0
  103. package/dist/components/root/l1-portal.svelte.d.ts +26 -0
  104. package/dist/components/root/root.css +119 -119
  105. package/dist/components/root/root.svelte +17 -18
  106. package/dist/components/root/root.svelte.d.ts +2 -6
  107. package/dist/components/root/toasts-portal.svelte +7 -0
  108. package/dist/components/root/toasts-portal.svelte.d.ts +26 -0
  109. package/dist/components/root/types.d.ts +17 -0
  110. package/dist/components/sidebar/motion.svelte.js +3 -3
  111. package/dist/components/sidebar/sidebar-content.svelte +40 -40
  112. package/dist/components/textarea/textarea-input.svelte +9 -9
  113. package/dist/components/textarea/textarea-root.svelte +9 -9
  114. package/dist/components/tooltip/tooltip-trigger.svelte +39 -39
  115. package/dist/components/tree/index.d.ts +1 -0
  116. package/dist/components/tree/index.js +1 -0
  117. package/dist/components/tree/motion.svelte.d.ts +6 -0
  118. package/dist/components/tree/motion.svelte.js +14 -0
  119. package/dist/components/tree/tree-body.svelte +4 -3
  120. package/dist/context/preset.svelte.d.ts +3 -1
  121. package/dist/icons/icon-copy.svelte +6 -6
  122. package/dist/utils/dom.svelte.d.ts +2 -0
  123. package/dist/utils/dom.svelte.js +21 -0
  124. package/dist/utils/function.d.ts +1 -1
  125. package/dist/utils/promise.svelte.d.ts +5 -0
  126. package/dist/utils/promise.svelte.js +20 -0
  127. package/package.json +4 -2
  128. package/dist/components/combobox/compobox-item.svelte.d.ts +0 -34
  129. package/dist/components/combobox/compobox.stories.svelte +0 -51
  130. package/dist/components/combobox/compobox.stories.svelte.d.ts +0 -3
  131. package/dist/components/dropdown/item/bond.svelte.d.ts +0 -42
  132. package/dist/components/dropdown/item/bond.svelte.js +0 -99
  133. package/dist/components/menu/menu-item.svelte +0 -69
  134. package/dist/components/menu/menu-item.svelte.d.ts +0 -37
  135. package/dist/utils/markdown-to-llm.d.ts +0 -28
  136. 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 focusTrap = (ev) => {
30
- const node = ev.currentTarget;
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' && !isDisabled) {
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(props?: Record<string, unknown> & {
22
- onclick?: (ev: MouseEvent) => void;
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(props?: Record<string, unknown>): {
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(props?: Record<string, unknown>): {
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(props?: Record<string, unknown>): {
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(props?: Record<string, unknown>): {
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(props?: Record<string, unknown>): {
61
+ description(): {
62
+ [x: symbol]: (node: HTMLElement) => void;
61
63
  id: string;
62
64
  'data-kind': string;
63
65
  };
64
- footer(props?: Record<string, unknown>): {
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(props?: Record<string, unknown> & {
70
- onclick?: (ev: MouseEvent) => void;
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(props = {}) {
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(props = {}) {
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(props = {}) {
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(props = {}) {
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(props = {}) {
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(props = {}) {
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(props = {}) {
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(props = {}) {
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
  }