@usefragments/ui 1.6.0 → 2.0.0

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 (685) hide show
  1. package/README.md +54 -66
  2. package/dist/assets/fragments-wordmark.cjs +2 -2
  3. package/dist/assets/fragments-wordmark.d.ts.map +1 -1
  4. package/dist/assets/fragments-wordmark.js +2 -2
  5. package/dist/assets/nav-glyph.cjs +139 -0
  6. package/dist/assets/nav-glyph.d.ts +28 -0
  7. package/dist/assets/nav-glyph.d.ts.map +1 -0
  8. package/dist/assets/nav-glyph.js +139 -0
  9. package/dist/assets/nav-glyph.module.scss.cjs +71 -0
  10. package/dist/assets/nav-glyph.module.scss.js +71 -0
  11. package/dist/assets/ui.css +6885 -6308
  12. package/dist/blocks/components/StatsCard.d.ts +1 -1
  13. package/dist/blocks/components/StatsCard.d.ts.map +1 -1
  14. package/dist/chart.cjs +24 -6
  15. package/dist/chart.js +24 -6
  16. package/dist/codeblock.cjs +76 -43
  17. package/dist/codeblock.js +71 -38
  18. package/dist/colorpicker.cjs +4 -1
  19. package/dist/colorpicker.js +4 -1
  20. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  21. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  22. package/dist/components/Alert/Alert.module.scss.cjs +23 -20
  23. package/dist/components/Alert/Alert.module.scss.js +23 -20
  24. package/dist/components/Alert/index.cjs +20 -8
  25. package/dist/components/Alert/index.d.ts +17 -11
  26. package/dist/components/Alert/index.d.ts.map +1 -1
  27. package/dist/components/Alert/index.js +20 -8
  28. package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
  29. package/dist/components/AppShell/AppShell.module.scss.js +14 -14
  30. package/dist/components/AppShell/index.cjs +2 -2
  31. package/dist/components/AppShell/index.js +2 -2
  32. package/dist/components/Avatar/Avatar.module.scss.cjs +14 -14
  33. package/dist/components/Avatar/Avatar.module.scss.js +14 -14
  34. package/dist/components/Badge/Badge.module.scss.cjs +33 -31
  35. package/dist/components/Badge/Badge.module.scss.js +33 -31
  36. package/dist/components/Badge/index.cjs +13 -3
  37. package/dist/components/Badge/index.d.ts +18 -13
  38. package/dist/components/Badge/index.d.ts.map +1 -1
  39. package/dist/components/Badge/index.js +13 -3
  40. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +14 -14
  41. package/dist/components/BentoGrid/BentoGrid.module.scss.js +14 -14
  42. package/dist/components/Box/Box.module.scss.cjs +152 -152
  43. package/dist/components/Box/Box.module.scss.js +152 -152
  44. package/dist/components/Box/index.cjs +64 -75
  45. package/dist/components/Box/index.d.ts +16 -16
  46. package/dist/components/Box/index.d.ts.map +1 -1
  47. package/dist/components/Box/index.js +64 -75
  48. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +11 -8
  49. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +11 -8
  50. package/dist/components/Breadcrumbs/index.cjs +1 -1
  51. package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
  52. package/dist/components/Breadcrumbs/index.js +1 -1
  53. package/dist/components/Button/Button.module.scss.cjs +36 -27
  54. package/dist/components/Button/Button.module.scss.js +36 -27
  55. package/dist/components/Button/index.cjs +20 -4
  56. package/dist/components/Button/index.d.ts +18 -10
  57. package/dist/components/Button/index.d.ts.map +1 -1
  58. package/dist/components/Button/index.js +20 -4
  59. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +15 -15
  60. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +15 -15
  61. package/dist/components/Card/Card.module.scss.cjs +31 -26
  62. package/dist/components/Card/Card.module.scss.js +32 -27
  63. package/dist/components/Card/index.cjs +16 -3
  64. package/dist/components/Card/index.d.ts +23 -15
  65. package/dist/components/Card/index.d.ts.map +1 -1
  66. package/dist/components/Card/index.js +16 -3
  67. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  68. package/dist/components/Chart/Chart.module.scss.js +15 -15
  69. package/dist/components/Chart/index.d.ts.map +1 -1
  70. package/dist/components/Checkbox/Checkbox.module.scss.cjs +11 -11
  71. package/dist/components/Checkbox/Checkbox.module.scss.js +11 -11
  72. package/dist/components/Checkbox/index.cjs +4 -4
  73. package/dist/components/Checkbox/index.d.ts +4 -6
  74. package/dist/components/Checkbox/index.d.ts.map +1 -1
  75. package/dist/components/Checkbox/index.js +4 -4
  76. package/dist/components/Chip/Chip.module.scss.cjs +19 -19
  77. package/dist/components/Chip/Chip.module.scss.js +19 -19
  78. package/dist/components/Chip/index.cjs +3 -3
  79. package/dist/components/Chip/index.d.ts +8 -3
  80. package/dist/components/Chip/index.d.ts.map +1 -1
  81. package/dist/components/Chip/index.js +3 -3
  82. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +26 -23
  83. package/dist/components/CodeBlock/CodeBlock.module.scss.js +26 -23
  84. package/dist/components/CodeBlock/css-variables-theme.cjs +98 -0
  85. package/dist/components/CodeBlock/css-variables-theme.d.ts +27 -0
  86. package/dist/components/CodeBlock/css-variables-theme.d.ts.map +1 -0
  87. package/dist/components/CodeBlock/css-variables-theme.js +98 -0
  88. package/dist/components/CodeBlock/index.d.ts +20 -5
  89. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  90. package/dist/components/Collapsible/Collapsible.module.scss.cjs +9 -9
  91. package/dist/components/Collapsible/Collapsible.module.scss.js +9 -9
  92. package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +14 -14
  93. package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
  94. package/dist/components/ColorPicker/index.d.ts.map +1 -1
  95. package/dist/components/Combobox/Combobox.module.scss.cjs +21 -21
  96. package/dist/components/Combobox/Combobox.module.scss.js +21 -21
  97. package/dist/components/Combobox/index.cjs +26 -6
  98. package/dist/components/Combobox/index.d.ts.map +1 -1
  99. package/dist/components/Combobox/index.js +26 -6
  100. package/dist/components/Command/Command.module.scss.cjs +14 -11
  101. package/dist/components/Command/Command.module.scss.js +14 -11
  102. package/dist/components/Command/index.cjs +28 -16
  103. package/dist/components/Command/index.d.ts +8 -3
  104. package/dist/components/Command/index.d.ts.map +1 -1
  105. package/dist/components/Command/index.js +28 -16
  106. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  107. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  108. package/dist/components/ConversationList/index.cjs +2 -2
  109. package/dist/components/ConversationList/index.js +2 -2
  110. package/dist/components/DataTable/DataTable.icons.cjs +6 -33
  111. package/dist/components/DataTable/DataTable.icons.d.ts.map +1 -1
  112. package/dist/components/DataTable/DataTable.icons.js +6 -33
  113. package/dist/components/DataTable/DataTable.module.scss.cjs +31 -28
  114. package/dist/components/DataTable/DataTable.module.scss.js +31 -28
  115. package/dist/components/DataTable/DataTable.virtual.d.ts.map +1 -1
  116. package/dist/components/DataTable/index.d.ts.map +1 -1
  117. package/dist/components/DatePicker/DatePicker.module.scss.cjs +33 -33
  118. package/dist/components/DatePicker/DatePicker.module.scss.js +33 -33
  119. package/dist/components/DatePicker/index.d.ts.map +1 -1
  120. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  121. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  122. package/dist/components/Dialog/index.cjs +13 -16
  123. package/dist/components/Dialog/index.d.ts +11 -10
  124. package/dist/components/Dialog/index.d.ts.map +1 -1
  125. package/dist/components/Dialog/index.js +13 -16
  126. package/dist/components/Drawer/Drawer.module.scss.cjs +39 -39
  127. package/dist/components/Drawer/Drawer.module.scss.js +40 -40
  128. package/dist/components/Drawer/index.cjs +2 -2
  129. package/dist/components/Drawer/index.d.ts +5 -4
  130. package/dist/components/Drawer/index.d.ts.map +1 -1
  131. package/dist/components/Drawer/index.js +2 -2
  132. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  133. package/dist/components/Editor/Editor.module.scss.js +17 -17
  134. package/dist/components/Editor/index.d.ts +10 -10
  135. package/dist/components/Editor/index.d.ts.map +1 -1
  136. package/dist/components/EmptyState/EmptyState.module.scss.cjs +11 -8
  137. package/dist/components/EmptyState/EmptyState.module.scss.js +11 -8
  138. package/dist/components/EmptyState/index.cjs +13 -6
  139. package/dist/components/EmptyState/index.d.ts +13 -5
  140. package/dist/components/EmptyState/index.d.ts.map +1 -1
  141. package/dist/components/EmptyState/index.js +13 -6
  142. package/dist/components/Field/Field.module.scss.cjs +5 -5
  143. package/dist/components/Field/Field.module.scss.js +5 -5
  144. package/dist/components/Field/index.cjs +9 -1
  145. package/dist/components/Field/index.d.ts.map +1 -1
  146. package/dist/components/Field/index.js +9 -1
  147. package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
  148. package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
  149. package/dist/components/Grid/Grid.module.scss.cjs +54 -54
  150. package/dist/components/Grid/Grid.module.scss.js +54 -54
  151. package/dist/components/Grid/index.cjs +1 -1
  152. package/dist/components/Grid/index.js +1 -1
  153. package/dist/components/Header/Header.module.scss.cjs +33 -33
  154. package/dist/components/Header/Header.module.scss.js +33 -33
  155. package/dist/components/Header/index.cjs +17 -38
  156. package/dist/components/Header/index.d.ts +15 -11
  157. package/dist/components/Header/index.d.ts.map +1 -1
  158. package/dist/components/Header/index.js +17 -38
  159. package/dist/components/Icon/Icon.module.scss.cjs +30 -33
  160. package/dist/components/Icon/Icon.module.scss.js +30 -33
  161. package/dist/components/Icon/index.cjs +15 -14
  162. package/dist/components/Icon/index.d.ts +23 -12
  163. package/dist/components/Icon/index.d.ts.map +1 -1
  164. package/dist/components/Icon/index.js +15 -14
  165. package/dist/components/IconButton/IconButton.module.scss.cjs +12 -12
  166. package/dist/components/IconButton/IconButton.module.scss.js +12 -12
  167. package/dist/components/IconButton/index.cjs +2 -1
  168. package/dist/components/IconButton/index.d.ts +4 -4
  169. package/dist/components/IconButton/index.d.ts.map +1 -1
  170. package/dist/components/IconButton/index.js +2 -1
  171. package/dist/components/Image/Image.module.scss.cjs +27 -27
  172. package/dist/components/Image/Image.module.scss.js +27 -27
  173. package/dist/components/Input/Input.module.scss.cjs +15 -21
  174. package/dist/components/Input/Input.module.scss.js +15 -21
  175. package/dist/components/Input/index.cjs +2 -14
  176. package/dist/components/Input/index.d.ts +0 -2
  177. package/dist/components/Input/index.d.ts.map +1 -1
  178. package/dist/components/Input/index.js +2 -14
  179. package/dist/components/Link/Link.module.scss.cjs +26 -14
  180. package/dist/components/Link/Link.module.scss.js +26 -14
  181. package/dist/components/Link/index.cjs +13 -2
  182. package/dist/components/Link/index.d.ts +11 -4
  183. package/dist/components/Link/index.d.ts.map +1 -1
  184. package/dist/components/Link/index.js +13 -2
  185. package/dist/components/List/List.module.scss.cjs +23 -19
  186. package/dist/components/List/List.module.scss.js +23 -19
  187. package/dist/components/List/index.cjs +7 -7
  188. package/dist/components/List/index.d.ts +10 -7
  189. package/dist/components/List/index.d.ts.map +1 -1
  190. package/dist/components/List/index.js +7 -7
  191. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  192. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  193. package/dist/components/Loading/Loading.module.scss.cjs +34 -34
  194. package/dist/components/Loading/Loading.module.scss.js +34 -34
  195. package/dist/components/Loading/index.cjs +5 -5
  196. package/dist/components/Loading/index.d.ts +8 -7
  197. package/dist/components/Loading/index.d.ts.map +1 -1
  198. package/dist/components/Loading/index.js +5 -5
  199. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  200. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  201. package/dist/components/Markdown/index.d.ts +2 -2
  202. package/dist/components/Markdown/index.d.ts.map +1 -1
  203. package/dist/components/Menu/Menu.module.scss.cjs +14 -14
  204. package/dist/components/Menu/Menu.module.scss.js +14 -14
  205. package/dist/components/Message/Message.module.scss.cjs +20 -20
  206. package/dist/components/Message/Message.module.scss.js +20 -20
  207. package/dist/components/Message/index.cjs +1 -1
  208. package/dist/components/Message/index.d.ts +1 -1
  209. package/dist/components/Message/index.js +1 -1
  210. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +34 -31
  211. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +34 -31
  212. package/dist/components/NavigationMenu/index.cjs +32 -15
  213. package/dist/components/NavigationMenu/index.d.ts +12 -6
  214. package/dist/components/NavigationMenu/index.d.ts.map +1 -1
  215. package/dist/components/NavigationMenu/index.js +32 -15
  216. package/dist/components/Pagination/Pagination.module.scss.cjs +10 -10
  217. package/dist/components/Pagination/Pagination.module.scss.js +10 -10
  218. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  219. package/dist/components/Popover/Popover.module.scss.js +10 -10
  220. package/dist/components/Progress/Progress.module.scss.cjs +28 -25
  221. package/dist/components/Progress/Progress.module.scss.js +28 -25
  222. package/dist/components/Progress/index.cjs +21 -12
  223. package/dist/components/Progress/index.d.ts +10 -6
  224. package/dist/components/Progress/index.d.ts.map +1 -1
  225. package/dist/components/Progress/index.js +21 -12
  226. package/dist/components/Prompt/Prompt.module.scss.cjs +30 -30
  227. package/dist/components/Prompt/Prompt.module.scss.js +30 -30
  228. package/dist/components/Prompt/index.cjs +7 -7
  229. package/dist/components/Prompt/index.d.ts +11 -9
  230. package/dist/components/Prompt/index.d.ts.map +1 -1
  231. package/dist/components/Prompt/index.js +7 -7
  232. package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +20 -17
  233. package/dist/components/RadioGroup/RadioGroup.module.scss.js +20 -17
  234. package/dist/components/RadioGroup/index.cjs +10 -5
  235. package/dist/components/RadioGroup/index.d.ts +11 -7
  236. package/dist/components/RadioGroup/index.d.ts.map +1 -1
  237. package/dist/components/RadioGroup/index.js +10 -5
  238. package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +5 -5
  239. package/dist/components/ScrollArea/ScrollArea.module.scss.js +5 -5
  240. package/dist/components/ScrollArea/index.d.ts +4 -4
  241. package/dist/components/ScrollArea/index.d.ts.map +1 -1
  242. package/dist/components/ScrollArea/scroll-state.d.ts +5 -5
  243. package/dist/components/Select/Select.module.scss.cjs +21 -21
  244. package/dist/components/Select/Select.module.scss.js +21 -21
  245. package/dist/components/Select/index.cjs +26 -20
  246. package/dist/components/Select/index.d.ts +5 -5
  247. package/dist/components/Select/index.d.ts.map +1 -1
  248. package/dist/components/Select/index.js +26 -20
  249. package/dist/components/Separator/Separator.module.scss.cjs +25 -19
  250. package/dist/components/Separator/Separator.module.scss.js +25 -19
  251. package/dist/components/Separator/index.cjs +10 -8
  252. package/dist/components/Separator/index.d.ts +4 -2
  253. package/dist/components/Separator/index.d.ts.map +1 -1
  254. package/dist/components/Separator/index.js +10 -8
  255. package/dist/components/Sidebar/Sidebar.module.scss.cjs +43 -43
  256. package/dist/components/Sidebar/Sidebar.module.scss.js +43 -43
  257. package/dist/components/Sidebar/index.cjs +15 -38
  258. package/dist/components/Sidebar/index.d.ts +19 -19
  259. package/dist/components/Sidebar/index.d.ts.map +1 -1
  260. package/dist/components/Sidebar/index.js +15 -38
  261. package/dist/components/Skeleton/Skeleton.module.scss.cjs +50 -46
  262. package/dist/components/Skeleton/Skeleton.module.scss.js +50 -46
  263. package/dist/components/Skeleton/index.cjs +7 -7
  264. package/dist/components/Skeleton/index.d.ts +8 -7
  265. package/dist/components/Skeleton/index.d.ts.map +1 -1
  266. package/dist/components/Skeleton/index.js +7 -7
  267. package/dist/components/Slider/Slider.module.scss.cjs +12 -12
  268. package/dist/components/Slider/Slider.module.scss.js +12 -12
  269. package/dist/components/Stack/Stack.module.scss.cjs +25 -25
  270. package/dist/components/Stack/Stack.module.scss.js +25 -25
  271. package/dist/components/Stack/index.cjs +1 -1
  272. package/dist/components/Stack/index.js +1 -1
  273. package/dist/components/Switch/Switch.module.scss.cjs +9 -9
  274. package/dist/components/Switch/Switch.module.scss.js +9 -9
  275. package/dist/components/Table/Table.module.scss.cjs +19 -19
  276. package/dist/components/Table/Table.module.scss.js +19 -19
  277. package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +15 -15
  278. package/dist/components/TableOfContents/TableOfContents.module.scss.js +15 -15
  279. package/dist/components/TableOfContents/index.cjs +14 -10
  280. package/dist/components/TableOfContents/index.d.ts +5 -3
  281. package/dist/components/TableOfContents/index.d.ts.map +1 -1
  282. package/dist/components/TableOfContents/index.js +14 -10
  283. package/dist/components/Tabs/Tabs.module.scss.cjs +18 -18
  284. package/dist/components/Tabs/Tabs.module.scss.js +18 -18
  285. package/dist/components/Tabs/index.cjs +30 -11
  286. package/dist/components/Tabs/index.d.ts +8 -6
  287. package/dist/components/Tabs/index.d.ts.map +1 -1
  288. package/dist/components/Tabs/index.js +30 -11
  289. package/dist/components/Text/Text.module.scss.cjs +109 -97
  290. package/dist/components/Text/Text.module.scss.js +109 -97
  291. package/dist/components/Text/index.cjs +45 -41
  292. package/dist/components/Text/index.d.ts +24 -19
  293. package/dist/components/Text/index.d.ts.map +1 -1
  294. package/dist/components/Text/index.js +45 -41
  295. package/dist/components/Textarea/Textarea.module.scss.cjs +22 -28
  296. package/dist/components/Textarea/Textarea.module.scss.js +22 -28
  297. package/dist/components/Textarea/index.cjs +3 -10
  298. package/dist/components/Textarea/index.d.ts +0 -2
  299. package/dist/components/Textarea/index.d.ts.map +1 -1
  300. package/dist/components/Textarea/index.js +3 -10
  301. package/dist/components/Theme/index.cjs +22 -5
  302. package/dist/components/Theme/index.d.ts +6 -12
  303. package/dist/components/Theme/index.d.ts.map +1 -1
  304. package/dist/components/Theme/index.js +22 -5
  305. package/dist/components/ThemeToggle/ThemeButton.cjs +51 -0
  306. package/dist/components/ThemeToggle/ThemeButton.d.ts +16 -0
  307. package/dist/components/ThemeToggle/ThemeButton.d.ts.map +1 -0
  308. package/dist/components/ThemeToggle/ThemeButton.js +34 -0
  309. package/dist/components/ThemeToggle/ThemeToggle.module.scss.cjs +6 -6
  310. package/dist/components/ThemeToggle/ThemeToggle.module.scss.js +6 -6
  311. package/dist/components/ThemeToggle/icons.cjs +48 -0
  312. package/dist/components/ThemeToggle/icons.d.ts +10 -0
  313. package/dist/components/ThemeToggle/icons.d.ts.map +1 -0
  314. package/dist/components/ThemeToggle/icons.js +48 -0
  315. package/dist/components/ThemeToggle/index.cjs +6 -50
  316. package/dist/components/ThemeToggle/index.d.ts +5 -3
  317. package/dist/components/ThemeToggle/index.d.ts.map +1 -1
  318. package/dist/components/ThemeToggle/index.js +3 -47
  319. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +18 -15
  320. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +18 -15
  321. package/dist/components/ThinkingIndicator/index.cjs +7 -8
  322. package/dist/components/ThinkingIndicator/index.d.ts +6 -5
  323. package/dist/components/ThinkingIndicator/index.d.ts.map +1 -1
  324. package/dist/components/ThinkingIndicator/index.js +7 -8
  325. package/dist/components/Toast/Toast.module.scss.cjs +28 -29
  326. package/dist/components/Toast/Toast.module.scss.js +29 -30
  327. package/dist/components/Toast/index.cjs +28 -30
  328. package/dist/components/Toast/index.d.ts +9 -8
  329. package/dist/components/Toast/index.d.ts.map +1 -1
  330. package/dist/components/Toast/index.js +28 -30
  331. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +21 -19
  332. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +22 -20
  333. package/dist/components/ToggleGroup/index.cjs +4 -5
  334. package/dist/components/ToggleGroup/index.d.ts +7 -6
  335. package/dist/components/ToggleGroup/index.d.ts.map +1 -1
  336. package/dist/components/ToggleGroup/index.js +4 -5
  337. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  338. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  339. package/dist/components/Tooltip/index.cjs +24 -40
  340. package/dist/components/Tooltip/index.d.ts +4 -4
  341. package/dist/components/Tooltip/index.d.ts.map +1 -1
  342. package/dist/components/Tooltip/index.js +24 -40
  343. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.cjs +1 -1
  344. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.js +1 -1
  345. package/dist/components/VisuallyHidden/index.d.ts +2 -2
  346. package/dist/data-table-virtual.cjs +3 -2
  347. package/dist/data-table-virtual.js +3 -2
  348. package/dist/data-table.cjs +3 -2
  349. package/dist/data-table.js +3 -2
  350. package/dist/datepicker.cjs +26 -13
  351. package/dist/datepicker.js +26 -13
  352. package/dist/editor.cjs +68 -28
  353. package/dist/editor.js +68 -28
  354. package/dist/index.cjs +6 -2
  355. package/dist/index.d.ts +9 -9
  356. package/dist/index.d.ts.map +1 -1
  357. package/dist/index.js +8 -4
  358. package/dist/markdown.cjs +21 -29
  359. package/dist/markdown.js +21 -29
  360. package/dist/measurements/generated.cjs +46 -94
  361. package/dist/measurements/generated.d.ts +44 -92
  362. package/dist/measurements/generated.d.ts.map +1 -1
  363. package/dist/measurements/generated.js +46 -94
  364. package/dist/measurements/index.d.ts +1 -1
  365. package/dist/measurements/index.d.ts.map +1 -1
  366. package/dist/utils/a11y.cjs +5 -2
  367. package/dist/utils/a11y.d.ts +5 -5
  368. package/dist/utils/a11y.d.ts.map +1 -1
  369. package/dist/utils/a11y.js +5 -2
  370. package/dist/utils/canonical-stamp.cjs +2 -8
  371. package/dist/utils/canonical-stamp.d.ts.map +1 -1
  372. package/dist/utils/canonical-stamp.js +1 -7
  373. package/dist/utils/css-warning.cjs +1 -1
  374. package/dist/utils/css-warning.js +1 -1
  375. package/dist/utils/env.cjs +17 -0
  376. package/dist/utils/env.d.ts +3 -0
  377. package/dist/utils/env.d.ts.map +1 -0
  378. package/dist/utils/env.js +17 -0
  379. package/dist/utils/keyboard-shortcuts.cjs +3 -10
  380. package/dist/utils/keyboard-shortcuts.d.ts +4 -4
  381. package/dist/utils/keyboard-shortcuts.d.ts.map +1 -1
  382. package/dist/utils/keyboard-shortcuts.js +3 -10
  383. package/dist/utils/seed-derivation.cjs +10 -7
  384. package/dist/utils/seed-derivation.d.ts +1 -3
  385. package/dist/utils/seed-derivation.d.ts.map +1 -1
  386. package/dist/utils/seed-derivation.js +10 -7
  387. package/dist/utils/theme-presets.cjs +5 -10
  388. package/dist/utils/theme-presets.d.ts +1 -2
  389. package/dist/utils/theme-presets.d.ts.map +1 -1
  390. package/dist/utils/theme-presets.js +5 -10
  391. package/fragments.json +1 -1
  392. package/package.json +9 -10
  393. package/src/assets/fragments-logo.tsx +2 -2
  394. package/src/assets/fragments-wordmark.tsx +4 -2
  395. package/src/assets/nav-glyph.module.scss +166 -0
  396. package/src/assets/nav-glyph.tsx +188 -0
  397. package/src/components/Accordion/Accordion.contract.json +24 -48
  398. package/src/components/Accordion/Accordion.module.scss +5 -3
  399. package/src/components/Alert/Alert.contract.json +49 -65
  400. package/src/components/Alert/Alert.module.scss +57 -47
  401. package/src/components/Alert/index.tsx +72 -39
  402. package/src/components/AppShell/AppShell.contract.json +34 -51
  403. package/src/components/AppShell/AppShell.module.scss +99 -54
  404. package/src/components/AppShell/index.tsx +2 -2
  405. package/src/components/Avatar/Avatar.contract.json +31 -48
  406. package/src/components/Avatar/Avatar.module.scss +4 -2
  407. package/src/components/Badge/Badge.contract.json +86 -55
  408. package/src/components/Badge/Badge.module.scss +80 -48
  409. package/src/components/Badge/index.tsx +34 -17
  410. package/src/components/BentoGrid/BentoGrid.contract.json +21 -45
  411. package/src/components/BentoGrid/BentoGrid.module.scss +4 -8
  412. package/src/components/Box/Box.contract.json +40 -148
  413. package/src/components/Box/Box.module.scss +7 -6
  414. package/src/components/Box/index.tsx +92 -99
  415. package/src/components/Breadcrumbs/Breadcrumbs.contract.json +21 -34
  416. package/src/components/Breadcrumbs/Breadcrumbs.module.scss +27 -12
  417. package/src/components/Breadcrumbs/index.tsx +5 -1
  418. package/src/components/Button/Button.module.scss +261 -185
  419. package/src/components/Button/index.tsx +41 -28
  420. package/src/components/ButtonGroup/ButtonGroup.contract.json +34 -49
  421. package/src/components/ButtonGroup/ButtonGroup.module.scss +8 -6
  422. package/src/components/Card/Card.consumer-fixture.module.scss +5 -2
  423. package/src/components/Card/Card.module.scss +97 -76
  424. package/src/components/Card/index.tsx +44 -20
  425. package/src/components/Chart/Chart.contract.json +21 -29
  426. package/src/components/Chart/Chart.module.scss +6 -5
  427. package/src/components/Chart/index.tsx +36 -6
  428. package/src/components/Checkbox/Checkbox.contract.json +28 -27
  429. package/src/components/Checkbox/Checkbox.module.scss +47 -54
  430. package/src/components/Checkbox/index.tsx +10 -10
  431. package/src/components/Chip/Chip.contract.json +38 -45
  432. package/src/components/Chip/Chip.module.scss +24 -23
  433. package/src/components/Chip/index.tsx +12 -7
  434. package/src/components/CodeBlock/CodeBlock.contract.json +46 -76
  435. package/src/components/CodeBlock/CodeBlock.module.scss +75 -73
  436. package/src/components/CodeBlock/css-variables-theme.ts +102 -0
  437. package/src/components/CodeBlock/index.tsx +114 -51
  438. package/src/components/Collapsible/Collapsible.contract.json +21 -36
  439. package/src/components/Collapsible/Collapsible.module.scss +1 -7
  440. package/src/components/ColorPicker/ColorPicker.contract.json +29 -48
  441. package/src/components/ColorPicker/ColorPicker.module.scss +34 -24
  442. package/src/components/ColorPicker/index.tsx +6 -1
  443. package/src/components/Combobox/Combobox.contract.json +36 -37
  444. package/src/components/Combobox/Combobox.module.scss +16 -19
  445. package/src/components/Combobox/index.tsx +41 -6
  446. package/src/components/Command/Command.contract.json +28 -44
  447. package/src/components/Command/Command.module.scss +19 -21
  448. package/src/components/Command/index.tsx +64 -47
  449. package/src/components/ComponentDefaults/ComponentDefaults.contract.json +91 -0
  450. package/src/components/ConversationList/ConversationList.contract.json +27 -32
  451. package/src/components/ConversationList/ConversationList.module.scss +2 -3
  452. package/src/components/ConversationList/index.tsx +2 -2
  453. package/src/components/DataTable/DataTable.icons.tsx +4 -21
  454. package/src/components/DataTable/DataTable.module.scss +24 -17
  455. package/src/components/DataTable/DataTable.virtual.tsx +3 -2
  456. package/src/components/DataTable/index.tsx +9 -8
  457. package/src/components/DatePicker/DatePicker.contract.json +27 -28
  458. package/src/components/DatePicker/DatePicker.module.scss +41 -44
  459. package/src/components/DatePicker/index.tsx +23 -9
  460. package/src/components/Dialog/Dialog.module.scss +26 -32
  461. package/src/components/Dialog/index.tsx +51 -39
  462. package/src/components/Drawer/Drawer.contract.json +28 -42
  463. package/src/components/Drawer/Drawer.module.scss +123 -64
  464. package/src/components/Drawer/index.tsx +7 -5
  465. package/src/components/Editor/Editor.contract.json +32 -49
  466. package/src/components/Editor/Editor.module.scss +60 -25
  467. package/src/components/Editor/index.tsx +240 -179
  468. package/src/components/EmptyState/EmptyState.contract.json +33 -45
  469. package/src/components/EmptyState/EmptyState.module.scss +37 -21
  470. package/src/components/EmptyState/index.tsx +56 -23
  471. package/src/components/Field/Field.contract.json +28 -46
  472. package/src/components/Field/Field.module.scss +2 -1
  473. package/src/components/Field/index.tsx +5 -1
  474. package/src/components/Fieldset/Fieldset.contract.json +21 -38
  475. package/src/components/Fieldset/Fieldset.module.scss +15 -7
  476. package/src/components/Form/Form.contract.json +23 -23
  477. package/src/components/Grid/Grid.contract.json +28 -64
  478. package/src/components/Grid/Grid.module.scss +2 -2
  479. package/src/components/Grid/index.tsx +10 -10
  480. package/src/components/Header/Header.contract.json +31 -67
  481. package/src/components/Header/Header.module.scss +57 -54
  482. package/src/components/Header/index.tsx +134 -122
  483. package/src/components/Icon/Icon.contract.json +37 -81
  484. package/src/components/Icon/Icon.module.scss +13 -12
  485. package/src/components/Icon/index.tsx +31 -31
  486. package/src/components/IconButton/IconButton.contract.json +37 -21
  487. package/src/components/IconButton/IconButton.module.scss +19 -11
  488. package/src/components/IconButton/index.tsx +6 -5
  489. package/src/components/Image/Image.contract.json +23 -56
  490. package/src/components/Input/Input.contract.json +25 -44
  491. package/src/components/Input/Input.module.scss +6 -55
  492. package/src/components/Input/index.tsx +2 -18
  493. package/src/components/Link/Link.contract.json +46 -58
  494. package/src/components/Link/Link.module.scss +41 -10
  495. package/src/components/Link/index.tsx +27 -6
  496. package/src/components/List/List.contract.json +33 -62
  497. package/src/components/List/List.module.scss +10 -5
  498. package/src/components/List/index.tsx +17 -13
  499. package/src/components/Listbox/Listbox.contract.json +21 -37
  500. package/src/components/Listbox/Listbox.module.scss +14 -20
  501. package/src/components/Loading/Loading.contract.json +41 -65
  502. package/src/components/Loading/Loading.module.scss +37 -31
  503. package/src/components/Loading/index.tsx +15 -14
  504. package/src/components/Main/Main.contract.json +17 -9
  505. package/src/components/Markdown/Markdown.contract.json +22 -43
  506. package/src/components/Markdown/Markdown.module.scss +45 -6
  507. package/src/components/Markdown/index.tsx +48 -49
  508. package/src/components/Menu/Menu.contract.json +30 -46
  509. package/src/components/Menu/Menu.module.scss +32 -16
  510. package/src/components/Message/Message.contract.json +31 -54
  511. package/src/components/Message/Message.module.scss +18 -9
  512. package/src/components/Message/index.tsx +2 -2
  513. package/src/components/NavigationMenu/NavigationMenu.contract.json +36 -45
  514. package/src/components/NavigationMenu/NavigationMenu.module.scss +66 -66
  515. package/src/components/NavigationMenu/index.tsx +105 -81
  516. package/src/components/Pagination/Pagination.contract.json +22 -40
  517. package/src/components/Pagination/Pagination.module.scss +9 -16
  518. package/src/components/Popover/Popover.contract.json +28 -50
  519. package/src/components/Popover/Popover.module.scss +30 -28
  520. package/src/components/Progress/Progress.contract.json +39 -35
  521. package/src/components/Progress/Progress.module.scss +16 -10
  522. package/src/components/Progress/index.tsx +34 -16
  523. package/src/components/Prompt/Prompt.contract.json +40 -56
  524. package/src/components/Prompt/Prompt.module.scss +49 -48
  525. package/src/components/Prompt/index.tsx +17 -15
  526. package/src/components/RadioGroup/RadioGroup.contract.json +29 -28
  527. package/src/components/RadioGroup/RadioGroup.module.scss +50 -45
  528. package/src/components/RadioGroup/index.tsx +23 -10
  529. package/src/components/ScrollArea/ScrollArea.contract.json +18 -19
  530. package/src/components/ScrollArea/ScrollArea.module.scss +45 -48
  531. package/src/components/ScrollArea/index.tsx +16 -16
  532. package/src/components/ScrollArea/scroll-state.ts +24 -24
  533. package/src/components/Select/Select.module.scss +20 -19
  534. package/src/components/Select/index.tsx +26 -24
  535. package/src/components/Separator/Separator.contract.json +29 -53
  536. package/src/components/Separator/Separator.module.scss +24 -40
  537. package/src/components/Separator/index.tsx +16 -11
  538. package/src/components/Sidebar/Sidebar.contract.json +35 -67
  539. package/src/components/Sidebar/Sidebar.module.scss +94 -88
  540. package/src/components/Sidebar/index.tsx +167 -167
  541. package/src/components/Skeleton/Skeleton.contract.json +34 -60
  542. package/src/components/Skeleton/Skeleton.module.scss +50 -26
  543. package/src/components/Skeleton/index.tsx +16 -15
  544. package/src/components/Slider/Slider.contract.json +27 -39
  545. package/src/components/Slider/Slider.module.scss +9 -22
  546. package/src/components/Stack/Stack.contract.json +30 -57
  547. package/src/components/Stack/Stack.module.scss +26 -24
  548. package/src/components/Stack/index.tsx +3 -3
  549. package/src/components/Switch/Switch.contract.json +33 -46
  550. package/src/components/Switch/Switch.module.scss +106 -59
  551. package/src/components/Table/Table.contract.json +28 -46
  552. package/src/components/Table/Table.module.scss +24 -16
  553. package/src/components/TableOfContents/TableOfContents.contract.json +34 -21
  554. package/src/components/TableOfContents/TableOfContents.module.scss +17 -13
  555. package/src/components/TableOfContents/index.tsx +27 -10
  556. package/src/components/Tabs/Tabs.contract.json +35 -56
  557. package/src/components/Tabs/Tabs.module.scss +27 -31
  558. package/src/components/Tabs/index.tsx +30 -15
  559. package/src/components/Text/Text.contract.json +52 -72
  560. package/src/components/Text/Text.module.scss +34 -18
  561. package/src/components/Text/index.tsx +123 -83
  562. package/src/components/Textarea/Textarea.contract.json +24 -55
  563. package/src/components/Textarea/Textarea.module.scss +22 -52
  564. package/src/components/Textarea/index.tsx +3 -14
  565. package/src/components/Theme/Theme.contract.json +35 -53
  566. package/src/components/Theme/index.tsx +41 -13
  567. package/src/components/ThemeToggle/ThemeButton.tsx +49 -0
  568. package/src/components/ThemeToggle/ThemeToggle.module.scss +20 -27
  569. package/src/components/ThemeToggle/icons.tsx +46 -0
  570. package/src/components/ThemeToggle/index.tsx +9 -55
  571. package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +34 -50
  572. package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +9 -7
  573. package/src/components/ThinkingIndicator/index.tsx +12 -14
  574. package/src/components/Toast/Toast.contract.json +55 -49
  575. package/src/components/Toast/Toast.module.scss +50 -105
  576. package/src/components/Toast/index.tsx +39 -34
  577. package/src/components/ToggleGroup/ToggleGroup.contract.json +39 -40
  578. package/src/components/ToggleGroup/ToggleGroup.module.scss +30 -27
  579. package/src/components/ToggleGroup/index.tsx +11 -11
  580. package/src/components/Tooltip/Tooltip.contract.json +31 -52
  581. package/src/components/Tooltip/Tooltip.module.scss +16 -10
  582. package/src/components/Tooltip/index.tsx +19 -24
  583. package/src/components/VisuallyHidden/VisuallyHidden.contract.json +22 -44
  584. package/src/components/VisuallyHidden/VisuallyHidden.module.scss +4 -14
  585. package/src/components/VisuallyHidden/index.tsx +5 -5
  586. package/src/index.ts +16 -12
  587. package/src/measurements/MeasurementTargets.module.scss +6 -7
  588. package/src/measurements/generated.ts +46 -97
  589. package/src/measurements/index.ts +0 -1
  590. package/src/measurements/measurements.json +44 -116
  591. package/src/recipes/_action.scss +4 -4
  592. package/src/recipes/_boolean-range.scss +12 -16
  593. package/src/recipes/_feedback.scss +17 -16
  594. package/src/recipes/_field.scss +28 -16
  595. package/src/recipes/_layout.scss +14 -7
  596. package/src/recipes/_navigation.scss +84 -29
  597. package/src/recipes/_overlay.scss +143 -43
  598. package/src/recipes/_popup.scss +54 -34
  599. package/src/recipes/_prose.scss +48 -28
  600. package/src/recipes/_representation.scss +10 -9
  601. package/src/recipes/_segmented.scss +1 -1
  602. package/src/recipes/_table-chrome.scss +42 -17
  603. package/src/recipes/_target.scss +2 -4
  604. package/src/recipes/_typography.scss +10 -0
  605. package/src/scss.d.ts +1 -1
  606. package/src/styles/globals.scss +31 -25
  607. package/src/tokens/_component-properties.scss +19 -1
  608. package/src/tokens/_computed.scss +32 -49
  609. package/src/tokens/_derive.scss +112 -210
  610. package/src/tokens/_measurements.catalog.generated.css +62 -44
  611. package/src/tokens/_measurements.generated.scss +119 -249
  612. package/src/tokens/_mixins.scss +49 -48
  613. package/src/tokens/_palettes.scss +39 -167
  614. package/src/tokens/_property-registrations.scss +9 -0
  615. package/src/tokens/_seeds.scss +20 -31
  616. package/src/tokens/_variables.scss +251 -94
  617. package/src/utils/a11y.tsx +69 -69
  618. package/src/utils/aria.ts +3 -3
  619. package/src/utils/canonical-stamp.ts +2 -12
  620. package/src/utils/css-warning.ts +7 -7
  621. package/src/utils/env.ts +25 -0
  622. package/src/utils/keyboard-shortcuts.ts +131 -126
  623. package/src/utils/seed-derivation.ts +11 -14
  624. package/src/utils/theme-presets.ts +5 -12
  625. package/dist/blocks/AccountSettings.block.d.ts +0 -3
  626. package/dist/blocks/AccountSettings.block.d.ts.map +0 -1
  627. package/dist/blocks/ActivityFeedSkeleton.block.d.ts +0 -3
  628. package/dist/blocks/ActivityFeedSkeleton.block.d.ts.map +0 -1
  629. package/dist/blocks/BlogEditor.block.d.ts +0 -3
  630. package/dist/blocks/BlogEditor.block.d.ts.map +0 -1
  631. package/dist/blocks/ChatInterface.block.d.ts +0 -3
  632. package/dist/blocks/ChatInterface.block.d.ts.map +0 -1
  633. package/dist/blocks/ChatMessages.block.d.ts +0 -3
  634. package/dist/blocks/ChatMessages.block.d.ts.map +0 -1
  635. package/dist/blocks/CheckoutForm.block.d.ts +0 -3
  636. package/dist/blocks/CheckoutForm.block.d.ts.map +0 -1
  637. package/dist/blocks/CommandPalette.block.d.ts +0 -3
  638. package/dist/blocks/CommandPalette.block.d.ts.map +0 -1
  639. package/dist/blocks/ContactForm.block.d.ts +0 -3
  640. package/dist/blocks/ContactForm.block.d.ts.map +0 -1
  641. package/dist/blocks/DashboardPage.block.d.ts +0 -3
  642. package/dist/blocks/DashboardPage.block.d.ts.map +0 -1
  643. package/dist/blocks/DashboardSkeleton.block.d.ts +0 -3
  644. package/dist/blocks/DashboardSkeleton.block.d.ts.map +0 -1
  645. package/dist/blocks/DataTable.block.d.ts +0 -3
  646. package/dist/blocks/DataTable.block.d.ts.map +0 -1
  647. package/dist/blocks/EmptyState.block.d.ts +0 -3
  648. package/dist/blocks/EmptyState.block.d.ts.map +0 -1
  649. package/dist/blocks/FAQSection.block.d.ts +0 -3
  650. package/dist/blocks/FAQSection.block.d.ts.map +0 -1
  651. package/dist/blocks/FeatureGrid.block.d.ts +0 -3
  652. package/dist/blocks/FeatureGrid.block.d.ts.map +0 -1
  653. package/dist/blocks/HeroSection.block.d.ts +0 -3
  654. package/dist/blocks/HeroSection.block.d.ts.map +0 -1
  655. package/dist/blocks/NavigationHeader.block.d.ts +0 -3
  656. package/dist/blocks/NavigationHeader.block.d.ts.map +0 -1
  657. package/dist/blocks/PaginatedTable.block.d.ts +0 -3
  658. package/dist/blocks/PaginatedTable.block.d.ts.map +0 -1
  659. package/dist/blocks/PricingComparison.block.d.ts +0 -3
  660. package/dist/blocks/PricingComparison.block.d.ts.map +0 -1
  661. package/dist/blocks/ProductCard.block.d.ts +0 -3
  662. package/dist/blocks/ProductCard.block.d.ts.map +0 -1
  663. package/dist/blocks/RegistrationForm.block.d.ts +0 -3
  664. package/dist/blocks/RegistrationForm.block.d.ts.map +0 -1
  665. package/dist/blocks/SettingsDrawer.block.d.ts +0 -3
  666. package/dist/blocks/SettingsDrawer.block.d.ts.map +0 -1
  667. package/dist/blocks/SettingsPanel.block.d.ts +0 -3
  668. package/dist/blocks/SettingsPanel.block.d.ts.map +0 -1
  669. package/dist/blocks/ShoppingCart.block.d.ts +0 -3
  670. package/dist/blocks/ShoppingCart.block.d.ts.map +0 -1
  671. package/dist/blocks/StatsCardSkeleton.block.d.ts +0 -3
  672. package/dist/blocks/StatsCardSkeleton.block.d.ts.map +0 -1
  673. package/dist/blocks/TableSkeleton.block.d.ts +0 -3
  674. package/dist/blocks/TableSkeleton.block.d.ts.map +0 -1
  675. package/dist/blocks/ThinkingStates.block.d.ts +0 -3
  676. package/dist/blocks/ThinkingStates.block.d.ts.map +0 -1
  677. package/dist/components/Toggle/index.d.ts +0 -3
  678. package/dist/components/Toggle/index.d.ts.map +0 -1
  679. package/src/components/Button/Button.contract.json +0 -218
  680. package/src/components/Card/Card.contract.json +0 -175
  681. package/src/components/DataTable/DataTable.contract.json +0 -302
  682. package/src/components/Dialog/Dialog.contract.json +0 -159
  683. package/src/components/Select/Select.contract.json +0 -259
  684. package/src/components/Toggle/index.ts +0 -7
  685. package/src/tokens/_density.scss +0 -85
@@ -1,15 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "ButtonGroup",
4
- "description": "Groups related buttons together with consistent spacing and alignment. Useful for action bars, toolbars, and related button sets.",
5
- "category": "forms",
6
- "tags": [
7
- "button",
8
- "group",
9
- "toolbar",
10
- "actions",
11
- "layout"
12
- ],
4
+ "description": "Lays out related buttons in a row with one shared gap and alignment.",
5
+ "category": "actions",
6
+ "tags": ["button", "group", "toolbar", "actions", "layout"],
13
7
  "status": "stable",
14
8
  "sourcePath": "src/components/ButtonGroup/index.tsx",
15
9
  "exportName": "ButtonGroup",
@@ -30,12 +24,7 @@
30
24
  "description": "Spacing between buttons",
31
25
  "default": "sm",
32
26
  "required": false,
33
- "values": [
34
- "none",
35
- "xs",
36
- "sm",
37
- "md"
38
- ]
27
+ "values": ["none", "xs", "sm", "md"]
39
28
  },
40
29
  "wrap": {
41
30
  "type": "boolean",
@@ -47,58 +36,58 @@
47
36
  "type": "enum",
48
37
  "description": "Alignment of buttons",
49
38
  "required": false,
50
- "values": [
51
- "start",
52
- "center",
53
- "end"
54
- ]
39
+ "values": ["start", "center", "end"]
55
40
  }
56
41
  },
57
42
  "usage": {
58
43
  "when": [
59
- "Grouping related actions together",
60
- "Creating toolbars or action bars",
61
- "Form submit/cancel button pairs",
44
+ "Confirm/cancel pairs at the end of a form",
45
+ "Toolbars and action bars",
62
46
  "Pagination controls"
63
47
  ],
64
48
  "whenNot": [
65
- "Unrelated buttons (use Stack instead)",
66
- "Navigation links (use nav element)",
67
- "Single button (no grouping needed)"
49
+ "Unrelated buttons use Stack",
50
+ "Navigation links use a nav element",
51
+ "A single button"
68
52
  ],
69
53
  "guidelines": [
70
- "Keep button groups focused on related actions",
71
- "Use consistent button variants within a group",
72
- "Consider visual hierarchy - primary action should stand out",
73
- "Limit to 2-4 buttons per group for clarity",
74
- "Pass role/aria-label/id/data-* directly to ButtonGroup when you need semantic grouping hooks"
54
+ "Two to four buttons; more belongs in a Menu",
55
+ "Confirming action goes last",
56
+ "One primary button per group",
57
+ "align=\"end\" for form footers",
58
+ "Pass role, aria-label, id and data-* straight through to ButtonGroup"
75
59
  ],
76
60
  "accessibility": [
77
- "Group provides semantic relationship between buttons",
78
- "Each button remains individually focusable",
79
- "Consider using role=\"group\" with aria-label for screen readers"
61
+ "Each button stays individually focusable",
62
+ "Add role=\"group\" plus aria-label when the set needs a name",
63
+ "Order buttons the way they read, not the way they look"
80
64
  ]
81
65
  },
82
66
  "examples": [
83
67
  {
84
68
  "name": "Default",
85
- "description": "Basic button group with default spacing",
86
- "code": "<ButtonGroup>\n <Button variant=\"secondary\">Cancel</Button>\n <Button variant=\"primary\">Save</Button>\n</ButtonGroup>"
69
+ "description": "Confirming action sits last in the row.",
70
+ "code": "<ButtonGroup>\n <Button variant=\"soft\">Cancel</Button>\n <Button variant=\"solid\">Save</Button>\n</ButtonGroup>"
87
71
  },
88
72
  {
89
- "name": "Gap Variants",
90
- "description": "Different spacing options",
91
- "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\n <ButtonGroup gap=\"none\">\n <Button variant=\"secondary\" size=\"sm\">None</Button>\n <Button variant=\"secondary\" size=\"sm\">Gap</Button>\n </ButtonGroup>\n <ButtonGroup gap=\"xs\">\n <Button variant=\"secondary\" size=\"sm\">XS</Button>\n <Button variant=\"secondary\" size=\"sm\">Gap</Button>\n </ButtonGroup>\n <ButtonGroup gap=\"sm\">\n <Button variant=\"secondary\" size=\"sm\">SM</Button>\n <Button variant=\"secondary\" size=\"sm\">Gap</Button>\n </ButtonGroup>\n <ButtonGroup gap=\"md\">\n <Button variant=\"secondary\" size=\"sm\">MD</Button>\n <Button variant=\"secondary\" size=\"sm\">Gap</Button>\n </ButtonGroup>\n</div>"
73
+ "name": "Spacing",
74
+ "description": "Four gap steps, from touching to airy.",
75
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"column\" gap=\"md\">\n <ButtonGroup gap=\"none\">\n <Button variant=\"soft\" size=\"sm\">None</Button>\n <Button variant=\"soft\" size=\"sm\">Gap</Button>\n </ButtonGroup>\n <ButtonGroup gap=\"xs\">\n <Button variant=\"soft\" size=\"sm\">XS</Button>\n <Button variant=\"soft\" size=\"sm\">Gap</Button>\n </ButtonGroup>\n <ButtonGroup gap=\"sm\">\n <Button variant=\"soft\" size=\"sm\">SM</Button>\n <Button variant=\"soft\" size=\"sm\">Gap</Button>\n </ButtonGroup>\n <ButtonGroup gap=\"md\">\n <Button variant=\"soft\" size=\"sm\">MD</Button>\n <Button variant=\"soft\" size=\"sm\">Gap</Button>\n </ButtonGroup>\n</Stack>"
92
76
  },
93
77
  {
94
78
  "name": "Alignment",
95
- "description": "Different alignment options",
96
- "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>\n <ButtonGroup align=\"start\">\n <Button variant=\"secondary\" size=\"sm\">Start</Button>\n <Button variant=\"secondary\" size=\"sm\">Aligned</Button>\n </ButtonGroup>\n <ButtonGroup align=\"center\">\n <Button variant=\"secondary\" size=\"sm\">Center</Button>\n <Button variant=\"secondary\" size=\"sm\">Aligned</Button>\n </ButtonGroup>\n <ButtonGroup align=\"end\">\n <Button variant=\"secondary\" size=\"sm\">End</Button>\n <Button variant=\"secondary\" size=\"sm\">Aligned</Button>\n </ButtonGroup>\n</div>"
79
+ "description": "Pins the row to the left, centre, or right of its container.",
80
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"column\" gap=\"md\">\n <ButtonGroup align=\"start\">\n <Button variant=\"soft\" size=\"sm\">Start</Button>\n <Button variant=\"soft\" size=\"sm\">Aligned</Button>\n </ButtonGroup>\n <ButtonGroup align=\"center\">\n <Button variant=\"soft\" size=\"sm\">Center</Button>\n <Button variant=\"soft\" size=\"sm\">Aligned</Button>\n </ButtonGroup>\n <ButtonGroup align=\"end\">\n <Button variant=\"soft\" size=\"sm\">End</Button>\n <Button variant=\"soft\" size=\"sm\">Aligned</Button>\n </ButtonGroup>\n</Stack>"
81
+ },
82
+ {
83
+ "name": "Wrapping",
84
+ "description": "Buttons drop to a second line instead of overflowing.",
85
+ "code": "<ButtonGroup wrap>\n <Button variant=\"soft\" size=\"sm\">Approve</Button>\n <Button variant=\"soft\" size=\"sm\">Request changes</Button>\n <Button variant=\"soft\" size=\"sm\">Reassign reviewer</Button>\n <Button variant=\"soft\" size=\"sm\">Move to backlog</Button>\n <Button variant=\"soft\" size=\"sm\">Archive</Button>\n</ButtonGroup>"
97
86
  },
98
87
  {
99
88
  "name": "Form Actions",
100
- "description": "Common pattern for form submit/cancel",
101
- "code": "<ButtonGroup align=\"end\" role=\"group\" aria-label=\"Form actions\">\n <Button variant=\"ghost\">Cancel</Button>\n <Button variant=\"primary\">Submit</Button>\n</ButtonGroup>"
89
+ "description": "Right-aligned pair, named for screen readers.",
90
+ "code": "<ButtonGroup align=\"end\" role=\"group\" aria-label=\"Form actions\">\n <Button variant=\"ghost\">Cancel</Button>\n <Button variant=\"solid\">Submit</Button>\n</ButtonGroup>"
102
91
  }
103
92
  ],
104
93
  "relations": [
@@ -121,15 +110,11 @@
121
110
  "align: start|center|end - alignment",
122
111
  "Pass-through DOM props supported on root (id, role, aria-*, data-*, handlers)"
123
112
  ],
124
- "a11yRules": [
125
- "A11Y_GROUP_LABEL"
126
- ]
113
+ "a11yRules": ["A11Y_GROUP_LABEL"]
127
114
  },
128
115
  "ai": {
129
116
  "compositionPattern": "compound",
130
- "subComponents": [
131
- "Root"
132
- ]
117
+ "subComponents": ["Root"]
133
118
  },
134
119
  "provenance": {
135
120
  "source": "migrated",
@@ -1,3 +1,5 @@
1
+ @use "../../tokens/variables" as *;
2
+ @use "../../tokens/measurements.generated" as measurements;
1
3
  @use "../../recipes/layout";
2
4
 
3
5
  .group {
@@ -7,21 +9,21 @@
7
9
 
8
10
  // Gap sizes
9
11
  .gapNone {
10
- gap: 0;
12
+ gap: var(--fui-raw-space-0, #{measurements.raw-space(0)});
11
13
 
12
14
  > * {
13
15
  position: relative;
14
16
  }
15
17
 
16
18
  > *:not(:first-child) {
17
- margin-inline-start: calc(-1 * var(--fui-stroke-hairline, 1px));
18
- border-top-left-radius: 0;
19
- border-bottom-left-radius: 0;
19
+ margin-inline-start: calc(-1 * var(--fui-stroke-hairline, #{$fui-stroke-hairline}));
20
+ border-start-start-radius: var(--fui-radius-none, #{$fui-radius-none});
21
+ border-end-start-radius: var(--fui-radius-none, #{$fui-radius-none});
20
22
  }
21
23
 
22
24
  > *:not(:last-child) {
23
- border-top-right-radius: 0;
24
- border-bottom-right-radius: 0;
25
+ border-start-end-radius: var(--fui-radius-none, #{$fui-radius-none});
26
+ border-end-end-radius: var(--fui-radius-none, #{$fui-radius-none});
25
27
  }
26
28
 
27
29
  > *:hover,
@@ -1,8 +1,11 @@
1
+ @use "../../tokens/variables" as *;
2
+ @use "../../tokens/measurements.generated" as measurements;
3
+
1
4
  // Deliberately unlayered: this proves ordinary consumer CSS can customize a
2
5
  // layered Card without specificity escalation or priority hacks.
3
6
  .consumerOverride {
4
7
  --fui-card-consumer-fixture: 1;
5
8
 
6
- padding: 29px;
7
- background-color: rgb(9 87 73);
9
+ padding: var(--fui-raw-space-32, #{measurements.raw-space(32)});
10
+ background-color: var(--fui-color-success-bg, #{$fui-color-success-bg});
8
11
  }
@@ -1,17 +1,52 @@
1
1
  @use "../../tokens/variables" as *;
2
2
  @use "../../tokens/mixins" as *;
3
+ @use "../../tokens/measurements.generated" as measurements;
4
+ @use "../../recipes/action" as action;
3
5
  @use "../../recipes/surface" as surface;
4
6
  @use "../../recipes/typography" as typography;
5
7
 
8
+ // The private inset channels are element-scoped signals between a card's own
9
+ // classes, but custom properties inherit by default — a Card nested inside
10
+ // another Card (docs previews, dashboard panels) would receive the outer
11
+ // card's requested inset and lose its padding. Register them as
12
+ // non-inheriting so each card resolves only its own channels.
13
+ @property --_card-root-requested-inset {
14
+ syntax: "*";
15
+ inherits: false;
16
+ }
17
+
18
+ @property --_card-body-inset {
19
+ syntax: "*";
20
+ inherits: false;
21
+ }
22
+
23
+ // The earned-moment capsule: a tone-tinted hairline, a radial wash from the
24
+ // top-right corner and the softer capsule radius. Any variant can wear it; the
25
+ // tone decides the colour. Reserve it for the few surfaces that earn emphasis
26
+ // (demo banner, upgrade panel, onboarding resume), never for routine content.
27
+ @mixin _capsule($line, $wash) {
28
+ position: relative;
29
+ overflow: hidden;
30
+ border-color: $line;
31
+ border-radius: var(--fui-card-accent-radius, #{$fui-card-accent-radius});
32
+ box-shadow: none;
33
+
34
+ &::before {
35
+ content: "";
36
+ position: absolute;
37
+ inset: 0;
38
+ pointer-events: none;
39
+ background: radial-gradient(90% 70% at 100% -10%, $wash, transparent 62%);
40
+ }
41
+ }
42
+
6
43
  @layer fui.components {
7
44
  .card {
8
45
  @include surface-elevated;
9
46
  @include typography.role("body-compact");
47
+ @include high-contrast-outline;
10
48
 
11
- padding: var(
12
- --_card-root-forced-inset,
13
- var(--_card-root-requested-inset, #{surface.inset("default")})
14
- );
49
+ padding: var(--_card-root-requested-inset, #{surface.inset("default")});
15
50
  color: var(--fui-text-primary, $fui-text-primary);
16
51
  background-color: var(--fui-card-bg, var(--fui-bg-elevated, #{$fui-bg-elevated}));
17
52
  border-color: var(--fui-card-border, var(--fui-border, #{$fui-border}));
@@ -22,34 +57,24 @@
22
57
  border-color var(--fui-transition-fast, $fui-transition-fast),
23
58
  background-color var(--fui-transition-fast, $fui-transition-fast),
24
59
  transform var(--fui-transition-fast, $fui-transition-fast);
25
- }
26
60
 
27
- // Variants
28
- .default {
29
- background-color: var(--fui-card-bg, var(--fui-bg-elevated, #{$fui-bg-elevated}));
30
- border-color: var(--fui-card-border, var(--fui-border, #{$fui-border}));
31
- box-shadow: var(--fui-card-shadow, none);
32
- }
33
-
34
- .outlined {
35
- background-color: transparent;
36
- border-color: var(
37
- --fui-card-outlined-border,
38
- var(--fui-card-border, var(--fui-border-strong, #{$fui-border-strong}))
39
- );
40
- box-shadow: none;
61
+ // A divided header paints full-bleed chrome; clip it to the card radius.
62
+ &:has(> .headerDivided) {
63
+ overflow: hidden;
64
+ }
41
65
  }
42
66
 
43
- .elevated {
67
+ // Variants — the surface only. Colour is the tone's job.
68
+ .solid {
44
69
  background-color: var(--fui-card-bg, var(--fui-bg-elevated, #{$fui-bg-elevated}));
45
70
  border-color: var(--fui-card-border, var(--fui-border, #{$fui-border}));
46
- box-shadow: var(--fui-card-elevated-shadow, var(--fui-card-shadow, none));
71
+ box-shadow: var(--fui-card-shadow, none);
47
72
  }
48
73
 
49
- // Compact metric tile for dashboard grids. It uses the same card radius and
50
- // hairline model as panels, with a quieter fill so adjacent metric tiles read
51
- // as one dashboard system rather than separate hero cards.
52
- .stat {
74
+ // Quiet tint fill: metric tiles and dashboard panels read as one system
75
+ // rather than separate hero cards. Panels add `padding="none"` and let
76
+ // `Card.Header divided` + `Card.Body padding` own their inset.
77
+ .soft {
53
78
  background-color: var(
54
79
  --fui-card-stat-bg,
55
80
  var(
@@ -64,28 +89,36 @@
64
89
  box-shadow: var(--fui-card-stat-shadow, var(--fui-card-shadow, none));
65
90
  }
66
91
 
67
- // Hairline-bordered panel with no root inset — designed for compound use
68
- // with `Card.Header divided` + `Card.Body` inside dashboards. Each region
69
- // owns its spacing so panel headers can be full-bleed with a hairline
70
- // divider underneath. Uses the same surface-agnostic overlay as `.stat`.
71
- // The private forced-inset channel makes this deterministic regardless of the
72
- // `padding` prop or DOM class order.
73
- .panel {
74
- --_card-root-forced-inset: #{surface.inset("panel")};
92
+ .outline {
93
+ background-color: transparent;
94
+ border-color: var(
95
+ --fui-card-outlined-border,
96
+ var(--fui-card-border, var(--fui-border-strong, #{$fui-border-strong}))
97
+ );
98
+ box-shadow: none;
99
+ }
100
+
101
+ // Tones — chroma is earned by state: accent = the moment, danger = a merge
102
+ // is held, warning = enforcement lapsed. Neutral is the absence of a class.
103
+ .toneAccent {
104
+ @include _capsule(
105
+ var(--fui-card-accent-border, #{$fui-card-accent-border}),
106
+ color-mix(in srgb, var(--fui-color-accent, #{$fui-color-accent}) 13%, transparent)
107
+ );
108
+ }
75
109
 
76
- background-color: var(
77
- --fui-panel-bg,
78
- var(
79
- --fui-card-bg,
80
- color-mix(in srgb, var(--fui-text-primary, #{$fui-text-primary}) 2%, transparent)
81
- )
110
+ .toneDanger {
111
+ @include _capsule(
112
+ var(--fui-color-danger-border, #{$fui-color-danger-border}),
113
+ var(--fui-color-danger-bg, #{$fui-color-danger-bg})
82
114
  );
83
- border-color: var(
84
- --fui-panel-border,
85
- var(--fui-card-border, var(--fui-border, #{$fui-border}))
115
+ }
116
+
117
+ .toneWarning {
118
+ @include _capsule(
119
+ var(--fui-color-warning-border, #{$fui-color-warning-border}),
120
+ var(--fui-color-warning-bg, #{$fui-color-warning-bg})
86
121
  );
87
- box-shadow: var(--fui-card-panel-shadow, var(--fui-card-shadow, none));
88
- overflow: hidden;
89
122
  }
90
123
 
91
124
  // Padding
@@ -131,31 +164,35 @@
131
164
  background-color: var(--fui-card-active-bg, var(--fui-bg-active, $fui-bg-active));
132
165
  box-shadow: var(
133
166
  --fui-card-active-shadow,
134
- inset 0 1px 2px color-mix(in srgb, black 12%, transparent)
167
+ inset 0 var(--fui-stroke-hairline, #{$fui-stroke-hairline})
168
+ var(--fui-raw-space-2, #{measurements.raw-space(2)})
169
+ color-mix(in srgb, var(--fui-text-primary, #{$fui-text-primary}) 12%, transparent)
135
170
  );
136
171
  }
137
172
  }
138
173
 
139
174
  .header {
140
175
  display: grid;
141
- gap: var(--fui-raw-space-4, 4px);
142
- margin-bottom: var(--fui-raw-space-16, 16px);
176
+ gap: var(--fui-raw-space-4, #{measurements.raw-space(4)});
177
+ margin-bottom: var(--fui-raw-space-16, #{measurements.raw-space(16)});
143
178
  }
144
179
 
145
180
  // Full-bleed panel-header region on the control-md track, canonical inset,
146
181
  // and a hairline bottom divider. No trailing margin — it sits flush above the
147
- // panel body, which manages its own padding. Use inside `variant="panel"`.
182
+ // panel body, which manages its own padding. Use with `padding="none"`.
148
183
  // Title cluster (left) and trailing controls (right) pin to opposite edges —
149
184
  // wrap Title + Description in a stack so space-between has two children.
150
185
  .headerDivided {
151
186
  display: flex;
152
187
  align-items: center;
153
188
  justify-content: space-between;
154
- gap: var(--fui-raw-space-12, 12px);
155
- min-height: var(--fui-control-track-md, 32px);
189
+ gap: var(--fui-raw-space-12, #{measurements.raw-space(12)});
190
+ min-height: #{action.track("md")};
156
191
  padding: #{surface.inset("compact")};
157
- margin-bottom: 0;
158
- border-bottom: var(--fui-stroke-hairline, 1px) solid var(--fui-border, $fui-border);
192
+ margin-bottom: var(--fui-raw-space-0, #{measurements.raw-space(0)});
193
+ background-color: var(--fui-card-header-bg, var(--fui-bg-subtle, #{$fui-bg-subtle}));
194
+ border-bottom: var(--fui-stroke-hairline, #{$fui-stroke-hairline}) solid
195
+ var(--fui-border, $fui-border);
159
196
 
160
197
  // Multi-line copy: top-align trailing controls with the title line.
161
198
  &:has(.description) {
@@ -166,21 +203,21 @@
166
203
  .title {
167
204
  @include typography.role("title-sm");
168
205
 
169
- margin: 0;
206
+ margin: var(--fui-raw-space-0, #{measurements.raw-space(0)});
170
207
  color: var(--fui-text-primary, $fui-text-primary);
171
208
  }
172
209
 
173
210
  .description {
174
211
  @include typography.role("body-compact");
175
212
 
176
- margin: 0;
213
+ margin: var(--fui-raw-space-0, #{measurements.raw-space(0)});
177
214
  color: var(--fui-text-secondary, $fui-text-secondary);
178
215
  }
179
216
 
180
217
  .body {
181
218
  @include typography.role("body-compact");
182
219
 
183
- padding: var(--_card-body-inset, 0);
220
+ padding: var(--_card-body-inset, var(--fui-raw-space-0, #{measurements.raw-space(0)}));
184
221
  color: var(--fui-text-primary, $fui-text-primary);
185
222
  }
186
223
 
@@ -203,10 +240,11 @@
203
240
  .footer {
204
241
  display: flex;
205
242
  align-items: center;
206
- gap: var(--fui-raw-space-8, 8px);
207
- margin-top: var(--fui-raw-space-16, 16px);
208
- padding-top: var(--fui-raw-space-16, 16px);
209
- border-top: var(--fui-stroke-hairline, 1px) solid var(--fui-border, $fui-border);
243
+ gap: var(--fui-raw-space-8, #{measurements.raw-space(8)});
244
+ margin-top: var(--fui-raw-space-16, #{measurements.raw-space(16)});
245
+ padding-top: var(--fui-raw-space-16, #{measurements.raw-space(16)});
246
+ border-top: var(--fui-stroke-hairline, #{$fui-stroke-hairline}) solid
247
+ var(--fui-border, $fui-border);
210
248
  }
211
249
 
212
250
  // ============================================
@@ -228,21 +266,4 @@
228
266
  }
229
267
  }
230
268
  }
231
-
232
- // ============================================
233
- // Accessibility: High Contrast Mode
234
- // ============================================
235
-
236
- @media (prefers-contrast: more) {
237
- .card {
238
- border-color: var(--fui-text-primary, $fui-text-primary);
239
- outline: var(--fui-stroke-hairline, 1px) solid var(--fui-text-primary, $fui-text-primary);
240
- outline-offset: calc(-1 * var(--fui-stroke-default, 2px));
241
- }
242
-
243
- .footer {
244
- box-shadow: inset 0 var(--fui-stroke-hairline, 1px) 0
245
- var(--fui-text-primary, $fui-text-primary);
246
- }
247
- }
248
269
  }
@@ -7,26 +7,35 @@ import styles from "./Card.module.scss";
7
7
  // Types
8
8
  // ============================================
9
9
 
10
+ export type CardVariant = "solid" | "soft" | "outline";
11
+ export type CardTone = "neutral" | "accent" | "warning" | "danger";
12
+ export type CardPadding = "none" | "sm" | "md" | "lg";
13
+
10
14
  /**
11
15
  * Card container for grouping related content.
12
16
  * @see https://usefragments.com/components/card
13
17
  */
14
18
  export interface CardProps extends Omit<React.HTMLAttributes<HTMLElement>, "children"> {
15
19
  children: React.ReactNode;
16
- /** Visual style variant. `"outline"` is an alias for `"outlined"`.
20
+ /** Surface chrome.
17
21
  *
18
- * - `default` / `outlined` / `elevated`: general-purpose cards.
19
- * - `stat`: compact metric tile for dashboard grids hairline border,
20
- * panel-subtle surface, tight radius, zero shadow.
21
- * - `panel`: hairline-bordered panel with zero own padding, designed for
22
- * compound use with `Card.Header divided` + `Card.Body` so each region
23
- * manages its own spacing.
24
- * @default "default"
22
+ * - `solid`: the filled, elevated surface for general-purpose cards.
23
+ * - `soft`: quiet tint fill for metric tiles and dashboard panels. Add
24
+ * `padding="none"` and let `Card.Header divided` + `Card.Body padding`
25
+ * own their inset for a panel.
26
+ * - `outline`: transparent with a hairline border, for dense layouts.
27
+ * @default "solid"
25
28
  * @see https://usefragments.com/components/card#variants */
26
- variant?: "default" | "outlined" | "outline" | "elevated" | "stat" | "panel";
29
+ variant?: CardVariant;
30
+ /** Earned-moment capsule. Any tone other than `neutral` paints a
31
+ * tone-tinted hairline, a radial wash and the capsule radius on top of the
32
+ * variant: `accent` (the moment), `danger` (a merge is held), `warning`
33
+ * (enforcement lapsed). Reserve it for the few surfaces that earn emphasis.
34
+ * @default "neutral" */
35
+ tone?: CardTone;
27
36
  /** Inner padding.
28
37
  * @default "md" */
29
- padding?: "none" | "sm" | "md" | "lg";
38
+ padding?: CardPadding;
30
39
  /** Root element tag.
31
40
  * @default "article" */
32
41
  as?: "article" | "div" | "section";
@@ -36,7 +45,7 @@ export interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {
36
45
  children: React.ReactNode;
37
46
  /** Renders the header as a divided region with a minimum height, canonical
38
47
  * inset, hairline bottom border, and no trailing margin. Used with
39
- * `variant="panel"` for dashboard-style panel headers. */
48
+ * `padding="none"` for dashboard-style panel headers. */
40
49
  divided?: boolean;
41
50
  }
42
51
 
@@ -53,9 +62,9 @@ export interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraph
53
62
 
54
63
  export interface CardBodyProps extends React.HTMLAttributes<HTMLDivElement> {
55
64
  children: React.ReactNode;
56
- /** Inner padding for body-only spacing, useful with `variant="panel"`.
57
- * Omit when the card root already owns padding. */
58
- padding?: "none" | "sm" | "md" | "lg";
65
+ /** Inner padding for body-only spacing, useful with `padding="none"` on the
66
+ * root. Omit when the card root already owns padding. */
67
+ padding?: CardPadding;
59
68
  }
60
69
 
61
70
  export interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {
@@ -67,8 +76,9 @@ export interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {
67
76
  // ============================================
68
77
 
69
78
  interface CardContextValue {
70
- variant: "default" | "outlined" | "elevated" | "stat" | "panel";
71
- padding: "none" | "sm" | "md" | "lg";
79
+ variant: CardVariant;
80
+ tone: CardTone;
81
+ padding: CardPadding;
72
82
  isInteractive: boolean;
73
83
  }
74
84
 
@@ -100,17 +110,29 @@ function composeEventHandlers<E extends { defaultPrevented: boolean }>(
100
110
  // Components
101
111
  // ============================================
102
112
 
113
+ const variantMap: Record<CardVariant, string> = {
114
+ solid: styles.solid,
115
+ soft: styles.soft,
116
+ outline: styles.outline,
117
+ };
118
+
119
+ const toneMap: Record<CardTone, string | undefined> = {
120
+ neutral: undefined,
121
+ accent: styles.toneAccent,
122
+ danger: styles.toneDanger,
123
+ warning: styles.toneWarning,
124
+ };
125
+
103
126
  function CardRoot({
104
127
  children,
105
- variant: variantProp = "default",
128
+ variant = "solid",
129
+ tone = "neutral",
106
130
  padding = "md",
107
131
  as: Component = "article",
108
132
  className,
109
133
  style,
110
134
  ...htmlProps
111
135
  }: CardProps) {
112
- // Resolve alias: "outline" → "outlined"
113
- const variant = variantProp === "outline" ? "outlined" : variantProp;
114
136
  const { onKeyDown, onKeyUp, role, tabIndex, ...elementProps } = htmlProps;
115
137
 
116
138
  const isInteractive = typeof elementProps.onClick === "function";
@@ -119,7 +141,8 @@ function CardRoot({
119
141
 
120
142
  const classes = [
121
143
  styles.card,
122
- styles[variant],
144
+ variantMap[variant],
145
+ toneMap[tone],
123
146
  paddingMap[padding],
124
147
  isInteractive && styles.interactive,
125
148
  className,
@@ -129,6 +152,7 @@ function CardRoot({
129
152
 
130
153
  const contextValue: CardContextValue = {
131
154
  variant,
155
+ tone,
132
156
  padding,
133
157
  isInteractive,
134
158
  };