@svelte-atoms/core 1.0.0-alpha.25 → 1.0.0-alpha.26

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 (152) hide show
  1. package/README.md +645 -645
  2. package/dist/components/accordion/accordion-root.svelte +1 -1
  3. package/dist/components/accordion/item/accordion-item-body.svelte +1 -1
  4. package/dist/components/accordion/item/accordion-item-header.svelte +5 -1
  5. package/dist/components/accordion/item/accordion-item-indicator.svelte +1 -1
  6. package/dist/components/accordion/item/accordion-item-root.svelte +1 -1
  7. package/dist/components/alert/alert-actions.svelte +1 -1
  8. package/dist/components/alert/alert-close-button.svelte +1 -1
  9. package/dist/components/alert/alert-content.svelte +1 -1
  10. package/dist/components/alert/alert-description.svelte +1 -1
  11. package/dist/components/alert/alert-icon.svelte +1 -1
  12. package/dist/components/alert/alert-root.svelte +1 -1
  13. package/dist/components/alert/alert-title.svelte +1 -1
  14. package/dist/components/atom/html-atom.svelte +201 -217
  15. package/dist/components/badge/badge.svelte +1 -1
  16. package/dist/components/breadcrumb/breadcrumb-item.svelte +1 -1
  17. package/dist/components/breadcrumb/breadcrumb-root.svelte +1 -1
  18. package/dist/components/breadcrumb/breadcrumb-separator.svelte +1 -1
  19. package/dist/components/button/button.stories.svelte +57 -57
  20. package/dist/components/button/button.svelte +1 -1
  21. package/dist/components/button/button.svelte.d.ts +4 -1
  22. package/dist/components/button/types.d.ts +1 -1
  23. package/dist/components/card/card-body.svelte +1 -1
  24. package/dist/components/card/card-description.svelte +1 -1
  25. package/dist/components/card/card-footer.svelte +1 -1
  26. package/dist/components/card/card-header.svelte +1 -1
  27. package/dist/components/card/card-media.svelte +1 -1
  28. package/dist/components/card/card-subtitle.svelte +1 -1
  29. package/dist/components/card/card-title.svelte +5 -1
  30. package/dist/components/checkbox/checkbox.svelte +39 -28
  31. package/dist/components/collapsible/collapsible-body.svelte +1 -1
  32. package/dist/components/collapsible/collapsible-header.svelte +1 -1
  33. package/dist/components/collapsible/collapsible-indicator.svelte +1 -1
  34. package/dist/components/collapsible/collapsible-root.svelte +1 -1
  35. package/dist/components/combobox/atoms.d.ts +5 -1
  36. package/dist/components/combobox/atoms.js +5 -1
  37. package/dist/components/combobox/{combobox-input.svelte → combobox-control.svelte} +3 -3
  38. package/dist/components/combobox/{combobox-input.svelte.d.ts → combobox-control.svelte.d.ts} +3 -3
  39. package/dist/components/combobox/combobox-trigger.svelte +1 -1
  40. package/dist/components/combobox/compobox-item.svelte +1 -1
  41. package/dist/components/container/container.svelte +1 -1
  42. package/dist/components/datagrid/datagrid-body.svelte +1 -1
  43. package/dist/components/datagrid/datagrid-footer.svelte +1 -1
  44. package/dist/components/datagrid/datagrid-header.svelte +1 -1
  45. package/dist/components/datagrid/datagrid-root.svelte +1 -1
  46. package/dist/components/datagrid/datagrid.stories.svelte +75 -75
  47. package/dist/components/datagrid/td/datagrid-td.svelte +1 -1
  48. package/dist/components/datagrid/th/datagrid-th-sort-icon.svelte +1 -1
  49. package/dist/components/datagrid/th/datagrid-th.svelte +1 -1
  50. package/dist/components/dialog/dialog-body.svelte +1 -1
  51. package/dist/components/dialog/dialog-close-button.svelte +1 -1
  52. package/dist/components/dialog/dialog-content.svelte +8 -11
  53. package/dist/components/dialog/dialog-description.svelte +1 -1
  54. package/dist/components/dialog/dialog-footer.svelte +1 -1
  55. package/dist/components/dialog/dialog-header.svelte +1 -1
  56. package/dist/components/dialog/dialog-root.svelte +123 -120
  57. package/dist/components/dialog/dialog-root.svelte.d.ts +3 -1
  58. package/dist/components/dialog/dialog-title.svelte +1 -1
  59. package/dist/components/drawer/drawer-backdrop.svelte +1 -1
  60. package/dist/components/drawer/drawer-body.svelte +1 -1
  61. package/dist/components/drawer/drawer-description.svelte +1 -1
  62. package/dist/components/drawer/drawer-footer.svelte +1 -1
  63. package/dist/components/drawer/drawer-header.svelte +1 -1
  64. package/dist/components/drawer/drawer-root.svelte +118 -113
  65. package/dist/components/drawer/drawer-root.svelte.d.ts +5 -2
  66. package/dist/components/drawer/drawer-title.svelte +1 -1
  67. package/dist/components/dropdown/dropdown-placeholder.svelte +1 -1
  68. package/dist/components/dropdown/dropdown-query.svelte +1 -1
  69. package/dist/components/dropdown/dropdown-trigger.svelte +1 -1
  70. package/dist/components/dropdown/dropdown-value.svelte +1 -3
  71. package/dist/components/dropdown/item/bond.svelte.d.ts +4 -0
  72. package/dist/components/dropdown/item/bond.svelte.js +9 -0
  73. package/dist/components/dropdown/item/dropdown-item.svelte +10 -6
  74. package/dist/components/form/field/bond.svelte.d.ts +8 -0
  75. package/dist/components/form/field/bond.svelte.js +13 -1
  76. package/dist/components/form/field/field-control.svelte +7 -0
  77. package/dist/components/form/field/field-control.svelte.d.ts +2 -2
  78. package/dist/components/form/form.stories.svelte +3 -3
  79. package/dist/components/input/atoms.d.ts +5 -1
  80. package/dist/components/input/atoms.js +5 -1
  81. package/dist/components/input/{input-value.svelte → input-control.svelte} +107 -113
  82. package/dist/components/input/input-control.svelte.d.ts +27 -0
  83. package/dist/components/input/input-icon.svelte +1 -1
  84. package/dist/components/input/input-placeholder.svelte +54 -56
  85. package/dist/components/input/input-root.svelte +5 -12
  86. package/dist/components/input/input-root.svelte.d.ts +3 -20
  87. package/dist/components/input/input.stories.svelte +2 -2
  88. package/dist/components/input/types.d.ts +22 -0
  89. package/dist/components/input/types.js +1 -0
  90. package/dist/components/list/list-group.svelte +1 -1
  91. package/dist/components/list/list-item.svelte +1 -1
  92. package/dist/components/list/list-root.svelte +6 -1
  93. package/dist/components/list/list-title.svelte +1 -1
  94. package/dist/components/menu/menu-list.svelte +1 -1
  95. package/dist/components/popover/bond.svelte.d.ts +2 -0
  96. package/dist/components/popover/bond.svelte.js +1 -1
  97. package/dist/components/popover/popover-arrow.svelte +111 -117
  98. package/dist/components/popover/popover-arrow.svelte.d.ts +1 -2
  99. package/dist/components/popover/popover-content.svelte +139 -147
  100. package/dist/components/popover/popover-content.svelte.d.ts +3 -17
  101. package/dist/components/popover/popover-indicator.svelte +1 -1
  102. package/dist/components/popover/popover-root.svelte +49 -63
  103. package/dist/components/popover/popover-root.svelte.d.ts +1 -15
  104. package/dist/components/popover/popover-trigger.svelte +47 -56
  105. package/dist/components/popover/popover-trigger.svelte.d.ts +2 -8
  106. package/dist/components/popover/types.d.ts +39 -0
  107. package/dist/components/popover/types.js +1 -0
  108. package/dist/components/portal/active-portal.svelte +22 -16
  109. package/dist/components/portal/active-portal.svelte.d.ts +2 -2
  110. package/dist/components/portal/portal-inner.svelte +1 -1
  111. package/dist/components/portal/portal-root.svelte +1 -1
  112. package/dist/components/portal/teleport.svelte +55 -49
  113. package/dist/components/portal/teleport.svelte.d.ts +3 -2
  114. package/dist/components/radio/radio-group.stories.svelte +4 -4
  115. package/dist/components/radio/radio.svelte +3 -3
  116. package/dist/components/root/root.css +24 -66
  117. package/dist/components/root/root.svelte +1 -1
  118. package/dist/components/sidebar/sidebar-content.svelte +2 -16
  119. package/dist/components/sidebar/sidebar-content.svelte.d.ts +2 -9
  120. package/dist/components/sidebar/sidebar-root.svelte +4 -23
  121. package/dist/components/sidebar/sidebar-root.svelte.d.ts +2 -13
  122. package/dist/components/sidebar/types.d.ts +19 -0
  123. package/dist/components/sidebar/types.js +1 -0
  124. package/dist/components/stack/stack-item.svelte +5 -1
  125. package/dist/components/stack/stack-root.svelte +5 -1
  126. package/dist/components/tabs/tab/tab-body.svelte +1 -1
  127. package/dist/components/tabs/tab/tab-description.svelte +1 -1
  128. package/dist/components/tabs/tab/tab-header.svelte +2 -2
  129. package/dist/components/tabs/tab/tab-root.svelte +6 -1
  130. package/dist/components/tabs/tabs-body.svelte +1 -1
  131. package/dist/components/tabs/tabs-header.svelte +1 -1
  132. package/dist/components/tabs/tabs-root.svelte +1 -1
  133. package/dist/components/textarea/textarea-input.svelte +2 -1
  134. package/dist/components/toast/toast-description.svelte +1 -1
  135. package/dist/components/toast/toast-root.svelte +1 -1
  136. package/dist/components/toast/toast-title.svelte +1 -1
  137. package/dist/components/tree/tree-body.svelte +1 -1
  138. package/dist/components/tree/tree-header.svelte +1 -1
  139. package/dist/components/tree/tree-indicator.svelte +1 -1
  140. package/dist/components/tree/tree-root.svelte +1 -1
  141. package/dist/context/preset.svelte.d.ts +1 -1
  142. package/llm/composition.md +395 -395
  143. package/llm/crafting.md +838 -838
  144. package/llm/motion.md +970 -970
  145. package/llm/philosophy.md +23 -23
  146. package/llm/preset-variant-integration.md +516 -516
  147. package/llm/preset.md +383 -383
  148. package/llm/styling.md +216 -216
  149. package/llm/usage.md +46 -46
  150. package/llm/variants.md +712 -712
  151. package/package.json +437 -437
  152. package/dist/components/input/input-value.svelte.d.ts +0 -19
@@ -1,75 +1,75 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import Root from '../root/root.svelte';
4
- import { DataGrid as DataGridCmp } from '.';
5
- import { Dropdown } from '../dropdown';
6
- import MoreVerticalIcon from '../../icons/icon-more-vert.svelte';
7
- import { Icon } from '../icon';
8
- import { container } from '../../runes/container.svelte';
9
-
10
- const { Story } = defineMeta({
11
- title: 'Atoms/DataGrid'
12
- });
13
- </script>
14
-
15
- <script>
16
- let values = $state([]);
17
-
18
- const datagridContainer = container();
19
- </script>
20
-
21
- <Story name="DataGrid">
22
- <Root>
23
- {#snippet children({ args })}
24
- <DataGridCmp.Root class="" {@attach datagridContainer.attach}>
25
- <DataGridCmp.Header>
26
- <DataGridCmp.Tr header>
27
- <DataGridCmp.Th width="auto">
28
- <DataGridCmp.Checkbox />
29
- </DataGridCmp.Th>
30
- <DataGridCmp.Th
31
- class="resize-x overflow-x-auto"
32
- width="auto"
33
- hidden={datagridContainer.current?.width
34
- ? datagridContainer.current.width < 1024
35
- : false}>ID</DataGridCmp.Th
36
- >
37
- <DataGridCmp.Th>Name</DataGridCmp.Th>
38
- <DataGridCmp.Th width="auto">Job</DataGridCmp.Th>
39
- <DataGridCmp.Th width="auto">Contact</DataGridCmp.Th>
40
- <DataGridCmp.Th width="auto"></DataGridCmp.Th>
41
- </DataGridCmp.Tr>
42
- </DataGridCmp.Header>
43
-
44
- <DataGridCmp.Body>
45
- {#each { length: 10 } as _, i (i)}
46
- <DataGridCmp.Tr>
47
- <DataGridCmp.Td>
48
- <DataGridCmp.Checkbox />
49
- </DataGridCmp.Td>
50
-
51
- <DataGridCmp.Td>{crypto.randomUUID()}</DataGridCmp.Td>
52
- <DataGridCmp.Td>John Doe</DataGridCmp.Td>
53
- <DataGridCmp.Td>Software Engineer</DataGridCmp.Td>
54
- <DataGridCmp.Td>+213659009944</DataGridCmp.Td>
55
-
56
- <DataGridCmp.Td base={Dropdown.Root} placement="bottom-end" offset={0}>
57
- <Dropdown.Trigger class="flex aspect-square items-center justify-center p-0">
58
- <Icon src={MoreVerticalIcon} />
59
- </Dropdown.Trigger>
60
- <Dropdown.List>
61
- <Dropdown.Item value="ar">Arabic</Dropdown.Item>
62
- <Dropdown.Item value="en">English</Dropdown.Item>
63
- <Dropdown.Item value="sp">Spanish</Dropdown.Item>
64
- <Dropdown.Item value="fr">Frensh</Dropdown.Item>
65
- </Dropdown.List>
66
- </DataGridCmp.Td>
67
- </DataGridCmp.Tr>
68
- {/each}
69
- </DataGridCmp.Body>
70
-
71
- <DataGridCmp.Footer></DataGridCmp.Footer>
72
- </DataGridCmp.Root>
73
- {/snippet}
74
- </Root>
75
- </Story>
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import Root from '../root/root.svelte';
4
+ import { DataGrid as DataGridCmp } from '.';
5
+ import { Dropdown } from '../dropdown';
6
+ import MoreVerticalIcon from '../../icons/icon-more-vert.svelte';
7
+ import { Icon } from '../icon';
8
+ import { container } from '../../runes/container.svelte';
9
+
10
+ const { Story } = defineMeta({
11
+ title: 'Atoms/DataGrid'
12
+ });
13
+ </script>
14
+
15
+ <script>
16
+ let values = $state([]);
17
+
18
+ const datagridContainer = container();
19
+ </script>
20
+
21
+ <Story name="DataGrid">
22
+ <Root>
23
+ {#snippet children({ args })}
24
+ <DataGridCmp.Root class="" {@attach datagridContainer.attach}>
25
+ <DataGridCmp.Header>
26
+ <DataGridCmp.Tr header>
27
+ <DataGridCmp.Th width="auto">
28
+ <DataGridCmp.Checkbox />
29
+ </DataGridCmp.Th>
30
+ <DataGridCmp.Th
31
+ class="resize-x overflow-x-auto"
32
+ width="auto"
33
+ hidden={datagridContainer.current?.width
34
+ ? datagridContainer.current.width < 1024
35
+ : false}>ID</DataGridCmp.Th
36
+ >
37
+ <DataGridCmp.Th>Name</DataGridCmp.Th>
38
+ <DataGridCmp.Th width="auto">Job</DataGridCmp.Th>
39
+ <DataGridCmp.Th width="auto">Contact</DataGridCmp.Th>
40
+ <DataGridCmp.Th width="auto"></DataGridCmp.Th>
41
+ </DataGridCmp.Tr>
42
+ </DataGridCmp.Header>
43
+
44
+ <DataGridCmp.Body>
45
+ {#each { length: 10 } as _, i (i)}
46
+ <DataGridCmp.Tr>
47
+ <DataGridCmp.Td>
48
+ <DataGridCmp.Checkbox />
49
+ </DataGridCmp.Td>
50
+
51
+ <DataGridCmp.Td>{crypto.randomUUID()}</DataGridCmp.Td>
52
+ <DataGridCmp.Td>John Doe</DataGridCmp.Td>
53
+ <DataGridCmp.Td>Software Engineer</DataGridCmp.Td>
54
+ <DataGridCmp.Td>+213659009944</DataGridCmp.Td>
55
+
56
+ <DataGridCmp.Td base={Dropdown.Root} placement="bottom-end" offset={0}>
57
+ <Dropdown.Trigger class="flex aspect-square items-center justify-center p-0">
58
+ <Icon src={MoreVerticalIcon} />
59
+ </Dropdown.Trigger>
60
+ <Dropdown.List>
61
+ <Dropdown.Item value="ar">Arabic</Dropdown.Item>
62
+ <Dropdown.Item value="en">English</Dropdown.Item>
63
+ <Dropdown.Item value="sp">Spanish</Dropdown.Item>
64
+ <Dropdown.Item value="fr">Frensh</Dropdown.Item>
65
+ </Dropdown.List>
66
+ </DataGridCmp.Td>
67
+ </DataGridCmp.Tr>
68
+ {/each}
69
+ </DataGridCmp.Body>
70
+
71
+ <DataGridCmp.Footer></DataGridCmp.Footer>
72
+ </DataGridCmp.Root>
73
+ {/snippet}
74
+ </Root>
75
+ </Story>
@@ -65,7 +65,7 @@
65
65
  }}
66
66
  {bond}
67
67
  preset="datagrid.td"
68
- class={['flex h-full items-center py-2 text-left', '$preset', klass]}
68
+ class={['border-border flex h-full items-center py-2 text-left', '$preset', klass]}
69
69
  enter={enter?.bind(bond.state)}
70
70
  exit={exit?.bind(bond.state)}
71
71
  initial={initial?.bind(bond.state)}
@@ -34,7 +34,7 @@
34
34
  <HtmlAtom
35
35
  {bond}
36
36
  preset="datagrid.sort-icon"
37
- class={['$preset', klass]}
37
+ class={['border-border', '$preset', klass]}
38
38
  enter={enter?.bind(bond.state)}
39
39
  exit={exit?.bind(bond.state)}
40
40
  initial={initial?.bind(bond.state)}
@@ -107,7 +107,7 @@
107
107
  {bond}
108
108
  preset="datagrid.th"
109
109
  class={[
110
- 'flex cursor-pointer py-1 font-medium select-none',
110
+ 'border-border flex cursor-pointer py-1 font-medium select-none',
111
111
  !!sortable && 'sortable',
112
112
  '$preset',
113
113
  klass
@@ -32,7 +32,7 @@
32
32
  <HtmlAtom
33
33
  {bond}
34
34
  preset="dialog.body"
35
- class={['px-4 py-2', '$preset', klass]}
35
+ class={['border-border px-4 py-2', '$preset', klass]}
36
36
  enter={enter?.bind(bond.state)}
37
37
  exit={exit?.bind(bond.state)}
38
38
  initial={initial?.bind(bond.state)}
@@ -41,7 +41,7 @@
41
41
  {as}
42
42
  {bond}
43
43
  preset="dialog.close-button"
44
- class={['cursor-pointer', '$preset', klass]}
44
+ class={['border-border cursor-pointer', '$preset', klass]}
45
45
  enter={enter?.bind(bond.state)}
46
46
  exit={exit?.bind(bond.state)}
47
47
  initial={initial?.bind(bond.state)}
@@ -7,8 +7,9 @@
7
7
 
8
8
  <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
9
9
  import { animate as motion } from 'motion';
10
- import { DialogBond } from './bond.svelte';
10
+ import { DURATION } from '../../shared';
11
11
  import { HtmlAtom, type HtmlAtomProps, type Base } from '../atom';
12
+ import { DialogBond } from './bond.svelte';
12
13
 
13
14
  const bond = DialogBond.get();
14
15
 
@@ -32,20 +33,16 @@
32
33
  const open = $derived(bond?.state?.props?.open ?? false);
33
34
 
34
35
  function _animate(node: HTMLElement) {
36
+ if (open) {
37
+ bond?.elements.root?.show?.();
38
+ }
39
+
35
40
  motion(
36
41
  node,
37
42
  { scale: 0.9 + 0.1 * +open, opacity: +open },
38
43
  {
39
- duration: 0.3,
40
- ease: 'anticipate',
41
- onComplete: () => {
42
- if (!open) {
43
- const root = bond?.elements.root;
44
-
45
- root?.close?.();
46
- console.log(root);
47
- }
48
- }
44
+ duration: DURATION.normal / 1000,
45
+ ease: 'anticipate'
49
46
  }
50
47
  );
51
48
  }
@@ -33,7 +33,7 @@
33
33
  <HtmlAtom
34
34
  {as}
35
35
  preset="dialog.description"
36
- class={['$preset', klass]}
36
+ class={['border-border', '$preset', klass]}
37
37
  enter={enter?.bind(bond.state)}
38
38
  exit={exit?.bind(bond.state)}
39
39
  initial={initial?.bind(bond.state)}
@@ -32,7 +32,7 @@
32
32
  <HtmlAtom
33
33
  {bond}
34
34
  preset="dialog.footer"
35
- class={['flex px-4', '$preset', klass]}
35
+ class={['border-border', 'flex px-4', '$preset', klass]}
36
36
  enter={enter?.bind(bond.state)}
37
37
  exit={exit?.bind(bond.state)}
38
38
  initial={initial?.bind(bond.state)}
@@ -32,7 +32,7 @@
32
32
  <HtmlAtom
33
33
  {bond}
34
34
  preset="dialog.header"
35
- class={['flex w-full px-4 text-xl', '$preset', klass]}
35
+ class={['border-border', 'flex w-full px-4 text-xl', '$preset', klass]}
36
36
  enter={enter?.bind(bond.state)}
37
37
  exit={exit?.bind(bond.state)}
38
38
  initial={initial?.bind(bond.state)}
@@ -1,120 +1,123 @@
1
- <script module lang="ts">
2
- export type DialogProps<
3
- E extends keyof HTMLElementTagNameMap = 'div',
4
- B extends Base = Base
5
- > = HtmlAtomProps<E, B> & {
6
- open?: boolean;
7
- disabled?: boolean;
8
- factory?: (props: DialogBondProps) => DialogBond;
9
- children?: Snippet<[{ dialog: DialogBond }]>;
10
- };
11
- </script>
12
-
13
- <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
14
- import type { Snippet } from 'svelte';
15
- import { animate as motion } from 'motion';
16
- import { DialogBond, DialogBondState, type DialogBondProps } from './bond.svelte';
17
- import { Teleport, ActivePortal } from '../portal';
18
- import { defineProperty, defineState } from '../../utils';
19
- import type { HtmlAtomProps, Base } from '../atom';
20
-
21
- let {
22
- class: klass = '',
23
- open = $bindable(false),
24
- disabled = false,
25
- as = 'dialog' as E,
26
- factory = _factory,
27
- onmount = undefined,
28
- ondestroy = undefined,
29
- animate = _animate,
30
- enter = undefined,
31
- exit = undefined,
32
- initial = undefined,
33
- children = undefined,
34
- ...restProps
35
- }: DialogProps<E, B> = $props();
36
-
37
- const bondProps = defineState<DialogBondProps>(
38
- [
39
- defineProperty(
40
- 'open',
41
- () => open,
42
- (v) => {
43
- open = v;
44
- }
45
- )
46
- ],
47
- () => ({ disabled })
48
- );
49
- const bond = _factory(bondProps).share();
50
-
51
- const rootProps = $derived({
52
- ...bond?.root({}),
53
- ...restProps
54
- });
55
-
56
- function _factory(props: typeof bondProps) {
57
- const bondState = new DialogBondState(() => props);
58
- return new DialogBond(bondState);
59
- }
60
-
61
- function _animate(node: HTMLDialogElement) {
62
- if (open) {
63
- bond.elements.root?.show?.();
64
- motion(
65
- node,
66
- {
67
- opacity: +open
68
- },
69
- {
70
- duration: 0,
71
- ease: 'anticipate'
72
- }
73
- );
74
- }
75
- }
76
-
77
- function onclickDialogElement(ev: MouseEvent) {
78
- if (bond?.elements?.content?.contains(ev.target)) {
79
- return;
80
- }
81
-
82
- // Clicked the backdrop
83
- bond.state.close();
84
- }
85
-
86
- export function getBond() {
87
- return bond;
88
- }
89
- </script>
90
-
91
- <Teleport
92
- {as}
93
- {bond}
94
- preset="dialog"
95
- portal="root.l1"
96
- class={[
97
- 'pointer-events-auto fixed top-0 left-0 flex h-full w-full items-center justify-center bg-neutral-900/10 opacity-0',
98
- !open && 'pointer-events-none',
99
- '$preset',
100
- klass
101
- ]}
102
- enter={enter?.bind(bond.state)}
103
- exit={exit?.bind(bond.state)}
104
- initial={initial?.bind(bond.state)}
105
- animate={animate?.bind(bond.state)}
106
- onmount={onmount?.bind(bond.state)}
107
- ondestroy={ondestroy?.bind(bond.state)}
108
- onclick={onclickDialogElement}
109
- oncancel={(ev) => {
110
- ev.preventDefault();
111
- open = false;
112
- }}
113
- {...rootProps}
114
- >
115
- <!-- <div class="w-full h-full flex items-center justify-center"> -->
116
- <ActivePortal id="root.l1">
117
- {@render children?.({ dialog: bond })}
118
- </ActivePortal>
119
- <!-- </div> -->
120
- </Teleport>
1
+ <script module lang="ts">
2
+ export type DialogProps<
3
+ E extends keyof HTMLElementTagNameMap = 'div',
4
+ B extends Base = Base
5
+ > = HtmlAtomProps<E, B> & {
6
+ open?: boolean;
7
+ disabled?: boolean;
8
+ portal?: string | PortalBond;
9
+ factory?: (props: DialogBondProps) => DialogBond;
10
+ children?: Snippet<[{ dialog: DialogBond }]>;
11
+ };
12
+ </script>
13
+
14
+ <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
15
+ import type { Snippet } from 'svelte';
16
+ import { animate as motion } from 'motion';
17
+ import { Teleport, ActivePortal, PortalBond } from '../portal';
18
+ import { defineProperty, defineState } from '../../utils';
19
+ import type { HtmlAtomProps, Base } from '../atom';
20
+ import { DURATION } from '../../shared';
21
+ import { DialogBond, DialogBondState, type DialogBondProps } from './bond.svelte';
22
+
23
+ let {
24
+ class: klass = '',
25
+ open = $bindable(false),
26
+ disabled = false,
27
+ as = 'dialog' as E,
28
+ portal = undefined,
29
+ factory = _factory,
30
+ onmount = undefined,
31
+ ondestroy = undefined,
32
+ animate = _animate,
33
+ enter = undefined,
34
+ exit = undefined,
35
+ initial = undefined,
36
+ children = undefined,
37
+ ...restProps
38
+ }: DialogProps<E, B> = $props();
39
+
40
+ const bondProps = defineState<DialogBondProps>(
41
+ [
42
+ defineProperty(
43
+ 'open',
44
+ () => open,
45
+ (v) => {
46
+ open = v;
47
+ }
48
+ )
49
+ ],
50
+ () => ({ disabled })
51
+ );
52
+ const bond = _factory(bondProps).share();
53
+
54
+ const rootProps = $derived({
55
+ ...bond?.root({}),
56
+ ...restProps
57
+ });
58
+
59
+ function _factory(props: typeof bondProps) {
60
+ const bondState = new DialogBondState(() => props);
61
+ return new DialogBond(bondState);
62
+ }
63
+
64
+ function _animate(node: HTMLDialogElement) {
65
+ motion(
66
+ node,
67
+ {
68
+ opacity: +open
69
+ },
70
+ {
71
+ duration: DURATION.normal / 1000,
72
+ ease: 'anticipate',
73
+ onComplete: () => {
74
+ if (!open) {
75
+ node?.close?.();
76
+ }
77
+ }
78
+ }
79
+ );
80
+ }
81
+
82
+ function onclickDialogElement(ev: MouseEvent) {
83
+ if (bond?.elements?.content?.contains(ev.target)) {
84
+ return;
85
+ }
86
+
87
+ // Clicked the backdrop
88
+ bond.state.close();
89
+ }
90
+
91
+ export function getBond() {
92
+ return bond;
93
+ }
94
+ </script>
95
+
96
+ <Teleport
97
+ {as}
98
+ {bond}
99
+ preset="dialog"
100
+ portal={portal ?? 'root.l1'}
101
+ class={[
102
+ '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',
103
+ !open && 'pointer-events-none',
104
+ '$preset',
105
+ klass
106
+ ]}
107
+ enter={enter?.bind(bond.state)}
108
+ exit={exit?.bind(bond.state)}
109
+ initial={initial?.bind(bond.state)}
110
+ animate={animate?.bind(bond.state)}
111
+ onmount={onmount?.bind(bond.state)}
112
+ ondestroy={ondestroy?.bind(bond.state)}
113
+ onclick={onclickDialogElement}
114
+ oncancel={(ev) => {
115
+ ev.preventDefault();
116
+ open = false;
117
+ }}
118
+ {...rootProps}
119
+ >
120
+ <ActivePortal portal={portal ?? 'root.l1'}>
121
+ {@render children?.({ dialog: bond })}
122
+ </ActivePortal>
123
+ </Teleport>
@@ -1,14 +1,16 @@
1
1
  export type DialogProps<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> = HtmlAtomProps<E, B> & {
2
2
  open?: boolean;
3
3
  disabled?: boolean;
4
+ portal?: string | PortalBond;
4
5
  factory?: (props: DialogBondProps) => DialogBond;
5
6
  children?: Snippet<[{
6
7
  dialog: DialogBond;
7
8
  }]>;
8
9
  };
9
10
  import type { Snippet } from 'svelte';
10
- import { DialogBond, DialogBondState, type DialogBondProps } from './bond.svelte';
11
+ import { PortalBond } from '../portal';
11
12
  import type { HtmlAtomProps, Base } from '../atom';
13
+ import { DialogBond, DialogBondState, type DialogBondProps } from './bond.svelte';
12
14
  declare function $$render<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(): {
13
15
  props: DialogProps<E, B>;
14
16
  exports: {
@@ -34,7 +34,7 @@
34
34
  {as}
35
35
  {bond}
36
36
  preset="dialog.title"
37
- class={['$preset', klass]}
37
+ class={['border-border', '$preset', klass]}
38
38
  enter={enter?.bind(bond.state)}
39
39
  exit={exit?.bind(bond.state)}
40
40
  initial={initial?.bind(bond.state)}
@@ -36,7 +36,7 @@
36
36
  <HtmlAtom
37
37
  {bond}
38
38
  preset="drawer.backdrop"
39
- class={['absolute inset-0 z-0 bg-black/30', '$preset', klass]}
39
+ class={['border-border absolute inset-0 z-0 bg-black/30', '$preset', klass]}
40
40
  onmount={onmount?.bind(bond.state)}
41
41
  ondestroy={ondestroy?.bind(bond.state)}
42
42
  enter={enter?.bind(bond.state)}
@@ -43,7 +43,7 @@
43
43
  <HtmlAtom
44
44
  {bond}
45
45
  preset="drawer.body"
46
- class={['$preset', klass]}
46
+ class={['border-border', '$preset', klass]}
47
47
  onmount={onmount?.bind(bond.state)}
48
48
  ondestroy={ondestroy?.bind(bond.state)}
49
49
  enter={enter?.bind(bond.state)}
@@ -44,7 +44,7 @@
44
44
  {as}
45
45
  {bond}
46
46
  preset="drawer.description"
47
- class={['$preset', klass]}
47
+ class={['border-border', '$preset', klass]}
48
48
  onmount={onmount?.bind(bond.state)}
49
49
  ondestroy={ondestroy?.bind(bond.state)}
50
50
  enter={enter?.bind(bond.state)}
@@ -41,7 +41,7 @@
41
41
 
42
42
  <HtmlAtom
43
43
  {bond}
44
- class={['$preset', klass]}
44
+ class={['border-border', '$preset', klass]}
45
45
  onmount={onmount?.bind(bond.state)}
46
46
  ondestroy={ondestroy?.bind(bond.state)}
47
47
  enter={enter?.bind(bond.state)}
@@ -42,7 +42,7 @@
42
42
  <HtmlAtom
43
43
  {bond}
44
44
  preset="drawer.header"
45
- class={['$preset', klass]}
45
+ class={['border-border', '$preset', klass]}
46
46
  onmount={onmount?.bind(bond.state)}
47
47
  ondestroy={ondestroy?.bind(bond.state)}
48
48
  enter={enter?.bind(bond.state)}