@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,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { untrack } from 'svelte';
3
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
3
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
4
4
  import {
5
5
  autoUpdate,
6
6
  computePosition,
@@ -51,11 +51,7 @@
51
51
  const blocksConfig = getBlocksConfig();
52
52
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
53
53
  const slotClasses = $derived(
54
- mergeSlotClasses(
55
- blocksConfig?.defaults?.Popover?.slotClasses,
56
- resolvePresetSlotClasses(blocksConfig?.presets, 'Popover', preset),
57
- slotClassesProp
58
- )
54
+ resolveSlotClasses(blocksConfig, 'Popover', preset, { size }, slotClassesProp)
59
55
  );
60
56
 
61
57
  let internalTriggerElement = $state<HTMLElement | null>(null);
@@ -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 { useBlocksI18n } from '../..';
4
4
  import type { ProgressProps } from './index';
5
- import { progressVariants } from './progress.variants';
5
+ import { progressVariants, type ProgressVariants } from './progress.variants';
6
6
 
7
7
  const bt = useBlocksI18n();
8
8
 
@@ -30,13 +30,6 @@
30
30
 
31
31
  const blocksConfig = getBlocksConfig();
32
32
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
33
- const slotClasses = $derived(
34
- mergeSlotClasses(
35
- blocksConfig?.defaults?.Progress?.slotClasses,
36
- resolvePresetSlotClasses(blocksConfig?.presets, 'Progress', preset),
37
- slotClassesProp
38
- )
39
- );
40
33
 
41
34
  const isIndeterminate = $derived(indeterminateProp || value === undefined);
42
35
  const clampedValue = $derived(value !== undefined ? Math.min(Math.max(value, min), max) : 0);
@@ -47,14 +40,21 @@
47
40
  formatValue ? formatValue(clampedValue, max) : defaultFormat(clampedValue, max)
48
41
  );
49
42
 
50
- const styles = $derived(
51
- progressVariants({
52
- intent,
53
- size,
54
- indeterminate: isIndeterminate || undefined,
55
- striped: striped || undefined,
56
- animated: animated || undefined
57
- })
43
+ // Variant props feed both the tv() style computation and the slot-class
44
+ // cascade — extracted into one derived so `resolveSlotClasses` can match
45
+ // conditional `overrides` against the progress bar's active variants.
46
+ const variantProps: ProgressVariants = $derived({
47
+ intent,
48
+ size,
49
+ indeterminate: isIndeterminate || undefined,
50
+ striped: striped || undefined,
51
+ animated: animated || undefined
52
+ });
53
+
54
+ const styles = $derived(progressVariants(variantProps));
55
+
56
+ const slotClasses = $derived(
57
+ resolveSlotClasses(blocksConfig, 'Progress', preset, variantProps, slotClassesProp)
58
58
  );
59
59
 
60
60
  const circularRadius = $derived((circularSize - strokeWidth) / 2);
@@ -1,5 +1,5 @@
1
1
  import type { HTMLAttributes } from 'svelte/elements';
2
- import type { ProgressVariants } from './progress.variants';
2
+ import type { ProgressSlots, ProgressVariants } from './progress.variants';
3
3
  /**
4
4
  * @description Progress indicator for determinate and indeterminate loading states.
5
5
  * Supports linear bar and circular ring variants with semantic intents and animation.
@@ -45,8 +45,13 @@ export interface ProgressProps extends ProgressVariants, Omit<HTMLAttributes<HTM
45
45
  class?: string;
46
46
  /** Remove all default tv() classes. */
47
47
  unstyled?: boolean;
48
- /** Per-slot class overrides merged with tv() styles. */
49
- slotClasses?: Partial<Record<'wrapper' | 'header' | 'label' | 'valueText' | 'track' | 'fill' | 'circularWrapper' | 'circularTrack' | 'circularFill' | 'circularLabel', string>>;
48
+ /**
49
+ * Per-slot class overrides merged with tv() styles. Slots: wrapper (linear
50
+ * root — what `class` targets in linear shape) | header | label | valueText |
51
+ * track | fill | circularWrapper (circular root — what `class` targets in
52
+ * circular shape) | circularTrack | circularFill | circularLabel.
53
+ */
54
+ slotClasses?: Partial<Record<ProgressSlots, string>>;
50
55
  /**
51
56
  * Apply a named preset registered via `<BlocksProvider presets={{ Progress: {...} }}>`.
52
57
  * 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 progressVariants: (props?: import("../../utils/variants").TVProps<{
3
3
  intent: {
4
4
  primary: {
@@ -164,3 +164,5 @@ export declare const progressVariants: (props?: import("../../utils/variants").T
164
164
  }) | undefined) => string;
165
165
  };
166
166
  export type ProgressVariants = VariantProps<typeof progressVariants>;
167
+ /** Slot names derived from the `tv()` config above — single source of truth for `slotClasses`. */
168
+ export type ProgressSlots = SlotNames<typeof progressVariants>;
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">
2
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
2
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
3
3
  import { getTierContext, useFormField } from '../../utils';
4
4
  import type { RadioGroupProps } from './index';
5
5
  import { setRadioGroupContext } from './radioGroup.context';
6
- import { radioGroupVariants } from './radioGroup.variants';
6
+ import { radioGroupVariants, type RadioGroupVariants } from './radioGroup.variants';
7
7
 
8
8
  let {
9
9
  children,
@@ -40,13 +40,6 @@
40
40
 
41
41
  const blocksConfig = getBlocksConfig();
42
42
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
43
- const slotClasses = $derived(
44
- mergeSlotClasses(
45
- blocksConfig?.defaults?.RadioGroup?.slotClasses,
46
- resolvePresetSlotClasses(blocksConfig?.presets, 'RadioGroup', preset),
47
- slotClassesProp
48
- )
49
- );
50
43
 
51
44
  const groupId = $derived(id || `radiogroup-${propsId}`);
52
45
  const labelId = $derived(label ? `${groupId}-label` : undefined);
@@ -59,13 +52,20 @@
59
52
  disabled
60
53
  }));
61
54
 
62
- const styles = $derived(
63
- radioGroupVariants({
64
- orientation,
65
- required: required || undefined,
66
- error: !!error || undefined,
67
- disabled: disabled || undefined
68
- })
55
+ // Variant props feed both the tv() style computation and the slot-class
56
+ // cascade — extracted into one derived so `resolveSlotClasses` can match
57
+ // conditional `overrides` against the group's active variants.
58
+ const variantProps: RadioGroupVariants = $derived({
59
+ orientation,
60
+ required: required || undefined,
61
+ error: !!error || undefined,
62
+ disabled: disabled || undefined
63
+ });
64
+
65
+ const styles = $derived(radioGroupVariants(variantProps));
66
+
67
+ const slotClasses = $derived(
68
+ resolveSlotClasses(blocksConfig, 'RadioGroup', preset, variantProps, slotClassesProp)
69
69
  );
70
70
 
71
71
  function select(itemValue: string) {
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">
2
2
  import { mintRegistry } from '../..';
3
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
3
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
4
4
  import type { RadioItemProps } from './index';
5
5
  import { getRadioGroupContext } from './radioGroup.context';
6
- import { radioItemVariants } from './radioGroup.variants';
6
+ import { radioItemVariants, type RadioItemVariants } from './radioGroup.variants';
7
7
 
8
8
  let {
9
9
  value,
@@ -23,13 +23,6 @@
23
23
 
24
24
  const blocksConfig = getBlocksConfig();
25
25
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
26
- const slotClasses = $derived(
27
- mergeSlotClasses(
28
- blocksConfig?.defaults?.RadioItem?.slotClasses,
29
- resolvePresetSlotClasses(blocksConfig?.presets, 'RadioItem', preset),
30
- slotClassesProp
31
- )
32
- );
33
26
 
34
27
  const ctx = getRadioGroupContext();
35
28
 
@@ -37,16 +30,23 @@
37
30
  const isDisabled = $derived(ctx.disabled || disabledProp);
38
31
  const dataState = $derived(isChecked ? 'checked' : 'unchecked');
39
32
 
40
- const styles = $derived(
41
- radioItemVariants({
42
- size: ctx.size,
43
- intent: ctx.intent,
44
- variant: ctx.variant,
45
- tier: ctx.tier,
46
- checked: isChecked,
47
- disabled: isDisabled || undefined,
48
- error: ctx.error || undefined
49
- })
33
+ // Variant props feed both the tv() style computation and the slot-class
34
+ // cascade — extracted into one derived so `resolveSlotClasses` can match
35
+ // conditional `overrides` against the item's active variants.
36
+ const variantProps: RadioItemVariants = $derived({
37
+ size: ctx.size,
38
+ intent: ctx.intent,
39
+ variant: ctx.variant,
40
+ tier: ctx.tier,
41
+ checked: isChecked,
42
+ disabled: isDisabled || undefined,
43
+ error: ctx.error || undefined
44
+ });
45
+
46
+ const styles = $derived(radioItemVariants(variantProps));
47
+
48
+ const slotClasses = $derived(
49
+ resolveSlotClasses(blocksConfig, 'RadioItem', preset, variantProps, slotClassesProp)
50
50
  );
51
51
 
52
52
  let controlElement = $state<HTMLElement>();
@@ -2,7 +2,7 @@ import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes, HTMLInputAttributes } from 'svelte/elements';
3
3
  import type { MintProp } from '../../mint';
4
4
  import type { InteractiveTier } from '../../utils';
5
- import type { RadioItemVariants } from './radioGroup.variants';
5
+ import type { RadioGroupSlots, RadioItemSlots, RadioItemVariants } from './radioGroup.variants';
6
6
  /**
7
7
  * @description Accessible radio group for single-option selection with semantic intents and form integration.
8
8
  * Uses native radio inputs for correct form behavior and ARIA semantics with keyboard navigation.
@@ -60,7 +60,7 @@ export interface RadioGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, 'c
60
60
  /** Remove all default tv() classes. Only user-provided classes apply. */
61
61
  unstyled?: boolean;
62
62
  /** Per-slot class overrides merged with tv() styles. */
63
- slotClasses?: Partial<Record<'root' | 'group' | 'label' | 'message', string>>;
63
+ slotClasses?: Partial<Record<RadioGroupSlots, string>>;
64
64
  /**
65
65
  * Apply a named preset registered via `<BlocksProvider presets={{ RadioGroup: {...} }}>`.
66
66
  * Prefer this over `class` overrides when the requested look falls outside the
@@ -110,7 +110,7 @@ export interface RadioItemProps extends Omit<HTMLInputAttributes, 'type' | 'size
110
110
  /** Remove all default tv() classes for this item. */
111
111
  unstyled?: boolean;
112
112
  /** Per-slot class overrides for this item. */
113
- slotClasses?: Partial<Record<'item' | 'indicator' | 'dot' | 'label' | 'description', string>>;
113
+ slotClasses?: Partial<Record<RadioItemSlots, string>>;
114
114
  /**
115
115
  * Apply a named preset registered via `<BlocksProvider presets={{ RadioItem: {...} }}>`.
116
116
  * 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 radioGroupVariants: (props?: import("../../utils/variants").TVProps<{
3
3
  orientation: {
4
4
  horizontal: {
@@ -190,3 +190,6 @@ export declare const radioItemVariants: (props?: import("../../utils/variants").
190
190
  };
191
191
  export type RadioGroupVariants = VariantProps<typeof radioGroupVariants>;
192
192
  export type RadioItemVariants = VariantProps<typeof radioItemVariants>;
193
+ /** Slot names derived from the `tv()` config above — single source of truth for `slotClasses`. */
194
+ export type RadioGroupSlots = SlotNames<typeof radioGroupVariants>;
195
+ export type RadioItemSlots = SlotNames<typeof radioItemVariants>;
@@ -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 { segmentGroupVariants } from './segmentgroup.variants';
5
+ import { segmentGroupVariants, type SegmentGroupVariants } from './segmentgroup.variants';
6
6
  import { setSegmentGroupContext } from './segmentGroup.context';
7
7
  import type { SegmentGroupContext, SegmentGroupProps } from './index';
8
8
 
@@ -32,13 +32,6 @@
32
32
 
33
33
  const blocksConfig = getBlocksConfig();
34
34
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
35
- const slotClasses = $derived(
36
- mergeSlotClasses(
37
- blocksConfig?.defaults?.SegmentGroup?.slotClasses,
38
- resolvePresetSlotClasses(blocksConfig?.presets, 'SegmentGroup', preset),
39
- slotClassesProp
40
- )
41
- );
42
35
 
43
36
  let containerElement = $state<HTMLDivElement>();
44
37
  let indicatorStyle = $state('opacity: 0;');
@@ -46,8 +39,18 @@
46
39
  // reactive so the indicator updates when new items register.
47
40
  const registeredItems = new SvelteMap<string, HTMLElement>();
48
41
 
49
- const styles = $derived(
50
- segmentGroupVariants({ size, appearance, tier: effectiveTier, fullWidth, disabled })
42
+ const variantProps: SegmentGroupVariants = $derived({
43
+ size,
44
+ appearance,
45
+ tier: effectiveTier,
46
+ fullWidth,
47
+ disabled
48
+ });
49
+
50
+ const styles = $derived(segmentGroupVariants(variantProps));
51
+
52
+ const slotClasses = $derived(
53
+ resolveSlotClasses(blocksConfig, 'SegmentGroup', preset, variantProps, slotClassesProp)
51
54
  );
52
55
 
53
56
  function updateIndicator() {
@@ -1,8 +1,8 @@
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
- import { segmentGroupVariants } from './segmentgroup.variants';
5
+ import { segmentGroupVariants, type SegmentGroupVariants } from './segmentgroup.variants';
6
6
  import { getSegmentGroupContext } from './segmentGroup.context';
7
7
  import type { SegmentItemProps } from './index';
8
8
 
@@ -20,21 +20,22 @@
20
20
  const ctx = getSegmentGroupContext();
21
21
  const blocksConfig = getBlocksConfig();
22
22
  const unstyled = $derived(unstyledProp || ctx.unstyled || blocksConfig?.unstyled || false);
23
- const slotClasses = $derived(
24
- mergeSlotClasses(
25
- blocksConfig?.defaults?.SegmentItem?.slotClasses,
26
- resolvePresetSlotClasses(blocksConfig?.presets, 'SegmentItem', preset),
27
- slotClassesProp
28
- )
29
- );
30
23
 
31
24
  let itemElement = $state<HTMLButtonElement>();
32
25
 
33
26
  const isActive = $derived(ctx.isActive(value));
34
27
  const isDisabled = $derived(disabled || ctx.disabled);
35
28
 
36
- const styles = $derived(
37
- segmentGroupVariants({ size: ctx.size, appearance: ctx.appearance, tier: ctx.tier })
29
+ const variantProps: SegmentGroupVariants = $derived({
30
+ size: ctx.size,
31
+ appearance: ctx.appearance,
32
+ tier: ctx.tier
33
+ });
34
+
35
+ const styles = $derived(segmentGroupVariants(variantProps));
36
+
37
+ const slotClasses = $derived(
38
+ resolveSlotClasses(blocksConfig, 'SegmentItem', preset, variantProps, slotClassesProp)
38
39
  );
39
40
 
40
41
  onMount(() => {
@@ -2,7 +2,7 @@ import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes, HTMLButtonAttributes } from 'svelte/elements';
3
3
  import type { MintProp } from '../../mint';
4
4
  import type { InteractiveTier } from '../../utils';
5
- import type { SegmentGroupVariants } from './segmentgroup.variants';
5
+ import type { SegmentGroupSlots, SegmentGroupVariants } from './segmentgroup.variants';
6
6
  /**
7
7
  * Reactive context exposed to child SegmentItem components.
8
8
  */
@@ -49,7 +49,7 @@ export interface SegmentGroupProps extends SegmentGroupVariants, Omit<HTMLAttrib
49
49
  /** Remove all default tv() classes. */
50
50
  unstyled?: boolean;
51
51
  /** Per-slot class overrides merged with tv() styles. */
52
- slotClasses?: Partial<Record<'base' | 'indicator' | 'item', string>>;
52
+ slotClasses?: Partial<Record<SegmentGroupSlots, string>>;
53
53
  /**
54
54
  * Apply a named preset registered via `<BlocksProvider presets={{ SegmentGroup: {...} }}>`.
55
55
  * Prefer this over `class` overrides when the requested look falls outside the
@@ -93,7 +93,7 @@ export interface SegmentItemProps extends Omit<HTMLButtonAttributes, 'children'>
93
93
  /** Remove all default tv() classes. */
94
94
  unstyled?: boolean;
95
95
  /** Per-slot class overrides merged with tv() styles. */
96
- slotClasses?: Partial<Record<'item', string>>;
96
+ slotClasses?: Partial<Record<Extract<SegmentGroupSlots, 'item'>, string>>;
97
97
  /**
98
98
  * Apply a named preset registered via `<BlocksProvider presets={{ SegmentItem: {...} }}>`.
99
99
  * 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 segmentGroupVariants: (props?: import("../../utils/variants").TVProps<{
3
3
  tier: {
4
4
  commit: {
@@ -78,3 +78,5 @@ export declare const segmentGroupVariants: (props?: import("../../utils/variants
78
78
  }) | undefined) => string;
79
79
  };
80
80
  export type SegmentGroupVariants = VariantProps<typeof segmentGroupVariants>;
81
+ /** Slot names derived from the `tv()` config above — single source of truth for `slotClasses`. */
82
+ export type SegmentGroupSlots = SlotNames<typeof segmentGroupVariants>;
@@ -1,13 +1,13 @@
1
1
  <script lang="ts" generics="T extends string | number | boolean = string">
2
2
  import { useBlocksI18n, mintRegistry } from '../..';
3
3
  import { useFormField, getTierContext, useFloatingListbox } from '../../utils';
4
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
4
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
5
5
  import { resolveIcon } from '../../icons';
6
6
  import ChevronDownIconDefault from '../../icons/ChevronDownIcon.svelte';
7
7
  import CheckIconDefault from '../../icons/CheckIcon.svelte';
8
8
  import CloseIconDefault from '../../icons/CloseIcon.svelte';
9
9
  import type { SelectProps, SelectOption } from './index';
10
- import { selectVariants } from './select.variants';
10
+ import { selectVariants, type SelectVariants } from './select.variants';
11
11
 
12
12
  const bt = useBlocksI18n();
13
13
 
@@ -91,13 +91,6 @@
91
91
 
92
92
  const blocksConfig = getBlocksConfig();
93
93
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
94
- const slotClasses = $derived(
95
- mergeSlotClasses(
96
- blocksConfig?.defaults?.Select?.slotClasses,
97
- resolvePresetSlotClasses(blocksConfig?.presets, 'Select', preset),
98
- slotClassesProp
99
- )
100
- );
101
94
 
102
95
  // ARIA wiring is shared with every form primitive — see XC-2.
103
96
  // All IDs are `$derived` so they react if the consumer changes `idProp`
@@ -186,17 +179,24 @@
186
179
  /** Backward-compatible single-mode accessor. */
187
180
  const selectedOption = $derived(multiple ? null : (selectedOptions[0] ?? null));
188
181
 
189
- const styles = $derived(
190
- selectVariants({
191
- tier: effectiveTier,
192
- variant,
193
- size,
194
- open: open || undefined,
195
- disabled: disabled || undefined,
196
- error: !!error || undefined,
197
- required: required || undefined,
198
- messageType: error ? 'error' : 'helper'
199
- })
182
+ // Variant props feed both the tv() style computation and the slot-class
183
+ // cascade — extracted into one derived so `resolveSlotClasses` can match
184
+ // conditional `overrides` against the select's active variants.
185
+ const variantProps: SelectVariants = $derived({
186
+ tier: effectiveTier,
187
+ variant,
188
+ size,
189
+ open: open || undefined,
190
+ disabled: disabled || undefined,
191
+ error: !!error || undefined,
192
+ required: required || undefined,
193
+ messageType: error ? 'error' : 'helper'
194
+ });
195
+
196
+ const styles = $derived(selectVariants(variantProps));
197
+
198
+ const slotClasses = $derived(
199
+ resolveSlotClasses(blocksConfig, 'Select', preset, variantProps, slotClassesProp)
200
200
  );
201
201
 
202
202
  $effect(() => {
@@ -581,7 +581,12 @@
581
581
  <CheckIcon />
582
582
  </span>
583
583
  {/if}
584
- <span class={unstyled ? '' : 'flex-1 truncate text-left'}>{option.label}</span>
584
+ <span
585
+ class={unstyled
586
+ ? (slotClasses?.optionLabel ?? '')
587
+ : styles.optionLabel({ class: slotClasses?.optionLabel })}
588
+ >{option.label}</span
589
+ >
585
590
  {#if effectiveIndicator === 'checkmark'}
586
591
  <CheckIcon
587
592
  class={unstyled
@@ -641,7 +646,11 @@
641
646
  <CheckIcon />
642
647
  </span>
643
648
  {/if}
644
- <span class={unstyled ? '' : 'flex-1 truncate text-left'}>{option.label}</span>
649
+ <span
650
+ class={unstyled
651
+ ? (slotClasses?.optionLabel ?? '')
652
+ : styles.optionLabel({ class: slotClasses?.optionLabel })}>{option.label}</span
653
+ >
645
654
  {#if effectiveIndicator === 'checkmark'}
646
655
  <CheckIcon
647
656
  class={unstyled
@@ -1,7 +1,7 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
3
  import type { MintProp } from '../../mint';
4
- import type { SelectVariants } from './select.variants';
4
+ import type { SelectSlots, SelectVariants } from './select.variants';
5
5
  /**
6
6
  * Primitive value types accepted by Select / Combobox options.
7
7
  * Strings are the default; numbers and booleans cover form fields
@@ -235,8 +235,13 @@ interface SelectBaseProps<T extends SelectValue = string> extends Omit<SelectVar
235
235
  class?: string;
236
236
  /** Remove all default tv() classes. */
237
237
  unstyled?: boolean;
238
- /** Per-slot class overrides merged with tv() styles. */
239
- slotClasses?: Partial<Record<'wrapper' | 'base' | 'trigger' | 'triggerText' | 'placeholder' | 'chevron' | 'clear' | 'listbox' | 'option' | 'optionCheck' | 'optionCheckbox' | 'group' | 'groupLabel' | 'label' | 'message', string>>;
238
+ /**
239
+ * Per-slot class overrides merged with tv() styles. Slots: wrapper (root
240
+ * what `class` also targets) | base | trigger | triggerText | placeholder |
241
+ * chevron | clear | listbox | option | optionLabel | optionCheck |
242
+ * optionCheckbox | group | groupLabel | label | message.
243
+ */
244
+ slotClasses?: Partial<Record<SelectSlots, string>>;
240
245
  /**
241
246
  * Apply a named preset registered via `<BlocksProvider presets={{ Select: {...} }}>`.
242
247
  * 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 selectVariants: (props?: import("../../utils/variants").TVProps<{
3
3
  tier: {
4
4
  modify: {
@@ -311,3 +311,5 @@ export declare const selectVariants: (props?: import("../../utils/variants").TVP
311
311
  }) | undefined) => string;
312
312
  };
313
313
  export type SelectVariants = VariantProps<typeof selectVariants>;
314
+ /** Slot names derived from the `tv()` config above — single source of truth for `slotClasses`. */
315
+ export type SelectSlots = SlotNames<typeof selectVariants>;
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
2
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
3
3
  import { separatorVariants } from './separator.variants';
4
4
  import type { SeparatorProps } from './index';
5
5
 
@@ -17,11 +17,7 @@
17
17
  const blocksConfig = getBlocksConfig();
18
18
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
19
19
  const slotClasses = $derived(
20
- mergeSlotClasses(
21
- blocksConfig?.defaults?.Separator?.slotClasses,
22
- resolvePresetSlotClasses(blocksConfig?.presets, 'Separator', preset),
23
- slotClassesProp
24
- )
20
+ resolveSlotClasses(blocksConfig, 'Separator', preset, { orientation, size }, slotClassesProp)
25
21
  );
26
22
 
27
23
  const classes = $derived(
@@ -4,8 +4,8 @@
4
4
  import { quintOut } from 'svelte/easing';
5
5
  import { fade } from 'svelte/transition';
6
6
  import type { SidebarProps } from './index';
7
- import { sidebarVariants } from './sidebar.variants';
8
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
7
+ import { sidebarVariants, type SidebarVariants } from './sidebar.variants';
8
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
9
9
  import { lockBodyScroll, unlockBodyScroll } from '../../utils/overlay';
10
10
  import { overlayStack } from '../../utils';
11
11
 
@@ -29,16 +29,13 @@
29
29
 
30
30
  const blocksConfig = getBlocksConfig();
31
31
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
32
+
33
+ const variantProps: SidebarVariants = $derived({ side, mode });
34
+ const styles = $derived(sidebarVariants(variantProps));
32
35
  const slotClasses = $derived(
33
- mergeSlotClasses(
34
- blocksConfig?.defaults?.Sidebar?.slotClasses,
35
- resolvePresetSlotClasses(blocksConfig?.presets, 'Sidebar', preset),
36
- slotClassesProp
37
- )
36
+ resolveSlotClasses(blocksConfig, 'Sidebar', preset, variantProps, slotClassesProp)
38
37
  );
39
38
 
40
- const styles = $derived(sidebarVariants({ side, mode }));
41
-
42
39
  const panelTransform = $derived(
43
40
  open ? 'translateX(0)' : side === 'left' ? 'translateX(-100%)' : 'translateX(100%)'
44
41
  );
@@ -1,6 +1,6 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
- import type { SidebarVariants } from './sidebar.variants';
3
+ import type { SidebarSlots, SidebarVariants } from './sidebar.variants';
4
4
  /**
5
5
  * @description Sidebar primitive — fixed-position panel that is permanent on
6
6
  * desktop (≥1024px) and slides in as a backdropped overlay on mobile. Use
@@ -88,7 +88,7 @@ export interface SidebarProps extends Omit<HTMLAttributes<HTMLElement>, 'childre
88
88
  /** Strip all default styles. Combine with slotClasses for custom appearance. */
89
89
  unstyled?: boolean;
90
90
  /** Per-slot class overrides merged with variant styles. */
91
- slotClasses?: Partial<Record<'backdrop' | 'panel' | 'header' | 'content' | 'footer', string>>;
91
+ slotClasses?: Partial<Record<SidebarSlots, string>>;
92
92
  /**
93
93
  * Apply a named preset registered via `<BlocksProvider presets={{ Sidebar: {...} }}>`.
94
94
  * 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 sidebarVariants: (props?: import("../../utils/variants").TVProps<{
3
3
  side: {
4
4
  left: {
@@ -55,3 +55,5 @@ export declare const sidebarVariants: (props?: import("../../utils/variants").TV
55
55
  }) | undefined) => string;
56
56
  };
57
57
  export type SidebarVariants = VariantProps<typeof sidebarVariants>;
58
+ /** Slot names derived from the `tv()` config above — single source of truth for `slotClasses`. */
59
+ export type SidebarSlots = SlotNames<typeof sidebarVariants>;
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { useBlocksI18n } from '../..';
3
- import { getBlocksConfig, mergeSlotClasses, resolvePresetSlotClasses } from '../../provider';
4
- import { skeletonVariants } from './skeleton.variants';
3
+ import { getBlocksConfig, resolveSlotClasses } from '../../provider';
4
+ import { skeletonVariants, type SkeletonVariants } from './skeleton.variants';
5
5
  import type { SkeletonProps } from './index';
6
6
 
7
7
  const bt = useBlocksI18n();
@@ -23,16 +23,14 @@
23
23
 
24
24
  const blocksConfig = getBlocksConfig();
25
25
  const unstyled = $derived(unstyledProp || blocksConfig?.unstyled || false);
26
+
27
+ const variantProps: SkeletonVariants = $derived({ variant, size, animation });
28
+ const styles = $derived(skeletonVariants(variantProps));
29
+
26
30
  const slotClasses = $derived(
27
- mergeSlotClasses(
28
- blocksConfig?.defaults?.Skeleton?.slotClasses,
29
- resolvePresetSlotClasses(blocksConfig?.presets, 'Skeleton', preset),
30
- slotClassesProp
31
- )
31
+ resolveSlotClasses(blocksConfig, 'Skeleton', preset, variantProps, slotClassesProp)
32
32
  );
33
33
 
34
- const styles = $derived(skeletonVariants({ variant, size, animation }));
35
-
36
34
  const inlineStyle = $derived(
37
35
  [width ? `width:${width}` : '', height ? `height:${height}` : ''].filter(Boolean).join(';') ||
38
36
  undefined