@kushagradhawan/kookie-ui 0.1.17 → 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
@@ -31,15 +31,16 @@ interface CalloutRootProps
31
31
  const CalloutRoot = React.forwardRef<CalloutRootElement, CalloutRootProps>(
32
32
  (props, forwardedRef) => {
33
33
  const { size = calloutRootPropDefs.size.default } = props;
34
- const { asChild, children, className, color, ...rootProps } = extractProps(
34
+ const { asChild, children, className, color, panelBackground, ...rootProps } = extractProps(
35
35
  props,
36
36
  calloutRootPropDefs,
37
- marginPropDefs
37
+ marginPropDefs,
38
38
  );
39
39
  const Comp = asChild ? Slot.Root : 'div';
40
40
  return (
41
41
  <Comp
42
42
  data-accent-color={color}
43
+ data-panel-background={panelBackground}
43
44
  {...rootProps}
44
45
  className={classNames('rt-CalloutRoot', className)}
45
46
  ref={forwardedRef}
@@ -49,7 +50,7 @@ const CalloutRoot = React.forwardRef<CalloutRootElement, CalloutRootProps>(
49
50
  </CalloutContext.Provider>
50
51
  </Comp>
51
52
  );
52
- }
53
+ },
53
54
  );
54
55
  CalloutRoot.displayName = 'Callout.Root';
55
56
 
@@ -60,7 +61,7 @@ const CalloutIcon = React.forwardRef<CalloutIconElement, CalloutIconProps>(
60
61
  return (
61
62
  <div {...props} className={classNames('rt-CalloutIcon', className)} ref={forwardedRef} />
62
63
  );
63
- }
64
+ },
64
65
  );
65
66
  CalloutIcon.displayName = 'Callout.Icon';
66
67
 
@@ -79,7 +80,7 @@ const CalloutText = React.forwardRef<CalloutTextElement, CalloutTextProps>(
79
80
  className={classNames('rt-CalloutText', className)}
80
81
  />
81
82
  );
82
- }
83
+ },
83
84
  );
84
85
  CalloutText.displayName = 'Callout.Text';
85
86
 
@@ -37,7 +37,7 @@
37
37
  .rt-Card {
38
38
  &:where(.rt-r-size-1) {
39
39
  --card-padding: var(--space-3);
40
- --card-border-radius: var(--radius-4);
40
+ --card-border-radius: var(--radius-3);
41
41
  }
42
42
  &:where(.rt-r-size-2) {
43
43
  --card-padding: var(--space-4);
@@ -49,22 +49,22 @@
49
49
  }
50
50
  &:where(.rt-r-size-4) {
51
51
  --card-padding: var(--space-6);
52
- --card-border-radius: var(--radius-5);
52
+ --card-border-radius: var(--radius-6);
53
53
  }
54
54
  &:where(.rt-r-size-5) {
55
55
  --card-padding: var(--space-8);
56
- --card-border-radius: var(--radius-6);
56
+ --card-border-radius: var(--radius-7);
57
57
  }
58
58
  }
59
59
  }
60
60
 
61
61
  /* * * * * * * * * * * * * * * * * * * */
62
62
  /* */
63
- /* Variants / Surface */
63
+ /* Variants / Outline */
64
64
  /* */
65
65
  /* * * * * * * * * * * * * * * * * * * */
66
66
 
67
- .rt-Card:where(.rt-variant-surface) {
67
+ .rt-Card:where(.rt-variant-outline) {
68
68
  --card-border-width: 1px;
69
69
  --card-background-color: var(--color-panel);
70
70
 
@@ -104,35 +104,82 @@
104
104
 
105
105
  .rt-Card:where(.rt-variant-classic) {
106
106
  --card-border-width: 0px;
107
- --card-background-color: var(--color-panel);
107
+ --card-background-color: var(--gray-1);
108
+
109
+ /* Add elevation offset like Button classic variant */
110
+ position: relative;
111
+ top: var(--classic-elevation-offset);
108
112
 
109
- transition: box-shadow 120ms;
110
- box-shadow: var(--base-card-classic-box-shadow-outer);
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
+ }
111
133
 
112
134
  &::before {
113
- background: linear-gradient(to bottom, var(--color-surface), var(--gray-1));
135
+ background-color: var(--card-background-color);
114
136
  backdrop-filter: var(--backdrop-filter-panel);
115
137
  }
116
138
  &:where(:any-link, button, label) {
117
139
  @media (hover: hover) {
118
140
  &:where(:hover) {
119
- transition-duration: 40ms;
120
- box-shadow: var(--base-card-classic-hover-box-shadow-outer);
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
+
121
154
  &::before {
122
- background: linear-gradient(to bottom, var(--gray-1), var(--gray-2));
155
+ background-color: var(--gray-2);
123
156
  }
124
157
  }
125
158
  }
126
159
  &:where([data-state='open']) {
127
- transition-duration: 40ms;
128
- box-shadow: var(--base-card-classic-hover-box-shadow-outer);
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
+
129
173
  &::before {
130
- background: linear-gradient(to bottom, var(--gray-1), var(--gray-2));
174
+ background-color: var(--gray-2);
131
175
  }
132
176
  }
133
177
  &:where(:active:not([data-state='open'])) {
134
- transition-duration: 40ms;
135
- box-shadow: var(--base-card-classic-active-box-shadow-outer);
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);
182
+ }
136
183
  }
137
184
  }
138
185
  }
@@ -146,31 +193,34 @@
146
193
  .rt-Card:where(.rt-variant-ghost) {
147
194
  --card-border-width: 0px;
148
195
 
149
- /* We reset the defined margin variables to avoid inheriting them from a higher component */
150
- /* If a margin IS defined on the component itself, the utility class will win and reset it */
151
- --margin-top: 0px;
152
- --margin-right: 0px;
153
- --margin-bottom: 0px;
154
- --margin-left: 0px;
155
-
156
- /* Define the overrides to incorporate the negative margins */
157
- --margin-top-override: calc(var(--margin-top) - var(--card-padding));
158
- --margin-right-override: calc(var(--margin-right) - var(--card-padding));
159
- --margin-bottom-override: calc(var(--margin-bottom) - var(--card-padding));
160
- --margin-left-override: calc(var(--margin-left) - var(--card-padding));
161
-
162
- margin-top: var(--margin-top-override);
163
- margin-right: var(--margin-right-override);
164
- margin-bottom: var(--margin-bottom-override);
165
- margin-left: var(--margin-left-override);
166
-
167
- /* Reset the overrides on direct children */
168
- :where(&) > * {
169
- --margin-top-override: initial;
170
- --margin-right-override: initial;
171
- --margin-bottom-override: initial;
172
- --margin-left-override: initial;
196
+ &:where([data-flush='true']) {
197
+ /* We reset the defined margin variables to avoid inheriting them from a higher component */
198
+ /* If a margin IS defined on the component itself, the utility class will win and reset it */
199
+ --margin-top: 0px;
200
+ --margin-right: 0px;
201
+ --margin-bottom: 0px;
202
+ --margin-left: 0px;
203
+
204
+ /* Define the overrides to incorporate the negative margins */
205
+ --margin-top-override: calc(var(--margin-top) - var(--card-padding));
206
+ --margin-right-override: calc(var(--margin-right) - var(--card-padding));
207
+ --margin-bottom-override: calc(var(--margin-bottom) - var(--card-padding));
208
+ --margin-left-override: calc(var(--margin-left) - var(--card-padding));
209
+
210
+ margin-top: var(--margin-top-override);
211
+ margin-right: var(--margin-right-override);
212
+ margin-bottom: var(--margin-bottom-override);
213
+ margin-left: var(--margin-left-override);
214
+
215
+ /* Reset the overrides on direct children */
216
+ :where(&) > * {
217
+ --margin-top-override: initial;
218
+ --margin-right-override: initial;
219
+ --margin-bottom-override: initial;
220
+ --margin-left-override: initial;
221
+ }
173
222
  }
223
+
174
224
  &:where(:any-link, button, label) {
175
225
  @media (hover: hover) {
176
226
  &:where(:hover) {
@@ -203,16 +253,50 @@
203
253
 
204
254
  .rt-Card:where(.rt-variant-soft) {
205
255
  --card-border-width: 0px;
206
- --card-background-color: var(--gray-a2);
256
+
257
+ /* Base state: solid colors for solid panels */
258
+ --card-background-color: var(--gray-2);
259
+
260
+ /* Theme-level translucent override */
261
+ :where([data-panel-background='translucent']) & {
262
+ --card-background-color: var(--gray-a2);
263
+ }
264
+
265
+ /* Component-level overrides (higher specificity) */
266
+ &:where([data-panel-background='solid']) {
267
+ --card-background-color: var(--gray-2);
268
+ }
269
+
270
+ &:where([data-panel-background='translucent']) {
271
+ --card-background-color: var(--gray-a2);
272
+ }
207
273
 
208
274
  &::before {
209
275
  background-color: var(--card-background-color);
276
+
277
+ /* Theme-level translucent override */
278
+ :where([data-panel-background='translucent']) & {
279
+ backdrop-filter: var(--backdrop-filter-panel);
280
+ }
281
+
282
+ /* Component-level overrides (higher specificity) */
283
+ :where(.rt-Card[data-panel-background='solid']) & {
284
+ backdrop-filter: none;
285
+ --backdrop-filter-panel: none;
286
+ }
287
+
288
+ :where(.rt-Card[data-panel-background='translucent']) & {
289
+ backdrop-filter: var(--backdrop-filter-panel);
290
+ --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
291
+ }
210
292
  }
293
+
211
294
  &::after {
212
295
  box-shadow: none;
213
296
  border: none;
214
297
  outline: none;
215
298
  }
299
+
216
300
  &:where(:focus-visible) {
217
301
  outline: none;
218
302
 
@@ -220,22 +304,255 @@
220
304
  outline: none;
221
305
  }
222
306
  }
307
+
223
308
  &:where(:any-link, button, label) {
224
309
  @media (hover: hover) {
225
310
  &:where(:hover) {
226
311
  &::before {
312
+ /* Base state: solid colors for solid panels */
313
+ background-color: var(--gray-3);
314
+
315
+ /* Theme-level translucent override for hover */
316
+ :where([data-panel-background='translucent']) & {
317
+ background-color: var(--gray-a3);
318
+ backdrop-filter: var(--backdrop-filter-panel);
319
+ }
320
+
321
+ /* Component-level overrides for hover */
322
+ :where(.rt-Card[data-panel-background='solid']) & {
323
+ background-color: var(--gray-3);
324
+ backdrop-filter: none;
325
+ --backdrop-filter-panel: none;
326
+ }
327
+
328
+ :where(.rt-Card[data-panel-background='translucent']) & {
329
+ background-color: var(--gray-a3);
330
+ backdrop-filter: var(--backdrop-filter-panel);
331
+ --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
332
+ }
333
+ }
334
+ }
335
+ }
336
+ &:where([data-state='open']) {
337
+ &::before {
338
+ /* Base state: solid colors for solid panels */
339
+ background-color: var(--gray-3);
340
+
341
+ /* Theme-level translucent override for open */
342
+ :where([data-panel-background='translucent']) & {
343
+ background-color: var(--gray-a3);
344
+ backdrop-filter: var(--backdrop-filter-panel);
345
+ }
346
+
347
+ /* Component-level overrides for open */
348
+ :where(.rt-Card[data-panel-background='solid']) & {
349
+ background-color: var(--gray-3);
350
+ backdrop-filter: none;
351
+ --backdrop-filter-panel: none;
352
+ }
353
+
354
+ :where(.rt-Card[data-panel-background='translucent']) & {
227
355
  background-color: var(--gray-a3);
356
+ backdrop-filter: var(--backdrop-filter-panel);
357
+ --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
358
+ }
359
+ }
360
+ }
361
+ &:where(:active:not([data-state='open'])) {
362
+ &::before {
363
+ /* Base state: solid colors for solid panels */
364
+ background-color: var(--gray-4);
365
+
366
+ /* Theme-level translucent override for active */
367
+ :where([data-panel-background='translucent']) & {
368
+ background-color: var(--gray-a4);
369
+ backdrop-filter: var(--backdrop-filter-panel);
370
+ }
371
+
372
+ /* Component-level overrides for active */
373
+ :where(.rt-Card[data-panel-background='solid']) & {
374
+ background-color: var(--gray-4);
375
+ backdrop-filter: none;
376
+ --backdrop-filter-panel: none;
377
+ }
378
+
379
+ :where(.rt-Card[data-panel-background='translucent']) & {
380
+ background-color: var(--gray-a4);
381
+ backdrop-filter: var(--backdrop-filter-panel);
382
+ --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
383
+ }
384
+ }
385
+ }
386
+ }
387
+ }
388
+
389
+ /* * * * * * * * * * * * * * * * * * * */
390
+ /* */
391
+ /* Variants / Surface */
392
+ /* */
393
+ /* * * * * * * * * * * * * * * * * * * */
394
+
395
+ .rt-Card:where(.rt-variant-surface) {
396
+ --card-border-width: 1px;
397
+
398
+ /* Base state: neutral gray background with lighter border (maintains card neutrality) */
399
+ --card-background-color: var(--gray-1);
400
+
401
+ /* Theme-level translucent override */
402
+ :where([data-panel-background='translucent']) & {
403
+ --card-background-color: var(--gray-a1);
404
+ }
405
+
406
+ /* Component-level overrides (higher specificity) */
407
+ &:where([data-panel-background='solid']) {
408
+ --card-background-color: var(--gray-1);
409
+ }
410
+
411
+ &:where([data-panel-background='translucent']) {
412
+ --card-background-color: var(--gray-a1);
413
+ }
414
+
415
+ &::before {
416
+ background-color: var(--card-background-color);
417
+
418
+ /* Theme-level translucent override */
419
+ :where([data-panel-background='translucent']) & {
420
+ backdrop-filter: var(--backdrop-filter-panel);
421
+ }
422
+
423
+ /* Component-level overrides (higher specificity) */
424
+ :where(.rt-Card[data-panel-background='solid']) & {
425
+ backdrop-filter: none;
426
+ --backdrop-filter-panel: none;
427
+ }
428
+
429
+ :where(.rt-Card[data-panel-background='translucent']) & {
430
+ backdrop-filter: var(--backdrop-filter-panel);
431
+ --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
432
+ }
433
+ }
434
+
435
+ &::after {
436
+ box-shadow: inset 0 0 0 var(--card-border-width) var(--gray-6);
437
+
438
+ /* Theme-level translucent override */
439
+ :where([data-panel-background='translucent']) & {
440
+ box-shadow: inset 0 0 0 var(--card-border-width) var(--gray-a6);
441
+ }
442
+
443
+ /* Component-level overrides */
444
+ &:where([data-panel-background='solid']) {
445
+ box-shadow: inset 0 0 0 var(--card-border-width) var(--gray-6);
446
+ }
447
+
448
+ &:where([data-panel-background='translucent']) {
449
+ box-shadow: inset 0 0 0 var(--card-border-width) var(--gray-a6);
450
+ }
451
+ }
452
+
453
+ &:where(:any-link, button, label) {
454
+ @media (hover: hover) {
455
+ &:where(:hover) {
456
+ &::before {
457
+ /* Base state: darker gray for hover */
458
+ background-color: var(--gray-2);
459
+
460
+ /* Theme-level translucent override for hover */
461
+ :where([data-panel-background='translucent']) & {
462
+ background-color: var(--gray-a2);
463
+ backdrop-filter: var(--backdrop-filter-panel);
464
+ }
465
+
466
+ /* Component-level overrides for hover */
467
+ :where(.rt-Card[data-panel-background='solid']) & {
468
+ background-color: var(--gray-2);
469
+ backdrop-filter: none;
470
+ --backdrop-filter-panel: none;
471
+ }
472
+
473
+ :where(.rt-Card[data-panel-background='translucent']) & {
474
+ background-color: var(--gray-a2);
475
+ backdrop-filter: var(--backdrop-filter-panel);
476
+ --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
477
+ }
478
+ }
479
+
480
+ &::after {
481
+ box-shadow: inset 0 0 0 var(--card-border-width) var(--gray-7);
482
+
483
+ /* Theme-level translucent override */
484
+ :where([data-panel-background='translucent']) & {
485
+ box-shadow: inset 0 0 0 var(--card-border-width) var(--gray-a7);
486
+ }
228
487
  }
229
488
  }
230
489
  }
231
490
  &:where([data-state='open']) {
232
491
  &::before {
233
- background-color: var(--gray-a3);
492
+ /* Base state: darker gray for open */
493
+ background-color: var(--gray-2);
494
+
495
+ /* Theme-level translucent override for open */
496
+ :where([data-panel-background='translucent']) & {
497
+ background-color: var(--gray-a2);
498
+ backdrop-filter: var(--backdrop-filter-panel);
499
+ }
500
+
501
+ /* Component-level overrides for open */
502
+ :where(.rt-Card[data-panel-background='solid']) & {
503
+ background-color: var(--gray-2);
504
+ backdrop-filter: none;
505
+ --backdrop-filter-panel: none;
506
+ }
507
+
508
+ :where(.rt-Card[data-panel-background='translucent']) & {
509
+ background-color: var(--gray-a2);
510
+ backdrop-filter: var(--backdrop-filter-panel);
511
+ --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
512
+ }
513
+ }
514
+
515
+ &::after {
516
+ box-shadow: inset 0 0 0 var(--card-border-width) var(--gray-7);
517
+
518
+ /* Theme-level translucent override */
519
+ :where([data-panel-background='translucent']) & {
520
+ box-shadow: inset 0 0 0 var(--card-border-width) var(--gray-a7);
521
+ }
234
522
  }
235
523
  }
236
524
  &:where(:active:not([data-state='open'])) {
237
525
  &::before {
238
- background-color: var(--gray-a4);
526
+ /* Base state: even darker gray for active */
527
+ background-color: var(--gray-3);
528
+
529
+ /* Theme-level translucent override for active */
530
+ :where([data-panel-background='translucent']) & {
531
+ background-color: var(--gray-a3);
532
+ backdrop-filter: var(--backdrop-filter-panel);
533
+ }
534
+
535
+ /* Component-level overrides for active */
536
+ :where(.rt-Card[data-panel-background='solid']) & {
537
+ background-color: var(--gray-3);
538
+ backdrop-filter: none;
539
+ --backdrop-filter-panel: none;
540
+ }
541
+
542
+ :where(.rt-Card[data-panel-background='translucent']) & {
543
+ background-color: var(--gray-a3);
544
+ backdrop-filter: var(--backdrop-filter-panel);
545
+ --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
546
+ }
547
+ }
548
+
549
+ &::after {
550
+ box-shadow: inset 0 0 0 var(--card-border-width) var(--gray-7);
551
+
552
+ /* Theme-level translucent override */
553
+ :where([data-panel-background='translucent']) & {
554
+ box-shadow: inset 0 0 0 var(--card-border-width) var(--gray-a7);
555
+ }
239
556
  }
240
557
  }
241
558
  }
@@ -3,15 +3,20 @@ import { asChildPropDef } from '../props/as-child.prop.js';
3
3
  import type { PropDef } from '../props/prop-def.js';
4
4
 
5
5
  const sizes = ['1', '2', '3', '4', '5'] as const;
6
- const variants = ['surface', 'classic', 'ghost', 'soft'] as const;
6
+ const variants = ['surface', 'outline', 'classic', 'ghost', 'soft'] as const;
7
+ const panelBackgrounds = ['solid', 'translucent'] as const;
7
8
 
8
9
  const cardPropDefs = {
9
10
  ...asChildPropDef,
10
11
  size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '1', responsive: true },
11
- variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'surface' },
12
+ variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'outline' },
13
+ panelBackground: { type: 'enum', values: panelBackgrounds, default: undefined },
14
+ flush: { type: 'boolean', default: false },
12
15
  } satisfies {
13
16
  size: PropDef<(typeof sizes)[number]>;
14
17
  variant: PropDef<(typeof variants)[number]>;
18
+ panelBackground: PropDef<(typeof panelBackgrounds)[number] | undefined>;
19
+ flush: PropDef<boolean>;
15
20
  };
16
21
 
17
22
  export { cardPropDefs };
@@ -14,12 +14,18 @@ type CardElement = React.ElementRef<'div'>;
14
14
  type CardOwnProps = GetPropDefTypes<typeof cardPropDefs>;
15
15
  interface CardProps extends ComponentPropsWithout<'div', RemovedProps>, MarginProps, CardOwnProps {}
16
16
  const Card = React.forwardRef<CardElement, CardProps>((props, forwardedRef) => {
17
- const { asChild, className, ...cardProps } = extractProps(props, cardPropDefs, marginPropDefs);
17
+ const { asChild, className, panelBackground, flush, ...cardProps } = extractProps(
18
+ props,
19
+ cardPropDefs,
20
+ marginPropDefs,
21
+ );
18
22
  const Comp = asChild ? Slot.Root : 'div';
19
23
  return (
20
24
  <Comp
21
25
  ref={forwardedRef}
22
26
  {...cardProps}
27
+ data-panel-background={panelBackground}
28
+ data-flush={flush ? 'true' : undefined}
23
29
  className={classNames('rt-reset', 'rt-BaseCard', 'rt-Card', className)}
24
30
  />
25
31
  );