@svelte-atoms/core 1.0.0-alpha.31 → 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 +289 -853
- package/dist/attachments/index.d.ts +1 -0
- package/dist/attachments/index.js +1 -0
- package/dist/components/accordion/accordion-root.svelte +65 -65
- package/dist/components/accordion/accordion.stories.svelte +70 -70
- package/dist/components/accordion/item/accordion-item-body.svelte +44 -44
- package/dist/components/accordion/item/accordion-item-header.svelte +51 -51
- package/dist/components/accordion/item/accordion-item-indicator.svelte +51 -51
- package/dist/components/accordion/item/accordion-item-root.svelte +66 -66
- package/dist/components/alert/alert-close-button.svelte +66 -66
- package/dist/components/alert/alert-description.svelte +42 -42
- package/dist/components/alert/alert-root.svelte +68 -68
- package/dist/components/atom/html-atom.svelte +26 -194
- 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/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/calendar/calendar-day.svelte +101 -101
- package/dist/components/checkbox/checkbox.svelte +159 -159
- package/dist/components/collapsible/bond.svelte.js +2 -1
- package/dist/components/collapsible/collapsible-body.svelte +3 -2
- 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.stories.svelte +50 -0
- package/dist/components/combobox/combobox.stories.svelte.d.ts +3 -0
- package/dist/components/datagrid/tr/datagrid-tr.svelte +90 -90
- 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 +67 -67
- package/dist/components/dialog/bond.svelte.js +5 -20
- package/dist/components/dialog/dialog-content.svelte +44 -44
- package/dist/components/dialog/dialog-root.svelte +91 -91
- package/dist/components/drawer/bond.svelte.d.ts +18 -16
- package/dist/components/drawer/bond.svelte.js +8 -18
- package/dist/components/drawer/drawer-content.svelte +49 -49
- package/dist/components/drawer/drawer-root.svelte +5 -4
- package/dist/components/drawer/drawer.stories.svelte +141 -144
- package/dist/components/drawer/motion.js +1 -1
- 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 +21 -22
- package/dist/components/dropdown/bond.svelte.js +29 -53
- package/dist/components/dropdown/dropdown-root.svelte +65 -59
- 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 +83 -80
- package/dist/components/dropdown/index.d.ts +1 -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/list/list-item.svelte +20 -20
- package/dist/components/menu/atoms.d.ts +8 -3
- package/dist/components/menu/atoms.js +8 -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 +1 -0
- package/dist/components/menu/index.js +1 -0
- 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 +33 -33
- package/dist/components/menu/types.d.ts +0 -7
- package/dist/components/popover/bond.svelte.d.ts +11 -14
- package/dist/components/popover/bond.svelte.js +27 -44
- package/dist/components/popover/popover-content.svelte +137 -137
- package/dist/components/popover/popover.stories.svelte +37 -49
- package/dist/components/portal/active-portal.svelte +29 -29
- package/dist/components/portal/portal-root.svelte +76 -76
- package/dist/components/portal/teleport.svelte +49 -49
- package/dist/components/radio/radio.svelte +109 -109
- 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/root/l0-portal.svelte.d.ts +26 -0
- 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 +17 -18
- 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/sidebar/motion.svelte.js +3 -3
- package/dist/components/sidebar/sidebar-content.svelte +40 -40
- package/dist/components/textarea/textarea-input.svelte +9 -9
- package/dist/components/textarea/textarea-root.svelte +9 -9
- package/dist/components/tooltip/tooltip-trigger.svelte +39 -39
- 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/context/preset.svelte.d.ts +3 -1
- package/dist/icons/icon-copy.svelte +6 -6
- 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 -2
- 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 -69
- package/dist/components/menu/menu-item.svelte.d.ts +0 -37
- package/dist/utils/markdown-to-llm.d.ts +0 -28
- package/dist/utils/markdown-to-llm.js +0 -76
|
@@ -1,59 +1,65 @@
|
|
|
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
|
|
51
|
-
return new DropdownBond(bondState);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function getBond() {
|
|
55
|
-
return bond;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
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(() => props);
|
|
51
|
+
return new DropdownBond(bondState);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function getBond() {
|
|
55
|
+
return bond;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
$effect(() => {
|
|
59
|
+
return () => {
|
|
60
|
+
bond.destroy();
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
{@render children?.({ dropdown: bond })}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { DropdownBond } from './bond.svelte';
|
|
3
|
-
|
|
4
|
-
const bond = DropdownBond.get();
|
|
5
|
-
|
|
6
|
-
if (!bond) {
|
|
7
|
-
throw new Error('DropdownValue must be used within a Dropdown');
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const selectedItems = $derived(bond.state.selectedItems);
|
|
11
|
-
|
|
12
|
-
let {
|
|
13
|
-
</script>
|
|
14
|
-
|
|
15
|
-
<!-- <Render class={cn('dropdown-value inline-flex gap-2 items-center flex-wrap', klass)} {...restProps}>
|
|
16
|
-
</Render> -->
|
|
17
|
-
{@render children?.({ items: selectedItems })}
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { DropdownBond } from './bond.svelte';
|
|
3
|
+
|
|
4
|
+
const bond = DropdownBond.get();
|
|
5
|
+
|
|
6
|
+
if (!bond) {
|
|
7
|
+
throw new Error('DropdownValue must be used within a Dropdown');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const selectedItems = $derived(bond.state.selectedItems);
|
|
11
|
+
|
|
12
|
+
let { children } = $props();
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<!-- <Render class={cn('dropdown-value inline-flex gap-2 items-center flex-wrap', klass)} {...restProps}>
|
|
16
|
+
</Render> -->
|
|
17
|
+
{@render children?.({ items: selectedItems })}
|
|
@@ -1,80 +1,83 @@
|
|
|
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-
|
|
51
|
-
onclick={(ev) => {
|
|
52
|
-
ev.preventDefault();
|
|
53
|
-
|
|
54
|
-
dropdown.state.open();
|
|
55
|
-
}}
|
|
56
|
-
>
|
|
57
|
-
<!--
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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="flex h-auto min-h-12 max-w-sm min-w-sm flex-col items-start gap-1 rounded-sm px-4 transition-colors duration-200"
|
|
51
|
+
onclick={(ev) => {
|
|
52
|
+
ev.preventDefault();
|
|
53
|
+
|
|
54
|
+
dropdown.state.open();
|
|
55
|
+
}}
|
|
56
|
+
>
|
|
57
|
+
<!-- Inline search input within the trigger -->
|
|
58
|
+
<ADropdown.Query class="flex-1 px-1" placeholder="Search for fruits..." />
|
|
59
|
+
<!-- Display selected values with animation -->
|
|
60
|
+
{#if dropdown?.state?.selectedItems?.length}
|
|
61
|
+
<div class="flex flex-wrap gap-1">
|
|
62
|
+
{#each dropdown?.state?.selectedItems ?? [] as item (item.id)}
|
|
63
|
+
<div animate:flip={{ duration: 200 }}>
|
|
64
|
+
<ADropdown.Value value={item.value} class="text-foreground/80">
|
|
65
|
+
{item.text}
|
|
66
|
+
</ADropdown.Value>
|
|
67
|
+
</div>
|
|
68
|
+
{/each}
|
|
69
|
+
</div>
|
|
70
|
+
{/if}
|
|
71
|
+
</ADropdown.Trigger>
|
|
72
|
+
|
|
73
|
+
<!-- ADropdown list with filtered items -->
|
|
74
|
+
<ADropdown.List>
|
|
75
|
+
{#each dd.current as item (item.id)}
|
|
76
|
+
<div animate:flip={{ duration: 200 }}>
|
|
77
|
+
<ADropdown.Item value={item.value}>{item.text}</ADropdown.Item>
|
|
78
|
+
</div>
|
|
79
|
+
{/each}
|
|
80
|
+
</ADropdown.List>
|
|
81
|
+
{/snippet}
|
|
82
|
+
</ADropdown.Root>
|
|
83
|
+
</Story>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * as Dropdown from './atoms';
|
|
2
2
|
export { DropdownBond, type DropdownBondElements, DropdownBondState, type DropdownStateProps } from './bond.svelte';
|
|
3
|
+
export * from './item';
|
|
3
4
|
export { filter } from './runes.svelte';
|
|
4
5
|
export * from './types';
|
|
5
6
|
export type { AnimatePopoverContentParams as AnimateDropdownContentParams, animatePopoverContent as animateDropdownContent } from '../popover/motion';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { DropdownBond } from '../bond.svelte';
|
|
2
|
-
import {
|
|
3
|
-
export declare function dropdownItem(callback: (node: HTMLElement, item?:
|
|
2
|
+
import { DropdownItemController } from './controller.svelte';
|
|
3
|
+
export declare function dropdownItem(callback: (node: HTMLElement, item?: DropdownItemController, dropdown?: DropdownBond) => any): (node: HTMLElement) => any;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DropdownItemController } from './controller.svelte';
|
|
2
2
|
export function dropdownItem(callback) {
|
|
3
|
-
const item =
|
|
3
|
+
const item = DropdownItemController.get();
|
|
4
4
|
const bond = item?.dropdown;
|
|
5
5
|
return (node) => callback(node, item, bond);
|
|
6
6
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DropdownBond, DropdownBondState, type DropdownStateProps } from '../bond.svelte';
|
|
2
|
+
import { MenuItemController } from '../../menu';
|
|
3
|
+
export type DropdownItemProps<T = unknown> = {
|
|
4
|
+
id?: string;
|
|
5
|
+
value: string;
|
|
6
|
+
data?: T;
|
|
7
|
+
};
|
|
8
|
+
export declare class DropdownItemController<T = unknown> extends MenuItemController {
|
|
9
|
+
#private;
|
|
10
|
+
static CONTEXT_KEY: string;
|
|
11
|
+
constructor(props: () => DropdownItemProps<T>);
|
|
12
|
+
get value(): any;
|
|
13
|
+
get data(): any;
|
|
14
|
+
get element(): HTMLElement | null;
|
|
15
|
+
get dropdown(): DropdownBond<DropdownStateProps, DropdownBondState<DropdownStateProps>, import("..").DropdownBondElements> | undefined;
|
|
16
|
+
get text(): string;
|
|
17
|
+
get isHighlighted(): boolean;
|
|
18
|
+
get isSelected(): boolean;
|
|
19
|
+
select(): void;
|
|
20
|
+
unselect(): void;
|
|
21
|
+
toggle(): void;
|
|
22
|
+
close(): void;
|
|
23
|
+
share(): DropdownItemController<T>;
|
|
24
|
+
elementProps(): {
|
|
25
|
+
[x: symbol]: (node: HTMLElement) => () => void;
|
|
26
|
+
id: string;
|
|
27
|
+
role: string;
|
|
28
|
+
'aria-selected': boolean;
|
|
29
|
+
'data-selected': boolean;
|
|
30
|
+
'data-highlighted': boolean;
|
|
31
|
+
};
|
|
32
|
+
static get<T = unknown>(): DropdownItemController<T> | undefined;
|
|
33
|
+
static set<T = unknown>(item: DropdownItemController<T>): DropdownItemController<T>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { getContext, setContext } from 'svelte';
|
|
2
|
+
import { createAttachmentKey } from 'svelte/attachments';
|
|
3
|
+
import { DropdownBond, DropdownBondState } from '../bond.svelte';
|
|
4
|
+
import { MenuItemController } from '../../menu';
|
|
5
|
+
export class DropdownItemController extends MenuItemController {
|
|
6
|
+
static CONTEXT_KEY = '@atoms/context/dropdown/item';
|
|
7
|
+
#element = null;
|
|
8
|
+
#dropdown;
|
|
9
|
+
#unmount;
|
|
10
|
+
constructor(props) {
|
|
11
|
+
super(props);
|
|
12
|
+
this.#dropdown = DropdownBond.get();
|
|
13
|
+
if (!this.#dropdown) {
|
|
14
|
+
throw new Error('DropdownItem must be used within a Dropdown context');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
get value() {
|
|
18
|
+
return this.props?.value;
|
|
19
|
+
}
|
|
20
|
+
get data() {
|
|
21
|
+
return this.props?.data;
|
|
22
|
+
}
|
|
23
|
+
get element() {
|
|
24
|
+
return this.#element;
|
|
25
|
+
}
|
|
26
|
+
get dropdown() {
|
|
27
|
+
return this.#dropdown;
|
|
28
|
+
}
|
|
29
|
+
get text() {
|
|
30
|
+
const element = (this.#element?.querySelector('[data-text]') ?? this.#element);
|
|
31
|
+
return element?.innerText ?? '';
|
|
32
|
+
}
|
|
33
|
+
get isHighlighted() {
|
|
34
|
+
return this.#dropdown?.state.highlightedItem?.id === this.id;
|
|
35
|
+
}
|
|
36
|
+
get isSelected() {
|
|
37
|
+
return this.#dropdown?.state.props.values?.includes(this.value) ?? false;
|
|
38
|
+
}
|
|
39
|
+
select() {
|
|
40
|
+
this.#dropdown?.state.select([this.value]);
|
|
41
|
+
}
|
|
42
|
+
unselect() {
|
|
43
|
+
this.#dropdown?.state.unselect([this.value]);
|
|
44
|
+
}
|
|
45
|
+
toggle() {
|
|
46
|
+
if (this.isSelected) {
|
|
47
|
+
this.unselect();
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.select();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
close() {
|
|
54
|
+
this.#dropdown?.state.close();
|
|
55
|
+
}
|
|
56
|
+
share() {
|
|
57
|
+
return DropdownItemController.set(this);
|
|
58
|
+
}
|
|
59
|
+
elementProps() {
|
|
60
|
+
const itemId = `item-${this.id}`;
|
|
61
|
+
return {
|
|
62
|
+
id: itemId,
|
|
63
|
+
role: 'option',
|
|
64
|
+
'aria-selected': this.isSelected,
|
|
65
|
+
'data-selected': this.isSelected,
|
|
66
|
+
'data-highlighted': this.isHighlighted,
|
|
67
|
+
[createAttachmentKey()]: (node) => {
|
|
68
|
+
this.#element = node;
|
|
69
|
+
return () => {
|
|
70
|
+
this.#unmount?.();
|
|
71
|
+
this.#element = null;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
static get() {
|
|
77
|
+
return getContext(DropdownItemController.CONTEXT_KEY);
|
|
78
|
+
}
|
|
79
|
+
static set(item) {
|
|
80
|
+
return setContext(DropdownItemController.CONTEXT_KEY, item);
|
|
81
|
+
}
|
|
82
|
+
}
|