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

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 (147) hide show
  1. package/README.md +853 -852
  2. package/dist/components/accordion/accordion-root.svelte +7 -3
  3. package/dist/components/accordion/accordion.stories.svelte +7 -82
  4. package/dist/components/accordion/item/accordion-item-body.svelte +44 -42
  5. package/dist/components/accordion/item/accordion-item-header.svelte +51 -50
  6. package/dist/components/accordion/item/accordion-item-indicator.svelte +51 -50
  7. package/dist/components/accordion/item/accordion-item-root.svelte +66 -65
  8. package/dist/components/accordion/item/bond.svelte.d.ts +2 -0
  9. package/dist/components/accordion/item/index.d.ts +3 -0
  10. package/dist/components/accordion/item/index.js +3 -0
  11. package/dist/components/accordion/item/motion.svelte.d.ts +15 -0
  12. package/dist/components/accordion/item/motion.svelte.js +30 -0
  13. package/dist/components/accordion/item/types.d.ts +7 -24
  14. package/dist/components/alert/alert-close-button.svelte +66 -70
  15. package/dist/components/alert/alert-description.svelte +42 -42
  16. package/dist/components/alert/alert-description.svelte.d.ts +3 -6
  17. package/dist/components/alert/alert-root.svelte +68 -103
  18. package/dist/components/alert/alert-root.svelte.d.ts +2 -2
  19. package/dist/components/alert/alert.stories.svelte +400 -400
  20. package/dist/components/alert/bond.svelte.d.ts +0 -13
  21. package/dist/components/alert/bond.svelte.js +0 -32
  22. package/dist/components/alert/types.d.ts +8 -32
  23. package/dist/components/atom/html-atom.svelte +261 -261
  24. package/dist/components/avatar/avatar.stories.svelte +22 -22
  25. package/dist/components/badge/badge.stories.svelte +12 -12
  26. package/dist/components/badge/badge.svelte +19 -19
  27. package/dist/components/breadcrumb/breadcrumb.stories.svelte +5 -5
  28. package/dist/components/button/button.stories.svelte +27 -27
  29. package/dist/components/calendar/calendar-day.svelte +101 -96
  30. package/dist/components/calendar/calendar.stories.svelte +26 -26
  31. package/dist/components/card/card-body.svelte +39 -39
  32. package/dist/components/card/card-footer.svelte +41 -41
  33. package/dist/components/card/card-root.svelte +91 -91
  34. package/dist/components/card/card.stories.svelte +133 -133
  35. package/dist/components/checkbox/checkbox.stories.svelte +22 -22
  36. package/dist/components/checkbox/checkbox.svelte +6 -2
  37. package/dist/components/collapsible/collapsible.stories.svelte +172 -172
  38. package/dist/components/combobox/atoms.d.ts +1 -1
  39. package/dist/components/combobox/atoms.js +1 -1
  40. package/dist/components/combobox/combobox-root.svelte +65 -65
  41. package/dist/components/combobox/compobox.stories.svelte +51 -51
  42. package/dist/components/combobox/index.d.ts +1 -0
  43. package/dist/components/container/container.stories.svelte +20 -20
  44. package/dist/components/container/container.svelte.d.ts +1 -1
  45. package/dist/components/datagrid/datagrid.stories.svelte +72 -72
  46. package/dist/components/datagrid/tr/bond.svelte.d.ts +4 -2
  47. package/dist/components/datagrid/tr/bond.svelte.js +9 -7
  48. package/dist/components/datagrid/tr/datagrid-tr.svelte +90 -88
  49. package/dist/components/date-picker/date-picker-calendar.svelte +67 -67
  50. package/dist/components/date-picker/date-picker-root.svelte +95 -95
  51. package/dist/components/date-picker/date-picker.stories.svelte +35 -35
  52. package/dist/components/dialog/bond.svelte.d.ts +13 -3
  53. package/dist/components/dialog/bond.svelte.js +66 -5
  54. package/dist/components/dialog/dialog-content.svelte +44 -62
  55. package/dist/components/dialog/dialog-root.svelte +91 -110
  56. package/dist/components/dialog/dialog.stories.svelte +64 -64
  57. package/dist/components/dialog/motion.svelte.d.ts +13 -0
  58. package/dist/components/dialog/motion.svelte.js +44 -0
  59. package/dist/components/drawer/attachments.svelte.d.ts +1 -1
  60. package/dist/components/drawer/attachments.svelte.js +1 -3
  61. package/dist/components/drawer/bond.svelte.d.ts +24 -5
  62. package/dist/components/drawer/bond.svelte.js +77 -11
  63. package/dist/components/drawer/drawer-content.svelte +6 -14
  64. package/dist/components/drawer/drawer.stories.svelte +27 -95
  65. package/dist/components/drawer/index.d.ts +2 -0
  66. package/dist/components/drawer/index.js +2 -0
  67. package/dist/components/drawer/motion.d.ts +15 -0
  68. package/dist/components/drawer/motion.js +28 -0
  69. package/dist/components/dropdown/atoms.d.ts +1 -1
  70. package/dist/components/dropdown/atoms.js +1 -1
  71. package/dist/components/dropdown/bond.svelte.d.ts +5 -1
  72. package/dist/components/dropdown/dropdown-root.svelte +59 -59
  73. package/dist/components/dropdown/dropdown.stories.svelte +80 -80
  74. package/dist/components/dropdown/index.d.ts +1 -0
  75. package/dist/components/form/form.stories.svelte +96 -96
  76. package/dist/components/image/image.stories.svelte +20 -20
  77. package/dist/components/input/input.stories.svelte +35 -35
  78. package/dist/components/label/label.stories.svelte +15 -15
  79. package/dist/components/lazy/lazy.stories.svelte +28 -28
  80. package/dist/components/link/link.stories.svelte +15 -15
  81. package/dist/components/list/list-item.svelte +20 -20
  82. package/dist/components/menu/atoms.d.ts +1 -0
  83. package/dist/components/menu/atoms.js +1 -0
  84. package/dist/components/menu/index.d.ts +2 -1
  85. package/dist/components/menu/index.js +1 -1
  86. package/dist/components/menu/menu-item.svelte +69 -51
  87. package/dist/components/menu/menu-item.svelte.d.ts +1 -0
  88. package/dist/components/menu/menu.stories.svelte +33 -33
  89. package/dist/components/popover/bond.svelte.d.ts +20 -7
  90. package/dist/components/popover/bond.svelte.js +80 -27
  91. package/dist/components/popover/motion.d.ts +6 -0
  92. package/dist/components/popover/motion.js +56 -0
  93. package/dist/components/popover/popover-arrow.svelte +111 -111
  94. package/dist/components/popover/popover-content.svelte +34 -72
  95. package/dist/components/popover/popover-indicator.svelte +44 -44
  96. package/dist/components/popover/popover-root.svelte +48 -48
  97. package/dist/components/popover/popover.stories.svelte +3 -3
  98. package/dist/components/popover/types.d.ts +9 -7
  99. package/dist/components/portal/active-portal.svelte +29 -22
  100. package/dist/components/portal/active-portal.svelte.d.ts +2 -9
  101. package/dist/components/portal/portal-root.svelte +76 -83
  102. package/dist/components/portal/portal-root.svelte.d.ts +4 -6
  103. package/dist/components/portal/teleport.svelte +49 -50
  104. package/dist/components/portal/teleport.svelte.d.ts +3 -4
  105. package/dist/components/qr-code/qr-code.stories.svelte +18 -18
  106. package/dist/components/radio/radio-group.stories.svelte +41 -41
  107. package/dist/components/radio/radio.stories.svelte +17 -17
  108. package/dist/components/radio/radio.svelte +1 -1
  109. package/dist/components/radio/types.d.ts +98 -0
  110. package/dist/components/radio/types.js +2 -0
  111. package/dist/components/root/root.svelte +13 -30
  112. package/dist/components/root/root.svelte.d.ts +1 -1
  113. package/dist/components/scrollable/scrollable-root.svelte.d.ts +2 -2
  114. package/dist/components/scrollable/scrollable.stories.svelte +116 -116
  115. package/dist/components/sidebar/index.d.ts +2 -0
  116. package/dist/components/sidebar/index.js +2 -0
  117. package/dist/components/sidebar/motion.svelte.d.ts +11 -0
  118. package/dist/components/sidebar/motion.svelte.js +16 -0
  119. package/dist/components/sidebar/sidebar-content.svelte +3 -13
  120. package/dist/components/sidebar/sidebar-root.svelte +39 -39
  121. package/dist/components/sidebar/sidebar.stories.svelte +43 -43
  122. package/dist/components/sidebar/types.d.ts +2 -12
  123. package/dist/components/tabs/tabs.stories.svelte +56 -56
  124. package/dist/components/textarea/atoms.d.ts +1 -0
  125. package/dist/components/textarea/atoms.js +1 -0
  126. package/dist/components/textarea/textarea-input.svelte +9 -6
  127. package/dist/components/textarea/textarea-root.svelte +9 -9
  128. package/dist/components/textarea/textarea-root.svelte.d.ts +2 -0
  129. package/dist/components/tooltip/tooltip-trigger.svelte +2 -2
  130. package/dist/components/tooltip/tooltip-trigger.svelte.d.ts +1 -0
  131. package/dist/components/tooltip/tooltip.stories.svelte +32 -32
  132. package/dist/components/tree/tree.stories.svelte +142 -142
  133. package/dist/icons/icon-copy.svelte +6 -0
  134. package/dist/{components/radio/types.svelte.d.ts → icons/icon-copy.svelte.d.ts} +3 -3
  135. package/dist/utils/markdown-to-llm.d.ts +28 -0
  136. package/dist/utils/markdown-to-llm.js +76 -0
  137. package/package.json +1 -2
  138. package/dist/components/radio/types.svelte +0 -0
  139. package/llm/composition.md +0 -395
  140. package/llm/crafting.md +0 -838
  141. package/llm/motion.md +0 -970
  142. package/llm/philosophy.md +0 -23
  143. package/llm/preset-variant-integration.md +0 -516
  144. package/llm/preset.md +0 -383
  145. package/llm/styling.md +0 -216
  146. package/llm/usage.md +0 -46
  147. package/llm/variants.md +0 -1259
@@ -1,95 +1,95 @@
1
- <script lang="ts">
2
- import { startOfDay } from 'date-fns';
3
- import { defineProperty, defineState } from '../../utils';
4
- import { Root } from '../popover/atoms';
5
- import type { CalendarRange } from '../calendar/types';
6
- import { DatePickerBond, DatePickerBondState, type DatePickerBondProps } from './bond.svelte';
7
- import type { DatePickerRootProps } from './types';
8
-
9
- let {
10
- open = $bindable(false),
11
- value = $bindable(undefined),
12
- range = $bindable([undefined, undefined]),
13
- pivote = $bindable(new Date()),
14
- start = $bindable(startOfDay(new Date())),
15
- end = $bindable(undefined),
16
- min = undefined,
17
- max = undefined,
18
- type = 'single',
19
- offset = 1,
20
- factory = _factory,
21
- children,
22
- ...restProps
23
- }: DatePickerRootProps = $props();
24
-
25
- const seed = {};
26
-
27
- const bondProps = defineState<DatePickerBondProps>(
28
- [
29
- defineProperty(
30
- 'open',
31
- () => open,
32
- (v) => {
33
- open = v;
34
- }
35
- ),
36
- defineProperty(
37
- 'range',
38
- () => range,
39
- (v: CalendarRange) => {
40
- range = v;
41
- value = v[0];
42
- }
43
- ),
44
- defineProperty(
45
- 'value',
46
- () => range?.[0],
47
- (v) => {
48
- range[0] = v;
49
- }
50
- ),
51
- defineProperty(
52
- 'pivote',
53
- () => pivote,
54
- (v: Date) => (pivote = v)
55
- ),
56
- defineProperty(
57
- 'start',
58
- () => range[0],
59
- (v: Date) => {
60
- range[0] = v;
61
- }
62
- ),
63
- defineProperty(
64
- 'end',
65
- () => range[1],
66
- (v: Date | undefined) => {
67
- range[1] = v;
68
- }
69
- ),
70
- defineProperty(
71
- 'min',
72
- () => min,
73
- (v: Date | undefined) => (min = v)
74
- ),
75
- defineProperty(
76
- 'max',
77
- () => max,
78
- (v: Date | undefined) => (max = v)
79
- ),
80
- defineProperty('type', () => type ?? 'single')
81
- ],
82
- () => seed
83
- );
84
-
85
- const bond = factory().share();
86
-
87
- function _factory() {
88
- const bondState = new DatePickerBondState(() => bondProps);
89
- return new DatePickerBond(bondState);
90
- }
91
- </script>
92
-
93
- <Root bind:open extend={bondProps} {offset} {...restProps}>
94
- {@render children?.({ datePicker: bond })}
95
- </Root>
1
+ <script lang="ts">
2
+ import { startOfDay } from 'date-fns';
3
+ import { defineProperty, defineState } from '../../utils';
4
+ import { Root } from '../popover/atoms';
5
+ import type { CalendarRange } from '../calendar/types';
6
+ import { DatePickerBond, DatePickerBondState, type DatePickerBondProps } from './bond.svelte';
7
+ import type { DatePickerRootProps } from './types';
8
+
9
+ let {
10
+ open = $bindable(false),
11
+ value = $bindable(undefined),
12
+ range = $bindable([undefined, undefined]),
13
+ pivote = $bindable(new Date()),
14
+ start = $bindable(startOfDay(new Date())),
15
+ end = $bindable(undefined),
16
+ min = undefined,
17
+ max = undefined,
18
+ type = 'single',
19
+ offset = 1,
20
+ factory = _factory,
21
+ children,
22
+ ...restProps
23
+ }: DatePickerRootProps = $props();
24
+
25
+ const seed = {};
26
+
27
+ const bondProps = defineState<DatePickerBondProps>(
28
+ [
29
+ defineProperty(
30
+ 'open',
31
+ () => open,
32
+ (v) => {
33
+ open = v;
34
+ }
35
+ ),
36
+ defineProperty(
37
+ 'range',
38
+ () => range,
39
+ (v: CalendarRange) => {
40
+ range = v;
41
+ value = v[0];
42
+ }
43
+ ),
44
+ defineProperty(
45
+ 'value',
46
+ () => range?.[0],
47
+ (v) => {
48
+ range[0] = v;
49
+ }
50
+ ),
51
+ defineProperty(
52
+ 'pivote',
53
+ () => pivote,
54
+ (v: Date) => (pivote = v)
55
+ ),
56
+ defineProperty(
57
+ 'start',
58
+ () => range[0],
59
+ (v: Date) => {
60
+ range[0] = v;
61
+ }
62
+ ),
63
+ defineProperty(
64
+ 'end',
65
+ () => range[1],
66
+ (v: Date | undefined) => {
67
+ range[1] = v;
68
+ }
69
+ ),
70
+ defineProperty(
71
+ 'min',
72
+ () => min,
73
+ (v: Date | undefined) => (min = v)
74
+ ),
75
+ defineProperty(
76
+ 'max',
77
+ () => max,
78
+ (v: Date | undefined) => (max = v)
79
+ ),
80
+ defineProperty('type', () => type ?? 'single')
81
+ ],
82
+ () => seed
83
+ );
84
+
85
+ const bond = factory().share();
86
+
87
+ function _factory() {
88
+ const bondState = new DatePickerBondState(() => bondProps);
89
+ return new DatePickerBond(bondState);
90
+ }
91
+ </script>
92
+
93
+ <Root bind:open extend={bondProps} {offset} {...restProps}>
94
+ {@render children?.({ datePicker: bond })}
95
+ </Root>
@@ -1,35 +1,35 @@
1
- <script module>
2
- import { defineMeta } from '@storybook/addon-svelte-csf';
3
-
4
- const { Story } = defineMeta({
5
- title: 'Atoms/Date Picker'
6
- });
7
- </script>
8
-
9
- <script lang="ts">
10
- import { DatePicker as ADatePicker } from '.';
11
- import { Button } from '../button';
12
- import { addDays, subDays } from 'date-fns';
13
-
14
- let value: Date | undefined = $state(undefined);
15
-
16
- let min = $state(subDays(new Date(), 5));
17
- let max = $state(addDays(new Date(), 15));
18
- </script>
19
-
20
- <Story name="Date Picker">
21
- {#snippet children({ args })}
22
- <ADatePicker.Root bind:value {min} {max}>
23
- <ADatePicker.Trigger base={Button} class="w-sm gap-4">
24
- {#if value}
25
- <div>{value.toDateString()}</div>
26
- {:else}
27
- <div>Open Date Picker</div>
28
- {/if}
29
-
30
- <ADatePicker.Indicator class="ml-auto" />
31
- </ADatePicker.Trigger>
32
- <ADatePicker.Calendar />
33
- </ADatePicker.Root>
34
- {/snippet}
35
- </Story>
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+
4
+ const { Story } = defineMeta({
5
+ title: 'Atoms/Date Picker'
6
+ });
7
+ </script>
8
+
9
+ <script lang="ts">
10
+ import { DatePicker as ADatePicker } from '.';
11
+ import { Button } from '../button';
12
+ import { addDays, subDays } from 'date-fns';
13
+
14
+ let value: Date | undefined = $state(undefined);
15
+
16
+ let min = $state(subDays(new Date(), 5));
17
+ let max = $state(addDays(new Date(), 15));
18
+ </script>
19
+
20
+ <Story name="Date Picker">
21
+ {#snippet children({ args })}
22
+ <ADatePicker.Root bind:value {min} {max}>
23
+ <ADatePicker.Trigger base={Button} class="w-sm gap-4">
24
+ {#if value}
25
+ <div>{value.toDateString()}</div>
26
+ {:else}
27
+ <div>Open Date Picker</div>
28
+ {/if}
29
+
30
+ <ADatePicker.Indicator class="ml-auto" />
31
+ </ADatePicker.Trigger>
32
+ <ADatePicker.Calendar />
33
+ </ADatePicker.Root>
34
+ {/snippet}
35
+ </Story>
@@ -16,26 +16,33 @@ export declare class DialogBond<State extends DialogBondState<DialogBondProps> =
16
16
  static CONTEXT_KEY: string;
17
17
  constructor(s: State);
18
18
  share(): this;
19
- root(props: Record<string, unknown>): {
19
+ root(): {
20
+ [x: symbol]: (node: HTMLDialogElement) => void;
20
21
  id: string;
21
22
  role: string;
22
23
  'aria-modal': boolean;
23
24
  'aria-labelledby': string;
24
25
  'aria-describedby': string;
25
- 'aria-opened': boolean;
26
- 'aria-disabled': boolean;
26
+ inert: string | undefined;
27
27
  'data-kind': string;
28
+ 'data-open': boolean;
29
+ onclick: (ev: MouseEvent) => void;
30
+ onkeydown: (ev: KeyboardEvent) => void;
28
31
  };
29
32
  content(props: Record<string, unknown>): {
30
33
  id: string;
34
+ role: string;
31
35
  'data-kind': string;
32
36
  };
33
37
  header(props: Record<string, unknown>): {
34
38
  id: string;
39
+ role: string;
35
40
  'data-kind': string;
36
41
  };
37
42
  title(props: Record<string, unknown>): {
38
43
  id: string;
44
+ role: string;
45
+ 'aria-level': number;
39
46
  'data-kind': string;
40
47
  };
41
48
  description(props: Record<string, unknown>): {
@@ -44,10 +51,13 @@ export declare class DialogBond<State extends DialogBondState<DialogBondProps> =
44
51
  };
45
52
  body(props: Record<string, unknown>): {
46
53
  id: string;
54
+ role: string;
55
+ 'aria-live': string;
47
56
  'data-kind': string;
48
57
  };
49
58
  footer(props: Record<string, unknown>): {
50
59
  id: string;
60
+ role: string;
51
61
  'data-kind': string;
52
62
  };
53
63
  static get(): DialogBond | undefined;
@@ -19,24 +19,78 @@ export class DialogBond extends Bond {
19
19
  share() {
20
20
  return DialogBond.set(this);
21
21
  }
22
- root(props) {
22
+ root() {
23
23
  const id = getElementId(this.id, DIALOG_ELEMENTS_KIND.root);
24
24
  const titleId = getElementId(this.id, DIALOG_ELEMENTS_KIND.title);
25
25
  const descriptionId = getElementId(this.id, DIALOG_ELEMENTS_KIND.description);
26
- const idOpened = this.state.props.open ?? false;
26
+ const isOpen = this.state.props.open ?? false;
27
27
  const isDisabled = this.state.props.disabled ?? false;
28
+ // Focus trap handler
29
+ const focusTrap = (ev) => {
30
+ const node = ev.currentTarget;
31
+ if (ev.key === 'Tab') {
32
+ const focusableElements = node.querySelectorAll('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])');
33
+ const firstElement = focusableElements[0];
34
+ const lastElement = focusableElements[focusableElements.length - 1];
35
+ if (focusableElements.length === 0)
36
+ return;
37
+ if (ev.shiftKey && document.activeElement === firstElement) {
38
+ ev.preventDefault();
39
+ lastElement?.focus();
40
+ }
41
+ else if (!ev.shiftKey && document.activeElement === lastElement) {
42
+ ev.preventDefault();
43
+ firstElement?.focus();
44
+ }
45
+ }
46
+ };
47
+ let previousActiveElement = null;
28
48
  return {
29
49
  id,
30
50
  role: 'dialog',
31
51
  'aria-modal': true,
32
52
  'aria-labelledby': titleId,
33
53
  'aria-describedby': descriptionId,
34
- 'aria-opened': idOpened,
35
- 'aria-disabled': isDisabled,
54
+ inert: !isOpen ? '' : undefined,
36
55
  'data-kind': DIALOG_ELEMENTS_KIND.root,
37
- ...props,
56
+ 'data-open': isOpen,
57
+ onclick: (ev) => {
58
+ // Close on backdrop click (clicking outside content)
59
+ if (ev.target === ev.currentTarget && !isDisabled) {
60
+ this.state.close();
61
+ }
62
+ },
63
+ onkeydown: (ev) => {
64
+ focusTrap(ev);
65
+ // Close on Escape key
66
+ if (ev.key === 'Escape' && !isDisabled) {
67
+ ev.preventDefault();
68
+ this.state.close();
69
+ }
70
+ },
38
71
  [createAttachmentKey()]: (node) => {
39
72
  this.elements.root = node;
73
+ if (this.state.props.open) {
74
+ // Store current focus
75
+ previousActiveElement = document.activeElement;
76
+ // Focus first focusable element or dialog itself
77
+ setTimeout(() => {
78
+ const firstFocusable = node.querySelector('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])');
79
+ if (firstFocusable) {
80
+ firstFocusable.focus();
81
+ }
82
+ else {
83
+ node.focus();
84
+ }
85
+ }, 0);
86
+ }
87
+ else {
88
+ console.log('restoring focus to', previousActiveElement);
89
+ // Restore focus to previous element
90
+ if (previousActiveElement instanceof HTMLElement) {
91
+ previousActiveElement.focus();
92
+ }
93
+ }
40
94
  }
41
95
  };
42
96
  }
@@ -44,6 +98,7 @@ export class DialogBond extends Bond {
44
98
  const id = getElementId(this.id, DIALOG_ELEMENTS_KIND.content);
45
99
  return {
46
100
  id,
101
+ role: 'document',
47
102
  'data-kind': DIALOG_ELEMENTS_KIND.content,
48
103
  ...props,
49
104
  [createAttachmentKey()]: (node) => {
@@ -55,6 +110,7 @@ export class DialogBond extends Bond {
55
110
  const id = getElementId(this.id, DIALOG_ELEMENTS_KIND.header);
56
111
  return {
57
112
  id,
113
+ role: 'banner',
58
114
  'data-kind': DIALOG_ELEMENTS_KIND.header,
59
115
  ...props,
60
116
  [createAttachmentKey()]: (node) => {
@@ -66,6 +122,8 @@ export class DialogBond extends Bond {
66
122
  const id = getElementId(this.id, DIALOG_ELEMENTS_KIND.title);
67
123
  return {
68
124
  id,
125
+ role: 'heading',
126
+ 'aria-level': 2,
69
127
  'data-kind': DIALOG_ELEMENTS_KIND.title,
70
128
  ...props,
71
129
  [createAttachmentKey()]: (node) => {
@@ -88,6 +146,8 @@ export class DialogBond extends Bond {
88
146
  const id = getElementId(this.id, DIALOG_ELEMENTS_KIND.body);
89
147
  return {
90
148
  id,
149
+ role: 'region',
150
+ 'aria-live': 'polite',
91
151
  'data-kind': DIALOG_ELEMENTS_KIND.body,
92
152
  ...props,
93
153
  [createAttachmentKey()]: (node) => {
@@ -99,6 +159,7 @@ export class DialogBond extends Bond {
99
159
  const id = getElementId(this.id, DIALOG_ELEMENTS_KIND.footer);
100
160
  return {
101
161
  id,
162
+ role: 'contentinfo',
102
163
  'data-kind': DIALOG_ELEMENTS_KIND.footer,
103
164
  ...props,
104
165
  [createAttachmentKey()]: (node) => {
@@ -1,62 +1,44 @@
1
- <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
2
- import { animate as motion } from 'motion';
3
- import { DURATION } from '../../shared';
4
- import { HtmlAtom, type Base } from '../atom';
5
- import { DialogBond } from './bond.svelte';
6
- import type { DialogContentProps } from './types';
7
-
8
- const bond = DialogBond.get();
9
-
10
- let {
11
- class: klass = '',
12
- children = undefined,
13
- onmount = undefined,
14
- ondestroy = undefined,
15
- animate = _animate,
16
- enter = undefined,
17
- exit = undefined,
18
- initial = undefined,
19
- ...restProps
20
- }: DialogContentProps<E, B> = $props();
21
-
22
- const dialogProps = $derived({
23
- ...bond?.content({}),
24
- ...restProps
25
- });
26
-
27
- const open = $derived(bond?.state?.props?.open ?? false);
28
-
29
- function _animate(node: HTMLElement) {
30
- if (open) {
31
- bond?.elements.root?.show?.();
32
- }
33
-
34
- motion(
35
- node,
36
- { scale: 0.9 + 0.1 * +open, opacity: +open },
37
- {
38
- duration: DURATION.normal / 1000,
39
- ease: 'anticipate'
40
- }
41
- );
42
- }
43
- </script>
44
-
45
- <HtmlAtom
46
- preset="dialog.content"
47
- class={[
48
- 'bg-card text-foreground border-border flex h-fit w-full max-w-[90svw] flex-col rounded-md border py-4 shadow-sm',
49
- '$preset',
50
- klass
51
- ]}
52
- {bond}
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
- {...dialogProps}
60
- >
61
- {@render children?.({ dialog: bond })}
62
- </HtmlAtom>
1
+ <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
2
+ import { HtmlAtom, type Base } from '../atom';
3
+ import { DialogBond } from './bond.svelte';
4
+ import type { DialogContentProps } from './types';
5
+ import { animateDialogContent } from './motion.svelte';
6
+
7
+ const bond = DialogBond.get();
8
+
9
+ let {
10
+ class: klass = '',
11
+ children = undefined,
12
+ onmount = undefined,
13
+ ondestroy = undefined,
14
+ animate = animateDialogContent(),
15
+ enter = undefined,
16
+ exit = undefined,
17
+ initial = undefined,
18
+ ...restProps
19
+ }: DialogContentProps<E, B> = $props();
20
+
21
+ const dialogProps = $derived({
22
+ ...bond?.content({}),
23
+ ...restProps
24
+ });
25
+ </script>
26
+
27
+ <HtmlAtom
28
+ preset="dialog.content"
29
+ class={[
30
+ 'bg-card text-foreground border-border flex h-fit w-full max-w-[90svw] flex-col rounded-md border py-4 shadow-sm',
31
+ '$preset',
32
+ klass
33
+ ]}
34
+ {bond}
35
+ enter={enter?.bind(bond.state)}
36
+ exit={exit?.bind(bond.state)}
37
+ initial={initial?.bind(bond.state)}
38
+ animate={animate?.bind(bond.state)}
39
+ onmount={onmount?.bind(bond.state)}
40
+ ondestroy={ondestroy?.bind(bond.state)}
41
+ {...dialogProps}
42
+ >
43
+ {@render children?.({ dialog: bond })}
44
+ </HtmlAtom>