zabi-components 7.0.1 → 8.0.0

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 (174) hide show
  1. package/README.md +46 -3
  2. package/THEMING.md +255 -15
  3. package/dist/atoms/ActionPanel.svelte +12 -7
  4. package/dist/atoms/ActionPanel.svelte.d.ts +2 -0
  5. package/dist/atoms/Badge.svelte +93 -56
  6. package/dist/atoms/Badge.svelte.d.ts +15 -3
  7. package/dist/atoms/Button.svelte +49 -49
  8. package/dist/atoms/Button.svelte.d.ts +3 -0
  9. package/dist/atoms/Card.svelte +31 -28
  10. package/dist/atoms/Card.svelte.d.ts +5 -2
  11. package/dist/atoms/CardContent.svelte +10 -2
  12. package/dist/atoms/CardContent.svelte.d.ts +2 -0
  13. package/dist/atoms/CardFooter.svelte +10 -2
  14. package/dist/atoms/CardFooter.svelte.d.ts +2 -0
  15. package/dist/atoms/CardHeader.svelte +10 -2
  16. package/dist/atoms/CardHeader.svelte.d.ts +2 -0
  17. package/dist/atoms/Checkbox.svelte +4 -0
  18. package/dist/atoms/Checkbox.svelte.d.ts +2 -0
  19. package/dist/atoms/CodeBlock.svelte +15 -7
  20. package/dist/atoms/CodeBlock.svelte.d.ts +9 -3
  21. package/dist/atoms/ColorPicker.svelte +19 -9
  22. package/dist/atoms/ColorPicker.svelte.d.ts +3 -1
  23. package/dist/atoms/Container.svelte +2 -3
  24. package/dist/atoms/Divider.svelte +4 -4
  25. package/dist/atoms/FeatureCard.svelte +4 -3
  26. package/dist/atoms/Heading.svelte +56 -27
  27. package/dist/atoms/Heading.svelte.d.ts +17 -4
  28. package/dist/atoms/IconButton.svelte +30 -37
  29. package/dist/atoms/Input.svelte +26 -34
  30. package/dist/atoms/List.svelte +10 -2
  31. package/dist/atoms/List.svelte.d.ts +2 -0
  32. package/dist/atoms/ListItem.svelte +2 -2
  33. package/dist/atoms/ListItemLeading.svelte +4 -2
  34. package/dist/atoms/ListItemLeading.svelte.d.ts +1 -1
  35. package/dist/atoms/OptimizedImage.svelte +11 -2
  36. package/dist/atoms/OptimizedImage.svelte.d.ts +2 -0
  37. package/dist/atoms/Progress.svelte +4 -1
  38. package/dist/atoms/Progress.svelte.d.ts +2 -0
  39. package/dist/atoms/Radio.svelte +4 -0
  40. package/dist/atoms/Radio.svelte.d.ts +2 -0
  41. package/dist/atoms/Select.svelte +65 -67
  42. package/dist/atoms/Select.svelte.d.ts +4 -0
  43. package/dist/atoms/SelectionControl.svelte +5 -1
  44. package/dist/atoms/SelectionControl.svelte.d.ts +2 -0
  45. package/dist/atoms/Skeleton.svelte +5 -3
  46. package/dist/atoms/Table.svelte +2 -1
  47. package/dist/atoms/Text.svelte +34 -5
  48. package/dist/atoms/Text.svelte.d.ts +7 -1
  49. package/dist/atoms/Textarea.svelte +7 -6
  50. package/dist/atoms/ThemeToggle.svelte +17 -14
  51. package/dist/atoms/ThemeToggle.svelte.d.ts +2 -0
  52. package/dist/atoms/Toast.svelte +10 -8
  53. package/dist/atoms/Toggle.svelte +21 -13
  54. package/dist/atoms/Toggle.svelte.d.ts +7 -0
  55. package/dist/atoms/Tooltip.svelte +89 -57
  56. package/dist/atoms/Tooltip.svelte.d.ts +15 -0
  57. package/dist/components/index.d.ts +3 -1
  58. package/dist/components/index.d.ts.map +1 -1
  59. package/dist/components/organisms/index.d.ts +1 -0
  60. package/dist/components/organisms/index.d.ts.map +1 -1
  61. package/dist/components/util/cn.d.ts +8 -0
  62. package/dist/components/util/cn.d.ts.map +1 -0
  63. package/dist/components/util/ssr-safe.d.ts +4 -4
  64. package/dist/components/util/ssr-safe.d.ts.map +1 -1
  65. package/dist/index.d.ts +3 -1
  66. package/dist/index.js +3 -6
  67. package/dist/molecules/Alert.svelte +43 -64
  68. package/dist/molecules/Alert.svelte.d.ts +7 -1
  69. package/dist/molecules/ComponentDemo.svelte +10 -2
  70. package/dist/molecules/ComponentDemo.svelte.d.ts +2 -0
  71. package/dist/molecules/ContactForm.svelte +12 -2
  72. package/dist/molecules/ContactForm.svelte.d.ts +2 -0
  73. package/dist/molecules/Dropdown.svelte +40 -11
  74. package/dist/molecules/Dropdown.svelte.d.ts +4 -0
  75. package/dist/molecules/EmptyState.svelte +2 -1
  76. package/dist/molecules/Form.svelte +25 -14
  77. package/dist/molecules/Form.svelte.d.ts +13 -5
  78. package/dist/molecules/FormField.svelte +2 -1
  79. package/dist/molecules/Header.svelte +13 -3
  80. package/dist/molecules/Header.svelte.d.ts +2 -0
  81. package/dist/molecules/ImageUpload.svelte +54 -15
  82. package/dist/molecules/ImageUpload.svelte.d.ts +16 -5
  83. package/dist/molecules/Modal.svelte +110 -31
  84. package/dist/molecules/Modal.svelte.d.ts +9 -6
  85. package/dist/molecules/NavigationMenu.svelte +15 -3
  86. package/dist/molecules/NavigationMenu.svelte.d.ts +4 -0
  87. package/dist/molecules/NavigationMenuContent.svelte +36 -38
  88. package/dist/molecules/NavigationMenuContent.svelte.d.ts +2 -0
  89. package/dist/molecules/NavigationMenuItem.svelte +10 -2
  90. package/dist/molecules/NavigationMenuItem.svelte.d.ts +2 -0
  91. package/dist/molecules/NavigationMenuLink.svelte +10 -2
  92. package/dist/molecules/NavigationMenuLink.svelte.d.ts +2 -0
  93. package/dist/molecules/NavigationMenuList.svelte +10 -2
  94. package/dist/molecules/NavigationMenuList.svelte.d.ts +2 -0
  95. package/dist/molecules/NavigationMenuTrigger.svelte +16 -3
  96. package/dist/molecules/NavigationMenuTrigger.svelte.d.ts +2 -0
  97. package/dist/molecules/Page.svelte +8 -2
  98. package/dist/molecules/Page.svelte.d.ts +2 -0
  99. package/dist/molecules/PropsTable.svelte +6 -3
  100. package/dist/molecules/PropsTable.svelte.d.ts +2 -0
  101. package/dist/molecules/RadioGroup.svelte +5 -1
  102. package/dist/molecules/RadioGroup.svelte.d.ts +2 -0
  103. package/dist/molecules/Section.svelte +12 -4
  104. package/dist/molecules/Section.svelte.d.ts +3 -1
  105. package/dist/molecules/SidebarBrandHeader.svelte +13 -4
  106. package/dist/molecules/SidebarBrandHeader.svelte.d.ts +2 -0
  107. package/dist/molecules/SidebarFooter.svelte +12 -4
  108. package/dist/molecules/SidebarFooter.svelte.d.ts +2 -0
  109. package/dist/molecules/SidebarNavSection.svelte +12 -4
  110. package/dist/molecules/SidebarNavSection.svelte.d.ts +2 -0
  111. package/dist/molecules/SlideUp.svelte +85 -21
  112. package/dist/molecules/SlideUp.svelte.d.ts +5 -4
  113. package/dist/molecules/Tabs.svelte +25 -19
  114. package/dist/molecules/Tabs.svelte.d.ts +8 -4
  115. package/dist/molecules/Toaster.svelte +3 -2
  116. package/dist/molecules/ToasterToast.svelte +41 -10
  117. package/dist/molecules/ToasterToast.svelte.d.ts +2 -0
  118. package/dist/organisms/SidebarAccountPanel.svelte +4 -0
  119. package/dist/organisms/SidebarAccountPanel.svelte.d.ts +2 -0
  120. package/dist/organisms/SidebarNavigation.svelte +102 -59
  121. package/dist/organisms/SidebarNavigation.svelte.d.ts +2 -0
  122. package/dist/organisms/SidebarPanel.svelte +19 -11
  123. package/dist/organisms/SidebarPanel.svelte.d.ts +2 -0
  124. package/dist/organisms/SidebarShell.svelte +112 -0
  125. package/dist/organisms/SidebarShell.svelte.d.ts +52 -0
  126. package/dist/organisms/TopNavbar.svelte +88 -17
  127. package/dist/organisms/TopNavbar.svelte.d.ts +2 -0
  128. package/dist/organisms/index.d.ts +1 -0
  129. package/dist/organisms/index.js +1 -0
  130. package/dist/routes/lib/variant-utils.d.ts +26 -0
  131. package/dist/routes/lib/{variant-utils.ts → variant-utils.js} +15 -46
  132. package/dist/types/events.js +1 -0
  133. package/dist/types/index.js +3 -0
  134. package/dist/util/cn.d.ts +7 -0
  135. package/dist/util/cn.js +48 -0
  136. package/dist/util/ssr-safe.d.ts +4 -4
  137. package/dist/zabi-components-colors.css +3 -437
  138. package/dist/zabi-components-theme-dark-only.css +223 -103
  139. package/dist/zabi-components-theme-dark.css +223 -103
  140. package/dist/zabi-components-theme-only.css +347 -107
  141. package/dist/zabi-components-theme.css +347 -107
  142. package/dist/zabi-components.css +953 -843
  143. package/docs/lucide-icons.md +3 -1
  144. package/package.json +20 -25
  145. package/dist/lib/layout-width-tokens.d.ts +0 -17
  146. package/dist/lib/layout-width-tokens.d.ts.map +0 -1
  147. package/dist/lib/showcase/component-docs/Button.d.ts +0 -3
  148. package/dist/lib/showcase/component-docs/Button.d.ts.map +0 -1
  149. package/dist/lib/showcase/component-docs/Input.d.ts +0 -3
  150. package/dist/lib/showcase/component-docs/Input.d.ts.map +0 -1
  151. package/dist/lib/showcase/component-docs/List.d.ts +0 -3
  152. package/dist/lib/showcase/component-docs/List.d.ts.map +0 -1
  153. package/dist/lib/showcase/component-docs/Modal.d.ts +0 -3
  154. package/dist/lib/showcase/component-docs/Modal.d.ts.map +0 -1
  155. package/dist/lib/showcase/component-docs/Radio.d.ts +0 -3
  156. package/dist/lib/showcase/component-docs/Radio.d.ts.map +0 -1
  157. package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts +0 -3
  158. package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts.map +0 -1
  159. package/dist/lib/showcase/component-docs/Skeleton.d.ts +0 -3
  160. package/dist/lib/showcase/component-docs/Skeleton.d.ts.map +0 -1
  161. package/dist/lib/showcase/component-docs/_shared.d.ts +0 -12
  162. package/dist/lib/showcase/component-docs/_shared.d.ts.map +0 -1
  163. package/dist/lib/showcase/component-docs/index.d.ts +0 -4
  164. package/dist/lib/showcase/component-docs/index.d.ts.map +0 -1
  165. package/dist/lib/showcase/components-catalog.d.ts +0 -3
  166. package/dist/lib/showcase/components-catalog.d.ts.map +0 -1
  167. package/dist/lib/showcase/components-showcase-constants.d.ts +0 -89
  168. package/dist/lib/showcase/components-showcase-constants.d.ts.map +0 -1
  169. package/dist/lib/showcase/docs-sidebar-helpers.d.ts +0 -15
  170. package/dist/lib/showcase/docs-sidebar-helpers.d.ts.map +0 -1
  171. package/dist/routes/lib/focus-utils.d.ts +0 -12
  172. package/dist/routes/lib/focus-utils.ts +0 -110
  173. package/dist/routes/lib/ssr-safe.ts +0 -58
  174. package/scripts/fix-lucide-svelte-icon-dts.js +0 -35
@@ -1,7 +1,15 @@
1
1
  <script lang="ts">
2
2
  import { generateId } from "../util/ssr-safe.js";
3
+ import { cn } from "../util/cn.js";
3
4
 
4
5
  interface Props {
6
+ /** Extra classes for the host element. */
7
+ class?: string;
8
+ /** Omit to auto-generate; pass to pair with an external `<label for>`. */
9
+ id?: string;
10
+ /** When set, a hidden input submits `value` with native forms while checked. */
11
+ name?: string;
12
+ value?: string;
5
13
  checked?: boolean;
6
14
  disabled?: boolean;
7
15
  loading?: boolean;
@@ -11,6 +19,10 @@
11
19
  }
12
20
 
13
21
  let {
22
+ class: className = "",
23
+ id: idProp,
24
+ name = "",
25
+ value = "on",
14
26
  checked = $bindable(false),
15
27
  disabled = false,
16
28
  loading = false,
@@ -20,7 +32,8 @@
20
32
  ...restProps
21
33
  }: Props = $props();
22
34
 
23
- const toggleId = generateId("toggle");
35
+ const fallbackId = generateId("toggle");
36
+ const toggleId = $derived(idProp ?? fallbackId);
24
37
  const isDisabled = $derived(disabled || loading);
25
38
 
26
39
  function handleClick(event: MouseEvent) {
@@ -36,7 +49,7 @@
36
49
  "focus-ring relative inline-flex w-10 h-6 flex-shrink-0 rounded-full border-0 transition-colors duration-200 ease-in-out focus:outline-none focus-visible:outline-none";
37
50
  const colorClass = checked
38
51
  ? "bg-action-primary hover:bg-action-primary-hover active:bg-action-primary-active"
39
- : "bg-base-400 hover:bg-base-500 active:bg-base-500";
52
+ : "bg-control-track hover:bg-control-track-hover active:bg-control-track-active";
40
53
  const stateClass = isDisabled
41
54
  ? "opacity-50 cursor-not-allowed"
42
55
  : "cursor-pointer";
@@ -45,21 +58,13 @@
45
58
 
46
59
  const toggleThumbClasses = $derived(() => {
47
60
  const base =
48
- "pointer-events-none absolute top-0.5 left-0.5 w-5 h-5 rounded-full bg-card shadow transition-transform duration-200 ease-in-out flex items-center justify-center";
61
+ "pointer-events-none absolute top-0.5 left-0.5 w-5 h-5 rounded-full bg-card shadow-sm transition-transform duration-200 ease-in-out flex items-center justify-center";
49
62
  const positionClasses = checked ? "translate-x-4" : "translate-x-0";
50
63
  return `${base} ${positionClasses}`;
51
64
  });
52
-
53
- function handleKeydown(event: KeyboardEvent) {
54
- if (isDisabled) return;
55
- if (event.key === " " || event.key === "Enter") {
56
- event.preventDefault();
57
- handleClick(event as unknown as MouseEvent);
58
- }
59
- }
60
65
  </script>
61
66
 
62
- <div class="flex items-center gap-3">
67
+ <div class={cn("flex items-center gap-3", className)}>
63
68
  <button
64
69
  type="button"
65
70
  role="switch"
@@ -69,7 +74,6 @@
69
74
  aria-busy={loading ? "true" : undefined}
70
75
  disabled={isDisabled}
71
76
  onclick={handleClick}
72
- onkeydown={handleKeydown}
73
77
  class={toggleButtonClasses()}
74
78
  {...restProps}
75
79
  >
@@ -83,6 +87,10 @@
83
87
  </span>
84
88
  </button>
85
89
 
90
+ {#if name && checked}
91
+ <input type="hidden" {name} {value} />
92
+ {/if}
93
+
86
94
  {#if label}
87
95
  <label
88
96
  for={toggleId}
@@ -1,4 +1,11 @@
1
1
  interface Props {
2
+ /** Extra classes for the host element. */
3
+ class?: string;
4
+ /** Omit to auto-generate; pass to pair with an external `<label for>`. */
5
+ id?: string;
6
+ /** When set, a hidden input submits `value` with native forms while checked. */
7
+ name?: string;
8
+ value?: string;
2
9
  checked?: boolean;
3
10
  disabled?: boolean;
4
11
  loading?: boolean;
@@ -4,11 +4,27 @@
4
4
  import { onDestroy } from "svelte";
5
5
  import { generateId } from "../util/ssr-safe.js";
6
6
 
7
+ import { cn } from "../util/cn.js";
7
8
  type Props = Omit<HTMLAttributes<HTMLDivElement>, "class"> & {
8
9
  content?: string;
9
10
  placement?: "top" | "bottom" | "left" | "right";
10
11
  delay?: number;
11
12
  disabled?: boolean;
13
+ /**
14
+ * Lay the trigger out as a full-width block instead of an inline-block.
15
+ * A prop rather than a `class="block w-full"` override, because `block`
16
+ * and `inline-block` are equal-specificity utilities: the winner would
17
+ * be whichever Tailwind emits later, not whichever the caller passed.
18
+ */
19
+ block?: boolean;
20
+ /**
21
+ * Position the bubble against the viewport instead of the trigger's
22
+ * offset parent. An absolutely-positioned tooltip cannot escape an
23
+ * ancestor that scrolls: a collapsed sidebar rail sits inside an
24
+ * `overflow-y-auto overflow-x-hidden` list, which clipped the bubble
25
+ * at the rail edge and left only the arrow showing.
26
+ */
27
+ fixed?: boolean;
12
28
  class?: string;
13
29
  children?: Snippet;
14
30
  };
@@ -22,10 +38,43 @@
22
38
  placement = "top",
23
39
  delay = 0,
24
40
  disabled = false,
41
+ block = false,
42
+ fixed = false,
43
+ class: className = "",
25
44
  children,
26
45
  ...restProps
27
46
  }: Props = $props();
28
47
 
48
+ let fixedStyle = $state("");
49
+
50
+ /** Gap must match --tooltip-gap's default (0.5rem). */
51
+ const FIXED_GAP = 8;
52
+
53
+ function positionFixed(): void {
54
+ if (!fixed || !triggerElement) return;
55
+ const r = triggerElement.getBoundingClientRect();
56
+ const coords = {
57
+ top: [r.left + r.width / 2, r.top - FIXED_GAP],
58
+ bottom: [r.left + r.width / 2, r.bottom + FIXED_GAP],
59
+ left: [r.left - FIXED_GAP, r.top + r.height / 2],
60
+ right: [r.right + FIXED_GAP, r.top + r.height / 2],
61
+ }[placement];
62
+ fixedStyle = `left:${coords[0]}px;top:${coords[1]}px;`;
63
+ }
64
+
65
+ $effect(() => {
66
+ if (!fixed || !isVisible) return;
67
+ positionFixed();
68
+ const onMove = () => positionFixed();
69
+ // `true` so ancestor scrolls (the nav list itself) are caught too.
70
+ window.addEventListener("scroll", onMove, true);
71
+ window.addEventListener("resize", onMove);
72
+ return () => {
73
+ window.removeEventListener("scroll", onMove, true);
74
+ window.removeEventListener("resize", onMove);
75
+ };
76
+ });
77
+
29
78
  const triggerId = generateId("tooltip-trigger");
30
79
  const tooltipId = generateId("tooltip");
31
80
  let isVisible = $state(false);
@@ -64,8 +113,7 @@
64
113
 
65
114
  $effect(() => {
66
115
  const root = triggerElement;
67
- const describe =
68
- isVisible && content && !disabled ? tooltipId : null;
116
+ const describe = isVisible && content && !disabled ? tooltipId : null;
69
117
  if (!root) {
70
118
  return;
71
119
  }
@@ -100,7 +148,11 @@
100
148
  clearShowDelay();
101
149
  clearHideBlurTimeout();
102
150
  isVisible = false;
103
- triggerElement?.focus();
151
+ // Keep focus on the described control; never steal it when the tooltip was hover-only.
152
+ const target = triggerElement ? findDescribedTarget(triggerElement) : null;
153
+ if (target && triggerElement?.contains(document.activeElement)) {
154
+ target.focus();
155
+ }
104
156
  }
105
157
  }
106
158
 
@@ -146,8 +198,13 @@
146
198
  <svelte:window onkeydown={handleKeydown} />
147
199
 
148
200
  <div
149
- class="tooltip-container relative inline-block"
201
+ class={cn(
202
+ "tooltip-container relative",
203
+ block ? "block w-full" : "inline-block",
204
+ className,
205
+ )}
150
206
  data-placement={placement}
207
+ data-strategy={fixed ? "fixed" : "absolute"}
151
208
  data-disabled={disabled}
152
209
  onmouseenter={handleMouseEnter}
153
210
  onmouseleave={handleMouseLeave}
@@ -155,18 +212,19 @@
155
212
  onfocusout={handleBlur}
156
213
  {...restProps}
157
214
  >
158
- <div bind:this={triggerElement} id={triggerId}>
215
+ <div bind:this={triggerElement} id={triggerId} class={block ? "w-full" : undefined}>
159
216
  {@render children?.()}
160
217
  </div>
161
218
 
162
219
  {#if content && !disabled}
163
220
  <div
164
221
  id={tooltipId}
165
- class="tooltip"
222
+ class="tooltip pointer-events-none invisible absolute z-tooltip whitespace-normal wrap-break-word rounded-control bg-tooltip-bg px-3 py-2 text-sm leading-5 text-tooltip-fg opacity-0 transition-[opacity,visibility,transform] duration-200 ease-in-out"
166
223
  role="tooltip"
167
224
  aria-hidden={!isVisible}
168
225
  data-visible={isVisible}
169
226
  data-placement={placement}
227
+ style={fixed ? fixedStyle : undefined}
170
228
  >
171
229
  {content}
172
230
  </div>
@@ -174,48 +232,19 @@
174
232
  </div>
175
233
 
176
234
  <style>
177
- :root {
178
- --tooltip-bg: var(--color-base-800);
179
- --tooltip-color: var(--color-base-50);
180
- --tooltip-padding: 0.5rem 0.75rem;
181
- --tooltip-radius: 0.5rem;
182
- --tooltip-font-size: 0.875rem;
183
- --tooltip-line-height: 1.25rem;
184
- --tooltip-max-width: 200px;
185
- --tooltip-gap: 0.5rem;
186
- --tooltip-arrow-size: 4px;
187
- --tooltip-transition: opacity 0.2s ease-in-out,
188
- visibility 0.2s ease-in-out, transform 0.2s ease-in-out;
189
- }
190
-
191
- .tooltip-container {
192
- position: relative;
193
- display: inline-block;
194
- }
195
-
235
+ /* Tunables (override on :root or any ancestor): --tooltip-max-width, --tooltip-gap, --tooltip-arrow-size. Defaults live in the var() fallbacks. */
236
+ /* max-width: policy forbids max-w-* utilities on packaged atoms; variable used by sm: override */
196
237
  .tooltip {
197
- position: absolute;
198
- z-index: var(--z-tooltip, 1070);
199
- padding: var(--tooltip-padding);
200
- background-color: var(--tooltip-bg);
201
- color: var(--tooltip-color);
202
- border-radius: var(--tooltip-radius);
203
- font-size: var(--tooltip-font-size);
204
- line-height: var(--tooltip-line-height);
205
- max-width: var(--tooltip-max-width);
206
- white-space: normal;
207
- word-wrap: break-word;
208
- opacity: 0;
209
- visibility: hidden;
210
- transition: var(--tooltip-transition);
211
- pointer-events: none;
238
+ width: -moz-max-content;
239
+ width: max-content;
240
+ max-width: var(--tooltip-max-width, min(24rem, calc(100vw - 2rem)));
212
241
  }
213
242
 
214
243
  .tooltip-container[data-placement="top"] .tooltip {
215
244
  inset-block-end: 100%;
216
245
  inset-inline-start: 50%;
217
246
  transform: translateX(-50%) translateY(4px) scale(0.95);
218
- margin-block-end: var(--tooltip-gap);
247
+ margin-block-end: var(--tooltip-gap, 0.5rem);
219
248
  }
220
249
 
221
250
  .tooltip-container[data-placement="top"] .tooltip[data-visible="true"] {
@@ -228,7 +257,7 @@
228
257
  inset-block-start: 100%;
229
258
  inset-inline-start: 50%;
230
259
  transform: translateX(-50%) translateY(-4px) scale(0.95);
231
- margin-block-start: var(--tooltip-gap);
260
+ margin-block-start: var(--tooltip-gap, 0.5rem);
232
261
  }
233
262
 
234
263
  .tooltip-container[data-placement="bottom"] .tooltip[data-visible="true"] {
@@ -241,7 +270,7 @@
241
270
  inset-inline-end: 100%;
242
271
  inset-block-start: 50%;
243
272
  transform: translateY(-50%) translateX(4px) scale(0.95);
244
- margin-inline-end: var(--tooltip-gap);
273
+ margin-inline-end: var(--tooltip-gap, 0.5rem);
245
274
  }
246
275
 
247
276
  .tooltip-container[data-placement="left"] .tooltip[data-visible="true"] {
@@ -254,7 +283,7 @@
254
283
  inset-inline-start: 100%;
255
284
  inset-block-start: 50%;
256
285
  transform: translateY(-50%) translateX(-4px) scale(0.95);
257
- margin-inline-start: var(--tooltip-gap);
286
+ margin-inline-start: var(--tooltip-gap, 0.5rem);
258
287
  }
259
288
 
260
289
  .tooltip-container[data-placement="right"] .tooltip[data-visible="true"] {
@@ -263,12 +292,21 @@
263
292
  transform: translateY(-50%) translateX(0) scale(1);
264
293
  }
265
294
 
295
+ /* Fixed strategy: the bubble is placed against the viewport from the
296
+ trigger's rect, so a scrolling ancestor cannot clip it. Insets and
297
+ margins are reset; the transforms above still do the centring. */
298
+ .tooltip-container[data-strategy="fixed"] .tooltip {
299
+ position: fixed;
300
+ inset: auto;
301
+ margin: 0;
302
+ }
303
+
266
304
  .tooltip::before {
267
305
  content: "";
268
306
  position: absolute;
269
- width: calc(var(--tooltip-arrow-size) * 2);
270
- height: calc(var(--tooltip-arrow-size) * 2);
271
- background-color: var(--tooltip-bg);
307
+ width: calc(var(--tooltip-arrow-size, 4px) * 2);
308
+ height: calc(var(--tooltip-arrow-size, 4px) * 2);
309
+ background-color: var(--color-tooltip-bg);
272
310
  }
273
311
 
274
312
  .tooltip-container[data-placement="top"] .tooltip::before {
@@ -299,17 +337,13 @@
299
337
  clip-path: polygon(0 50%, 100% 0, 100% 100%);
300
338
  }
301
339
 
302
- .tooltip-container[data-delay] .tooltip {
303
- transition-delay: calc(var(--tooltip-delay, 0) * 1ms);
304
- }
305
-
306
340
  @media (max-width: 640px) {
307
341
  .tooltip {
308
342
  --tooltip-max-width: calc(100vw - 2rem);
309
343
  inset-inline-start: 50% !important;
310
344
  inset-inline-end: auto !important;
311
345
  transform: translateX(-50%) scale(0.95) !important;
312
- margin: var(--tooltip-gap) 0 !important;
346
+ margin: var(--tooltip-gap, 0.5rem) 0 !important;
313
347
  }
314
348
 
315
349
  .tooltip[data-visible="true"] {
@@ -322,10 +356,8 @@
322
356
  }
323
357
 
324
358
  @media (prefers-contrast: high) {
325
- :root {
326
- --tooltip-bg: CanvasText;
327
- --tooltip-color: Canvas;
328
- --tooltip-padding: 0.75rem 1rem;
359
+ .tooltip {
360
+ padding: 0.75rem 1rem;
329
361
  }
330
362
  }
331
363
 
@@ -354,6 +386,6 @@
354
386
  box-shadow:
355
387
  0 0 0 2px var(--color-focus-ring-offset),
356
388
  0 0 0 4px var(--color-focus-ring);
357
- border-radius: var(--tooltip-radius);
389
+ border-radius: 0.5rem;
358
390
  }
359
391
  </style>
@@ -5,6 +5,21 @@ type Props = Omit<HTMLAttributes<HTMLDivElement>, "class"> & {
5
5
  placement?: "top" | "bottom" | "left" | "right";
6
6
  delay?: number;
7
7
  disabled?: boolean;
8
+ /**
9
+ * Lay the trigger out as a full-width block instead of an inline-block.
10
+ * A prop rather than a `class="block w-full"` override, because `block`
11
+ * and `inline-block` are equal-specificity utilities: the winner would
12
+ * be whichever Tailwind emits later, not whichever the caller passed.
13
+ */
14
+ block?: boolean;
15
+ /**
16
+ * Position the bubble against the viewport instead of the trigger's
17
+ * offset parent. An absolutely-positioned tooltip cannot escape an
18
+ * ancestor that scrolls: a collapsed sidebar rail sits inside an
19
+ * `overflow-y-auto overflow-x-hidden` list, which clipped the bubble
20
+ * at the rail edge and left only the arrow showing.
21
+ */
22
+ fixed?: boolean;
8
23
  class?: string;
9
24
  children?: Snippet;
10
25
  };
@@ -56,9 +56,11 @@ export { default as SidebarNavSection } from './molecules/SidebarNavSection.svel
56
56
  export { toastStore, pushToast, dismissToast, type ToastItem, type ToastLevel, } from './molecules/toast-store.js';
57
57
  export { default as TopNavbar } from './organisms/TopNavbar.svelte';
58
58
  export { default as SidebarNavigation } from './organisms/SidebarNavigation.svelte';
59
+ export { default as SidebarShell } from './organisms/SidebarShell.svelte';
59
60
  export { default as SidebarAccountPanel } from './organisms/SidebarAccountPanel.svelte';
60
61
  export { default as SidebarPanel } from './organisms/SidebarPanel.svelte';
61
- export declare const generateId: (prefix?: string) => string;
62
+ import { generateId } from './util/ssr-safe.js';
63
+ export { generateId };
62
64
  export declare const createId: (prefix?: string) => string;
63
65
  export declare const cn: (...classes: (string | undefined | null | false)[]) => string;
64
66
  export declare const getFormData: (form: HTMLFormElement) => Record<string, unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export { default as TopNavbar } from './TopNavbar.svelte';
2
2
  export { default as SidebarNavigation } from './SidebarNavigation.svelte';
3
+ export { default as SidebarShell } from './SidebarShell.svelte';
3
4
  export { default as SidebarAccountPanel } from './SidebarAccountPanel.svelte';
4
5
  export { default as SidebarPanel } from './SidebarPanel.svelte';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/organisms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/organisms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Merge class values, last conflicting utility wins.
3
+ *
4
+ * Falsy entries are dropped, so `cn(base, isActive && activeClasses, className)`
5
+ * is safe.
6
+ */
7
+ export declare function cn(...classes: (string | false | null | undefined)[]): string;
8
+ //# sourceMappingURL=cn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../../../src/components/util/cn.ts"],"names":[],"mappings":"AA6CA;;;;;GAKG;AACH,wBAAgB,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,CAE5E"}
@@ -9,9 +9,9 @@ export declare function safeDocument(): Document | undefined;
9
9
  export declare function safeLocalStorage(): Storage | undefined;
10
10
  export declare function safeSessionStorage(): Storage | undefined;
11
11
  export declare function safeRequestAnimationFrame(callback: FrameRequestCallback): number | undefined;
12
- export declare function safeSetTimeout(callback: () => void, delay: number): NodeJS.Timeout | undefined;
13
- export declare function safeClearTimeout(id: NodeJS.Timeout | undefined): void;
14
- export declare function safeSetInterval(callback: () => void, delay: number): NodeJS.Timeout | undefined;
15
- export declare function safeClearInterval(id: NodeJS.Timeout | undefined): void;
12
+ export declare function safeSetTimeout(callback: () => void, delay: number): ReturnType<typeof setTimeout> | undefined;
13
+ export declare function safeClearTimeout(id: ReturnType<typeof setTimeout> | undefined): void;
14
+ export declare function safeSetInterval(callback: () => void, delay: number): ReturnType<typeof setInterval> | undefined;
15
+ export declare function safeClearInterval(id: ReturnType<typeof setInterval> | undefined): void;
16
16
  export declare function generateId(prefix?: string): string;
17
17
  //# sourceMappingURL=ssr-safe.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ssr-safe.d.ts","sourceRoot":"","sources":["../../../src/components/util/ssr-safe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAE/C;AAED,wBAAgB,YAAY,IAAI,QAAQ,GAAG,SAAS,CAEnD;AAED,wBAAgB,gBAAgB,IAAI,OAAO,GAAG,SAAS,CAEtD;AAED,wBAAgB,kBAAkB,IAAI,OAAO,GAAG,SAAS,CAExD;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS,CAE5F;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,SAAS,CAE9F;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,GAAG,IAAI,CAIrE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,SAAS,CAE/F;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,GAAG,SAAS,GAAG,IAAI,CAItE;AAGD,wBAAgB,UAAU,CAAC,MAAM,GAAE,MAAa,GAAG,MAAM,CAMxD"}
1
+ {"version":3,"file":"ssr-safe.d.ts","sourceRoot":"","sources":["../../../src/components/util/ssr-safe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAE/C;AAED,wBAAgB,YAAY,IAAI,QAAQ,GAAG,SAAS,CAEnD;AAED,wBAAgB,gBAAgB,IAAI,OAAO,GAAG,SAAS,CAEtD;AAED,wBAAgB,kBAAkB,IAAI,OAAO,GAAG,SAAS,CAExD;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS,CAE5F;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,CAE7G;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,GAAG,IAAI,CAIpF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,SAAS,CAE/G;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,SAAS,GAAG,IAAI,CAItF;AAGD,wBAAgB,UAAU,CAAC,MAAM,GAAE,MAAa,GAAG,MAAM,CAMxD"}
package/dist/index.d.ts CHANGED
@@ -56,9 +56,11 @@ export { default as SidebarNavSection } from './molecules/SidebarNavSection.svel
56
56
  export { toastStore, pushToast, dismissToast, type ToastItem, type ToastLevel, } from './molecules/toast-store.js';
57
57
  export { default as TopNavbar } from './organisms/TopNavbar.svelte';
58
58
  export { default as SidebarNavigation } from './organisms/SidebarNavigation.svelte';
59
+ export { default as SidebarShell } from './organisms/SidebarShell.svelte';
59
60
  export { default as SidebarAccountPanel } from './organisms/SidebarAccountPanel.svelte';
60
61
  export { default as SidebarPanel } from './organisms/SidebarPanel.svelte';
61
- export declare const generateId: (prefix?: string) => string;
62
+ import { generateId } from './util/ssr-safe.js';
63
+ export { generateId };
62
64
  export declare const createId: (prefix?: string) => string;
63
65
  export declare const cn: (...classes: (string | undefined | null | false)[]) => string;
64
66
  export declare const getFormData: (form: HTMLFormElement) => Record<string, unknown>;
package/dist/index.js CHANGED
@@ -56,14 +56,11 @@ export { default as SidebarNavSection } from './molecules/SidebarNavSection.svel
56
56
  export { toastStore, pushToast, dismissToast, } from './molecules/toast-store.js';
57
57
  export { default as TopNavbar } from './organisms/TopNavbar.svelte';
58
58
  export { default as SidebarNavigation } from './organisms/SidebarNavigation.svelte';
59
+ export { default as SidebarShell } from './organisms/SidebarShell.svelte';
59
60
  export { default as SidebarAccountPanel } from './organisms/SidebarAccountPanel.svelte';
60
61
  export { default as SidebarPanel } from './organisms/SidebarPanel.svelte';
61
- export const generateId = (prefix = 'id') => {
62
- if (typeof window !== 'undefined') {
63
- return `${prefix}-${Math.random().toString(36).substr(2, 9)}`;
64
- }
65
- return `${prefix}-ssr-${Date.now()}`;
66
- };
62
+ import { generateId } from './util/ssr-safe.js';
63
+ export { generateId };
67
64
  export const createId = (prefix = 'id') => generateId(prefix);
68
65
  export const cn = (...classes) => classes.filter(Boolean).join(' ');
69
66
  export const getFormData = (form) => {