@kushagradhawan/kookie-ui 0.1.16 → 0.1.18

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 (276) hide show
  1. package/components.css +3730 -1072
  2. package/dist/cjs/components/_internal/base-button.d.ts.map +1 -1
  3. package/dist/cjs/components/_internal/base-button.js +1 -1
  4. package/dist/cjs/components/_internal/base-button.js.map +3 -3
  5. package/dist/cjs/components/_internal/base-button.props.d.ts +9 -0
  6. package/dist/cjs/components/_internal/base-button.props.d.ts.map +1 -1
  7. package/dist/cjs/components/_internal/base-button.props.js +1 -1
  8. package/dist/cjs/components/_internal/base-button.props.js.map +3 -3
  9. package/dist/cjs/components/_internal/base-menu.props.d.ts +5 -0
  10. package/dist/cjs/components/_internal/base-menu.props.d.ts.map +1 -1
  11. package/dist/cjs/components/_internal/base-menu.props.js +1 -1
  12. package/dist/cjs/components/_internal/base-menu.props.js.map +3 -3
  13. package/dist/cjs/components/_internal/base-tab-list.props.d.ts +5 -0
  14. package/dist/cjs/components/_internal/base-tab-list.props.d.ts.map +1 -1
  15. package/dist/cjs/components/_internal/base-tab-list.props.js +1 -1
  16. package/dist/cjs/components/_internal/base-tab-list.props.js.map +3 -3
  17. package/dist/cjs/components/alert-dialog.d.ts.map +1 -1
  18. package/dist/cjs/components/alert-dialog.js +1 -1
  19. package/dist/cjs/components/alert-dialog.js.map +3 -3
  20. package/dist/cjs/components/avatar.d.ts.map +1 -1
  21. package/dist/cjs/components/avatar.js +1 -1
  22. package/dist/cjs/components/avatar.js.map +3 -3
  23. package/dist/cjs/components/avatar.props.d.ts +6 -1
  24. package/dist/cjs/components/avatar.props.d.ts.map +1 -1
  25. package/dist/cjs/components/avatar.props.js +1 -1
  26. package/dist/cjs/components/avatar.props.js.map +3 -3
  27. package/dist/cjs/components/badge.d.ts.map +1 -1
  28. package/dist/cjs/components/badge.js +1 -1
  29. package/dist/cjs/components/badge.js.map +3 -3
  30. package/dist/cjs/components/badge.props.d.ts +6 -1
  31. package/dist/cjs/components/badge.props.d.ts.map +1 -1
  32. package/dist/cjs/components/badge.props.js +1 -1
  33. package/dist/cjs/components/badge.props.js.map +2 -2
  34. package/dist/cjs/components/callout.d.ts.map +1 -1
  35. package/dist/cjs/components/callout.js +1 -1
  36. package/dist/cjs/components/callout.js.map +3 -3
  37. package/dist/cjs/components/callout.props.d.ts +5 -0
  38. package/dist/cjs/components/callout.props.d.ts.map +1 -1
  39. package/dist/cjs/components/callout.props.js +1 -1
  40. package/dist/cjs/components/callout.props.js.map +3 -3
  41. package/dist/cjs/components/card.d.ts.map +1 -1
  42. package/dist/cjs/components/card.js +1 -1
  43. package/dist/cjs/components/card.js.map +3 -3
  44. package/dist/cjs/components/card.props.d.ts +11 -2
  45. package/dist/cjs/components/card.props.d.ts.map +1 -1
  46. package/dist/cjs/components/card.props.js +1 -1
  47. package/dist/cjs/components/card.props.js.map +3 -3
  48. package/dist/cjs/components/context-menu.d.ts.map +1 -1
  49. package/dist/cjs/components/context-menu.js +1 -1
  50. package/dist/cjs/components/context-menu.js.map +3 -3
  51. package/dist/cjs/components/dialog.d.ts.map +1 -1
  52. package/dist/cjs/components/dialog.js +1 -1
  53. package/dist/cjs/components/dialog.js.map +3 -3
  54. package/dist/cjs/components/dialog.props.d.ts +5 -0
  55. package/dist/cjs/components/dialog.props.d.ts.map +1 -1
  56. package/dist/cjs/components/dialog.props.js +1 -1
  57. package/dist/cjs/components/dialog.props.js.map +3 -3
  58. package/dist/cjs/components/dropdown-menu.d.ts.map +1 -1
  59. package/dist/cjs/components/dropdown-menu.js +1 -1
  60. package/dist/cjs/components/dropdown-menu.js.map +3 -3
  61. package/dist/cjs/components/image.d.ts +6 -1
  62. package/dist/cjs/components/image.d.ts.map +1 -1
  63. package/dist/cjs/components/image.js +1 -1
  64. package/dist/cjs/components/image.js.map +3 -3
  65. package/dist/cjs/components/popover.d.ts.map +1 -1
  66. package/dist/cjs/components/popover.js +1 -1
  67. package/dist/cjs/components/popover.js.map +3 -3
  68. package/dist/cjs/components/popover.props.d.ts +5 -0
  69. package/dist/cjs/components/popover.props.d.ts.map +1 -1
  70. package/dist/cjs/components/popover.props.js +1 -1
  71. package/dist/cjs/components/popover.props.js.map +3 -3
  72. package/dist/cjs/components/select.d.ts.map +1 -1
  73. package/dist/cjs/components/select.js +1 -1
  74. package/dist/cjs/components/select.js.map +3 -3
  75. package/dist/cjs/components/select.props.d.ts +6 -1
  76. package/dist/cjs/components/select.props.d.ts.map +1 -1
  77. package/dist/cjs/components/select.props.js +1 -1
  78. package/dist/cjs/components/select.props.js.map +2 -2
  79. package/dist/cjs/components/sidebar.d.ts +13 -2
  80. package/dist/cjs/components/sidebar.d.ts.map +1 -1
  81. package/dist/cjs/components/sidebar.js +1 -1
  82. package/dist/cjs/components/sidebar.js.map +3 -3
  83. package/dist/cjs/components/sidebar.props.d.ts +5 -0
  84. package/dist/cjs/components/sidebar.props.d.ts.map +1 -1
  85. package/dist/cjs/components/sidebar.props.js +1 -1
  86. package/dist/cjs/components/sidebar.props.js.map +2 -2
  87. package/dist/cjs/components/tabs.d.ts.map +1 -1
  88. package/dist/cjs/components/tabs.js +1 -1
  89. package/dist/cjs/components/tabs.js.map +3 -3
  90. package/dist/cjs/components/text-area.d.ts.map +1 -1
  91. package/dist/cjs/components/text-area.js +1 -1
  92. package/dist/cjs/components/text-area.js.map +3 -3
  93. package/dist/cjs/components/text-area.props.d.ts +6 -1
  94. package/dist/cjs/components/text-area.props.d.ts.map +1 -1
  95. package/dist/cjs/components/text-area.props.js +1 -1
  96. package/dist/cjs/components/text-area.props.js.map +3 -3
  97. package/dist/cjs/components/text-field.d.ts.map +1 -1
  98. package/dist/cjs/components/text-field.js +2 -2
  99. package/dist/cjs/components/text-field.js.map +3 -3
  100. package/dist/cjs/components/text-field.props.d.ts +6 -1
  101. package/dist/cjs/components/text-field.props.d.ts.map +1 -1
  102. package/dist/cjs/components/text-field.props.js +1 -1
  103. package/dist/cjs/components/text-field.props.js.map +3 -3
  104. package/dist/cjs/components/theme.d.ts.map +1 -1
  105. package/dist/cjs/components/theme.js +1 -1
  106. package/dist/cjs/components/theme.js.map +2 -2
  107. package/dist/cjs/helpers/map-prop-values.js +1 -1
  108. package/dist/cjs/helpers/map-prop-values.js.map +2 -2
  109. package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
  110. package/dist/esm/components/_internal/base-button.js +1 -1
  111. package/dist/esm/components/_internal/base-button.js.map +3 -3
  112. package/dist/esm/components/_internal/base-button.props.d.ts +9 -0
  113. package/dist/esm/components/_internal/base-button.props.d.ts.map +1 -1
  114. package/dist/esm/components/_internal/base-button.props.js +1 -1
  115. package/dist/esm/components/_internal/base-button.props.js.map +3 -3
  116. package/dist/esm/components/_internal/base-menu.props.d.ts +5 -0
  117. package/dist/esm/components/_internal/base-menu.props.d.ts.map +1 -1
  118. package/dist/esm/components/_internal/base-menu.props.js +1 -1
  119. package/dist/esm/components/_internal/base-menu.props.js.map +3 -3
  120. package/dist/esm/components/_internal/base-tab-list.props.d.ts +5 -0
  121. package/dist/esm/components/_internal/base-tab-list.props.d.ts.map +1 -1
  122. package/dist/esm/components/_internal/base-tab-list.props.js +1 -1
  123. package/dist/esm/components/_internal/base-tab-list.props.js.map +3 -3
  124. package/dist/esm/components/alert-dialog.d.ts.map +1 -1
  125. package/dist/esm/components/alert-dialog.js +1 -1
  126. package/dist/esm/components/alert-dialog.js.map +3 -3
  127. package/dist/esm/components/avatar.d.ts.map +1 -1
  128. package/dist/esm/components/avatar.js +1 -1
  129. package/dist/esm/components/avatar.js.map +3 -3
  130. package/dist/esm/components/avatar.props.d.ts +6 -1
  131. package/dist/esm/components/avatar.props.d.ts.map +1 -1
  132. package/dist/esm/components/avatar.props.js +1 -1
  133. package/dist/esm/components/avatar.props.js.map +3 -3
  134. package/dist/esm/components/badge.d.ts.map +1 -1
  135. package/dist/esm/components/badge.js +1 -1
  136. package/dist/esm/components/badge.js.map +3 -3
  137. package/dist/esm/components/badge.props.d.ts +6 -1
  138. package/dist/esm/components/badge.props.d.ts.map +1 -1
  139. package/dist/esm/components/badge.props.js +1 -1
  140. package/dist/esm/components/badge.props.js.map +2 -2
  141. package/dist/esm/components/callout.d.ts.map +1 -1
  142. package/dist/esm/components/callout.js +1 -1
  143. package/dist/esm/components/callout.js.map +3 -3
  144. package/dist/esm/components/callout.props.d.ts +5 -0
  145. package/dist/esm/components/callout.props.d.ts.map +1 -1
  146. package/dist/esm/components/callout.props.js +1 -1
  147. package/dist/esm/components/callout.props.js.map +3 -3
  148. package/dist/esm/components/card.d.ts.map +1 -1
  149. package/dist/esm/components/card.js +1 -1
  150. package/dist/esm/components/card.js.map +3 -3
  151. package/dist/esm/components/card.props.d.ts +11 -2
  152. package/dist/esm/components/card.props.d.ts.map +1 -1
  153. package/dist/esm/components/card.props.js +1 -1
  154. package/dist/esm/components/card.props.js.map +3 -3
  155. package/dist/esm/components/context-menu.d.ts.map +1 -1
  156. package/dist/esm/components/context-menu.js +1 -1
  157. package/dist/esm/components/context-menu.js.map +3 -3
  158. package/dist/esm/components/dialog.d.ts.map +1 -1
  159. package/dist/esm/components/dialog.js +1 -1
  160. package/dist/esm/components/dialog.js.map +3 -3
  161. package/dist/esm/components/dialog.props.d.ts +5 -0
  162. package/dist/esm/components/dialog.props.d.ts.map +1 -1
  163. package/dist/esm/components/dialog.props.js +1 -1
  164. package/dist/esm/components/dialog.props.js.map +3 -3
  165. package/dist/esm/components/dropdown-menu.d.ts.map +1 -1
  166. package/dist/esm/components/dropdown-menu.js +1 -1
  167. package/dist/esm/components/dropdown-menu.js.map +3 -3
  168. package/dist/esm/components/image.d.ts +6 -1
  169. package/dist/esm/components/image.d.ts.map +1 -1
  170. package/dist/esm/components/image.js +1 -1
  171. package/dist/esm/components/image.js.map +3 -3
  172. package/dist/esm/components/popover.d.ts.map +1 -1
  173. package/dist/esm/components/popover.js +1 -1
  174. package/dist/esm/components/popover.js.map +3 -3
  175. package/dist/esm/components/popover.props.d.ts +5 -0
  176. package/dist/esm/components/popover.props.d.ts.map +1 -1
  177. package/dist/esm/components/popover.props.js +1 -1
  178. package/dist/esm/components/popover.props.js.map +3 -3
  179. package/dist/esm/components/select.d.ts.map +1 -1
  180. package/dist/esm/components/select.js +1 -1
  181. package/dist/esm/components/select.js.map +3 -3
  182. package/dist/esm/components/select.props.d.ts +6 -1
  183. package/dist/esm/components/select.props.d.ts.map +1 -1
  184. package/dist/esm/components/select.props.js +1 -1
  185. package/dist/esm/components/select.props.js.map +2 -2
  186. package/dist/esm/components/sidebar.d.ts +13 -2
  187. package/dist/esm/components/sidebar.d.ts.map +1 -1
  188. package/dist/esm/components/sidebar.js +1 -1
  189. package/dist/esm/components/sidebar.js.map +3 -3
  190. package/dist/esm/components/sidebar.props.d.ts +5 -0
  191. package/dist/esm/components/sidebar.props.d.ts.map +1 -1
  192. package/dist/esm/components/sidebar.props.js +1 -1
  193. package/dist/esm/components/sidebar.props.js.map +2 -2
  194. package/dist/esm/components/tabs.d.ts.map +1 -1
  195. package/dist/esm/components/tabs.js +1 -1
  196. package/dist/esm/components/tabs.js.map +3 -3
  197. package/dist/esm/components/text-area.d.ts.map +1 -1
  198. package/dist/esm/components/text-area.js +1 -1
  199. package/dist/esm/components/text-area.js.map +3 -3
  200. package/dist/esm/components/text-area.props.d.ts +6 -1
  201. package/dist/esm/components/text-area.props.d.ts.map +1 -1
  202. package/dist/esm/components/text-area.props.js +1 -1
  203. package/dist/esm/components/text-area.props.js.map +3 -3
  204. package/dist/esm/components/text-field.d.ts.map +1 -1
  205. package/dist/esm/components/text-field.js +2 -2
  206. package/dist/esm/components/text-field.js.map +3 -3
  207. package/dist/esm/components/text-field.props.d.ts +6 -1
  208. package/dist/esm/components/text-field.props.d.ts.map +1 -1
  209. package/dist/esm/components/text-field.props.js +1 -1
  210. package/dist/esm/components/text-field.props.js.map +3 -3
  211. package/dist/esm/components/theme.d.ts.map +1 -1
  212. package/dist/esm/components/theme.js +1 -1
  213. package/dist/esm/components/theme.js.map +2 -2
  214. package/dist/esm/helpers/map-prop-values.js +1 -1
  215. package/dist/esm/helpers/map-prop-values.js.map +2 -2
  216. package/package.json +1 -1
  217. package/src/components/_internal/base-button.css +518 -110
  218. package/src/components/_internal/base-button.props.ts +5 -0
  219. package/src/components/_internal/base-button.tsx +4 -0
  220. package/src/components/_internal/base-card.css +59 -11
  221. package/src/components/_internal/base-dialog.css +26 -9
  222. package/src/components/_internal/base-menu.css +192 -21
  223. package/src/components/_internal/base-menu.props.ts +7 -0
  224. package/src/components/_internal/base-tab-list.css +56 -5
  225. package/src/components/_internal/base-tab-list.props.ts +3 -0
  226. package/src/components/alert-dialog.tsx +22 -7
  227. package/src/components/animations.css +31 -0
  228. package/src/components/avatar.css +436 -9
  229. package/src/components/avatar.props.tsx +4 -1
  230. package/src/components/avatar.tsx +19 -6
  231. package/src/components/badge.css +222 -7
  232. package/src/components/badge.props.tsx +3 -1
  233. package/src/components/badge.tsx +3 -2
  234. package/src/components/button.css +17 -17
  235. package/src/components/callout.css +75 -6
  236. package/src/components/callout.props.tsx +3 -0
  237. package/src/components/callout.tsx +6 -5
  238. package/src/components/card.css +361 -44
  239. package/src/components/card.props.tsx +7 -2
  240. package/src/components/card.tsx +7 -1
  241. package/src/components/context-menu.tsx +47 -22
  242. package/src/components/dialog.props.tsx +3 -0
  243. package/src/components/dialog.tsx +22 -7
  244. package/src/components/dropdown-menu.css +10 -10
  245. package/src/components/dropdown-menu.tsx +37 -11
  246. package/src/components/icon-button.css +36 -8
  247. package/src/components/image.tsx +92 -73
  248. package/src/components/kbd.css +122 -54
  249. package/src/components/popover.css +22 -3
  250. package/src/components/popover.props.tsx +3 -0
  251. package/src/components/popover.tsx +15 -8
  252. package/src/components/select.css +386 -95
  253. package/src/components/select.props.tsx +7 -1
  254. package/src/components/select.tsx +21 -13
  255. package/src/components/sidebar.css +201 -86
  256. package/src/components/sidebar.props.tsx +15 -3
  257. package/src/components/sidebar.tsx +306 -235
  258. package/src/components/tabs.css +3 -1
  259. package/src/components/tabs.tsx +8 -3
  260. package/src/components/text-area.css +323 -32
  261. package/src/components/text-area.props.tsx +4 -1
  262. package/src/components/text-area.tsx +3 -2
  263. package/src/components/text-field.css +336 -15
  264. package/src/components/text-field.props.tsx +4 -1
  265. package/src/components/text-field.tsx +5 -7
  266. package/src/components/theme.tsx +11 -9
  267. package/src/helpers/map-prop-values.ts +1 -1
  268. package/src/styles/tokens/color.css +19 -5
  269. package/src/styles/tokens/constants.css +118 -0
  270. package/src/styles/tokens/index.css +1 -0
  271. package/src/styles/tokens/radius.css +9 -6
  272. package/src/styles/tokens/shadow.css +10 -10
  273. package/src/styles/tokens/transition.css +33 -1
  274. package/styles.css +3846 -1089
  275. package/tokens/base.css +51 -22
  276. package/tokens.css +133 -34
@@ -1,6 +1,7 @@
1
1
  .rt-TextFieldRoot {
2
2
  display: flex;
3
3
  align-items: stretch;
4
+ transition: var(--transition-text-field);
4
5
 
5
6
  font-family: var(--default-font-family);
6
7
  font-weight: var(--font-weight-regular);
@@ -23,6 +24,11 @@
23
24
  &::selection {
24
25
  background-color: var(--text-field-selection-color);
25
26
  }
27
+
28
+ /* Reduced motion support */
29
+ @media (prefers-reduced-motion: reduce) {
30
+ transition: none;
31
+ }
26
32
  }
27
33
 
28
34
  .rt-TextFieldInput {
@@ -189,7 +195,7 @@
189
195
  &:where(.rt-r-size-1) {
190
196
  --text-field-height: var(--space-5);
191
197
  --text-field-padding: calc(var(--space-1) * 1.5 - var(--text-field-border-width));
192
- --text-field-border-radius: max(var(--radius-2), var(--radius-full));
198
+ --text-field-border-radius: max(var(--radius-1), var(--radius-full));
193
199
  --text-field-native-icon-size: var(--space-3);
194
200
  font-size: var(--font-size-1);
195
201
  letter-spacing: var(--letter-spacing-1);
@@ -198,6 +204,13 @@
198
204
  gap: var(--space-2);
199
205
  padding-left: var(--space-1);
200
206
  padding-right: var(--space-1);
207
+
208
+ /* stylelint-disable-next-line selector-max-type */
209
+ & :where(svg) {
210
+ width: calc(var(--space-3) * 1.175);
211
+ height: calc(var(--space-3) * 1.175);
212
+ flex-shrink: 0;
213
+ }
201
214
  }
202
215
 
203
216
  & :where(.rt-TextFieldInput) {
@@ -236,6 +249,13 @@
236
249
  gap: var(--space-2);
237
250
  padding-left: var(--space-2);
238
251
  padding-right: var(--space-2);
252
+
253
+ /* stylelint-disable-next-line selector-max-type */
254
+ & :where(svg) {
255
+ width: var(--space-4);
256
+ height: var(--space-4);
257
+ flex-shrink: 0;
258
+ }
239
259
  }
240
260
  }
241
261
 
@@ -262,6 +282,13 @@
262
282
  gap: var(--space-3);
263
283
  padding-left: var(--space-3);
264
284
  padding-right: var(--space-3);
285
+
286
+ /* stylelint-disable-next-line selector-max-type */
287
+ & :where(svg) {
288
+ width: calc(var(--space-4) * 1.175);
289
+ height: calc(var(--space-4) * 1.175);
290
+ flex-shrink: 0;
291
+ }
265
292
  }
266
293
  }
267
294
  }
@@ -275,7 +302,7 @@
275
302
 
276
303
  /* surface */
277
304
 
278
- .rt-TextFieldRoot:where(.rt-variant-surface) {
305
+ .rt-TextFieldRoot:where(.rt-variant-outline) {
279
306
  --text-field-selection-color: var(--focus-a5);
280
307
  --text-field-focus-color: var(--focus-8);
281
308
  --text-field-border-width: 1px;
@@ -283,9 +310,32 @@
283
310
  /* Blend inner shadow with page background */
284
311
  background-clip: content-box;
285
312
  background-color: var(--color-surface);
286
- box-shadow: inset 0 0 0 var(--text-field-border-width) var(--gray-a7);
313
+ box-shadow: inset 0 0 0 var(--text-field-border-width) var(--gray-a6);
287
314
  color: var(--gray-12);
288
315
 
316
+ /* Theme-level translucent override */
317
+ :where([data-panel-background='translucent']) & {
318
+ backdrop-filter: var(--backdrop-filter-components);
319
+ }
320
+
321
+ /* Component-level overrides for surface variant */
322
+ &:where([data-panel-background='solid']) {
323
+ --color-surface: var(--color-surface-solid);
324
+ backdrop-filter: none;
325
+ }
326
+
327
+ &:where([data-panel-background='translucent']) {
328
+ --color-surface: var(--color-surface-translucent);
329
+ backdrop-filter: var(--backdrop-filter-components);
330
+ }
331
+
332
+ /* Hover effects */
333
+ @media (hover: hover) {
334
+ &:where(:hover:not(:has(.rt-TextFieldInput:focus))) {
335
+ box-shadow: inset 0 0 0 var(--text-field-border-width) var(--gray-a8);
336
+ }
337
+ }
338
+
289
339
  & :where(.rt-TextFieldInput) {
290
340
  &::placeholder {
291
341
  color: var(--gray-a10);
@@ -304,7 +354,7 @@
304
354
  &:where(:has(.rt-TextFieldInput:where(:autofill, [data-com-onepassword-filled]):not(:disabled, :read-only))) {
305
355
  /* Blend with focus color */
306
356
  background-image: linear-gradient(var(--focus-a2), var(--focus-a2));
307
- box-shadow: inset 0 0 0 1px var(--focus-a5), inset 0 0 0 1px var(--gray-a5);
357
+ box-shadow: inset 0 0 0 1px var(--focus-a5);
308
358
  }
309
359
 
310
360
  &:where(:has(.rt-TextFieldInput:where(:disabled, :read-only))) {
@@ -319,23 +369,55 @@
319
369
  .rt-TextFieldRoot:where(.rt-variant-classic) {
320
370
  --text-field-selection-color: var(--focus-a5);
321
371
  --text-field-focus-color: var(--focus-8);
322
- --text-field-border-width: 1px;
372
+ --text-field-border-width: 0px;
323
373
 
324
- background: linear-gradient(to bottom, var(--color-surface), var(--gray-1));
325
- box-shadow: var(--shadow-2);
374
+ position: relative;
375
+ top: calc(var(--classic-elevation-offset) / 3); /* More pronounced than before */
376
+ background-color: var(--color-surface);
326
377
  color: var(--gray-12);
327
378
 
379
+ /* 3D inset effect - more pronounced but still subtle */
380
+ /* prettier-ignore */
381
+ box-shadow:
382
+ inset 0 var(--classic-border-width) calc(var(--classic-shadow-blur-small) / 1.5) var(--gray-a3),
383
+ inset 0 calc(-1 * var(--classic-border-width)) var(--gray-a1),
384
+ inset 0 calc(var(--classic-border-width) * 2) calc(var(--classic-shadow-blur-medium) / 3) var(--gray-a2),
385
+ 0 0 0 var(--classic-border-width) var(--gray-a5);
386
+
387
+ /* Theme-level translucent override */
388
+ :where([data-panel-background='translucent']) & {
389
+ backdrop-filter: var(--backdrop-filter-components);
390
+ }
391
+
392
+ /* Component-level overrides for surface variant */
393
+ &:where([data-panel-background='solid']) {
394
+ --color-surface: var(--color-surface-solid);
395
+ backdrop-filter: none;
396
+ }
397
+
398
+ &:where([data-panel-background='translucent']) {
399
+ --color-surface: var(--color-surface-translucent);
400
+ backdrop-filter: var(--backdrop-filter-components);
401
+ }
402
+
403
+ /* Hover effects - slightly reduced inset */
328
404
  @media (hover: hover) {
329
- &:where(:hover) {
330
- background: linear-gradient(to bottom, var(--gray-1), var(--gray-2));
331
- box-shadow: var(--shadow-2);
405
+ &:where(:hover:not(:has(.rt-TextFieldInput:focus))) {
406
+ /* prettier-ignore */
407
+ box-shadow:
408
+ inset 0 calc(var(--classic-border-width) / 1.5) calc(var(--classic-shadow-blur-small) / 2) var(--gray-a2),
409
+ inset 0 calc(-1 * var(--classic-border-width) / 1.5) var(--gray-a1),
410
+ inset 0 var(--classic-border-width) calc(var(--classic-shadow-blur-medium) / 4) var(--gray-a2),
411
+ 0 0 0 var(--classic-border-width) var(--gray-a6);
332
412
  }
333
413
  }
334
414
 
415
+ /* Focus state - accent ring with minimal inset */
335
416
  &:where(:has(.rt-TextFieldInput:focus)) {
417
+ /* prettier-ignore */
336
418
  box-shadow:
337
- inset 0 0 0 1px var(--focus-8),
338
- var(--shadow-1);
419
+ inset 0 calc(var(--classic-border-width) / 2) calc(var(--classic-shadow-blur-small) / 3) var(--gray-a1),
420
+ 0 0 0 2px var(--focus-8);
339
421
  }
340
422
 
341
423
  & :where(.rt-TextFieldInput) {
@@ -356,13 +438,13 @@
356
438
  &:where(:has(.rt-TextFieldInput:where(:autofill, [data-com-onepassword-filled]):not(:disabled, :read-only))) {
357
439
  /* Blend with focus color */
358
440
  background-image: linear-gradient(var(--focus-a2), var(--focus-a2));
359
- box-shadow: inset 0 0 0 1px var(--focus-a5), inset 0 0 0 1px var(--gray-a5);
441
+ box-shadow: var(--shadow-2);
360
442
  }
361
443
 
362
444
  &:where(:has(.rt-TextFieldInput:where(:disabled, :read-only))) {
363
445
  /* Blend with grey */
364
446
  background-image: linear-gradient(var(--gray-a2), var(--gray-a2));
365
- box-shadow: none;
447
+ box-shadow: var(--shadow-1);
366
448
  }
367
449
  }
368
450
 
@@ -373,9 +455,55 @@
373
455
  --text-field-focus-color: var(--accent-8);
374
456
  --text-field-border-width: 0px;
375
457
 
376
- background-color: var(--accent-a3);
458
+ /* Base state: solid accent for solid panels */
459
+ background-color: var(--accent-3);
377
460
  color: var(--accent-12);
378
461
 
462
+ /* Theme-level translucent override */
463
+ :where([data-panel-background='translucent']) & {
464
+ background-color: var(--accent-a3);
465
+ backdrop-filter: var(--backdrop-filter-components);
466
+ }
467
+
468
+ /* Component-level overrides (higher specificity) */
469
+ &:where([data-panel-background='solid']) {
470
+ background-color: var(--accent-3);
471
+ backdrop-filter: none;
472
+ --backdrop-filter-components: none;
473
+ }
474
+
475
+ &:where([data-panel-background='translucent']) {
476
+ background-color: var(--accent-a3);
477
+ backdrop-filter: var(--backdrop-filter-components);
478
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
479
+ }
480
+
481
+ /* Hover effects */
482
+ @media (hover: hover) {
483
+ &:where(:hover:not(:has(.rt-TextFieldInput:focus))) {
484
+ /* Base state: solid accent for solid panels */
485
+ background-color: var(--accent-4);
486
+
487
+ /* Theme-level translucent override for hover */
488
+ :where([data-panel-background='translucent']) & {
489
+ background-color: var(--accent-a4);
490
+ }
491
+
492
+ /* Component-level overrides for hover */
493
+ &:where([data-panel-background='solid']) {
494
+ background-color: var(--accent-4);
495
+ backdrop-filter: none;
496
+ --backdrop-filter-components: none;
497
+ }
498
+
499
+ &:where([data-panel-background='translucent']) {
500
+ background-color: var(--accent-a4);
501
+ backdrop-filter: var(--backdrop-filter-components);
502
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
503
+ }
504
+ }
505
+ }
506
+
379
507
  & :where(.rt-TextFieldInput) {
380
508
  &::placeholder {
381
509
  color: var(--accent-12);
@@ -402,6 +530,199 @@
402
530
  }
403
531
  }
404
532
 
533
+ /* ghost */
534
+
535
+ .rt-TextFieldRoot:where(.rt-variant-ghost) {
536
+ --text-field-selection-color: var(--accent-a5);
537
+ --text-field-focus-color: var(--accent-8);
538
+ --text-field-border-width: 0px;
539
+
540
+ background-color: transparent;
541
+ color: var(--gray-12);
542
+
543
+ & :where(.rt-TextFieldInput) {
544
+ &::placeholder {
545
+ color: var(--gray-a10);
546
+ }
547
+ }
548
+
549
+ & :where(.rt-TextFieldSlot) {
550
+ color: var(--gray-a11);
551
+
552
+ &:where([data-accent-color]) {
553
+ color: var(--accent-a11);
554
+ }
555
+ }
556
+
557
+ /* Hover effects */
558
+ @media (hover: hover) {
559
+ &:where(:hover:not(:has(.rt-TextFieldInput:focus))) {
560
+ /* Base state: solid accent for solid panels */
561
+ background-color: var(--accent-2);
562
+
563
+ /* Theme-level translucent override for hover */
564
+ :where([data-panel-background='translucent']) & {
565
+ background-color: var(--accent-a2);
566
+ backdrop-filter: var(--backdrop-filter-components);
567
+ }
568
+
569
+ /* Component-level overrides for hover */
570
+ &:where([data-panel-background='solid']) {
571
+ background-color: var(--accent-2);
572
+ backdrop-filter: none;
573
+ --backdrop-filter-components: none;
574
+ }
575
+
576
+ &:where([data-panel-background='translucent']) {
577
+ background-color: var(--accent-a2);
578
+ backdrop-filter: var(--backdrop-filter-components);
579
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
580
+ }
581
+ }
582
+ }
583
+
584
+ /* Show styling only on focus/interaction */
585
+ &:where(:focus-within) {
586
+ /* Base state: solid accent for solid panels */
587
+ background-color: var(--accent-2);
588
+
589
+ /* Theme-level translucent override */
590
+ :where([data-panel-background='translucent']) & {
591
+ background-color: var(--accent-a2);
592
+ backdrop-filter: var(--backdrop-filter-components);
593
+ }
594
+
595
+ /* Component-level overrides */
596
+ &:where([data-panel-background='solid']) {
597
+ background-color: var(--accent-2);
598
+ backdrop-filter: none;
599
+ }
600
+
601
+ &:where([data-panel-background='translucent']) {
602
+ background-color: var(--accent-a2);
603
+ backdrop-filter: var(--backdrop-filter-components);
604
+ }
605
+ }
606
+
607
+ /* prettier-ignore */
608
+ &:where(:has(.rt-TextFieldInput:where(:autofill, [data-com-onepassword-filled]):not(:disabled, :read-only))) {
609
+ background-color: var(--accent-a2);
610
+ box-shadow: inset 0 0 0 1px var(--accent-a5), inset 0 0 0 1px var(--gray-a4);
611
+ }
612
+
613
+ &:where(:has(.rt-TextFieldInput:where(:disabled, :read-only))) {
614
+ background-color: var(--gray-a2);
615
+ color: var(--gray-a8);
616
+ }
617
+ }
618
+
619
+ /* outline */
620
+
621
+ .rt-TextFieldRoot:where(.rt-variant-surface) {
622
+ --text-field-selection-color: var(--accent-a5);
623
+ --text-field-focus-color: var(--accent-8);
624
+ --text-field-border-width: 1px;
625
+
626
+ background-color: transparent;
627
+ box-shadow: inset 0 0 0 var(--text-field-border-width) var(--accent-7);
628
+ color: var(--gray-12);
629
+ transition: var(--transition-background-blur);
630
+
631
+ /* Theme-level panel awareness (NO backdrop filter for true transparency) */
632
+ :where([data-panel-background='translucent']) & {
633
+ box-shadow: inset 0 0 0 var(--text-field-border-width) var(--accent-a7);
634
+ }
635
+
636
+ /* Component-level overrides */
637
+ &:where([data-panel-background='solid']) {
638
+ box-shadow: inset 0 0 0 var(--text-field-border-width) var(--accent-7);
639
+ }
640
+
641
+ &:where([data-panel-background='translucent']) {
642
+ box-shadow: inset 0 0 0 var(--text-field-border-width) var(--accent-a7);
643
+ }
644
+
645
+ & :where(.rt-TextFieldInput) {
646
+ &::placeholder {
647
+ color: var(--gray-a10);
648
+ }
649
+ }
650
+
651
+ & :where(.rt-TextFieldSlot) {
652
+ color: var(--gray-a11);
653
+
654
+ &:where([data-accent-color]) {
655
+ color: var(--accent-a11);
656
+ }
657
+ }
658
+
659
+ /* Hover effects */
660
+ @media (hover: hover) {
661
+ &:where(:hover:not(:has(.rt-TextFieldInput:focus))) {
662
+ /* Base state: solid accent for solid panels */
663
+ background-color: var(--accent-2);
664
+
665
+ /* Theme-level translucent override for hover */
666
+ :where([data-panel-background='translucent']) & {
667
+ background-color: var(--accent-a2);
668
+ backdrop-filter: var(--backdrop-filter-components);
669
+ }
670
+
671
+ /* Component-level overrides for hover */
672
+ &:where([data-panel-background='solid']) {
673
+ background-color: var(--accent-2);
674
+ backdrop-filter: none;
675
+ --backdrop-filter-components: none;
676
+ }
677
+
678
+ &:where([data-panel-background='translucent']) {
679
+ background-color: var(--accent-a2);
680
+ backdrop-filter: var(--backdrop-filter-components);
681
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
682
+ }
683
+ }
684
+ }
685
+
686
+ /* Interaction states get light background */
687
+ &:where(:focus-within) {
688
+ /* Base state: solid accent for solid panels */
689
+ background-color: var(--accent-2);
690
+ box-shadow: inset 0 0 0 var(--text-field-border-width) var(--accent-8);
691
+
692
+ /* Theme-level translucent override */
693
+ :where([data-panel-background='translucent']) & {
694
+ background-color: var(--accent-a2);
695
+ box-shadow: inset 0 0 0 var(--text-field-border-width) var(--accent-a8);
696
+ backdrop-filter: var(--backdrop-filter-components);
697
+ }
698
+
699
+ /* Component-level overrides */
700
+ &:where([data-panel-background='solid']) {
701
+ background-color: var(--accent-2);
702
+ box-shadow: inset 0 0 0 var(--text-field-border-width) var(--accent-8);
703
+ backdrop-filter: none;
704
+ }
705
+
706
+ &:where([data-panel-background='translucent']) {
707
+ background-color: var(--accent-a2);
708
+ box-shadow: inset 0 0 0 var(--text-field-border-width) var(--accent-a8);
709
+ backdrop-filter: var(--backdrop-filter-components);
710
+ }
711
+ }
712
+
713
+ /* prettier-ignore */
714
+ &:where(:has(.rt-TextFieldInput:where(:autofill, [data-com-onepassword-filled]):not(:disabled, :read-only))) {
715
+ background-color: var(--accent-a2);
716
+ box-shadow: inset 0 0 0 1px var(--accent-a5), inset 0 0 0 1px var(--gray-a4);
717
+ }
718
+
719
+ &:where(:has(.rt-TextFieldInput:where(:disabled, :read-only))) {
720
+ background-color: var(--gray-a2);
721
+ box-shadow: inset 0 0 0 var(--text-field-border-width) var(--gray-a6);
722
+ color: var(--gray-a8);
723
+ }
724
+ }
725
+
405
726
  /* all disabled and read-only text fields */
406
727
 
407
728
  .rt-TextFieldInput {
@@ -6,16 +6,19 @@ import { flexPropDefs } from './flex.props.js';
6
6
  import type { PropDef } from '../props/prop-def.js';
7
7
 
8
8
  const sizes = ['1', '2', '3'] as const;
9
- const variants = ['classic', 'surface', 'soft'] as const;
9
+ const variants = ['classic', 'surface', 'soft', 'ghost', 'outline'] as const;
10
+ const panelBackgrounds = ['solid', 'translucent'] as const;
10
11
 
11
12
  const textFieldRootPropDefs = {
12
13
  size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '2', responsive: true },
13
14
  variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'surface' },
14
15
  ...colorPropDef,
15
16
  ...radiusPropDef,
17
+ panelBackground: { type: 'enum', values: panelBackgrounds, default: undefined },
16
18
  } satisfies {
17
19
  size: PropDef<(typeof sizes)[number]>;
18
20
  variant: PropDef<(typeof variants)[number]>;
21
+ panelBackground: PropDef<(typeof panelBackgrounds)[number] | undefined>;
19
22
  };
20
23
 
21
24
  const sides = ['left', 'right'] as const;
@@ -40,15 +40,13 @@ interface TextFieldRootProps extends TextFieldInputProps, MarginProps, TextField
40
40
  const TextFieldRoot = React.forwardRef<TextFieldRootElement, TextFieldRootProps>(
41
41
  (props, forwardedRef) => {
42
42
  const inputRef = React.useRef<HTMLInputElement>(null);
43
- const { children, className, color, radius, style, ...inputProps } = extractProps(
44
- props,
45
- textFieldRootPropDefs,
46
- marginPropDefs
47
- );
43
+ const { children, className, color, radius, panelBackground, style, ...inputProps } =
44
+ extractProps(props, textFieldRootPropDefs, marginPropDefs);
48
45
  return (
49
46
  <div
50
47
  data-accent-color={color}
51
48
  data-radius={radius}
49
+ data-panel-background={panelBackground}
52
50
  style={style}
53
51
  className={classNames('rt-TextFieldRoot', className)}
54
52
  onPointerDown={(event) => {
@@ -85,7 +83,7 @@ const TextFieldRoot = React.forwardRef<TextFieldRootElement, TextFieldRootProps>
85
83
  {children}
86
84
  </div>
87
85
  );
88
- }
86
+ },
89
87
  );
90
88
  TextFieldRoot.displayName = 'TextField.Root';
91
89
 
@@ -106,7 +104,7 @@ const TextFieldSlot = React.forwardRef<TextFieldSlotElement, TextFieldSlotProps>
106
104
  className={classNames('rt-TextFieldSlot', className)}
107
105
  />
108
106
  );
109
- }
107
+ },
110
108
  );
111
109
  TextFieldSlot.displayName = 'TextField.Slot';
112
110
 
@@ -116,7 +116,7 @@ const ThemeRoot = React.forwardRef<ThemeImplElement, ThemeImplPublicProps>(
116
116
  onScalingChange={setScaling}
117
117
  />
118
118
  );
119
- }
119
+ },
120
120
  );
121
121
  ThemeRoot.displayName = 'ThemeRoot';
122
122
 
@@ -135,12 +135,14 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
135
135
  isRoot,
136
136
  hasBackground: hasBackgroundProp,
137
137
  //
138
- appearance = context?.appearance ?? themePropDefs.appearance.default,
139
- accentColor = context?.accentColor ?? themePropDefs.accentColor.default,
140
- grayColor = context?.resolvedGrayColor ?? themePropDefs.grayColor.default,
141
- panelBackground = context?.panelBackground ?? themePropDefs.panelBackground.default,
142
- radius = context?.radius ?? themePropDefs.radius.default,
143
- scaling = context?.scaling ?? themePropDefs.scaling.default,
138
+ appearance = props.appearance ?? context?.appearance ?? themePropDefs.appearance.default,
139
+ accentColor = props.accentColor ?? context?.accentColor ?? themePropDefs.accentColor.default,
140
+ grayColor = props.grayColor ?? context?.resolvedGrayColor ?? themePropDefs.grayColor.default,
141
+ panelBackground = props.panelBackground ??
142
+ context?.panelBackground ??
143
+ themePropDefs.panelBackground.default,
144
+ radius = props.radius ?? context?.radius ?? themePropDefs.radius.default,
145
+ scaling = props.scaling ?? context?.scaling ?? themePropDefs.scaling.default,
144
146
  //
145
147
  onAppearanceChange = noop,
146
148
  onAccentColorChange = noop,
@@ -190,7 +192,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
190
192
  onPanelBackgroundChange,
191
193
  onRadiusChange,
192
194
  onScalingChange,
193
- ]
195
+ ],
194
196
  )}
195
197
  >
196
198
  <Comp
@@ -210,7 +212,7 @@ const ThemeImpl = React.forwardRef<ThemeImplElement, ThemeImplProps>((props, for
210
212
  light: appearance === 'light',
211
213
  dark: appearance === 'dark',
212
214
  },
213
- themeProps.className
215
+ themeProps.className,
214
216
  )}
215
217
  />
216
218
  </ThemeContext.Provider>
@@ -20,7 +20,7 @@ function mapResponsiveProp<Input extends string, Output>(
20
20
  function mapCalloutSizeToTextSize(
21
21
  size: (typeof calloutRootPropDefs.size.values)[number]
22
22
  ): (typeof textPropDefs.size.values)[number] {
23
- return size === '3' ? '3' : '2';
23
+ return size === '3' ? '3' : size === '1' ? '1' : '2';
24
24
  }
25
25
 
26
26
  function mapButtonSizeToSpinnerSize(
@@ -11,16 +11,22 @@
11
11
  --color-background: white;
12
12
  --color-overlay: var(--black-a6);
13
13
  --color-panel-solid: white;
14
- --color-panel-translucent: rgba(255, 255, 255, 0.7);
15
- --color-surface: rgba(255, 255, 255, 0.85);
14
+ --color-panel-translucent: rgba(255, 255, 255, var(--panel-opacity-light));
15
+ --color-surface-solid: white;
16
+ --color-surface-translucent: rgba(255, 255, 255, var(--surface-opacity-light));
17
+ --color-dialog-solid: white;
18
+ --color-dialog-translucent: rgba(255, 255, 255, var(--dialog-opacity-light));
16
19
  }
17
20
  :is(.dark, .dark-theme),
18
21
  :is(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) {
19
22
  --color-background: var(--gray-1);
20
23
  --color-overlay: var(--black-a8);
21
24
  --color-panel-solid: var(--gray-2);
22
- --color-panel-translucent: var(--gray-a2);
23
- --color-surface: rgba(0, 0, 0, 0.25);
25
+ --color-panel-translucent: color-mix(in srgb, var(--gray-2) var(--panel-mix-percentage), transparent);
26
+ --color-surface-solid: var(--gray-1);
27
+ --color-surface-translucent: rgba(0, 0, 0, var(--surface-opacity-dark));
28
+ --color-dialog-solid: var(--gray-2);
29
+ --color-dialog-translucent: color-mix(in srgb, var(--gray-2) var(--dialog-mix-percentage), transparent);
24
30
  }
25
31
 
26
32
  /* * * * * * * * * * * * * * * * * * * */
@@ -126,11 +132,19 @@
126
132
  .radix-themes {
127
133
  &:where([data-panel-background='solid']) {
128
134
  --color-panel: var(--color-panel-solid);
135
+ --color-surface: var(--color-surface-solid);
136
+ --color-dialog: var(--color-dialog-solid);
129
137
  --backdrop-filter-panel: none;
138
+ --backdrop-filter-components: none;
139
+ --backdrop-filter-dialog: none;
130
140
  }
131
141
  &:where([data-panel-background='translucent']) {
132
142
  --color-panel: var(--color-panel-translucent);
133
- --backdrop-filter-panel: blur(64px);
143
+ --color-surface: var(--color-surface-translucent);
144
+ --color-dialog: var(--color-dialog-translucent);
145
+ --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
146
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
147
+ --backdrop-filter-dialog: blur(var(--backdrop-blur-dialog));
134
148
  }
135
149
  }
136
150