@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
@@ -6,6 +6,7 @@ import type { PropDef } from '../../props/prop-def.js';
6
6
  const sizes = ['1', '2'] as const;
7
7
  const wrapValues = ['nowrap', 'wrap', 'wrap-reverse'] as const;
8
8
  const justifyValues = ['start', 'center', 'end'] as const;
9
+ const panelBackgrounds = ['solid', 'translucent'] as const;
9
10
 
10
11
  const baseTabListPropDefs = {
11
12
  size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '2', responsive: true },
@@ -23,10 +24,12 @@ const baseTabListPropDefs = {
23
24
  },
24
25
  ...colorPropDef,
25
26
  ...highContrastPropDef,
27
+ panelBackground: { type: 'enum', values: panelBackgrounds, default: undefined },
26
28
  } satisfies {
27
29
  size: PropDef<(typeof sizes)[number]>;
28
30
  wrap: PropDef<(typeof wrapValues)[number]>;
29
31
  justify: PropDef<(typeof justifyValues)[number]>;
32
+ panelBackground: PropDef<(typeof panelBackgrounds)[number] | undefined>;
30
33
  };
31
34
 
32
35
  export { baseTabListPropDefs };
@@ -31,7 +31,7 @@ const AlertDialogTrigger = React.forwardRef<AlertDialogTriggerElement, AlertDial
31
31
  <AlertDialogPrimitive.Trigger {...props} ref={forwardedRef} asChild>
32
32
  {requireReactElement(children)}
33
33
  </AlertDialogPrimitive.Trigger>
34
- )
34
+ ),
35
35
  );
36
36
  AlertDialogTrigger.displayName = 'AlertDialog.Trigger';
37
37
 
@@ -43,9 +43,23 @@ interface AlertDialogContentProps
43
43
  }
44
44
  const AlertDialogContent = React.forwardRef<AlertDialogContentElement, AlertDialogContentProps>(
45
45
  ({ align, ...props }, forwardedRef) => {
46
- const { align: alignPropDef, ...propDefs } = alertDialogContentPropDefs;
46
+ const {
47
+ align: alignPropDef,
48
+ panelBackground: panelBackgroundPropDef,
49
+ ...propDefs
50
+ } = alertDialogContentPropDefs;
47
51
  const { className: alignClassName } = extractProps({ align }, { align: alignPropDef });
48
- const { className, forceMount, container, ...contentProps } = extractProps(props, propDefs);
52
+ const { panelBackground } = extractProps(
53
+ { panelBackground: props.panelBackground },
54
+ { panelBackground: panelBackgroundPropDef },
55
+ );
56
+ const {
57
+ className,
58
+ forceMount,
59
+ container,
60
+ panelBackground: _,
61
+ ...contentProps
62
+ } = extractProps(props, propDefs);
49
63
  return (
50
64
  <AlertDialogPrimitive.Portal container={container} forceMount={forceMount}>
51
65
  <Theme asChild>
@@ -58,6 +72,7 @@ const AlertDialogContent = React.forwardRef<AlertDialogContentElement, AlertDial
58
72
  {...contentProps}
59
73
  ref={forwardedRef}
60
74
  className={classNames('rt-BaseDialogContent', 'rt-AlertDialogContent', className)}
75
+ data-panel-background={panelBackground}
61
76
  />
62
77
  </div>
63
78
  </div>
@@ -65,7 +80,7 @@ const AlertDialogContent = React.forwardRef<AlertDialogContentElement, AlertDial
65
80
  </Theme>
66
81
  </AlertDialogPrimitive.Portal>
67
82
  );
68
- }
83
+ },
69
84
  );
70
85
  AlertDialogContent.displayName = 'AlertDialog.Content';
71
86
 
@@ -76,7 +91,7 @@ const AlertDialogTitle = React.forwardRef<AlertDialogTitleElement, AlertDialogTi
76
91
  <AlertDialogPrimitive.Title asChild>
77
92
  <Heading size="5" mb="3" trim="start" {...props} asChild={false} ref={forwardedRef} />
78
93
  </AlertDialogPrimitive.Title>
79
- )
94
+ ),
80
95
  );
81
96
  AlertDialogTitle.displayName = 'AlertDialog.Title';
82
97
 
@@ -100,7 +115,7 @@ const AlertDialogAction = React.forwardRef<AlertDialogActionElement, AlertDialog
100
115
  <AlertDialogPrimitive.Action {...props} ref={forwardedRef} asChild>
101
116
  {requireReactElement(children)}
102
117
  </AlertDialogPrimitive.Action>
103
- )
118
+ ),
104
119
  );
105
120
  AlertDialogAction.displayName = 'AlertDialog.Action';
106
121
 
@@ -112,7 +127,7 @@ const AlertDialogCancel = React.forwardRef<AlertDialogCancelElement, AlertDialog
112
127
  <AlertDialogPrimitive.Cancel {...props} ref={forwardedRef} asChild>
113
128
  {requireReactElement(children)}
114
129
  </AlertDialogPrimitive.Cancel>
115
- )
130
+ ),
116
131
  );
117
132
  AlertDialogCancel.displayName = 'AlertDialog.Cancel';
118
133
 
@@ -88,6 +88,20 @@
88
88
  }
89
89
  }
90
90
 
91
+ @keyframes rt-tab-indicator-appear {
92
+ 0% {
93
+ transform: scaleX(0);
94
+ opacity: 0;
95
+ }
96
+ 50% {
97
+ opacity: 1;
98
+ }
99
+ 100% {
100
+ transform: scaleX(1);
101
+ opacity: 1;
102
+ }
103
+ }
104
+
91
105
  @media (prefers-reduced-motion: no-preference) {
92
106
  .rt-PopperContent {
93
107
  animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
@@ -95,6 +109,7 @@
95
109
  &:where([data-state='open']) {
96
110
  animation-duration: 160ms;
97
111
 
112
+ /* Direction-aware animations (for dropdown menus with data-side) */
98
113
  &:where([data-side='top']) {
99
114
  animation-name: rt-slide-from-top, rt-fade-in;
100
115
  }
@@ -107,11 +122,17 @@
107
122
  &:where([data-side='right']) {
108
123
  animation-name: rt-slide-from-right, rt-fade-in;
109
124
  }
125
+
126
+ /* Default animation (for selects without data-side) */
127
+ &:where(:not([data-side])) {
128
+ animation-name: rt-slide-from-bottom, rt-fade-in;
129
+ }
110
130
  }
111
131
 
112
132
  &:where([data-state='closed']) {
113
133
  animation-duration: 100ms;
114
134
 
135
+ /* Direction-aware animations (for dropdown menus with data-side) */
115
136
  &:where([data-side='top']) {
116
137
  animation-name: rt-slide-to-top, rt-fade-out;
117
138
  }
@@ -124,6 +145,16 @@
124
145
  &:where([data-side='right']) {
125
146
  animation-name: rt-slide-to-right, rt-fade-out;
126
147
  }
148
+
149
+ /* Default animation (for selects without data-side) */
150
+ &:where(:not([data-side])) {
151
+ animation-name: rt-slide-to-bottom, rt-fade-out;
152
+ }
127
153
  }
128
154
  }
155
+
156
+ /* Tab indicator animations - only when motion is preferred */
157
+ .rt-BaseTabListTrigger:where([data-state='active'], [data-active])::before {
158
+ animation: rt-tab-indicator-appear var(--duration-3) var(--ease-3);
159
+ }
129
160
  }
@@ -7,8 +7,227 @@
7
7
  width: var(--avatar-size);
8
8
  height: var(--avatar-size);
9
9
  flex-shrink: 0;
10
+ position: relative;
10
11
  }
11
12
 
13
+ /* Interactive states for avatars used as buttons/links */
14
+ /* stylelint-disable selector-max-type */
15
+ .rt-AvatarRoot:where(button),
16
+ .rt-AvatarRoot:where(a),
17
+ .rt-AvatarRoot:where([role="button"]) {
18
+ cursor: pointer;
19
+ transition: var(--transition-button);
20
+
21
+ /* Reduced motion support */
22
+ @media (prefers-reduced-motion: reduce) {
23
+ transition: none;
24
+ }
25
+
26
+ &:where(:focus-visible) {
27
+ outline: var(--focus-outline-width) solid var(--focus-8);
28
+ outline-offset: var(--focus-outline-offset);
29
+ }
30
+
31
+ /* NO scale transform - buttons don't use it */
32
+
33
+ &:where(:disabled),
34
+ &:where([data-disabled]) {
35
+ cursor: not-allowed;
36
+ pointer-events: none;
37
+ }
38
+
39
+ /* Apply subtle filters to avatars that display images on interaction */
40
+ @media (hover: hover) {
41
+ &:where(:hover:not(:disabled, [data-disabled])) :where(.rt-AvatarImage) {
42
+ filter: var(--avatar-image-hover-filter);
43
+ }
44
+ }
45
+
46
+ &:where(:active:not(:disabled, [data-disabled])) :where(.rt-AvatarImage) {
47
+ filter: var(--avatar-image-active-filter);
48
+ }
49
+
50
+ /* Disabled state for avatar images */
51
+ &:where(:disabled, [data-disabled]) :where(.rt-AvatarImage) {
52
+ filter: grayscale(1) opacity(0.6);
53
+ }
54
+
55
+ /* Classic variant - 3D button effects */
56
+ &:where(.rt-variant-classic) {
57
+ @media (hover: hover) {
58
+ &:where(:hover:not(:disabled, [data-disabled])) {
59
+ background-color: var(--accent-3);
60
+ /* prettier-ignore */
61
+ box-shadow:
62
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a2),
63
+ inset 0 var(--classic-border-width) var(--white-a12),
64
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
65
+ inset 0 calc(-1 * var(--classic-border-width)) var(--accent-a6),
66
+ 0 0 0 var(--classic-border-width) var(--accent-a5),
67
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--accent-a7);
68
+
69
+ :where(.dark, .dark-theme) &,
70
+ :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
71
+ /* prettier-ignore */
72
+ box-shadow:
73
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a3),
74
+ inset 0 var(--classic-border-width) var(--accent-a11),
75
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
76
+ inset 0 var(--classic-shadow-offset-negative) var(--black-a11),
77
+ 0 0 0 var(--classic-border-width-thick) var(--accent-a7),
78
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--black-a12),
79
+ 0 0 0 var(--classic-border-width) var(--accent-a5);
80
+ }
81
+
82
+ & :where(.rt-AvatarFallback) {
83
+ background-color: inherit;
84
+ box-shadow: inherit;
85
+ }
86
+ }
87
+ }
88
+
89
+ &:where(:active:not(:disabled, [data-disabled])) {
90
+ padding-top: var(--classic-active-padding-offset-2);
91
+ padding-bottom: 0;
92
+ background-color: var(--accent-3);
93
+ box-shadow: inset 0 var(--classic-border-width) var(--black-a3), 0 0 0 var(--classic-border-width) var(--accent-a7);
94
+ /* keep root top unchanged; internal illusion achieved by padding */
95
+
96
+ & :where(.rt-AvatarFallback) {
97
+ padding-top: inherit;
98
+ padding-bottom: 0;
99
+ background-color: inherit;
100
+ box-shadow: inherit;
101
+ }
102
+ }
103
+ }
104
+
105
+ /* Solid variant - filter effects like buttons */
106
+ &:where(.rt-variant-solid) {
107
+ @media (hover: hover) {
108
+ &:where(:hover:not(:disabled, [data-disabled])) {
109
+ background-color: var(--accent-10);
110
+ & :where(.rt-AvatarFallback) {
111
+ background-color: inherit;
112
+ }
113
+ }
114
+ }
115
+ &:where(:active:not(:disabled, [data-disabled])) {
116
+ background-color: var(--accent-10);
117
+ filter: var(--base-button-solid-active-filter);
118
+ & :where(.rt-AvatarFallback) {
119
+ background-color: inherit;
120
+ filter: inherit;
121
+ }
122
+ }
123
+
124
+ &:where(.rt-high-contrast) {
125
+ @media (hover: hover) {
126
+ &:where(:hover:not(:disabled, [data-disabled])) {
127
+ background-color: var(--accent-12);
128
+ filter: var(--base-button-solid-high-contrast-hover-filter);
129
+ & :where(.rt-AvatarFallback) {
130
+ background-color: inherit;
131
+ filter: inherit;
132
+ }
133
+ }
134
+ }
135
+ &:where(:active:not(:disabled, [data-disabled])) {
136
+ background-color: var(--accent-12);
137
+ filter: var(--base-button-solid-high-contrast-active-filter);
138
+ & :where(.rt-AvatarFallback) {
139
+ background-color: inherit;
140
+ filter: inherit;
141
+ }
142
+ }
143
+ }
144
+ }
145
+
146
+ /* Soft variant - background color changes with panel awareness */
147
+ &:where(.rt-variant-soft) {
148
+ @media (hover: hover) {
149
+ &:where(:hover:not(:disabled, [data-disabled])) {
150
+ background-color: var(--accent-4);
151
+
152
+ :where([data-panel-background='translucent']) & {
153
+ background-color: var(--accent-a4);
154
+ }
155
+
156
+ & :where(.rt-AvatarFallback) {
157
+ background-color: inherit;
158
+ }
159
+ }
160
+ }
161
+ &:where(:active:not(:disabled, [data-disabled])) {
162
+ background-color: var(--accent-5);
163
+
164
+ :where([data-panel-background='translucent']) & {
165
+ background-color: var(--accent-a5);
166
+ }
167
+
168
+ & :where(.rt-AvatarFallback) {
169
+ background-color: inherit;
170
+ }
171
+ }
172
+ }
173
+
174
+ /* Surface variant - border color changes */
175
+ &:where(.rt-variant-surface) {
176
+ @media (hover: hover) {
177
+ &:where(:hover:not(:disabled, [data-disabled])) {
178
+ box-shadow: inset 0 0 0 1px var(--accent-8);
179
+ :where([data-panel-background='translucent']) & {
180
+ box-shadow: inset 0 0 0 1px var(--accent-a8);
181
+ }
182
+ & :where(.rt-AvatarFallback) {
183
+ box-shadow: inherit;
184
+ }
185
+ }
186
+ }
187
+ &:where(:active:not(:disabled, [data-disabled])) {
188
+ background-color: var(--accent-3);
189
+ box-shadow: inset 0 0 0 1px var(--accent-8);
190
+ :where([data-panel-background='translucent']) & {
191
+ background-color: var(--accent-a3);
192
+ box-shadow: inset 0 0 0 1px var(--accent-a8);
193
+ }
194
+ & :where(.rt-AvatarFallback) {
195
+ background-color: inherit;
196
+ box-shadow: inherit;
197
+ }
198
+ }
199
+ }
200
+
201
+ /* Outline variant - background appears on interaction */
202
+ &:where(.rt-variant-outline) {
203
+ @media (hover: hover) {
204
+ &:where(:hover:not(:disabled, [data-disabled])) {
205
+ background-color: var(--accent-2);
206
+ :where([data-panel-background='translucent']) & {
207
+ background-color: var(--accent-a2);
208
+ backdrop-filter: var(--backdrop-filter-components);
209
+ }
210
+ & :where(.rt-AvatarFallback) {
211
+ background-color: inherit;
212
+ backdrop-filter: inherit;
213
+ }
214
+ }
215
+ }
216
+ &:where(:active:not(:disabled, [data-disabled])) {
217
+ background-color: var(--accent-3);
218
+ :where([data-panel-background='translucent']) & {
219
+ background-color: var(--accent-a3);
220
+ backdrop-filter: var(--backdrop-filter-components);
221
+ }
222
+ & :where(.rt-AvatarFallback) {
223
+ background-color: inherit;
224
+ backdrop-filter: inherit;
225
+ }
226
+ }
227
+ }
228
+ }
229
+ /* stylelint-enable selector-max-type */
230
+
12
231
  .rt-AvatarImage {
13
232
  width: 100%;
14
233
  height: 100%;
@@ -54,7 +273,7 @@
54
273
  --avatar-size: var(--space-5);
55
274
  --avatar-fallback-one-letter-font-size: var(--font-size-2);
56
275
  --avatar-fallback-two-letters-font-size: var(--font-size-1);
57
- border-radius: max(var(--radius-2), var(--radius-full));
276
+ border-radius: max(var(--radius-1), var(--radius-full));
58
277
  letter-spacing: var(--letter-spacing-1);
59
278
  }
60
279
  &:where(.rt-r-size-2) {
@@ -75,37 +294,42 @@
75
294
  --avatar-size: var(--space-8);
76
295
  --avatar-fallback-one-letter-font-size: var(--font-size-5);
77
296
  --avatar-fallback-two-letters-font-size: var(--font-size-4);
78
- border-radius: max(var(--radius-3), var(--radius-full));
297
+ border-radius: max(var(--radius-4), var(--radius-full));
79
298
  letter-spacing: var(--letter-spacing-4);
80
299
  }
81
300
  &:where(.rt-r-size-5) {
82
301
  --avatar-size: var(--space-9);
83
302
  --avatar-fallback-one-letter-font-size: var(--font-size-6);
84
- border-radius: max(var(--radius-4), var(--radius-full));
85
- letter-spacing: var(--letter-spacing-6);
303
+ --avatar-fallback-two-letters-font-size: var(--font-size-5);
304
+ border-radius: max(var(--radius-5), var(--radius-full));
305
+ letter-spacing: var(--letter-spacing-5);
86
306
  }
87
307
  &:where(.rt-r-size-6) {
88
308
  --avatar-size: 80px;
89
309
  --avatar-fallback-one-letter-font-size: var(--font-size-7);
90
- border-radius: max(var(--radius-5), var(--radius-full));
91
- letter-spacing: var(--letter-spacing-7);
310
+ --avatar-fallback-two-letters-font-size: var(--font-size-6);
311
+ border-radius: max(var(--radius-6), var(--radius-full));
312
+ letter-spacing: var(--letter-spacing-6);
92
313
  }
93
314
  &:where(.rt-r-size-7) {
94
315
  --avatar-size: 96px;
95
316
  --avatar-fallback-one-letter-font-size: var(--font-size-7);
96
- border-radius: max(var(--radius-5), var(--radius-full));
317
+ --avatar-fallback-two-letters-font-size: var(--font-size-6);
318
+ border-radius: max(var(--radius-7), var(--radius-full));
97
319
  letter-spacing: var(--letter-spacing-7);
98
320
  }
99
321
  &:where(.rt-r-size-8) {
100
322
  --avatar-size: 128px;
101
323
  --avatar-fallback-one-letter-font-size: var(--font-size-8);
102
- border-radius: max(var(--radius-6), var(--radius-full));
324
+ --avatar-fallback-two-letters-font-size: var(--font-size-7);
325
+ border-radius: max(var(--radius-8), var(--radius-full));
103
326
  letter-spacing: var(--letter-spacing-8);
104
327
  }
105
328
  &:where(.rt-r-size-9) {
106
329
  --avatar-size: 160px;
107
330
  --avatar-fallback-one-letter-font-size: var(--font-size-9);
108
- border-radius: max(var(--radius-6), var(--radius-full));
331
+ --avatar-fallback-two-letters-font-size: var(--font-size-8);
332
+ border-radius: max(var(--radius-9), var(--radius-full));
109
333
  letter-spacing: var(--letter-spacing-9);
110
334
  }
111
335
  }
@@ -128,16 +352,219 @@
128
352
  background-color: var(--accent-12);
129
353
  color: var(--accent-1);
130
354
  }
355
+ &:where([data-disabled]) :where(.rt-AvatarFallback) {
356
+ color: var(--gray-a8);
357
+ background-color: var(--gray-a3);
358
+ filter: none;
359
+ }
131
360
  }
132
361
 
133
362
  /* soft */
134
363
 
135
364
  .rt-AvatarRoot:where(.rt-variant-soft) {
136
365
  & :where(.rt-AvatarFallback) {
366
+ /* Base state: solid accent for solid panels */
367
+ background-color: var(--accent-3);
368
+ color: var(--accent-11);
369
+
370
+ /* Theme-level translucent override */
371
+ :where([data-panel-background='translucent']) & {
372
+ background-color: var(--accent-a3);
373
+ color: var(--accent-a11);
374
+ backdrop-filter: var(--backdrop-filter-components);
375
+ }
376
+
377
+ /* Component-level overrides (higher specificity) */
378
+ :where(.rt-AvatarRoot[data-panel-background='solid']) & {
379
+ background-color: var(--accent-3);
380
+ color: var(--accent-11);
381
+ backdrop-filter: none;
382
+ --backdrop-filter-components: none;
383
+ }
384
+
385
+ :where(.rt-AvatarRoot[data-panel-background='translucent']) & {
386
+ background-color: var(--accent-a3);
387
+ color: var(--accent-a11);
388
+ backdrop-filter: var(--backdrop-filter-components);
389
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
390
+ }
391
+ }
392
+ &:where(.rt-high-contrast) :where(.rt-AvatarFallback) {
393
+ background-color: var(--accent-3);
394
+ color: var(--accent-12);
395
+
396
+ :where([data-panel-background='translucent']) & {
137
397
  background-color: var(--accent-a3);
398
+ color: var(--accent-a12);
399
+ }
400
+ }
401
+ &:where([data-disabled]) :where(.rt-AvatarFallback) {
402
+ color: var(--gray-a8);
403
+ background-color: var(--gray-a3);
404
+ backdrop-filter: none;
405
+ }
406
+ }
407
+
408
+ /* surface */
409
+
410
+ .rt-AvatarRoot:where(.rt-variant-surface) {
411
+ & :where(.rt-AvatarFallback) {
412
+ /* Base state: solid colors for solid panels */
413
+ background-color: var(--accent-2);
414
+ box-shadow: inset 0 0 0 1px var(--accent-7);
415
+ color: var(--accent-a11);
416
+
417
+ /* Theme-level translucent override */
418
+ :where([data-panel-background='translucent']) & {
419
+ background-color: var(--accent-a2);
420
+ box-shadow: inset 0 0 0 1px var(--accent-a7);
421
+ backdrop-filter: var(--backdrop-filter-components);
422
+ }
423
+
424
+ /* Component-level overrides (higher specificity) */
425
+ :where(.rt-AvatarRoot[data-panel-background='solid']) & {
426
+ background-color: var(--accent-2);
427
+ box-shadow: inset 0 0 0 1px var(--accent-7);
428
+ backdrop-filter: none;
429
+ --backdrop-filter-components: none;
430
+ }
431
+
432
+ :where(.rt-AvatarRoot[data-panel-background='translucent']) & {
433
+ background-color: var(--accent-a2);
434
+ box-shadow: inset 0 0 0 1px var(--accent-a7);
435
+ backdrop-filter: var(--backdrop-filter-components);
436
+ --backdrop-filter-components: blur(var(--backdrop-blur-components));
437
+ }
438
+ }
439
+ &:where(.rt-high-contrast) :where(.rt-AvatarFallback) {
440
+ color: var(--accent-12);
441
+ }
442
+ &:where([data-disabled]) :where(.rt-AvatarFallback) {
443
+ color: var(--gray-a8);
444
+ background-color: var(--gray-a2);
445
+ box-shadow: inset 0 0 0 1px var(--gray-a6);
446
+ backdrop-filter: none;
447
+ }
448
+ }
449
+
450
+ /* outline */
451
+
452
+ .rt-AvatarRoot:where(.rt-variant-outline) {
453
+ & :where(.rt-AvatarFallback) {
454
+ /* Base state: solid colors for solid panels */
455
+ background-color: transparent;
456
+ box-shadow: inset 0 0 0 1px var(--accent-8);
457
+ color: var(--accent-11);
458
+
459
+ /* Theme-level translucent override */
460
+ :where([data-panel-background='translucent']) & {
461
+ box-shadow: inset 0 0 0 1px var(--accent-a8);
462
+ color: var(--accent-a11);
463
+ }
464
+
465
+ /* Component-level overrides (higher specificity) */
466
+ :where(.rt-AvatarRoot[data-panel-background='solid']) & {
467
+ box-shadow: inset 0 0 0 1px var(--accent-8);
468
+ color: var(--accent-11);
469
+ backdrop-filter: none;
470
+ --backdrop-filter-components: none;
471
+ }
472
+
473
+ :where(.rt-AvatarRoot[data-panel-background='translucent']) & {
474
+ box-shadow: inset 0 0 0 1px var(--accent-a8);
475
+ color: var(--accent-a11);
476
+ }
477
+ }
478
+ &:where(.rt-high-contrast) :where(.rt-AvatarFallback) {
479
+ box-shadow:
480
+ inset 0 0 0 1px var(--accent-7),
481
+ inset 0 0 0 1px var(--gray-11);
482
+ color: var(--accent-12);
483
+
484
+ /* Theme-level translucent override for high contrast */
485
+ :where([data-panel-background='translucent']) & {
486
+ box-shadow:
487
+ inset 0 0 0 1px var(--accent-a7),
488
+ inset 0 0 0 1px var(--gray-a11);
489
+ }
490
+
491
+ /* Component-level overrides for high contrast */
492
+ :where(.rt-AvatarRoot[data-panel-background='solid']) & {
493
+ box-shadow:
494
+ inset 0 0 0 1px var(--accent-7),
495
+ inset 0 0 0 1px var(--gray-11);
496
+ }
497
+
498
+ :where(.rt-AvatarRoot[data-panel-background='translucent']) & {
499
+ box-shadow:
500
+ inset 0 0 0 1px var(--accent-a7),
501
+ inset 0 0 0 1px var(--gray-a11);
502
+ }
503
+ }
504
+ &:where([data-disabled]) :where(.rt-AvatarFallback) {
505
+ color: var(--gray-a8);
506
+ background-color: transparent;
507
+ box-shadow: inset 0 0 0 1px var(--gray-a7);
508
+ backdrop-filter: none;
509
+ }
510
+ }
511
+
512
+ /* classic */
513
+
514
+ .rt-AvatarRoot:where(.rt-variant-classic) {
515
+ /* Match button's slight elevation */
516
+ position: relative;
517
+ top: var(--classic-elevation-offset);
518
+ & :where(.rt-AvatarFallback) {
519
+ position: relative;
520
+ top: 0; /* reset – elevation handled by root now */
138
521
  color: var(--accent-a11);
522
+ background-color: var(--accent-2);
523
+ /* prettier-ignore */
524
+ box-shadow:
525
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a2),
526
+ inset 0 var(--classic-border-width) var(--white-a12),
527
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
528
+ inset 0 calc(-1 * var(--classic-border-width)) var(--accent-a6),
529
+ 0 0 0 var(--classic-border-width) var(--accent-a5),
530
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--accent-a7);
531
+
532
+ :where(.dark, .dark-theme) &,
533
+ :where(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) & {
534
+ /* prettier-ignore */
535
+ box-shadow:
536
+ inset 0 calc(-1 * var(--classic-border-width)) var(--classic-shadow-blur-large) var(--accent-a3),
537
+ inset 0 var(--classic-border-width) var(--accent-a11),
538
+ inset 0 var(--classic-shadow-blur-medium) var(--classic-shadow-blur-large) var(--accent-a2),
539
+ inset 0 calc(-2 * var(--classic-border-width)) var(--black-a11),
540
+ 0 0 0 var(--classic-border-width-thick) var(--accent-a7),
541
+ 0 var(--classic-shadow-offset-y) var(--classic-shadow-blur-small) var(--black-a12);
542
+ }
139
543
  }
140
544
  &:where(.rt-high-contrast) :where(.rt-AvatarFallback) {
141
545
  color: var(--accent-12);
546
+ background-color: var(--accent-2);
547
+ }
548
+ &:where([data-disabled]) :where(.rt-AvatarFallback) {
549
+ color: var(--gray-a8);
550
+ background-color: var(--gray-a3);
551
+ box-shadow: none;
552
+ top: 0;
142
553
  }
143
554
  }
555
+
556
+ /* ---------------------------------------------------------------------------------------------- */
557
+ /* Avatar image filter tokens */
558
+ /* ---------------------------------------------------------------------------------------------- */
559
+
560
+ :where(.radix-themes) {
561
+ /* Hover and active filters for avatars that display images */
562
+ --avatar-image-hover-filter: brightness(0.95) saturate(1.05);
563
+ --avatar-image-active-filter: brightness(0.9) saturate(1.1);
564
+ }
565
+
566
+ :is(.dark, .dark-theme),
567
+ :is(.dark, .dark-theme) :where(.radix-themes:not(.light, .light-theme)) {
568
+ --avatar-image-hover-filter: brightness(1.05) saturate(1.05);
569
+ --avatar-image-active-filter: brightness(1.1) saturate(1.1);
570
+ }
@@ -6,7 +6,8 @@ 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', '4', '5', '6', '7', '8', '9'] as const;
9
- const variants = ['solid', 'soft'] as const;
9
+ const variants = ['solid', 'soft', 'surface', 'outline'] as const;
10
+ const panelBackgrounds = ['solid', 'translucent'] as const;
10
11
 
11
12
  const avatarPropDefs = {
12
13
  ...asChildPropDef,
@@ -16,10 +17,12 @@ const avatarPropDefs = {
16
17
  ...highContrastPropDef,
17
18
  ...radiusPropDef,
18
19
  fallback: { type: 'ReactNode', required: true },
20
+ panelBackground: { type: 'enum', values: panelBackgrounds, default: undefined },
19
21
  } satisfies {
20
22
  size: PropDef<(typeof sizes)[number]>;
21
23
  variant: PropDef<(typeof variants)[number]>;
22
24
  fallback: PropDef<React.ReactNode>;
25
+ panelBackground: PropDef<(typeof panelBackgrounds)[number] | undefined>;
23
26
  };
24
27
 
25
28
  export { avatarPropDefs };