@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
@@ -15,17 +15,29 @@ import type { GetPropDefTypes } from '../props/prop-def.js';
15
15
 
16
16
  interface AvatarProps extends MarginProps, AvatarImplProps {}
17
17
  const Avatar = React.forwardRef<AvatarImplElement, AvatarProps>((props, forwardedRef) => {
18
- const { asChild, children, className, style, color, radius, ...imageProps } = extractProps(
19
- props,
20
- avatarPropDefs,
21
- marginPropDefs
22
- );
18
+ const { asChild, children, className, style, color, radius, panelBackground, ...imageProps } =
19
+ extractProps(props, avatarPropDefs, marginPropDefs);
20
+
21
+ // Check if children contain a disabled element
22
+ const isDisabled = React.useMemo(() => {
23
+ if (!asChild || !children) return false;
24
+
25
+ // If children is a React element, check its props
26
+ if (React.isValidElement(children)) {
27
+ const childProps = children.props as any;
28
+ return childProps.disabled === true || childProps['data-disabled'] === true;
29
+ }
30
+
31
+ return false;
32
+ }, [asChild, children]);
23
33
 
24
34
  return (
25
35
  // TODO as a rule, should we rather spread the props on root?
26
36
  <AvatarPrimitive.Root
27
37
  data-accent-color={color}
28
38
  data-radius={radius}
39
+ data-panel-background={panelBackground}
40
+ data-disabled={isDisabled || undefined}
29
41
  className={classNames('rt-reset', 'rt-AvatarRoot', className)}
30
42
  style={style}
31
43
  asChild={asChild}
@@ -49,6 +61,7 @@ interface AvatarImplProps
49
61
  const AvatarImpl = React.forwardRef<AvatarImplElement, AvatarImplProps>(
50
62
  ({ fallback, ...imageProps }, forwardedRef) => {
51
63
  const [status, setStatus] = React.useState<'idle' | 'loading' | 'loaded' | 'error'>('idle');
64
+
52
65
  return (
53
66
  <>
54
67
  {status === 'idle' || status === 'loading' ? <span className="rt-AvatarFallback" /> : null}
@@ -76,7 +89,7 @@ const AvatarImpl = React.forwardRef<AvatarImplElement, AvatarImplProps>(
76
89
  />
77
90
  </>
78
91
  );
79
- }
92
+ },
80
93
  );
81
94
 
82
95
  AvatarImpl.displayName = 'AvatarImpl';
@@ -1,3 +1,6 @@
1
+ /* stylelint-disable selector-max-type */
2
+ /* Disable selector-max-type rule to target individual element types. */
3
+
1
4
  .rt-Badge {
2
5
  display: inline-flex;
3
6
  align-items: center;
@@ -7,9 +10,21 @@
7
10
  font-style: normal;
8
11
  flex-shrink: 0;
9
12
  line-height: 1;
13
+ transition: var(--transition-badge);
10
14
 
11
15
  /* Make sure that the height is not stretched in a Flex/Grid layout */
12
16
  height: fit-content;
17
+
18
+ /* Fix Chrome background bleeding on rounded corners */
19
+ background-clip: padding-box;
20
+
21
+ /* Force Chrome to recalculate styles when radius changes */
22
+ will-change: border-radius;
23
+
24
+ /* Reduced motion support */
25
+ @media (prefers-reduced-motion: reduce) {
26
+ transition: none;
27
+ }
13
28
  }
14
29
 
15
30
  /***************************************************************************************************
@@ -21,12 +36,18 @@
21
36
  @breakpoints {
22
37
  .rt-Badge {
23
38
  &:where(.rt-r-size-1) {
24
- font-size: var(--font-size-1);
25
- line-height: var(--line-height-1);
26
- letter-spacing: var(--letter-spacing-1);
39
+ font-size: var(--font-size-0);
40
+ line-height: var(--line-height-0);
41
+ letter-spacing: var(--letter-spacing-0);
27
42
  padding: calc(var(--space-1) * 0.5) calc(var(--space-1) * 1.5);
28
43
  gap: calc(var(--space-1) * 1.5);
29
44
  border-radius: max(var(--radius-1), var(--radius-full));
45
+
46
+ /* Ghost variant gets reduced padding */
47
+ &:where(.rt-variant-ghost) {
48
+ padding: calc(var(--space-1) * 0.25) var(--space-1);
49
+ gap: var(--space-1);
50
+ }
30
51
  }
31
52
  &:where(.rt-r-size-2) {
32
53
  font-size: var(--font-size-1);
@@ -35,6 +56,12 @@
35
56
  padding: var(--space-1) var(--space-2);
36
57
  gap: calc(var(--space-1) * 1.5);
37
58
  border-radius: max(var(--radius-2), var(--radius-full));
59
+
60
+ /* Ghost variant gets reduced padding */
61
+ &:where(.rt-variant-ghost) {
62
+ padding: calc(var(--space-1) * 0.5) calc(var(--space-1) * 1.25);
63
+ gap: var(--space-1);
64
+ }
38
65
  }
39
66
  &:where(.rt-r-size-3) {
40
67
  font-size: var(--font-size-2);
@@ -43,6 +70,12 @@
43
70
  padding: var(--space-1) calc(var(--space-2) * 1.25);
44
71
  gap: var(--space-2);
45
72
  border-radius: max(var(--radius-2), var(--radius-full));
73
+
74
+ /* Ghost variant gets reduced padding */
75
+ &:where(.rt-variant-ghost) {
76
+ padding: calc(var(--space-1) * 0.75) var(--space-2);
77
+ gap: calc(var(--space-1) * 1.5);
78
+ }
46
79
  }
47
80
  }
48
81
  }
@@ -78,10 +111,33 @@
78
111
  /* surface */
79
112
 
80
113
  .rt-Badge:where(.rt-variant-surface) {
81
- background-color: var(--accent-surface);
82
- box-shadow: inset 0 0 0 1px var(--accent-a6);
114
+ /* Base state: solid accent for solid panels */
115
+ background-color: var(--accent-2);
116
+ box-shadow: inset 0 0 0 1px var(--accent-7);
83
117
  color: var(--accent-a11);
84
118
 
119
+ /* Theme-level translucent override */
120
+ :where([data-panel-background='translucent']) & {
121
+ background-color: var(--accent-a2);
122
+ box-shadow: inset 0 0 0 1px var(--accent-a7);
123
+ backdrop-filter: var(--backdrop-filter-components);
124
+ }
125
+
126
+ /* Component-level overrides (higher specificity) */
127
+ &:where([data-panel-background='solid']) {
128
+ background-color: var(--accent-2);
129
+ box-shadow: inset 0 0 0 1px var(--accent-7);
130
+ backdrop-filter: none;
131
+ --backdrop-filter-components: none;
132
+ }
133
+
134
+ &:where([data-panel-background='translucent']) {
135
+ background-color: var(--accent-a2);
136
+ box-shadow: inset 0 0 0 1px var(--accent-a7);
137
+ backdrop-filter: var(--backdrop-filter-components);
138
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
139
+ }
140
+
85
141
  &:where(.rt-high-contrast) {
86
142
  color: var(--accent-12);
87
143
  }
@@ -90,8 +146,29 @@
90
146
  /* soft */
91
147
 
92
148
  .rt-Badge:where(.rt-variant-soft) {
93
- background-color: var(--accent-a3);
149
+ /* Base state: solid accent for solid panels */
150
+ background-color: var(--accent-3);
94
151
  color: var(--accent-a11);
152
+
153
+ /* Theme-level translucent override */
154
+ :where([data-panel-background='translucent']) & {
155
+ background-color: var(--accent-a3);
156
+ backdrop-filter: var(--backdrop-filter-components);
157
+ }
158
+
159
+ /* Component-level overrides (higher specificity) */
160
+ &:where([data-panel-background='solid']) {
161
+ background-color: var(--accent-3);
162
+ backdrop-filter: none;
163
+ --backdrop-filter-components: none;
164
+ }
165
+
166
+ &:where([data-panel-background='translucent']) {
167
+ background-color: var(--accent-a3);
168
+ backdrop-filter: var(--backdrop-filter-components);
169
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
170
+ }
171
+
95
172
  &:where(.rt-high-contrast) {
96
173
  color: var(--accent-12);
97
174
  }
@@ -100,10 +177,148 @@
100
177
  /* outline */
101
178
 
102
179
  .rt-Badge:where(.rt-variant-outline) {
103
- box-shadow: inset 0 0 0 1px var(--accent-a8);
180
+ /* Base state: solid accent for solid panels */
181
+ background-color: transparent;
182
+ box-shadow: inset 0 0 0 1px var(--accent-7);
104
183
  color: var(--accent-a11);
184
+
185
+ /* Theme-level translucent override */
186
+ :where([data-panel-background='translucent']) & {
187
+ box-shadow: inset 0 0 0 1px var(--accent-a8);
188
+ backdrop-filter: var(--backdrop-filter-components);
189
+ }
190
+
191
+ /* Component-level overrides (higher specificity) */
192
+ &:where([data-panel-background='solid']) {
193
+ box-shadow: inset 0 0 0 1px var(--accent-7);
194
+ backdrop-filter: none;
195
+ --backdrop-filter-components: none;
196
+ }
197
+
198
+ &:where([data-panel-background='translucent']) {
199
+ box-shadow: inset 0 0 0 1px var(--accent-a8);
200
+ backdrop-filter: var(--backdrop-filter-components);
201
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
202
+ }
203
+
105
204
  &:where(.rt-high-contrast) {
205
+ color: var(--accent-12);
206
+
207
+ /* High contrast adjustments */
106
208
  box-shadow: inset 0 0 0 1px var(--accent-a7), inset 0 0 0 1px var(--gray-a11);
209
+
210
+ :where([data-panel-background='translucent']) & {
211
+ box-shadow: inset 0 0 0 1px var(--accent-a7), inset 0 0 0 1px var(--gray-a11);
212
+ }
213
+ }
214
+ }
215
+
216
+ /* ghost */
217
+
218
+ .rt-Badge:where(.rt-variant-ghost) {
219
+ /* Transparent by default */
220
+ background-color: transparent;
221
+ color: var(--accent-a11);
222
+
223
+ &:where(.rt-high-contrast) {
224
+ color: var(--accent-12);
225
+ }
226
+ }
227
+
228
+ /* classic */
229
+
230
+ .rt-Badge:where(.rt-variant-classic) {
231
+ position: relative;
232
+ top: var(--classic-elevation-offset);
233
+ color: var(--accent-a11);
234
+ background-color: var(--accent-2);
235
+ /* prettier-ignore */
236
+ box-shadow:
237
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a2),
238
+ inset 0 var(--classic-border-width) var(--white-a12),
239
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
240
+ inset 0 calc(-1 * var(--classic-border-width)) var(--accent-a6),
241
+ 0 0 0 var(--classic-border-width) var(--accent-a5),
242
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--accent-a7);
243
+
244
+ :where(.dark, .dark-theme) &,
245
+ :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
246
+ /* prettier-ignore */
247
+ box-shadow:
248
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a3),
249
+ inset 0 var(--classic-border-width) var(--accent-a11),
250
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
251
+ inset 0 var(--classic-shadow-offset-negative) var(--black-a11),
252
+ 0 0 0 var(--classic-border-width-thick) var(--accent-a7),
253
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--black-a12);
254
+ }
255
+
256
+ &:where(.rt-high-contrast) {
107
257
  color: var(--accent-12);
258
+ background-color: var(--accent-2);
259
+ }
260
+
261
+ &:where(:any-link, button) {
262
+ @media (hover: hover) {
263
+ &:where(:hover) {
264
+ background-color: var(--accent-3);
265
+ /* prettier-ignore */
266
+ box-shadow:
267
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a2),
268
+ inset 0 var(--classic-border-width) var(--white-a12),
269
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
270
+ inset 0 calc(-1 * var(--classic-border-width)) var(--accent-a6),
271
+ 0 0 0 var(--classic-border-width) var(--accent-a5),
272
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--accent-a7),
273
+ 0 0 0 var(--classic-border-width) var(--accent-a5);
274
+
275
+ :where(.dark, .dark-theme) &,
276
+ :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
277
+ /* prettier-ignore */
278
+ box-shadow:
279
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a3),
280
+ inset 0 var(--classic-border-width) var(--accent-a11),
281
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
282
+ inset 0 var(--classic-shadow-offset-negative) var(--black-a11),
283
+ 0 0 0 var(--classic-border-width-thick) var(--accent-a7),
284
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--black-a12),
285
+ 0 0 0 var(--classic-border-width) var(--accent-a5);
286
+ }
287
+ }
288
+ }
289
+ &:where([data-state='open']) {
290
+ background-color: var(--accent-3);
291
+ /* prettier-ignore */
292
+ box-shadow:
293
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a2),
294
+ inset 0 var(--classic-border-width) var(--white-a12),
295
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
296
+ inset 0 calc(-1 * var(--classic-border-width)) var(--accent-a6),
297
+ 0 0 0 var(--classic-border-width) var(--accent-a5),
298
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--accent-a7),
299
+ 0 0 0 var(--classic-border-width) var(--accent-a5);
300
+
301
+ :where(.dark, .dark-theme) &,
302
+ :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
303
+ /* prettier-ignore */
304
+ box-shadow:
305
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a3),
306
+ inset 0 var(--classic-border-width) var(--accent-a11),
307
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
308
+ inset 0 var(--classic-shadow-offset-negative) var(--black-a11),
309
+ 0 0 0 var(--classic-border-width-thick) var(--accent-a7),
310
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--black-a12),
311
+ 0 0 0 var(--classic-border-width) var(--accent-a5);
312
+ }
313
+ }
314
+ &:where(:active:not([data-state='open'])) {
315
+ padding-top: calc(var(--space-1) * 0.75);
316
+ padding-bottom: calc(var(--space-1) * 0.25);
317
+ background-color: var(--accent-3);
318
+ box-shadow: inset 0 var(--classic-border-width) var(--black-a3), 0 0 0 var(--classic-border-width) var(--accent-a7);
319
+ }
320
+ &:where(:focus-visible) {
321
+ outline: 2px solid var(--focus-8);
322
+ }
108
323
  }
109
324
  }
@@ -6,18 +6,20 @@ import { radiusPropDef } from '../props/radius.prop.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 = ['solid', 'soft', 'surface', 'outline'] as const;
9
+ const variants = ['solid', 'soft', 'surface', 'outline', 'ghost', 'classic'] as const;
10
10
 
11
11
  const badgePropDefs = {
12
12
  ...asChildPropDef,
13
13
  size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '1', responsive: true },
14
14
  variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'soft' },
15
+ panelBackground: { type: 'enum', values: ['solid', 'translucent'], default: undefined },
15
16
  ...accentColorPropDef,
16
17
  ...highContrastPropDef,
17
18
  ...radiusPropDef,
18
19
  } satisfies {
19
20
  size: PropDef<(typeof sizes)[number]>;
20
21
  variant: PropDef<(typeof variants)[number]>;
22
+ panelBackground: PropDef<'solid' | 'translucent'>;
21
23
  };
22
24
 
23
25
  export { badgePropDefs };
@@ -17,16 +17,17 @@ interface BadgeProps
17
17
  MarginProps,
18
18
  BadgeOwnProps {}
19
19
  const Badge = React.forwardRef<BadgeElement, BadgeProps>((props, forwardedRef) => {
20
- const { asChild, className, color, radius, ...badgeProps } = extractProps(
20
+ const { asChild, className, color, radius, panelBackground, ...badgeProps } = extractProps(
21
21
  props,
22
22
  badgePropDefs,
23
- marginPropDefs
23
+ marginPropDefs,
24
24
  );
25
25
  const Comp = asChild ? Slot.Root : 'span';
26
26
  return (
27
27
  <Comp
28
28
  data-accent-color={color}
29
29
  data-radius={radius}
30
+ data-panel-background={panelBackground}
30
31
  {...badgeProps}
31
32
  ref={forwardedRef}
32
33
  className={classNames('rt-reset', 'rt-Badge', className)}
@@ -24,15 +24,15 @@
24
24
  @breakpoints {
25
25
  .rt-Button {
26
26
  &:where(.rt-r-size-1) {
27
- gap: var(--space-1);
27
+ gap: var(--component-gap-1);
28
28
  font-size: var(--font-size-1);
29
29
  line-height: var(--line-height-1);
30
30
  letter-spacing: var(--letter-spacing-1);
31
31
 
32
32
  /* stylelint-disable-next-line selector-max-type */
33
33
  & :where(svg) {
34
- width: calc(var(--space-3) * 1.175);
35
- height: calc(var(--space-3) * 1.175);
34
+ width: var(--content-icon-size-1);
35
+ height: var(--content-icon-size-1);
36
36
  }
37
37
 
38
38
  &:where(:not(.rt-variant-ghost)) {
@@ -40,21 +40,21 @@
40
40
  padding-right: var(--space-2);
41
41
  }
42
42
  &:where(.rt-variant-ghost) {
43
- gap: var(--space-1);
43
+ gap: var(--component-gap-ghost-1);
44
44
  --button-ghost-padding-x: var(--space-2);
45
45
  --button-ghost-padding-y: var(--space-1);
46
46
  }
47
47
  }
48
48
  &:where(.rt-r-size-2) {
49
- gap: var(--space-2);
49
+ gap: var(--component-gap-2);
50
50
  font-size: var(--font-size-2);
51
51
  line-height: var(--line-height-2);
52
52
  letter-spacing: var(--letter-spacing-2);
53
53
 
54
54
  /* stylelint-disable-next-line selector-max-type */
55
55
  & :where(svg) {
56
- width: var(--space-4);
57
- height: var(--space-4);
56
+ width: var(--content-icon-size-2);
57
+ height: var(--content-icon-size-2);
58
58
  }
59
59
 
60
60
  &:where(:not(.rt-variant-ghost)) {
@@ -62,21 +62,21 @@
62
62
  padding-right: var(--space-3);
63
63
  }
64
64
  &:where(.rt-variant-ghost) {
65
- gap: var(--space-1);
65
+ gap: var(--component-gap-ghost-2);
66
66
  --button-ghost-padding-x: var(--space-2);
67
67
  --button-ghost-padding-y: var(--space-1);
68
68
  }
69
69
  }
70
70
  &:where(.rt-r-size-3) {
71
- gap: var(--space-3);
71
+ gap: var(--component-gap-3);
72
72
  font-size: var(--font-size-3);
73
73
  line-height: var(--line-height-3);
74
74
  letter-spacing: var(--letter-spacing-3);
75
75
 
76
76
  /* stylelint-disable-next-line selector-max-type */
77
77
  & :where(svg) {
78
- width: var(--space-5);
79
- height: var(--space-5);
78
+ width: var(--content-icon-size-3);
79
+ height: var(--content-icon-size-3);
80
80
  }
81
81
 
82
82
  &:where(:not(.rt-variant-ghost)) {
@@ -84,21 +84,21 @@
84
84
  padding-right: var(--space-4);
85
85
  }
86
86
  &:where(.rt-variant-ghost) {
87
- gap: var(--space-2);
87
+ gap: var(--component-gap-ghost-3);
88
88
  --button-ghost-padding-x: var(--space-3);
89
89
  --button-ghost-padding-y: calc(var(--space-1) * 1.5);
90
90
  }
91
91
  }
92
92
  &:where(.rt-r-size-4) {
93
- gap: var(--space-3);
93
+ gap: var(--component-gap-4);
94
94
  font-size: var(--font-size-4);
95
95
  line-height: var(--line-height-4);
96
96
  letter-spacing: var(--letter-spacing-4);
97
97
 
98
98
  /* stylelint-disable-next-line selector-max-type */
99
99
  & :where(svg) {
100
- width: var(--space-5);
101
- height: var(--space-5);
100
+ width: var(--content-icon-size-4);
101
+ height: var(--content-icon-size-4);
102
102
  }
103
103
 
104
104
  &:where(:not(.rt-variant-ghost)) {
@@ -106,7 +106,7 @@
106
106
  padding-right: var(--space-5);
107
107
  }
108
108
  &:where(.rt-variant-ghost) {
109
- gap: var(--space-2);
109
+ gap: var(--component-gap-ghost-4);
110
110
  --button-ghost-padding-x: var(--space-4);
111
111
  --button-ghost-padding-y: var(--space-2);
112
112
  }
@@ -120,6 +120,6 @@
120
120
  * *
121
121
  ***************************************************************************************************/
122
122
 
123
- .rt-Button:where(:not(.rt-variant-ghost)) {
123
+ .rt-Button {
124
124
  font-weight: var(--font-weight-medium);
125
125
  }
@@ -5,6 +5,7 @@
5
5
  justify-content: flex-start;
6
6
  text-align: left;
7
7
  color: var(--accent-a11);
8
+ transition: var(--transition-card);
8
9
 
9
10
  &:where(.rt-high-contrast) {
10
11
  color: var(--accent-12);
@@ -18,7 +19,14 @@
18
19
  height: var(--callout-icon-height);
19
20
  }
20
21
 
21
- /* Anything that’s not an icon goes to the right of the icon */
22
+ /* stylelint-disable-next-line selector-max-type */
23
+ .rt-CalloutIcon :where(svg) {
24
+ width: var(--callout-icon-size);
25
+ height: var(--callout-icon-size);
26
+ flex-shrink: 0;
27
+ }
28
+
29
+ /* Anything that's not an icon goes to the right of the icon */
22
30
  .rt-CalloutRoot > :where(:not(.rt-CalloutIcon)) {
23
31
  grid-column-start: -1;
24
32
  }
@@ -36,7 +44,8 @@
36
44
  column-gap: var(--space-2);
37
45
  padding: var(--space-3);
38
46
  border-radius: var(--radius-3);
39
- --callout-icon-height: var(--line-height-2);
47
+ --callout-icon-height: var(--line-height-1);
48
+ --callout-icon-size: var(--content-icon-size-1);
40
49
  }
41
50
  &:where(.rt-r-size-2) {
42
51
  row-gap: var(--space-2);
@@ -44,6 +53,7 @@
44
53
  padding: var(--space-4);
45
54
  border-radius: var(--radius-4);
46
55
  --callout-icon-height: var(--line-height-2);
56
+ --callout-icon-size: var(--content-icon-size-2);
47
57
  }
48
58
  &:where(.rt-r-size-3) {
49
59
  row-gap: var(--space-3);
@@ -51,6 +61,7 @@
51
61
  padding: var(--space-5);
52
62
  border-radius: var(--radius-5);
53
63
  --callout-icon-height: var(--line-height-3);
64
+ --callout-icon-size: var(--content-icon-size-3);
54
65
  }
55
66
  }
56
67
  }
@@ -64,18 +75,76 @@
64
75
  /* soft */
65
76
 
66
77
  .rt-CalloutRoot:where(.rt-variant-soft) {
67
- background-color: var(--accent-a3);
78
+ /* Base state: solid colors for solid panels */
79
+ background-color: var(--accent-3);
80
+
81
+ /* Theme-level translucent override */
82
+ :where([data-panel-background='translucent']) & {
83
+ background-color: var(--accent-a3);
84
+ backdrop-filter: var(--backdrop-filter-panel);
85
+ }
86
+
87
+ /* Component-level overrides (higher specificity) */
88
+ &:where([data-panel-background='solid']) {
89
+ background-color: var(--accent-3);
90
+ backdrop-filter: none;
91
+ --backdrop-filter-panel: none;
92
+ }
93
+
94
+ &:where([data-panel-background='translucent']) {
95
+ background-color: var(--accent-a3);
96
+ backdrop-filter: var(--backdrop-filter-panel);
97
+ --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
98
+ }
68
99
  }
69
100
 
70
101
  /* surface */
71
102
 
72
103
  .rt-CalloutRoot:where(.rt-variant-surface) {
73
- box-shadow: inset 0 0 0 1px var(--accent-a6);
74
- background-color: var(--accent-a2);
104
+ /* Base state: solid colors for solid panels */
105
+ background-color: var(--accent-2);
106
+ box-shadow: inset 0 0 0 var(--border-width-standard) var(--accent-6);
107
+
108
+ /* Theme-level translucent override */
109
+ :where([data-panel-background='translucent']) & {
110
+ background-color: var(--accent-a2);
111
+ box-shadow: inset 0 0 0 var(--border-width-standard) var(--accent-a6);
112
+ backdrop-filter: var(--backdrop-filter-panel);
113
+ }
114
+
115
+ /* Component-level overrides (higher specificity) */
116
+ &:where([data-panel-background='solid']) {
117
+ background-color: var(--accent-2);
118
+ box-shadow: inset 0 0 0 var(--border-width-standard) var(--accent-6);
119
+ backdrop-filter: none;
120
+ --backdrop-filter-panel: none;
121
+ }
122
+
123
+ &:where([data-panel-background='translucent']) {
124
+ background-color: var(--accent-a2);
125
+ box-shadow: inset 0 0 0 var(--border-width-standard) var(--accent-a6);
126
+ backdrop-filter: var(--backdrop-filter-panel);
127
+ --backdrop-filter-panel: blur(var(--backdrop-blur-panel));
128
+ }
75
129
  }
76
130
 
77
131
  /* outline */
78
132
 
79
133
  .rt-CalloutRoot:where(.rt-variant-outline) {
80
- box-shadow: inset 0 0 0 1px var(--accent-a7);
134
+ /* Base state: solid colors for solid panels */
135
+ box-shadow: inset 0 0 0 var(--border-width-standard) var(--accent-7);
136
+
137
+ /* Theme-level translucent override */
138
+ :where([data-panel-background='translucent']) & {
139
+ box-shadow: inset 0 0 0 var(--border-width-standard) var(--accent-a7);
140
+ }
141
+
142
+ /* Component-level overrides (higher specificity) */
143
+ &:where([data-panel-background='solid']) {
144
+ box-shadow: inset 0 0 0 var(--border-width-standard) var(--accent-7);
145
+ }
146
+
147
+ &:where([data-panel-background='translucent']) {
148
+ box-shadow: inset 0 0 0 var(--border-width-standard) var(--accent-a7);
149
+ }
81
150
  }
@@ -6,6 +6,7 @@ import type { PropDef } from '../props/prop-def.js';
6
6
 
7
7
  const sizes = ['1', '2', '3'] as const;
8
8
  const variants = ['soft', 'surface', 'outline'] as const;
9
+ const panelBackgrounds = ['solid', 'translucent'] as const;
9
10
 
10
11
  const calloutRootPropDefs = {
11
12
  ...asChildPropDef,
@@ -13,9 +14,11 @@ const calloutRootPropDefs = {
13
14
  variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'soft' },
14
15
  ...accentColorPropDef,
15
16
  ...highContrastPropDef,
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
  export { calloutRootPropDefs };