@svelte-atoms/core 1.0.0-alpha.30 → 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 (221) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +176 -739
  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 -61
  6. package/dist/components/accordion/accordion.stories.svelte +70 -145
  7. package/dist/components/accordion/item/accordion-item-body.svelte +6 -4
  8. package/dist/components/accordion/item/accordion-item-header.svelte +2 -1
  9. package/dist/components/accordion/item/accordion-item-indicator.svelte +2 -1
  10. package/dist/components/accordion/item/accordion-item-root.svelte +2 -1
  11. package/dist/components/accordion/item/bond.svelte.d.ts +2 -0
  12. package/dist/components/accordion/item/index.d.ts +3 -0
  13. package/dist/components/accordion/item/index.js +3 -0
  14. package/dist/components/accordion/item/motion.svelte.d.ts +15 -0
  15. package/dist/components/accordion/item/motion.svelte.js +30 -0
  16. package/dist/components/accordion/item/types.d.ts +7 -24
  17. package/dist/components/alert/alert-close-button.svelte +32 -36
  18. package/dist/components/alert/alert-description.svelte +1 -1
  19. package/dist/components/alert/alert-description.svelte.d.ts +3 -6
  20. package/dist/components/alert/alert-root.svelte +3 -38
  21. package/dist/components/alert/alert-root.svelte.d.ts +2 -2
  22. package/dist/components/alert/alert.stories.svelte +400 -400
  23. package/dist/components/alert/bond.svelte.d.ts +0 -13
  24. package/dist/components/alert/bond.svelte.js +0 -32
  25. package/dist/components/alert/types.d.ts +8 -32
  26. package/dist/components/atom/html-atom.svelte +93 -261
  27. package/dist/components/atom/types.d.ts +3 -2
  28. package/dist/components/atom/utils.d.ts +37 -0
  29. package/dist/components/atom/utils.js +208 -0
  30. package/dist/components/avatar/avatar.stories.svelte +22 -22
  31. package/dist/components/badge/badge.stories.svelte +12 -12
  32. package/dist/components/badge/badge.svelte +19 -19
  33. package/dist/components/breadcrumb/breadcrumb-item.svelte +1 -1
  34. package/dist/components/breadcrumb/breadcrumb-separator.svelte +5 -1
  35. package/dist/components/breadcrumb/breadcrumb.stories.svelte +16 -16
  36. package/dist/components/button/button.stories.svelte +27 -27
  37. package/dist/components/calendar/calendar-day.svelte +9 -4
  38. package/dist/components/calendar/calendar.stories.svelte +26 -26
  39. package/dist/components/card/card-body.svelte +39 -39
  40. package/dist/components/card/card-footer.svelte +41 -41
  41. package/dist/components/card/card-root.svelte +91 -91
  42. package/dist/components/card/card.stories.svelte +133 -133
  43. package/dist/components/checkbox/checkbox.stories.svelte +22 -22
  44. package/dist/components/checkbox/checkbox.svelte +159 -155
  45. package/dist/components/collapsible/bond.svelte.js +2 -1
  46. package/dist/components/collapsible/collapsible-body.svelte +3 -2
  47. package/dist/components/collapsible/collapsible.stories.svelte +172 -172
  48. package/dist/components/collapsible/motion.svelte.d.ts +6 -0
  49. package/dist/components/collapsible/motion.svelte.js +15 -0
  50. package/dist/components/combobox/atoms.d.ts +3 -3
  51. package/dist/components/combobox/atoms.js +3 -3
  52. package/dist/components/combobox/bond.svelte.d.ts +6 -6
  53. package/dist/components/combobox/bond.svelte.js +3 -26
  54. package/dist/components/combobox/combobox-control.svelte +52 -52
  55. package/dist/components/combobox/{compobox-item.svelte → combobox-item.svelte} +62 -68
  56. package/dist/components/combobox/combobox-item.svelte.d.ts +12 -0
  57. package/dist/components/combobox/combobox-root.svelte +65 -65
  58. package/dist/components/combobox/combobox.stories.svelte +50 -0
  59. package/dist/components/combobox/combobox.stories.svelte.d.ts +3 -0
  60. package/dist/components/combobox/index.d.ts +1 -0
  61. package/dist/components/container/container.stories.svelte +20 -20
  62. package/dist/components/container/container.svelte.d.ts +1 -1
  63. package/dist/components/datagrid/datagrid.stories.svelte +72 -72
  64. package/dist/components/datagrid/tr/bond.svelte.d.ts +4 -2
  65. package/dist/components/datagrid/tr/bond.svelte.js +9 -7
  66. package/dist/components/datagrid/tr/datagrid-tr.svelte +9 -7
  67. package/dist/components/date-picker/bond.svelte.d.ts +15 -5
  68. package/dist/components/date-picker/bond.svelte.js +5 -11
  69. package/dist/components/date-picker/date-picker-calendar.svelte +2 -2
  70. package/dist/components/date-picker/date-picker-root.svelte +95 -95
  71. package/dist/components/date-picker/date-picker.stories.svelte +35 -35
  72. package/dist/components/dialog/bond.svelte.d.ts +13 -3
  73. package/dist/components/dialog/bond.svelte.js +52 -6
  74. package/dist/components/dialog/dialog-content.svelte +2 -20
  75. package/dist/components/dialog/dialog-root.svelte +3 -22
  76. package/dist/components/dialog/dialog.stories.svelte +64 -64
  77. package/dist/components/dialog/motion.svelte.d.ts +13 -0
  78. package/dist/components/dialog/motion.svelte.js +44 -0
  79. package/dist/components/drawer/attachments.svelte.d.ts +1 -1
  80. package/dist/components/drawer/attachments.svelte.js +1 -3
  81. package/dist/components/drawer/bond.svelte.d.ts +30 -9
  82. package/dist/components/drawer/bond.svelte.js +80 -24
  83. package/dist/components/drawer/drawer-content.svelte +49 -57
  84. package/dist/components/drawer/drawer-root.svelte +5 -4
  85. package/dist/components/drawer/drawer.stories.svelte +141 -212
  86. package/dist/components/drawer/index.d.ts +2 -0
  87. package/dist/components/drawer/index.js +2 -0
  88. package/dist/components/drawer/motion.d.ts +15 -0
  89. package/dist/components/drawer/motion.js +28 -0
  90. package/dist/components/dropdown/atoms.d.ts +1 -1
  91. package/dist/components/dropdown/atoms.js +1 -1
  92. package/dist/components/dropdown/bond.svelte.d.ts +22 -19
  93. package/dist/components/dropdown/bond.svelte.js +29 -53
  94. package/dist/components/dropdown/dropdown-root.svelte +7 -1
  95. package/dist/components/dropdown/dropdown-values.svelte +17 -17
  96. package/dist/components/dropdown/dropdown-values.svelte.d.ts +1 -2
  97. package/dist/components/dropdown/dropdown.stories.svelte +13 -10
  98. package/dist/components/dropdown/index.d.ts +2 -0
  99. package/dist/components/dropdown/index.js +1 -0
  100. package/dist/components/dropdown/item/attachments.svelte.d.ts +2 -2
  101. package/dist/components/dropdown/item/attachments.svelte.js +2 -2
  102. package/dist/components/dropdown/item/controller.svelte.d.ts +34 -0
  103. package/dist/components/dropdown/item/controller.svelte.js +82 -0
  104. package/dist/components/dropdown/item/dropdown-item.svelte +109 -102
  105. package/dist/components/dropdown/item/dropdown-item.svelte.d.ts +13 -28
  106. package/dist/components/dropdown/item/index.d.ts +3 -0
  107. package/dist/components/dropdown/item/index.js +3 -0
  108. package/dist/components/dropdown/item/types.d.ts +29 -0
  109. package/dist/components/dropdown/item/types.js +1 -0
  110. package/dist/components/form/form.stories.svelte +96 -96
  111. package/dist/components/image/image.stories.svelte +20 -20
  112. package/dist/components/input/input.stories.svelte +35 -35
  113. package/dist/components/label/label.stories.svelte +15 -15
  114. package/dist/components/lazy/lazy.stories.svelte +28 -28
  115. package/dist/components/link/link.stories.svelte +15 -15
  116. package/dist/components/list/list-item.svelte +2 -2
  117. package/dist/components/menu/atoms.d.ts +9 -3
  118. package/dist/components/menu/atoms.js +9 -3
  119. package/dist/components/menu/bond.svelte.d.ts +54 -0
  120. package/dist/components/menu/bond.svelte.js +132 -0
  121. package/dist/components/menu/index.d.ts +3 -1
  122. package/dist/components/menu/index.js +2 -1
  123. package/dist/components/menu/item/controller.svelte.d.ts +26 -0
  124. package/dist/components/menu/item/controller.svelte.js +69 -0
  125. package/dist/components/menu/item/index.d.ts +2 -0
  126. package/dist/components/menu/item/index.js +2 -0
  127. package/dist/components/menu/item/menu-item.svelte +103 -0
  128. package/dist/components/menu/item/menu-item.svelte.d.ts +31 -0
  129. package/dist/components/menu/item/types.d.ts +62 -0
  130. package/dist/components/menu/item/types.js +1 -0
  131. package/dist/components/menu/{menu-list.svelte → menu-content.svelte} +40 -40
  132. package/dist/components/menu/{menu-list.svelte.d.ts → menu-content.svelte.d.ts} +3 -3
  133. package/dist/components/menu/menu-root.svelte +15 -0
  134. package/dist/components/menu/menu-root.svelte.d.ts +8 -0
  135. package/dist/components/menu/menu.stories.svelte +5 -5
  136. package/dist/components/menu/types.d.ts +0 -7
  137. package/dist/components/popover/bond.svelte.d.ts +18 -8
  138. package/dist/components/popover/bond.svelte.js +76 -40
  139. package/dist/components/popover/motion.d.ts +6 -0
  140. package/dist/components/popover/motion.js +56 -0
  141. package/dist/components/popover/popover-arrow.svelte +111 -111
  142. package/dist/components/popover/popover-content.svelte +137 -175
  143. package/dist/components/popover/popover-indicator.svelte +44 -44
  144. package/dist/components/popover/popover-root.svelte +48 -48
  145. package/dist/components/popover/popover.stories.svelte +37 -49
  146. package/dist/components/popover/types.d.ts +9 -7
  147. package/dist/components/portal/active-portal.svelte +12 -5
  148. package/dist/components/portal/active-portal.svelte.d.ts +2 -9
  149. package/dist/components/portal/portal-root.svelte +1 -8
  150. package/dist/components/portal/portal-root.svelte.d.ts +4 -6
  151. package/dist/components/portal/teleport.svelte +1 -2
  152. package/dist/components/portal/teleport.svelte.d.ts +3 -4
  153. package/dist/components/qr-code/qr-code.stories.svelte +18 -18
  154. package/dist/components/radio/radio-group.stories.svelte +41 -41
  155. package/dist/components/radio/radio.stories.svelte +17 -17
  156. package/dist/components/radio/radio.svelte +109 -109
  157. package/dist/components/radio/types.d.ts +98 -0
  158. package/dist/components/radio/types.js +2 -0
  159. package/dist/components/root/index.d.ts +1 -0
  160. package/dist/components/root/index.js +1 -0
  161. package/dist/components/root/l0-portal.svelte +8 -0
  162. package/dist/components/{radio/types.svelte.d.ts → root/l0-portal.svelte.d.ts} +3 -3
  163. package/dist/components/root/l1-portal.svelte +7 -0
  164. package/dist/components/root/l1-portal.svelte.d.ts +26 -0
  165. package/dist/components/root/root.css +119 -119
  166. package/dist/components/root/root.svelte +26 -44
  167. package/dist/components/root/root.svelte.d.ts +2 -6
  168. package/dist/components/root/toasts-portal.svelte +7 -0
  169. package/dist/components/root/toasts-portal.svelte.d.ts +26 -0
  170. package/dist/components/root/types.d.ts +17 -0
  171. package/dist/components/scrollable/scrollable-root.svelte.d.ts +2 -2
  172. package/dist/components/scrollable/scrollable.stories.svelte +116 -116
  173. package/dist/components/sidebar/index.d.ts +2 -0
  174. package/dist/components/sidebar/index.js +2 -0
  175. package/dist/components/sidebar/motion.svelte.d.ts +11 -0
  176. package/dist/components/sidebar/motion.svelte.js +16 -0
  177. package/dist/components/sidebar/sidebar-content.svelte +40 -50
  178. package/dist/components/sidebar/sidebar-root.svelte +39 -39
  179. package/dist/components/sidebar/sidebar.stories.svelte +43 -43
  180. package/dist/components/sidebar/types.d.ts +2 -12
  181. package/dist/components/tabs/tabs.stories.svelte +56 -56
  182. package/dist/components/textarea/atoms.d.ts +1 -0
  183. package/dist/components/textarea/atoms.js +1 -0
  184. package/dist/components/textarea/textarea-input.svelte +4 -1
  185. package/dist/components/textarea/textarea-root.svelte +2 -2
  186. package/dist/components/textarea/textarea-root.svelte.d.ts +2 -0
  187. package/dist/components/tooltip/tooltip-trigger.svelte +39 -39
  188. package/dist/components/tooltip/tooltip-trigger.svelte.d.ts +1 -0
  189. package/dist/components/tooltip/tooltip.stories.svelte +32 -32
  190. package/dist/components/tree/index.d.ts +1 -0
  191. package/dist/components/tree/index.js +1 -0
  192. package/dist/components/tree/motion.svelte.d.ts +6 -0
  193. package/dist/components/tree/motion.svelte.js +14 -0
  194. package/dist/components/tree/tree-body.svelte +4 -3
  195. package/dist/components/tree/tree.stories.svelte +142 -142
  196. package/dist/context/preset.svelte.d.ts +3 -1
  197. package/dist/icons/icon-copy.svelte +6 -0
  198. package/dist/icons/icon-copy.svelte.d.ts +26 -0
  199. package/dist/utils/dom.svelte.d.ts +2 -0
  200. package/dist/utils/dom.svelte.js +21 -0
  201. package/dist/utils/function.d.ts +1 -1
  202. package/dist/utils/promise.svelte.d.ts +5 -0
  203. package/dist/utils/promise.svelte.js +20 -0
  204. package/package.json +4 -3
  205. package/dist/components/combobox/compobox-item.svelte.d.ts +0 -34
  206. package/dist/components/combobox/compobox.stories.svelte +0 -51
  207. package/dist/components/combobox/compobox.stories.svelte.d.ts +0 -3
  208. package/dist/components/dropdown/item/bond.svelte.d.ts +0 -42
  209. package/dist/components/dropdown/item/bond.svelte.js +0 -99
  210. package/dist/components/menu/menu-item.svelte +0 -51
  211. package/dist/components/menu/menu-item.svelte.d.ts +0 -36
  212. package/dist/components/radio/types.svelte +0 -0
  213. package/llm/composition.md +0 -395
  214. package/llm/crafting.md +0 -838
  215. package/llm/motion.md +0 -970
  216. package/llm/philosophy.md +0 -23
  217. package/llm/preset-variant-integration.md +0 -516
  218. package/llm/preset.md +0 -383
  219. package/llm/styling.md +0 -216
  220. package/llm/usage.md +0 -46
  221. package/llm/variants.md +0 -1259
@@ -0,0 +1,6 @@
1
+ export type AnimatePopoverContentParams = {
2
+ duration?: number;
3
+ delay?: number;
4
+ ease?: string;
5
+ };
6
+ export declare function animateTreeBody(params?: AnimatePopoverContentParams): (node: HTMLElement) => void;
@@ -0,0 +1,14 @@
1
+ import { animate } from 'motion';
2
+ import { TreeBond } from './bond.svelte';
3
+ export function animateTreeBody(params = {}) {
4
+ const bond = TreeBond.get();
5
+ return (node) => {
6
+ const { delay = 0, duration = 0.1, ease } = params;
7
+ const isOpen = bond?.state.props.open ?? false;
8
+ animate(node, {
9
+ height: +isOpen ? 'auto' : 0,
10
+ opacity: +isOpen,
11
+ pointerEvents: isOpen ? '' : 'none'
12
+ }, { duration, delay, ease });
13
+ };
14
+ }
@@ -1,7 +1,8 @@
1
1
  <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
2
- import { TreeBond } from './bond.svelte';
3
2
  import { HtmlAtom, type Base } from '../atom';
3
+ import { TreeBond } from './bond.svelte';
4
4
  import type { TreeBodyProps } from './types';
5
+ import { animateTreeBody } from './motion.svelte';
5
6
 
6
7
  const bond = TreeBond.get();
7
8
 
@@ -10,10 +11,10 @@
10
11
  children = undefined,
11
12
  onmount = undefined,
12
13
  ondestroy = undefined,
13
- animate = undefined,
14
+ animate = animateTreeBody(),
14
15
  enter = undefined,
15
16
  exit = undefined,
16
- initial = undefined,
17
+ initial = animateTreeBody({ duration: 0 }),
17
18
  ...restProps
18
19
  }: TreeBodyProps<E, B> = $props();
19
20
 
@@ -1,142 +1,142 @@
1
- <script module>
2
- import { untrack } from 'svelte';
3
- import { animate } from 'motion';
4
- import { RenderScan } from 'svelte-render-scan';
5
- import { defineMeta } from '@storybook/addon-svelte-csf';
6
- import { dev } from '$app/environment';
7
- import { Tree as Tree_ } from '.';
8
- import { tree } from './attachments.svelte';
9
- import { TreeBond } from './bond.svelte';
10
-
11
- // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
12
- const { Story } = defineMeta({
13
- title: 'Atoms/Tree',
14
- // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
15
-
16
- parameters: {
17
- // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout
18
- layout: 'fullscreen'
19
- },
20
- args: {}
21
- });
22
- </script>
23
-
24
- <script lang="ts">
25
- let open = $state(true);
26
- </script>
27
-
28
- <Story name="Tree" args={{}}>
29
- <Tree_.Root class="" bind:open>
30
- {#if dev}
31
- <RenderScan duration={300} />
32
- {/if}
33
-
34
- <Tree_.Header>Vehicles</Tree_.Header>
35
-
36
- <Tree_.Body
37
- class="border-l border-l-neutral-200"
38
- onmount={(node) => {
39
- const bond = TreeBond.get();
40
- const isOpen = untrack(() => bond?.state.props.open ?? false);
41
- animate(node, { height: +isOpen ? 'auto' : 0, opacity: +isOpen }, { duration: 0 });
42
- }}
43
- {@attach tree((node, bond) => {
44
- const isOpen = bond?.state.props.open ?? false;
45
- animate(
46
- node,
47
- {
48
- height: +isOpen ? 'auto' : 0,
49
- opacity: +isOpen,
50
- pointerEvents: isOpen ? 'all' : 'none'
51
- },
52
- { duration: 0.1 }
53
- );
54
- })}
55
- >
56
- <Tree_.Root>
57
- <Tree_.Header>Cars</Tree_.Header>
58
- <Tree_.Body
59
- class="border-l border-l-neutral-200"
60
- onmount={(node) => {
61
- const bond = TreeBond.get();
62
- const isOpen = bond?.state.props.open ?? false;
63
- animate(node, { height: +isOpen ? 'auto' : 0, opacity: +isOpen }, { duration: 0 });
64
- }}
65
- animate={(node) => {
66
- const bond = TreeBond.get();
67
- const isOpen = bond?.state.props.open ?? false;
68
- animate(
69
- node,
70
- {
71
- height: +isOpen ? 'auto' : 0,
72
- opacity: +isOpen,
73
- pointerEvents: isOpen ? 'all' : 'none'
74
- },
75
- { duration: 0.1 }
76
- );
77
- }}
78
- >
79
- Mauris et habitasse cubilia potenti at condimentum iaculis nam. Ante fusce litora
80
- tristique letius libero. Curabitur vitae cursus consectetur feugiat aenean viverra vel
81
- dolor diam nascetur.
82
- </Tree_.Body>
83
- </Tree_.Root>
84
-
85
- <Tree_.Root>
86
- <Tree_.Header>Trucks</Tree_.Header>
87
- <Tree_.Body
88
- class="border-l border-l-neutral-200"
89
- onmount={(node) => {
90
- const bond = TreeBond.get();
91
- const isOpen = bond?.state.props.open ?? false;
92
- animate(node, { height: +isOpen ? 'auto' : 0, opacity: +isOpen }, { duration: 0 });
93
- }}
94
- {@attach tree((node, bond) => {
95
- const isOpen = bond?.state.props.open ?? false;
96
- animate(
97
- node,
98
- {
99
- height: +isOpen ? 'auto' : 0,
100
- opacity: +isOpen,
101
- pointerEvents: isOpen ? 'all' : 'none'
102
- },
103
- { duration: 0.1 }
104
- );
105
- })}
106
- >
107
- Mauris et habitasse cubilia potenti at condimentum iaculis nam. Ante fusce litora
108
- tristique letius libero. Curabitur vitae cursus consectetur feugiat aenean viverra vel
109
- dolor diam nascetur.
110
- </Tree_.Body>
111
- </Tree_.Root>
112
-
113
- <Tree_.Root>
114
- <Tree_.Header>Bikes</Tree_.Header>
115
- <Tree_.Body
116
- class="border-l border-l-neutral-200"
117
- onmount={(node) => {
118
- const bond = TreeBond.get();
119
- const isOpen = untrack(() => bond?.state.props.open ?? false);
120
- animate(node, { height: +isOpen ? 'auto' : 0, opacity: +isOpen }, { duration: 0 });
121
- }}
122
- {@attach tree((node, bond) => {
123
- const isOpen = bond?.state.props.open ?? false;
124
- animate(
125
- node,
126
- {
127
- height: +isOpen ? 'auto' : 0,
128
- opacity: +isOpen,
129
- pointerEvents: isOpen ? 'all' : 'none'
130
- },
131
- { duration: 0.1 }
132
- );
133
- })}
134
- >
135
- Mauris et habitasse cubilia potenti at condimentum iaculis nam. Ante fusce litora
136
- tristique letius libero. Curabitur vitae cursus consectetur feugiat aenean viverra vel
137
- dolor diam nascetur.
138
- </Tree_.Body>
139
- </Tree_.Root>
140
- </Tree_.Body>
141
- </Tree_.Root>
142
- </Story>
1
+ <script module>
2
+ import { untrack } from 'svelte';
3
+ import { animate } from 'motion';
4
+ import { RenderScan } from 'svelte-render-scan';
5
+ import { defineMeta } from '@storybook/addon-svelte-csf';
6
+ import { dev } from '$app/environment';
7
+ import { Tree as Tree_ } from '.';
8
+ import { tree } from './attachments.svelte';
9
+ import { TreeBond } from './bond.svelte';
10
+
11
+ // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
12
+ const { Story } = defineMeta({
13
+ title: 'Atoms/Tree',
14
+ // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
15
+
16
+ parameters: {
17
+ // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout
18
+ layout: 'fullscreen'
19
+ },
20
+ args: {}
21
+ });
22
+ </script>
23
+
24
+ <script lang="ts">
25
+ let open = $state(true);
26
+ </script>
27
+
28
+ <Story name="Tree" args={{}}>
29
+ <Tree_.Root class="" bind:open>
30
+ {#if dev}
31
+ <RenderScan duration={300} />
32
+ {/if}
33
+
34
+ <Tree_.Header>Vehicles</Tree_.Header>
35
+
36
+ <Tree_.Body
37
+ class="border-l border-l-neutral-200"
38
+ onmount={(node) => {
39
+ const bond = TreeBond.get();
40
+ const isOpen = untrack(() => bond?.state.props.open ?? false);
41
+ animate(node, { height: +isOpen ? 'auto' : 0, opacity: +isOpen }, { duration: 0 });
42
+ }}
43
+ {@attach tree((node, bond) => {
44
+ const isOpen = bond?.state.props.open ?? false;
45
+ animate(
46
+ node,
47
+ {
48
+ height: +isOpen ? 'auto' : 0,
49
+ opacity: +isOpen,
50
+ pointerEvents: isOpen ? 'all' : 'none'
51
+ },
52
+ { duration: 0.1 }
53
+ );
54
+ })}
55
+ >
56
+ <Tree_.Root>
57
+ <Tree_.Header>Cars</Tree_.Header>
58
+ <Tree_.Body
59
+ class="border-l border-l-neutral-200"
60
+ onmount={(node) => {
61
+ const bond = TreeBond.get();
62
+ const isOpen = bond?.state.props.open ?? false;
63
+ animate(node, { height: +isOpen ? 'auto' : 0, opacity: +isOpen }, { duration: 0 });
64
+ }}
65
+ animate={(node) => {
66
+ const bond = TreeBond.get();
67
+ const isOpen = bond?.state.props.open ?? false;
68
+ animate(
69
+ node,
70
+ {
71
+ height: +isOpen ? 'auto' : 0,
72
+ opacity: +isOpen,
73
+ pointerEvents: isOpen ? 'all' : 'none'
74
+ },
75
+ { duration: 0.1 }
76
+ );
77
+ }}
78
+ >
79
+ Mauris et habitasse cubilia potenti at condimentum iaculis nam. Ante fusce litora
80
+ tristique letius libero. Curabitur vitae cursus consectetur feugiat aenean viverra vel
81
+ dolor diam nascetur.
82
+ </Tree_.Body>
83
+ </Tree_.Root>
84
+
85
+ <Tree_.Root>
86
+ <Tree_.Header>Trucks</Tree_.Header>
87
+ <Tree_.Body
88
+ class="border-l border-l-neutral-200"
89
+ onmount={(node) => {
90
+ const bond = TreeBond.get();
91
+ const isOpen = bond?.state.props.open ?? false;
92
+ animate(node, { height: +isOpen ? 'auto' : 0, opacity: +isOpen }, { duration: 0 });
93
+ }}
94
+ {@attach tree((node, bond) => {
95
+ const isOpen = bond?.state.props.open ?? false;
96
+ animate(
97
+ node,
98
+ {
99
+ height: +isOpen ? 'auto' : 0,
100
+ opacity: +isOpen,
101
+ pointerEvents: isOpen ? 'all' : 'none'
102
+ },
103
+ { duration: 0.1 }
104
+ );
105
+ })}
106
+ >
107
+ Mauris et habitasse cubilia potenti at condimentum iaculis nam. Ante fusce litora
108
+ tristique letius libero. Curabitur vitae cursus consectetur feugiat aenean viverra vel
109
+ dolor diam nascetur.
110
+ </Tree_.Body>
111
+ </Tree_.Root>
112
+
113
+ <Tree_.Root>
114
+ <Tree_.Header>Bikes</Tree_.Header>
115
+ <Tree_.Body
116
+ class="border-l border-l-neutral-200"
117
+ onmount={(node) => {
118
+ const bond = TreeBond.get();
119
+ const isOpen = untrack(() => bond?.state.props.open ?? false);
120
+ animate(node, { height: +isOpen ? 'auto' : 0, opacity: +isOpen }, { duration: 0 });
121
+ }}
122
+ {@attach tree((node, bond) => {
123
+ const isOpen = bond?.state.props.open ?? false;
124
+ animate(
125
+ node,
126
+ {
127
+ height: +isOpen ? 'auto' : 0,
128
+ opacity: +isOpen,
129
+ pointerEvents: isOpen ? 'all' : 'none'
130
+ },
131
+ { duration: 0.1 }
132
+ );
133
+ })}
134
+ >
135
+ Mauris et habitasse cubilia potenti at condimentum iaculis nam. Ante fusce litora
136
+ tristique letius libero. Curabitur vitae cursus consectetur feugiat aenean viverra vel
137
+ dolor diam nascetur.
138
+ </Tree_.Body>
139
+ </Tree_.Root>
140
+ </Tree_.Body>
141
+ </Tree_.Root>
142
+ </Story>
@@ -1,7 +1,8 @@
1
1
  import type { ClassValue } from 'svelte/elements';
2
2
  import type { Base } from '../components/atom';
3
3
  import type { Bond } from '../shared';
4
- export type PresetModuleName = 'accordion' | 'accordion.item.body' | 'accordion.item.header' | 'accordion.item.indicator' | 'accordion.item' | 'alert.actions' | 'alert.close-button' | 'alert.content' | 'alert.description' | 'alert.icon' | 'alert' | 'alert.title' | 'card.content' | 'card.description' | 'card.footer' | 'card.header' | 'card.media' | 'card' | 'card.subtitle' | 'card.title' | 'collapsible.body' | 'collapsible.header' | 'collapsible.indicator' | 'collapsible' | 'combobox.control' | 'combobox.trigger' | 'combobox.item' | 'dialog.close-button' | 'dialog.body' | 'dialog.content' | 'dialog.description' | 'dialog.footer' | 'dialog.header' | 'dialog' | 'dialog.title' | 'divider' | 'dropdown.placeholder' | 'dropdown.query' | 'dropdown.trigger' | 'dropdown.value' | 'dropdown' | 'field.control' | 'field.label' | 'field' | 'form' | 'icon' | 'input' | 'input.control' | 'input.placeholder' | 'label' | 'layer.inner' | 'layer' | 'link' | 'list.divider' | 'list.group' | 'list.item' | 'list.item' | 'list.item' | 'dropdown.item' | 'menu.body' | 'popover.arrow' | 'popover.indicator' | 'popover.content' | 'popover.trigger' | 'portal.inner' | 'portal' | 'root' | 'root.portals' | 'sidebar.content' | 'sidebar' | 'drawer.backdrop' | 'drawer.body' | 'drawer.content' | 'drawer.description' | 'drawer.title' | 'drawer.footer' | 'drawer.header' | 'drawer' | 'stack.root' | 'stack.item' | 'tabs.body' | 'tabs.header' | 'tabs' | 'tab.header' | 'tab.body' | 'tab.description' | 'tab' | 'tree.body' | 'tree.header' | 'tree.indicator' | 'tree' | 'datagrid' | 'datagrid.header' | 'datagrid.th' | 'datagrid.body' | 'datagrid.tr' | 'datagrid.td' | 'datagrid.footer' | 'datagrid.checkbox' | 'datagrid.sort-icon' | 'scrollable' | 'scrollable.container' | 'scrollable.content' | 'scrollable.track' | 'scrollable.thumb' | 'breadcrumb' | 'breadcrumb.item' | 'breadcrumb.separator' | 'badge' | 'button' | 'checkbox' | 'checkbox.checkmark' | 'checkbox.indeterminate' | 'radio' | 'radio.group' | 'container' | 'calendar' | 'calendar.day' | 'calendar.header' | 'calendar.weekday' | 'calendar.body' | 'datepicker.trigger' | 'datepicker.calendar' | 'datepicker.years' | 'datepicker.months' | 'datepicker.header';
4
+ import type { Attachment } from 'svelte/attachments';
5
+ export type PresetModuleName = 'accordion' | 'accordion.item.body' | 'accordion.item.header' | 'accordion.item.indicator' | 'accordion.item' | 'alert.actions' | 'alert.close-button' | 'alert.content' | 'alert.description' | 'alert.icon' | 'alert' | 'alert.title' | 'card.content' | 'card.description' | 'card.footer' | 'card.header' | 'card.body' | 'card.media' | 'card' | 'card.subtitle' | 'card.title' | 'collapsible.body' | 'collapsible.header' | 'collapsible.indicator' | 'collapsible' | 'combobox.control' | 'combobox.trigger' | 'combobox.item' | 'dialog.close-button' | 'dialog.body' | 'dialog.content' | 'dialog.description' | 'dialog.footer' | 'dialog.header' | 'dialog' | 'dialog.title' | 'divider' | 'dropdown.placeholder' | 'dropdown.query' | 'dropdown.trigger' | 'dropdown.value' | 'dropdown' | 'field.control' | 'field.label' | 'field' | 'form' | 'icon' | 'input' | 'input.control' | 'input.placeholder' | 'label' | 'layer.inner' | 'layer' | 'link' | 'list.divider' | 'list.group' | 'list.item' | 'list.item' | 'list.item' | 'dropdown.item' | 'menu.content' | 'popover.arrow' | 'popover.indicator' | 'popover.content' | 'popover.trigger' | 'portal.inner' | 'portal' | 'root' | 'root.portals' | 'sidebar.content' | 'sidebar' | 'drawer.backdrop' | 'drawer.body' | 'drawer.content' | 'drawer.description' | 'drawer.title' | 'drawer.footer' | 'drawer.header' | 'drawer' | 'stack.root' | 'stack.item' | 'tabs.body' | 'tabs.header' | 'tabs' | 'tab.header' | 'tab.body' | 'tab.description' | 'tab' | 'tree.body' | 'tree.header' | 'tree.indicator' | 'tree' | 'datagrid' | 'datagrid.header' | 'datagrid.th' | 'datagrid.body' | 'datagrid.tr' | 'datagrid.td' | 'datagrid.footer' | 'datagrid.checkbox' | 'datagrid.sort-icon' | 'scrollable' | 'scrollable.container' | 'scrollable.content' | 'scrollable.track' | 'scrollable.thumb' | 'breadcrumb' | 'breadcrumb.item' | 'breadcrumb.separator' | 'badge' | 'button' | 'checkbox' | 'checkbox.checkmark' | 'checkbox.indeterminate' | 'radio' | 'radio.group' | 'container' | 'calendar' | 'calendar.day' | 'calendar.header' | 'calendar.weekday' | 'calendar.body' | 'datepicker.trigger' | 'datepicker.calendar' | 'datepicker.years' | 'datepicker.months' | 'datepicker.header';
5
6
  export interface PresetEntryRecord {
6
7
  [key: string]: unknown;
7
8
  class?: ClassValue;
@@ -10,6 +11,7 @@ export interface PresetEntryRecord {
10
11
  variants?: Record<string, Record<string, any>>;
11
12
  compounds?: Array<Record<string, any>>;
12
13
  defaults?: Record<string, any>;
14
+ attachments?: Attachment[];
13
15
  }
14
16
  export type PresetEntry = (bond: Bond | undefined | null, ...args: any[]) => PresetEntryRecord | (() => PresetEntryRecord);
15
17
  export type Preset = Record<PresetModuleName, PresetEntry>;
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-full" viewBox="0 0 24 24"
2
+ ><!-- Icon from Fluent UI System Icons by Microsoft Corporation - https://github.com/microsoft/fluentui-system-icons/blob/main/LICENSE --><path
3
+ fill="currentColor"
4
+ d="M5.503 4.627 5.5 6.75v10.504a3.25 3.25 0 0 0 3.25 3.25h8.616a2.251 2.251 0 0 1-2.122 1.5H8.75A4.75 4.75 0 0 1 4 17.254V6.75c0-.98.627-1.815 1.503-2.123M17.75 2A2.25 2.25 0 0 1 20 4.25v13a2.25 2.25 0 0 1-2.25 2.25h-9a2.25 2.25 0 0 1-2.25-2.25v-13A2.25 2.25 0 0 1 8.75 2zM7.75 17.25c0 .414.336.75.75.75h9a.75.75 0 0 0 .75-.75v-13a.75.75 0 0 0-.75-.75h-9a.75.75 0 0 0-.75.75z"
5
+ /></svg
6
+ >
@@ -0,0 +1,26 @@
1
+ export default IconCopy;
2
+ type IconCopy = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string;
8
+ };
9
+ declare const IconCopy: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -1,2 +1,4 @@
1
1
  export declare function getElementId(id: string, kind: string): string;
2
2
  export declare function isBrowser(): boolean;
3
+ export declare function focusTrap(ev: KeyboardEvent): void;
4
+ export declare function focus(element: Element | null): void;
@@ -4,3 +4,24 @@ export function getElementId(id, kind) {
4
4
  export function isBrowser() {
5
5
  return typeof window !== 'undefined' && typeof document !== 'undefined';
6
6
  }
7
+ export function focusTrap(ev) {
8
+ const node = ev.currentTarget;
9
+ // Tab trap - keep focus within popover
10
+ if (ev.key === 'Tab') {
11
+ const focusableElements = node.querySelectorAll('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])');
12
+ const firstElement = focusableElements[0];
13
+ const lastElement = focusableElements[focusableElements.length - 1];
14
+ if (ev.shiftKey && document.activeElement === firstElement) {
15
+ ev.preventDefault();
16
+ lastElement?.focus();
17
+ }
18
+ else if (!ev.shiftKey && document.activeElement === lastElement) {
19
+ ev.preventDefault();
20
+ firstElement?.focus();
21
+ }
22
+ }
23
+ }
24
+ export function focus(element) {
25
+ const firstFocusable = element?.querySelector('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])');
26
+ (firstFocusable || element)?.focus();
27
+ }
@@ -1,2 +1,2 @@
1
- export declare function call<const T = (...args: any) => any>(param: T, ...args: any[]): ReturnType<T>;
1
+ export declare function call<const T extends (...args: any) => any = (...args: any) => any>(param: T, ...args: any[]): ReturnType<T>;
2
2
  export declare function call<const T>(param: T, ...args: any[]): T;
@@ -0,0 +1,5 @@
1
+ export declare function promiseToState<T>(promise: Promise<T> | (() => Promise<T>)): {
2
+ readonly promise: Promise<T> | (() => Promise<T>);
3
+ readonly current: T | null;
4
+ refresh: () => Promise<void>;
5
+ };
@@ -0,0 +1,20 @@
1
+ import { call } from './function';
2
+ export function promiseToState(promise) {
3
+ let data = $state(null);
4
+ const refresh = async () => {
5
+ const result = (await call(promise));
6
+ data = result;
7
+ };
8
+ $effect(() => {
9
+ refresh();
10
+ });
11
+ return {
12
+ get promise() {
13
+ return promise;
14
+ },
15
+ get current() {
16
+ return data;
17
+ },
18
+ refresh
19
+ };
20
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svelte-atoms/core",
3
- "version": "1.0.0-alpha.30",
3
+ "version": "1.0.0-alpha.32",
4
4
  "description": "A modular, accessible, and extensible Svelte UI component library.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14,7 +14,7 @@
14
14
  "license": "MIT",
15
15
  "scripts": {
16
16
  "dev": "vite dev",
17
- "build": "vite build && npm run prepack",
17
+ "build": "vite build",
18
18
  "preview": "vite preview",
19
19
  "prepare": "svelte-kit sync || echo ''",
20
20
  "prepack": "svelte-kit sync && svelte-package && publint",
@@ -31,7 +31,6 @@
31
31
  },
32
32
  "files": [
33
33
  "dist",
34
- "llm",
35
34
  "!dist/**/*.test.*",
36
35
  "!dist/**/*.spec.*"
37
36
  ],
@@ -390,6 +389,7 @@
390
389
  "@storybook/addon-vitest": "^9.1.3",
391
390
  "@storybook/sveltekit": "^9.1.3",
392
391
  "@sveltejs/adapter-auto": "^6.0.0",
392
+ "@sveltejs/adapter-netlify": "^5.2.4",
393
393
  "@sveltejs/kit": "^2.22.0",
394
394
  "@sveltejs/package": "^2.0.0",
395
395
  "@sveltejs/vite-plugin-svelte": "^6.0.0",
@@ -451,6 +451,7 @@
451
451
  },
452
452
  "dependencies": {
453
453
  "@floating-ui/dom": "^1.7.0",
454
+ "@modelcontextprotocol/sdk": "^1.24.3",
454
455
  "@qrcode-js/browser": "^1.2.0",
455
456
  "clsx": "^2.1.1",
456
457
  "date-fns": "^4.1.0",
@@ -1,34 +0,0 @@
1
- import type { Base } from '../atom';
2
- declare function $$render<D, T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(): {
3
- props: {
4
- class?: string;
5
- children?: any;
6
- onmount?: any;
7
- ondestroy?: any;
8
- animate?: any;
9
- enter?: any;
10
- exit?: any;
11
- initial?: any;
12
- } & Record<string, any>;
13
- exports: {};
14
- bindings: "";
15
- slots: {};
16
- events: {};
17
- };
18
- declare class __sveltets_Render<D, T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> {
19
- props(): ReturnType<typeof $$render<D, T, B>>['props'];
20
- events(): ReturnType<typeof $$render<D, T, B>>['events'];
21
- slots(): ReturnType<typeof $$render<D, T, B>>['slots'];
22
- bindings(): "";
23
- exports(): {};
24
- }
25
- interface $$IsomorphicComponent {
26
- new <D, T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<D, T, B>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<D, T, B>['props']>, ReturnType<__sveltets_Render<D, T, B>['events']>, ReturnType<__sveltets_Render<D, T, B>['slots']>> & {
27
- $$bindings?: ReturnType<__sveltets_Render<D, T, B>['bindings']>;
28
- } & ReturnType<__sveltets_Render<D, T, B>['exports']>;
29
- <D, T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(internal: unknown, props: ReturnType<__sveltets_Render<D, T, B>['props']> & {}): ReturnType<__sveltets_Render<D, T, B>['exports']>;
30
- z_$$bindings?: ReturnType<__sveltets_Render<any, any, any>['bindings']>;
31
- }
32
- declare const CompoboxItem: $$IsomorphicComponent;
33
- type CompoboxItem<D, T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> = InstanceType<typeof CompoboxItem<D, T, B>>;
34
- export default CompoboxItem;
@@ -1,51 +0,0 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import { Combobox as ACombobox } from '.';
4
- import { Input } from '../input';
5
- import { Divider } from '../divider';
6
-
7
- // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
8
- const { Story } = defineMeta({
9
- title: 'Atoms/Combobox',
10
- // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
11
-
12
- parameters: {
13
- // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout
14
- layout: 'fullscreen'
15
- },
16
- args: {}
17
- });
18
- </script>
19
-
20
- <script lang="ts">
21
- let open = $state(false);
22
- let value = $state<string | undefined>('ar');
23
- let array = $state([
24
- { value: 'ar', label: 'Arabic' },
25
- { value: 'en', label: 'English' },
26
- { value: 'sp', label: 'Spanish' },
27
- { value: 'it', label: 'Italian' }
28
- ]);
29
- </script>
30
-
31
- <Story name="Combobox" args={{}}>
32
- <ACombobox.Root bind:open bind:value>
33
- {#snippet children({ combobox })}
34
- <ACombobox.Trigger
35
- base={Input.Root}
36
- class="h-10 min-w-sm items-center gap-0 rounded-sm p-1 transition-colors duration-200"
37
- >
38
- <Input.Icon class="text-foreground/50">$</Input.Icon>
39
- <Divider class="mx-1" vertical />
40
- <ACombobox.Input class="px-1" placeholder="Select a language" />
41
- </ACombobox.Trigger>
42
- <ACombobox.List>
43
- {#each array.filter((item) => !combobox.state.query || item.label
44
- .toLowerCase()
45
- .includes(combobox.state.query)) as item (item.value)}
46
- <ACombobox.Item value={item.value}>{item.label}</ACombobox.Item>
47
- {/each}
48
- </ACombobox.List>
49
- {/snippet}
50
- </ACombobox.Root>
51
- </Story>
@@ -1,3 +0,0 @@
1
- declare const Compobox: import("svelte").Component<Record<string, never>, {}, "">;
2
- type Compobox = ReturnType<typeof Compobox>;
3
- export default Compobox;
@@ -1,42 +0,0 @@
1
- import type { PopoverStateProps } from '../../popover/bond.svelte';
2
- import { Bond, BondState, type BondStateProps } from '../../../shared/bond.svelte';
3
- import { DropdownBond, DropdownBondState } from '../bond.svelte';
4
- export type DropdownItemBondProps<T> = BondStateProps & {
5
- value: string;
6
- selected?: string;
7
- data: T;
8
- };
9
- export type DropdownItemBondElements = {
10
- root: HTMLElement;
11
- };
12
- export declare class DropdownItemBond<T = unknown> extends Bond<DropdownItemBondProps<T>, DropdownItemBondState<T>, DropdownItemBondElements> {
13
- #private;
14
- static CONTEXT_KEY: string;
15
- constructor(state: DropdownItemBondState<T>);
16
- get value(): string;
17
- get text(): string;
18
- get dropdown(): DropdownBond<DropdownBondState<PopoverStateProps>, DropdownBondState<DropdownBondState<PopoverStateProps>>, import("..").DropdownBondElements> | undefined;
19
- mount(): () => void;
20
- unmount(): void;
21
- share(): this;
22
- root(): {
23
- [x: symbol]: (node: HTMLElement) => void;
24
- 'data-selected': boolean;
25
- };
26
- static get(): DropdownItemBond | undefined;
27
- static set(bond: DropdownItemBond): DropdownItemBond;
28
- }
29
- export declare class DropdownItemBondState<T> extends BondState<DropdownItemBondProps<T>> {
30
- #private;
31
- constructor(props: () => DropdownItemBondProps<T>);
32
- get value(): string;
33
- get data(): T;
34
- get isSelected(): boolean;
35
- set isSelected(val: boolean);
36
- get isHighlighted(): boolean;
37
- get dropdown(): DropdownBondState<DropdownBondState<PopoverStateProps>> | undefined;
38
- select(): void;
39
- unselect(): void;
40
- toggle(): void;
41
- close(): void;
42
- }