@kushagradhawan/kookie-ui 0.1.22 → 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 (94) hide show
  1. package/components.css +748 -612
  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 +1 -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/badge.css +1 -1
  72. package/src/components/card.css +23 -60
  73. package/src/components/checkbox-cards.css +36 -14
  74. package/src/components/checkbox-cards.props.tsx +3 -0
  75. package/src/components/checkbox-cards.tsx +13 -6
  76. package/src/components/image.css +33 -9
  77. package/src/components/image.tsx +2 -1
  78. package/src/components/progress.css +29 -27
  79. package/src/components/radio-cards.css +33 -9
  80. package/src/components/radio-cards.props.tsx +3 -0
  81. package/src/components/radio-cards.tsx +10 -5
  82. package/src/components/radio-group.props.tsx +2 -2
  83. package/src/components/segmented-control.css +71 -26
  84. package/src/components/segmented-control.props.tsx +6 -0
  85. package/src/components/select.css +32 -32
  86. package/src/components/slider.css +19 -19
  87. package/src/components/switch.css +6 -6
  88. package/src/components/text-area.css +11 -11
  89. package/src/components/text-field.css +11 -11
  90. package/src/styles/tokens/constants.css +130 -15
  91. package/src/styles/tokens/transition.css +19 -0
  92. package/styles.css +827 -623
  93. package/tokens/base.css +8 -0
  94. package/tokens.css +79 -11
@@ -21,6 +21,7 @@
21
21
  height: var(--checkbox-size);
22
22
  width: var(--checkbox-size);
23
23
  border-radius: var(--checkbox-border-radius);
24
+ transition: var(--transition-checkbox);
24
25
  }
25
26
  }
26
27
 
@@ -33,6 +34,14 @@
33
34
  transform: translate(-50%, -50%);
34
35
  top: 50%;
35
36
  left: 50%;
37
+
38
+ /* Smooth color transitions for the indicator icon */
39
+ transition: color var(--duration-1) var(--ease-1);
40
+
41
+ /* Respect user preference for reduced motion */
42
+ @media (prefers-reduced-motion: reduce) {
43
+ transition: none;
44
+ }
36
45
  }
37
46
 
38
47
  /***************************************************************************************************
@@ -44,19 +53,19 @@
44
53
  @breakpoints {
45
54
  .rt-BaseCheckboxRoot {
46
55
  &:where(.rt-r-size-1) {
47
- --checkbox-size: calc(var(--space-4) * 0.875);
48
- --checkbox-indicator-size: calc(9px * var(--scaling));
49
- --checkbox-border-radius: calc(var(--radius-1) * 0.875);
56
+ --checkbox-size: calc(var(--space-4) * var(--spacing-multiplier-medium));
57
+ --checkbox-indicator-size: var(--indicator-icon-size-1);
58
+ --checkbox-border-radius: calc(var(--radius-1) * var(--spacing-multiplier-small));
50
59
  }
51
60
  &:where(.rt-r-size-2) {
52
61
  --checkbox-size: var(--space-4);
53
- --checkbox-indicator-size: calc(10px * var(--scaling));
54
- --checkbox-border-radius: var(--radius-1);
62
+ --checkbox-indicator-size: var(--indicator-icon-size-2);
63
+ --checkbox-border-radius: calc(var(--radius-1) * var(--spacing-multiplier-medium));
55
64
  }
56
65
  &:where(.rt-r-size-3) {
57
- --checkbox-size: calc(var(--space-4) * 1.25);
58
- --checkbox-indicator-size: calc(12px * var(--scaling));
59
- --checkbox-border-radius: calc(var(--radius-1) * 1.25);
66
+ --checkbox-size: calc(var(--space-4) * var(--spacing-multiplier-large));
67
+ --checkbox-indicator-size: var(--indicator-icon-size-3);
68
+ --checkbox-border-radius: calc(var(--radius-1) * var(--spacing-multiplier-medium));
60
69
  }
61
70
  }
62
71
  }
@@ -67,13 +76,13 @@
67
76
  * *
68
77
  ***************************************************************************************************/
69
78
 
70
- /* surface */
79
+ /* solid */
71
80
 
72
- .rt-BaseCheckboxRoot:where(.rt-variant-surface) {
81
+ .rt-BaseCheckboxRoot:where(.rt-variant-solid) {
73
82
  &:where([data-state='unchecked']) {
74
83
  &::before {
75
84
  background-color: var(--color-surface);
76
- box-shadow: inset 0 0 0 1px var(--gray-a7);
85
+ box-shadow: inset 0 0 0 var(--border-width-inset) var(--gray-a7);
77
86
  }
78
87
  }
79
88
 
@@ -97,7 +106,7 @@
97
106
 
98
107
  &:where(:disabled) {
99
108
  &::before {
100
- box-shadow: inset 0 0 0 1px var(--gray-a6);
109
+ box-shadow: inset 0 0 0 var(--border-width-inset) var(--gray-a6);
101
110
  background-color: transparent;
102
111
  }
103
112
  & :where(.rt-BaseCheckboxIndicator) {
@@ -109,42 +118,93 @@
109
118
  /* classic */
110
119
 
111
120
  .rt-BaseCheckboxRoot:where(.rt-variant-classic) {
121
+ position: relative;
122
+ top: var(--classic-elevation-offset);
123
+
112
124
  &:where([data-state='unchecked']) {
113
125
  &::before {
114
- background-color: var(--color-surface);
115
- box-shadow: inset 0 0 0 1px var(--gray-a3), var(--shadow-1);
126
+ background-color: var(--accent-2);
127
+ /* prettier-ignore */
128
+ box-shadow:
129
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a2),
130
+ inset 0 var(--classic-border-width) var(--white-a12),
131
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
132
+ inset 0 calc(-1 * var(--classic-border-width)) var(--accent-a6),
133
+ 0 0 0 var(--classic-border-width) var(--accent-a5),
134
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--accent-a7);
135
+ }
136
+
137
+ :where(.dark, .dark-theme) &,
138
+ :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
139
+ &::before {
140
+ /* prettier-ignore */
141
+ box-shadow:
142
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a3),
143
+ inset 0 var(--classic-border-width) var(--accent-a11),
144
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
145
+ inset 0 calc(-2 * var(--classic-border-width)) var(--black-a11),
146
+ 0 0 0 var(--classic-border-width-thick) var(--accent-a7),
147
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--black-a12);
148
+ }
116
149
  }
117
150
  }
118
151
 
119
152
  &:where([data-state='checked'], [data-state='indeterminate']) {
120
153
  &::before {
121
- background-color: var(--accent-indicator);
122
- background-image: linear-gradient(to bottom, var(--white-a3), transparent, var(--black-a1));
123
- box-shadow: inset 0 0.5px 0.5px var(--white-a4), inset 0 -0.5px 0.5px var(--black-a4);
154
+ background-color: var(--accent-3);
155
+ /* prettier-ignore */
156
+ box-shadow:
157
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a2),
158
+ inset 0 var(--classic-border-width) var(--white-a12),
159
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
160
+ inset 0 calc(-1 * var(--classic-border-width)) var(--accent-a6),
161
+ 0 0 0 var(--classic-border-width) var(--accent-a5),
162
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--accent-a7);
124
163
  }
125
164
  & :where(.rt-BaseCheckboxIndicator) {
126
- color: var(--accent-contrast);
165
+ color: var(--accent-a11);
127
166
  }
128
-
129
- &:where(.rt-high-contrast) {
167
+
168
+ :where(.dark, .dark-theme) &,
169
+ :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
130
170
  &::before {
131
- background-color: var(--accent-12);
171
+ background-color: var(--accent-3);
172
+ /* prettier-ignore */
173
+ box-shadow:
174
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a3),
175
+ inset 0 var(--classic-border-width) var(--accent-a11),
176
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
177
+ inset 0 calc(-2 * var(--classic-border-width)) var(--black-a11),
178
+ 0 0 0 var(--classic-border-width-thick) var(--accent-a7),
179
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--black-a12);
132
180
  }
181
+ }
182
+
183
+ &:where(.rt-high-contrast) {
133
184
  & :where(.rt-BaseCheckboxIndicator) {
134
- color: var(--accent-1);
185
+ color: var(--accent-12);
135
186
  }
136
187
  }
137
188
  }
138
189
 
190
+ &:where(:active:not(:disabled)) {
191
+ top: calc(var(--classic-elevation-offset) + var(--classic-active-padding-offset-1));
192
+
193
+ &::before {
194
+ box-shadow: inset 0 var(--classic-border-width) var(--black-a3), 0 0 0 var(--classic-border-width) var(--accent-a7);
195
+ }
196
+ }
197
+
139
198
  &:where(:disabled) {
140
199
  &::before {
141
- box-shadow: var(--shadow-1);
142
- background-color: transparent;
200
+ background-color: var(--gray-a3);
201
+ box-shadow: none;
143
202
  background-image: none;
144
203
  }
145
204
  & :where(.rt-BaseCheckboxIndicator) {
146
205
  color: var(--gray-a8);
147
206
  }
207
+ top: 0;
148
208
  }
149
209
  }
150
210
 
@@ -4,11 +4,11 @@ import { highContrastPropDef } from '../../props/high-contrast.prop.js';
4
4
  import type { PropDef } from '../../props/prop-def.js';
5
5
 
6
6
  const sizes = ['1', '2', '3'] as const;
7
- const variants = ['classic', 'surface', 'soft'] as const;
7
+ const variants = ['classic', 'solid', 'soft'] as const;
8
8
 
9
9
  const baseCheckboxPropDefs = {
10
10
  size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '2', responsive: true },
11
- variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'surface' },
11
+ variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'solid' },
12
12
  ...colorPropDef,
13
13
  ...highContrastPropDef,
14
14
  } satisfies {
@@ -25,6 +25,7 @@
25
25
  height: var(--radio-size);
26
26
  width: var(--radio-size);
27
27
  border-radius: 100%;
28
+ transition: var(--transition-radio);
28
29
  }
29
30
 
30
31
  &::after {
@@ -35,6 +36,7 @@
35
36
  border-radius: 100%;
36
37
  /* Scale via transform to achieve perfect sub-pixel positioning */
37
38
  transform: scale(0.4);
39
+ transition: var(--transition-radio);
38
40
  }
39
41
 
40
42
  &:where(:checked, [data-state='checked']) {
@@ -75,9 +77,9 @@
75
77
  * *
76
78
  ***************************************************************************************************/
77
79
 
78
- /* surface */
80
+ /* solid */
79
81
 
80
- .rt-BaseRadioRoot:where(.rt-variant-surface) {
82
+ .rt-BaseRadioRoot:where(.rt-variant-solid) {
81
83
  &:where(:not(:checked), [data-state='unchecked'])::before {
82
84
  background-color: var(--color-surface);
83
85
  box-shadow: inset 0 0 0 1px var(--gray-a7);
@@ -110,36 +112,90 @@
110
112
  /* classic */
111
113
 
112
114
  .rt-BaseRadioRoot:where(.rt-variant-classic) {
115
+ position: relative;
116
+ top: var(--classic-elevation-offset);
117
+
113
118
  &:where(:not(:checked), [data-state='unchecked'])::before {
114
- background-color: var(--color-surface);
115
- box-shadow: inset 0 0 0 1px var(--gray-7), var(--shadow-1);
119
+ background-color: var(--accent-2);
120
+ /* prettier-ignore */
121
+ box-shadow:
122
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a2),
123
+ inset 0 var(--classic-border-width) var(--white-a12),
124
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
125
+ inset 0 calc(-1 * var(--classic-border-width)) var(--accent-a6),
126
+ 0 0 0 var(--classic-border-width) var(--accent-a5),
127
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--accent-a7);
128
+ }
129
+
130
+ :where(.dark, .dark-theme) &,
131
+ :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
132
+ &:where(:not(:checked), [data-state='unchecked'])::before {
133
+ /* prettier-ignore */
134
+ box-shadow:
135
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a3),
136
+ inset 0 var(--classic-border-width) var(--accent-a11),
137
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
138
+ inset 0 calc(-2 * var(--classic-border-width)) var(--black-a11),
139
+ 0 0 0 var(--classic-border-width-thick) var(--accent-a7),
140
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--black-a12);
141
+ }
116
142
  }
143
+
117
144
  &:where(:checked, [data-state='checked'])::before {
118
- background-color: var(--accent-indicator);
119
- background-image: linear-gradient(to bottom, var(--white-a3), transparent, var(--black-a3));
120
- box-shadow: inset 0 0.5px 0.5px var(--white-a4), inset 0 -0.5px 0.5px var(--black-a4);
145
+ background-color: var(--accent-3);
146
+ /* prettier-ignore */
147
+ box-shadow:
148
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a2),
149
+ inset 0 var(--classic-border-width) var(--white-a12),
150
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
151
+ inset 0 calc(-1 * var(--classic-border-width)) var(--accent-a6),
152
+ 0 0 0 var(--classic-border-width) var(--accent-a5),
153
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--accent-a7);
121
154
  }
122
155
  &::after {
123
- background-color: var(--accent-contrast);
156
+ background-color: var(--accent-a11);
157
+ }
158
+
159
+ :where(.dark, .dark-theme) &,
160
+ :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
161
+ &:where(:checked, [data-state='checked'])::before {
162
+ background-color: var(--accent-3);
163
+ /* prettier-ignore */
164
+ box-shadow:
165
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a3),
166
+ inset 0 var(--classic-border-width) var(--accent-a11),
167
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
168
+ inset 0 calc(-2 * var(--classic-border-width)) var(--black-a11),
169
+ 0 0 0 var(--classic-border-width-thick) var(--accent-a7),
170
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--black-a12);
171
+ }
124
172
  }
125
173
 
126
174
  &:where(.rt-high-contrast) {
127
- &:where(:checked, [data-state='checked'])::before {
175
+ &::after {
128
176
  background-color: var(--accent-12);
129
177
  }
130
- &::after {
131
- background-color: var(--accent-1);
178
+ }
179
+
180
+ &:where(:active:not(:disabled, [data-disabled])) {
181
+ top: calc(var(--classic-elevation-offset) + var(--classic-active-padding-offset-1));
182
+
183
+ &::before {
184
+ box-shadow: inset 0 var(--classic-border-width) var(--black-a3), 0 0 0 var(--classic-border-width) var(--accent-a7);
132
185
  }
133
186
  }
134
187
 
135
188
  &:where(:disabled, [data-disabled])::before {
136
- box-shadow: var(--shadow-1);
137
189
  background-color: var(--gray-a3);
190
+ box-shadow: none;
138
191
  background-image: none;
139
192
  }
140
193
  &:where(:disabled, [data-disabled])::after {
141
194
  background-color: var(--gray-a8);
142
195
  }
196
+ &:where(:disabled, [data-disabled]) {
197
+ top: 0;
198
+ }
143
199
  }
144
200
 
145
201
  /* soft */
@@ -4,11 +4,11 @@ import { highContrastPropDef } from '../../props/high-contrast.prop.js';
4
4
  import type { PropDef } from '../../props/prop-def.js';
5
5
 
6
6
  const sizes = ['1', '2', '3'] as const;
7
- const variants = ['classic', 'surface', 'soft'] as const;
7
+ const variants = ['classic', 'solid', 'soft'] as const;
8
8
 
9
9
  const baseRadioPropDefs = {
10
10
  size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '2', responsive: true },
11
- variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'surface' },
11
+ variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'solid' },
12
12
  ...colorPropDef,
13
13
  ...highContrastPropDef,
14
14
  } satisfies {
@@ -41,7 +41,7 @@
41
41
  letter-spacing: var(--letter-spacing-0);
42
42
  padding: calc(var(--space-1) * 0.5) calc(var(--space-1) * 1.5);
43
43
  gap: calc(var(--space-1) * 1.5);
44
- border-radius: max(var(--radius-1), var(--radius-full));
44
+ border-radius: max(calc(var(--radius-1) * var(--spacing-multiplier-medium)), var(--radius-full));
45
45
 
46
46
  /* Ghost variant gets reduced padding */
47
47
  &:where(.rt-variant-ghost) {
@@ -103,82 +103,40 @@
103
103
  /* * * * * * * * * * * * * * * * * * * */
104
104
 
105
105
  .rt-Card:where(.rt-variant-classic) {
106
- --card-border-width: 0px;
107
- --card-background-color: var(--gray-1);
106
+ --card-border-width: 1px;
107
+ --card-background-color: var(--color-surface);
108
108
 
109
- /* Add elevation offset like Button classic variant */
110
- position: relative;
111
- top: var(--classic-elevation-offset);
112
-
113
- /* Apply shadows directly like Button classic variant */
114
- box-shadow:
115
- inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--gray-a2),
116
- inset 0 var(--classic-border-width) var(--white-a12),
117
- inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--gray-a2),
118
- inset 0 calc(-1 * var(--classic-border-width)) var(--gray-a6),
119
- 0 0 0 var(--classic-border-width) var(--gray-a5),
120
- 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--gray-a7);
121
-
122
- /* Dark mode shadows */
123
- :where(.dark, .dark-theme) &,
124
- :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
125
- box-shadow:
126
- inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--gray-a3),
127
- inset 0 var(--classic-border-width) var(--gray-a11),
128
- inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--gray-a2),
129
- inset 0 calc(-2 * var(--classic-border-width)) var(--black-a11),
130
- 0 0 0 var(--classic-border-width-thick) var(--gray-a7),
131
- 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--black-a12);
132
- }
109
+ transition: box-shadow 120ms;
110
+ box-shadow: var(--base-card-classic-box-shadow-outer);
133
111
 
134
112
  &::before {
135
113
  background-color: var(--card-background-color);
136
114
  backdrop-filter: var(--backdrop-filter-panel);
137
115
  }
116
+ &::after {
117
+ box-shadow: var(--base-card-classic-box-shadow-inner);
118
+ }
138
119
  &:where(:any-link, button, label) {
139
120
  @media (hover: hover) {
140
121
  &:where(:hover) {
141
- box-shadow:
142
- inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--gray-a2),
143
- inset 0 var(--classic-border-width) var(--white-a12),
144
- 0 0 0 var(--classic-border-width) var(--gray-a5);
145
-
146
- :where(.dark, .dark-theme) &,
147
- :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
148
- box-shadow:
149
- inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--gray-a3),
150
- inset 0 var(--classic-border-width) var(--gray-a11),
151
- 0 0 0 var(--classic-border-width) var(--gray-a5);
152
- }
153
-
154
- &::before {
155
- background-color: var(--gray-2);
122
+ transition-duration: 40ms;
123
+ box-shadow: var(--base-card-classic-hover-box-shadow-outer);
124
+ &::after {
125
+ box-shadow: var(--base-card-classic-hover-box-shadow-inner);
156
126
  }
157
127
  }
158
128
  }
159
129
  &:where([data-state='open']) {
160
- box-shadow:
161
- inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--gray-a2),
162
- inset 0 var(--classic-border-width) var(--white-a12),
163
- 0 0 0 var(--classic-border-width) var(--gray-a5);
164
-
165
- :where(.dark, .dark-theme) &,
166
- :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
167
- box-shadow:
168
- inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--gray-a3),
169
- inset 0 var(--classic-border-width) var(--gray-a11),
170
- 0 0 0 var(--classic-border-width) var(--gray-a5);
171
- }
172
-
173
- &::before {
174
- background-color: var(--gray-2);
130
+ transition-duration: 40ms;
131
+ box-shadow: var(--base-card-classic-hover-box-shadow-outer);
132
+ &::after {
133
+ box-shadow: var(--base-card-classic-hover-box-shadow-inner);
175
134
  }
176
135
  }
177
136
  &:where(:active:not([data-state='open'])) {
178
- top: 0; /* Remove elevation when pressed */
179
- box-shadow: inset 0 var(--classic-border-width) var(--black-a3), 0 0 0 var(--classic-border-width) var(--gray-a7);
180
- &::before {
181
- background-color: var(--gray-2);
137
+ box-shadow: var(--base-card-classic-active-box-shadow-outer);
138
+ &::after {
139
+ box-shadow: var(--base-card-classic-active-box-shadow-inner);
182
140
  }
183
141
  }
184
142
  }
@@ -194,6 +152,11 @@
194
152
  --card-border-width: 0px;
195
153
  transition: var(--transition-background-blur);
196
154
 
155
+ /* Disable base card backdrop-filter to prevent double blur effect */
156
+ &::before {
157
+ backdrop-filter: none !important;
158
+ }
159
+
197
160
  &:where([data-flush='true']) {
198
161
  /* We reset the defined margin variables to avoid inheriting them from a higher component */
199
162
  /* If a margin IS defined on the component itself, the utility class will win and reset it */
@@ -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
  );