@svelte-atoms/core 1.0.0-alpha.31 → 1.0.0-alpha.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +289 -853
  3. package/dist/attachments/index.d.ts +1 -0
  4. package/dist/attachments/index.js +1 -0
  5. package/dist/components/accordion/accordion-root.svelte +65 -65
  6. package/dist/components/accordion/accordion.stories.svelte +70 -70
  7. package/dist/components/accordion/item/accordion-item-body.svelte +44 -44
  8. package/dist/components/accordion/item/accordion-item-header.svelte +51 -51
  9. package/dist/components/accordion/item/accordion-item-indicator.svelte +51 -51
  10. package/dist/components/accordion/item/accordion-item-root.svelte +66 -66
  11. package/dist/components/alert/alert-close-button.svelte +66 -66
  12. package/dist/components/alert/alert-description.svelte +42 -42
  13. package/dist/components/alert/alert-root.svelte +68 -68
  14. package/dist/components/atom/html-atom.svelte +26 -194
  15. package/dist/components/atom/types.d.ts +3 -2
  16. package/dist/components/atom/utils.d.ts +37 -0
  17. package/dist/components/atom/utils.js +208 -0
  18. package/dist/components/breadcrumb/breadcrumb-item.svelte +1 -1
  19. package/dist/components/breadcrumb/breadcrumb-separator.svelte +5 -1
  20. package/dist/components/breadcrumb/breadcrumb.stories.svelte +16 -16
  21. package/dist/components/calendar/calendar-day.svelte +101 -101
  22. package/dist/components/checkbox/checkbox.svelte +159 -159
  23. package/dist/components/collapsible/bond.svelte.js +2 -1
  24. package/dist/components/collapsible/collapsible-body.svelte +3 -2
  25. package/dist/components/collapsible/motion.svelte.d.ts +6 -0
  26. package/dist/components/collapsible/motion.svelte.js +15 -0
  27. package/dist/components/combobox/atoms.d.ts +3 -3
  28. package/dist/components/combobox/atoms.js +3 -3
  29. package/dist/components/combobox/bond.svelte.d.ts +6 -6
  30. package/dist/components/combobox/bond.svelte.js +3 -26
  31. package/dist/components/combobox/combobox-control.svelte +52 -52
  32. package/dist/components/combobox/{compobox-item.svelte → combobox-item.svelte} +62 -68
  33. package/dist/components/combobox/combobox-item.svelte.d.ts +12 -0
  34. package/dist/components/combobox/combobox.stories.svelte +50 -0
  35. package/dist/components/combobox/combobox.stories.svelte.d.ts +3 -0
  36. package/dist/components/datagrid/tr/datagrid-tr.svelte +90 -90
  37. package/dist/components/date-picker/bond.svelte.d.ts +15 -5
  38. package/dist/components/date-picker/bond.svelte.js +6 -11
  39. package/dist/components/date-picker/date-picker-calendar.svelte +1 -8
  40. package/dist/components/dialog/bond.svelte.js +5 -20
  41. package/dist/components/dialog/dialog-content.svelte +44 -44
  42. package/dist/components/dialog/dialog-root.svelte +91 -91
  43. package/dist/components/drawer/bond.svelte.d.ts +18 -16
  44. package/dist/components/drawer/bond.svelte.js +8 -18
  45. package/dist/components/drawer/drawer-content.svelte +49 -49
  46. package/dist/components/drawer/drawer-root.svelte +5 -4
  47. package/dist/components/drawer/drawer.stories.svelte +141 -144
  48. package/dist/components/drawer/motion.js +1 -1
  49. package/dist/components/dropdown/atoms.d.ts +1 -1
  50. package/dist/components/dropdown/atoms.js +1 -1
  51. package/dist/components/dropdown/bond.svelte.d.ts +21 -22
  52. package/dist/components/dropdown/bond.svelte.js +29 -53
  53. package/dist/components/dropdown/dropdown-root.svelte +65 -59
  54. package/dist/components/dropdown/dropdown-values.svelte +17 -17
  55. package/dist/components/dropdown/dropdown-values.svelte.d.ts +1 -2
  56. package/dist/components/dropdown/dropdown.stories.svelte +83 -80
  57. package/dist/components/dropdown/index.d.ts +1 -0
  58. package/dist/components/dropdown/index.js +1 -0
  59. package/dist/components/dropdown/item/attachments.svelte.d.ts +2 -2
  60. package/dist/components/dropdown/item/attachments.svelte.js +2 -2
  61. package/dist/components/dropdown/item/controller.svelte.d.ts +34 -0
  62. package/dist/components/dropdown/item/controller.svelte.js +82 -0
  63. package/dist/components/dropdown/item/dropdown-item.svelte +109 -102
  64. package/dist/components/dropdown/item/dropdown-item.svelte.d.ts +13 -28
  65. package/dist/components/dropdown/item/index.d.ts +3 -0
  66. package/dist/components/dropdown/item/index.js +3 -0
  67. package/dist/components/dropdown/item/types.d.ts +29 -0
  68. package/dist/components/dropdown/item/types.js +1 -0
  69. package/dist/components/list/list-item.svelte +20 -20
  70. package/dist/components/menu/atoms.d.ts +8 -3
  71. package/dist/components/menu/atoms.js +8 -3
  72. package/dist/components/menu/bond.svelte.d.ts +54 -0
  73. package/dist/components/menu/bond.svelte.js +132 -0
  74. package/dist/components/menu/index.d.ts +1 -0
  75. package/dist/components/menu/index.js +1 -0
  76. package/dist/components/menu/item/controller.svelte.d.ts +26 -0
  77. package/dist/components/menu/item/controller.svelte.js +69 -0
  78. package/dist/components/menu/item/index.d.ts +2 -0
  79. package/dist/components/menu/item/index.js +2 -0
  80. package/dist/components/menu/item/menu-item.svelte +103 -0
  81. package/dist/components/menu/item/menu-item.svelte.d.ts +31 -0
  82. package/dist/components/menu/item/types.d.ts +62 -0
  83. package/dist/components/menu/item/types.js +1 -0
  84. package/dist/components/menu/{menu-list.svelte → menu-content.svelte} +40 -40
  85. package/dist/components/menu/{menu-list.svelte.d.ts → menu-content.svelte.d.ts} +3 -3
  86. package/dist/components/menu/menu-root.svelte +15 -0
  87. package/dist/components/menu/menu-root.svelte.d.ts +8 -0
  88. package/dist/components/menu/menu.stories.svelte +33 -33
  89. package/dist/components/menu/types.d.ts +0 -7
  90. package/dist/components/popover/bond.svelte.d.ts +11 -14
  91. package/dist/components/popover/bond.svelte.js +27 -44
  92. package/dist/components/popover/popover-content.svelte +137 -137
  93. package/dist/components/popover/popover.stories.svelte +37 -49
  94. package/dist/components/portal/active-portal.svelte +29 -29
  95. package/dist/components/portal/portal-root.svelte +76 -76
  96. package/dist/components/portal/teleport.svelte +49 -49
  97. package/dist/components/radio/radio.svelte +109 -109
  98. package/dist/components/root/index.d.ts +1 -0
  99. package/dist/components/root/index.js +1 -0
  100. package/dist/components/root/l0-portal.svelte +8 -0
  101. package/dist/components/root/l0-portal.svelte.d.ts +26 -0
  102. package/dist/components/root/l1-portal.svelte +7 -0
  103. package/dist/components/root/l1-portal.svelte.d.ts +26 -0
  104. package/dist/components/root/root.css +119 -119
  105. package/dist/components/root/root.svelte +17 -18
  106. package/dist/components/root/root.svelte.d.ts +2 -6
  107. package/dist/components/root/toasts-portal.svelte +7 -0
  108. package/dist/components/root/toasts-portal.svelte.d.ts +26 -0
  109. package/dist/components/root/types.d.ts +17 -0
  110. package/dist/components/sidebar/motion.svelte.js +3 -3
  111. package/dist/components/sidebar/sidebar-content.svelte +40 -40
  112. package/dist/components/textarea/textarea-input.svelte +9 -9
  113. package/dist/components/textarea/textarea-root.svelte +9 -9
  114. package/dist/components/tooltip/tooltip-trigger.svelte +39 -39
  115. package/dist/components/tree/index.d.ts +1 -0
  116. package/dist/components/tree/index.js +1 -0
  117. package/dist/components/tree/motion.svelte.d.ts +6 -0
  118. package/dist/components/tree/motion.svelte.js +14 -0
  119. package/dist/components/tree/tree-body.svelte +4 -3
  120. package/dist/context/preset.svelte.d.ts +3 -1
  121. package/dist/icons/icon-copy.svelte +6 -6
  122. package/dist/utils/dom.svelte.d.ts +2 -0
  123. package/dist/utils/dom.svelte.js +21 -0
  124. package/dist/utils/function.d.ts +1 -1
  125. package/dist/utils/promise.svelte.d.ts +5 -0
  126. package/dist/utils/promise.svelte.js +20 -0
  127. package/package.json +4 -2
  128. package/dist/components/combobox/compobox-item.svelte.d.ts +0 -34
  129. package/dist/components/combobox/compobox.stories.svelte +0 -51
  130. package/dist/components/combobox/compobox.stories.svelte.d.ts +0 -3
  131. package/dist/components/dropdown/item/bond.svelte.d.ts +0 -42
  132. package/dist/components/dropdown/item/bond.svelte.js +0 -99
  133. package/dist/components/menu/menu-item.svelte +0 -69
  134. package/dist/components/menu/menu-item.svelte.d.ts +0 -37
  135. package/dist/utils/markdown-to-llm.d.ts +0 -28
  136. package/dist/utils/markdown-to-llm.js +0 -76
@@ -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 { class: klass = '', children, ...restProps } = $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
+ <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,6 +1,5 @@
1
1
  declare const DropdownValues: import("svelte").Component<{
2
- class?: string;
3
2
  children: any;
4
- } & Record<string, any>, {}, "">;
3
+ }, {}, "">;
5
4
  type DropdownValues = ReturnType<typeof DropdownValues>;
6
5
  export default DropdownValues;
@@ -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-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="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,4 +1,5 @@
1
1
  export * as Dropdown from './atoms';
2
2
  export { DropdownBond, DropdownBondState } from './bond.svelte';
3
+ export * from './item';
3
4
  export { filter } from './runes.svelte';
4
5
  export * from './types';
@@ -1,3 +1,3 @@
1
1
  import type { DropdownBond } from '../bond.svelte';
2
- import { DropdownItemBond } from './bond.svelte';
3
- export declare function dropdownItem(callback: (node: HTMLElement, item?: DropdownItemBond, dropdown?: DropdownBond) => any): (node: HTMLElement) => any;
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 { DropdownItemBond } from './bond.svelte';
1
+ import { DropdownItemController } from './controller.svelte';
2
2
  export function dropdownItem(callback) {
3
- const item = DropdownItemBond.get();
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
- lang="ts"
3
- generics="D, E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base"
4
- >
5
- import { nanoid } from 'nanoid';
6
- import {
7
- DropdownItemBond,
8
- DropdownItemBondState,
9
- type DropdownItemBondProps
10
- } from './bond.svelte';
11
- import { DropdownBond } from '../bond.svelte';
12
- import { Item } from '../../menu/atoms';
13
- import { defineProperty, defineState } from '../../../utils';
14
- import type { Base } from '../../atom';
15
-
16
- const dropdown = DropdownBond.get();
17
-
18
- if (!dropdown) {
19
- throw new Error('<DropdownItem> must be used within a <Dropdown>.');
20
- }
21
-
22
- let {
23
- class: klass = '',
24
- preset = 'dropdown.item',
25
- value = nanoid(),
26
- data = undefined,
27
- factory = _factory,
28
- children = undefined,
29
- onclick = undefined,
30
- onmount = undefined,
31
- ondestroy = undefined,
32
- animate = undefined,
33
- enter = undefined,
34
- exit = undefined,
35
- initial = undefined,
36
- ...restProps
37
- } = $props();
38
-
39
- const bond = factory().share();
40
-
41
- const unmount = bond.mount();
42
- $effect(() => unmount);
43
-
44
- const rootProps = $derived({
45
- ...bond?.root?.(),
46
- ...restProps
47
- });
48
-
49
- function _factory() {
50
- const item = dropdown?.state.item(value);
51
-
52
- if (item) {
53
- return item as DropdownItemBond;
54
- }
55
-
56
- const bondProps = defineState<DropdownItemBondProps<D>>([
57
- defineProperty('value', () => value),
58
- defineProperty('data', () => data)
59
- ]);
60
- const bondState = new DropdownItemBondState(() => bondProps);
61
- return new DropdownItemBond(bondState);
62
- }
63
-
64
- function handleClick(ev: MouseEvent) {
65
- onclick?.(ev);
66
-
67
- if (ev.defaultPrevented) {
68
- return;
69
- }
70
-
71
- ev.preventDefault();
72
-
73
- bond.state.toggle();
74
-
75
- if (bond.state.dropdown) {
76
- bond.state.dropdown.query = '';
77
- }
78
-
79
- bond.state.close();
80
- }
81
- </script>
82
-
83
- <Item
84
- {bond}
85
- {preset}
86
- class={[
87
- bond.state.isHighlighted && 'bg-foreground/5',
88
- bond.state.isSelected && 'bg-primary/5 hover:bg-primary/10 active:bg-primary/15',
89
- '$preset',
90
- klass
91
- ]}
92
- enter={enter?.bind(bond.state)}
93
- exit={exit?.bind(bond.state)}
94
- initial={initial?.bind(bond.state)}
95
- animate={animate?.bind(bond.state)}
96
- onmount={onmount?.bind(bond.state)}
97
- ondestroy={ondestroy?.bind(bond.state)}
98
- onclick={handleClick}
99
- {...rootProps}
100
- >
101
- {@render children?.({ dropdownItem: bond })}
102
- </Item>
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 { DropdownItemBond } from './bond.svelte';
2
- import type { Base } from '../../atom';
3
- declare function $$render<D, E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(): {
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, E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> {
25
- props(): ReturnType<typeof $$render<D, E, B>>['props'];
26
- events(): ReturnType<typeof $$render<D, E, B>>['events'];
27
- slots(): ReturnType<typeof $$render<D, E, B>>['slots'];
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, E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<D, E, B>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<D, E, B>['props']>, ReturnType<__sveltets_Render<D, E, B>['events']>, ReturnType<__sveltets_Render<D, E, B>['slots']>> & {
33
- $$bindings?: ReturnType<__sveltets_Render<D, E, B>['bindings']>;
34
- } & ReturnType<__sveltets_Render<D, E, B>['exports']>;
35
- <D, E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(internal: unknown, props: ReturnType<__sveltets_Render<D, E, B>['props']> & {}): ReturnType<__sveltets_Render<D, E, B>['exports']>;
36
- z_$$bindings?: ReturnType<__sveltets_Render<any, any, any>['bindings']>;
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, E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> = InstanceType<typeof DropdownItem<D, E, B>>;
24
+ type DropdownItem<D> = InstanceType<typeof DropdownItem<D>>;
40
25
  export default DropdownItem;
@@ -0,0 +1,3 @@
1
+ export * from './attachments.svelte';
2
+ export { DropdownItemController } from './controller.svelte';
3
+ export { default as DropdownItem } from './dropdown-item.svelte';
@@ -0,0 +1,3 @@
1
+ export * from './attachments.svelte';
2
+ export { DropdownItemController } from './controller.svelte';
3
+ export { default as DropdownItem } from './dropdown-item.svelte';