@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.
- package/LICENSE +21 -0
- package/README.md +176 -739
- package/dist/attachments/index.d.ts +1 -0
- package/dist/attachments/index.js +1 -0
- package/dist/components/accordion/accordion-root.svelte +65 -61
- package/dist/components/accordion/accordion.stories.svelte +70 -145
- package/dist/components/accordion/item/accordion-item-body.svelte +6 -4
- package/dist/components/accordion/item/accordion-item-header.svelte +2 -1
- package/dist/components/accordion/item/accordion-item-indicator.svelte +2 -1
- package/dist/components/accordion/item/accordion-item-root.svelte +2 -1
- 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 +32 -36
- package/dist/components/alert/alert-description.svelte +1 -1
- package/dist/components/alert/alert-description.svelte.d.ts +3 -6
- package/dist/components/alert/alert-root.svelte +3 -38
- 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 +93 -261
- package/dist/components/atom/types.d.ts +3 -2
- package/dist/components/atom/utils.d.ts +37 -0
- package/dist/components/atom/utils.js +208 -0
- 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-item.svelte +1 -1
- package/dist/components/breadcrumb/breadcrumb-separator.svelte +5 -1
- package/dist/components/breadcrumb/breadcrumb.stories.svelte +16 -16
- package/dist/components/button/button.stories.svelte +27 -27
- package/dist/components/calendar/calendar-day.svelte +9 -4
- 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 +159 -155
- package/dist/components/collapsible/bond.svelte.js +2 -1
- package/dist/components/collapsible/collapsible-body.svelte +3 -2
- package/dist/components/collapsible/collapsible.stories.svelte +172 -172
- package/dist/components/collapsible/motion.svelte.d.ts +6 -0
- package/dist/components/collapsible/motion.svelte.js +15 -0
- package/dist/components/combobox/atoms.d.ts +3 -3
- package/dist/components/combobox/atoms.js +3 -3
- package/dist/components/combobox/bond.svelte.d.ts +6 -6
- package/dist/components/combobox/bond.svelte.js +3 -26
- package/dist/components/combobox/combobox-control.svelte +52 -52
- package/dist/components/combobox/{compobox-item.svelte → combobox-item.svelte} +62 -68
- package/dist/components/combobox/combobox-item.svelte.d.ts +12 -0
- package/dist/components/combobox/combobox-root.svelte +65 -65
- package/dist/components/combobox/combobox.stories.svelte +50 -0
- package/dist/components/combobox/combobox.stories.svelte.d.ts +3 -0
- 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 +9 -7
- package/dist/components/date-picker/bond.svelte.d.ts +15 -5
- package/dist/components/date-picker/bond.svelte.js +5 -11
- package/dist/components/date-picker/date-picker-calendar.svelte +2 -2
- 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 +52 -6
- package/dist/components/dialog/dialog-content.svelte +2 -20
- package/dist/components/dialog/dialog-root.svelte +3 -22
- 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 +30 -9
- package/dist/components/drawer/bond.svelte.js +80 -24
- package/dist/components/drawer/drawer-content.svelte +49 -57
- package/dist/components/drawer/drawer-root.svelte +5 -4
- package/dist/components/drawer/drawer.stories.svelte +141 -212
- 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 +22 -19
- package/dist/components/dropdown/bond.svelte.js +29 -53
- package/dist/components/dropdown/dropdown-root.svelte +7 -1
- package/dist/components/dropdown/dropdown-values.svelte +17 -17
- package/dist/components/dropdown/dropdown-values.svelte.d.ts +1 -2
- package/dist/components/dropdown/dropdown.stories.svelte +13 -10
- package/dist/components/dropdown/index.d.ts +2 -0
- package/dist/components/dropdown/index.js +1 -0
- package/dist/components/dropdown/item/attachments.svelte.d.ts +2 -2
- package/dist/components/dropdown/item/attachments.svelte.js +2 -2
- package/dist/components/dropdown/item/controller.svelte.d.ts +34 -0
- package/dist/components/dropdown/item/controller.svelte.js +82 -0
- package/dist/components/dropdown/item/dropdown-item.svelte +109 -102
- package/dist/components/dropdown/item/dropdown-item.svelte.d.ts +13 -28
- package/dist/components/dropdown/item/index.d.ts +3 -0
- package/dist/components/dropdown/item/index.js +3 -0
- package/dist/components/dropdown/item/types.d.ts +29 -0
- package/dist/components/dropdown/item/types.js +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 +2 -2
- package/dist/components/menu/atoms.d.ts +9 -3
- package/dist/components/menu/atoms.js +9 -3
- package/dist/components/menu/bond.svelte.d.ts +54 -0
- package/dist/components/menu/bond.svelte.js +132 -0
- package/dist/components/menu/index.d.ts +3 -1
- package/dist/components/menu/index.js +2 -1
- package/dist/components/menu/item/controller.svelte.d.ts +26 -0
- package/dist/components/menu/item/controller.svelte.js +69 -0
- package/dist/components/menu/item/index.d.ts +2 -0
- package/dist/components/menu/item/index.js +2 -0
- package/dist/components/menu/item/menu-item.svelte +103 -0
- package/dist/components/menu/item/menu-item.svelte.d.ts +31 -0
- package/dist/components/menu/item/types.d.ts +62 -0
- package/dist/components/menu/item/types.js +1 -0
- package/dist/components/menu/{menu-list.svelte → menu-content.svelte} +40 -40
- package/dist/components/menu/{menu-list.svelte.d.ts → menu-content.svelte.d.ts} +3 -3
- package/dist/components/menu/menu-root.svelte +15 -0
- package/dist/components/menu/menu-root.svelte.d.ts +8 -0
- package/dist/components/menu/menu.stories.svelte +5 -5
- package/dist/components/menu/types.d.ts +0 -7
- package/dist/components/popover/bond.svelte.d.ts +18 -8
- package/dist/components/popover/bond.svelte.js +76 -40
- 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 +137 -175
- 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 +37 -49
- package/dist/components/popover/types.d.ts +9 -7
- package/dist/components/portal/active-portal.svelte +12 -5
- package/dist/components/portal/active-portal.svelte.d.ts +2 -9
- package/dist/components/portal/portal-root.svelte +1 -8
- package/dist/components/portal/portal-root.svelte.d.ts +4 -6
- package/dist/components/portal/teleport.svelte +1 -2
- 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 +109 -109
- package/dist/components/radio/types.d.ts +98 -0
- package/dist/components/radio/types.js +2 -0
- package/dist/components/root/index.d.ts +1 -0
- package/dist/components/root/index.js +1 -0
- package/dist/components/root/l0-portal.svelte +8 -0
- package/dist/components/{radio/types.svelte.d.ts → root/l0-portal.svelte.d.ts} +3 -3
- package/dist/components/root/l1-portal.svelte +7 -0
- package/dist/components/root/l1-portal.svelte.d.ts +26 -0
- package/dist/components/root/root.css +119 -119
- package/dist/components/root/root.svelte +26 -44
- package/dist/components/root/root.svelte.d.ts +2 -6
- package/dist/components/root/toasts-portal.svelte +7 -0
- package/dist/components/root/toasts-portal.svelte.d.ts +26 -0
- package/dist/components/root/types.d.ts +17 -0
- 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 +40 -50
- 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 +4 -1
- package/dist/components/textarea/textarea-root.svelte +2 -2
- package/dist/components/textarea/textarea-root.svelte.d.ts +2 -0
- package/dist/components/tooltip/tooltip-trigger.svelte +39 -39
- package/dist/components/tooltip/tooltip-trigger.svelte.d.ts +1 -0
- package/dist/components/tooltip/tooltip.stories.svelte +32 -32
- package/dist/components/tree/index.d.ts +1 -0
- package/dist/components/tree/index.js +1 -0
- package/dist/components/tree/motion.svelte.d.ts +6 -0
- package/dist/components/tree/motion.svelte.js +14 -0
- package/dist/components/tree/tree-body.svelte +4 -3
- package/dist/components/tree/tree.stories.svelte +142 -142
- package/dist/context/preset.svelte.d.ts +3 -1
- package/dist/icons/icon-copy.svelte +6 -0
- package/dist/icons/icon-copy.svelte.d.ts +26 -0
- package/dist/utils/dom.svelte.d.ts +2 -0
- package/dist/utils/dom.svelte.js +21 -0
- package/dist/utils/function.d.ts +1 -1
- package/dist/utils/promise.svelte.d.ts +5 -0
- package/dist/utils/promise.svelte.js +20 -0
- package/package.json +4 -3
- package/dist/components/combobox/compobox-item.svelte.d.ts +0 -34
- package/dist/components/combobox/compobox.stories.svelte +0 -51
- package/dist/components/combobox/compobox.stories.svelte.d.ts +0 -3
- package/dist/components/dropdown/item/bond.svelte.d.ts +0 -42
- package/dist/components/dropdown/item/bond.svelte.js +0 -99
- package/dist/components/menu/menu-item.svelte +0 -51
- package/dist/components/menu/menu-item.svelte.d.ts +0 -36
- 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,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
|
|
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
|
|
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 {
|
|
2
|
-
export { default as
|
|
3
|
-
|
|
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 {
|
|
2
|
-
export { default as
|
|
3
|
-
|
|
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
|
|
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';
|