@urbicon-ui/blocks 6.1.8 → 6.3.1

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 (153) hide show
  1. package/README.md +12 -2
  2. package/dist/components/AreaChart/AreaChart.svelte +2 -6
  3. package/dist/components/BarChart/BarChart.svelte +2 -6
  4. package/dist/components/Calendar/Calendar.svelte +12 -10
  5. package/dist/components/Calendar/calendar.variants.d.ts +2 -1
  6. package/dist/components/Calendar/index.d.ts +2 -2
  7. package/dist/components/CommandPalette/CommandPalette.svelte +106 -39
  8. package/dist/components/CommandPalette/commandPalette.variants.d.ts +3 -7
  9. package/dist/components/CommandPalette/commandPalette.variants.js +0 -1
  10. package/dist/components/CommandPalette/index.d.ts +2 -2
  11. package/dist/components/CompositionBar/CompositionBar.svelte +12 -15
  12. package/dist/components/CompositionBar/composition-bar.variants.d.ts +3 -1
  13. package/dist/components/CompositionBar/index.d.ts +2 -2
  14. package/dist/components/DonutChart/DonutChart.svelte +2 -6
  15. package/dist/components/EmptyState/EmptyState.svelte +8 -9
  16. package/dist/components/EmptyState/emptyState.variants.d.ts +3 -1
  17. package/dist/components/EmptyState/index.d.ts +3 -3
  18. package/dist/components/FileUpload/FileUpload.svelte +17 -17
  19. package/dist/components/FileUpload/fileUpload.variants.d.ts +3 -11
  20. package/dist/components/FileUpload/fileUpload.variants.js +0 -5
  21. package/dist/components/FileUpload/index.d.ts +4 -3
  22. package/dist/components/Guide/Guide.svelte +5 -8
  23. package/dist/components/Guide/GuideArticle.svelte +5 -8
  24. package/dist/components/Guide/GuideBeacon.svelte +5 -8
  25. package/dist/components/Guide/GuideHint.svelte +5 -8
  26. package/dist/components/Guide/GuideMarker.svelte +5 -8
  27. package/dist/components/Guide/GuideMention.svelte +5 -8
  28. package/dist/components/Guide/GuidePanel.svelte +5 -8
  29. package/dist/components/Guide/guide.variants.d.ts +9 -1
  30. package/dist/components/Guide/index.d.ts +12 -9
  31. package/dist/components/LineChart/LineChart.svelte +2 -6
  32. package/dist/components/Planner/Planner.svelte +7 -10
  33. package/dist/components/Planner/index.d.ts +4 -4
  34. package/dist/components/Planner/planner.variants.d.ts +3 -1
  35. package/dist/components/Sankey/Sankey.svelte +8 -9
  36. package/dist/components/Sankey/index.d.ts +2 -2
  37. package/dist/components/Sankey/sankey.variants.d.ts +3 -1
  38. package/dist/components/SidebarLayout/SidebarLayout.svelte +17 -17
  39. package/dist/components/SidebarLayout/index.d.ts +8 -2
  40. package/dist/components/SidebarLayout/sidebar-layout.variants.d.ts +3 -1
  41. package/dist/components/ThemeSwitcher/ThemeSwitcher.svelte +30 -38
  42. package/dist/components/ThemeSwitcher/index.d.ts +6 -4
  43. package/dist/components/ThemeSwitcher/themeSwitcher.variants.d.ts +3 -1
  44. package/dist/primitives/Accordion/Accordion.svelte +7 -9
  45. package/dist/primitives/Accordion/AccordionItem.svelte +8 -20
  46. package/dist/primitives/Accordion/accordion.variants.d.ts +3 -1
  47. package/dist/primitives/Accordion/index.d.ts +6 -6
  48. package/dist/primitives/Alert/Alert.svelte +7 -21
  49. package/dist/primitives/Alert/alert.variants.d.ts +3 -1
  50. package/dist/primitives/Alert/index.d.ts +3 -3
  51. package/dist/primitives/Avatar/Avatar.svelte +17 -20
  52. package/dist/primitives/Avatar/avatar.variants.d.ts +3 -1
  53. package/dist/primitives/Avatar/index.d.ts +3 -3
  54. package/dist/primitives/Badge/Badge.svelte +20 -23
  55. package/dist/primitives/Badge/badge.variants.d.ts +3 -1
  56. package/dist/primitives/Badge/index.d.ts +2 -2
  57. package/dist/primitives/Breadcrumb/Breadcrumb.svelte +30 -32
  58. package/dist/primitives/Breadcrumb/breadcrumb.variants.d.ts +3 -1
  59. package/dist/primitives/Breadcrumb/index.d.ts +2 -2
  60. package/dist/primitives/Button/Button.svelte +21 -21
  61. package/dist/primitives/Button/button.variants.d.ts +3 -1
  62. package/dist/primitives/Button/index.d.ts +3 -3
  63. package/dist/primitives/ButtonGroup/ButtonGroup.svelte +15 -14
  64. package/dist/primitives/ButtonGroup/buttongroup.variants.d.ts +3 -1
  65. package/dist/primitives/ButtonGroup/index.d.ts +3 -2
  66. package/dist/primitives/Card/Card.svelte +15 -18
  67. package/dist/primitives/Card/card.variants.d.ts +3 -1
  68. package/dist/primitives/Card/index.d.ts +3 -3
  69. package/dist/primitives/Checkbox/Checkbox.svelte +20 -20
  70. package/dist/primitives/Checkbox/checkbox.variants.d.ts +3 -1
  71. package/dist/primitives/Checkbox/index.d.ts +7 -3
  72. package/dist/primitives/Collapsible/Collapsible.svelte +30 -30
  73. package/dist/primitives/Collapsible/collapsible.variants.d.ts +3 -1
  74. package/dist/primitives/Collapsible/index.d.ts +3 -3
  75. package/dist/primitives/Combobox/Combobox.svelte +20 -31
  76. package/dist/primitives/Combobox/combobox.variants.d.ts +3 -1
  77. package/dist/primitives/Combobox/index.d.ts +5 -3
  78. package/dist/primitives/Dialog/Dialog.svelte +7 -10
  79. package/dist/primitives/Dialog/dialog.variants.d.ts +3 -1
  80. package/dist/primitives/Dialog/index.d.ts +2 -2
  81. package/dist/primitives/Drawer/Drawer.svelte +7 -10
  82. package/dist/primitives/Drawer/drawer.variants.d.ts +3 -1
  83. package/dist/primitives/Drawer/index.d.ts +2 -2
  84. package/dist/primitives/Input/Input.svelte +54 -30
  85. package/dist/primitives/Input/index.d.ts +7 -3
  86. package/dist/primitives/Input/input.variants.d.ts +3 -1
  87. package/dist/primitives/Menu/Menu.svelte +23 -23
  88. package/dist/primitives/Menu/index.d.ts +4 -1
  89. package/dist/primitives/Menu/menu.variants.d.ts +3 -1
  90. package/dist/primitives/Pagination/Pagination.svelte +18 -16
  91. package/dist/primitives/Pagination/index.d.ts +2 -2
  92. package/dist/primitives/Pagination/pagination.variants.d.ts +3 -1
  93. package/dist/primitives/Popover/Popover.svelte +2 -6
  94. package/dist/primitives/Progress/Progress.svelte +17 -17
  95. package/dist/primitives/Progress/index.d.ts +8 -3
  96. package/dist/primitives/Progress/progress.variants.d.ts +3 -1
  97. package/dist/primitives/RadioGroup/RadioGroup.svelte +16 -16
  98. package/dist/primitives/RadioGroup/RadioItem.svelte +19 -19
  99. package/dist/primitives/RadioGroup/index.d.ts +3 -3
  100. package/dist/primitives/RadioGroup/radioGroup.variants.d.ts +4 -1
  101. package/dist/primitives/SegmentGroup/SegmentGroup.svelte +14 -11
  102. package/dist/primitives/SegmentGroup/SegmentItem.svelte +12 -11
  103. package/dist/primitives/SegmentGroup/index.d.ts +3 -3
  104. package/dist/primitives/SegmentGroup/segmentgroup.variants.d.ts +3 -1
  105. package/dist/primitives/Select/Select.svelte +31 -22
  106. package/dist/primitives/Select/index.d.ts +8 -3
  107. package/dist/primitives/Select/select.variants.d.ts +3 -1
  108. package/dist/primitives/Separator/Separator.svelte +2 -6
  109. package/dist/primitives/Sidebar/Sidebar.svelte +6 -9
  110. package/dist/primitives/Sidebar/index.d.ts +2 -2
  111. package/dist/primitives/Sidebar/sidebar.variants.d.ts +3 -1
  112. package/dist/primitives/Skeleton/Skeleton.svelte +7 -9
  113. package/dist/primitives/Skeleton/index.d.ts +3 -3
  114. package/dist/primitives/Skeleton/skeleton.variants.d.ts +3 -1
  115. package/dist/primitives/Skeleton/skeleton.variants.js +5 -6
  116. package/dist/primitives/Slider/Slider.svelte +19 -19
  117. package/dist/primitives/Slider/index.d.ts +8 -3
  118. package/dist/primitives/Slider/slider.variants.d.ts +3 -1
  119. package/dist/primitives/Spinner/Spinner.svelte +7 -9
  120. package/dist/primitives/Spinner/index.d.ts +5 -3
  121. package/dist/primitives/Spinner/spinner.variants.d.ts +3 -1
  122. package/dist/primitives/Stepper/Stepper.svelte +13 -18
  123. package/dist/primitives/Stepper/StepperStep.svelte +18 -19
  124. package/dist/primitives/Stepper/index.d.ts +5 -5
  125. package/dist/primitives/Stepper/stepper.variants.d.ts +3 -1
  126. package/dist/primitives/Tab/Tab.svelte +14 -17
  127. package/dist/primitives/Tab/TabItem.svelte +18 -19
  128. package/dist/primitives/Tab/TabPanel.svelte +10 -13
  129. package/dist/primitives/Tab/index.d.ts +7 -7
  130. package/dist/primitives/Tab/tab.variants.d.ts +3 -1
  131. package/dist/primitives/Textarea/Textarea.svelte +23 -23
  132. package/dist/primitives/Textarea/index.d.ts +7 -3
  133. package/dist/primitives/Textarea/textarea.variants.d.ts +3 -1
  134. package/dist/primitives/Toast/Toaster.svelte +5 -6
  135. package/dist/primitives/Toast/index.d.ts +2 -2
  136. package/dist/primitives/Toast/toast.variants.d.ts +3 -1
  137. package/dist/primitives/Toggle/Toggle.svelte +19 -19
  138. package/dist/primitives/Toggle/index.d.ts +7 -3
  139. package/dist/primitives/Toggle/toggle.variants.d.ts +3 -1
  140. package/dist/primitives/Toolbar/Toolbar.svelte +7 -9
  141. package/dist/primitives/Toolbar/index.d.ts +4 -3
  142. package/dist/primitives/Toolbar/toolbar.variants.d.ts +3 -1
  143. package/dist/primitives/Tooltip/Tooltip.svelte +7 -9
  144. package/dist/primitives/Tooltip/index.d.ts +2 -2
  145. package/dist/primitives/Tooltip/tooltip.variants.d.ts +3 -1
  146. package/dist/provider/blocks-context.d.ts +45 -0
  147. package/dist/provider/blocks-context.js +57 -0
  148. package/dist/provider/index.d.ts +1 -1
  149. package/dist/provider/index.js +1 -1
  150. package/dist/style/semantic.css +5 -0
  151. package/dist/utils/variants.d.ts +32 -0
  152. package/dist/utils/variants.js +26 -1
  153. package/package.json +3 -3
@@ -1,5 +1,5 @@
1
1
  import type { HTMLAttributes } from 'svelte/elements';
2
- import type { SkeletonVariants } from './skeleton.variants';
2
+ import type { SkeletonSlots, SkeletonVariants } from './skeleton.variants';
3
3
  /**
4
4
  * @description Placeholder loading animation that mimics content layout.
5
5
  * Use to reduce perceived loading time and prevent layout shift.
@@ -49,8 +49,8 @@ export interface SkeletonProps extends SkeletonVariants, HTMLAttributes<HTMLDivE
49
49
  class?: string;
50
50
  /** Strip all default tv() classes. Combine with `slotClasses` for full control. */
51
51
  unstyled?: boolean;
52
- /** Per-slot class overrides merged with (or replacing, when `unstyled`) tv() output. */
53
- slotClasses?: Partial<Record<'base' | 'wrapper', string>>;
52
+ /** Per-slot class overrides merged with (or replacing, when `unstyled`) tv() output. Slots: base | wrapper */
53
+ slotClasses?: Partial<Record<SkeletonSlots, string>>;
54
54
  /**
55
55
  * Apply a named preset registered via `<BlocksProvider presets={{ Skeleton: {...} }}>`.
56
56
  * Prefer this over `class` overrides when the requested look falls outside the
@@ -1,4 +1,4 @@
1
- import { type VariantProps } from '../../utils/variants';
1
+ import { type SlotNames, type VariantProps } from '../../utils/variants';
2
2
  export declare const skeletonVariants: (props?: import("../../utils/variants").TVProps<{
3
3
  variant: {
4
4
  text: {
@@ -49,3 +49,5 @@ export declare const skeletonVariants: (props?: import("../../utils/variants").T
49
49
  }) | undefined) => string;
50
50
  };
51
51
  export type SkeletonVariants = VariantProps<typeof skeletonVariants>;
52
+ /** Slot names derived from the tv() config — single source of truth for slotClasses. */
53
+ export type SkeletonSlots = SlotNames<typeof skeletonVariants>;
@@ -27,14 +27,13 @@ export const skeletonVariants = tv({
27
27
  base: 'animate-pulse motion-reduce:animate-none'
28
28
  },
29
29
  wave: {
30
- // `via-surface-hover` resolves to the same neutral-100 as the
31
- // base `surface-interactive` in light mode, leaving the shimmer
32
- // invisible. We use translucent-white in light and translucent-
33
- // light-gray in dark so the highlight reads regardless of theme.
30
+ // `via-surface-hover` would resolve to the same tone as the base
31
+ // `surface-interactive`, leaving the shimmer invisible. The
32
+ // `skeleton-shimmer` token is a translucent-white glint that stays
33
+ // mode-aware via light-dark() (lower alpha in dark) no `dark:` needed.
34
34
  base: [
35
35
  'animate-[blocks-shimmer_1.5s_ease-in-out_infinite]',
36
- 'bg-linear-to-r from-surface-interactive via-white/50 to-surface-interactive',
37
- 'dark:via-white/10',
36
+ 'bg-linear-to-r from-surface-interactive via-skeleton-shimmer to-surface-interactive',
38
37
  'bg-size-[200%_100%]',
39
38
  'motion-reduce:animate-none'
40
39
  ]
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">
2
2
  import { useBlocksI18n, mintRegistry } from '../..';
3
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
3
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
4
4
  import { useFormField } from '../../utils';
5
5
  import type { SliderProps } from './index';
6
- import { sliderVariants } from './slider.variants';
6
+ import { sliderVariants, type SliderVariants } from './slider.variants';
7
7
 
8
8
  const bt = useBlocksI18n();
9
9
 
@@ -39,13 +39,6 @@
39
39
 
40
40
  const blocksConfig = getBlocksConfig();
41
41
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
42
- const slotClasses = $derived(
43
- mergeSlotClasses(
44
- blocksConfig?.defaults?.Slider?.slotClasses,
45
- resolvePresetSlotClasses(blocksConfig?.presets, 'Slider', preset),
46
- slotClassesProp
47
- )
48
- );
49
42
 
50
43
  // ARIA wiring is shared with every form primitive — see XC-2.
51
44
  // Slider additionally injects a `statusId` into describedBy when the
@@ -232,16 +225,23 @@
232
225
  return '';
233
226
  });
234
227
 
235
- const styles = $derived(
236
- sliderVariants({
237
- intent,
238
- size,
239
- appearance,
240
- disabled: disabled || undefined,
241
- error: !!error || undefined,
242
- messageType: error ? 'error' : 'helper',
243
- rangeStatus: currentZoneStatus
244
- })
228
+ // Variant props feed both the tv() style computation and the slot-class
229
+ // cascade — extracted into one derived so `resolveSlotClasses` can match
230
+ // conditional `overrides` against the slider's active variants.
231
+ const variantProps: SliderVariants = $derived({
232
+ intent,
233
+ size,
234
+ appearance,
235
+ disabled: disabled || undefined,
236
+ error: !!error || undefined,
237
+ messageType: error ? 'error' : 'helper',
238
+ rangeStatus: currentZoneStatus
239
+ });
240
+
241
+ const styles = $derived(sliderVariants(variantProps));
242
+
243
+ const slotClasses = $derived(
244
+ resolveSlotClasses(blocksConfig, 'Slider', preset, variantProps, slotClassesProp)
245
245
  );
246
246
 
247
247
  // aria-describedby chain: error > helper, plus rangeStatus when active.
@@ -1,6 +1,6 @@
1
1
  import type { HTMLAttributes } from 'svelte/elements';
2
2
  import type { MintProp } from '../../mint';
3
- import type { SliderVariants } from './slider.variants';
3
+ import type { SliderSlots, SliderVariants } from './slider.variants';
4
4
  /** A labelled tick mark on the slider track. */
5
5
  export interface SliderMark {
6
6
  value: number;
@@ -114,8 +114,13 @@ export interface SliderProps extends Omit<SliderVariants, 'error' | 'rangeStatus
114
114
  class?: string;
115
115
  /** Remove all default tv() classes. */
116
116
  unstyled?: boolean;
117
- /** Per-slot class overrides. */
118
- slotClasses?: Partial<Record<'wrapper' | 'header' | 'label' | 'valueText' | 'base' | 'track' | 'range' | 'thumb' | 'mark' | 'boundaryTick' | 'rangeStatus' | 'rangeStatusIcon' | 'message', string>>;
117
+ /**
118
+ * Per-slot class overrides merged with tv() styles. Slots: wrapper (root
119
+ * what `class` also targets) | header | label | valueText | base (the
120
+ * interactive track container) | track | range | thumb | mark | boundaryTick
121
+ * | rangeStatus | rangeStatusIcon | message.
122
+ */
123
+ slotClasses?: Partial<Record<SliderSlots, string>>;
119
124
  /**
120
125
  * Apply a named preset registered via `<BlocksProvider presets={{ Slider: {...} }}>`.
121
126
  * Prefer this over `class` overrides when the requested look falls outside the
@@ -1,4 +1,4 @@
1
- import { type VariantProps } from '../../utils/variants';
1
+ import { type SlotNames, type VariantProps } from '../../utils/variants';
2
2
  export declare const sliderVariants: (props?: import("../../utils/variants").TVProps<{
3
3
  intent: {
4
4
  primary: {
@@ -254,3 +254,5 @@ export declare const sliderVariants: (props?: import("../../utils/variants").TVP
254
254
  }) | undefined) => string;
255
255
  };
256
256
  export type SliderVariants = VariantProps<typeof sliderVariants>;
257
+ /** Slot names derived from the `tv()` config above — single source of truth for `slotClasses`. */
258
+ export type SliderSlots = SlotNames<typeof sliderVariants>;
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
3
- import { spinnerVariants } from './spinner.variants';
2
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
3
+ import { spinnerVariants, type SpinnerVariants } from './spinner.variants';
4
4
  import type { SpinnerProps } from './index';
5
5
 
6
6
  let {
@@ -20,15 +20,13 @@
20
20
 
21
21
  const blocksConfig = getBlocksConfig();
22
22
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
23
+
24
+ const variantProps: SpinnerVariants = $derived({ variant, size, intent, speed });
25
+ const styles = $derived(spinnerVariants(variantProps));
26
+
23
27
  const slotClasses = $derived(
24
- mergeSlotClasses(
25
- blocksConfig?.defaults?.Spinner?.slotClasses,
26
- resolvePresetSlotClasses(blocksConfig?.presets, 'Spinner', preset),
27
- slotClassesProp
28
- )
28
+ resolveSlotClasses(blocksConfig, 'Spinner', preset, variantProps, slotClassesProp)
29
29
  );
30
-
31
- const styles = $derived(spinnerVariants({ variant, size, intent, speed }));
32
30
  </script>
33
31
 
34
32
  {#if visible}
@@ -1,6 +1,6 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
- import type { SpinnerVariants } from './spinner.variants';
3
+ import type { SpinnerSlots, SpinnerVariants } from './spinner.variants';
4
4
  /**
5
5
  * @description Animated loading indicator with multiple animation styles and semantic intents.
6
6
  *
@@ -39,8 +39,10 @@ export interface SpinnerProps extends SpinnerVariants, Omit<HTMLAttributes<HTMLD
39
39
  class?: string;
40
40
  /** Strip all default tv() classes. Combine with `slotClasses` for full control. */
41
41
  unstyled?: boolean;
42
- /** Per-slot class overrides merged with (or replacing, when `unstyled`) tv() output. */
43
- slotClasses?: Partial<Record<'base' | 'svg' | 'svgCircle' | 'svgPath' | 'dots' | 'dot' | 'pulse' | 'pulseCenter' | 'pulseRing' | 'ring' | 'ringElement' | 'bars' | 'bar' | 'content' | 'srOnly', string>>;
42
+ /** Per-slot class overrides merged with (or replacing, when `unstyled`) tv() output.
43
+ * Slots: base | svg | svgCircle | svgPath | dots | dot | pulse | pulseCenter |
44
+ * pulseRing | ring | ringElement | bars | bar | content | srOnly */
45
+ slotClasses?: Partial<Record<SpinnerSlots, string>>;
44
46
  /**
45
47
  * Apply a named preset registered via `<BlocksProvider presets={{ Spinner: {...} }}>`.
46
48
  * Prefer this over `class` overrides when the requested look falls outside the
@@ -1,4 +1,4 @@
1
- import { type VariantProps } from '../../utils/variants';
1
+ import { type SlotNames, type VariantProps } from '../../utils/variants';
2
2
  export declare const spinnerVariants: (props?: import("../../utils/variants").TVProps<{
3
3
  variant: {
4
4
  default: {};
@@ -226,3 +226,5 @@ export declare const spinnerVariants: (props?: import("../../utils/variants").TV
226
226
  }) | undefined) => string;
227
227
  };
228
228
  export type SpinnerVariants = VariantProps<typeof spinnerVariants>;
229
+ /** Slot names derived from the tv() config — single source of truth for slotClasses. */
230
+ export type SpinnerSlots = SlotNames<typeof spinnerVariants>;
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">
2
2
  import { useBlocksI18n } from '../..';
3
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
3
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
4
4
  import { getTierContext } from '../../utils';
5
- import { stepperVariants } from './stepper.variants';
5
+ import { stepperVariants, type StepperVariants } from './stepper.variants';
6
6
  import { setStepperContext } from './stepper.context';
7
7
  import type { StepperProps, StepperContext } from './index';
8
8
 
@@ -35,13 +35,6 @@
35
35
 
36
36
  const blocksConfig = getBlocksConfig();
37
37
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
38
- const slotClasses = $derived(
39
- mergeSlotClasses(
40
- blocksConfig?.defaults?.Stepper?.slotClasses,
41
- resolvePresetSlotClasses(blocksConfig?.presets, 'Stepper', preset),
42
- slotClassesProp
43
- )
44
- );
45
38
 
46
39
  const responsiveBreakpoint = $derived(
47
40
  responsive === true ? 640 : typeof responsive === 'object' ? (responsive.breakpoint ?? 640) : 0
@@ -66,15 +59,17 @@
66
59
  const effectiveOrientation = $derived(isCompact ? 'vertical' : orientation);
67
60
  const effectiveVariant = $derived(isCompact ? 'minimal' : variant);
68
61
 
69
- const styles = $derived(
70
- unstyled
71
- ? { base: () => '' }
72
- : stepperVariants({
73
- orientation: effectiveOrientation,
74
- size,
75
- variant: effectiveVariant,
76
- tier: effectiveTier
77
- })
62
+ const variantProps: StepperVariants = $derived({
63
+ orientation: effectiveOrientation,
64
+ size,
65
+ variant: effectiveVariant,
66
+ tier: effectiveTier
67
+ });
68
+
69
+ const styles = $derived(unstyled ? { base: () => '' } : stepperVariants(variantProps));
70
+
71
+ const slotClasses = $derived(
72
+ resolveSlotClasses(blocksConfig, 'Stepper', preset, variantProps, slotClassesProp)
78
73
  );
79
74
 
80
75
  let nextIdx = 0;
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
3
- import { stepperVariants } from './stepper.variants';
2
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
3
+ import { stepperVariants, type StepperVariants } from './stepper.variants';
4
4
  import { getStepperContext } from './stepper.context';
5
5
  import { resolveIcon } from '../../icons';
6
6
  import CheckIconDefault from '../../icons/CheckIcon.svelte';
@@ -29,13 +29,6 @@
29
29
 
30
30
  const blocksConfig = getBlocksConfig();
31
31
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
32
- const slotClasses = $derived(
33
- mergeSlotClasses(
34
- blocksConfig?.defaults?.StepperStep?.slotClasses,
35
- resolvePresetSlotClasses(blocksConfig?.presets, 'StepperStep', preset),
36
- slotClassesProp
37
- )
38
- );
39
32
 
40
33
  const ctx = getStepperContext();
41
34
  const stepIndex = ctx.registerStep();
@@ -60,6 +53,17 @@
60
53
  const isSeparatorComplete = $derived(stepIndex < ctx.activeStep);
61
54
  const isActive = $derived(stepIndex === ctx.activeStep);
62
55
 
56
+ const variantProps: StepperVariants = $derived({
57
+ orientation: ctx.orientation,
58
+ size: ctx.size,
59
+ variant: ctx.variant,
60
+ tier: ctx.tier,
61
+ stepState: derivedState,
62
+ clickable: isClickable || undefined,
63
+ stepDisabled: isDisabled || undefined,
64
+ separatorComplete: isSeparatorComplete || undefined
65
+ });
66
+
63
67
  const styles = $derived(
64
68
  unstyled
65
69
  ? {
@@ -73,16 +77,11 @@
73
77
  separator: () => '',
74
78
  content: () => ''
75
79
  }
76
- : stepperVariants({
77
- orientation: ctx.orientation,
78
- size: ctx.size,
79
- variant: ctx.variant,
80
- tier: ctx.tier,
81
- stepState: derivedState,
82
- clickable: isClickable || undefined,
83
- stepDisabled: isDisabled || undefined,
84
- separatorComplete: isSeparatorComplete || undefined
85
- })
80
+ : stepperVariants(variantProps)
81
+ );
82
+
83
+ const slotClasses = $derived(
84
+ resolveSlotClasses(blocksConfig, 'StepperStep', preset, variantProps, slotClassesProp)
86
85
  );
87
86
 
88
87
  function slot(key: keyof typeof styles, extra?: string) {
@@ -1,7 +1,7 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
3
  import type { InteractiveTier } from '../../utils';
4
- import type { StepperVariants } from './stepper.variants';
4
+ import type { StepperSlots, StepperVariants } from './stepper.variants';
5
5
  /** Context for Stepper ↔ StepperStep communication */
6
6
  export interface StepperContext {
7
7
  readonly activeStep: number;
@@ -91,8 +91,8 @@ export interface StepperProps extends Omit<StepperVariants, 'stepState' | 'click
91
91
  class?: string;
92
92
  /** Remove all default tv() classes. */
93
93
  unstyled?: boolean;
94
- /** Per-slot class overrides. */
95
- slotClasses?: Partial<Record<'base' | 'stepItem' | 'step' | 'indicatorColumn' | 'indicator' | 'labelGroup' | 'label' | 'description' | 'separator' | 'content', string>>;
94
+ /** Per-slot class overrides. Slots: base | stepItem | step | indicatorColumn | indicator | labelGroup | label | description | separator | content */
95
+ slotClasses?: Partial<Record<StepperSlots, string>>;
96
96
  /**
97
97
  * Apply a named preset registered via `<BlocksProvider presets={{ Stepper: {...} }}>`.
98
98
  * Prefer this over `class` overrides when the requested look falls outside the
@@ -138,8 +138,8 @@ export interface StepperStepProps extends Omit<HTMLAttributes<HTMLLIElement>, 'c
138
138
  class?: string;
139
139
  /** Remove all default tv() classes. */
140
140
  unstyled?: boolean;
141
- /** Per-slot class overrides. */
142
- slotClasses?: Partial<Record<'stepItem' | 'step' | 'indicatorColumn' | 'indicator' | 'labelGroup' | 'label' | 'description' | 'separator' | 'content', string>>;
141
+ /** Per-slot class overrides (subset of Stepper's, minus the root `base`). */
142
+ slotClasses?: Partial<Record<Exclude<StepperSlots, 'base'>, string>>;
143
143
  /**
144
144
  * Apply a named preset registered via `<BlocksProvider presets={{ StepperStep: {...} }}>`.
145
145
  * Prefer this over `class` overrides when the requested look falls outside the
@@ -1,4 +1,4 @@
1
- import { type VariantProps } from '../../utils/variants';
1
+ import { type SlotNames, type VariantProps } from '../../utils/variants';
2
2
  export declare const stepperVariants: (props?: import("../../utils/variants").TVProps<{
3
3
  tier: {
4
4
  commit: {
@@ -231,3 +231,5 @@ export declare const stepperVariants: (props?: import("../../utils/variants").TV
231
231
  }) | undefined) => string;
232
232
  };
233
233
  export type StepperVariants = VariantProps<typeof stepperVariants>;
234
+ /** Slot names derived from the tv() config — single source of truth for slotClasses. */
235
+ export type StepperSlots = SlotNames<typeof stepperVariants>;
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">
2
2
  import { SvelteMap } from 'svelte/reactivity';
3
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
3
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
4
4
  import { getTierContext } from '../../utils';
5
- import { tabVariants } from './tab.variants';
5
+ import { tabVariants, type TabVariants } from './tab.variants';
6
6
  import { setTabContext } from './tab.context';
7
7
  import type { TabContext, TabProps } from './index';
8
8
 
@@ -34,13 +34,6 @@
34
34
 
35
35
  const blocksConfig = getBlocksConfig();
36
36
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
37
- const slotClasses = $derived(
38
- mergeSlotClasses(
39
- blocksConfig?.defaults?.Tab?.slotClasses,
40
- resolvePresetSlotClasses(blocksConfig?.presets, 'Tab', preset),
41
- slotClassesProp
42
- )
43
- );
44
37
 
45
38
  let tabListElement = $state<HTMLDivElement>();
46
39
  let indicatorStyle = $state('');
@@ -51,14 +44,18 @@
51
44
 
52
45
  const registeredTabs = new SvelteMap<string, HTMLElement>();
53
46
 
54
- const styles = $derived(
55
- tabVariants({
56
- variant,
57
- orientation,
58
- size,
59
- tier: effectiveTier,
60
- fullWidth
61
- })
47
+ const variantProps: TabVariants = $derived({
48
+ variant,
49
+ orientation,
50
+ size,
51
+ tier: effectiveTier,
52
+ fullWidth
53
+ });
54
+
55
+ const styles = $derived(tabVariants(variantProps));
56
+
57
+ const slotClasses = $derived(
58
+ resolveSlotClasses(blocksConfig, 'Tab', preset, variantProps, slotClassesProp)
62
59
  );
63
60
 
64
61
  function updateIndicator() {
@@ -1,10 +1,10 @@
1
1
  <script lang="ts">
2
2
  import { onMount } from 'svelte';
3
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
3
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
4
4
  import { mintRegistry } from '../..';
5
5
  import type { TabItemProps } from './index';
6
6
  import { getTabContext } from './tab.context';
7
- import { tabVariants } from './tab.variants';
7
+ import { tabVariants, type TabVariants } from './tab.variants';
8
8
 
9
9
  let {
10
10
  value,
@@ -21,13 +21,6 @@
21
21
 
22
22
  const blocksConfig = getBlocksConfig();
23
23
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
24
- const slotClasses = $derived(
25
- mergeSlotClasses(
26
- blocksConfig?.defaults?.TabItem?.slotClasses,
27
- resolvePresetSlotClasses(blocksConfig?.presets, 'TabItem', preset),
28
- slotClassesProp
29
- )
30
- );
31
24
 
32
25
  let tabItemElement = $state<HTMLButtonElement>();
33
26
  const tabContext = getTabContext();
@@ -39,13 +32,17 @@
39
32
  const isActive = $derived(tabContext.isActive(value));
40
33
  const isDisabled = $derived(disabled || tabContext.disabled);
41
34
 
42
- const styles = $derived(
43
- tabVariants({
44
- variant: tabContext.variant,
45
- orientation: tabContext.orientation,
46
- size: tabContext.size,
47
- tier: tabContext.tier
48
- })
35
+ const variantProps: TabVariants = $derived({
36
+ variant: tabContext.variant,
37
+ orientation: tabContext.orientation,
38
+ size: tabContext.size,
39
+ tier: tabContext.tier
40
+ });
41
+
42
+ const styles = $derived(tabVariants(variantProps));
43
+
44
+ const slotClasses = $derived(
45
+ resolveSlotClasses(blocksConfig, 'TabItem', preset, variantProps, slotClassesProp)
49
46
  );
50
47
 
51
48
  onMount(() => {
@@ -85,17 +82,19 @@
85
82
  {...restProps}
86
83
  >
87
84
  {#if icon}
88
- <span class={unstyled ? '' : styles.icon()}>
85
+ <span class={unstyled ? (slotClasses?.icon ?? '') : styles.icon({ class: slotClasses?.icon })}>
89
86
  {@render icon()}
90
87
  </span>
91
88
  {/if}
92
89
 
93
- <span class={unstyled ? '' : styles.label()}>
90
+ <span class={unstyled ? (slotClasses?.label ?? '') : styles.label({ class: slotClasses?.label })}>
94
91
  {@render children()}
95
92
  </span>
96
93
 
97
94
  {#if badge}
98
- <span class={unstyled ? '' : styles.badge()}>
95
+ <span
96
+ class={unstyled ? (slotClasses?.badge ?? '') : styles.badge({ class: slotClasses?.badge })}
97
+ >
99
98
  {@render badge()}
100
99
  </span>
101
100
  {/if}
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">
2
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
2
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
3
3
  import type { TabPanelProps } from './index';
4
4
  import { getTabContext } from './tab.context';
5
- import { tabVariants } from './tab.variants';
5
+ import { tabVariants, type TabVariants } from './tab.variants';
6
6
  import { fade } from 'svelte/transition';
7
7
 
8
8
  let {
@@ -20,13 +20,6 @@
20
20
 
21
21
  const blocksConfig = getBlocksConfig();
22
22
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
23
- const slotClasses = $derived(
24
- mergeSlotClasses(
25
- blocksConfig?.defaults?.TabPanel?.slotClasses,
26
- resolvePresetSlotClasses(blocksConfig?.presets, 'TabPanel', preset),
27
- slotClassesProp
28
- )
29
- );
30
23
 
31
24
  const tabContext = getTabContext();
32
25
 
@@ -48,10 +41,14 @@
48
41
  return false;
49
42
  });
50
43
 
51
- const styles = $derived(
52
- tabVariants({
53
- size: tabContext.size
54
- })
44
+ const variantProps: TabVariants = $derived({
45
+ size: tabContext.size
46
+ });
47
+
48
+ const styles = $derived(tabVariants(variantProps));
49
+
50
+ const slotClasses = $derived(
51
+ resolveSlotClasses(blocksConfig, 'TabPanel', preset, variantProps, slotClassesProp)
55
52
  );
56
53
  </script>
57
54
 
@@ -2,7 +2,7 @@ import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
3
  import type { MintProp } from '../../mint';
4
4
  import type { InteractiveTier } from '../../utils';
5
- import type { TabVariants } from './tab.variants';
5
+ import type { TabSlots, TabVariants } from './tab.variants';
6
6
  export interface TabContext {
7
7
  registerTab: (value: string, element: HTMLElement) => () => void;
8
8
  selectTab: (value: string) => void;
@@ -53,8 +53,8 @@ interface TabBaseProps extends Omit<TabVariants, 'orientation' | 'fullWidth'>, O
53
53
  class?: string;
54
54
  /** Strip all default tv() styles from the container and children. */
55
55
  unstyled?: boolean;
56
- /** Per-slot class overrides merged with (or replacing when unstyled) tv() styles. */
57
- slotClasses?: Partial<Record<'base' | 'list' | 'trigger' | 'panel' | 'indicator', string>>;
56
+ /** Per-slot class overrides merged with (or replacing when unstyled) tv() styles. Slots: base | list | trigger | icon | label | badge | panel | indicator */
57
+ slotClasses?: Partial<Record<TabSlots, string>>;
58
58
  /**
59
59
  * Apply a named preset registered via `<BlocksProvider presets={{ Tab: {...} }}>`.
60
60
  * Prefer this over `class` overrides when the requested look falls outside the
@@ -152,8 +152,8 @@ export interface TabItemProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'c
152
152
  class?: string;
153
153
  /** Strip default tv() styles from this trigger. */
154
154
  unstyled?: boolean;
155
- /** Per-slot class overrides for the trigger. */
156
- slotClasses?: Partial<Record<'trigger', string>>;
155
+ /** Per-slot class overrides for the trigger. Slots (subset of Tab's): trigger | icon | label | badge */
156
+ slotClasses?: Partial<Record<Extract<TabSlots, 'trigger' | 'icon' | 'label' | 'badge'>, string>>;
157
157
  /**
158
158
  * Apply a named preset registered via `<BlocksProvider presets={{ TabItem: {...} }}>`.
159
159
  * Prefer this over `class` overrides when the requested look falls outside the
@@ -185,8 +185,8 @@ export interface TabPanelProps extends Omit<HTMLAttributes<HTMLDivElement>, 'chi
185
185
  class?: string;
186
186
  /** Strip default tv() styles from this panel. */
187
187
  unstyled?: boolean;
188
- /** Per-slot class overrides for the panel. */
189
- slotClasses?: Partial<Record<'panel', string>>;
188
+ /** Per-slot class overrides for the panel. Slot (subset of Tab's): panel */
189
+ slotClasses?: Partial<Record<Extract<TabSlots, 'panel'>, string>>;
190
190
  /**
191
191
  * Apply a named preset registered via `<BlocksProvider presets={{ TabPanel: {...} }}>`.
192
192
  * Prefer this over `class` overrides when the requested look falls outside the
@@ -1,4 +1,4 @@
1
- import { type VariantProps } from '../../utils/variants';
1
+ import { type SlotNames, type VariantProps } from '../../utils/variants';
2
2
  export declare const tabVariants: (props?: import("../../utils/variants").TVProps<{
3
3
  variant: {
4
4
  line: {
@@ -143,3 +143,5 @@ export declare const tabVariants: (props?: import("../../utils/variants").TVProp
143
143
  }) | undefined) => string;
144
144
  };
145
145
  export type TabVariants = VariantProps<typeof tabVariants>;
146
+ /** Slot names derived from the tv() config — single source of truth for slotClasses. */
147
+ export type TabSlots = SlotNames<typeof tabVariants>;