@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
@@ -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 {
@@ -28,7 +28,7 @@
28
28
  display: flex;
29
29
  align-items: center;
30
30
  justify-content: center;
31
- transition: var(--transition-tabs);
31
+ transition: var(--transition-tabs), var(--transition-background-blur);
32
32
  }
33
33
 
34
34
  .rt-BaseTabListTriggerInner {
@@ -139,6 +139,11 @@
139
139
  backdrop-filter: var(--backdrop-filter-components);
140
140
  --backdrop-filter-components: blur(var(--backdrop-blur-components));
141
141
  }
142
+
143
+ /* Disable backdrop-filter when inside elements that already have backdrop-filter */
144
+ :where(.rt-PopoverContent, .rt-BaseDialogContent, .rt-BaseMenuContent, .rt-DropdownMenuContent, .rt-ContextMenuContent, .rt-AlertDialogContent, .rt-HoverCardContent, .rt-TooltipContent, .rt-Card) & {
145
+ backdrop-filter: none !important;
146
+ }
142
147
  }
143
148
  &:where(:focus-visible:hover) :where(.rt-BaseTabListTriggerInner) {
144
149
  /* Base state: solid accent for solid panels */
@@ -104,10 +104,10 @@
104
104
 
105
105
  @media (prefers-reduced-motion: no-preference) {
106
106
  .rt-PopperContent {
107
- animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
107
+ animation-timing-function: var(--ease-3);
108
108
 
109
109
  &:where([data-state='open']) {
110
- animation-duration: 160ms;
110
+ animation-duration: var(--duration-2);
111
111
 
112
112
  /* Direction-aware animations (for dropdown menus with data-side) */
113
113
  &:where([data-side='top']) {
@@ -130,7 +130,7 @@
130
130
  }
131
131
 
132
132
  &:where([data-state='closed']) {
133
- animation-duration: 100ms;
133
+ animation-duration: var(--duration-1);
134
134
 
135
135
  /* Direction-aware animations (for dropdown menus with data-side) */
136
136
  &:where([data-side='top']) {
@@ -155,6 +155,6 @@
155
155
 
156
156
  /* Tab indicator animations - only when motion is preferred */
157
157
  .rt-BaseTabListTrigger:where([data-state='active'], [data-active])::before {
158
- animation: rt-tab-indicator-appear var(--duration-3) var(--ease-3);
158
+ animation: rt-tab-indicator-appear var(--duration-2) var(--ease-3);
159
159
  }
160
160
  }
@@ -211,6 +211,11 @@
211
211
  background-color: inherit;
212
212
  backdrop-filter: inherit;
213
213
  }
214
+
215
+ /* Disable backdrop-filter when inside elements that already have backdrop-filter */
216
+ :where(.rt-PopoverContent, .rt-BaseDialogContent, .rt-BaseMenuContent, .rt-DropdownMenuContent, .rt-ContextMenuContent, .rt-AlertDialogContent, .rt-HoverCardContent, .rt-TooltipContent, .rt-Card) & {
217
+ backdrop-filter: none !important;
218
+ }
214
219
  }
215
220
  }
216
221
  &:where(:active:not(:disabled, [data-disabled])) {
@@ -223,6 +228,11 @@
223
228
  background-color: inherit;
224
229
  backdrop-filter: inherit;
225
230
  }
231
+
232
+ /* Disable backdrop-filter when inside elements that already have backdrop-filter */
233
+ :where(.rt-PopoverContent, .rt-BaseDialogContent, .rt-BaseMenuContent, .rt-DropdownMenuContent, .rt-ContextMenuContent, .rt-AlertDialogContent, .rt-HoverCardContent, .rt-TooltipContent, .rt-Card) & {
234
+ backdrop-filter: none !important;
235
+ }
226
236
  }
227
237
  }
228
238
  }
@@ -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
  }
@@ -192,6 +150,12 @@
192
150
 
193
151
  .rt-Card:where(.rt-variant-ghost) {
194
152
  --card-border-width: 0px;
153
+ transition: var(--transition-background-blur);
154
+
155
+ /* Disable base card backdrop-filter to prevent double blur effect */
156
+ &::before {
157
+ backdrop-filter: none !important;
158
+ }
195
159
 
196
160
  &:where([data-flush='true']) {
197
161
  /* We reset the defined margin variables to avoid inheriting them from a higher component */
@@ -224,20 +188,98 @@
224
188
  &:where(:any-link, button, label) {
225
189
  @media (hover: hover) {
226
190
  &:where(:hover) {
227
- background-color: var(--gray-a3);
191
+ /* Base state: solid accent for solid panels */
192
+ background-color: var(--gray-3);
193
+
194
+ /* Theme-level translucent override for hover */
195
+ :where([data-panel-background='translucent']) & {
196
+ background-color: var(--gray-a3);
197
+ backdrop-filter: var(--backdrop-filter-components);
198
+ }
199
+
200
+ /* Component-level overrides for hover */
201
+ &:where([data-panel-background='solid']) {
202
+ background-color: var(--gray-3);
203
+ backdrop-filter: none;
204
+ --backdrop-filter-components: none;
205
+ }
206
+
207
+ &:where([data-panel-background='translucent']) {
208
+ background-color: var(--gray-a3);
209
+ backdrop-filter: var(--backdrop-filter-components);
210
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
211
+ }
212
+
213
+ /* Disable backdrop-filter when inside elements that already have backdrop-filter */
214
+ :where(.rt-PopoverContent, .rt-BaseDialogContent, .rt-BaseMenuContent, .rt-DropdownMenuContent, .rt-ContextMenuContent, .rt-AlertDialogContent, .rt-HoverCardContent, .rt-TooltipContent, .rt-Card) & {
215
+ backdrop-filter: none !important;
216
+ }
217
+
228
218
  &:where(:focus-visible) {
229
219
  background-color: var(--focus-a2);
230
220
  }
231
221
  }
232
222
  }
233
223
  &:where([data-state='open']) {
234
- background-color: var(--gray-a3);
224
+ /* Base state: solid accent for solid panels */
225
+ background-color: var(--gray-3);
226
+
227
+ /* Theme-level translucent override for open */
228
+ :where([data-panel-background='translucent']) & {
229
+ background-color: var(--gray-a3);
230
+ backdrop-filter: var(--backdrop-filter-components);
231
+ }
232
+
233
+ /* Component-level overrides for open */
234
+ &:where([data-panel-background='solid']) {
235
+ background-color: var(--gray-3);
236
+ backdrop-filter: none;
237
+ --backdrop-filter-components: none;
238
+ }
239
+
240
+ &:where([data-panel-background='translucent']) {
241
+ background-color: var(--gray-a3);
242
+ backdrop-filter: var(--backdrop-filter-components);
243
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
244
+ }
245
+
246
+ /* Disable backdrop-filter when inside elements that already have backdrop-filter */
247
+ :where(.rt-PopoverContent, .rt-BaseDialogContent, .rt-BaseMenuContent, .rt-DropdownMenuContent, .rt-ContextMenuContent, .rt-AlertDialogContent, .rt-HoverCardContent, .rt-TooltipContent, .rt-Card) & {
248
+ backdrop-filter: none !important;
249
+ }
250
+
235
251
  &:where(:focus-visible) {
236
252
  background-color: var(--focus-a2);
237
253
  }
238
254
  }
239
255
  &:where(:active:not([data-state='open'])) {
240
- background-color: var(--gray-a4);
256
+ /* Base state: solid accent for solid panels */
257
+ background-color: var(--gray-4);
258
+
259
+ /* Theme-level translucent override for active */
260
+ :where([data-panel-background='translucent']) & {
261
+ background-color: var(--gray-a4);
262
+ backdrop-filter: var(--backdrop-filter-components);
263
+ }
264
+
265
+ /* Component-level overrides for active */
266
+ &:where([data-panel-background='solid']) {
267
+ background-color: var(--gray-4);
268
+ backdrop-filter: none;
269
+ --backdrop-filter-components: none;
270
+ }
271
+
272
+ &:where([data-panel-background='translucent']) {
273
+ background-color: var(--gray-a4);
274
+ backdrop-filter: var(--backdrop-filter-components);
275
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
276
+ }
277
+
278
+ /* Disable backdrop-filter when inside elements that already have backdrop-filter */
279
+ :where(.rt-PopoverContent, .rt-BaseDialogContent, .rt-BaseMenuContent, .rt-DropdownMenuContent, .rt-ContextMenuContent, .rt-AlertDialogContent, .rt-HoverCardContent, .rt-TooltipContent, .rt-Card) & {
280
+ backdrop-filter: none !important;
281
+ }
282
+
241
283
  &:where(:focus-visible) {
242
284
  background-color: var(--focus-a2);
243
285
  }
@@ -330,6 +372,11 @@
330
372
  backdrop-filter: var(--backdrop-filter-panel);
331
373
  --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
332
374
  }
375
+
376
+ /* Disable backdrop-filter when inside elements that already have backdrop-filter */
377
+ :where(.rt-PopoverContent, .rt-BaseDialogContent, .rt-BaseMenuContent, .rt-DropdownMenuContent, .rt-ContextMenuContent, .rt-AlertDialogContent, .rt-HoverCardContent, .rt-TooltipContent, .rt-Card) & {
378
+ backdrop-filter: none !important;
379
+ }
333
380
  }
334
381
  }
335
382
  }
@@ -356,6 +403,11 @@
356
403
  backdrop-filter: var(--backdrop-filter-panel);
357
404
  --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
358
405
  }
406
+
407
+ /* Disable backdrop-filter when inside elements that already have backdrop-filter */
408
+ :where(.rt-PopoverContent, .rt-BaseDialogContent, .rt-BaseMenuContent, .rt-DropdownMenuContent, .rt-ContextMenuContent, .rt-AlertDialogContent, .rt-HoverCardContent, .rt-TooltipContent, .rt-Card) & {
409
+ backdrop-filter: none !important;
410
+ }
359
411
  }
360
412
  }
361
413
  &:where(:active:not([data-state='open'])) {