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

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 (92) hide show
  1. package/README.md +852 -852
  2. package/dist/attachments/clickout.svelte.d.ts +1 -1
  3. package/dist/attachments/clickout.svelte.js +2 -2
  4. package/dist/components/accordion/accordion-root.svelte +61 -61
  5. package/dist/components/accordion/accordion-root.svelte.d.ts +1 -1
  6. package/dist/components/accordion/accordion.stories.svelte +145 -134
  7. package/dist/components/alert/alert.stories.svelte +400 -401
  8. package/dist/components/atom/html-atom.svelte +71 -17
  9. package/dist/components/avatar/avatar.stories.svelte +22 -27
  10. package/dist/components/badge/badge.stories.svelte +12 -17
  11. package/dist/components/badge/badge.svelte +19 -19
  12. package/dist/components/breadcrumb/breadcrumb.stories.svelte +16 -21
  13. package/dist/components/button/button.stories.svelte +27 -60
  14. package/dist/components/calendar/calendar-day.svelte +96 -96
  15. package/dist/components/calendar/calendar-header.svelte +29 -29
  16. package/dist/components/calendar/calendar-root.svelte +206 -206
  17. package/dist/components/calendar/calendar.stories.svelte +10 -15
  18. package/dist/components/card/card-body.svelte +39 -39
  19. package/dist/components/card/card-footer.svelte +41 -41
  20. package/dist/components/card/card-root.svelte +91 -91
  21. package/dist/components/card/card.stories.svelte +133 -145
  22. package/dist/components/checkbox/checkbox.stories.svelte +22 -27
  23. package/dist/components/checkbox/checkbox.svelte +155 -157
  24. package/dist/components/collapsible/collapsible.stories.svelte +172 -173
  25. package/dist/components/combobox/combobox-root.svelte +65 -65
  26. package/dist/components/combobox/compobox.stories.svelte +51 -54
  27. package/dist/components/container/container.stories.svelte +20 -23
  28. package/dist/components/datagrid/datagrid-root.svelte +59 -59
  29. package/dist/components/datagrid/datagrid.css +5 -5
  30. package/dist/components/datagrid/datagrid.stories.svelte +72 -75
  31. package/dist/components/date-picker/date-picker-calendar.svelte +67 -67
  32. package/dist/components/date-picker/date-picker-header.svelte +100 -100
  33. package/dist/components/date-picker/date-picker-months.svelte +142 -142
  34. package/dist/components/date-picker/date-picker-root.svelte +1 -1
  35. package/dist/components/date-picker/date-picker-years.svelte +205 -205
  36. package/dist/components/date-picker/date-picker.stories.svelte +11 -18
  37. package/dist/components/dialog/dialog-content.svelte +62 -62
  38. package/dist/components/dialog/dialog.stories.svelte +64 -67
  39. package/dist/components/drawer/attachments.svelte.js +8 -9
  40. package/dist/components/drawer/drawer-content.svelte +57 -42
  41. package/dist/components/drawer/drawer.stories.svelte +212 -224
  42. package/dist/components/dropdown/dropdown-root.svelte +59 -59
  43. package/dist/components/dropdown/dropdown.stories.svelte +80 -83
  44. package/dist/components/form/form.stories.svelte +96 -99
  45. package/dist/components/image/image.stories.svelte +20 -23
  46. package/dist/components/input/input.stories.svelte +35 -38
  47. package/dist/components/label/label.stories.svelte +15 -26
  48. package/dist/components/label/label.stories.svelte.d.ts +24 -4
  49. package/dist/components/lazy/lazy.stories.svelte +9 -16
  50. package/dist/components/lazy/lazy.svelte +28 -28
  51. package/dist/components/link/link.stories.svelte +15 -26
  52. package/dist/components/link/link.stories.svelte.d.ts +24 -4
  53. package/dist/components/menu/menu-list.svelte +40 -40
  54. package/dist/components/menu/menu.stories.svelte +33 -36
  55. package/dist/components/popover/bond.svelte.js +31 -25
  56. package/dist/components/popover/popover-arrow.svelte +111 -111
  57. package/dist/components/popover/popover-content.svelte +175 -178
  58. package/dist/components/popover/popover-indicator.svelte +44 -43
  59. package/dist/components/popover/popover-root.svelte +48 -48
  60. package/dist/components/popover/popover.stories.svelte +49 -52
  61. package/dist/components/qr-code/qr-code.stories.svelte +4 -13
  62. package/dist/components/qr-code/qr-code.svelte +75 -75
  63. package/dist/components/radio/radio-group.stories.svelte +41 -50
  64. package/dist/components/radio/radio.stories.svelte +17 -26
  65. package/dist/components/radio/radio.svelte +109 -109
  66. package/dist/components/root/root.svelte +121 -121
  67. package/dist/components/root/root.svelte.d.ts +1 -1
  68. package/dist/components/scrollable/scrollable.stories.svelte +116 -126
  69. package/dist/components/sidebar/sidebar-content.svelte +13 -2
  70. package/dist/components/sidebar/sidebar-root.svelte +10 -12
  71. package/dist/components/sidebar/sidebar.stories.svelte +8 -19
  72. package/dist/components/sidebar/types.d.ts +1 -0
  73. package/dist/components/tabs/tab/bond.svelte.d.ts +4 -1
  74. package/dist/components/tabs/tab/bond.svelte.js +4 -1
  75. package/dist/components/tabs/tabs.stories.svelte +56 -59
  76. package/dist/components/tooltip/tooltip-trigger.svelte +39 -37
  77. package/dist/components/tooltip/tooltip.stories.svelte +32 -35
  78. package/dist/components/tree/tree.stories.svelte +142 -134
  79. package/dist/context/preset.svelte.d.ts +3 -3
  80. package/dist/utils/function.d.ts +2 -0
  81. package/dist/utils/function.js +6 -0
  82. package/package.json +6 -9
  83. package/dist/actions/animation.svelte.d.ts +0 -6
  84. package/dist/actions/animation.svelte.js +0 -14
  85. package/dist/actions/clickout.svelte.d.ts +0 -2
  86. package/dist/actions/clickout.svelte.js +0 -15
  87. package/dist/actions/popover.svelte.d.ts +0 -19
  88. package/dist/actions/popover.svelte.js +0 -81
  89. package/dist/actions/portal.svelte.d.ts +0 -8
  90. package/dist/actions/portal.svelte.js +0 -32
  91. package/dist/attachments/gsap.svelte.d.ts +0 -2
  92. package/dist/attachments/gsap.svelte.js +0 -26
@@ -1,224 +1,212 @@
1
- <script module>
2
- import { cubicOut } from 'svelte/easing';
3
- import gsap from 'gsap';
4
- import { defineMeta } from '@storybook/addon-svelte-csf';
5
- import { Drawer as Drawer_ } from '.';
6
- import Root from '../root/root.svelte';
7
- import { DrawerBond } from './bond.svelte';
8
- import { on } from '../../attachments/event.svelte';
9
-
10
- // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
11
- const { Story } = defineMeta({
12
- title: 'Atoms/Drawer',
13
- // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
14
-
15
- parameters: {
16
- // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout
17
- layout: 'fullscreen'
18
- },
19
- args: {}
20
- });
21
- </script>
22
-
23
- <script lang="ts">
24
- let isOpen = $state(false);
25
- </script>
26
-
27
- <Story name="Left" args={{}}>
28
- <Root class="p-4">
29
- <Drawer_.Root
30
- class=" border backdrop-blur-md backdrop-grayscale-100"
31
- bind:open={isOpen}
32
- initial={(node) => {
33
- gsap.set(node, { opacity: +isOpen });
34
- }}
35
- animate={(node) => {
36
- gsap.to(node, {
37
- opacity: +isOpen,
38
- duration: 0.3,
39
- onComplete: () => !isOpen && node.close?.()
40
- });
41
- }}
42
- {@attach (node) => {
43
- const bond = DrawerBond.get();
44
-
45
- return on('click', (ev) => {
46
- bond?.state?.close?.();
47
- })(node);
48
- }}
49
- >
50
- <Drawer_.Content
51
- class="border-border flex min-h-full w-md flex-col border-r p-8 whitespace-nowrap shadow-md"
52
- initial={(node) => {
53
- gsap.set(node, { xPercent: isOpen ? 0 : -100, left: 0 });
54
- }}
55
- animate={(node) => {
56
- gsap.to(node, { xPercent: isOpen ? 0 : -100, left: 0, duration: 0.2, ease: cubicOut });
57
- }}
58
- >
59
- <Drawer_.Header class="flex items-center justify-between">
60
- <div class="flex flex-col">
61
- <Drawer_.Title class="text-lg font-semibold">Drawer Title</Drawer_.Title>
62
- <Drawer_.Description class="text-sm break-all whitespace-break-spaces text-neutral-500"
63
- >Ac bibendum laoreet lacinia purus duis. Hendrerit quam purus maecenas tincidunt
64
- letius finibus vel tortor sociosqu proin vulputate. Consectetur velit eleifend purus
65
- mi pulvinar si tristique litora mollis lobortis.</Drawer_.Description
66
- >
67
- </div>
68
- </Drawer_.Header>
69
- <div>
70
- <div>Svelte Fluent</div>
71
- </div>
72
- </Drawer_.Content>
73
- </Drawer_.Root>
74
-
75
- <button
76
- class="bg-red-500 p-2"
77
- onclick={() => {
78
- isOpen = !isOpen;
79
- }}>Open</button
80
- >
81
- </Root>
82
- </Story>
83
-
84
- <Story name="Top" args={{}}>
85
- <Root class="p-4">
86
- <Drawer_.Root
87
- class=" border backdrop-blur-md backdrop-grayscale-100"
88
- bind:open={isOpen}
89
- initial={(node) => gsap.set(node, { opacity: +isOpen })}
90
- animate={(node) => {
91
- gsap.to(node, {
92
- opacity: +isOpen,
93
- duration: 0.3,
94
- onComplete: () => !isOpen && node.close?.()
95
- });
96
- }}
97
- {@attach (node) => {
98
- const bond = DrawerBond.get();
99
-
100
- return on('click', (ev) => {
101
- bond?.state?.close?.();
102
- })(node);
103
- }}
104
- >
105
- <Drawer_.Content
106
- class="border-border flex w-md min-w-full flex-col border-b p-8 whitespace-nowrap shadow-md"
107
- initial={(node) => {
108
- gsap.set(node, { yPercent: isOpen ? 0 : -100, top: 0 });
109
- }}
110
- animate={(node) => {
111
- gsap.to(node, { yPercent: isOpen ? 0 : -100, top: 0, duration: 0.2, ease: cubicOut });
112
- }}
113
- >
114
- <div>
115
- <div>Svelte Fluent</div>
116
- </div>
117
- </Drawer_.Content>
118
- </Drawer_.Root>
119
-
120
- <button
121
- class="bg-red-500 p-2"
122
- onclick={() => {
123
- isOpen = !isOpen;
124
- }}>Open</button
125
- >
126
- </Root>
127
- </Story>
128
-
129
- <Story name="Right" args={{}}>
130
- <Root class="p-4">
131
- <Drawer_.Root
132
- class=" border backdrop-blur-md backdrop-grayscale-100"
133
- bind:open={isOpen}
134
- initial={(node) => {
135
- gsap.set(node, { opacity: +isOpen });
136
- }}
137
- animate={(node) => {
138
- gsap.to(node, {
139
- opacity: +isOpen,
140
- duration: 0.3,
141
- onComplete: () => !isOpen && node.close?.()
142
- });
143
- }}
144
- {@attach (node) => {
145
- const bond = DrawerBond.get();
146
-
147
- return on('click', (ev) => {
148
- bond?.state?.close?.();
149
- })(node);
150
- }}
151
- >
152
- <Drawer_.Content
153
- class="border-border shadow-foreground/50 inset-y-0 flex w-md flex-col border-l p-8 whitespace-nowrap shadow-lg"
154
- initial={(node) => {
155
- gsap.set(node, { xPercent: isOpen ? 0 : 100, right: 0 });
156
- }}
157
- animate={(node) => {
158
- gsap.to(node, { xPercent: isOpen ? 0 : 100, right: 0, duration: 0.2, ease: cubicOut });
159
- }}
160
- {@attach on('click', (ev) => {
161
- ev.stopPropagation();
162
- })}
163
- >
164
- <div>
165
- <div>Svelte Fluent</div>
166
- </div>
167
- </Drawer_.Content>
168
- </Drawer_.Root>
169
-
170
- <button
171
- class="bg-red-500 p-2"
172
- onclick={() => {
173
- isOpen = !isOpen;
174
- }}>Open</button
175
- >
176
- </Root>
177
- </Story>
178
-
179
- <Story name="Bottom" args={{}}>
180
- <Root class="p-4">
181
- <Drawer_.Root
182
- class=" border backdrop-blur-md backdrop-grayscale-100"
183
- bind:open={isOpen}
184
- initial={(node) => {
185
- gsap.set(node, { opacity: +isOpen });
186
- }}
187
- animate={(node) => {
188
- gsap.to(node, {
189
- opacity: +isOpen,
190
- duration: 0.3,
191
- onComplete: () => !isOpen && node.close?.()
192
- });
193
- }}
194
- {@attach (node) => {
195
- const bond = DrawerBond.get();
196
-
197
- return on('click', (ev) => {
198
- bond?.state?.close?.();
199
- })(node);
200
- }}
201
- >
202
- <Drawer_.Content
203
- class="border-border flex w-md min-w-full flex-col border-t p-8 whitespace-nowrap shadow-md"
204
- onmount={(node) => {
205
- gsap.set(node, { yPercent: isOpen ? 0 : 100, bottom: 0 });
206
- }}
207
- animate={(node) => {
208
- gsap.to(node, { yPercent: isOpen ? 0 : 100, bottom: 0, duration: 0.2, ease: cubicOut });
209
- }}
210
- >
211
- <div>
212
- <div>Svelte Fluent</div>
213
- </div>
214
- </Drawer_.Content>
215
- </Drawer_.Root>
216
-
217
- <button
218
- class="bg-red-500 p-2"
219
- onclick={() => {
220
- isOpen = !isOpen;
221
- }}>Open</button
222
- >
223
- </Root>
224
- </Story>
1
+ <script module>
2
+ import { animate } from 'motion';
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';
7
+
8
+ // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
9
+ const { Story } = defineMeta({
10
+ title: 'Atoms/Drawer',
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 isOpen = $state(false);
23
+ </script>
24
+
25
+ <Story name="Left" args={{}}>
26
+ <Drawer_.Root
27
+ class=" border backdrop-blur-md backdrop-grayscale-100"
28
+ 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
+ }}
44
+ >
45
+ <Drawer_.Content
46
+ 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
+ }}
53
+ >
54
+ <Drawer_.Header class="flex items-center justify-between">
55
+ <div class="flex flex-col">
56
+ <Drawer_.Title class="text-lg font-semibold">Drawer Title</Drawer_.Title>
57
+ <Drawer_.Description class="text-sm break-all whitespace-break-spaces text-neutral-500"
58
+ >Ac bibendum laoreet lacinia purus duis. Hendrerit quam purus maecenas tincidunt letius
59
+ finibus vel tortor sociosqu proin vulputate. Consectetur velit eleifend purus mi
60
+ pulvinar si tristique litora mollis lobortis.</Drawer_.Description
61
+ >
62
+ </div>
63
+ </Drawer_.Header>
64
+ <div>
65
+ <div>Svelte Fluent</div>
66
+ </div>
67
+ </Drawer_.Content>
68
+ </Drawer_.Root>
69
+
70
+ <button
71
+ class="bg-red-500 p-2"
72
+ onclick={() => {
73
+ isOpen = !isOpen;
74
+ }}>Open</button
75
+ >
76
+ </Story>
77
+
78
+ <Story name="Top" args={{}}>
79
+ <Drawer_.Root
80
+ class=" border backdrop-blur-md backdrop-grayscale-100"
81
+ 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
+ }}
95
+ >
96
+ <Drawer_.Content
97
+ 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
+ }}
104
+ >
105
+ <div>
106
+ <div>Svelte Fluent</div>
107
+ </div>
108
+ </Drawer_.Content>
109
+ </Drawer_.Root>
110
+
111
+ <button
112
+ class="bg-red-500 p-2"
113
+ onclick={() => {
114
+ isOpen = !isOpen;
115
+ }}>Open</button
116
+ >
117
+ </Story>
118
+
119
+ <Story name="Right" args={{}}>
120
+ <Drawer_.Root
121
+ class=" border backdrop-blur-md backdrop-grayscale-100"
122
+ 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
+ }}
138
+ >
139
+ <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();
152
+ })}
153
+ >
154
+ <div>
155
+ <div>Svelte Fluent</div>
156
+ </div>
157
+ </Drawer_.Content>
158
+ </Drawer_.Root>
159
+
160
+ <button
161
+ class="bg-red-500 p-2"
162
+ onclick={() => {
163
+ isOpen = !isOpen;
164
+ }}>Open</button
165
+ >
166
+ </Story>
167
+
168
+ <Story name="Bottom" args={{}}>
169
+ <Drawer_.Root
170
+ class=" border backdrop-blur-md backdrop-grayscale-100"
171
+ bind:open={isOpen}
172
+ initial={(node) => {
173
+ animate(node, { opacity: +isOpen }, { duration: 0 });
174
+ }}
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
+ }}
187
+ >
188
+ <Drawer_.Content
189
+ 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
+ }}
199
+ >
200
+ <div>
201
+ <div>Svelte Fluent</div>
202
+ </div>
203
+ </Drawer_.Content>
204
+ </Drawer_.Root>
205
+
206
+ <button
207
+ class="bg-red-500 p-2"
208
+ onclick={() => {
209
+ isOpen = !isOpen;
210
+ }}>Open</button
211
+ >
212
+ </Story>
@@ -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 = 4,
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 })}