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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +5 -11
  39. package/dist/components/date-picker/date-picker-calendar.svelte +67 -67
  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,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.32",
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
- }
@@ -1,99 +0,0 @@
1
- import { getContext, setContext } from 'svelte';
2
- import { Bond, BondState } from '../../../shared/bond.svelte';
3
- import { DropdownBond, DropdownBondState } from '../bond.svelte';
4
- import { createAttachmentKey } from 'svelte/attachments';
5
- export class DropdownItemBond extends Bond {
6
- static CONTEXT_KEY = '@atoms/context/dropdown/item';
7
- #dropdown;
8
- constructor(state) {
9
- super(state);
10
- this.#dropdown = DropdownBond.get();
11
- if (!this.#dropdown) {
12
- throw new Error('DropdownItemAtom must be used within a DropdownAtom context');
13
- }
14
- }
15
- get value() {
16
- return this.state.value;
17
- }
18
- get text() {
19
- const element = (this.elements?.root?.querySelector('[data-text]') ?? this.elements?.root);
20
- return element?.innerText ?? '';
21
- }
22
- get dropdown() {
23
- return this.#dropdown;
24
- }
25
- mount() {
26
- this.dropdown?.state.mountItem(this.state.value, this);
27
- return () => this.unmount();
28
- }
29
- unmount() {
30
- this.dropdown?.state.unmountItem(this.state.value);
31
- }
32
- share() {
33
- return DropdownItemBond.set(this);
34
- }
35
- root() {
36
- return {
37
- 'data-selected': this.state.isSelected,
38
- [createAttachmentKey()]: (node) => {
39
- this.elements.root = node;
40
- }
41
- };
42
- }
43
- static get() {
44
- return getContext(DropdownItemBond.CONTEXT_KEY);
45
- }
46
- static set(bond) {
47
- return setContext(DropdownItemBond.CONTEXT_KEY, bond);
48
- }
49
- }
50
- export class DropdownItemBondState extends BondState {
51
- #dropdown;
52
- constructor(props) {
53
- super(props);
54
- this.#dropdown = DropdownBond.get();
55
- if (!this.#dropdown) {
56
- throw new Error('DropdownItemState must be used within a DropdownAtom context');
57
- }
58
- }
59
- get value() {
60
- return this.props.value;
61
- }
62
- get data() {
63
- return this.props.data;
64
- }
65
- get isSelected() {
66
- return this.dropdown?.props.values?.includes(this.props.value) ?? false;
67
- }
68
- set isSelected(val) {
69
- if (val) {
70
- this.dropdown?.select([this.props.value]);
71
- }
72
- else {
73
- this.dropdown?.unselect([this.props.value]);
74
- }
75
- }
76
- get isHighlighted() {
77
- return this.dropdown?.highlightedItem?.id === this.id;
78
- }
79
- get dropdown() {
80
- return this.#dropdown?.state;
81
- }
82
- select() {
83
- this.dropdown?.select([this.value]);
84
- }
85
- unselect() {
86
- this.dropdown?.unselect([this.value]);
87
- }
88
- toggle() {
89
- if (this.isSelected) {
90
- this.unselect();
91
- }
92
- else {
93
- this.select();
94
- }
95
- }
96
- close() {
97
- this.dropdown?.close();
98
- }
99
- }
@@ -1,69 +0,0 @@
1
- <script lang="ts" generics="T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
2
- import { PopoverBond } from '../popover/bond.svelte';
3
- import type { Base } from '../atom';
4
- import { List } from '../list';
5
-
6
- const bond = PopoverBond.get();
7
-
8
- let {
9
- class: klass = '',
10
- preset: presetKey = 'menu.item',
11
- children = undefined,
12
- onclick = undefined,
13
- disabled = undefined,
14
- onmount = undefined,
15
- ondestroy = undefined,
16
- animate = undefined,
17
- enter = undefined,
18
- exit = undefined,
19
- initial = undefined,
20
- ...restProps
21
- } = $props();
22
-
23
- function _onclick(ev: MouseEvent) {
24
- onclick?.(ev);
25
-
26
- if (ev.defaultPrevented) {
27
- return;
28
- }
29
-
30
- bond?.state.close();
31
- }
32
-
33
- function _onkeydown(ev: KeyboardEvent) {
34
- if (disabled) return;
35
-
36
- // Activate on Enter or Space
37
- if (ev.key === 'Enter' || ev.key === ' ') {
38
- ev.preventDefault();
39
- // Call the click handler if provided
40
- // cast to any to avoid strict event-type mismatch when forwarding
41
- onclick?.(ev as unknown as MouseEvent);
42
- bond?.state.close();
43
- }
44
- }
45
- </script>
46
-
47
- <List.Item
48
- {bond}
49
- preset={presetKey}
50
- class={[
51
- 'border-border last:border-b-none hover:bg-foreground/5 active:bg-foreground/10 cursor-pointer border-b',
52
- '$preset',
53
- klass
54
- ]}
55
- onmount={onmount?.bind(bond.state)}
56
- ondestroy={ondestroy?.bind(bond.state)}
57
- enter={enter?.bind(bond.state)}
58
- exit={exit?.bind(bond.state)}
59
- initial={initial?.bind(bond.state)}
60
- animate={animate?.bind(bond.state)}
61
- role="menuitem"
62
- aria-disabled={disabled ? true : undefined}
63
- tabIndex={disabled ? -1 : 0}
64
- onkeydown={_onkeydown}
65
- onclick={_onclick}
66
- {...restProps}
67
- >
68
- {@render children?.({ menu: bond })}
69
- </List.Item>
@@ -1,37 +0,0 @@
1
- import type { Base } from '../atom';
2
- declare function $$render<T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(): {
3
- props: {
4
- class?: string;
5
- preset?: string;
6
- children?: any;
7
- onclick?: any;
8
- disabled?: any;
9
- onmount?: any;
10
- ondestroy?: any;
11
- animate?: any;
12
- enter?: any;
13
- exit?: any;
14
- initial?: any;
15
- } & Record<string, any>;
16
- exports: {};
17
- bindings: "";
18
- slots: {};
19
- events: {};
20
- };
21
- declare class __sveltets_Render<T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> {
22
- props(): ReturnType<typeof $$render<T, B>>['props'];
23
- events(): ReturnType<typeof $$render<T, B>>['events'];
24
- slots(): ReturnType<typeof $$render<T, B>>['slots'];
25
- bindings(): "";
26
- exports(): {};
27
- }
28
- interface $$IsomorphicComponent {
29
- new <T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T, B>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T, B>['props']>, ReturnType<__sveltets_Render<T, B>['events']>, ReturnType<__sveltets_Render<T, B>['slots']>> & {
30
- $$bindings?: ReturnType<__sveltets_Render<T, B>['bindings']>;
31
- } & ReturnType<__sveltets_Render<T, B>['exports']>;
32
- <T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(internal: unknown, props: ReturnType<__sveltets_Render<T, B>['props']> & {}): ReturnType<__sveltets_Render<T, B>['exports']>;
33
- z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
34
- }
35
- declare const MenuItem: $$IsomorphicComponent;
36
- type MenuItem<T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> = InstanceType<typeof MenuItem<T, B>>;
37
- export default MenuItem;
@@ -1,28 +0,0 @@
1
- export interface PropDefinition {
2
- name: string;
3
- type: string;
4
- default: string;
5
- description: string;
6
- }
7
- /**
8
- * Converts prop definitions to markdown table format
9
- */
10
- export declare function propsToMarkdown(props: PropDefinition[]): string;
11
- /**
12
- * Injects props into markdown content by replacing placeholders
13
- * Placeholders format: {{propName}}
14
- */
15
- export declare function injectPropsIntoMarkdown(markdown: string, propsMap: Record<string, PropDefinition[]>): string;
16
- /**
17
- * Converts markdown content to LLM-friendly text format
18
- * Keeps markdown syntax as-is since LLMs parse it well
19
- */
20
- export declare function markdownToLLM(markdown: string): string;
21
- /**
22
- * Reads markdown files from the docs directory
23
- */
24
- export declare function readMarkdownFile(filePath: string): Promise<string>;
25
- /**
26
- * Generate LLM-friendly documentation metadata
27
- */
28
- export declare function generateLLMHeader(title: string, description: string, version?: string): string;
@@ -1,76 +0,0 @@
1
- /**
2
- * Converts prop definitions to markdown table format
3
- */
4
- export function propsToMarkdown(props) {
5
- if (!props || props.length === 0)
6
- return '';
7
- let markdown = '| Name | Type | Default | Description |\n';
8
- markdown += '|------|------|---------|-------------|\n';
9
- for (const prop of props) {
10
- const name = prop.name.replace(/\|/g, '\\|');
11
- const type = prop.type.replace(/\|/g, '\\|');
12
- const defaultVal = prop.default.replace(/\|/g, '\\|');
13
- const description = prop.description.replace(/\|/g, '\\|');
14
- markdown += `| ${name} | ${type} | ${defaultVal} | ${description} |\n`;
15
- }
16
- return markdown;
17
- }
18
- /**
19
- * Injects props into markdown content by replacing placeholders
20
- * Placeholders format: {{propName}}
21
- */
22
- export function injectPropsIntoMarkdown(markdown, propsMap) {
23
- let result = markdown;
24
- for (const [key, props] of Object.entries(propsMap)) {
25
- const placeholder = new RegExp(`{{${key}}}`, 'g');
26
- const propsMarkdown = propsToMarkdown(props);
27
- result = result.replace(placeholder, propsMarkdown);
28
- }
29
- return result;
30
- }
31
- /**
32
- * Converts markdown content to LLM-friendly text format
33
- * Keeps markdown syntax as-is since LLMs parse it well
34
- */
35
- export function markdownToLLM(markdown) {
36
- let text = markdown;
37
- // Remove HTML comments
38
- text = text.replace(/<!--[\s\S]*?-->/g, '');
39
- // Remove excessive blank lines (more than 2)
40
- text = text.replace(/\n{3,}/g, '\n\n');
41
- // Trim whitespace
42
- text = text.trim();
43
- return text;
44
- }
45
- /**
46
- * Reads markdown files from the docs directory
47
- */
48
- export async function readMarkdownFile(filePath) {
49
- try {
50
- // In production, you might want to use a different approach
51
- // This is a placeholder - adjust based on your build setup
52
- const response = await fetch(filePath);
53
- if (!response.ok)
54
- throw new Error(`Failed to fetch ${filePath}`);
55
- return await response.text();
56
- }
57
- catch (error) {
58
- console.error(`Error reading markdown file: ${filePath}`, error);
59
- return '';
60
- }
61
- }
62
- /**
63
- * Generate LLM-friendly documentation metadata
64
- */
65
- export function generateLLMHeader(title, description, version = '1.0.0-alpha.30') {
66
- return `# ${title}
67
-
68
- ${description}
69
-
70
- ---
71
- Generated: ${new Date().toISOString()}
72
- Version: ${version}
73
- ---
74
-
75
- `;
76
- }