@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,6 +1,5 @@
1
1
  <script lang="ts">
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
- import { HtmlAtom } from '../atom';
4
3
  import { InputBond } from './bond.svelte';
5
4
  import type { InputNumberControlProps } from './types';
6
5
 
@@ -8,7 +7,7 @@
8
7
 
9
8
  let {
10
9
  class: klass = '',
11
- number = $bindable(),
10
+ number = $bindable(0),
12
11
  min = undefined,
13
12
  max = undefined,
14
13
  step = 1,
@@ -16,8 +15,8 @@
16
15
  disabled = false,
17
16
  placeholder = undefined,
18
17
  preset = 'input.number',
19
- decrementContent = undefined,
20
- incrementContent = undefined,
18
+ decrement = undefined,
19
+ increment = undefined,
21
20
  onchange = undefined,
22
21
  ...restProps
23
22
  }: InputNumberControlProps & HTMLAttributes<HTMLDivElement> = $props();
@@ -27,17 +26,17 @@
27
26
  const canDecrement = $derived(!disabled && (min === undefined || numberValue - step >= min));
28
27
  const canIncrement = $derived(!disabled && (max === undefined || numberValue + step <= max));
29
28
 
30
- const decrementSnippet = $derived(showControls ? (decrementContent ?? defaultDecrement) : undefined);
31
- const incrementSnippet = $derived(showControls ? (incrementContent ?? defaultIncrement) : undefined);
29
+ const decrementSnippet = $derived(showControls ? (decrement ?? defaultDecrement) : undefined);
30
+ const incrementSnippet = $derived(showControls ? (increment ?? defaultIncrement) : undefined);
32
31
 
33
- function decrement() {
32
+ function handleDecrement() {
34
33
  if (!canDecrement) return;
35
34
  number = parseFloat((number - step).toPrecision(10));
36
35
  onchange?.(undefined, { number });
37
36
  bond?.state?.props && (bond.state.props.value = number);
38
37
  }
39
38
 
40
- function increment() {
39
+ function handleIncrement() {
41
40
  if (!canIncrement) return;
42
41
  number = parseFloat((number + step).toPrecision(10));
43
42
  onchange?.(undefined, { number });
@@ -57,13 +56,13 @@
57
56
 
58
57
  <!-- ─── Default part snippets ──────────────────────────────────────────── -->
59
58
 
60
- {#snippet defaultDecrement({ decrement: dec, disabled: dis }: { decrement: () => void; disabled: boolean })}
59
+ {#snippet defaultDecrement({ action: dec, disabled: dis }: { action: () => void; disabled: boolean })}
61
60
  <button
62
61
  type="button"
63
62
  onclick={dec}
64
63
  disabled={dis}
65
64
  aria-label="Decrement"
66
- class="input-number-decrement text-foreground hover:bg-muted disabled:text-muted-foreground flex h-full w-8 shrink-0 cursor-pointer items-center justify-center transition-colors disabled:cursor-not-allowed"
65
+ class="input-number-decrement text-foreground hover:bg-muted disabled:text-muted-foreground flex h-full aspect-square shrink-0 cursor-pointer items-center justify-center transition-colors disabled:cursor-not-allowed"
67
66
  >
68
67
  <svg viewBox="0 0 16 16" fill="none" class="h-3 w-3" aria-hidden="true">
69
68
  <path d="M3 8h10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
@@ -71,13 +70,13 @@
71
70
  </button>
72
71
  {/snippet}
73
72
 
74
- {#snippet defaultIncrement({ increment: inc, disabled: dis }: { increment: () => void; disabled: boolean })}
73
+ {#snippet defaultIncrement({ action: inc, disabled: dis }: { action: () => void; disabled: boolean })}
75
74
  <button
76
75
  type="button"
77
76
  onclick={inc}
78
77
  disabled={dis}
79
78
  aria-label="Increment"
80
- class="input-number-increment text-foreground hover:bg-muted disabled:text-muted-foreground flex h-full w-8 shrink-0 cursor-pointer items-center justify-center transition-colors disabled:cursor-not-allowed"
79
+ class="input-number-increment text-foreground hover:bg-muted disabled:text-muted-foreground flex h-full aspect-square shrink-0 cursor-pointer items-center justify-center transition-colors disabled:cursor-not-allowed"
81
80
  >
82
81
  <svg viewBox="0 0 16 16" fill="none" class="h-3 w-3" aria-hidden="true">
83
82
  <path d="M8 3v10M3 8h10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
@@ -87,28 +86,22 @@
87
86
 
88
87
  <!-- ─── Render ────────────────────────────────────────────────────────── -->
89
88
 
90
- <HtmlAtom
91
- {preset}
92
- as="div"
93
- class={['input-number-root flex h-full w-full items-center', '$preset', klass]}
94
- {...restProps}
95
- >
96
- {@render decrementSnippet?.({ decrement, disabled: !canDecrement })}
89
+ {@render decrementSnippet?.({ action: handleDecrement, disabled: !canDecrement })}
97
90
 
98
- <input
99
- type="number"
100
- bind:value={number}
101
- {min}
102
- {max}
103
- {step}
104
- {disabled}
105
- {placeholder}
106
- oninput={handleInput}
107
- class="input-number-field text-foreground placeholder:text-muted-foreground h-full w-full flex-1 bg-transparent text-center text-sm outline-none [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none"
108
- aria-valuemin={min}
109
- aria-valuemax={max}
110
- aria-valuenow={number}
111
- />
91
+ <input
92
+ type="number"
93
+ bind:value={number}
94
+ {min}
95
+ {max}
96
+ {step}
97
+ {disabled}
98
+ {placeholder}
99
+ oninput={handleInput}
100
+ class={["input-number-field text-foreground placeholder:text-muted-foreground h-full w-full flex-1 bg-transparent text-center text-sm outline-none [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none", '$preset', klass]}
101
+ aria-valuemin={min}
102
+ aria-valuemax={max}
103
+ aria-valuenow={number}
104
+ {...restProps}
105
+ />
112
106
 
113
- {@render incrementSnippet?.({ increment, disabled: !canIncrement })}
114
- </HtmlAtom>
107
+ {@render incrementSnippet?.({ action: handleIncrement, disabled: !canIncrement })}
@@ -11,7 +11,6 @@
11
11
 
12
12
  let {
13
13
  value = $bindable(),
14
- type = 'text',
15
14
  class: klass = '',
16
15
  placeholder = '',
17
16
  disabled = false,
@@ -31,8 +30,14 @@
31
30
  function handleInput(ev: Event) {
32
31
  const input = ev.currentTarget as HTMLInputElement;
33
32
  value = input.value;
34
- if (bond) bond.state.props.value = value;
33
+
35
34
  oninput?.(ev, { value });
35
+
36
+ if(ev.defaultPrevented) {
37
+ return;
38
+ }
39
+
40
+ if (bond) bond.state.props.value = value;
36
41
  }
37
42
  </script>
38
43
 
@@ -44,7 +49,7 @@
44
49
  if (bond) bond.state.props.value = v;
45
50
  }
46
51
  }
47
- type={type}
52
+ type='text'
48
53
  {placeholder}
49
54
  {disabled}
50
55
  {readonly}
@@ -12,7 +12,7 @@
12
12
  let {
13
13
  class: klass = '',
14
14
  value = $bindable(),
15
- placeholder = 'example.com/path',
15
+ placeholder = '',
16
16
  disabled = false,
17
17
  readonly = false,
18
18
  preset: presetKey = 'input.url',
@@ -186,7 +186,7 @@
186
186
  <!-- Offset to match input scroll position -->
187
187
  <span style="transform: translateX(-{scrollLeft}px)">
188
188
  {#if segments.length}
189
- {#each segments as seg}
189
+ {#each segments as seg (seg)}
190
190
  <span style={kindStyle[seg.kind]}>{seg.text}</span>
191
191
  {/each}
192
192
  {:else}
@@ -50,13 +50,13 @@ export interface InputNumberControlProps {
50
50
  placeholder?: string;
51
51
  showControls?: boolean;
52
52
  /** Custom decrement button snippet */
53
- decrementContent?: Snippet<[{
54
- decrement: () => void;
53
+ decrement?: Snippet<[{
54
+ action: () => void;
55
55
  disabled: boolean;
56
56
  }]>;
57
57
  /** Custom increment button snippet */
58
- incrementContent?: Snippet<[{
59
- increment: () => void;
58
+ increment?: Snippet<[{
59
+ action: () => void;
60
60
  disabled: boolean;
61
61
  }]>;
62
62
  onchange?: (ev?: Event, options?: {
@@ -0,0 +1,3 @@
1
+ export { default as Kbd } from './kbd.svelte';
2
+ export { default as Shortcut } from './shortcut.svelte';
3
+ export * from './types';
@@ -0,0 +1,3 @@
1
+ export { default as Kbd } from './kbd.svelte';
2
+ export { default as Shortcut } from './shortcut.svelte';
3
+ export * from './types';
@@ -0,0 +1,19 @@
1
+ <script lang="ts">
2
+ import { HtmlAtom } from '../atom';
3
+ import type { KbdProps } from './types';
4
+
5
+ let { class: klass = '', children, ...restProps }: KbdProps = $props();
6
+ </script>
7
+
8
+ <HtmlAtom
9
+ preset="kbd"
10
+ as="kbd"
11
+ class={[
12
+ 'kbd border-border bg-muted text-foreground inline-flex items-center justify-center rounded-md border px-1.5 py-0.5 font-mono text-xs font-medium shadow-[inset_0_-1px_0] shadow-black/10',
13
+ '$preset',
14
+ klass
15
+ ]}
16
+ {...restProps}
17
+ >
18
+ {@render children?.()}
19
+ </HtmlAtom>
@@ -0,0 +1,4 @@
1
+ import type { KbdProps } from './types';
2
+ declare const Kbd: import("svelte").Component<KbdProps, {}, "">;
3
+ type Kbd = ReturnType<typeof Kbd>;
4
+ export default Kbd;
@@ -0,0 +1,38 @@
1
+ <script lang="ts">
2
+ import { HtmlAtom } from '../atom';
3
+ import Kbd from './kbd.svelte';
4
+ import type { ShortcutProps } from './types';
5
+
6
+ let {
7
+ class: klass = '',
8
+ keys = [],
9
+ separator = '+',
10
+ children,
11
+ ...restProps
12
+ }: ShortcutProps = $props();
13
+
14
+ let content = $derived(children ?? defaultChildren)
15
+ </script>
16
+
17
+ {#snippet separatorContent()}
18
+ <span class="text-muted-foreground text-xs">{separator}</span>
19
+ {/snippet}
20
+
21
+ {#snippet defaultChildren()}
22
+ {#each keys as key, i ( key )}
23
+ {@const content = i > 0 ? separatorContent : null}
24
+
25
+ {@render content?.()}
26
+ <Kbd>{key}</Kbd>
27
+ {/each}
28
+ {/snippet}
29
+
30
+ <HtmlAtom
31
+ preset="shortcut"
32
+ as="span"
33
+ class={['shortcut inline-flex items-center gap-1', '$preset', klass]}
34
+ aria-label={keys.join(' ' + separator + ' ')}
35
+ {...restProps}
36
+ >
37
+ {@render content()}
38
+ </HtmlAtom>
@@ -0,0 +1,4 @@
1
+ import type { ShortcutProps } from './types';
2
+ declare const Shortcut: import("svelte").Component<ShortcutProps, {}, "">;
3
+ type Shortcut = ReturnType<typeof Shortcut>;
4
+ export default Shortcut;
@@ -0,0 +1,20 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HtmlAtomProps } from '../atom';
3
+ export interface KbdExtendProps {
4
+ }
5
+ export interface ShortcutExtendProps {
6
+ }
7
+ export interface KbdProps extends HtmlAtomProps<'kbd'>, KbdExtendProps {
8
+ children?: Snippet<[]>;
9
+ }
10
+ export interface ShortcutProps extends HtmlAtomProps<'span'>, ShortcutExtendProps {
11
+ /**
12
+ * Array of keys to render in sequence, e.g. ['⌘', 'K'] or ['Ctrl', 'Shift', 'P']
13
+ */
14
+ keys?: string[];
15
+ /**
16
+ * Separator between keys — default '+'
17
+ */
18
+ separator?: string;
19
+ children?: Snippet<[]>;
20
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -15,12 +15,6 @@
15
15
  let {
16
16
  class: klass = '',
17
17
  children = undefined,
18
- onmount = undefined,
19
- ondestroy = undefined,
20
- animate = undefined,
21
- enter = undefined,
22
- exit = undefined,
23
- initial = undefined,
24
18
  ...restProps
25
19
  }: HtmlAtomProps<E, B> & HTMLAttributes<Element> = $props();
26
20
 
@@ -33,12 +27,6 @@
33
27
  <HtmlAtom
34
28
  preset="layer.inner"
35
29
  class={['relative size-full', '$preset', klass]}
36
- enter={enter?.bind(bond.state)}
37
- exit={exit?.bind(bond.state)}
38
- initial={initial?.bind(bond.state)}
39
- animate={animate?.bind(bond.state)}
40
- onmount={onmount?.bind(bond.state)}
41
- ondestroy={ondestroy?.bind(bond.state)}
42
30
  {...innerProps}
43
31
  >
44
32
  {@render children?.()}
@@ -18,12 +18,6 @@
18
18
  class: klass = '',
19
19
  factory = _factory,
20
20
  children = undefined,
21
- onmount = undefined,
22
- ondestroy = undefined,
23
- animate = undefined,
24
- enter = undefined,
25
- exit = undefined,
26
- initial = undefined,
27
21
  ...restProps
28
22
  }: HtmlAtomProps<E, B> & HTMLAttributes<Element> = $props();
29
23
 
@@ -53,12 +47,6 @@
53
47
  <HtmlAtom
54
48
  preset="layer"
55
49
  class={['pointer-events-none absolute inset-0', '$preset', klass]}
56
- enter={enter?.bind(bond.state)}
57
- exit={exit?.bind(bond.state)}
58
- initial={initial?.bind(bond.state)}
59
- animate={animate?.bind(bond.state)}
60
- onmount={onmount?.bind(bond.state)}
61
- ondestroy={ondestroy?.bind(bond.state)}
62
50
  {...rootProps}
63
51
  >
64
52
  {@render children?.()}
@@ -12,12 +12,6 @@
12
12
  base = Root as B,
13
13
  preset = 'menu.content',
14
14
  children = undefined,
15
- onmount = undefined,
16
- ondestroy = undefined,
17
- animate = undefined,
18
- enter = undefined,
19
- exit = undefined,
20
- initial = undefined,
21
15
  ...restProps
22
16
  } = $props();
23
17
  </script>
@@ -28,12 +22,6 @@
28
22
  {bond}
29
23
  {preset}
30
24
  class={['border-border overflow-hidden p-0', '$preset', klass]}
31
- onmount={onmount?.bind(bond.state)}
32
- ondestroy={ondestroy?.bind(bond.state)}
33
- enter={enter?.bind(bond.state)}
34
- exit={exit?.bind(bond.state)}
35
- initial={initial?.bind(bond.state)}
36
- animate={animate?.bind(bond.state)}
37
25
  {...restProps}
38
26
  >
39
27
  {@render children?.()}
@@ -6,12 +6,6 @@ declare function $$render<T extends keyof HTMLElementTagNameMap = 'div', B exten
6
6
  base?: B;
7
7
  preset?: string;
8
8
  children?: any;
9
- onmount?: any;
10
- ondestroy?: any;
11
- animate?: any;
12
- enter?: any;
13
- exit?: any;
14
- initial?: any;
15
9
  } & Record<string, any>;
16
10
  exports: {};
17
11
  bindings: "";
@@ -39,6 +39,7 @@ export type TriggerParams = {
39
39
  export type PopoverDomElements = {
40
40
  trigger: HTMLElement;
41
41
  'virtual-trigger'?: BondVirtualElement;
42
+ overlay: HTMLElement;
42
43
  content: HTMLElement;
43
44
  indicator: HTMLElement;
44
45
  arrow: HTMLElement;
@@ -51,6 +52,8 @@ export declare class PopoverBond<Props extends PopoverStateProps = PopoverStateP
51
52
  /** Handle for granular access to the virtual trigger reference */
52
53
  virtualTrigger(): PopoverVirtualTriggerAtom;
53
54
  /** Handle for granular access to content attrs, handlers, and attachment */
55
+ overlay(): PopoverOverlayAtom;
56
+ /** Handle for granular access to content attrs, handlers, and attachment */
54
57
  content(): PopoverContentAtom;
55
58
  /** Handle for granular access to arrow attrs and attachment */
56
59
  arrow(): PopoverArrowAtom;
@@ -61,8 +64,25 @@ export declare class PopoverBond<Props extends PopoverStateProps = PopoverStateP
61
64
  static set(bond: PopoverBond): PopoverBond<PopoverStateProps, PopoverState<PopoverStateProps>, PopoverDomElements>;
62
65
  }
63
66
  export declare class PopoverState<Props extends PopoverStateProps = PopoverStateProps> extends BondState<Props> {
67
+ #private;
64
68
  position: ComputePositionReturn | undefined;
69
+ /**
70
+ * Controls whether the positioning strategy should actively compute the
71
+ * popover position. Defaults to `open` when unset, but can be toggled
72
+ * independently to keep computing while the content is hiding, or to
73
+ * start computing on hover before the popover is opened.
74
+ */
75
+ tracking: boolean | undefined;
76
+ /**
77
+ * A promise that resolves with the next position computation. The promise
78
+ * is renewed after each resolution, so consumers can `await bond.state.computed`
79
+ * repeatedly to wait for subsequent computations.
80
+ */
81
+ computed: Promise<ComputePositionReturn>;
65
82
  constructor(props: () => Props);
83
+ /** Notify awaiters of a fresh computation and renew the promise. */
84
+ notifyComputed(position: ComputePositionReturn): void;
85
+ get shouldTrackPosition(): boolean;
66
86
  get isOpen(): boolean;
67
87
  open(): void;
68
88
  close(): void;
@@ -84,7 +104,7 @@ export declare class PopoverVirtualTriggerAtom extends BondAtom<PopoverBond, Bon
84
104
  get element(): BondVirtualElement | undefined;
85
105
  set element(element: BondVirtualElement | undefined);
86
106
  }
87
- export declare class PopoverContentAtom extends BondAtom<PopoverBond, HTMLElement> {
107
+ export declare class PopoverOverlayAtom extends BondAtom<PopoverBond, HTMLElement> {
88
108
  constructor(bond: PopoverBond);
89
109
  get attrs(): {
90
110
  role: string;
@@ -99,6 +119,14 @@ export declare class PopoverContentAtom extends BondAtom<PopoverBond, HTMLElemen
99
119
  };
100
120
  onmount(node: HTMLElement): void;
101
121
  }
122
+ export declare class PopoverContentAtom extends BondAtom<PopoverBond, HTMLElement> {
123
+ constructor(bond: PopoverBond);
124
+ get attrs(): {
125
+ 'data-active': boolean;
126
+ };
127
+ get handlers(): {};
128
+ onmount(_node: HTMLElement): void;
129
+ }
102
130
  export declare class PopoverIndicatorAtom extends BondAtom<PopoverBond, HTMLElement> {
103
131
  constructor(bond: PopoverBond);
104
132
  get attrs(): {
@@ -17,6 +17,10 @@ export class PopoverBond extends Bond {
17
17
  return this.atom('virtual-trigger', () => new PopoverVirtualTriggerAtom(this));
18
18
  }
19
19
  /** Handle for granular access to content attrs, handlers, and attachment */
20
+ overlay() {
21
+ return this.atom('overlay', () => new PopoverOverlayAtom(this));
22
+ }
23
+ /** Handle for granular access to content attrs, handlers, and attachment */
20
24
  content() {
21
25
  return this.atom('content', () => new PopoverContentAtom(this));
22
26
  }
@@ -40,9 +44,37 @@ export class PopoverBond extends Bond {
40
44
  }
41
45
  export class PopoverState extends BondState {
42
46
  position = $state();
47
+ /**
48
+ * Controls whether the positioning strategy should actively compute the
49
+ * popover position. Defaults to `open` when unset, but can be toggled
50
+ * independently to keep computing while the content is hiding, or to
51
+ * start computing on hover before the popover is opened.
52
+ */
53
+ tracking = $state(undefined);
54
+ #computedResolve;
55
+ /**
56
+ * A promise that resolves with the next position computation. The promise
57
+ * is renewed after each resolution, so consumers can `await bond.state.computed`
58
+ * repeatedly to wait for subsequent computations.
59
+ */
60
+ computed = this.#createComputed();
43
61
  constructor(props) {
44
62
  super(props);
45
63
  }
64
+ #createComputed() {
65
+ return new Promise((resolve) => {
66
+ this.#computedResolve = resolve;
67
+ });
68
+ }
69
+ /** Notify awaiters of a fresh computation and renew the promise. */
70
+ notifyComputed(position) {
71
+ this.position = position;
72
+ this.#computedResolve(position);
73
+ this.computed = this.#createComputed();
74
+ }
75
+ get shouldTrackPosition() {
76
+ return this.tracking ?? this.isOpen;
77
+ }
46
78
  get isOpen() {
47
79
  return this.props.open ?? false;
48
80
  }
@@ -91,9 +123,9 @@ export class PopoverVirtualTriggerAtom extends BondAtom {
91
123
  this.setElement(element);
92
124
  }
93
125
  }
94
- export class PopoverContentAtom extends BondAtom {
126
+ export class PopoverOverlayAtom extends BondAtom {
95
127
  constructor(bond) {
96
- super(bond, 'content');
128
+ super(bond, 'overlay');
97
129
  }
98
130
  get attrs() {
99
131
  const triggerId = getElementId(this.bond.id, `${this.bond.name}-trigger`);
@@ -140,6 +172,27 @@ export class PopoverContentAtom extends BondAtom {
140
172
  }
141
173
  }
142
174
  }
175
+ export class PopoverContentAtom extends BondAtom {
176
+ constructor(bond) {
177
+ super(bond, 'content');
178
+ }
179
+ get attrs() {
180
+ const isOpen = this.bond.state?.props?.open ?? false;
181
+ const isDisabled = this.bond.state?.props?.disabled ?? false;
182
+ const isActive = isOpen && !isDisabled;
183
+ return {
184
+ ...super.attrs,
185
+ 'data-active': isActive
186
+ };
187
+ }
188
+ get handlers() {
189
+ return {};
190
+ }
191
+ onmount(_node) {
192
+ void _node;
193
+ return;
194
+ }
195
+ }
143
196
  export class PopoverIndicatorAtom extends BondAtom {
144
197
  constructor(bond) {
145
198
  super(bond, 'indicator');
@@ -1,6 +1,7 @@
1
1
  export * as Popover from './atoms';
2
2
  export { clickoutPopover, popover } from './attachments.svelte';
3
3
  export { PopoverBond, type PopoverDomElements, type PopoverParams, PopoverState, type PopoverStateProps, type TriggerParams, PopoverTriggerAtom, PopoverContentAtom, PopoverArrowAtom, PopoverIndicatorAtom, PopoverVirtualTriggerAtom } from './bond.svelte';
4
+ export * from './motion.svelte';
4
5
  export * from './types';
5
6
  export * from './strategy-types';
6
7
  export * as PopoverStrategies from './strategies';
@@ -1,6 +1,7 @@
1
1
  export * as Popover from './atoms';
2
2
  export { clickoutPopover, popover } from './attachments.svelte';
3
3
  export { PopoverBond, PopoverState, PopoverTriggerAtom, PopoverContentAtom, PopoverArrowAtom, PopoverIndicatorAtom, PopoverVirtualTriggerAtom } from './bond.svelte';
4
+ export * from './motion.svelte';
4
5
  export * from './types';
5
6
  export * from './strategy-types';
6
7
  export * as PopoverStrategies from './strategies';
@@ -13,7 +13,9 @@
13
13
  let {
14
14
  class: klass = '',
15
15
  children = undefined,
16
- animate = _animate,
16
+ fallback = {
17
+ animate: _animate
18
+ },
17
19
  ...restProps
18
20
  }: PopoverArrowProps<E, B> = $props();
19
21
 
@@ -74,9 +76,9 @@
74
76
 
75
77
  <HtmlAtom
76
78
  {bond}
79
+ {fallback}
77
80
  preset="popover.arrow"
78
81
  class={['text-border border-border pointer-events-none absolute opacity-0', '$preset', klass]}
79
- animate={animate?.bind(bond.state)}
80
82
  style="{side}: 100%;"
81
83
  {...arrowProps}
82
84
  >