@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,8 +1,25 @@
1
1
  import type { HtmlAtomProps, Base } from '../atom';
2
+ import type { Snippet } from 'svelte';
2
3
  /**
3
4
  * Extend this interface to add custom root properties in your application.
4
5
  */
5
6
  export interface RootExtendProps {
6
7
  }
7
8
  export interface RootProps<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> extends HtmlAtomProps<E, B>, RootExtendProps {
9
+ /**
10
+ * Main content to render inside the root component.
11
+ */
12
+ children?: Snippet;
13
+ /**
14
+ * Custom portal configuration snippet.
15
+ */
16
+ portals?: Snippet;
17
+ /**
18
+ * Custom L0 portal snippet (z-10 layer for popovers).
19
+ */
20
+ l0portal?: Snippet;
21
+ /**
22
+ * Custom L1 portal snippet (z-12 layer).
23
+ */
24
+ l1portal?: Snippet;
8
25
  }
@@ -4,10 +4,10 @@ import { SidebarBond } from '.';
4
4
  export function animateSidebarContent(params) {
5
5
  const { duration = DURATION.fast / 1000, delay = 0, ease = 'easeInOut', axis = 'x', '0': collapsedSize = '96px', '1': expandedSize = 'auto' } = params;
6
6
  const bond = SidebarBond.get();
7
- const isOpen = bond?.state.props.open ?? false;
8
- const collapsedProp = axis === 'x' ? 'min-width' : 'min-height';
9
- const prop = axis === 'x' ? 'width' : 'height';
10
7
  return (node) => {
8
+ const isOpen = bond?.state.props.open ?? false;
9
+ const collapsedProp = axis === 'x' ? 'min-width' : 'min-height';
10
+ const prop = axis === 'x' ? 'width' : 'height';
11
11
  animate(node, {
12
12
  [prop]: isOpen ? expandedSize : collapsedSize,
13
13
  [collapsedProp]: collapsedSize
@@ -1,40 +1,40 @@
1
- <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
2
- import { HtmlAtom, type Base } from '../atom';
3
- import { SidebarBond } from './bond.svelte';
4
- import { animateSidebarContent } from './motion.svelte';
5
- import type { SidebarRootProps } from './types';
6
-
7
- const bond = SidebarBond.get();
8
-
9
- let {
10
- class: klass = '',
11
- children = undefined,
12
- onmount = undefined,
13
- ondestroy = undefined,
14
- animate = animateSidebarContent({ '0': '0px', '1': 'auto' }),
15
- enter = undefined,
16
- exit = undefined,
17
- initial = animateSidebarContent({ '0': '0px', '1': 'auto', duration: 0 }),
18
- ...restProps
19
- }: SidebarRootProps<E, B> = $props();
20
-
21
- const contentProps = $derived({
22
- ...bond?.content(),
23
- ...restProps
24
- });
25
- </script>
26
-
27
- <HtmlAtom
28
- {bond}
29
- preset="sidebar.content"
30
- class={['bg-card border-border', '$preset', klass]}
31
- enter={enter?.bind(bond.state)}
32
- exit={exit?.bind(bond.state)}
33
- initial={initial?.bind(bond.state)}
34
- animate={animate?.bind(bond.state)}
35
- onmount={onmount?.bind(bond.state)}
36
- ondestroy={ondestroy?.bind(bond.state)}
37
- {...contentProps}
38
- >
39
- {@render children?.({ sidebar: bond })}
40
- </HtmlAtom>
1
+ <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
2
+ import { HtmlAtom, type Base } from '../atom';
3
+ import { SidebarBond } from './bond.svelte';
4
+ import { animateSidebarContent } from './motion.svelte';
5
+ import type { SidebarRootProps } from './types';
6
+
7
+ const bond = SidebarBond.get();
8
+
9
+ let {
10
+ class: klass = '',
11
+ children = undefined,
12
+ onmount = undefined,
13
+ ondestroy = undefined,
14
+ animate = animateSidebarContent({ '0': '0px', '1': 'auto' }),
15
+ enter = undefined,
16
+ exit = undefined,
17
+ initial = animateSidebarContent({ '0': '0px', '1': 'auto', duration: 0 }),
18
+ ...restProps
19
+ }: SidebarRootProps<E, B> = $props();
20
+
21
+ const contentProps = $derived({
22
+ ...bond?.content(),
23
+ ...restProps
24
+ });
25
+ </script>
26
+
27
+ <HtmlAtom
28
+ {bond}
29
+ preset="sidebar.content"
30
+ class={['bg-card border-border', '$preset', klass]}
31
+ enter={enter?.bind(bond.state)}
32
+ exit={exit?.bind(bond.state)}
33
+ initial={initial?.bind(bond.state)}
34
+ animate={animate?.bind(bond.state)}
35
+ onmount={onmount?.bind(bond.state)}
36
+ ondestroy={ondestroy?.bind(bond.state)}
37
+ {...contentProps}
38
+ >
39
+ {@render children?.({ sidebar: bond })}
40
+ </HtmlAtom>
@@ -1,9 +1,9 @@
1
- <script lang="ts">
2
- let { class: klass = '', value = $bindable(), ...restProps } = $props();
3
- </script>
4
-
5
- <textarea
6
- class={['border-border w-full p-2 outline-none', '$preset', klass]}
7
- bind:value
8
- {...restProps}
9
- ></textarea>
1
+ <script lang="ts">
2
+ let { class: klass = '', value = $bindable(), ...restProps } = $props();
3
+ </script>
4
+
5
+ <textarea
6
+ class={['border-border w-full p-2 outline-none', '$preset', klass]}
7
+ bind:value
8
+ {...restProps}
9
+ ></textarea>
@@ -1,9 +1,9 @@
1
- <script>
2
- import { Input } from '../input';
3
-
4
- let { class: klass = '', children, ...restProps } = $props();
5
- </script>
6
-
7
- <Input.Root preset="textarea" class={['h-auto', klass]} {...restProps}>
8
- {@render children?.()}
9
- </Input.Root>
1
+ <script>
2
+ import { Input } from '../input';
3
+
4
+ let { class: klass = '', children, ...restProps } = $props();
5
+ </script>
6
+
7
+ <Input.Root preset="textarea" class={['h-auto', klass]} {...restProps}>
8
+ {@render children?.()}
9
+ </Input.Root>
@@ -1,39 +1,39 @@
1
- <script lang="ts">
2
- import { PopoverBond } from '../popover/bond.svelte';
3
- import { Trigger } from '../popover/atoms';
4
-
5
- const popoverBond = PopoverBond.get();
6
-
7
- let { onmount, children, onclick = undefined, ...restProps } = $props();
8
-
9
- function tooltip(node: HTMLElement) {
10
- const onpointerenter = async () => {
11
- requestAnimationFrame(() => {
12
- popoverBond?.state.open();
13
- });
14
- node.addEventListener('pointerleave', onpointerleave);
15
- };
16
- const onpointerleave = () => {
17
- popoverBond?.state.close();
18
- node.removeEventListener('pointerleave', onpointerleave);
19
- };
20
-
21
- node.addEventListener('pointerenter', onpointerenter, { passive: true });
22
-
23
- const cleanup = () => {
24
- node.removeEventListener('pointerenter', onpointerenter);
25
- node.removeEventListener('pointerleave', onpointerleave);
26
- };
27
-
28
- const unmount = onmount?.(node);
29
-
30
- return () => {
31
- cleanup?.();
32
- unmount?.();
33
- };
34
- }
35
- </script>
36
-
37
- <Trigger preset="tooltip.trigger" onmount={tooltip} {onclick} {...restProps}>
38
- {@render children?.()}
39
- </Trigger>
1
+ <script lang="ts">
2
+ import { PopoverBond } from '../popover/bond.svelte';
3
+ import { Trigger } from '../popover/atoms';
4
+
5
+ const popoverBond = PopoverBond.get();
6
+
7
+ let { onmount, children, onclick = undefined, ...restProps } = $props();
8
+
9
+ function tooltip(node: HTMLElement) {
10
+ const onpointerenter = async () => {
11
+ requestAnimationFrame(() => {
12
+ popoverBond?.state.open();
13
+ });
14
+ node.addEventListener('pointerleave', onpointerleave);
15
+ };
16
+ const onpointerleave = () => {
17
+ popoverBond?.state.close();
18
+ node.removeEventListener('pointerleave', onpointerleave);
19
+ };
20
+
21
+ node.addEventListener('pointerenter', onpointerenter, { passive: true });
22
+
23
+ const cleanup = () => {
24
+ node.removeEventListener('pointerenter', onpointerenter);
25
+ node.removeEventListener('pointerleave', onpointerleave);
26
+ };
27
+
28
+ const unmount = onmount?.(node);
29
+
30
+ return () => {
31
+ cleanup?.();
32
+ unmount?.();
33
+ };
34
+ }
35
+ </script>
36
+
37
+ <Trigger preset="tooltip.trigger" onmount={tooltip} {onclick} {...restProps}>
38
+ {@render children?.()}
39
+ </Trigger>
@@ -1,2 +1,3 @@
1
1
  export * from './types';
2
2
  export * as Tree from './atoms';
3
+ export * from './motion.svelte';
@@ -1,2 +1,3 @@
1
1
  export * from './types';
2
2
  export * as Tree from './atoms';
3
+ export * from './motion.svelte';
@@ -0,0 +1,6 @@
1
+ export type AnimatePopoverContentParams = {
2
+ duration?: number;
3
+ delay?: number;
4
+ ease?: string;
5
+ };
6
+ export declare function animateTreeBody(params?: AnimatePopoverContentParams): (node: HTMLElement) => void;
@@ -0,0 +1,14 @@
1
+ import { animate } from 'motion';
2
+ import { TreeBond } from './bond.svelte';
3
+ export function animateTreeBody(params = {}) {
4
+ const bond = TreeBond.get();
5
+ return (node) => {
6
+ const { delay = 0, duration = 0.1, ease } = params;
7
+ const isOpen = bond?.state.props.open ?? false;
8
+ animate(node, {
9
+ height: +isOpen ? 'auto' : 0,
10
+ opacity: +isOpen,
11
+ pointerEvents: isOpen ? '' : 'none'
12
+ }, { duration, delay, ease });
13
+ };
14
+ }
@@ -1,7 +1,8 @@
1
1
  <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
2
- import { TreeBond } from './bond.svelte';
3
2
  import { HtmlAtom, type Base } from '../atom';
3
+ import { TreeBond } from './bond.svelte';
4
4
  import type { TreeBodyProps } from './types';
5
+ import { animateTreeBody } from './motion.svelte';
5
6
 
6
7
  const bond = TreeBond.get();
7
8
 
@@ -10,10 +11,10 @@
10
11
  children = undefined,
11
12
  onmount = undefined,
12
13
  ondestroy = undefined,
13
- animate = undefined,
14
+ animate = animateTreeBody(),
14
15
  enter = undefined,
15
16
  exit = undefined,
16
- initial = undefined,
17
+ initial = animateTreeBody({ duration: 0 }),
17
18
  ...restProps
18
19
  }: TreeBodyProps<E, B> = $props();
19
20
 
@@ -1,7 +1,8 @@
1
1
  import type { ClassValue } from 'svelte/elements';
2
2
  import type { Base } from '../components/atom';
3
3
  import type { Bond } from '../shared';
4
- export type PresetModuleName = 'accordion' | 'accordion.item.body' | 'accordion.item.header' | 'accordion.item.indicator' | 'accordion.item' | 'alert.actions' | 'alert.close-button' | 'alert.content' | 'alert.description' | 'alert.icon' | 'alert' | 'alert.title' | 'card.content' | 'card.description' | 'card.footer' | 'card.header' | 'card.media' | 'card' | 'card.subtitle' | 'card.title' | 'collapsible.body' | 'collapsible.header' | 'collapsible.indicator' | 'collapsible' | 'combobox.control' | 'combobox.trigger' | 'combobox.item' | 'dialog.close-button' | 'dialog.body' | 'dialog.content' | 'dialog.description' | 'dialog.footer' | 'dialog.header' | 'dialog' | 'dialog.title' | 'divider' | 'dropdown.placeholder' | 'dropdown.query' | 'dropdown.trigger' | 'dropdown.value' | 'dropdown' | 'field.control' | 'field.label' | 'field' | 'form' | 'icon' | 'input' | 'input.control' | 'input.placeholder' | 'label' | 'layer.inner' | 'layer' | 'link' | 'list.divider' | 'list.group' | 'list.item' | 'list.item' | 'list.item' | 'dropdown.item' | 'menu.body' | 'popover.arrow' | 'popover.indicator' | 'popover.content' | 'popover.trigger' | 'portal.inner' | 'portal' | 'root' | 'root.portals' | 'sidebar.content' | 'sidebar' | 'drawer.backdrop' | 'drawer.body' | 'drawer.content' | 'drawer.description' | 'drawer.title' | 'drawer.footer' | 'drawer.header' | 'drawer' | 'stack.root' | 'stack.item' | 'tabs.body' | 'tabs.header' | 'tabs' | 'tab.header' | 'tab.body' | 'tab.description' | 'tab' | 'tree.body' | 'tree.header' | 'tree.indicator' | 'tree' | 'datagrid' | 'datagrid.header' | 'datagrid.th' | 'datagrid.body' | 'datagrid.tr' | 'datagrid.td' | 'datagrid.footer' | 'datagrid.checkbox' | 'datagrid.sort-icon' | 'scrollable' | 'scrollable.container' | 'scrollable.content' | 'scrollable.track' | 'scrollable.thumb' | 'breadcrumb' | 'breadcrumb.item' | 'breadcrumb.separator' | 'badge' | 'button' | 'checkbox' | 'checkbox.checkmark' | 'checkbox.indeterminate' | 'radio' | 'radio.group' | 'container' | 'calendar' | 'calendar.day' | 'calendar.header' | 'calendar.weekday' | 'calendar.body' | 'datepicker.trigger' | 'datepicker.calendar' | 'datepicker.years' | 'datepicker.months' | 'datepicker.header';
4
+ import type { Attachment } from 'svelte/attachments';
5
+ export type PresetModuleName = 'accordion' | 'accordion.item.body' | 'accordion.item.header' | 'accordion.item.indicator' | 'accordion.item' | 'alert.actions' | 'alert.close-button' | 'alert.content' | 'alert.description' | 'alert.icon' | 'alert' | 'alert.title' | 'card.content' | 'card.description' | 'card.footer' | 'card.header' | 'card.body' | 'card.media' | 'card' | 'card.subtitle' | 'card.title' | 'collapsible.body' | 'collapsible.header' | 'collapsible.indicator' | 'collapsible' | 'combobox.control' | 'combobox.trigger' | 'combobox.item' | 'dialog.close-button' | 'dialog.body' | 'dialog.content' | 'dialog.description' | 'dialog.footer' | 'dialog.header' | 'dialog' | 'dialog.title' | 'divider' | 'dropdown.placeholder' | 'dropdown.query' | 'dropdown.trigger' | 'dropdown.value' | 'dropdown' | 'field.control' | 'field.label' | 'field' | 'form' | 'icon' | 'input' | 'input.control' | 'input.placeholder' | 'label' | 'layer.inner' | 'layer' | 'link' | 'list.divider' | 'list.group' | 'list.item' | 'list.item' | 'list.item' | 'dropdown.item' | 'menu.content' | 'popover.arrow' | 'popover.indicator' | 'popover.content' | 'popover.trigger' | 'portal.inner' | 'portal' | 'root' | 'root.portals' | 'sidebar.content' | 'sidebar' | 'drawer.backdrop' | 'drawer.body' | 'drawer.content' | 'drawer.description' | 'drawer.title' | 'drawer.footer' | 'drawer.header' | 'drawer' | 'stack.root' | 'stack.item' | 'tabs.body' | 'tabs.header' | 'tabs' | 'tab.header' | 'tab.body' | 'tab.description' | 'tab' | 'tree.body' | 'tree.header' | 'tree.indicator' | 'tree' | 'datagrid' | 'datagrid.header' | 'datagrid.th' | 'datagrid.body' | 'datagrid.tr' | 'datagrid.td' | 'datagrid.footer' | 'datagrid.checkbox' | 'datagrid.sort-icon' | 'scrollable' | 'scrollable.container' | 'scrollable.content' | 'scrollable.track' | 'scrollable.thumb' | 'breadcrumb' | 'breadcrumb.item' | 'breadcrumb.separator' | 'badge' | 'button' | 'checkbox' | 'checkbox.checkmark' | 'checkbox.indeterminate' | 'radio' | 'radio.group' | 'container' | 'calendar' | 'calendar.day' | 'calendar.header' | 'calendar.weekday' | 'calendar.body' | 'datepicker.trigger' | 'datepicker.calendar' | 'datepicker.years' | 'datepicker.months' | 'datepicker.header';
5
6
  export interface PresetEntryRecord {
6
7
  [key: string]: unknown;
7
8
  class?: ClassValue;
@@ -10,6 +11,7 @@ export interface PresetEntryRecord {
10
11
  variants?: Record<string, Record<string, any>>;
11
12
  compounds?: Array<Record<string, any>>;
12
13
  defaults?: Record<string, any>;
14
+ attachments?: Attachment[];
13
15
  }
14
16
  export type PresetEntry = (bond: Bond | undefined | null, ...args: any[]) => PresetEntryRecord | (() => PresetEntryRecord);
15
17
  export type Preset = Record<PresetModuleName, PresetEntry>;
@@ -1,6 +1,6 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" class="size-full" viewBox="0 0 24 24"
2
- ><!-- Icon from Fluent UI System Icons by Microsoft Corporation - https://github.com/microsoft/fluentui-system-icons/blob/main/LICENSE --><path
3
- fill="currentColor"
4
- d="M5.503 4.627 5.5 6.75v10.504a3.25 3.25 0 0 0 3.25 3.25h8.616a2.251 2.251 0 0 1-2.122 1.5H8.75A4.75 4.75 0 0 1 4 17.254V6.75c0-.98.627-1.815 1.503-2.123M17.75 2A2.25 2.25 0 0 1 20 4.25v13a2.25 2.25 0 0 1-2.25 2.25h-9a2.25 2.25 0 0 1-2.25-2.25v-13A2.25 2.25 0 0 1 8.75 2zM7.75 17.25c0 .414.336.75.75.75h9a.75.75 0 0 0 .75-.75v-13a.75.75 0 0 0-.75-.75h-9a.75.75 0 0 0-.75.75z"
5
- /></svg
6
- >
1
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-full" viewBox="0 0 24 24"
2
+ ><!-- Icon from Fluent UI System Icons by Microsoft Corporation - https://github.com/microsoft/fluentui-system-icons/blob/main/LICENSE --><path
3
+ fill="currentColor"
4
+ d="M5.503 4.627 5.5 6.75v10.504a3.25 3.25 0 0 0 3.25 3.25h8.616a2.251 2.251 0 0 1-2.122 1.5H8.75A4.75 4.75 0 0 1 4 17.254V6.75c0-.98.627-1.815 1.503-2.123M17.75 2A2.25 2.25 0 0 1 20 4.25v13a2.25 2.25 0 0 1-2.25 2.25h-9a2.25 2.25 0 0 1-2.25-2.25v-13A2.25 2.25 0 0 1 8.75 2zM7.75 17.25c0 .414.336.75.75.75h9a.75.75 0 0 0 .75-.75v-13a.75.75 0 0 0-.75-.75h-9a.75.75 0 0 0-.75.75z"
5
+ /></svg
6
+ >
@@ -1,2 +1,4 @@
1
1
  export declare function getElementId(id: string, kind: string): string;
2
2
  export declare function isBrowser(): boolean;
3
+ export declare function focusTrap(ev: KeyboardEvent): void;
4
+ export declare function focus(element: Element | null): void;
@@ -4,3 +4,24 @@ export function getElementId(id, kind) {
4
4
  export function isBrowser() {
5
5
  return typeof window !== 'undefined' && typeof document !== 'undefined';
6
6
  }
7
+ export function focusTrap(ev) {
8
+ const node = ev.currentTarget;
9
+ // Tab trap - keep focus within popover
10
+ if (ev.key === 'Tab') {
11
+ const focusableElements = node.querySelectorAll('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])');
12
+ const firstElement = focusableElements[0];
13
+ const lastElement = focusableElements[focusableElements.length - 1];
14
+ if (ev.shiftKey && document.activeElement === firstElement) {
15
+ ev.preventDefault();
16
+ lastElement?.focus();
17
+ }
18
+ else if (!ev.shiftKey && document.activeElement === lastElement) {
19
+ ev.preventDefault();
20
+ firstElement?.focus();
21
+ }
22
+ }
23
+ }
24
+ export function focus(element) {
25
+ const firstFocusable = element?.querySelector('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])');
26
+ (firstFocusable || element)?.focus();
27
+ }
@@ -1,2 +1,2 @@
1
- export declare function call<const T = (...args: any) => any>(param: T, ...args: any[]): ReturnType<T>;
1
+ export declare function call<const T extends (...args: any) => any = (...args: any) => any>(param: T, ...args: any[]): ReturnType<T>;
2
2
  export declare function call<const T>(param: T, ...args: any[]): T;
@@ -0,0 +1,5 @@
1
+ export declare function promiseToState<T>(promise: Promise<T> | (() => Promise<T>)): {
2
+ readonly promise: Promise<T> | (() => Promise<T>);
3
+ readonly current: T | null;
4
+ refresh: () => Promise<void>;
5
+ };
@@ -0,0 +1,20 @@
1
+ import { call } from './function';
2
+ export function promiseToState(promise) {
3
+ let data = $state(null);
4
+ const refresh = async () => {
5
+ const result = (await call(promise));
6
+ data = result;
7
+ };
8
+ $effect(() => {
9
+ refresh();
10
+ });
11
+ return {
12
+ get promise() {
13
+ return promise;
14
+ },
15
+ get current() {
16
+ return data;
17
+ },
18
+ refresh
19
+ };
20
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svelte-atoms/core",
3
- "version": "1.0.0-alpha.31",
3
+ "version": "1.0.0-alpha.33",
4
4
  "description": "A modular, accessible, and extensible Svelte UI component library.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14,7 +14,7 @@
14
14
  "license": "MIT",
15
15
  "scripts": {
16
16
  "dev": "vite dev",
17
- "build": "vite build && npm run prepack",
17
+ "build": "vite build",
18
18
  "preview": "vite preview",
19
19
  "prepare": "svelte-kit sync || echo ''",
20
20
  "prepack": "svelte-kit sync && svelte-package && publint",
@@ -389,6 +389,7 @@
389
389
  "@storybook/addon-vitest": "^9.1.3",
390
390
  "@storybook/sveltekit": "^9.1.3",
391
391
  "@sveltejs/adapter-auto": "^6.0.0",
392
+ "@sveltejs/adapter-netlify": "^5.2.4",
392
393
  "@sveltejs/kit": "^2.22.0",
393
394
  "@sveltejs/package": "^2.0.0",
394
395
  "@sveltejs/vite-plugin-svelte": "^6.0.0",
@@ -450,6 +451,7 @@
450
451
  },
451
452
  "dependencies": {
452
453
  "@floating-ui/dom": "^1.7.0",
454
+ "@modelcontextprotocol/sdk": "^1.24.3",
453
455
  "@qrcode-js/browser": "^1.2.0",
454
456
  "clsx": "^2.1.1",
455
457
  "date-fns": "^4.1.0",
@@ -1,34 +0,0 @@
1
- import type { Base } from '../atom';
2
- declare function $$render<D, T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(): {
3
- props: {
4
- class?: string;
5
- children?: any;
6
- onmount?: any;
7
- ondestroy?: any;
8
- animate?: any;
9
- enter?: any;
10
- exit?: any;
11
- initial?: any;
12
- } & Record<string, any>;
13
- exports: {};
14
- bindings: "";
15
- slots: {};
16
- events: {};
17
- };
18
- declare class __sveltets_Render<D, T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> {
19
- props(): ReturnType<typeof $$render<D, T, B>>['props'];
20
- events(): ReturnType<typeof $$render<D, T, B>>['events'];
21
- slots(): ReturnType<typeof $$render<D, T, B>>['slots'];
22
- bindings(): "";
23
- exports(): {};
24
- }
25
- interface $$IsomorphicComponent {
26
- new <D, T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<D, T, B>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<D, T, B>['props']>, ReturnType<__sveltets_Render<D, T, B>['events']>, ReturnType<__sveltets_Render<D, T, B>['slots']>> & {
27
- $$bindings?: ReturnType<__sveltets_Render<D, T, B>['bindings']>;
28
- } & ReturnType<__sveltets_Render<D, T, B>['exports']>;
29
- <D, T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(internal: unknown, props: ReturnType<__sveltets_Render<D, T, B>['props']> & {}): ReturnType<__sveltets_Render<D, T, B>['exports']>;
30
- z_$$bindings?: ReturnType<__sveltets_Render<any, any, any>['bindings']>;
31
- }
32
- declare const CompoboxItem: $$IsomorphicComponent;
33
- type CompoboxItem<D, T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> = InstanceType<typeof CompoboxItem<D, T, B>>;
34
- export default CompoboxItem;
@@ -1,51 +0,0 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import { Combobox as ACombobox } from '.';
4
- import { Input } from '../input';
5
- import { Divider } from '../divider';
6
-
7
- // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
8
- const { Story } = defineMeta({
9
- title: 'Atoms/Combobox',
10
- // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
11
-
12
- parameters: {
13
- // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout
14
- layout: 'fullscreen'
15
- },
16
- args: {}
17
- });
18
- </script>
19
-
20
- <script lang="ts">
21
- let open = $state(false);
22
- let value = $state<string | undefined>('ar');
23
- let array = $state([
24
- { value: 'ar', label: 'Arabic' },
25
- { value: 'en', label: 'English' },
26
- { value: 'sp', label: 'Spanish' },
27
- { value: 'it', label: 'Italian' }
28
- ]);
29
- </script>
30
-
31
- <Story name="Combobox" args={{}}>
32
- <ACombobox.Root bind:open bind:value>
33
- {#snippet children({ combobox })}
34
- <ACombobox.Trigger
35
- base={Input.Root}
36
- class="h-10 min-w-sm items-center gap-0 rounded-sm p-1 transition-colors duration-200"
37
- >
38
- <Input.Icon class="text-foreground/50">$</Input.Icon>
39
- <Divider class="mx-1" vertical />
40
- <ACombobox.Input class="px-1" placeholder="Select a language" />
41
- </ACombobox.Trigger>
42
- <ACombobox.List>
43
- {#each array.filter((item) => !combobox.state.query || item.label
44
- .toLowerCase()
45
- .includes(combobox.state.query)) as item (item.value)}
46
- <ACombobox.Item value={item.value}>{item.label}</ACombobox.Item>
47
- {/each}
48
- </ACombobox.List>
49
- {/snippet}
50
- </ACombobox.Root>
51
- </Story>
@@ -1,3 +0,0 @@
1
- declare const Compobox: import("svelte").Component<Record<string, never>, {}, "">;
2
- type Compobox = ReturnType<typeof Compobox>;
3
- export default Compobox;
@@ -1,42 +0,0 @@
1
- import type { PopoverStateProps } from '../../popover/bond.svelte';
2
- import { Bond, BondState, type BondStateProps } from '../../../shared/bond.svelte';
3
- import { DropdownBond, DropdownBondState } from '../bond.svelte';
4
- export type DropdownItemBondProps<T> = BondStateProps & {
5
- value: string;
6
- selected?: string;
7
- data: T;
8
- };
9
- export type DropdownItemBondElements = {
10
- root: HTMLElement;
11
- };
12
- export declare class DropdownItemBond<T = unknown> extends Bond<DropdownItemBondProps<T>, DropdownItemBondState<T>, DropdownItemBondElements> {
13
- #private;
14
- static CONTEXT_KEY: string;
15
- constructor(state: DropdownItemBondState<T>);
16
- get value(): string;
17
- get text(): string;
18
- get dropdown(): DropdownBond<DropdownBondState<PopoverStateProps>, DropdownBondState<DropdownBondState<PopoverStateProps>>, import("..").DropdownBondElements> | undefined;
19
- mount(): () => void;
20
- unmount(): void;
21
- share(): this;
22
- root(): {
23
- [x: symbol]: (node: HTMLElement) => void;
24
- 'data-selected': boolean;
25
- };
26
- static get(): DropdownItemBond | undefined;
27
- static set(bond: DropdownItemBond): DropdownItemBond;
28
- }
29
- export declare class DropdownItemBondState<T> extends BondState<DropdownItemBondProps<T>> {
30
- #private;
31
- constructor(props: () => DropdownItemBondProps<T>);
32
- get value(): string;
33
- get data(): T;
34
- get isSelected(): boolean;
35
- set isSelected(val: boolean);
36
- get isHighlighted(): boolean;
37
- get dropdown(): DropdownBondState<DropdownBondState<PopoverStateProps>> | undefined;
38
- select(): void;
39
- unselect(): void;
40
- toggle(): void;
41
- close(): void;
42
- }