@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,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 })}
|
|
@@ -47,24 +47,27 @@
|
|
|
47
47
|
<!-- Compose ADropdown.Trigger with Input.Root for a custom trigger -->
|
|
48
48
|
<ADropdown.Trigger
|
|
49
49
|
base={Input.Root}
|
|
50
|
-
class="h-auto min-h-12 max-w-sm min-w-sm items-
|
|
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
51
|
onclick={(ev) => {
|
|
52
52
|
ev.preventDefault();
|
|
53
53
|
|
|
54
54
|
dropdown.state.open();
|
|
55
55
|
}}
|
|
56
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
57
|
<!-- Inline search input within the trigger -->
|
|
67
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}
|
|
68
71
|
</ADropdown.Trigger>
|
|
69
72
|
|
|
70
73
|
<!-- ADropdown list with filtered items -->
|
|
@@ -1,4 +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';
|
|
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
|
+
}
|
|
@@ -1,102 +1,109 @@
|
|
|
1
|
-
<script
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
$
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
function _factory() {
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
if (
|
|
53
|
-
return
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
defineProperty('value', () => value),
|
|
58
|
-
defineProperty('data', () => data)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
ev.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
{
|
|
100
|
-
|
|
101
|
-
{
|
|
102
|
-
|
|
1
|
+
<script lang="ts" generics="D">
|
|
2
|
+
import { nanoid } from 'nanoid';
|
|
3
|
+
import { defineProperty, defineState } from '../../../utils';
|
|
4
|
+
import {
|
|
5
|
+
DropdownItemController,
|
|
6
|
+
type DropdownItemProps as ControllerProps
|
|
7
|
+
} from './controller.svelte';
|
|
8
|
+
import type { DropdownItemProps } from './types';
|
|
9
|
+
import { DropdownBond } from '../bond.svelte';
|
|
10
|
+
import Item from '../../menu/item/menu-item.svelte';
|
|
11
|
+
|
|
12
|
+
const dropdown = DropdownBond.get();
|
|
13
|
+
|
|
14
|
+
if (!dropdown) {
|
|
15
|
+
throw new Error('<DropdownItem> must be used within a <Dropdown>.');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
class: klass = '',
|
|
20
|
+
preset = 'dropdown.item',
|
|
21
|
+
value = nanoid(),
|
|
22
|
+
data = undefined,
|
|
23
|
+
factory = _factory,
|
|
24
|
+
children = undefined,
|
|
25
|
+
onclick = undefined,
|
|
26
|
+
onmount = undefined,
|
|
27
|
+
ondestroy = undefined,
|
|
28
|
+
animate = undefined,
|
|
29
|
+
enter = undefined,
|
|
30
|
+
exit = undefined,
|
|
31
|
+
initial = undefined,
|
|
32
|
+
...restProps
|
|
33
|
+
}: DropdownItemProps<D> = $props();
|
|
34
|
+
|
|
35
|
+
let item: typeof Item = $state(undefined);
|
|
36
|
+
const controller = $derived(item?.getController());
|
|
37
|
+
const isHighlighted = $derived(controller?.isHighlighted ?? false);
|
|
38
|
+
const isSelected = $derived(controller?.isSelected ?? false);
|
|
39
|
+
|
|
40
|
+
// const item = factory().share();
|
|
41
|
+
|
|
42
|
+
const rootProps = $derived({
|
|
43
|
+
...controller?.elementProps(),
|
|
44
|
+
...restProps
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const ID = $props.id();
|
|
48
|
+
|
|
49
|
+
function _factory() {
|
|
50
|
+
const existing = (dropdown?.state as any)?.item?.(value);
|
|
51
|
+
|
|
52
|
+
if (existing) {
|
|
53
|
+
return existing as DropdownItemController<D>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const itemProps = defineState<ControllerProps<D>>([
|
|
57
|
+
defineProperty('value', () => value),
|
|
58
|
+
defineProperty('data', () => data),
|
|
59
|
+
defineProperty('id', () => value)
|
|
60
|
+
]);
|
|
61
|
+
const controller = new DropdownItemController<D>(() => itemProps);
|
|
62
|
+
|
|
63
|
+
controller.mount();
|
|
64
|
+
|
|
65
|
+
return controller;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function handleClick(ev: MouseEvent) {
|
|
69
|
+
onclick?.(ev);
|
|
70
|
+
|
|
71
|
+
if (ev.defaultPrevented) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
ev.preventDefault();
|
|
76
|
+
|
|
77
|
+
controller.toggle();
|
|
78
|
+
|
|
79
|
+
if (controller.dropdown?.state) {
|
|
80
|
+
controller.dropdown.state.query = '';
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
controller.close();
|
|
84
|
+
}
|
|
85
|
+
</script>
|
|
86
|
+
|
|
87
|
+
<Item
|
|
88
|
+
bind:this={item}
|
|
89
|
+
{preset}
|
|
90
|
+
class={[
|
|
91
|
+
isHighlighted && 'bg-foreground/5',
|
|
92
|
+
isSelected && 'bg-primary/5 hover:bg-primary/10 active:bg-primary/15',
|
|
93
|
+
'$preset',
|
|
94
|
+
klass
|
|
95
|
+
]
|
|
96
|
+
.filter(Boolean)
|
|
97
|
+
.join(' ')}
|
|
98
|
+
enter={enter?.bind(controller)}
|
|
99
|
+
exit={exit?.bind(controller)}
|
|
100
|
+
initial={initial?.bind(controller)}
|
|
101
|
+
animate={animate?.bind(controller)}
|
|
102
|
+
onmount={onmount?.bind(controller)}
|
|
103
|
+
ondestroy={ondestroy?.bind(controller)}
|
|
104
|
+
onclick={handleClick}
|
|
105
|
+
{factory}
|
|
106
|
+
{...rootProps}
|
|
107
|
+
>
|
|
108
|
+
{@render children?.({ dropdownItem: controller })}
|
|
109
|
+
</Item>
|
|
@@ -1,40 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
props: {
|
|
5
|
-
class?: string;
|
|
6
|
-
preset?: string;
|
|
7
|
-
value?: any;
|
|
8
|
-
data?: any;
|
|
9
|
-
factory?: () => DropdownItemBond<unknown>;
|
|
10
|
-
children?: any;
|
|
11
|
-
onclick?: any;
|
|
12
|
-
onmount?: any;
|
|
13
|
-
ondestroy?: any;
|
|
14
|
-
animate?: any;
|
|
15
|
-
enter?: any;
|
|
16
|
-
exit?: any;
|
|
17
|
-
initial?: any;
|
|
18
|
-
} & Record<string, any>;
|
|
1
|
+
import type { DropdownItemProps } from './types';
|
|
2
|
+
declare function $$render<D>(): {
|
|
3
|
+
props: DropdownItemProps<D>;
|
|
19
4
|
exports: {};
|
|
20
5
|
bindings: "";
|
|
21
6
|
slots: {};
|
|
22
7
|
events: {};
|
|
23
8
|
};
|
|
24
|
-
declare class __sveltets_Render<D
|
|
25
|
-
props(): ReturnType<typeof $$render<D
|
|
26
|
-
events(): ReturnType<typeof $$render<D
|
|
27
|
-
slots(): ReturnType<typeof $$render<D
|
|
9
|
+
declare class __sveltets_Render<D> {
|
|
10
|
+
props(): ReturnType<typeof $$render<D>>['props'];
|
|
11
|
+
events(): ReturnType<typeof $$render<D>>['events'];
|
|
12
|
+
slots(): ReturnType<typeof $$render<D>>['slots'];
|
|
28
13
|
bindings(): "";
|
|
29
14
|
exports(): {};
|
|
30
15
|
}
|
|
31
16
|
interface $$IsomorphicComponent {
|
|
32
|
-
new <D
|
|
33
|
-
$$bindings?: ReturnType<__sveltets_Render<D
|
|
34
|
-
} & ReturnType<__sveltets_Render<D
|
|
35
|
-
<D
|
|
36
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any
|
|
17
|
+
new <D>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<D>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<D>['props']>, ReturnType<__sveltets_Render<D>['events']>, ReturnType<__sveltets_Render<D>['slots']>> & {
|
|
18
|
+
$$bindings?: ReturnType<__sveltets_Render<D>['bindings']>;
|
|
19
|
+
} & ReturnType<__sveltets_Render<D>['exports']>;
|
|
20
|
+
<D>(internal: unknown, props: ReturnType<__sveltets_Render<D>['props']> & {}): ReturnType<__sveltets_Render<D>['exports']>;
|
|
21
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
37
22
|
}
|
|
38
23
|
declare const DropdownItem: $$IsomorphicComponent;
|
|
39
|
-
type DropdownItem<D
|
|
24
|
+
type DropdownItem<D> = InstanceType<typeof DropdownItem<D>>;
|
|
40
25
|
export default DropdownItem;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { MenuItemProps } from '../../menu/item/types';
|
|
3
|
+
import type { DropdownItemController } from './controller.svelte';
|
|
4
|
+
export interface DropdownItemProps<T = unknown> extends Omit<MenuItemProps, 'factory' | 'children' | 'preset'> {
|
|
5
|
+
/**
|
|
6
|
+
* Preset key for styling
|
|
7
|
+
* @default 'dropdown.item'
|
|
8
|
+
*/
|
|
9
|
+
preset?: string;
|
|
10
|
+
/**
|
|
11
|
+
* The value of the dropdown item
|
|
12
|
+
* @default nanoid()
|
|
13
|
+
*/
|
|
14
|
+
value?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Custom data associated with the item
|
|
17
|
+
*/
|
|
18
|
+
data?: T;
|
|
19
|
+
/**
|
|
20
|
+
* Factory function to create a custom DropdownItemController instance
|
|
21
|
+
*/
|
|
22
|
+
factory?: () => DropdownItemController<T>;
|
|
23
|
+
/**
|
|
24
|
+
* Render prop for children
|
|
25
|
+
*/
|
|
26
|
+
children?: Snippet<[{
|
|
27
|
+
dropdownItem: DropdownItemController<T>;
|
|
28
|
+
}]>;
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|