@svelte-atoms/core 1.0.0-alpha.44 → 1.0.0-alpha.46

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 (178) hide show
  1. package/README.md +13 -0
  2. package/dist/components/accordion/item/accordion-item-body.svelte +5 -8
  3. package/dist/components/accordion/item/accordion-item-header.svelte +0 -13
  4. package/dist/components/accordion/item/accordion-item-indicator.svelte +0 -12
  5. package/dist/components/accordion/item/accordion-item-root.svelte +0 -12
  6. package/dist/components/alert/alert-actions.svelte +0 -12
  7. package/dist/components/alert/alert-close-button.svelte +0 -12
  8. package/dist/components/alert/alert-content.svelte +0 -12
  9. package/dist/components/alert/alert-description.svelte +0 -12
  10. package/dist/components/alert/alert-icon.svelte +0 -12
  11. package/dist/components/alert/alert-root.svelte +1 -13
  12. package/dist/components/alert/alert-title.svelte +0 -12
  13. package/dist/components/atom/html-atom.svelte +31 -17
  14. package/dist/components/atom/types.d.ts +9 -0
  15. package/dist/components/atom/utils/base.d.ts +6 -0
  16. package/dist/components/atom/utils/base.js +8 -0
  17. package/dist/components/atom/utils/cache.d.ts +17 -0
  18. package/dist/components/atom/utils/cache.js +134 -0
  19. package/dist/components/atom/utils/classes.d.ts +14 -0
  20. package/dist/components/atom/utils/classes.js +42 -0
  21. package/dist/components/atom/utils/constants.d.ts +9 -0
  22. package/dist/components/atom/utils/constants.js +9 -0
  23. package/dist/components/atom/utils/index.d.ts +6 -0
  24. package/dist/components/atom/utils/index.js +5 -0
  25. package/dist/components/atom/utils/preset.d.ts +22 -0
  26. package/dist/components/atom/utils/preset.js +94 -0
  27. package/dist/components/atom/utils/props.d.ts +13 -0
  28. package/dist/components/atom/utils/props.js +60 -0
  29. package/dist/components/atom/utils/variants.d.ts +31 -0
  30. package/dist/components/atom/utils/variants.js +270 -0
  31. package/dist/components/card/card-body.svelte +0 -12
  32. package/dist/components/card/card-description.svelte +0 -12
  33. package/dist/components/card/card-footer.svelte +0 -12
  34. package/dist/components/card/card-header.svelte +0 -12
  35. package/dist/components/card/card-media.svelte +0 -12
  36. package/dist/components/card/card-root.svelte +0 -12
  37. package/dist/components/card/card-subtitle.svelte +0 -12
  38. package/dist/components/card/card-title.svelte +0 -12
  39. package/dist/components/collapsible/collapsible-body.svelte +5 -12
  40. package/dist/components/collapsible/collapsible-header.svelte +0 -12
  41. package/dist/components/collapsible/collapsible-indicator.svelte +0 -12
  42. package/dist/components/collapsible/collapsible-root.svelte +0 -12
  43. package/dist/components/combobox/combobox-control.svelte +0 -12
  44. package/dist/components/combobox/combobox-item.svelte +0 -12
  45. package/dist/components/combobox/combobox-item.svelte.d.ts +0 -6
  46. package/dist/components/combobox/index.d.ts +1 -1
  47. package/dist/components/container/container.svelte +0 -12
  48. package/dist/components/datagrid/column/datagrid-column-sort-icon.svelte +3 -12
  49. package/dist/components/datagrid/column/datagrid-column-sort-icon.svelte.d.ts +0 -6
  50. package/dist/components/datagrid/datagrid-body.svelte +17 -1
  51. package/dist/components/dialog/dialog-body.svelte +0 -12
  52. package/dist/components/dialog/dialog-close-button.svelte +0 -12
  53. package/dist/components/dialog/dialog-close.svelte +0 -12
  54. package/dist/components/dialog/dialog-content.svelte +4 -12
  55. package/dist/components/dialog/dialog-description.svelte +0 -12
  56. package/dist/components/dialog/dialog-footer.svelte +0 -12
  57. package/dist/components/dialog/dialog-header.svelte +0 -12
  58. package/dist/components/dialog/dialog-title.svelte +0 -12
  59. package/dist/components/dialog/index.d.ts +3 -0
  60. package/dist/components/dialog/index.js +3 -0
  61. package/dist/components/drawer/drawer-backdrop.svelte +0 -12
  62. package/dist/components/drawer/drawer-body.svelte +0 -12
  63. package/dist/components/drawer/drawer-content.svelte +5 -12
  64. package/dist/components/drawer/drawer-description.svelte +0 -12
  65. package/dist/components/drawer/drawer-footer.svelte +0 -12
  66. package/dist/components/drawer/drawer-header.svelte +0 -12
  67. package/dist/components/drawer/drawer-root.svelte +5 -4
  68. package/dist/components/drawer/drawer-title.svelte +0 -12
  69. package/dist/components/dropdown/dropdown-placeholder.svelte +0 -6
  70. package/dist/components/dropdown/dropdown-placeholder.svelte.d.ts +0 -6
  71. package/dist/components/dropdown/dropdown-query.svelte +0 -12
  72. package/dist/components/dropdown-menu/bond.svelte.d.ts +0 -4
  73. package/dist/components/dropdown-menu/dropdown-menu-content.svelte +0 -12
  74. package/dist/components/dropdown-menu/dropdown-menu-content.svelte.d.ts +0 -6
  75. package/dist/components/dropdown-menu/index.d.ts +1 -1
  76. package/dist/components/form/field/bond.svelte.d.ts +29 -17
  77. package/dist/components/form/field/bond.svelte.js +73 -49
  78. package/dist/components/form/field/field-control.svelte +21 -18
  79. package/dist/components/form/field/field-label.svelte +2 -2
  80. package/dist/components/form/field/field-root.svelte +2 -1
  81. package/dist/components/index.d.ts +2 -0
  82. package/dist/components/index.js +2 -0
  83. package/dist/components/input/input-file-control.svelte +0 -12
  84. package/dist/components/input/input-icon.svelte +3 -3
  85. package/dist/components/input/input-number-control.svelte +28 -35
  86. package/dist/components/input/input-text-control.svelte +8 -3
  87. package/dist/components/input/input-url-control.svelte +2 -2
  88. package/dist/components/input/types.d.ts +4 -4
  89. package/dist/components/kbd/index.d.ts +3 -0
  90. package/dist/components/kbd/index.js +3 -0
  91. package/dist/components/kbd/kbd.svelte +19 -0
  92. package/dist/components/kbd/kbd.svelte.d.ts +4 -0
  93. package/dist/components/kbd/shortcut.svelte +38 -0
  94. package/dist/components/kbd/shortcut.svelte.d.ts +4 -0
  95. package/dist/components/kbd/types.d.ts +20 -0
  96. package/dist/components/kbd/types.js +1 -0
  97. package/dist/components/layer/layer-inner.svelte +0 -12
  98. package/dist/components/layer/layer-root.svelte +0 -12
  99. package/dist/components/menu/menu-content.svelte +0 -12
  100. package/dist/components/menu/menu-content.svelte.d.ts +0 -6
  101. package/dist/components/popover/bond.svelte.d.ts +29 -1
  102. package/dist/components/popover/bond.svelte.js +55 -2
  103. package/dist/components/popover/index.d.ts +1 -0
  104. package/dist/components/popover/index.js +1 -0
  105. package/dist/components/popover/popover-arrow.svelte +4 -2
  106. package/dist/components/popover/popover-content.svelte +17 -90
  107. package/dist/components/popover/popover-overlay.svelte +98 -0
  108. package/dist/components/popover/popover-overlay.svelte.d.ts +4 -0
  109. package/dist/components/popover/popover-trigger.svelte +9 -0
  110. package/dist/components/popover/strategies/floating.svelte +10 -10
  111. package/dist/components/popover/types.d.ts +7 -2
  112. package/dist/components/portal/portal-inner.svelte +0 -12
  113. package/dist/components/portal/portal-root.svelte +0 -12
  114. package/dist/components/portal/types.d.ts +1 -1
  115. package/dist/components/progress/index.d.ts +3 -0
  116. package/dist/components/progress/index.js +3 -0
  117. package/dist/components/progress/progress-circular.svelte +99 -0
  118. package/dist/components/progress/progress-circular.svelte.d.ts +6 -0
  119. package/dist/components/progress/progress-linear.svelte +66 -0
  120. package/dist/components/progress/progress-linear.svelte.d.ts +6 -0
  121. package/dist/components/progress/types.d.ts +18 -0
  122. package/dist/components/progress/types.js +1 -0
  123. package/dist/components/scrollable/scrollable-container.svelte +0 -12
  124. package/dist/components/scrollable/scrollable-content.svelte +0 -12
  125. package/dist/components/scrollable/scrollable-root.svelte +0 -12
  126. package/dist/components/scrollable/scrollable-thumb.svelte +1 -12
  127. package/dist/components/scrollable/scrollable-track.svelte +0 -12
  128. package/dist/components/select/bond.svelte.d.ts +0 -4
  129. package/dist/components/select/index.d.ts +1 -1
  130. package/dist/components/select/select-placeholder.svelte +0 -6
  131. package/dist/components/select/select-placeholder.svelte.d.ts +0 -6
  132. package/dist/components/sidebar/sidebar-content.svelte +5 -12
  133. package/dist/components/stack/bond.svelte.js +6 -0
  134. package/dist/components/stack/stack-item.svelte +4 -0
  135. package/dist/components/switch/switch.svelte +2 -0
  136. package/dist/components/tabs/tab/tab-header.svelte +4 -4
  137. package/dist/components/tabs/tabs-body.svelte +0 -2
  138. package/dist/components/tabs/tabs-root.svelte +11 -3
  139. package/dist/components/toast/atoms.d.ts +1 -1
  140. package/dist/components/toast/atoms.js +1 -1
  141. package/dist/components/toast/attachments.svelte.d.ts +10 -2
  142. package/dist/components/toast/attachments.svelte.js +9 -1
  143. package/dist/components/toast/bond.svelte.d.ts +73 -0
  144. package/dist/components/toast/bond.svelte.js +132 -0
  145. package/dist/components/toast/index.d.ts +1 -1
  146. package/dist/components/toast/index.js +1 -1
  147. package/dist/components/toast/toast-close.svelte +47 -0
  148. package/dist/components/toast/toast-close.svelte.d.ts +26 -0
  149. package/dist/components/toast/toast-description.svelte +16 -24
  150. package/dist/components/toast/toast-description.svelte.d.ts +15 -19
  151. package/dist/components/toast/toast-root.svelte +36 -26
  152. package/dist/components/toast/toast-root.svelte.d.ts +16 -15
  153. package/dist/components/toast/toast-title.svelte +17 -22
  154. package/dist/components/toast/toast-title.svelte.d.ts +13 -13
  155. package/dist/components/toast/toaster.svelte.d.ts +38 -0
  156. package/dist/components/toast/toaster.svelte.js +107 -0
  157. package/dist/components/toast/types.d.ts +13 -21
  158. package/dist/components/tree/tree-body.svelte +5 -12
  159. package/dist/components/tree/tree-header.svelte +0 -12
  160. package/dist/components/tree/tree-indicator.svelte +0 -12
  161. package/dist/components/tree/tree-root.svelte +0 -12
  162. package/dist/context/preset.svelte.d.ts +53 -37
  163. package/dist/context/preset.svelte.js +29 -3
  164. package/package.json +1 -1
  165. package/dist/components/atom/utils.d.ts +0 -44
  166. package/dist/components/atom/utils.js +0 -275
  167. package/dist/components/popover/popover-engine.svelte +0 -118
  168. package/dist/components/popover/popover-engine.svelte.d.ts +0 -3
  169. package/dist/components/toast/bond.d.ts +0 -35
  170. package/dist/components/toast/bond.js +0 -59
  171. package/dist/components/toast/manager.svelte.d.ts +0 -38
  172. package/dist/components/toast/manager.svelte.js +0 -82
  173. package/dist/components/toast/toast-root-managed.svelte +0 -64
  174. package/dist/components/toast/toast-root-managed.svelte.d.ts +0 -7
  175. package/dist/components/toast/toast-toaster.svelte +0 -42
  176. package/dist/components/toast/toast-toaster.svelte.d.ts +0 -4
  177. /package/dist/components/popover/{motion.d.ts → motion.svelte.d.ts} +0 -0
  178. /package/dist/components/popover/{motion.js → motion.svelte.js} +0 -0
@@ -1,38 +1,30 @@
1
- <script lang="ts" generics="T extends keyof HTMLElementTagNameMap">
2
- import type { HTMLAttributes } from 'svelte/elements';
3
- import { HtmlAtom } from '../atom';
1
+ <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base">
2
+ import { HtmlAtom, type Base } from '../atom';
3
+ import { ToastBond } from './bond.svelte';
4
4
  import type { ToastDescriptionProps } from './types';
5
- import { ToastBond } from './bond';
6
- export type { ToastDescriptionProps } from './types';
7
-
8
- const bond = ToastBond.get();
9
5
 
10
6
  let {
11
- as = 'p' as T,
12
7
  class: klass = '',
8
+ as = 'p' as E,
9
+ preset = 'toast.description',
13
10
  children = undefined,
14
- onmount = undefined,
15
- ondestroy = undefined,
16
- animate = undefined,
17
- enter = undefined,
18
- exit = undefined,
19
- initial = undefined,
20
11
  ...restProps
21
- }: ToastDescriptionProps<T> & HTMLAttributes<HTMLElementTagNameMap[T]> = $props();
12
+ }: ToastDescriptionProps<E, B> = $props();
13
+
14
+ const bond = ToastBond.get();
15
+
16
+ const descriptionProps = $derived({
17
+ ...(bond?.description().spread ?? {}),
18
+ ...restProps
19
+ });
22
20
  </script>
23
21
 
24
22
  <HtmlAtom
25
23
  {as}
26
24
  {bond}
27
- preset="toast.description"
28
- class={['border-border', '$preset', klass]}
29
- enter={enter?.bind(bond.state)}
30
- exit={exit?.bind(bond.state)}
31
- initial={initial?.bind(bond.state)}
32
- animate={animate?.bind(bond.state)}
33
- onmount={onmount?.bind(bond.state)}
34
- ondestroy={ondestroy?.bind(bond.state)}
35
- {...bond?.title(restProps)}
25
+ {preset}
26
+ class={['$preset', klass]}
27
+ {...descriptionProps}
36
28
  >
37
29
  {@render children?.({ toast: bond })}
38
30
  </HtmlAtom>
@@ -1,30 +1,26 @@
1
- import type { HTMLAttributes } from 'svelte/elements';
1
+ import { type Base } from '../atom';
2
2
  import type { ToastDescriptionProps } from './types';
3
- declare function $$render<T extends keyof HTMLElementTagNameMap>(): {
4
- props: ToastDescriptionProps<T, import("../atom").SnippetBase> & HTMLAttributes<HTMLElementTagNameMap[T]>;
5
- exports: {
6
- ToastDescriptionProps: typeof ToastDescriptionProps;
7
- };
3
+ declare function $$render<E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base>(): {
4
+ props: ToastDescriptionProps<E, B>;
5
+ exports: {};
8
6
  bindings: "";
9
7
  slots: {};
10
8
  events: {};
11
9
  };
12
- declare class __sveltets_Render<T extends keyof HTMLElementTagNameMap> {
13
- props(): ReturnType<typeof $$render<T>>['props'];
14
- events(): ReturnType<typeof $$render<T>>['events'];
15
- slots(): ReturnType<typeof $$render<T>>['slots'];
10
+ declare class __sveltets_Render<E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base> {
11
+ props(): ReturnType<typeof $$render<E, B>>['props'];
12
+ events(): ReturnType<typeof $$render<E, B>>['events'];
13
+ slots(): ReturnType<typeof $$render<E, B>>['slots'];
16
14
  bindings(): "";
17
- exports(): {
18
- ToastDescriptionProps: typeof ToastDescriptionProps;
19
- };
15
+ exports(): {};
20
16
  }
21
17
  interface $$IsomorphicComponent {
22
- new <T extends keyof HTMLElementTagNameMap>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
23
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
24
- } & ReturnType<__sveltets_Render<T>['exports']>;
25
- <T extends keyof HTMLElementTagNameMap>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
26
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
18
+ new <E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<E, B>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<E, B>['props']>, ReturnType<__sveltets_Render<E, B>['events']>, ReturnType<__sveltets_Render<E, B>['slots']>> & {
19
+ $$bindings?: ReturnType<__sveltets_Render<E, B>['bindings']>;
20
+ } & ReturnType<__sveltets_Render<E, B>['exports']>;
21
+ <E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base>(internal: unknown, props: ReturnType<__sveltets_Render<E, B>['props']> & {}): ReturnType<__sveltets_Render<E, B>['exports']>;
22
+ z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
27
23
  }
28
24
  declare const ToastDescription: $$IsomorphicComponent;
29
- type ToastDescription<T extends keyof HTMLElementTagNameMap> = InstanceType<typeof ToastDescription<T>>;
25
+ type ToastDescription<E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base> = InstanceType<typeof ToastDescription<E, B>>;
30
26
  export default ToastDescription;
@@ -1,25 +1,23 @@
1
- <script lang="ts" generics="T extends keyof HTMLElementTagNameMap">
2
- import type { HTMLAttributes } from 'svelte/elements';
3
- import { ToastBond, ToastBondState, type ToastBondProps } from './bond';
1
+ <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base">
2
+ import { HtmlAtom, type Base } from '../atom';
3
+ import { ToastBond, ToastBondState, type ToastBondProps } from './bond.svelte';
4
4
  import { defineProperty, defineState } from '../../utils';
5
- import { HtmlAtom } from '../atom';
6
5
  import type { ToastRootProps } from './types';
6
+ import { untrack } from 'svelte';
7
7
 
8
8
  let {
9
- open = $bindable(false),
10
- class: klass = '',
9
+ open = $bindable(true),
11
10
  disabled = false,
12
- extend = {},
13
- factory = _factory,
11
+ duration = 0,
12
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
13
+ dismissible: _dismissible,
14
+ class: klass = '',
15
+ preset = 'toast',
16
+ factory = defaultFactory,
14
17
  children = undefined,
15
- onmount = undefined,
16
- ondestroy = undefined,
17
- animate = undefined,
18
- enter = undefined,
19
- exit = undefined,
20
- initial = undefined,
18
+ onclose = undefined,
21
19
  ...restProps
22
- }: ToastRootProps<T> & HTMLAttributes<HTMLElementTagNameMap[T]> = $props();
20
+ }: ToastRootProps<E, B> = $props();
23
21
 
24
22
  const bondProps = defineState<ToastBondProps>(
25
23
  [
@@ -27,20 +25,37 @@
27
25
  'open',
28
26
  () => open,
29
27
  (v) => {
28
+ if (open === v) return;
30
29
  open = v;
30
+ if (!v) onclose?.();
31
31
  }
32
- )
32
+ ),
33
+ defineProperty('rest', () => restProps)
33
34
  ],
34
- () => ({ disabled, extend })
35
+ () => ({ disabled })
35
36
  );
36
37
 
37
- const bond = factory(bondProps).share();
38
+ const bond = untrack(() => factory(bondProps)).share();
38
39
 
39
- function _factory(props: typeof bondProps) {
40
+ function defaultFactory(props: ToastBondProps) {
40
41
  const bondState = new ToastBondState(() => props);
41
42
  return new ToastBond(bondState);
42
43
  }
43
44
 
45
+ const rootProps: Record<string, unknown> = $derived({
46
+ ...bond.root().spread,
47
+ ...restProps
48
+ });
49
+
50
+ // Auto-dismiss when a positive duration is provided
51
+ $effect(() => {
52
+ if (!open || duration <= 0) return;
53
+ const handle = setTimeout(() => {
54
+ open = false;
55
+ }, duration);
56
+ return () => clearTimeout(handle);
57
+ });
58
+
44
59
  export function getBond() {
45
60
  return bond;
46
61
  }
@@ -48,14 +63,9 @@
48
63
 
49
64
  <HtmlAtom
50
65
  {bond}
66
+ {preset}
51
67
  class={['border-border', '$preset', klass]}
52
- enter={enter?.bind(bond.state)}
53
- exit={exit?.bind(bond.state)}
54
- initial={initial?.bind(bond.state)}
55
- animate={animate?.bind(bond.state)}
56
- onmount={onmount?.bind(bond.state)}
57
- ondestroy={ondestroy?.bind(bond.state)}
58
- {...bond?.root(restProps)}
68
+ {...rootProps}
59
69
  >
60
70
  {@render children?.({ toast: bond })}
61
71
  </HtmlAtom>
@@ -1,30 +1,31 @@
1
- import type { HTMLAttributes } from 'svelte/elements';
1
+ import { type Base } from '../atom';
2
+ import { ToastBond, ToastBondState, type ToastBondProps } from './bond.svelte';
2
3
  import type { ToastRootProps } from './types';
3
- declare function $$render<T extends keyof HTMLElementTagNameMap>(): {
4
- props: ToastRootProps<T, import("../atom").SnippetBase> & HTMLAttributes<HTMLElementTagNameMap[T]>;
4
+ declare function $$render<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(): {
5
+ props: ToastRootProps<E, B>;
5
6
  exports: {
6
- getBond: () => any;
7
+ getBond: () => ToastBond<ToastBondState<ToastBondProps>>;
7
8
  };
8
9
  bindings: "open";
9
10
  slots: {};
10
11
  events: {};
11
12
  };
12
- declare class __sveltets_Render<T extends keyof HTMLElementTagNameMap> {
13
- props(): ReturnType<typeof $$render<T>>['props'];
14
- events(): ReturnType<typeof $$render<T>>['events'];
15
- slots(): ReturnType<typeof $$render<T>>['slots'];
13
+ declare class __sveltets_Render<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> {
14
+ props(): ReturnType<typeof $$render<E, B>>['props'];
15
+ events(): ReturnType<typeof $$render<E, B>>['events'];
16
+ slots(): ReturnType<typeof $$render<E, B>>['slots'];
16
17
  bindings(): "open";
17
18
  exports(): {
18
- getBond: () => any;
19
+ getBond: () => ToastBond<ToastBondState<ToastBondProps>>;
19
20
  };
20
21
  }
21
22
  interface $$IsomorphicComponent {
22
- new <T extends keyof HTMLElementTagNameMap>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
23
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
24
- } & ReturnType<__sveltets_Render<T>['exports']>;
25
- <T extends keyof HTMLElementTagNameMap>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
26
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
23
+ new <E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<E, B>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<E, B>['props']>, ReturnType<__sveltets_Render<E, B>['events']>, ReturnType<__sveltets_Render<E, B>['slots']>> & {
24
+ $$bindings?: ReturnType<__sveltets_Render<E, B>['bindings']>;
25
+ } & ReturnType<__sveltets_Render<E, B>['exports']>;
26
+ <E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base>(internal: unknown, props: ReturnType<__sveltets_Render<E, B>['props']> & {}): ReturnType<__sveltets_Render<E, B>['exports']>;
27
+ z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
27
28
  }
28
29
  declare const ToastRoot: $$IsomorphicComponent;
29
- type ToastRoot<T extends keyof HTMLElementTagNameMap> = InstanceType<typeof ToastRoot<T>>;
30
+ type ToastRoot<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> = InstanceType<typeof ToastRoot<E, B>>;
30
31
  export default ToastRoot;
@@ -1,35 +1,30 @@
1
- <script lang="ts" generics="T extends keyof HTMLElementTagNameMap">
2
- import type { HTMLAttributes } from 'svelte/elements';
3
- import { HtmlAtom } from '../atom';
4
- import { ToastBond } from './bond';
1
+ <script lang="ts" generics="E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base">
2
+ import { HtmlAtom, type Base } from '../atom';
3
+ import { ToastBond } from './bond.svelte';
5
4
  import type { ToastTitleProps } from './types';
6
5
 
7
- const bond = ToastBond.get();
8
-
9
6
  let {
10
7
  class: klass = '',
8
+ as = 'p' as E,
9
+ preset = 'toast.title',
11
10
  children = undefined,
12
- onmount = undefined,
13
- ondestroy = undefined,
14
- animate = undefined,
15
- enter = undefined,
16
- exit = undefined,
17
- initial = undefined,
18
11
  ...restProps
19
- }: ToastTitleProps<T> & HTMLAttributes<HTMLElementTagNameMap[T]> = $props();
12
+ }: ToastTitleProps<E, B> = $props();
13
+
14
+ const bond = ToastBond.get();
15
+
16
+ const titleProps = $derived({
17
+ ...(bond?.title().spread ?? {}),
18
+ ...restProps
19
+ });
20
20
  </script>
21
21
 
22
22
  <HtmlAtom
23
+ {as}
23
24
  {bond}
24
- preset="toast.title"
25
- class={['border-border', '$preset', klass]}
26
- enter={enter?.bind(bond.state)}
27
- exit={exit?.bind(bond.state)}
28
- initial={initial?.bind(bond.state)}
29
- animate={animate?.bind(bond.state)}
30
- onmount={onmount?.bind(bond.state)}
31
- ondestroy={ondestroy?.bind(bond.state)}
32
- {...bond?.title(restProps)}
25
+ {preset}
26
+ class={['$preset', klass]}
27
+ {...titleProps}
33
28
  >
34
29
  {@render children?.({ toast: bond })}
35
30
  </HtmlAtom>
@@ -1,26 +1,26 @@
1
- import type { HTMLAttributes } from 'svelte/elements';
1
+ import { type Base } from '../atom';
2
2
  import type { ToastTitleProps } from './types';
3
- declare function $$render<T extends keyof HTMLElementTagNameMap>(): {
4
- props: ToastTitleProps<T, import("../atom").SnippetBase> & HTMLAttributes<HTMLElementTagNameMap[T]>;
3
+ declare function $$render<E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base>(): {
4
+ props: ToastTitleProps<E, B>;
5
5
  exports: {};
6
6
  bindings: "";
7
7
  slots: {};
8
8
  events: {};
9
9
  };
10
- declare class __sveltets_Render<T extends keyof HTMLElementTagNameMap> {
11
- props(): ReturnType<typeof $$render<T>>['props'];
12
- events(): ReturnType<typeof $$render<T>>['events'];
13
- slots(): ReturnType<typeof $$render<T>>['slots'];
10
+ declare class __sveltets_Render<E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base> {
11
+ props(): ReturnType<typeof $$render<E, B>>['props'];
12
+ events(): ReturnType<typeof $$render<E, B>>['events'];
13
+ slots(): ReturnType<typeof $$render<E, B>>['slots'];
14
14
  bindings(): "";
15
15
  exports(): {};
16
16
  }
17
17
  interface $$IsomorphicComponent {
18
- new <T extends keyof HTMLElementTagNameMap>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
19
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
20
- } & ReturnType<__sveltets_Render<T>['exports']>;
21
- <T extends keyof HTMLElementTagNameMap>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
22
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
18
+ new <E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<E, B>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<E, B>['props']>, ReturnType<__sveltets_Render<E, B>['events']>, ReturnType<__sveltets_Render<E, B>['slots']>> & {
19
+ $$bindings?: ReturnType<__sveltets_Render<E, B>['bindings']>;
20
+ } & ReturnType<__sveltets_Render<E, B>['exports']>;
21
+ <E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base>(internal: unknown, props: ReturnType<__sveltets_Render<E, B>['props']> & {}): ReturnType<__sveltets_Render<E, B>['exports']>;
22
+ z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
23
23
  }
24
24
  declare const ToastTitle: $$IsomorphicComponent;
25
- type ToastTitle<T extends keyof HTMLElementTagNameMap> = InstanceType<typeof ToastTitle<T>>;
25
+ type ToastTitle<E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base> = InstanceType<typeof ToastTitle<E, B>>;
26
26
  export default ToastTitle;
@@ -0,0 +1,38 @@
1
+ import { type Component } from 'svelte';
2
+ export type ToastType = 'info' | 'success' | 'error' | 'warning' | 'default';
3
+ export interface ToastItem<T = unknown> {
4
+ id: string;
5
+ type: ToastType;
6
+ duration: number;
7
+ dismissible: boolean;
8
+ component?: Component<{
9
+ item: ToastItem<T>;
10
+ }> | undefined;
11
+ data?: T | undefined;
12
+ }
13
+ export interface ToastOptions<T = unknown> {
14
+ id?: string;
15
+ duration?: number;
16
+ dismissible?: boolean;
17
+ /** Arbitrary payload accessible from a custom toast component via `item.data`. */
18
+ data?: T;
19
+ /** Custom component to render in place of the default toast layout. Receives `{ item }`. */
20
+ component?: Component<{
21
+ item: ToastItem<T>;
22
+ }>;
23
+ }
24
+ export declare class Toaster {
25
+ #private;
26
+ get toasts(): ToastItem[];
27
+ add<T = unknown>(type?: ToastType, options?: ToastOptions<T>): string;
28
+ dismiss(...ids: string[]): void;
29
+ /** Pause auto-dismiss timer (e.g. on pointerenter). */
30
+ pause(...ids: string[]): void;
31
+ /** Resume previously paused auto-dismiss timer. */
32
+ resume(...ids: string[]): void;
33
+ remove(...ids: string[]): void;
34
+ clear(): void;
35
+ share(): Toaster;
36
+ static get: () => Toaster;
37
+ static set: (context: Toaster) => Toaster;
38
+ }
@@ -0,0 +1,107 @@
1
+ import { createContext } from 'svelte';
2
+ import { nanoid } from 'nanoid';
3
+ import { SvelteMap } from 'svelte/reactivity';
4
+ const DEFAULT_DURATION = 4000;
5
+ const [get, set] = createContext();
6
+ export class Toaster {
7
+ #toasts = new SvelteMap();
8
+ #toastsArray = $derived([...this.#toasts.values()]);
9
+ // eslint-disable-next-line svelte/prefer-svelte-reactivity
10
+ #timers = new Map();
11
+ get toasts() {
12
+ return this.#toastsArray;
13
+ }
14
+ add(type = 'default', options = {}) {
15
+ const id = options.id ?? nanoid(8);
16
+ // If a toast with this id already exists, update it in place
17
+ const existing = this.#toasts.get(id);
18
+ if (existing) {
19
+ existing.type = type;
20
+ if (options.dismissible !== undefined)
21
+ existing.dismissible = options.dismissible;
22
+ if (options.data !== undefined)
23
+ existing.data = options.data;
24
+ if (options.component !== undefined)
25
+ existing.component = options.component;
26
+ if (options.duration !== undefined) {
27
+ existing.duration = options.duration;
28
+ if (options.duration > 0)
29
+ this.#startTimer(id, options.duration);
30
+ else
31
+ this.#clearTimer(id);
32
+ }
33
+ // Re-open if it was in the middle of closing
34
+ // if (!existing.bond.state.isOpen) existing.bond.state.open();
35
+ return id;
36
+ }
37
+ const duration = options.duration ?? DEFAULT_DURATION;
38
+ const dismissible = options.dismissible ?? true;
39
+ const item = {
40
+ id,
41
+ type,
42
+ duration,
43
+ dismissible,
44
+ data: options.data,
45
+ component: options.component
46
+ };
47
+ this.#toasts.set(id, item);
48
+ if (duration > 0)
49
+ this.#startTimer(id, duration);
50
+ return id;
51
+ }
52
+ dismiss(...ids) {
53
+ for (const id of ids) {
54
+ this.#clearTimer(id);
55
+ this.#toasts.delete(id);
56
+ }
57
+ }
58
+ /** Pause auto-dismiss timer (e.g. on pointerenter). */
59
+ pause(...ids) {
60
+ for (const id of ids) {
61
+ const t = this.#timers.get(id);
62
+ if (!t || t.handle === null)
63
+ continue;
64
+ clearTimeout(t.handle);
65
+ const elapsed = Date.now() - t.start;
66
+ t.remaining = Math.max(0, t.remaining - elapsed);
67
+ t.handle = null;
68
+ }
69
+ }
70
+ /** Resume previously paused auto-dismiss timer. */
71
+ resume(...ids) {
72
+ for (const id of ids) {
73
+ const t = this.#timers.get(id);
74
+ if (!t || t.handle !== null || t.remaining <= 0)
75
+ continue;
76
+ t.start = Date.now();
77
+ t.handle = setTimeout(() => this.dismiss(id), t.remaining);
78
+ }
79
+ }
80
+ remove(...ids) {
81
+ for (const id of ids) {
82
+ this.#clearTimer(id);
83
+ this.#toasts.delete(id);
84
+ }
85
+ }
86
+ clear() {
87
+ for (const id of [...this.#timers.keys()])
88
+ this.#clearTimer(id);
89
+ this.#toasts.clear();
90
+ }
91
+ #startTimer(id, ms) {
92
+ this.#clearTimer(id);
93
+ const handle = setTimeout(() => this.dismiss(id), ms);
94
+ this.#timers.set(id, { handle, start: Date.now(), remaining: ms });
95
+ }
96
+ #clearTimer(id) {
97
+ const t = this.#timers.get(id);
98
+ if (t?.handle != null)
99
+ clearTimeout(t.handle);
100
+ this.#timers.delete(id);
101
+ }
102
+ share() {
103
+ return Toaster.set(this);
104
+ }
105
+ static get = get;
106
+ static set = set;
107
+ }
@@ -1,31 +1,23 @@
1
1
  import type { Snippet } from 'svelte';
2
- import type { HtmlAtomProps, Base, SnippetProps } from '../atom';
3
- import type { Override } from '../../types';
4
- import type { ToastBond } from './bond';
5
- import type { ToastPosition } from './manager.svelte';
6
- export interface ToastSnippetProps extends SnippetProps {
2
+ import type { HtmlAtomProps, Base } from '../atom';
3
+ import type { ToastBond, ToastBondProps } from './bond.svelte';
4
+ export interface ToastSnippetProps {
7
5
  toast: ToastBond | undefined;
8
6
  }
9
7
  export type ToastChildren = Snippet<[ToastSnippetProps]>;
10
- export interface ToastRootProps<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> extends Override<HtmlAtomProps<E, B, ToastChildren>, {
11
- children?: ToastChildren;
12
- }> {
8
+ export interface ToastRootProps<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> extends HtmlAtomProps<E, B, ToastChildren> {
9
+ open?: boolean;
10
+ disabled?: boolean;
13
11
  dismissible?: boolean;
14
- /** Auto-dismiss duration in ms. Set to 0 to disable auto-dismiss. Default: 4000 */
12
+ /** Auto-dismiss duration in ms. Set to 0 to disable auto-dismiss. Default: 0. */
15
13
  duration?: number;
16
- onclose?: () => void | undefined;
14
+ onclose?: () => void;
15
+ /** Optional factory to construct a custom bond. */
16
+ factory?: (props: ToastBondProps) => ToastBond;
17
17
  }
18
- export interface ToastTitleProps<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> extends Override<HtmlAtomProps<E, B, ToastChildren>, {
19
- children?: ToastChildren;
20
- }> {
18
+ export interface ToastTitleProps<E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base> extends HtmlAtomProps<E, B, ToastChildren> {
21
19
  }
22
- export interface ToastDescriptionProps<E extends keyof HTMLElementTagNameMap = 'div', B extends Base = Base> extends Override<HtmlAtomProps<E, B, ToastChildren>, {
23
- children?: ToastChildren;
24
- }> {
20
+ export interface ToastDescriptionProps<E extends keyof HTMLElementTagNameMap = 'p', B extends Base = Base> extends HtmlAtomProps<E, B, ToastChildren> {
25
21
  }
26
- export interface ToasterProps extends HtmlAtomProps<'ol'> {
27
- /** Position of the toast stack on screen. Default: 'bottom-right' */
28
- position?: ToastPosition | undefined;
29
- /** Gap between toasts in px. Default: 8 */
30
- gap?: number | undefined;
22
+ export interface ToastCloseProps<E extends keyof HTMLElementTagNameMap = 'button', B extends Base = Base> extends HtmlAtomProps<E, B, ToastChildren> {
31
23
  }
@@ -9,12 +9,10 @@
9
9
  let {
10
10
  class: klass = '',
11
11
  children = undefined,
12
- onmount = undefined,
13
- ondestroy = undefined,
14
- animate = animateTreeBody(),
15
- enter = undefined,
16
- exit = undefined,
17
- initial = animateTreeBody({ duration: 0 }),
12
+ fallback = {
13
+ animate: animateTreeBody(),
14
+ initial: animateTreeBody({ duration: 0 })
15
+ },
18
16
  ...restProps
19
17
  }: TreeBodyProps<E, B> = $props();
20
18
 
@@ -28,12 +26,7 @@
28
26
  {bond}
29
27
  preset="tree.body"
30
28
  class={['border-border pl-4', '$preset', klass]}
31
- onmount={onmount?.bind(bond.state)}
32
- ondestroy={ondestroy?.bind(bond.state)}
33
- animate={animate?.bind(bond.state)}
34
- enter={enter?.bind(bond.state)}
35
- exit={exit?.bind(bond.state)}
36
- initial={initial?.bind(bond.state)}
29
+ {fallback}
37
30
  {...bodyProps}
38
31
  >
39
32
  {@render children?.({ tree: bond })}
@@ -12,12 +12,6 @@
12
12
  class: klass = '',
13
13
  children = undefined,
14
14
  onpointerdown = undefined,
15
- onmount = undefined,
16
- ondestroy = undefined,
17
- animate = undefined,
18
- enter = undefined,
19
- exit = undefined,
20
- initial = undefined,
21
15
  ...restProps
22
16
  }: TreeHeaderProps<E, B> & HTMLAttributes<Element> = $props();
23
17
 
@@ -41,12 +35,6 @@
41
35
  {bond}
42
36
  preset="tree.header"
43
37
  class={['border-border cursor-pointer', '$preset', klass]}
44
- onmount={onmount?.bind(bond.state)}
45
- ondestroy={ondestroy?.bind(bond.state)}
46
- animate={animate?.bind(bond.state)}
47
- enter={enter?.bind(bond.state)}
48
- exit={exit?.bind(bond.state)}
49
- initial={initial?.bind(bond.state)}
50
38
  onpointerdown={handlePointerDown}
51
39
  {...headerProps}
52
40
  >
@@ -9,12 +9,6 @@
9
9
  open = $bindable(false),
10
10
  class: klass = '',
11
11
  children = undefined,
12
- onmount = undefined,
13
- ondestroy = undefined,
14
- animate = undefined,
15
- enter = undefined,
16
- exit = undefined,
17
- initial = undefined,
18
12
  ...restProps
19
13
  }: TreeIndicatorProps<E, B> = $props();
20
14
 
@@ -28,12 +22,6 @@
28
22
  {bond}
29
23
  preset="tree.indicator"
30
24
  class={['border-border aspect-square h-fit', '$preset', klass]}
31
- onmount={onmount?.bind(bond.state)}
32
- ondestroy={ondestroy?.bind(bond.state)}
33
- animate={animate?.bind(bond.state)}
34
- enter={enter?.bind(bond.state)}
35
- exit={exit?.bind(bond.state)}
36
- initial={initial?.bind(bond.state)}
37
25
  {...indicatorProps}
38
26
  >
39
27
  {@render children?.({ tree: bond })}
@@ -10,12 +10,6 @@
10
10
  class: klass = '',
11
11
  children = undefined,
12
12
  factory = _factory,
13
- onmount = undefined,
14
- ondestroy = undefined,
15
- animate = undefined,
16
- enter = undefined,
17
- exit = undefined,
18
- initial = undefined,
19
13
  ...restProps
20
14
  }: TreeRootProps<E, B> = $props();
21
15
 
@@ -54,12 +48,6 @@
54
48
  {bond}
55
49
  preset="tree"
56
50
  class={['border-border flex flex-col', '$preset', klass]}
57
- onmount={onmount?.bind(bond.state)}
58
- ondestroy={ondestroy?.bind(bond.state)}
59
- animate={animate?.bind(bond.state)}
60
- enter={enter?.bind(bond.state)}
61
- exit={exit?.bind(bond.state)}
62
- initial={initial?.bind(bond.state)}
63
51
  {...rootProps}
64
52
  >
65
53
  {@render children?.({ tree: bond })}