@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
@@ -1,96 +1,96 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import AForm from './form-root.svelte';
4
- import { Field } from './field';
5
- import { Input } from '../input';
6
- import { Checkbox } from '../checkbox';
7
-
8
- const { Story } = defineMeta({
9
- title: 'ATOMS/Form'
10
- });
11
- </script>
12
-
13
- <script lang="ts">
14
- import { z } from 'zod';
15
- import { ZodAdapter } from './field/validation-adapters';
16
- import { Radio, RadioGroup } from '../radio';
17
-
18
- const nameSchema = z.string().min(2).max(100);
19
-
20
- const personSchema = z.object({
21
- firstName: nameSchema,
22
- lastName: nameSchema,
23
- isAdmin: z.boolean()
24
- });
25
-
26
- type PersonSchema = z.infer<typeof personSchema>;
27
-
28
- const validator = new ZodAdapter();
29
- </script>
30
-
31
- <Story name="Form">
32
- {#snippet children({ args })}
33
- <AForm class="flex flex-col gap-2" {validator}>
34
- <div class="mb-4 flex flex-col">
35
- <h2 class="text-3xl font-semibold">Form Title</h2>
36
- <p class="text-sm text-gray-500">Form description goes here.</p>
37
- </div>
38
-
39
- <div class="flex gap-2">
40
- <Field.Root name="first name" schema={personSchema.shape.firstName}>
41
- {#snippet children({ field })}
42
- <Field.Label>First Name</Field.Label>
43
- <Input.Root>
44
- <Field.Control
45
- base={Input.Control}
46
- placeholder="Enter your first name"
47
- onblur={() => {
48
- const results = field?.state.validate();
49
- console.log(results);
50
- }}
51
- />
52
- </Input.Root>
53
- {#if field?.state?.errors?.length > 0}
54
- <div class="text-xs text-red-600">
55
- {#each field.state.errors as error}
56
- <div>{error.message}</div>
57
- {/each}
58
- </div>
59
- {/if}
60
- {/snippet}
61
- </Field.Root>
62
-
63
- <Field.Root name="last name" schema={personSchema.shape.lastName}>
64
- <Field.Label>Last Name</Field.Label>
65
- <Input.Root>
66
- <Field.Control base={Input.Control} placeholder="Enter your last name" />
67
- </Input.Root>
68
- </Field.Root>
69
- </div>
70
-
71
- <div class="flex flex-col">
72
- <Field.Root name="is admin" schema={personSchema.shape.isAdmin}>
73
- <Field.Label>Is Admin?</Field.Label>
74
- <Field.Control base={Checkbox} />
75
- </Field.Root>
76
- </div>
77
-
78
- <div class="flex flex-col">
79
- <Field.Root name="color" schema={personSchema.shape.color}>
80
- <Field.Label>Is current scheme black?</Field.Label>
81
- <Field.Control class="flex flex-col items-start text-sm" base={RadioGroup}>
82
- <div class="flex items-center gap-2">
83
- <Radio value="yes" />
84
- <div>Yes</div>
85
- </div>
86
-
87
- <div class="flex items-center gap-2">
88
- <Radio value="no" />
89
- <div>No</div>
90
- </div>
91
- </Field.Control>
92
- </Field.Root>
93
- </div>
94
- </AForm>
95
- {/snippet}
96
- </Story>
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import AForm from './form-root.svelte';
4
+ import { Field } from './field';
5
+ import { Input } from '../input';
6
+ import { Checkbox } from '../checkbox';
7
+
8
+ const { Story } = defineMeta({
9
+ title: 'ATOMS/Form'
10
+ });
11
+ </script>
12
+
13
+ <script lang="ts">
14
+ import { z } from 'zod';
15
+ import { ZodAdapter } from './field/validation-adapters';
16
+ import { Radio, RadioGroup } from '../radio';
17
+
18
+ const nameSchema = z.string().min(2).max(100);
19
+
20
+ const personSchema = z.object({
21
+ firstName: nameSchema,
22
+ lastName: nameSchema,
23
+ isAdmin: z.boolean()
24
+ });
25
+
26
+ type PersonSchema = z.infer<typeof personSchema>;
27
+
28
+ const validator = new ZodAdapter();
29
+ </script>
30
+
31
+ <Story name="Form">
32
+ {#snippet children({ args })}
33
+ <AForm class="flex flex-col gap-2" {validator}>
34
+ <div class="mb-4 flex flex-col">
35
+ <h2 class="text-3xl font-semibold">Form Title</h2>
36
+ <p class="text-sm text-gray-500">Form description goes here.</p>
37
+ </div>
38
+
39
+ <div class="flex gap-2">
40
+ <Field.Root name="first name" schema={personSchema.shape.firstName}>
41
+ {#snippet children({ field })}
42
+ <Field.Label>First Name</Field.Label>
43
+ <Input.Root>
44
+ <Field.Control
45
+ base={Input.Control}
46
+ placeholder="Enter your first name"
47
+ onblur={() => {
48
+ const results = field?.state.validate();
49
+ console.log(results);
50
+ }}
51
+ />
52
+ </Input.Root>
53
+ {#if field?.state?.errors?.length > 0}
54
+ <div class="text-xs text-red-600">
55
+ {#each field.state.errors as error}
56
+ <div>{error.message}</div>
57
+ {/each}
58
+ </div>
59
+ {/if}
60
+ {/snippet}
61
+ </Field.Root>
62
+
63
+ <Field.Root name="last name" schema={personSchema.shape.lastName}>
64
+ <Field.Label>Last Name</Field.Label>
65
+ <Input.Root>
66
+ <Field.Control base={Input.Control} placeholder="Enter your last name" />
67
+ </Input.Root>
68
+ </Field.Root>
69
+ </div>
70
+
71
+ <div class="flex flex-col">
72
+ <Field.Root name="is admin" schema={personSchema.shape.isAdmin}>
73
+ <Field.Label>Is Admin?</Field.Label>
74
+ <Field.Control base={Checkbox} />
75
+ </Field.Root>
76
+ </div>
77
+
78
+ <div class="flex flex-col">
79
+ <Field.Root name="color" schema={personSchema.shape.color}>
80
+ <Field.Label>Is current scheme black?</Field.Label>
81
+ <Field.Control class="flex flex-col items-start text-sm" base={RadioGroup}>
82
+ <div class="flex items-center gap-2">
83
+ <Radio value="yes" />
84
+ <div>Yes</div>
85
+ </div>
86
+
87
+ <div class="flex items-center gap-2">
88
+ <Radio value="no" />
89
+ <div>No</div>
90
+ </div>
91
+ </Field.Control>
92
+ </Field.Root>
93
+ </div>
94
+ </AForm>
95
+ {/snippet}
96
+ </Story>
@@ -1,20 +1,20 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import ImageCmp from './image.svelte';
4
-
5
- const { Story } = defineMeta({
6
- title: 'ATOMS/Image'
7
- });
8
- </script>
9
-
10
- <Story name="Image">
11
- {#snippet children({ args })}
12
- <ImageCmp
13
- class="h-[400px] w-[600px]"
14
- src="https://placehold.co/600x400/t"
15
- alt="Placeholder image"
16
- >
17
- <p>Failed Loading...</p>
18
- </ImageCmp>
19
- {/snippet}
20
- </Story>
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import ImageCmp from './image.svelte';
4
+
5
+ const { Story } = defineMeta({
6
+ title: 'ATOMS/Image'
7
+ });
8
+ </script>
9
+
10
+ <Story name="Image">
11
+ {#snippet children({ args })}
12
+ <ImageCmp
13
+ class="h-[400px] w-[600px]"
14
+ src="https://placehold.co/600x400/t"
15
+ alt="Placeholder image"
16
+ >
17
+ <p>Failed Loading...</p>
18
+ </ImageCmp>
19
+ {/snippet}
20
+ </Story>
@@ -1,35 +1,35 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import { Input as AInput } from '.';
4
- import { Label } from '../label';
5
-
6
- // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
7
- const { Story } = defineMeta({
8
- title: 'Atoms/Input',
9
- // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
10
-
11
- parameters: {
12
- // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout
13
- layout: 'fullscreen'
14
- },
15
- args: {}
16
- });
17
- </script>
18
-
19
- <script lang="ts">
20
- </script>
21
-
22
- <Story name="Input" args={{}}>
23
- <div class="flex flex-col">
24
- <Label for="price-input">Price</Label>
25
- <AInput.Root>
26
- <AInput.Icon class="text-foreground box-content px-0">$</AInput.Icon>
27
- <AInput.Control id="price-input" class="border-border box-content border-x px-2 py-2">
28
- <!-- -->
29
- </AInput.Control>
30
- <AInput.Icon class="text-foreground box-content px-2">.00</AInput.Icon>
31
-
32
- <AInput.Placeholder class="text-foreground/20 pl-2">Hello World</AInput.Placeholder>
33
- </AInput.Root>
34
- </div>
35
- </Story>
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import { Input as AInput } from '.';
4
+ import { Label } from '../label';
5
+
6
+ // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
7
+ const { Story } = defineMeta({
8
+ title: 'Atoms/Input',
9
+ // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
10
+
11
+ parameters: {
12
+ // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout
13
+ layout: 'fullscreen'
14
+ },
15
+ args: {}
16
+ });
17
+ </script>
18
+
19
+ <script lang="ts">
20
+ </script>
21
+
22
+ <Story name="Input" args={{}}>
23
+ <div class="flex flex-col">
24
+ <Label for="price-input">Price</Label>
25
+ <AInput.Root>
26
+ <AInput.Icon class="text-foreground box-content px-0">$</AInput.Icon>
27
+ <AInput.Control id="price-input" class="border-border box-content border-x px-2 py-2">
28
+ <!-- -->
29
+ </AInput.Control>
30
+ <AInput.Icon class="text-foreground box-content px-2">.00</AInput.Icon>
31
+
32
+ <AInput.Placeholder class="text-foreground/20 pl-2">Hello World</AInput.Placeholder>
33
+ </AInput.Root>
34
+ </div>
35
+ </Story>
@@ -1,15 +1,15 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import { default as LabelCmp } from './label.svelte';
4
-
5
- const { Story } = defineMeta({
6
- title: 'ATOMS/Label'
7
- });
8
- </script>
9
-
10
- <script>
11
- </script>
12
-
13
- <Story name="Label">
14
- <LabelCmp>Hello World</LabelCmp>
15
- </Story>
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import { default as LabelCmp } from './label.svelte';
4
+
5
+ const { Story } = defineMeta({
6
+ title: 'ATOMS/Label'
7
+ });
8
+ </script>
9
+
10
+ <script>
11
+ </script>
12
+
13
+ <Story name="Label">
14
+ <LabelCmp>Hello World</LabelCmp>
15
+ </Story>
@@ -1,28 +1,28 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
-
4
- const { Story } = defineMeta({
5
- title: 'Atoms/Lazy'
6
- });
7
- </script>
8
-
9
- <script lang="ts">
10
- import Lazy from './lazy.svelte';
11
- import { delay } from 'es-toolkit';
12
- </script>
13
-
14
- <Story name="Lazy">
15
- <Lazy
16
- promise={import('../button/button.svelte').then(async res=> {
17
- await delay(1000 * 2);
18
-
19
- return res.default;
20
- })}
21
- >
22
- Hello World
23
-
24
- {#snippet loading()}
25
- <span>Loading...</span>
26
- {/snippet}
27
- </Lazy>
28
- </Story>
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+
4
+ const { Story } = defineMeta({
5
+ title: 'Atoms/Lazy'
6
+ });
7
+ </script>
8
+
9
+ <script lang="ts">
10
+ import Lazy from './lazy.svelte';
11
+ import { delay } from 'es-toolkit';
12
+ </script>
13
+
14
+ <Story name="Lazy">
15
+ <Lazy
16
+ promise={import('../button/button.svelte').then(async res=> {
17
+ await delay(1000 * 2);
18
+
19
+ return res.default;
20
+ })}
21
+ >
22
+ Hello World
23
+
24
+ {#snippet loading()}
25
+ <span>Loading...</span>
26
+ {/snippet}
27
+ </Lazy>
28
+ </Story>
@@ -1,15 +1,15 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import LinkComponent from './link.svelte';
4
-
5
- const { Story } = defineMeta({
6
- title: 'ATOMS/Link'
7
- });
8
- </script>
9
-
10
- <script>
11
- </script>
12
-
13
- <Story name="Link">
14
- <LinkComponent>Hello World</LinkComponent>
15
- </Story>
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import LinkComponent from './link.svelte';
4
+
5
+ const { Story } = defineMeta({
6
+ title: 'ATOMS/Link'
7
+ });
8
+ </script>
9
+
10
+ <script>
11
+ </script>
12
+
13
+ <Story name="Link">
14
+ <LinkComponent>Hello World</LinkComponent>
15
+ </Story>
@@ -4,7 +4,7 @@
4
4
  let {
5
5
  class: klass = '',
6
6
  as = 'li' as T,
7
- preset: presetKey = 'list.item',
7
+ preset = 'list.item',
8
8
  children = undefined,
9
9
  ...restProps
10
10
  } = $props();
@@ -12,7 +12,7 @@
12
12
 
13
13
  <HtmlAtom
14
14
  {as}
15
- preset={presetKey}
15
+ {preset}
16
16
  class={['border-border flex w-full gap-2 px-4 py-1', '$preset', klass]}
17
17
  {...restProps}
18
18
  >
@@ -1,3 +1,9 @@
1
- export { Root, Trigger, Arrow, Indicator } from '../popover/atoms';
2
- export { default as List } from './menu-list.svelte';
3
- export { default as Item } from './menu-item.svelte';
1
+ export { default as Root } from './menu-root.svelte';
2
+ export { default as Content } from './menu-content.svelte';
3
+ /**
4
+ * @deprecated Use Menu.Content instead
5
+ */
6
+ export { default as List } from './menu-content.svelte';
7
+ export { default as Item } from './item/menu-item.svelte';
8
+ export { Trigger, Arrow, Indicator } from '../popover/atoms';
9
+ export { Divider, Group, Title } from '../list/atoms';
@@ -1,3 +1,9 @@
1
- export { Root, Trigger, Arrow, Indicator } from '../popover/atoms';
2
- export { default as List } from './menu-list.svelte';
3
- export { default as Item } from './menu-item.svelte';
1
+ export { default as Root } from './menu-root.svelte';
2
+ export { default as Content } from './menu-content.svelte';
3
+ /**
4
+ * @deprecated Use Menu.Content instead
5
+ */
6
+ export { default as List } from './menu-content.svelte';
7
+ export { default as Item } from './item/menu-item.svelte';
8
+ export { Trigger, Arrow, Indicator } from '../popover/atoms';
9
+ export { Divider, Group, Title } from '../list/atoms';
@@ -0,0 +1,54 @@
1
+ import { PopoverBond, PopoverState, type PopoverDomElements, type PopoverStateProps } from '../popover/bond.svelte';
2
+ import type { MenuItemController } from './item/controller.svelte';
3
+ export type MenuBondProps = PopoverStateProps;
4
+ export type MenuBondElements = PopoverDomElements;
5
+ export declare class MenuBond<Props extends MenuBondProps = MenuBondProps, State extends MenuBondState<Props> = MenuBondState<Props>, Elements extends MenuBondElements = MenuBondElements> extends PopoverBond<Props, State, Elements> {
6
+ constructor(state: State);
7
+ content(): {
8
+ role: string;
9
+ 'aria-activedescendant': string | undefined;
10
+ 'aria-orientation': "vertical";
11
+ onkeydown: (ev: KeyboardEvent) => void;
12
+ id: string;
13
+ 'aria-modal': boolean;
14
+ 'aria-labelledby': string;
15
+ inert: boolean | undefined;
16
+ tabindex: number;
17
+ 'data-atom': string;
18
+ 'data-kind': string;
19
+ 'data-active': boolean;
20
+ };
21
+ trigger(): {
22
+ 'aria-haspopup': "menu";
23
+ onkeydown: (ev: KeyboardEvent) => void;
24
+ id: string;
25
+ role: string;
26
+ disabled: boolean | undefined;
27
+ tabindex: number;
28
+ 'aria-expanded': boolean;
29
+ 'aria-disabled': boolean;
30
+ 'aria-controls': string;
31
+ 'data-kind': string;
32
+ onclick: (ev: PointerEvent) => void;
33
+ };
34
+ item(): {
35
+ role: string;
36
+ onkeyup: (ev: KeyboardEvent) => void;
37
+ };
38
+ static get<Props extends MenuBondProps = MenuBondProps, State extends MenuBondState<Props> = MenuBondState<Props>, Elements extends MenuBondElements = MenuBondElements>(): MenuBond<Props, State, Elements> | undefined;
39
+ static set<Props extends MenuBondProps = MenuBondProps, State extends MenuBondState<Props> = MenuBondState<Props>, Elements extends MenuBondElements = MenuBondElements>(context: MenuBond<Props, State, Elements>): MenuBond<Props, State, Elements>;
40
+ }
41
+ export declare class MenuBondState<Props extends MenuBondProps = MenuBondProps> extends PopoverState<Props> {
42
+ #private;
43
+ constructor(props: () => Props);
44
+ get items(): Map<string, MenuItemController>;
45
+ get highlightedId(): string | null;
46
+ get highlightedItem(): MenuItemController | null;
47
+ get navigation(): {
48
+ next: () => MenuItemController | null;
49
+ previous: () => MenuItemController | null;
50
+ };
51
+ mountItem(id: string, item: MenuItemController): () => void;
52
+ unmountItem(id: string): void;
53
+ item(id: string): MenuItemController | undefined;
54
+ }
@@ -0,0 +1,132 @@
1
+ import { SvelteMap, SvelteSet } from 'svelte/reactivity';
2
+ import { PopoverBond, PopoverState } from '../popover/bond.svelte';
3
+ export class MenuBond extends PopoverBond {
4
+ constructor(state) {
5
+ super(state);
6
+ }
7
+ content() {
8
+ const superProps = super.content();
9
+ const onkeydown = superProps.onkeydown;
10
+ const highlightedId = this.state.highlightedId;
11
+ return {
12
+ ...superProps,
13
+ role: 'menu',
14
+ 'aria-activedescendant': highlightedId ? `item-${highlightedId}` : undefined,
15
+ 'aria-orientation': 'vertical',
16
+ onkeydown: (ev) => {
17
+ // Call any additional onkeydown handler
18
+ onkeydown?.(ev);
19
+ if (ev.defaultPrevented)
20
+ return;
21
+ // Handle arrow key navigation
22
+ if (ev.key === 'ArrowDown') {
23
+ this.state.navigation.next();
24
+ }
25
+ if (ev.key === 'ArrowUp') {
26
+ this.state.navigation.previous();
27
+ }
28
+ }
29
+ };
30
+ }
31
+ trigger() {
32
+ const superProps = super.trigger();
33
+ return {
34
+ ...superProps,
35
+ 'aria-haspopup': 'menu',
36
+ 'onkeydown': (ev) => {
37
+ if (ev.key === 'ArrowDown') {
38
+ this.state.navigation.next();
39
+ }
40
+ if (ev.key === 'ArrowUp') {
41
+ this.state.navigation.previous();
42
+ }
43
+ if ((ev.key === 'Enter' || ev.key === ' ') && this.state.props.open && this.state.highlightedItem) {
44
+ if (ev.key === ' ') {
45
+ ev.preventDefault();
46
+ }
47
+ this.state.highlightedItem?.element?.click();
48
+ }
49
+ // Call any additional onkeydown handler
50
+ superProps.onkeydown?.(ev);
51
+ }
52
+ };
53
+ }
54
+ item() {
55
+ return {
56
+ role: 'menuitem',
57
+ onkeyup: (ev) => {
58
+ const currentTarget = ev.currentTarget;
59
+ const disabled = currentTarget.getAttribute('disabled') ||
60
+ currentTarget.getAttribute('aria-disabled') === 'true';
61
+ if (disabled)
62
+ return;
63
+ // Activate on Enter or Space
64
+ if (ev.key === 'Enter' || ev.key === ' ') {
65
+ ev.preventDefault();
66
+ // Call the click handler if provided
67
+ // cast to any to avoid strict event-type mismatch when forwarding
68
+ this?.state.close();
69
+ }
70
+ }
71
+ };
72
+ }
73
+ static get() {
74
+ return PopoverBond.get();
75
+ }
76
+ static set(context) {
77
+ return PopoverBond.set(context);
78
+ }
79
+ }
80
+ export class MenuBondState extends PopoverState {
81
+ #keys = new SvelteSet();
82
+ #items = new SvelteMap();
83
+ #itemsAsArray = $derived(Array.from(this.#items.values()));
84
+ #index = $state(-1);
85
+ #highlightedId = $derived(Array.from(this.#items.keys())[this.#index] ?? null);
86
+ #highlightedItem = $derived(this.#itemsAsArray[this.#index] ?? null);
87
+ constructor(props) {
88
+ super(props);
89
+ }
90
+ get items() {
91
+ return this.#items;
92
+ }
93
+ get highlightedId() {
94
+ return this.#highlightedId;
95
+ }
96
+ get highlightedItem() {
97
+ return this.#highlightedItem;
98
+ }
99
+ get navigation() {
100
+ return {
101
+ next: () => {
102
+ if (this.#index < 0) {
103
+ this.#index = 0;
104
+ return this.#highlightedItem;
105
+ }
106
+ const length = this.#items.size;
107
+ this.#index = Math.min((this.#index + 1) % length, length - 1);
108
+ return this.#highlightedItem;
109
+ },
110
+ previous: () => {
111
+ if (this.#index <= 0) {
112
+ this.#index = this.#items.size - 1;
113
+ return this.#highlightedItem;
114
+ }
115
+ this.#index = Math.max(this.#index - 1, 0);
116
+ return this.#highlightedItem;
117
+ }
118
+ };
119
+ }
120
+ mountItem(id, item) {
121
+ this.#items.set(id, item);
122
+ return () => this.unmountItem(id);
123
+ }
124
+ unmountItem(id) {
125
+ if (this.#keys.has(id))
126
+ return; // keep the item if it's still in the data source
127
+ this.#items.delete(id);
128
+ }
129
+ item(id) {
130
+ return this.#items.get(id);
131
+ }
132
+ }
@@ -1,3 +1,5 @@
1
1
  export * as Menu from './atoms';
2
2
  export * from './types';
3
- export { PopoverBond, type PopoverDomElements, type PopoverParams, PopoverState, type PopoverStateProps, type TriggerParams } from '../popover/bond.svelte';
3
+ export { PopoverBond, type PopoverDomElements, type PopoverParams, PopoverState, type PopoverStateProps, type TriggerParams } from '../popover';
4
+ export type { AnimatePopoverContentParams as AnimateMenuContentParams, animatePopoverContent as animateMenuContent } from '../popover/motion';
5
+ export * from './item';