@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
@@ -5,7 +5,7 @@ export class ComboboxBond extends DropdownBond {
5
5
  constructor(s) {
6
6
  super(s);
7
7
  }
8
- input(props = {}) {
8
+ control() {
9
9
  return {
10
10
  'data-atom': `trigger-${this.id}`,
11
11
  'data-kind': 'combobox-input',
@@ -17,9 +17,7 @@ export class ComboboxBond extends DropdownBond {
17
17
  ? `item-${this.state.selectedItems.at(0)?.id}`
18
18
  : undefined,
19
19
  'aria-disabled': this.state.props.disabled ?? false,
20
- 'aria-label': props['aria-label'] ?? 'Choose an option',
21
20
  tabindex: this.state.props.disabled ? -1 : 0,
22
- ...props,
23
21
  oninput: (ev) => {
24
22
  const target = ev.target;
25
23
  this.state.props.query = target.value;
@@ -27,35 +25,14 @@ export class ComboboxBond extends DropdownBond {
27
25
  onkeydown: (ev) => {
28
26
  if (this.state.props.disabled)
29
27
  return;
30
- if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {
31
- ev.preventDefault();
32
- if (document.activeElement === this.elements.input) {
33
- this.state.open();
34
- if (ev.key === 'ArrowDown') {
35
- this.state.highlightNextItem();
36
- }
37
- else if (ev.key === 'ArrowUp') {
38
- this.state.highlightPreviousItem();
39
- }
40
- }
41
- }
42
- if (ev.key === 'Escape') {
43
- ev.preventDefault();
44
- if (document.activeElement === this.elements.input) {
45
- this.state.close();
46
- }
47
- }
48
- if (ev.key === 'Enter') {
49
- this.state.highlightedItem?.elements.root?.click();
50
- }
51
28
  },
52
29
  [createAttachmentKey()]: (node) => {
53
30
  this.elements.input = node;
54
31
  }
55
32
  };
56
33
  }
57
- static get = DropdownBond.getContext;
58
- static set = DropdownBond.setContext;
34
+ static get = DropdownBond.get;
35
+ static set = DropdownBond.set;
59
36
  }
60
37
  export class ComboboxBondState extends DropdownBondState {
61
38
  // #items: Map<string, DropdownItemAtom<T>> = new SvelteMap();
@@ -1,52 +1,52 @@
1
- <script lang="ts">
2
- import { onMount } from 'svelte';
3
- import { Input } from '../input';
4
- import { ComboboxBond } from './bond.svelte';
5
-
6
- const bond = ComboboxBond.get() as ComboboxBond<{}>;
7
-
8
- if (!bond) {
9
- throw new Error('Combobox atom was not found');
10
- }
11
-
12
- let {
13
- class: klass = '',
14
- children = undefined,
15
- onmount = undefined,
16
- ondestroy = undefined,
17
- animate = undefined,
18
- enter = undefined,
19
- exit = undefined,
20
- initial = undefined,
21
- ...restProps
22
- } = $props();
23
-
24
- let isMounted = $state(false);
25
-
26
- onMount(() => {
27
- isMounted = true;
28
- });
29
-
30
- const isMultiple = $derived(bond?.state.props?.multiple ?? false);
31
- const selectedText = $derived(
32
- isMounted || isMultiple ? (bond.state.selectedItems.at(0)?.text ?? '') : ''
33
- );
34
-
35
- const value = $derived(
36
- bond?.state.props?.query ?? (bond?.state.props?.text || selectedText || '')
37
- );
38
- </script>
39
-
40
- <Input.Control
41
- {value}
42
- preset="combobox.control"
43
- class={['border-border flex-1 py-1', '$preset', klass]}
44
- enter={enter?.bind(bond.state)}
45
- exit={exit?.bind(bond.state)}
46
- initial={initial?.bind(bond.state)}
47
- animate={animate?.bind(bond.state)}
48
- onmount={onmount?.bind(bond.state)}
49
- ondestroy={ondestroy?.bind(bond.state)}
50
- {...bond.input()}
51
- {...restProps}
52
- />
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import { Input } from '../input';
4
+ import { ComboboxBond } from './bond.svelte';
5
+
6
+ const bond = ComboboxBond.get() as ComboboxBond<{}>;
7
+
8
+ if (!bond) {
9
+ throw new Error('Combobox atom was not found');
10
+ }
11
+
12
+ let {
13
+ class: klass = '',
14
+ children = undefined,
15
+ onmount = undefined,
16
+ ondestroy = undefined,
17
+ animate = undefined,
18
+ enter = undefined,
19
+ exit = undefined,
20
+ initial = undefined,
21
+ ...restProps
22
+ } = $props();
23
+
24
+ let isMounted = $state(false);
25
+
26
+ onMount(() => {
27
+ isMounted = true;
28
+ });
29
+
30
+ const isMultiple = $derived(bond?.state.props?.multiple ?? false);
31
+ const selectedText = $derived(
32
+ isMounted || isMultiple ? (bond.state.selectedItems.at(0)?.text ?? '') : ''
33
+ );
34
+
35
+ const value = $derived(
36
+ bond?.state.props?.query ?? (bond?.state.props?.text || selectedText || '')
37
+ );
38
+ </script>
39
+
40
+ <Input.Control
41
+ {value}
42
+ preset="combobox.control"
43
+ class={['border-border flex-1 py-1', '$preset', klass]}
44
+ enter={enter?.bind(bond.state)}
45
+ exit={exit?.bind(bond.state)}
46
+ initial={initial?.bind(bond.state)}
47
+ animate={animate?.bind(bond.state)}
48
+ onmount={onmount?.bind(bond.state)}
49
+ ondestroy={ondestroy?.bind(bond.state)}
50
+ {...bond.control()}
51
+ {...restProps}
52
+ />
@@ -1,68 +1,62 @@
1
- <script
2
- lang="ts"
3
- generics="D, T extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base"
4
- >
5
- import { ComboboxBond } from './bond.svelte';
6
- import { Item } from '../dropdown/atoms';
7
- import { DropdownItemBond } from '../dropdown/item/bond.svelte';
8
-
9
- import { on } from '../../attachments';
10
- import type { Base } from '../atom';
11
-
12
- const bond = ComboboxBond.get() as ComboboxBond<{}>;
13
-
14
- if (!bond) {
15
- throw new Error('Combobox atom was not found');
16
- }
17
-
18
- let {
19
- class: klass = '',
20
- children = undefined,
21
- onmount = undefined,
22
- ondestroy = undefined,
23
- animate = undefined,
24
- enter = undefined,
25
- exit = undefined,
26
- initial = undefined,
27
- ...restProps
28
- } = $props();
29
- </script>
30
-
31
- <Item
32
- {@attach (node) => {
33
- const item = DropdownItemBond.get();
34
-
35
- return on('click', (ev) => {
36
- ev.preventDefault();
37
-
38
- const currentTarget = ev.currentTarget as HTMLElement | undefined;
39
-
40
- const textElement = (currentTarget?.querySelector('data-text') ?? currentTarget) as
41
- | HTMLElement
42
- | undefined;
43
-
44
- // Set selected item text
45
- bond.state.props.text = textElement?.innerText ?? '';
46
- // Clear input query
47
- bond.state.props.query = undefined;
48
-
49
- item?.state?.toggle();
50
-
51
- // Create a promise that resolves when combobox.state.props.open is set to false
52
-
53
- bond?.state.close();
54
- })(node);
55
- }}
56
- {bond}
57
- preset="combobox.item"
58
- class={['border-border', '$preset', klass]}
59
- enter={enter?.bind(bond.state)}
60
- exit={exit?.bind(bond.state)}
61
- initial={initial?.bind(bond.state)}
62
- animate={animate?.bind(bond.state)}
63
- onmount={onmount?.bind(bond.state)}
64
- ondestroy={ondestroy?.bind(bond.state)}
65
- {...restProps}
66
- >
67
- {@render children?.({ combobox: bond })}
68
- </Item>
1
+ <script lang="ts">
2
+ import { ComboboxBond } from './bond.svelte';
3
+ import { Item } from '../dropdown/atoms';
4
+ import { DropdownItemController } from '../dropdown/item/controller.svelte';
5
+
6
+ import { on } from '../../attachments';
7
+
8
+ const bond = ComboboxBond.get() as ComboboxBond<{}>;
9
+
10
+ if (!bond) {
11
+ throw new Error('Combobox atom was not found');
12
+ }
13
+
14
+ let {
15
+ class: klass = '',
16
+ children = undefined,
17
+ onmount = undefined,
18
+ ondestroy = undefined,
19
+ animate = undefined,
20
+ enter = undefined,
21
+ exit = undefined,
22
+ initial = undefined,
23
+ ...restProps
24
+ } = $props();
25
+ </script>
26
+
27
+ <Item
28
+ {@attach (node: HTMLElement) => {
29
+ const item = DropdownItemController.get();
30
+
31
+ return on('click', (ev) => {
32
+ ev.preventDefault();
33
+
34
+ const currentTarget = ev.currentTarget as HTMLElement | undefined;
35
+
36
+ const textElement = (currentTarget?.querySelector('data-text') ?? currentTarget) as
37
+ | HTMLElement
38
+ | undefined;
39
+
40
+ // Set selected item text
41
+ bond.state.props.text = textElement?.innerText ?? '';
42
+ // Clear input query
43
+ bond.state.props.query = '';
44
+
45
+ item?.toggle();
46
+
47
+ bond?.state.close();
48
+ })(node);
49
+ }}
50
+ {bond}
51
+ preset="combobox.item"
52
+ class={['border-border', '$preset', klass].filter(Boolean).join(' ')}
53
+ enter={enter?.bind(bond.state)}
54
+ exit={exit?.bind(bond.state)}
55
+ initial={initial?.bind(bond.state)}
56
+ animate={animate?.bind(bond.state)}
57
+ onmount={onmount?.bind(bond.state)}
58
+ ondestroy={ondestroy?.bind(bond.state)}
59
+ {...restProps}
60
+ >
61
+ {@render children?.({ combobox: bond })}
62
+ </Item>
@@ -0,0 +1,12 @@
1
+ declare const ComboboxItem: import("svelte").Component<{
2
+ class?: string;
3
+ children?: any;
4
+ onmount?: any;
5
+ ondestroy?: any;
6
+ animate?: any;
7
+ enter?: any;
8
+ exit?: any;
9
+ initial?: any;
10
+ } & Record<string, any>, {}, "">;
11
+ type ComboboxItem = ReturnType<typeof ComboboxItem>;
12
+ export default ComboboxItem;
@@ -0,0 +1,50 @@
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>('usd');
23
+ let query = $state('');
24
+ let array = $state([
25
+ { value: 'usd', label: 'US Dollar' },
26
+ { value: 'eur', label: 'Euro' },
27
+ { value: 'gbp', label: 'British Pound' },
28
+ { value: 'jpy', label: 'Japanese Yen' },
29
+ { value: 'cny', label: 'Chinese Yuan' }
30
+ ]);
31
+
32
+ const filteredItems = $derived(
33
+ array.filter((item) => !query || item.label.toLowerCase().includes(query))
34
+ );
35
+ </script>
36
+
37
+ <Story name="Combobox" args={{}}>
38
+ <ACombobox.Root bind:open bind:value bind:query>
39
+ <ACombobox.Trigger base={Input.Root} class="h-10 min-w-sm">
40
+ <Input.Icon class="text-foreground/50">$</Input.Icon>
41
+ <Divider class="mx-1" vertical />
42
+ <ACombobox.Control class="px-1" placeholder="Select a language" />
43
+ </ACombobox.Trigger>
44
+ <ACombobox.List>
45
+ {#each filteredItems as item (item.value)}
46
+ <ACombobox.Item value={item.value}>{item.label}</ACombobox.Item>
47
+ {/each}
48
+ </ACombobox.List>
49
+ </ACombobox.Root>
50
+ </Story>
@@ -0,0 +1,3 @@
1
+ declare const Combobox: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type Combobox = ReturnType<typeof Combobox>;
3
+ export default Combobox;
@@ -1,90 +1,90 @@
1
- <script lang="ts" generics="T, E extends HtmlElementTagName, B extends Base = Base">
2
- import { untrack } from 'svelte';
3
- import { nanoid } from 'nanoid';
4
- import { defineProperty, defineState } from '../../../utils';
5
- import { HtmlAtom, type Base } from '../../atom';
6
- import type { HtmlElementTagName } from '../../element';
7
- import { DataGridTrBond, DataGridTrBondState, type DataGridTrBondProps } from './bond.svelte';
8
- import type { DatagridTrProps } from '../types';
9
- import { type DatagridContext } from '../context';
10
-
11
- import './datagrid-tr.css';
12
-
13
- let {
14
- class: klass = '',
15
- value = nanoid(),
16
- rows = 'auto',
17
- data = undefined,
18
- header = false,
19
- factory = _factory,
20
- children = undefined,
21
- onmount = undefined,
22
- ondestroy = undefined,
23
- animate = undefined,
24
- enter = undefined,
25
- exit = undefined,
26
- initial = undefined,
27
- onclick = undefined,
28
- ...restProps
29
- }: DatagridTrProps<T, E, B> = $props();
30
-
31
- const bondProps = defineState<DataGridTrBondProps>([
32
- defineProperty('data', () => data),
33
- defineProperty('value', () => value),
34
- defineProperty('header', () => header)
35
- ]);
36
- const bond = factory(bondProps).share();
37
-
38
- const isHeader = $derived(bond?.state.isHeader ?? false);
39
- const isSelected = $derived(bond.state.isSelected);
40
-
41
- const headerProps = $derived({
42
- ...bond.root(),
43
- ...restProps
44
- });
45
-
46
- const unmount = untrack(() => {
47
- if (!isHeader) {
48
- return bond.mount();
49
- }
50
- });
51
-
52
- $effect(() => unmount);
53
-
54
- function _factory(props: typeof bondProps) {
55
- const datagridTrState = new DataGridTrBondState(() => props);
56
- return new DataGridTrBond(datagridTrState);
57
- }
58
-
59
- function onclick_(ev: Event) {
60
- onclick?.(ev, { tr: bond as unknown as DatagridContext<T> });
61
-
62
- if (!ev.defaultPrevented) {
63
- //
64
- }
65
- }
66
- </script>
67
-
68
- <HtmlAtom
69
- {bond}
70
- preset="datagrid.tr"
71
- class={[
72
- 'datagrid-tr border-border items-center border-b bg-transparent',
73
- !isHeader && 'hover:bg-foreground/2 active:bg-foreground/4 transition-colors duration-100',
74
- isHeader && 'header-tr',
75
- isSelected && 'bg-primary/2 hover:bg-primary/4 active:bg-primary/6',
76
- '$preset',
77
- klass
78
- ]}
79
- style="--rows:{rows}"
80
- enter={enter?.bind(bond.state)}
81
- exit={exit?.bind(bond.state)}
82
- initial={initial?.bind(bond.state)}
83
- animate={animate?.bind(bond.state)}
84
- onmount={onmount?.bind(bond.state)}
85
- ondestroy={ondestroy?.bind(bond.state)}
86
- onclick={onclick_}
87
- {...headerProps}
88
- >
89
- {@render children?.({ tr: bond as unknown as DatagridContext<T> })}
90
- </HtmlAtom>
1
+ <script lang="ts" generics="T, E extends HtmlElementTagName, B extends Base = Base">
2
+ import { untrack } from 'svelte';
3
+ import { nanoid } from 'nanoid';
4
+ import { defineProperty, defineState } from '../../../utils';
5
+ import { HtmlAtom, type Base } from '../../atom';
6
+ import type { HtmlElementTagName } from '../../element';
7
+ import { DataGridTrBond, DataGridTrBondState, type DataGridTrBondProps } from './bond.svelte';
8
+ import type { DatagridTrProps } from '../types';
9
+ import { type DatagridContext } from '../context';
10
+
11
+ import './datagrid-tr.css';
12
+
13
+ let {
14
+ class: klass = '',
15
+ value = nanoid(),
16
+ rows = 'auto',
17
+ data = undefined,
18
+ header = false,
19
+ factory = _factory,
20
+ children = undefined,
21
+ onmount = undefined,
22
+ ondestroy = undefined,
23
+ animate = undefined,
24
+ enter = undefined,
25
+ exit = undefined,
26
+ initial = undefined,
27
+ onclick = undefined,
28
+ ...restProps
29
+ }: DatagridTrProps<T, E, B> = $props();
30
+
31
+ const bondProps = defineState<DataGridTrBondProps>([
32
+ defineProperty('data', () => data),
33
+ defineProperty('value', () => value),
34
+ defineProperty('header', () => header)
35
+ ]);
36
+ const bond = factory(bondProps).share();
37
+
38
+ const isHeader = $derived(bond?.state.isHeader ?? false);
39
+ const isSelected = $derived(bond.state.isSelected);
40
+
41
+ const headerProps = $derived({
42
+ ...bond.root(),
43
+ ...restProps
44
+ });
45
+
46
+ const unmount = untrack(() => {
47
+ if (!isHeader) {
48
+ return bond.mount();
49
+ }
50
+ });
51
+
52
+ $effect(() => unmount);
53
+
54
+ function _factory(props: typeof bondProps) {
55
+ const datagridTrState = new DataGridTrBondState(() => props);
56
+ return new DataGridTrBond(datagridTrState);
57
+ }
58
+
59
+ function onclick_(ev: Event) {
60
+ onclick?.(ev, { tr: bond as unknown as DatagridContext<T> });
61
+
62
+ if (!ev.defaultPrevented) {
63
+ //
64
+ }
65
+ }
66
+ </script>
67
+
68
+ <HtmlAtom
69
+ {bond}
70
+ preset="datagrid.tr"
71
+ class={[
72
+ 'datagrid-tr border-border items-center border-b bg-transparent',
73
+ !isHeader && 'hover:bg-foreground/2 active:bg-foreground/4 transition-colors duration-100',
74
+ isHeader && 'header-tr',
75
+ isSelected && 'bg-primary/2 hover:bg-primary/4 active:bg-primary/6',
76
+ '$preset',
77
+ klass
78
+ ]}
79
+ style="--rows:{rows}"
80
+ enter={enter?.bind(bond.state)}
81
+ exit={exit?.bind(bond.state)}
82
+ initial={initial?.bind(bond.state)}
83
+ animate={animate?.bind(bond.state)}
84
+ onmount={onmount?.bind(bond.state)}
85
+ ondestroy={ondestroy?.bind(bond.state)}
86
+ onclick={onclick_}
87
+ {...headerProps}
88
+ >
89
+ {@render children?.({ tr: bond as unknown as DatagridContext<T> })}
90
+ </HtmlAtom>
@@ -12,13 +12,11 @@ export type DatePickerBondElements = PopoverDomElements & {
12
12
  };
13
13
  export declare class DatePickerBond<Props extends DatePickerBondProps = DatePickerBondProps, State extends DatePickerBondState<Props> = DatePickerBondState<Props>> extends PopoverBond<Props, State, DatePickerBondElements> {
14
14
  #private;
15
- static CONTEXT_KEY: string;
16
15
  constructor(state: State);
17
16
  get calendar(): CalendarBond<CalendarBondProps, import("..").CalendarBondState<CalendarBondProps>> | undefined;
18
17
  setCalendar(calendar: CalendarBond): void;
19
18
  share(): this;
20
19
  trigger(): {
21
- [x: symbol]: (node: HTMLInputElement) => void;
22
20
  id: string;
23
21
  role: string;
24
22
  'aria-expanded': boolean;
@@ -29,19 +27,31 @@ export declare class DatePickerBond<Props extends DatePickerBondProps = DatePick
29
27
  disabled: boolean;
30
28
  readonly: boolean;
31
29
  tabindex: number;
30
+ 'aria-haspopup': string;
31
+ 'data-kind': string;
32
+ onclick: (ev: PointerEvent) => void;
33
+ onkeydown: (ev: KeyboardEvent) => void;
32
34
  };
33
35
  content(): {
34
- [x: symbol]: (node: HTMLElement) => void;
35
36
  id: string;
36
37
  role: string;
37
38
  'aria-label': string;
39
+ 'aria-modal': boolean;
40
+ 'aria-labelledby': string;
41
+ inert: boolean | undefined;
42
+ tabindex: number;
43
+ 'data-atom': string;
44
+ 'data-kind': string;
45
+ 'data-active': boolean;
46
+ onkeydown: ((ev: KeyboardEvent) => void) | undefined;
38
47
  };
39
- clearButton(props?: Record<string, unknown>): {
40
- onclick: (ev: Event) => void;
48
+ clearButton(): {
49
+ [x: symbol]: (node: HTMLElement) => void;
41
50
  id: string;
42
51
  type: string;
43
52
  'aria-label': string;
44
53
  tabindex: number;
54
+ onclick: (ev: Event) => void;
45
55
  };
46
56
  static get(): DatePickerBond;
47
57
  static set(bond: DatePickerBond): DatePickerBond;
@@ -2,7 +2,6 @@ import { PopoverBond, PopoverState } from '../popover/bond.svelte';
2
2
  import { getContext, setContext } from 'svelte';
3
3
  import { createAttachmentKey } from 'svelte/attachments';
4
4
  export class DatePickerBond extends PopoverBond {
5
- static CONTEXT_KEY = '@atoms/context/date-picker';
6
5
  #calendarBond;
7
6
  constructor(state) {
8
7
  super(state);
@@ -20,6 +19,7 @@ export class DatePickerBond extends PopoverBond {
20
19
  const isDisabled = this.state.props.disabled ?? false;
21
20
  const placeholder = this.state.props.placeholder ?? 'Select a date';
22
21
  return {
22
+ ...super.trigger(),
23
23
  id: `date-picker-input-${this.id}`,
24
24
  role: 'combobox',
25
25
  'aria-expanded': this.state.props.open ?? false,
@@ -29,30 +29,24 @@ export class DatePickerBond extends PopoverBond {
29
29
  placeholder,
30
30
  disabled: isDisabled,
31
31
  readonly: true,
32
- tabindex: isDisabled ? -1 : 0,
33
- [createAttachmentKey()]: (node) => {
34
- this.elements.trigger = node;
35
- }
32
+ tabindex: isDisabled ? -1 : 0
36
33
  };
37
34
  }
38
35
  content() {
39
36
  return {
37
+ ...super.content(),
40
38
  id: `date-picker-calendar-${this.id}`,
41
39
  role: 'dialog',
42
- 'aria-label': 'Choose date',
43
- [createAttachmentKey()]: (node) => {
44
- this.elements.content = node;
45
- }
40
+ 'aria-label': 'Choose date'
46
41
  };
47
42
  }
48
- clearButton(props = {}) {
43
+ clearButton() {
49
44
  const hasValue = this.state.hasValue;
50
45
  return {
51
46
  id: `date-picker-clear-${this.id}`,
52
47
  type: 'button',
53
48
  'aria-label': 'Clear date',
54
49
  tabindex: hasValue ? 0 : -1,
55
- ...props,
56
50
  onclick: (ev) => {
57
51
  ev.preventDefault();
58
52
  ev.stopPropagation();