@kushagradhawan/kookie-ui 0.1.21 → 0.1.23

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 (97) hide show
  1. package/components.css +854 -582
  2. package/dist/cjs/components/_internal/base-checkbox.props.d.ts +2 -2
  3. package/dist/cjs/components/_internal/base-checkbox.props.js +1 -1
  4. package/dist/cjs/components/_internal/base-checkbox.props.js.map +2 -2
  5. package/dist/cjs/components/_internal/base-radio.props.d.ts +2 -2
  6. package/dist/cjs/components/_internal/base-radio.props.js +1 -1
  7. package/dist/cjs/components/_internal/base-radio.props.js.map +2 -2
  8. package/dist/cjs/components/checkbox-cards.d.ts.map +1 -1
  9. package/dist/cjs/components/checkbox-cards.js +1 -1
  10. package/dist/cjs/components/checkbox-cards.js.map +3 -3
  11. package/dist/cjs/components/checkbox-cards.props.d.ts +5 -0
  12. package/dist/cjs/components/checkbox-cards.props.d.ts.map +1 -1
  13. package/dist/cjs/components/checkbox-cards.props.js +1 -1
  14. package/dist/cjs/components/checkbox-cards.props.js.map +3 -3
  15. package/dist/cjs/components/checkbox-group.props.d.ts +2 -2
  16. package/dist/cjs/components/image.d.ts.map +1 -1
  17. package/dist/cjs/components/image.js +1 -1
  18. package/dist/cjs/components/image.js.map +2 -2
  19. package/dist/cjs/components/radio-cards.d.ts.map +1 -1
  20. package/dist/cjs/components/radio-cards.js +1 -1
  21. package/dist/cjs/components/radio-cards.js.map +3 -3
  22. package/dist/cjs/components/radio-cards.props.d.ts +5 -0
  23. package/dist/cjs/components/radio-cards.props.d.ts.map +1 -1
  24. package/dist/cjs/components/radio-cards.props.js +1 -1
  25. package/dist/cjs/components/radio-cards.props.js.map +3 -3
  26. package/dist/cjs/components/radio-group.props.d.ts +2 -2
  27. package/dist/cjs/components/radio-group.props.js +1 -1
  28. package/dist/cjs/components/radio-group.props.js.map +2 -2
  29. package/dist/cjs/components/segmented-control.props.d.ts +5 -0
  30. package/dist/cjs/components/segmented-control.props.d.ts.map +1 -1
  31. package/dist/cjs/components/segmented-control.props.js +1 -1
  32. package/dist/cjs/components/segmented-control.props.js.map +2 -2
  33. package/dist/esm/components/_internal/base-checkbox.props.d.ts +2 -2
  34. package/dist/esm/components/_internal/base-checkbox.props.js +1 -1
  35. package/dist/esm/components/_internal/base-checkbox.props.js.map +2 -2
  36. package/dist/esm/components/_internal/base-radio.props.d.ts +2 -2
  37. package/dist/esm/components/_internal/base-radio.props.js +1 -1
  38. package/dist/esm/components/_internal/base-radio.props.js.map +2 -2
  39. package/dist/esm/components/checkbox-cards.d.ts.map +1 -1
  40. package/dist/esm/components/checkbox-cards.js +1 -1
  41. package/dist/esm/components/checkbox-cards.js.map +3 -3
  42. package/dist/esm/components/checkbox-cards.props.d.ts +5 -0
  43. package/dist/esm/components/checkbox-cards.props.d.ts.map +1 -1
  44. package/dist/esm/components/checkbox-cards.props.js +1 -1
  45. package/dist/esm/components/checkbox-cards.props.js.map +3 -3
  46. package/dist/esm/components/checkbox-group.props.d.ts +2 -2
  47. package/dist/esm/components/image.d.ts.map +1 -1
  48. package/dist/esm/components/image.js +1 -1
  49. package/dist/esm/components/image.js.map +2 -2
  50. package/dist/esm/components/radio-cards.d.ts.map +1 -1
  51. package/dist/esm/components/radio-cards.js +1 -1
  52. package/dist/esm/components/radio-cards.js.map +3 -3
  53. package/dist/esm/components/radio-cards.props.d.ts +5 -0
  54. package/dist/esm/components/radio-cards.props.d.ts.map +1 -1
  55. package/dist/esm/components/radio-cards.props.js +1 -1
  56. package/dist/esm/components/radio-cards.props.js.map +3 -3
  57. package/dist/esm/components/radio-group.props.d.ts +2 -2
  58. package/dist/esm/components/radio-group.props.js +1 -1
  59. package/dist/esm/components/radio-group.props.js.map +2 -2
  60. package/dist/esm/components/segmented-control.props.d.ts +5 -0
  61. package/dist/esm/components/segmented-control.props.d.ts.map +1 -1
  62. package/dist/esm/components/segmented-control.props.js +1 -1
  63. package/dist/esm/components/segmented-control.props.js.map +2 -2
  64. package/package.json +1 -1
  65. package/src/components/_internal/base-button.css +16 -7
  66. package/src/components/_internal/base-card.css +31 -0
  67. package/src/components/_internal/base-checkbox.css +84 -24
  68. package/src/components/_internal/base-checkbox.props.ts +2 -2
  69. package/src/components/_internal/base-radio.css +68 -12
  70. package/src/components/_internal/base-radio.props.ts +2 -2
  71. package/src/components/_internal/base-tab-list.css +6 -1
  72. package/src/components/animations.css +4 -4
  73. package/src/components/avatar.css +10 -0
  74. package/src/components/badge.css +1 -1
  75. package/src/components/card.css +115 -63
  76. package/src/components/checkbox-cards.css +36 -14
  77. package/src/components/checkbox-cards.props.tsx +3 -0
  78. package/src/components/checkbox-cards.tsx +13 -6
  79. package/src/components/image.css +33 -9
  80. package/src/components/image.tsx +2 -1
  81. package/src/components/progress.css +29 -27
  82. package/src/components/radio-cards.css +33 -9
  83. package/src/components/radio-cards.props.tsx +3 -0
  84. package/src/components/radio-cards.tsx +10 -5
  85. package/src/components/radio-group.props.tsx +2 -2
  86. package/src/components/segmented-control.css +71 -26
  87. package/src/components/segmented-control.props.tsx +6 -0
  88. package/src/components/select.css +42 -32
  89. package/src/components/slider.css +19 -19
  90. package/src/components/switch.css +6 -6
  91. package/src/components/text-area.css +31 -11
  92. package/src/components/text-field.css +31 -11
  93. package/src/styles/tokens/constants.css +141 -20
  94. package/src/styles/tokens/transition.css +27 -8
  95. package/styles.css +948 -604
  96. package/tokens/base.css +14 -6
  97. package/tokens.css +94 -22
@@ -22,8 +22,9 @@
22
22
  -webkit-tap-highlight-color: transparent;
23
23
 
24
24
  &:where(:has(:focus-visible)) {
25
- outline: 2px solid var(--focus-8);
26
- outline-offset: -1px;
25
+ transition: var(--transition-focus);
26
+ outline: var(--focus-outline-width) solid var(--focus-8);
27
+ outline-offset: var(--focus-outline-offset-inset);
27
28
 
28
29
  &::after {
29
30
  outline: inherit;
@@ -65,20 +66,20 @@
65
66
  font-size: var(--font-size-2);
66
67
  --line-height: var(--line-height-2);
67
68
  --letter-spacing: var(--letter-spacing-2);
68
- --checkbox-cards-item-padding-top: calc(var(--space-3) / 1.2);
69
- --checkbox-cards-item-padding-bottom: calc(var(--space-3) / 1.2);
69
+ --checkbox-cards-item-padding-top: calc(var(--space-3) * var(--spacing-multiplier-medium));
70
+ --checkbox-cards-item-padding-bottom: calc(var(--space-3) * var(--spacing-multiplier-medium));
70
71
  --checkbox-cards-item-padding-left: var(--space-3);
71
72
  --checkbox-cards-item-border-radius: var(--radius-3);
72
73
  /* keep in sync with checkbox */
73
- --checkbox-cards-item-checkbox-size: calc(var(--space-4) * 0.875);
74
+ --checkbox-cards-item-checkbox-size: calc(var(--space-4) * var(--spacing-multiplier-medium));
74
75
  }
75
76
  /* 48px height for the card with one line of text */
76
77
  &:where(.rt-r-size-2) {
77
78
  font-size: var(--font-size-2);
78
79
  --line-height: var(--line-height-2);
79
80
  --letter-spacing: var(--letter-spacing-2);
80
- --checkbox-cards-item-padding-top: calc(var(--space-4) * 0.875);
81
- --checkbox-cards-item-padding-bottom: calc(var(--space-4) * 0.875);
81
+ --checkbox-cards-item-padding-top: calc(var(--space-4) * var(--spacing-multiplier-medium));
82
+ --checkbox-cards-item-padding-bottom: calc(var(--space-4) * var(--spacing-multiplier-medium));
82
83
  --checkbox-cards-item-padding-left: var(--space-4);
83
84
  --checkbox-cards-item-border-radius: var(--radius-3);
84
85
  /* keep in sync with checkbox */
@@ -89,12 +90,12 @@
89
90
  font-size: var(--font-size-3);
90
91
  --line-height: var(--line-height-3);
91
92
  --letter-spacing: var(--letter-spacing-3);
92
- --checkbox-cards-item-padding-top: calc(var(--space-5) / 1.2);
93
- --checkbox-cards-item-padding-bottom: calc(var(--space-5) / 1.2);
93
+ --checkbox-cards-item-padding-top: calc(var(--space-5) * var(--spacing-multiplier-medium));
94
+ --checkbox-cards-item-padding-bottom: calc(var(--space-5) * var(--spacing-multiplier-medium));
94
95
  --checkbox-cards-item-padding-left: var(--space-5);
95
96
  --checkbox-cards-item-border-radius: var(--radius-4);
96
97
  /* keep in sync with checkbox */
97
- --checkbox-cards-item-checkbox-size: calc(var(--space-4) * 1.25);
98
+ --checkbox-cards-item-checkbox-size: calc(var(--space-4) * var(--spacing-multiplier-large));
98
99
  }
99
100
  }
100
101
  }
@@ -107,9 +108,11 @@
107
108
 
108
109
  :where(.rt-CheckboxCardsRoot.rt-variant-surface) {
109
110
  .rt-CheckboxCardsItem {
110
- --checkbox-cards-item-border-width: 1px;
111
+ --checkbox-cards-item-border-width: var(--border-width-standard);
111
112
  --checkbox-cards-item-background-color: var(--color-surface);
112
113
 
114
+ transition: var(--transition-card);
115
+
113
116
  &::before {
114
117
  background-color: var(--checkbox-cards-item-background-color);
115
118
  }
@@ -118,12 +121,22 @@
118
121
  }
119
122
  @media (hover: hover) {
120
123
  &:where(:not(:has(:disabled)):hover) {
124
+ transition-duration: var(--duration-1);
121
125
  &::after {
122
126
  box-shadow: var(--base-card-surface-hover-box-shadow);
123
127
  }
124
128
  }
125
129
  }
126
130
  }
131
+
132
+ /* Component-level panel background overrides (higher specificity) */
133
+ &:where([data-panel-background='solid']) .rt-CheckboxCardsItem {
134
+ --color-surface: var(--color-surface-solid);
135
+ }
136
+
137
+ &:where([data-panel-background='translucent']) .rt-CheckboxCardsItem {
138
+ --color-surface: var(--color-surface-translucent);
139
+ }
127
140
  }
128
141
 
129
142
  /* * * * * * * * * * * * * * * * * * * */
@@ -134,10 +147,10 @@
134
147
 
135
148
  :where(.rt-CheckboxCardsRoot.rt-variant-classic) {
136
149
  .rt-CheckboxCardsItem {
137
- --checkbox-cards-item-border-width: 1px;
150
+ --checkbox-cards-item-border-width: var(--border-width-standard);
138
151
  --checkbox-cards-item-background-color: var(--color-surface);
139
152
 
140
- transition: box-shadow 120ms;
153
+ transition: var(--transition-card);
141
154
  box-shadow: var(--base-card-classic-box-shadow-outer);
142
155
 
143
156
  &::before {
@@ -148,7 +161,7 @@
148
161
  }
149
162
  @media (hover: hover) {
150
163
  &:where(:not(:has(:disabled)):hover) {
151
- transition-duration: 40ms;
164
+ transition-duration: var(--duration-1);
152
165
  box-shadow: var(--base-card-classic-hover-box-shadow-outer);
153
166
  &::after {
154
167
  box-shadow: var(--base-card-classic-hover-box-shadow-inner);
@@ -156,6 +169,15 @@
156
169
  }
157
170
  }
158
171
  }
172
+
173
+ /* Component-level panel background overrides (higher specificity) */
174
+ &:where([data-panel-background='solid']) .rt-CheckboxCardsItem {
175
+ --color-surface: var(--color-surface-solid);
176
+ }
177
+
178
+ &:where([data-panel-background='translucent']) .rt-CheckboxCardsItem {
179
+ --color-surface: var(--color-surface-translucent);
180
+ }
159
181
  }
160
182
 
161
183
  /* * * * * * * * * * * * * * * * * * * */
@@ -7,11 +7,13 @@ import type { PropDef } from '../props/prop-def.js';
7
7
 
8
8
  const sizes = ['1', '2', '3'] as const;
9
9
  const variants = ['surface', 'classic'] as const;
10
+ const panelBackgrounds = ['solid', 'translucent'] as const;
10
11
 
11
12
  const checkboxCardsRootPropDefs = {
12
13
  ...asChildPropDef,
13
14
  size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '2', responsive: true },
14
15
  variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'surface' },
16
+ panelBackground: { type: 'enum', values: panelBackgrounds, default: undefined },
15
17
  ...colorPropDef,
16
18
  ...highContrastPropDef,
17
19
  columns: { ...gridPropDefs.columns, default: 'repeat(auto-fit, minmax(200px, 1fr))' },
@@ -19,6 +21,7 @@ const checkboxCardsRootPropDefs = {
19
21
  } satisfies {
20
22
  size: PropDef<(typeof sizes)[number]>;
21
23
  variant: PropDef<(typeof variants)[number]>;
24
+ panelBackground: PropDef<(typeof panelBackgrounds)[number] | undefined>;
22
25
  columns: PropDef<(typeof gridPropDefs.columns.values)[number]>;
23
26
  gap: PropDef<(typeof gridPropDefs.gap.values)[number]>;
24
27
  };
@@ -12,6 +12,7 @@ import { Grid } from './grid.js';
12
12
  import { ThickCheckIcon } from './icons.js';
13
13
  import { extractProps } from '../helpers/extract-props.js';
14
14
  import { marginPropDefs } from '../props/margin.props.js';
15
+ import { useThemeContext } from './theme.js';
15
16
 
16
17
  import type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';
17
18
  import type { MarginProps } from '../props/margin.props.js';
@@ -44,11 +45,15 @@ interface CheckboxCardsRootProps
44
45
  CheckboxCardsRootOwnProps {}
45
46
  const CheckboxCardsRoot = React.forwardRef<CheckboxCardsRootElement, CheckboxCardsRootProps>(
46
47
  (props: ScopedProps<CheckboxCardsRootProps>, forwardedRef) => {
47
- const { __scopeCheckboxCards, className, color, ...rootProps } = extractProps(
48
- props,
49
- checkboxCardsRootPropDefs,
50
- marginPropDefs,
51
- );
48
+ const themeContext = useThemeContext();
49
+ const panelBackground = props.panelBackground ?? themeContext.panelBackground;
50
+ const {
51
+ __scopeCheckboxCards,
52
+ className,
53
+ color,
54
+ panelBackground: _,
55
+ ...rootProps
56
+ } = extractProps(props, checkboxCardsRootPropDefs, marginPropDefs);
52
57
  const checkboxGroupScope = useCheckboxGroupScope(__scopeCheckboxCards);
53
58
  return (
54
59
  <CheckboxCardsProvider
@@ -60,6 +65,7 @@ const CheckboxCardsRoot = React.forwardRef<CheckboxCardsRootElement, CheckboxCar
60
65
  <CheckboxGroupPrimitive.Root
61
66
  {...checkboxGroupScope}
62
67
  data-accent-color={color}
68
+ data-panel-background={panelBackground}
63
69
  {...rootProps}
64
70
  ref={forwardedRef}
65
71
  className={classNames('rt-CheckboxCardsRoot', className)}
@@ -81,9 +87,10 @@ const CheckboxCardsItem = React.forwardRef<
81
87
  >(({ __scopeCheckboxCards, children, className, style, ...props }, forwardedRef) => {
82
88
  const context = useCheckboxCardsContext('CheckboxCardsItem', __scopeCheckboxCards);
83
89
  const checkboxGroupScope = useCheckboxGroupScope(__scopeCheckboxCards);
90
+
84
91
  const { className: checkboxClassName } = extractProps(
85
92
  // Pass size / highContrast values from the context and static variant to generate styles
86
- { size: context?.size, variant: 'surface', highContrast: context?.highContrast },
93
+ { size: context?.size, variant: 'solid', highContrast: context?.highContrast },
87
94
  // Pass size & variant prop defs to allow it to be extracted
88
95
  baseCheckboxPropDefs,
89
96
  );
@@ -16,23 +16,47 @@
16
16
 
17
17
  @media (hover: hover) {
18
18
  &:where(:hover) {
19
- transform: scale(1.02);
20
19
  box-shadow:
21
20
  var(--box-shadow, var(--shadow-2)),
22
21
  0 0 0 1px var(--gray-a4);
22
+ filter: brightness(1.05) contrast(1.02);
23
23
  }
24
24
  }
25
25
 
26
+ &:where(:active) {
27
+ filter: brightness(0.98) contrast(1.02);
28
+ }
29
+
26
30
  &:where(:focus-visible) {
27
31
  outline: 2px solid var(--focus-8);
28
- outline-offset: 2px;
32
+ outline-offset: -2px;
33
+ }
34
+ }
35
+
36
+ /* Interactive states for asChild usage - target the wrapper element */
37
+ :where(:any-link, button, label) .rt-Image {
38
+ cursor: pointer;
39
+
40
+ @media (hover: hover) {
41
+ &:where(:hover) {
42
+ box-shadow:
43
+ var(--box-shadow, var(--shadow-2)),
44
+ 0 0 0 1px var(--gray-a4);
45
+ filter: brightness(1.05) contrast(1.02);
46
+ }
29
47
  }
30
48
 
31
49
  &:where(:active) {
32
- transform: scale(0.98);
50
+ filter: brightness(0.98) contrast(1.02);
33
51
  }
34
52
  }
35
53
 
54
+ /* Focus states for asChild usage - apply to the wrapper */
55
+ :where(:any-link, button, label):where(:focus-visible) .rt-Image {
56
+ outline: 2px solid var(--focus-8);
57
+ outline-offset: -2px;
58
+ }
59
+
36
60
  /* Blur variant wrapper */
37
61
  .rt-variant-blur {
38
62
  position: relative;
@@ -46,17 +70,17 @@
46
70
 
47
71
  @media (hover: hover) {
48
72
  &:where(:hover) {
49
- transform: scale(1.02);
73
+ filter: brightness(1.05) contrast(1.02);
50
74
  }
51
75
  }
52
76
 
53
- &:where(:focus-visible) {
54
- outline: 2px solid var(--focus-8);
55
- outline-offset: 2px;
77
+ &:where(:active) {
78
+ filter: brightness(0.98) contrast(1.02);
56
79
  }
57
80
 
58
- &:where(:active) {
59
- transform: scale(0.98);
81
+ &:where(:focus-visible) {
82
+ outline: 2px solid var(--focus-8);
83
+ outline-offset: -2px;
60
84
  }
61
85
  }
62
86
 
@@ -287,7 +287,7 @@ const Image = React.forwardRef<ImageElement, ImageProps>((props, forwardedRef) =
287
287
  } else {
288
288
  // For surface variant with asChild
289
289
  return React.cloneElement(child, {
290
- className: classNames(child.props?.className, 'rt-Image'),
290
+ className: classNames(child.props?.className),
291
291
  style: {
292
292
  textDecoration: 'none', // Reset link underlines
293
293
  color: 'inherit', // Reset link colors
@@ -296,6 +296,7 @@ const Image = React.forwardRef<ImageElement, ImageProps>((props, forwardedRef) =
296
296
  padding: 0, // Reset button padding
297
297
  font: 'inherit', // Reset button fonts
298
298
  cursor: 'pointer', // Ensure interactive cursor
299
+ display: 'inline-block', // Ensure proper sizing
299
300
  ...child.props?.style, // Allow user overrides
300
301
  },
301
302
  children: imageWithPlaceholder,
@@ -1,14 +1,14 @@
1
1
  .rt-ProgressRoot {
2
2
  --progress-value: 0;
3
3
  --progress-max: 100;
4
- --progress-duration: 5s;
4
+ --progress-duration: var(--progress-default-duration);
5
5
  pointer-events: none;
6
6
  position: relative;
7
7
  overflow: hidden;
8
8
  flex-grow: 1;
9
9
  height: var(--progress-height);
10
10
  border-radius: max(
11
- calc(var(--radius-factor) * var(--progress-height) / 3),
11
+ calc(var(--radius-factor) * var(--progress-height) / var(--progress-border-radius-factor)),
12
12
  calc(var(--radius-factor) * var(--radius-thumb))
13
13
  );
14
14
 
@@ -30,18 +30,18 @@
30
30
  }
31
31
  .rt-ProgressIndicator {
32
32
  display: block;
33
- height: 100%;
34
- width: 100%;
33
+ height: var(--position-full);
34
+ width: var(--position-full);
35
35
 
36
36
  transform: scaleX(calc(var(--progress-value) / var(--progress-max)));
37
37
  transform-origin: left center;
38
- transition: transform 120ms;
38
+ transition: var(--transition-progress);
39
39
 
40
40
  &:where([data-state='indeterminate']) {
41
41
  animation-name: rt-progress-indicator-indeterminate-grow, var(--progress-indicator-indeterminate-animation-start),
42
42
  var(--progress-indicator-indeterminate-animation-repeat);
43
- animation-delay: 0s, calc(var(--progress-duration) + 5s), calc(var(--progress-duration) + 7.5s);
44
- animation-duration: var(--progress-duration), 2.5s, 5s;
43
+ animation-delay: 0s, calc(var(--progress-duration) + var(--progress-animation-delay-start)), calc(var(--progress-duration) + var(--progress-animation-delay-shine));
44
+ animation-duration: var(--progress-duration), var(--progress-animation-duration-fade), var(--progress-animation-duration-pulse);
45
45
  animation-iteration-count: 1, 1, infinite;
46
46
  animation-fill-mode: both, none, none;
47
47
  animation-direction: normal, normal, alternate;
@@ -51,19 +51,19 @@
51
51
  position: absolute;
52
52
  inset: 0;
53
53
  content: '';
54
- width: 400%;
54
+ width: calc(var(--position-full) * var(--progress-shine-width-multiplier));
55
55
 
56
56
  animation-name: rt-progress-indicator-indeterminate-shine-from-left;
57
- animation-delay: calc(var(--progress-duration) + 5s);
58
- animation-duration: 5s;
57
+ animation-delay: calc(var(--progress-duration) + var(--progress-animation-delay-start));
58
+ animation-duration: var(--progress-animation-duration-pulse);
59
59
  animation-fill-mode: backwards;
60
60
  animation-iteration-count: infinite;
61
61
 
62
62
  background-image: linear-gradient(
63
63
  to right,
64
- transparent 25%,
64
+ transparent var(--progress-gradient-stop-start),
65
65
  var(--progress-indicator-after-linear-gradient),
66
- transparent 75%
66
+ transparent var(--progress-gradient-stop-end)
67
67
  );
68
68
  }
69
69
  }
@@ -71,29 +71,29 @@
71
71
 
72
72
  @keyframes rt-progress-indicator-indeterminate-grow {
73
73
  0% {
74
- transform: scaleX(0.01);
74
+ transform: scaleX(var(--progress-scale-initial));
75
75
  }
76
76
  20% {
77
- transform: scaleX(0.1);
77
+ transform: scaleX(var(--progress-scale-step-1));
78
78
  }
79
79
  30% {
80
- transform: scaleX(0.6);
80
+ transform: scaleX(var(--progress-scale-step-2));
81
81
  }
82
82
  40%,
83
83
  50% {
84
- transform: scaleX(0.9);
84
+ transform: scaleX(var(--progress-scale-step-3));
85
85
  }
86
86
  100% {
87
- transform: scaleX(1);
87
+ transform: scaleX(var(--progress-scale-final));
88
88
  }
89
89
  }
90
90
 
91
91
  @keyframes rt-progress-indicator-indeterminate-shine-from-left {
92
92
  0% {
93
- transform: translateX(-100%);
93
+ transform: translateX(var(--position-negative-full));
94
94
  }
95
95
  100% {
96
- transform: translateX(0%);
96
+ transform: translateX(var(--position-zero));
97
97
  }
98
98
  }
99
99
 
@@ -109,7 +109,7 @@
109
109
  --progress-height: var(--space-1);
110
110
  }
111
111
  &:where(.rt-r-size-2) {
112
- --progress-height: calc(var(--space-2) * 0.75);
112
+ --progress-height: calc(var(--space-2) * var(--size-multiplier-small));
113
113
  }
114
114
  &:where(.rt-r-size-3) {
115
115
  --progress-height: var(--space-2);
@@ -131,7 +131,7 @@
131
131
  background-color: var(--gray-a3);
132
132
 
133
133
  &::after {
134
- box-shadow: inset 0 0 0 1px var(--gray-a4);
134
+ box-shadow: inset 0 0 0 var(--border-width-standard) var(--gray-a4);
135
135
  }
136
136
 
137
137
  & :where(.rt-ProgressIndicator) {
@@ -159,10 +159,12 @@
159
159
  .rt-ProgressRoot:where(.rt-variant-classic) {
160
160
  --progress-indicator-indeterminate-animation-start: rt-progress-indicator-classic-indeterminate-fade;
161
161
  --progress-indicator-indeterminate-animation-repeat: rt-progress-indicator-classic-indeterminate-pulse;
162
+ position: relative;
163
+ top: calc(var(--classic-elevation-offset) / var(--classic-elevation-factor-subtle));
162
164
  background-color: var(--gray-a3);
163
165
 
164
166
  &::after {
165
- box-shadow: var(--shadow-1);
167
+ box-shadow: var(--classic-inset-shadow-dark);
166
168
  }
167
169
 
168
170
  & :where(.rt-ProgressIndicator) {
@@ -199,7 +201,7 @@
199
201
  background-color: var(--accent-8);
200
202
 
201
203
  &::after {
202
- opacity: 0.75;
204
+ opacity: var(--opacity-soft-variant);
203
205
  }
204
206
  }
205
207
  }
@@ -228,22 +230,22 @@
228
230
  background-color: var(--accent-12);
229
231
 
230
232
  &::after {
231
- opacity: 0.75;
233
+ opacity: var(--opacity-soft-variant);
232
234
  }
233
235
  }
234
236
  }
235
237
 
236
238
  @keyframes rt-progress-indicator-high-contrast-indeterminate-fade {
237
239
  100% {
238
- opacity: 0.8;
240
+ opacity: var(--opacity-high-contrast);
239
241
  }
240
242
  }
241
243
 
242
244
  @keyframes rt-progress-indicator-high-contrast-indeterminate-pulse {
243
245
  0% {
244
- opacity: 0.8;
246
+ opacity: var(--opacity-high-contrast);
245
247
  }
246
248
  100% {
247
- opacity: 1;
249
+ opacity: var(--progress-scale-final);
248
250
  }
249
251
  }
@@ -1,4 +1,5 @@
1
1
  @import './_internal/base-card.css';
2
+ @import './_internal/base-radio.css';
2
3
 
3
4
  .rt-RadioCardsRoot {
4
5
  line-height: var(--line-height);
@@ -47,7 +48,7 @@
47
48
  --line-height: var(--line-height-2);
48
49
  --letter-spacing: var(--letter-spacing-2);
49
50
  --radio-cards-item-padding-x: var(--space-3);
50
- --radio-cards-item-padding-y: calc(var(--space-3) / 1.2);
51
+ --radio-cards-item-padding-y: calc(var(--space-3) * var(--spacing-multiplier-medium));
51
52
  --radio-cards-item-border-radius: var(--radius-3);
52
53
  }
53
54
  /* 48px height for the card with one line of text */
@@ -56,7 +57,7 @@
56
57
  --line-height: var(--line-height-2);
57
58
  --letter-spacing: var(--letter-spacing-2);
58
59
  --radio-cards-item-padding-x: var(--space-4);
59
- --radio-cards-item-padding-y: calc(var(--space-4) * 0.875);
60
+ --radio-cards-item-padding-y: calc(var(--space-4) * var(--spacing-multiplier-medium));
60
61
  --radio-cards-item-border-radius: var(--radius-3);
61
62
  }
62
63
  /* 64px height for the card with one line of text */
@@ -65,7 +66,7 @@
65
66
  --line-height: var(--line-height-3);
66
67
  --letter-spacing: var(--letter-spacing-3);
67
68
  --radio-cards-item-padding-x: var(--space-5);
68
- --radio-cards-item-padding-y: calc(var(--space-5) / 1.2);
69
+ --radio-cards-item-padding-y: calc(var(--space-5) * var(--spacing-multiplier-medium));
69
70
  --radio-cards-item-border-radius: var(--radius-4);
70
71
  }
71
72
  }
@@ -79,9 +80,11 @@
79
80
 
80
81
  :where(.rt-RadioCardsRoot.rt-variant-surface) {
81
82
  .rt-RadioCardsItem {
82
- --radio-cards-item-border-width: 1px;
83
+ --radio-cards-item-border-width: var(--border-width-standard);
83
84
  --radio-cards-item-background-color: var(--color-surface);
84
85
 
86
+ transition: var(--transition-card);
87
+
85
88
  &::before {
86
89
  background-color: var(--radio-cards-item-background-color);
87
90
  }
@@ -90,12 +93,22 @@
90
93
  }
91
94
  @media (hover: hover) {
92
95
  &:where(:not(:disabled):not([data-state='checked']):hover) {
96
+ transition-duration: var(--duration-1);
93
97
  &::after {
94
98
  box-shadow: var(--base-card-surface-hover-box-shadow);
95
99
  }
96
100
  }
97
101
  }
98
102
  }
103
+
104
+ /* Component-level panel background overrides (higher specificity) */
105
+ &:where([data-panel-background='solid']) .rt-RadioCardsItem {
106
+ --color-surface: var(--color-surface-solid);
107
+ }
108
+
109
+ &:where([data-panel-background='translucent']) .rt-RadioCardsItem {
110
+ --color-surface: var(--color-surface-translucent);
111
+ }
99
112
  }
100
113
 
101
114
  /* * * * * * * * * * * * * * * * * * * */
@@ -106,10 +119,10 @@
106
119
 
107
120
  :where(.rt-RadioCardsRoot.rt-variant-classic) {
108
121
  .rt-RadioCardsItem {
109
- --radio-cards-item-border-width: 1px;
122
+ --radio-cards-item-border-width: var(--border-width-standard);
110
123
  --radio-cards-item-background-color: var(--color-surface);
111
124
 
112
- transition: box-shadow 120ms;
125
+ transition: var(--transition-card);
113
126
  box-shadow: var(--base-card-classic-box-shadow-outer);
114
127
 
115
128
  &::before {
@@ -120,7 +133,7 @@
120
133
  }
121
134
  @media (hover: hover) {
122
135
  &:where(:not(:disabled):not([data-state='checked']):hover) {
123
- transition-duration: 40ms;
136
+ transition-duration: var(--duration-1);
124
137
  box-shadow: var(--base-card-classic-hover-box-shadow-outer);
125
138
  &::after {
126
139
  box-shadow: var(--base-card-classic-hover-box-shadow-inner);
@@ -128,6 +141,15 @@
128
141
  }
129
142
  }
130
143
  }
144
+
145
+ /* Component-level panel background overrides (higher specificity) */
146
+ &:where([data-panel-background='solid']) .rt-RadioCardsItem {
147
+ --color-surface: var(--color-surface-solid);
148
+ }
149
+
150
+ &:where([data-panel-background='translucent']) .rt-RadioCardsItem {
151
+ --color-surface: var(--color-surface-translucent);
152
+ }
131
153
  }
132
154
 
133
155
  /* * * * * * * * * * * * * * * * * * * */
@@ -137,8 +159,9 @@
137
159
  /* * * * * * * * * * * * * * * * * * * */
138
160
 
139
161
  .rt-RadioCardsItem:where([data-state='checked']) {
162
+ transition: var(--transition-fast);
140
163
  &::after {
141
- outline: 2px solid var(--accent-indicator);
164
+ outline: var(--focus-outline-width) solid var(--accent-indicator);
142
165
  }
143
166
  :where(.rt-RadioCardsRoot.rt-high-contrast) & {
144
167
  &::after {
@@ -154,8 +177,9 @@
154
177
  /* * * * * * * * * * * * * * * * * * * */
155
178
 
156
179
  .rt-RadioCardsItem:where(:focus-visible) {
180
+ transition: var(--transition-focus);
157
181
  &::after {
158
- outline: 2px solid var(--focus-8);
182
+ outline: var(--focus-outline-width) solid var(--focus-8);
159
183
  }
160
184
  &:where([data-state='checked']) {
161
185
  &::before {
@@ -7,11 +7,13 @@ import type { PropDef } from '../props/prop-def.js';
7
7
 
8
8
  const sizes = ['1', '2', '3'] as const;
9
9
  const variants = ['surface', 'classic'] as const;
10
+ const panelBackgrounds = ['solid', 'translucent'] as const;
10
11
 
11
12
  const radioCardsRootPropDefs = {
12
13
  ...asChildPropDef,
13
14
  size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '2', responsive: true },
14
15
  variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'surface' },
16
+ panelBackground: { type: 'enum', values: panelBackgrounds, default: undefined },
15
17
  ...colorPropDef,
16
18
  ...highContrastPropDef,
17
19
  columns: { ...gridPropDefs.columns, default: 'repeat(auto-fit, minmax(160px, 1fr))' },
@@ -19,6 +21,7 @@ const radioCardsRootPropDefs = {
19
21
  } satisfies {
20
22
  size: PropDef<(typeof sizes)[number]>;
21
23
  variant: PropDef<(typeof variants)[number]>;
24
+ panelBackground: PropDef<(typeof panelBackgrounds)[number] | undefined>;
22
25
  columns: PropDef<(typeof gridPropDefs.columns.values)[number]>;
23
26
  gap: PropDef<(typeof gridPropDefs.gap.values)[number]>;
24
27
  };
@@ -6,6 +6,7 @@ import { radioCardsRootPropDefs } from './radio-cards.props.js';
6
6
  import { Grid } from './grid.js';
7
7
  import { extractProps } from '../helpers/extract-props.js';
8
8
  import { marginPropDefs } from '../props/margin.props.js';
9
+ import { useThemeContext } from './theme.js';
9
10
 
10
11
  import type { MarginProps } from '../props/margin.props.js';
11
12
  import type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';
@@ -22,15 +23,19 @@ interface RadioCardsRootProps
22
23
  RadioCardsRootOwnProps {}
23
24
  const RadioCardsRoot = React.forwardRef<RadioCardsRootElement, RadioCardsRootProps>(
24
25
  (props, forwardedRef) => {
25
- const { className, color, ...rootProps } = extractProps(
26
- props,
27
- radioCardsRootPropDefs,
28
- marginPropDefs,
29
- );
26
+ const themeContext = useThemeContext();
27
+ const panelBackground = props.panelBackground ?? themeContext.panelBackground;
28
+ const {
29
+ className,
30
+ color,
31
+ panelBackground: _,
32
+ ...rootProps
33
+ } = extractProps(props, radioCardsRootPropDefs, marginPropDefs);
30
34
  return (
31
35
  <Grid asChild>
32
36
  <RadioGroupPrimitive.Root
33
37
  data-accent-color={color}
38
+ data-panel-background={panelBackground}
34
39
  {...rootProps}
35
40
  ref={forwardedRef}
36
41
  className={classNames('rt-RadioCardsRoot', className)}
@@ -5,12 +5,12 @@ import { highContrastPropDef } from '../props/high-contrast.prop.js';
5
5
  import type { PropDef } from '../props/prop-def.js';
6
6
 
7
7
  const sizes = ['1', '2', '3'] as const;
8
- const variants = ['classic', 'surface', 'soft'] as const;
8
+ const variants = ['classic', 'solid', 'soft'] as const;
9
9
 
10
10
  const radioGroupRootPropDefs = {
11
11
  ...asChildPropDef,
12
12
  size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '2', responsive: true },
13
- variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'surface' },
13
+ variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'solid' },
14
14
  ...colorPropDef,
15
15
  ...highContrastPropDef,
16
16
  } satisfies {