@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.
- package/README.md +853 -852
- package/dist/components/accordion/accordion-root.svelte +7 -3
- package/dist/components/accordion/accordion.stories.svelte +7 -82
- package/dist/components/accordion/item/accordion-item-body.svelte +44 -42
- package/dist/components/accordion/item/accordion-item-header.svelte +51 -50
- package/dist/components/accordion/item/accordion-item-indicator.svelte +51 -50
- package/dist/components/accordion/item/accordion-item-root.svelte +66 -65
- package/dist/components/accordion/item/bond.svelte.d.ts +2 -0
- package/dist/components/accordion/item/index.d.ts +3 -0
- package/dist/components/accordion/item/index.js +3 -0
- package/dist/components/accordion/item/motion.svelte.d.ts +15 -0
- package/dist/components/accordion/item/motion.svelte.js +30 -0
- package/dist/components/accordion/item/types.d.ts +7 -24
- package/dist/components/alert/alert-close-button.svelte +66 -70
- package/dist/components/alert/alert-description.svelte +42 -42
- package/dist/components/alert/alert-description.svelte.d.ts +3 -6
- package/dist/components/alert/alert-root.svelte +68 -103
- package/dist/components/alert/alert-root.svelte.d.ts +2 -2
- package/dist/components/alert/alert.stories.svelte +400 -400
- package/dist/components/alert/bond.svelte.d.ts +0 -13
- package/dist/components/alert/bond.svelte.js +0 -32
- package/dist/components/alert/types.d.ts +8 -32
- package/dist/components/atom/html-atom.svelte +261 -261
- package/dist/components/avatar/avatar.stories.svelte +22 -22
- package/dist/components/badge/badge.stories.svelte +12 -12
- package/dist/components/badge/badge.svelte +19 -19
- package/dist/components/breadcrumb/breadcrumb.stories.svelte +5 -5
- package/dist/components/button/button.stories.svelte +27 -27
- package/dist/components/calendar/calendar-day.svelte +101 -96
- package/dist/components/calendar/calendar.stories.svelte +26 -26
- package/dist/components/card/card-body.svelte +39 -39
- package/dist/components/card/card-footer.svelte +41 -41
- package/dist/components/card/card-root.svelte +91 -91
- package/dist/components/card/card.stories.svelte +133 -133
- package/dist/components/checkbox/checkbox.stories.svelte +22 -22
- package/dist/components/checkbox/checkbox.svelte +6 -2
- package/dist/components/collapsible/collapsible.stories.svelte +172 -172
- package/dist/components/combobox/atoms.d.ts +1 -1
- package/dist/components/combobox/atoms.js +1 -1
- package/dist/components/combobox/combobox-root.svelte +65 -65
- package/dist/components/combobox/compobox.stories.svelte +51 -51
- package/dist/components/combobox/index.d.ts +1 -0
- package/dist/components/container/container.stories.svelte +20 -20
- package/dist/components/container/container.svelte.d.ts +1 -1
- package/dist/components/datagrid/datagrid.stories.svelte +72 -72
- package/dist/components/datagrid/tr/bond.svelte.d.ts +4 -2
- package/dist/components/datagrid/tr/bond.svelte.js +9 -7
- package/dist/components/datagrid/tr/datagrid-tr.svelte +90 -88
- package/dist/components/date-picker/date-picker-calendar.svelte +67 -67
- package/dist/components/date-picker/date-picker-root.svelte +95 -95
- package/dist/components/date-picker/date-picker.stories.svelte +35 -35
- package/dist/components/dialog/bond.svelte.d.ts +13 -3
- package/dist/components/dialog/bond.svelte.js +66 -5
- package/dist/components/dialog/dialog-content.svelte +44 -62
- package/dist/components/dialog/dialog-root.svelte +91 -110
- package/dist/components/dialog/dialog.stories.svelte +64 -64
- package/dist/components/dialog/motion.svelte.d.ts +13 -0
- package/dist/components/dialog/motion.svelte.js +44 -0
- package/dist/components/drawer/attachments.svelte.d.ts +1 -1
- package/dist/components/drawer/attachments.svelte.js +1 -3
- package/dist/components/drawer/bond.svelte.d.ts +24 -5
- package/dist/components/drawer/bond.svelte.js +77 -11
- package/dist/components/drawer/drawer-content.svelte +6 -14
- package/dist/components/drawer/drawer.stories.svelte +27 -95
- package/dist/components/drawer/index.d.ts +2 -0
- package/dist/components/drawer/index.js +2 -0
- package/dist/components/drawer/motion.d.ts +15 -0
- package/dist/components/drawer/motion.js +28 -0
- package/dist/components/dropdown/atoms.d.ts +1 -1
- package/dist/components/dropdown/atoms.js +1 -1
- package/dist/components/dropdown/bond.svelte.d.ts +5 -1
- package/dist/components/dropdown/dropdown-root.svelte +59 -59
- package/dist/components/dropdown/dropdown.stories.svelte +80 -80
- package/dist/components/dropdown/index.d.ts +1 -0
- package/dist/components/form/form.stories.svelte +96 -96
- package/dist/components/image/image.stories.svelte +20 -20
- package/dist/components/input/input.stories.svelte +35 -35
- package/dist/components/label/label.stories.svelte +15 -15
- package/dist/components/lazy/lazy.stories.svelte +28 -28
- package/dist/components/link/link.stories.svelte +15 -15
- package/dist/components/list/list-item.svelte +20 -20
- package/dist/components/menu/atoms.d.ts +1 -0
- package/dist/components/menu/atoms.js +1 -0
- package/dist/components/menu/index.d.ts +2 -1
- package/dist/components/menu/index.js +1 -1
- package/dist/components/menu/menu-item.svelte +69 -51
- package/dist/components/menu/menu-item.svelte.d.ts +1 -0
- package/dist/components/menu/menu.stories.svelte +33 -33
- package/dist/components/popover/bond.svelte.d.ts +20 -7
- package/dist/components/popover/bond.svelte.js +80 -27
- package/dist/components/popover/motion.d.ts +6 -0
- package/dist/components/popover/motion.js +56 -0
- package/dist/components/popover/popover-arrow.svelte +111 -111
- package/dist/components/popover/popover-content.svelte +34 -72
- package/dist/components/popover/popover-indicator.svelte +44 -44
- package/dist/components/popover/popover-root.svelte +48 -48
- package/dist/components/popover/popover.stories.svelte +3 -3
- package/dist/components/popover/types.d.ts +9 -7
- package/dist/components/portal/active-portal.svelte +29 -22
- package/dist/components/portal/active-portal.svelte.d.ts +2 -9
- package/dist/components/portal/portal-root.svelte +76 -83
- package/dist/components/portal/portal-root.svelte.d.ts +4 -6
- package/dist/components/portal/teleport.svelte +49 -50
- package/dist/components/portal/teleport.svelte.d.ts +3 -4
- package/dist/components/qr-code/qr-code.stories.svelte +18 -18
- package/dist/components/radio/radio-group.stories.svelte +41 -41
- package/dist/components/radio/radio.stories.svelte +17 -17
- package/dist/components/radio/radio.svelte +1 -1
- package/dist/components/radio/types.d.ts +98 -0
- package/dist/components/radio/types.js +2 -0
- package/dist/components/root/root.svelte +13 -30
- package/dist/components/root/root.svelte.d.ts +1 -1
- package/dist/components/scrollable/scrollable-root.svelte.d.ts +2 -2
- package/dist/components/scrollable/scrollable.stories.svelte +116 -116
- package/dist/components/sidebar/index.d.ts +2 -0
- package/dist/components/sidebar/index.js +2 -0
- package/dist/components/sidebar/motion.svelte.d.ts +11 -0
- package/dist/components/sidebar/motion.svelte.js +16 -0
- package/dist/components/sidebar/sidebar-content.svelte +3 -13
- package/dist/components/sidebar/sidebar-root.svelte +39 -39
- package/dist/components/sidebar/sidebar.stories.svelte +43 -43
- package/dist/components/sidebar/types.d.ts +2 -12
- package/dist/components/tabs/tabs.stories.svelte +56 -56
- package/dist/components/textarea/atoms.d.ts +1 -0
- package/dist/components/textarea/atoms.js +1 -0
- package/dist/components/textarea/textarea-input.svelte +9 -6
- package/dist/components/textarea/textarea-root.svelte +9 -9
- package/dist/components/textarea/textarea-root.svelte.d.ts +2 -0
- package/dist/components/tooltip/tooltip-trigger.svelte +2 -2
- package/dist/components/tooltip/tooltip-trigger.svelte.d.ts +1 -0
- package/dist/components/tooltip/tooltip.stories.svelte +32 -32
- package/dist/components/tree/tree.stories.svelte +142 -142
- package/dist/icons/icon-copy.svelte +6 -0
- package/dist/{components/radio/types.svelte.d.ts → icons/icon-copy.svelte.d.ts} +3 -3
- package/dist/utils/markdown-to-llm.d.ts +28 -0
- package/dist/utils/markdown-to-llm.js +76 -0
- package/package.json +1 -2
- package/dist/components/radio/types.svelte +0 -0
- package/llm/composition.md +0 -395
- package/llm/crafting.md +0 -838
- package/llm/motion.md +0 -970
- package/llm/philosophy.md +0 -23
- package/llm/preset-variant-integration.md +0 -516
- package/llm/preset.md +0 -383
- package/llm/styling.md +0 -216
- package/llm/usage.md +0 -46
- 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
|
-
|
|
30
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
83
|
-
animate={(
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
124
|
-
|
|
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-
|
|
141
|
-
|
|
142
|
-
|
|
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={(
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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-
|
|
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';
|