@svelte-atoms/core 1.0.0-alpha.30 → 1.0.0-alpha.31

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 (147) hide show
  1. package/README.md +853 -852
  2. package/dist/components/accordion/accordion-root.svelte +7 -3
  3. package/dist/components/accordion/accordion.stories.svelte +7 -82
  4. package/dist/components/accordion/item/accordion-item-body.svelte +44 -42
  5. package/dist/components/accordion/item/accordion-item-header.svelte +51 -50
  6. package/dist/components/accordion/item/accordion-item-indicator.svelte +51 -50
  7. package/dist/components/accordion/item/accordion-item-root.svelte +66 -65
  8. package/dist/components/accordion/item/bond.svelte.d.ts +2 -0
  9. package/dist/components/accordion/item/index.d.ts +3 -0
  10. package/dist/components/accordion/item/index.js +3 -0
  11. package/dist/components/accordion/item/motion.svelte.d.ts +15 -0
  12. package/dist/components/accordion/item/motion.svelte.js +30 -0
  13. package/dist/components/accordion/item/types.d.ts +7 -24
  14. package/dist/components/alert/alert-close-button.svelte +66 -70
  15. package/dist/components/alert/alert-description.svelte +42 -42
  16. package/dist/components/alert/alert-description.svelte.d.ts +3 -6
  17. package/dist/components/alert/alert-root.svelte +68 -103
  18. package/dist/components/alert/alert-root.svelte.d.ts +2 -2
  19. package/dist/components/alert/alert.stories.svelte +400 -400
  20. package/dist/components/alert/bond.svelte.d.ts +0 -13
  21. package/dist/components/alert/bond.svelte.js +0 -32
  22. package/dist/components/alert/types.d.ts +8 -32
  23. package/dist/components/atom/html-atom.svelte +261 -261
  24. package/dist/components/avatar/avatar.stories.svelte +22 -22
  25. package/dist/components/badge/badge.stories.svelte +12 -12
  26. package/dist/components/badge/badge.svelte +19 -19
  27. package/dist/components/breadcrumb/breadcrumb.stories.svelte +5 -5
  28. package/dist/components/button/button.stories.svelte +27 -27
  29. package/dist/components/calendar/calendar-day.svelte +101 -96
  30. package/dist/components/calendar/calendar.stories.svelte +26 -26
  31. package/dist/components/card/card-body.svelte +39 -39
  32. package/dist/components/card/card-footer.svelte +41 -41
  33. package/dist/components/card/card-root.svelte +91 -91
  34. package/dist/components/card/card.stories.svelte +133 -133
  35. package/dist/components/checkbox/checkbox.stories.svelte +22 -22
  36. package/dist/components/checkbox/checkbox.svelte +6 -2
  37. package/dist/components/collapsible/collapsible.stories.svelte +172 -172
  38. package/dist/components/combobox/atoms.d.ts +1 -1
  39. package/dist/components/combobox/atoms.js +1 -1
  40. package/dist/components/combobox/combobox-root.svelte +65 -65
  41. package/dist/components/combobox/compobox.stories.svelte +51 -51
  42. package/dist/components/combobox/index.d.ts +1 -0
  43. package/dist/components/container/container.stories.svelte +20 -20
  44. package/dist/components/container/container.svelte.d.ts +1 -1
  45. package/dist/components/datagrid/datagrid.stories.svelte +72 -72
  46. package/dist/components/datagrid/tr/bond.svelte.d.ts +4 -2
  47. package/dist/components/datagrid/tr/bond.svelte.js +9 -7
  48. package/dist/components/datagrid/tr/datagrid-tr.svelte +90 -88
  49. package/dist/components/date-picker/date-picker-calendar.svelte +67 -67
  50. package/dist/components/date-picker/date-picker-root.svelte +95 -95
  51. package/dist/components/date-picker/date-picker.stories.svelte +35 -35
  52. package/dist/components/dialog/bond.svelte.d.ts +13 -3
  53. package/dist/components/dialog/bond.svelte.js +66 -5
  54. package/dist/components/dialog/dialog-content.svelte +44 -62
  55. package/dist/components/dialog/dialog-root.svelte +91 -110
  56. package/dist/components/dialog/dialog.stories.svelte +64 -64
  57. package/dist/components/dialog/motion.svelte.d.ts +13 -0
  58. package/dist/components/dialog/motion.svelte.js +44 -0
  59. package/dist/components/drawer/attachments.svelte.d.ts +1 -1
  60. package/dist/components/drawer/attachments.svelte.js +1 -3
  61. package/dist/components/drawer/bond.svelte.d.ts +24 -5
  62. package/dist/components/drawer/bond.svelte.js +77 -11
  63. package/dist/components/drawer/drawer-content.svelte +6 -14
  64. package/dist/components/drawer/drawer.stories.svelte +27 -95
  65. package/dist/components/drawer/index.d.ts +2 -0
  66. package/dist/components/drawer/index.js +2 -0
  67. package/dist/components/drawer/motion.d.ts +15 -0
  68. package/dist/components/drawer/motion.js +28 -0
  69. package/dist/components/dropdown/atoms.d.ts +1 -1
  70. package/dist/components/dropdown/atoms.js +1 -1
  71. package/dist/components/dropdown/bond.svelte.d.ts +5 -1
  72. package/dist/components/dropdown/dropdown-root.svelte +59 -59
  73. package/dist/components/dropdown/dropdown.stories.svelte +80 -80
  74. package/dist/components/dropdown/index.d.ts +1 -0
  75. package/dist/components/form/form.stories.svelte +96 -96
  76. package/dist/components/image/image.stories.svelte +20 -20
  77. package/dist/components/input/input.stories.svelte +35 -35
  78. package/dist/components/label/label.stories.svelte +15 -15
  79. package/dist/components/lazy/lazy.stories.svelte +28 -28
  80. package/dist/components/link/link.stories.svelte +15 -15
  81. package/dist/components/list/list-item.svelte +20 -20
  82. package/dist/components/menu/atoms.d.ts +1 -0
  83. package/dist/components/menu/atoms.js +1 -0
  84. package/dist/components/menu/index.d.ts +2 -1
  85. package/dist/components/menu/index.js +1 -1
  86. package/dist/components/menu/menu-item.svelte +69 -51
  87. package/dist/components/menu/menu-item.svelte.d.ts +1 -0
  88. package/dist/components/menu/menu.stories.svelte +33 -33
  89. package/dist/components/popover/bond.svelte.d.ts +20 -7
  90. package/dist/components/popover/bond.svelte.js +80 -27
  91. package/dist/components/popover/motion.d.ts +6 -0
  92. package/dist/components/popover/motion.js +56 -0
  93. package/dist/components/popover/popover-arrow.svelte +111 -111
  94. package/dist/components/popover/popover-content.svelte +34 -72
  95. package/dist/components/popover/popover-indicator.svelte +44 -44
  96. package/dist/components/popover/popover-root.svelte +48 -48
  97. package/dist/components/popover/popover.stories.svelte +3 -3
  98. package/dist/components/popover/types.d.ts +9 -7
  99. package/dist/components/portal/active-portal.svelte +29 -22
  100. package/dist/components/portal/active-portal.svelte.d.ts +2 -9
  101. package/dist/components/portal/portal-root.svelte +76 -83
  102. package/dist/components/portal/portal-root.svelte.d.ts +4 -6
  103. package/dist/components/portal/teleport.svelte +49 -50
  104. package/dist/components/portal/teleport.svelte.d.ts +3 -4
  105. package/dist/components/qr-code/qr-code.stories.svelte +18 -18
  106. package/dist/components/radio/radio-group.stories.svelte +41 -41
  107. package/dist/components/radio/radio.stories.svelte +17 -17
  108. package/dist/components/radio/radio.svelte +1 -1
  109. package/dist/components/radio/types.d.ts +98 -0
  110. package/dist/components/radio/types.js +2 -0
  111. package/dist/components/root/root.svelte +13 -30
  112. package/dist/components/root/root.svelte.d.ts +1 -1
  113. package/dist/components/scrollable/scrollable-root.svelte.d.ts +2 -2
  114. package/dist/components/scrollable/scrollable.stories.svelte +116 -116
  115. package/dist/components/sidebar/index.d.ts +2 -0
  116. package/dist/components/sidebar/index.js +2 -0
  117. package/dist/components/sidebar/motion.svelte.d.ts +11 -0
  118. package/dist/components/sidebar/motion.svelte.js +16 -0
  119. package/dist/components/sidebar/sidebar-content.svelte +3 -13
  120. package/dist/components/sidebar/sidebar-root.svelte +39 -39
  121. package/dist/components/sidebar/sidebar.stories.svelte +43 -43
  122. package/dist/components/sidebar/types.d.ts +2 -12
  123. package/dist/components/tabs/tabs.stories.svelte +56 -56
  124. package/dist/components/textarea/atoms.d.ts +1 -0
  125. package/dist/components/textarea/atoms.js +1 -0
  126. package/dist/components/textarea/textarea-input.svelte +9 -6
  127. package/dist/components/textarea/textarea-root.svelte +9 -9
  128. package/dist/components/textarea/textarea-root.svelte.d.ts +2 -0
  129. package/dist/components/tooltip/tooltip-trigger.svelte +2 -2
  130. package/dist/components/tooltip/tooltip-trigger.svelte.d.ts +1 -0
  131. package/dist/components/tooltip/tooltip.stories.svelte +32 -32
  132. package/dist/components/tree/tree.stories.svelte +142 -142
  133. package/dist/icons/icon-copy.svelte +6 -0
  134. package/dist/{components/radio/types.svelte.d.ts → icons/icon-copy.svelte.d.ts} +3 -3
  135. package/dist/utils/markdown-to-llm.d.ts +28 -0
  136. package/dist/utils/markdown-to-llm.js +76 -0
  137. package/package.json +1 -2
  138. package/dist/components/radio/types.svelte +0 -0
  139. package/llm/composition.md +0 -395
  140. package/llm/crafting.md +0 -838
  141. package/llm/motion.md +0 -970
  142. package/llm/philosophy.md +0 -23
  143. package/llm/preset-variant-integration.md +0 -516
  144. package/llm/preset.md +0 -383
  145. package/llm/styling.md +0 -216
  146. package/llm/usage.md +0 -46
  147. package/llm/variants.md +0 -1259
@@ -1,9 +1,7 @@
1
1
  <script module>
2
2
  import { animate } from 'motion';
3
3
  import { defineMeta } from '@storybook/addon-svelte-csf';
4
- import { Drawer as Drawer_ } from '.';
5
- import { DrawerBond } from './bond.svelte';
6
- import { on } from '../../attachments/event.svelte';
4
+ import { clickoutDrawer, Drawer as Drawer_ } from '.';
7
5
 
8
6
  // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
9
7
  const { Story } = defineMeta({
@@ -19,37 +17,23 @@
19
17
  </script>
20
18
 
21
19
  <script lang="ts">
20
+ import { animateDrawerContent, animateDrawerRoot } from './motion';
21
+
22
22
  let isOpen = $state(false);
23
23
  </script>
24
24
 
25
25
  <Story name="Left" args={{}}>
26
26
  <Drawer_.Root
27
- class=" border backdrop-blur-md backdrop-grayscale-100"
28
27
  bind:open={isOpen}
29
- initial={(node) => {
30
- animate(node, { opacity: +isOpen }, { duration: 0 });
31
- }}
32
- animate={(node) => {
33
- animate(node, { opacity: +isOpen }, { duration: 0.3 }).finished.then(() => {
34
- if (!isOpen) node.close?.();
35
- });
36
- }}
37
- {@attach (node) => {
38
- const bond = DrawerBond.get();
39
-
40
- return on('click', (ev) => {
41
- bond?.state?.close?.();
42
- })(node);
43
- }}
28
+ class=" border backdrop-blur-md backdrop-grayscale-100"
29
+ animate={animateDrawerRoot({})}
44
30
  >
45
31
  <Drawer_.Content
46
32
  class="border-border flex min-h-full w-md flex-col border-r p-8 whitespace-nowrap shadow-md"
47
- initial={(node) => {
48
- animate(node, { x: isOpen ? 0 : -100 + '%' } as any, { duration: 0 });
49
- }}
50
- animate={(node) => {
51
- animate(node, { x: isOpen ? 0 : -100 + '%' } as any, { duration: 0.2, ease: 'easeOut' });
52
- }}
33
+ animate={animateDrawerContent({ ease: 'easeOut', side: 'left' })}
34
+ {@attach clickoutDrawer((_, bond) => {
35
+ bond?.state?.close?.();
36
+ })}
53
37
  >
54
38
  <Drawer_.Header class="flex items-center justify-between">
55
39
  <div class="flex flex-col">
@@ -77,30 +61,16 @@
77
61
 
78
62
  <Story name="Top" args={{}}>
79
63
  <Drawer_.Root
80
- class=" border backdrop-blur-md backdrop-grayscale-100"
81
64
  bind:open={isOpen}
82
- initial={(node) => animate(node, { opacity: +isOpen }, { duration: 0 })}
83
- animate={(node) => {
84
- animate(node, { opacity: +isOpen }, { duration: 0.3 }).finished.then(() => {
85
- if (!isOpen) node.close?.();
86
- });
87
- }}
88
- {@attach (node) => {
89
- const bond = DrawerBond.get();
90
-
91
- return on('click', (ev) => {
92
- bond?.state?.close?.();
93
- })(node);
94
- }}
65
+ class=" border backdrop-blur-md backdrop-grayscale-100"
66
+ animate={animateDrawerRoot({})}
95
67
  >
96
68
  <Drawer_.Content
97
69
  class="border-border flex w-md min-w-full flex-col border-b p-8 whitespace-nowrap shadow-md"
98
- initial={(node) => {
99
- animate(node, { y: isOpen ? 0 : -100 + '%' } as any, { duration: 0 });
100
- }}
101
- animate={(node) => {
102
- animate(node, { y: isOpen ? 0 : -100 + '%' } as any, { duration: 0.2, ease: 'easeOut' });
103
- }}
70
+ animate={animateDrawerContent({ ease: 'easeOut', side: 'top' })}
71
+ {@attach clickoutDrawer((_, bond) => {
72
+ bond?.state?.close?.();
73
+ })}
104
74
  >
105
75
  <div>
106
76
  <div>Svelte Fluent</div>
@@ -118,37 +88,15 @@
118
88
 
119
89
  <Story name="Right" args={{}}>
120
90
  <Drawer_.Root
121
- class=" border backdrop-blur-md backdrop-grayscale-100"
122
91
  bind:open={isOpen}
123
- initial={(node) => {
124
- animate(node, { opacity: +isOpen }, { duration: 0 });
125
- }}
126
- animate={(node) => {
127
- animate(node, { opacity: +isOpen }, { duration: 0.3 }).finished.then(() => {
128
- if (!isOpen) node.close?.();
129
- });
130
- }}
131
- {@attach (node) => {
132
- const bond = DrawerBond.get();
133
-
134
- return on('click', (ev) => {
135
- bond?.state?.close?.();
136
- })(node);
137
- }}
92
+ class=" border backdrop-blur-md backdrop-grayscale-100"
93
+ animate={animateDrawerRoot({})}
138
94
  >
139
95
  <Drawer_.Content
140
- class="border-border shadow-foreground/50 inset-y-0 flex w-md flex-col border-l p-8 whitespace-nowrap shadow-lg"
141
- initial={(node) => {
142
- animate(node, { x: isOpen ? 0 : 100 + '%', right: 0 } as any, { duration: 0 });
143
- }}
144
- animate={(node) => {
145
- animate(node, { x: isOpen ? 0 : 100 + '%', right: 0 } as any, {
146
- duration: 0.2,
147
- ease: 'easeOut'
148
- });
149
- }}
150
- {@attach on('click', (ev) => {
151
- ev.stopPropagation();
96
+ class="border-border shadow-foreground/50 inset-y-0 flex w-md flex-col border-l p-8 whitespace-nowrap shadow-sm"
97
+ animate={animateDrawerContent({ ease: 'easeOut', side: 'right' })}
98
+ {@attach clickoutDrawer((_, bond) => {
99
+ bond?.state?.close?.();
152
100
  })}
153
101
  >
154
102
  <div>
@@ -167,35 +115,19 @@
167
115
 
168
116
  <Story name="Bottom" args={{}}>
169
117
  <Drawer_.Root
170
- class=" border backdrop-blur-md backdrop-grayscale-100"
171
118
  bind:open={isOpen}
119
+ class=" border backdrop-blur-md backdrop-grayscale-100"
172
120
  initial={(node) => {
173
121
  animate(node, { opacity: +isOpen }, { duration: 0 });
174
122
  }}
175
- animate={(node) => {
176
- animate(node, { opacity: +isOpen }, { duration: 0.3 }).finished.then(() => {
177
- if (!isOpen) node.close?.();
178
- });
179
- }}
180
- {@attach (node) => {
181
- const bond = DrawerBond.get();
182
-
183
- return on('click', (ev) => {
184
- bond?.state?.close?.();
185
- })(node);
186
- }}
123
+ animate={animateDrawerRoot()}
187
124
  >
188
125
  <Drawer_.Content
189
126
  class="border-border flex w-md min-w-full flex-col border-t p-8 whitespace-nowrap shadow-md"
190
- initial={(node) => {
191
- animate(node, { y: isOpen ? 0 : 100 + '%', bottom: 0 } as any, { duration: 0 });
192
- }}
193
- animate={(node) => {
194
- animate(node, { y: isOpen ? 0 : 100 + '%', bottom: 0 } as any, {
195
- duration: 0.2,
196
- ease: 'easeOut'
197
- });
198
- }}
127
+ animate={animateDrawerContent({ ease: 'easeOut', side: 'bottom' })}
128
+ {@attach clickoutDrawer((_, bond) => {
129
+ bond?.state?.close?.();
130
+ })}
199
131
  >
200
132
  <div>
201
133
  <div>Svelte Fluent</div>
@@ -1,4 +1,6 @@
1
1
  export * as Drawer from './atoms';
2
2
  export { clickoutDrawer, closeDrawer, openDrawer, drawer, toggleDrawer } from './attachments.svelte';
3
3
  export { DrawerBond, type DrawerBondElements, type DrawerBondProps, DrawerBondState } from './bond.svelte';
4
+ export * from './attachments.svelte';
5
+ export * from './motion';
4
6
  export * from './types';
@@ -1,4 +1,6 @@
1
1
  export * as Drawer from './atoms';
2
2
  export { clickoutDrawer, closeDrawer, openDrawer, drawer, toggleDrawer } from './attachments.svelte';
3
3
  export { DrawerBond, DrawerBondState } from './bond.svelte';
4
+ export * from './attachments.svelte';
5
+ export * from './motion';
4
6
  export * from './types';
@@ -0,0 +1,15 @@
1
+ import { type Easing } from 'motion';
2
+ type AnimateDrawerContentParams = {
3
+ duration?: number;
4
+ delay?: number;
5
+ ease?: Easing | Easing[];
6
+ side?: 'left' | 'right' | 'top' | 'bottom';
7
+ };
8
+ export declare function animateDrawerContent(params: AnimateDrawerContentParams): (node: HTMLElement) => void;
9
+ type AnimateDrawerRootParams = {
10
+ duration?: number;
11
+ delay?: number;
12
+ ease?: Easing | Easing[];
13
+ };
14
+ export declare function animateDrawerRoot(params?: AnimateDrawerRootParams): (node: HTMLElement) => void;
15
+ export {};
@@ -0,0 +1,28 @@
1
+ import { animate } from 'motion';
2
+ import { DURATION } from '../../shared';
3
+ import { DrawerBond } from '.';
4
+ export function animateDrawerContent(params) {
5
+ const { duration = DURATION.fast / 1000, delay = 0, ease = 'easeInOut', side = 'left' } = params;
6
+ const bond = DrawerBond.get();
7
+ const isOpen = bond?.state.props.open ?? false;
8
+ const mainProp = side === 'left' || side === 'right' ? 'x' : 'y';
9
+ const crossProp = mainProp === 'x' ? 'y' : 'x';
10
+ const d = side === 'left' || side === 'top' ? -1 : 1;
11
+ return (node) => {
12
+ animate(node, {
13
+ [mainProp]: isOpen ? 0 : d * 100 + '%',
14
+ [crossProp]: 0,
15
+ left: 'unset',
16
+ right: 'unset',
17
+ [side]: 0
18
+ }, { duration, ease, delay });
19
+ };
20
+ }
21
+ export function animateDrawerRoot(params = {}) {
22
+ const { duration = DURATION.fast / 1000, delay = 0, ease = 'easeInOut' } = params;
23
+ return (node) => {
24
+ const bond = DrawerBond.get();
25
+ const isOpen = bond?.state.props.open ?? false;
26
+ animate(node, { opacity: +isOpen }, { duration, ease, delay });
27
+ };
28
+ }
@@ -6,4 +6,4 @@ export { default as Query } from './dropdown-query.svelte';
6
6
  export { default as Value } from './dropdown-value.svelte';
7
7
  export { default as Values } from './dropdown-values.svelte';
8
8
  export { Arrow, Indicator } from '../popover/atoms';
9
- export { List } from '../menu/atoms';
9
+ export { List, Divider, Title, Group } from '../menu/atoms';
@@ -6,4 +6,4 @@ export { default as Query } from './dropdown-query.svelte';
6
6
  export { default as Value } from './dropdown-value.svelte';
7
7
  export { default as Values } from './dropdown-values.svelte';
8
8
  export { Arrow, Indicator } from '../popover/atoms';
9
- export { List } from '../menu/atoms';
9
+ export { List, Divider, Title, Group } from '../menu/atoms';
@@ -13,14 +13,18 @@ export type DropdownBondElements = PopoverDomElements & {
13
13
  export declare class DropdownBond<Props extends DropdownStateProps = DropdownStateProps, State extends DropdownBondState<Props> = DropdownBondState<Props>, Elements extends DropdownBondElements = DropdownBondElements> extends PopoverBond<Props, State, Elements> {
14
14
  constructor(state: State);
15
15
  content(props?: Record<string, unknown>): {
16
+ onchange?: (node: HTMLElement, position: import("@floating-ui/core").ComputePositionReturn) => void;
16
17
  id: string;
17
18
  role: string;
18
19
  'aria-modal': boolean;
19
20
  'aria-labelledby': string;
20
- 'aria-controlledby': string;
21
+ 'aria-hidden': boolean;
22
+ inert: string | undefined;
23
+ tabindex: number;
21
24
  'data-atom': string;
22
25
  'data-kind': string;
23
26
  'data-active': boolean;
27
+ onkeydown: ((ev: KeyboardEvent) => void) | undefined;
24
28
  };
25
29
  placeholder(): {
26
30
  [x: symbol]: (node: HTMLElement) => void;
@@ -1,59 +1,59 @@
1
- <script lang="ts" generics="T">
2
- import { defineProperty, defineState } from '../../utils';
3
- import { DropdownBond, DropdownBondState, type DropdownStateProps } from './bond.svelte';
4
-
5
- let {
6
- open = $bindable(false),
7
- value = $bindable(),
8
- values = $bindable(),
9
- multiple = false,
10
- disabled = false,
11
- placements = ['bottom-start', 'bottom-end', 'top-start', 'top-end'],
12
- placement = 'bottom-start',
13
- offset = 1,
14
- keys = [],
15
- factory = _factory,
16
- children = undefined,
17
- onquerychange = undefined,
18
- ...restProps
19
- } = $props();
20
-
21
- const bondProps = defineState<DropdownStateProps>(
22
- [
23
- defineProperty(
24
- 'open',
25
- () => open,
26
- (v) => {
27
- open = v;
28
- }
29
- ),
30
- defineProperty(
31
- 'values',
32
- () => (multiple ? values : [value].filter(Boolean)),
33
- (v) => {
34
- values = v;
35
- value = v[0];
36
- }
37
- ),
38
- defineProperty('multiple', () => multiple),
39
- defineProperty('disabled', () => disabled),
40
- defineProperty('placement', () => placement),
41
- defineProperty('offset', () => offset),
42
- defineProperty('placements', () => placements ?? []),
43
- defineProperty('keys', () => keys ?? [])
44
- ],
45
- () => ({ onquerychange })
46
- );
47
- const bond = factory(bondProps).share();
48
-
49
- function _factory(props: typeof bondProps) {
50
- const bondState = new DropdownBondState<T>(() => props);
51
- return new DropdownBond(bondState);
52
- }
53
-
54
- export function getBond() {
55
- return bond;
56
- }
57
- </script>
58
-
59
- {@render children?.({ dropdown: bond })}
1
+ <script lang="ts" generics="T">
2
+ import { defineProperty, defineState } from '../../utils';
3
+ import { DropdownBond, DropdownBondState, type DropdownStateProps } from './bond.svelte';
4
+
5
+ let {
6
+ open = $bindable(false),
7
+ value = $bindable(),
8
+ values = $bindable(),
9
+ multiple = false,
10
+ disabled = false,
11
+ placements = ['bottom-start', 'bottom-end', 'top-start', 'top-end'],
12
+ placement = 'bottom-start',
13
+ offset = 1,
14
+ keys = [],
15
+ factory = _factory,
16
+ children = undefined,
17
+ onquerychange = undefined,
18
+ ...restProps
19
+ } = $props();
20
+
21
+ const bondProps = defineState<DropdownStateProps>(
22
+ [
23
+ defineProperty(
24
+ 'open',
25
+ () => open,
26
+ (v) => {
27
+ open = v;
28
+ }
29
+ ),
30
+ defineProperty(
31
+ 'values',
32
+ () => (multiple ? values : [value].filter(Boolean)),
33
+ (v) => {
34
+ values = v;
35
+ value = v[0];
36
+ }
37
+ ),
38
+ defineProperty('multiple', () => multiple),
39
+ defineProperty('disabled', () => disabled),
40
+ defineProperty('placement', () => placement),
41
+ defineProperty('offset', () => offset),
42
+ defineProperty('placements', () => placements ?? []),
43
+ defineProperty('keys', () => keys ?? [])
44
+ ],
45
+ () => ({ onquerychange })
46
+ );
47
+ const bond = factory(bondProps).share();
48
+
49
+ function _factory(props: typeof bondProps) {
50
+ const bondState = new DropdownBondState<T>(() => props);
51
+ return new DropdownBond(bondState);
52
+ }
53
+
54
+ export function getBond() {
55
+ return bond;
56
+ }
57
+ </script>
58
+
59
+ {@render children?.({ dropdown: bond })}
@@ -1,80 +1,80 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import { Dropdown as ADropdown } from '.';
4
- import { Input } from '../input';
5
- import { flip } from 'svelte/animate';
6
- import { filter } from './runes.svelte';
7
-
8
- // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
9
- const { Story } = defineMeta({
10
- title: 'Atoms/Dropdown',
11
- // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
12
-
13
- parameters: {
14
- // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout
15
- layout: 'fullscreen'
16
- },
17
- args: {}
18
- });
19
- </script>
20
-
21
- <script lang="ts">
22
- let open = $state(false);
23
-
24
- const data = $state([
25
- { id: 1, value: 'apple', text: 'Apple' },
26
- { id: 2, value: 'banana', text: 'Banana' },
27
- { id: 3, value: 'cherry', text: 'Cherry' },
28
- { id: 4, value: 'date', text: 'Date' },
29
- { id: 5, value: 'elderberry', text: 'Elderberry' }
30
- ]);
31
-
32
- const dd = filter(
33
- () => data,
34
- (query, item) => item.text.toLowerCase().includes(query.toLowerCase())
35
- );
36
- </script>
37
-
38
- <Story name="Dropdown" args={{}}>
39
- <!-- Multi-select dropdown with search functionality -->
40
- <ADropdown.Root
41
- bind:open
42
- keys={data.map((item) => item.value)}
43
- multiple
44
- onquerychange={(q) => (dd.query = q)}
45
- >
46
- {#snippet children({ dropdown })}
47
- <!-- Compose ADropdown.Trigger with Input.Root for a custom trigger -->
48
- <ADropdown.Trigger
49
- base={Input.Root}
50
- class="h-auto min-h-12 max-w-sm min-w-sm items-center gap-2 rounded-sm px-4 transition-colors duration-200"
51
- onclick={(ev) => {
52
- ev.preventDefault();
53
-
54
- dropdown.state.open();
55
- }}
56
- >
57
- <!-- Display selected values with animation -->
58
- {#each dropdown?.state?.selectedItems ?? [] as item (item.id)}
59
- <div animate:flip={{ duration: 200 }}>
60
- <ADropdown.Value value={item.value} class="text-foreground/80">
61
- {item.text}
62
- </ADropdown.Value>
63
- </div>
64
- {/each}
65
-
66
- <!-- Inline search input within the trigger -->
67
- <ADropdown.Query class="flex-1 px-1" placeholder="Search for fruits..." />
68
- </ADropdown.Trigger>
69
-
70
- <!-- ADropdown list with filtered items -->
71
- <ADropdown.List>
72
- {#each dd.current as item (item.id)}
73
- <div animate:flip={{ duration: 200 }}>
74
- <ADropdown.Item value={item.value}>{item.text}</ADropdown.Item>
75
- </div>
76
- {/each}
77
- </ADropdown.List>
78
- {/snippet}
79
- </ADropdown.Root>
80
- </Story>
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import { Dropdown as ADropdown } from '.';
4
+ import { Input } from '../input';
5
+ import { flip } from 'svelte/animate';
6
+ import { filter } from './runes.svelte';
7
+
8
+ // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
9
+ const { Story } = defineMeta({
10
+ title: 'Atoms/Dropdown',
11
+ // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
12
+
13
+ parameters: {
14
+ // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout
15
+ layout: 'fullscreen'
16
+ },
17
+ args: {}
18
+ });
19
+ </script>
20
+
21
+ <script lang="ts">
22
+ let open = $state(false);
23
+
24
+ const data = $state([
25
+ { id: 1, value: 'apple', text: 'Apple' },
26
+ { id: 2, value: 'banana', text: 'Banana' },
27
+ { id: 3, value: 'cherry', text: 'Cherry' },
28
+ { id: 4, value: 'date', text: 'Date' },
29
+ { id: 5, value: 'elderberry', text: 'Elderberry' }
30
+ ]);
31
+
32
+ const dd = filter(
33
+ () => data,
34
+ (query, item) => item.text.toLowerCase().includes(query.toLowerCase())
35
+ );
36
+ </script>
37
+
38
+ <Story name="Dropdown" args={{}}>
39
+ <!-- Multi-select dropdown with search functionality -->
40
+ <ADropdown.Root
41
+ bind:open
42
+ keys={data.map((item) => item.value)}
43
+ multiple
44
+ onquerychange={(q) => (dd.query = q)}
45
+ >
46
+ {#snippet children({ dropdown })}
47
+ <!-- Compose ADropdown.Trigger with Input.Root for a custom trigger -->
48
+ <ADropdown.Trigger
49
+ base={Input.Root}
50
+ class="h-auto min-h-12 max-w-sm min-w-sm items-center gap-2 rounded-sm px-4 transition-colors duration-200"
51
+ onclick={(ev) => {
52
+ ev.preventDefault();
53
+
54
+ dropdown.state.open();
55
+ }}
56
+ >
57
+ <!-- Display selected values with animation -->
58
+ {#each dropdown?.state?.selectedItems ?? [] as item (item.id)}
59
+ <div animate:flip={{ duration: 200 }}>
60
+ <ADropdown.Value value={item.value} class="text-foreground/80">
61
+ {item.text}
62
+ </ADropdown.Value>
63
+ </div>
64
+ {/each}
65
+
66
+ <!-- Inline search input within the trigger -->
67
+ <ADropdown.Query class="flex-1 px-1" placeholder="Search for fruits..." />
68
+ </ADropdown.Trigger>
69
+
70
+ <!-- ADropdown list with filtered items -->
71
+ <ADropdown.List>
72
+ {#each dd.current as item (item.id)}
73
+ <div animate:flip={{ duration: 200 }}>
74
+ <ADropdown.Item value={item.value}>{item.text}</ADropdown.Item>
75
+ </div>
76
+ {/each}
77
+ </ADropdown.List>
78
+ {/snippet}
79
+ </ADropdown.Root>
80
+ </Story>
@@ -2,3 +2,4 @@ export * as Dropdown from './atoms';
2
2
  export { DropdownBond, type DropdownBondElements, DropdownBondState, type DropdownStateProps } from './bond.svelte';
3
3
  export { filter } from './runes.svelte';
4
4
  export * from './types';
5
+ export type { AnimatePopoverContentParams as AnimateDropdownContentParams, animatePopoverContent as animateDropdownContent } from '../popover/motion';