@usefragments/ui 1.6.0 → 1.7.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 (457) hide show
  1. package/README.md +4 -4
  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/ui.css +4720 -4159
  6. package/dist/chart.cjs +24 -6
  7. package/dist/chart.js +24 -6
  8. package/dist/codeblock.cjs +55 -29
  9. package/dist/codeblock.js +55 -29
  10. package/dist/colorpicker.cjs +3 -1
  11. package/dist/colorpicker.js +3 -1
  12. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  13. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  14. package/dist/components/Alert/Alert.module.scss.cjs +15 -12
  15. package/dist/components/Alert/Alert.module.scss.js +15 -12
  16. package/dist/components/Alert/index.cjs +7 -1
  17. package/dist/components/Alert/index.d.ts +12 -6
  18. package/dist/components/Alert/index.d.ts.map +1 -1
  19. package/dist/components/Alert/index.js +7 -1
  20. package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
  21. package/dist/components/AppShell/AppShell.module.scss.js +14 -14
  22. package/dist/components/Avatar/Avatar.module.scss.cjs +14 -14
  23. package/dist/components/Avatar/Avatar.module.scss.js +14 -14
  24. package/dist/components/Badge/Badge.module.scss.cjs +19 -19
  25. package/dist/components/Badge/Badge.module.scss.js +19 -19
  26. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +14 -14
  27. package/dist/components/BentoGrid/BentoGrid.module.scss.js +14 -14
  28. package/dist/components/Box/Box.module.scss.cjs +152 -152
  29. package/dist/components/Box/Box.module.scss.js +152 -152
  30. package/dist/components/Box/index.cjs +64 -75
  31. package/dist/components/Box/index.d.ts +16 -16
  32. package/dist/components/Box/index.d.ts.map +1 -1
  33. package/dist/components/Box/index.js +64 -75
  34. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +8 -8
  35. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +8 -8
  36. package/dist/components/Button/Button.module.scss.cjs +14 -14
  37. package/dist/components/Button/Button.module.scss.js +14 -14
  38. package/dist/components/Card/Card.module.scss.cjs +29 -17
  39. package/dist/components/Card/Card.module.scss.js +30 -18
  40. package/dist/components/Card/index.cjs +8 -0
  41. package/dist/components/Card/index.d.ts +12 -2
  42. package/dist/components/Card/index.d.ts.map +1 -1
  43. package/dist/components/Card/index.js +8 -0
  44. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  45. package/dist/components/Chart/Chart.module.scss.js +15 -15
  46. package/dist/components/Chart/index.d.ts.map +1 -1
  47. package/dist/components/Checkbox/Checkbox.module.scss.cjs +9 -9
  48. package/dist/components/Checkbox/Checkbox.module.scss.js +9 -9
  49. package/dist/components/Checkbox/index.cjs +2 -2
  50. package/dist/components/Checkbox/index.d.ts.map +1 -1
  51. package/dist/components/Checkbox/index.js +2 -2
  52. package/dist/components/Chip/Chip.module.scss.cjs +15 -15
  53. package/dist/components/Chip/Chip.module.scss.js +15 -15
  54. package/dist/components/Chip/index.cjs +2 -1
  55. package/dist/components/Chip/index.d.ts.map +1 -1
  56. package/dist/components/Chip/index.js +2 -1
  57. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +26 -23
  58. package/dist/components/CodeBlock/CodeBlock.module.scss.js +26 -23
  59. package/dist/components/CodeBlock/css-variables-theme.cjs +98 -0
  60. package/dist/components/CodeBlock/css-variables-theme.d.ts +27 -0
  61. package/dist/components/CodeBlock/css-variables-theme.d.ts.map +1 -0
  62. package/dist/components/CodeBlock/css-variables-theme.js +98 -0
  63. package/dist/components/CodeBlock/index.d.ts +17 -3
  64. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  65. package/dist/components/Collapsible/Collapsible.module.scss.cjs +9 -9
  66. package/dist/components/Collapsible/Collapsible.module.scss.js +9 -9
  67. package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +14 -14
  68. package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
  69. package/dist/components/ColorPicker/index.d.ts.map +1 -1
  70. package/dist/components/Combobox/Combobox.module.scss.cjs +21 -21
  71. package/dist/components/Combobox/Combobox.module.scss.js +21 -21
  72. package/dist/components/Combobox/index.cjs +17 -1
  73. package/dist/components/Combobox/index.d.ts.map +1 -1
  74. package/dist/components/Combobox/index.js +17 -1
  75. package/dist/components/Command/Command.module.scss.cjs +11 -11
  76. package/dist/components/Command/Command.module.scss.js +11 -11
  77. package/dist/components/Command/index.cjs +26 -15
  78. package/dist/components/Command/index.d.ts +2 -2
  79. package/dist/components/Command/index.d.ts.map +1 -1
  80. package/dist/components/Command/index.js +26 -15
  81. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  82. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  83. package/dist/components/DataTable/DataTable.icons.cjs +6 -33
  84. package/dist/components/DataTable/DataTable.icons.d.ts.map +1 -1
  85. package/dist/components/DataTable/DataTable.icons.js +6 -33
  86. package/dist/components/DataTable/DataTable.module.scss.cjs +27 -27
  87. package/dist/components/DataTable/DataTable.module.scss.js +27 -27
  88. package/dist/components/DataTable/index.d.ts.map +1 -1
  89. package/dist/components/DatePicker/DatePicker.module.scss.cjs +33 -33
  90. package/dist/components/DatePicker/DatePicker.module.scss.js +33 -33
  91. package/dist/components/DatePicker/index.d.ts.map +1 -1
  92. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  93. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  94. package/dist/components/Dialog/index.cjs +11 -14
  95. package/dist/components/Dialog/index.d.ts +7 -7
  96. package/dist/components/Dialog/index.d.ts.map +1 -1
  97. package/dist/components/Dialog/index.js +11 -14
  98. package/dist/components/Drawer/Drawer.module.scss.cjs +29 -29
  99. package/dist/components/Drawer/Drawer.module.scss.js +29 -29
  100. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  101. package/dist/components/Editor/Editor.module.scss.js +17 -17
  102. package/dist/components/Editor/index.d.ts +10 -10
  103. package/dist/components/Editor/index.d.ts.map +1 -1
  104. package/dist/components/EmptyState/EmptyState.module.scss.cjs +11 -8
  105. package/dist/components/EmptyState/EmptyState.module.scss.js +11 -8
  106. package/dist/components/EmptyState/index.cjs +8 -6
  107. package/dist/components/EmptyState/index.d.ts +9 -4
  108. package/dist/components/EmptyState/index.d.ts.map +1 -1
  109. package/dist/components/EmptyState/index.js +8 -6
  110. package/dist/components/Field/Field.module.scss.cjs +5 -5
  111. package/dist/components/Field/Field.module.scss.js +5 -5
  112. package/dist/components/Field/index.cjs +9 -1
  113. package/dist/components/Field/index.d.ts.map +1 -1
  114. package/dist/components/Field/index.js +9 -1
  115. package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
  116. package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
  117. package/dist/components/Grid/index.cjs +1 -1
  118. package/dist/components/Grid/index.js +1 -1
  119. package/dist/components/Header/Header.module.scss.cjs +33 -33
  120. package/dist/components/Header/Header.module.scss.js +33 -33
  121. package/dist/components/Header/index.cjs +17 -38
  122. package/dist/components/Header/index.d.ts +15 -11
  123. package/dist/components/Header/index.d.ts.map +1 -1
  124. package/dist/components/Header/index.js +17 -38
  125. package/dist/components/Icon/Icon.module.scss.cjs +15 -15
  126. package/dist/components/Icon/Icon.module.scss.js +15 -15
  127. package/dist/components/IconButton/IconButton.module.scss.cjs +8 -8
  128. package/dist/components/IconButton/IconButton.module.scss.js +8 -8
  129. package/dist/components/IconButton/index.cjs +2 -1
  130. package/dist/components/IconButton/index.d.ts.map +1 -1
  131. package/dist/components/IconButton/index.js +2 -1
  132. package/dist/components/Image/Image.module.scss.cjs +27 -27
  133. package/dist/components/Image/Image.module.scss.js +27 -27
  134. package/dist/components/Input/Input.module.scss.cjs +17 -17
  135. package/dist/components/Input/Input.module.scss.js +17 -17
  136. package/dist/components/Link/Link.module.scss.cjs +14 -10
  137. package/dist/components/Link/Link.module.scss.js +14 -10
  138. package/dist/components/Link/index.d.ts +1 -1
  139. package/dist/components/Link/index.d.ts.map +1 -1
  140. package/dist/components/List/List.module.scss.cjs +19 -19
  141. package/dist/components/List/List.module.scss.js +19 -19
  142. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  143. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  144. package/dist/components/Loading/Loading.module.scss.cjs +34 -34
  145. package/dist/components/Loading/Loading.module.scss.js +34 -34
  146. package/dist/components/Loading/index.cjs +1 -1
  147. package/dist/components/Loading/index.js +1 -1
  148. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  149. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  150. package/dist/components/Markdown/index.d.ts +2 -2
  151. package/dist/components/Markdown/index.d.ts.map +1 -1
  152. package/dist/components/Menu/Menu.module.scss.cjs +14 -14
  153. package/dist/components/Menu/Menu.module.scss.js +14 -14
  154. package/dist/components/Message/Message.module.scss.cjs +18 -18
  155. package/dist/components/Message/Message.module.scss.js +18 -18
  156. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +34 -31
  157. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +34 -31
  158. package/dist/components/NavigationMenu/index.cjs +32 -15
  159. package/dist/components/NavigationMenu/index.d.ts +12 -6
  160. package/dist/components/NavigationMenu/index.d.ts.map +1 -1
  161. package/dist/components/NavigationMenu/index.js +32 -15
  162. package/dist/components/Pagination/Pagination.module.scss.cjs +10 -10
  163. package/dist/components/Pagination/Pagination.module.scss.js +10 -10
  164. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  165. package/dist/components/Popover/Popover.module.scss.js +10 -10
  166. package/dist/components/Progress/Progress.module.scss.cjs +25 -25
  167. package/dist/components/Progress/Progress.module.scss.js +25 -25
  168. package/dist/components/Prompt/Prompt.module.scss.cjs +28 -28
  169. package/dist/components/Prompt/Prompt.module.scss.js +28 -28
  170. package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +15 -15
  171. package/dist/components/RadioGroup/RadioGroup.module.scss.js +15 -15
  172. package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +5 -5
  173. package/dist/components/ScrollArea/ScrollArea.module.scss.js +5 -5
  174. package/dist/components/ScrollArea/index.d.ts +4 -4
  175. package/dist/components/ScrollArea/index.d.ts.map +1 -1
  176. package/dist/components/ScrollArea/scroll-state.d.ts +5 -5
  177. package/dist/components/Select/Select.module.scss.cjs +21 -21
  178. package/dist/components/Select/Select.module.scss.js +21 -21
  179. package/dist/components/Separator/Separator.module.scss.cjs +11 -11
  180. package/dist/components/Separator/Separator.module.scss.js +11 -11
  181. package/dist/components/Sidebar/Sidebar.module.scss.cjs +43 -43
  182. package/dist/components/Sidebar/Sidebar.module.scss.js +43 -43
  183. package/dist/components/Sidebar/index.cjs +12 -35
  184. package/dist/components/Sidebar/index.d.ts +19 -19
  185. package/dist/components/Sidebar/index.d.ts.map +1 -1
  186. package/dist/components/Sidebar/index.js +12 -35
  187. package/dist/components/Skeleton/Skeleton.module.scss.cjs +50 -46
  188. package/dist/components/Skeleton/Skeleton.module.scss.js +50 -46
  189. package/dist/components/Slider/Slider.module.scss.cjs +12 -12
  190. package/dist/components/Slider/Slider.module.scss.js +12 -12
  191. package/dist/components/Stack/Stack.module.scss.cjs +25 -25
  192. package/dist/components/Stack/Stack.module.scss.js +25 -25
  193. package/dist/components/Stack/index.cjs +1 -1
  194. package/dist/components/Stack/index.js +1 -1
  195. package/dist/components/Switch/Switch.module.scss.cjs +9 -9
  196. package/dist/components/Switch/Switch.module.scss.js +9 -9
  197. package/dist/components/Table/Table.module.scss.cjs +19 -19
  198. package/dist/components/Table/Table.module.scss.js +19 -19
  199. package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +15 -15
  200. package/dist/components/TableOfContents/TableOfContents.module.scss.js +15 -15
  201. package/dist/components/TableOfContents/index.cjs +13 -9
  202. package/dist/components/TableOfContents/index.d.ts +5 -3
  203. package/dist/components/TableOfContents/index.d.ts.map +1 -1
  204. package/dist/components/TableOfContents/index.js +13 -9
  205. package/dist/components/Tabs/Tabs.module.scss.cjs +12 -12
  206. package/dist/components/Tabs/Tabs.module.scss.js +12 -12
  207. package/dist/components/Tabs/index.cjs +26 -6
  208. package/dist/components/Tabs/index.d.ts.map +1 -1
  209. package/dist/components/Tabs/index.js +26 -6
  210. package/dist/components/Text/Text.module.scss.cjs +87 -75
  211. package/dist/components/Text/Text.module.scss.js +87 -75
  212. package/dist/components/Text/index.cjs +49 -41
  213. package/dist/components/Text/index.d.ts +12 -11
  214. package/dist/components/Text/index.d.ts.map +1 -1
  215. package/dist/components/Text/index.js +49 -41
  216. package/dist/components/Textarea/Textarea.module.scss.cjs +24 -24
  217. package/dist/components/Textarea/Textarea.module.scss.js +24 -24
  218. package/dist/components/Theme/index.cjs +2 -1
  219. package/dist/components/Theme/index.d.ts.map +1 -1
  220. package/dist/components/Theme/index.js +2 -1
  221. package/dist/components/ThemeToggle/ThemeToggle.module.scss.cjs +9 -6
  222. package/dist/components/ThemeToggle/ThemeToggle.module.scss.js +9 -6
  223. package/dist/components/ThemeToggle/index.cjs +31 -6
  224. package/dist/components/ThemeToggle/index.d.ts +7 -2
  225. package/dist/components/ThemeToggle/index.d.ts.map +1 -1
  226. package/dist/components/ThemeToggle/index.js +32 -7
  227. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +13 -13
  228. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +13 -13
  229. package/dist/components/Toast/Toast.module.scss.cjs +20 -20
  230. package/dist/components/Toast/Toast.module.scss.js +20 -20
  231. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +17 -17
  232. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +17 -17
  233. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  234. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  235. package/dist/components/Tooltip/index.cjs +24 -40
  236. package/dist/components/Tooltip/index.d.ts +4 -4
  237. package/dist/components/Tooltip/index.d.ts.map +1 -1
  238. package/dist/components/Tooltip/index.js +24 -40
  239. package/dist/components/VisuallyHidden/index.d.ts +2 -2
  240. package/dist/data-table.cjs +2 -1
  241. package/dist/data-table.js +2 -1
  242. package/dist/datepicker.cjs +3 -2
  243. package/dist/datepicker.js +3 -2
  244. package/dist/editor.cjs +68 -28
  245. package/dist/editor.js +68 -28
  246. package/dist/index.cjs +1 -1
  247. package/dist/index.d.ts +1 -1
  248. package/dist/index.d.ts.map +1 -1
  249. package/dist/index.js +2 -2
  250. package/dist/markdown.cjs +21 -29
  251. package/dist/markdown.js +21 -29
  252. package/dist/measurements/generated.cjs +9 -1
  253. package/dist/measurements/generated.d.ts +7 -0
  254. package/dist/measurements/generated.d.ts.map +1 -1
  255. package/dist/measurements/generated.js +9 -1
  256. package/dist/utils/a11y.cjs +5 -2
  257. package/dist/utils/a11y.d.ts +5 -5
  258. package/dist/utils/a11y.d.ts.map +1 -1
  259. package/dist/utils/a11y.js +5 -2
  260. package/dist/utils/canonical-stamp.cjs +2 -8
  261. package/dist/utils/canonical-stamp.d.ts.map +1 -1
  262. package/dist/utils/canonical-stamp.js +1 -7
  263. package/dist/utils/css-warning.cjs +1 -1
  264. package/dist/utils/css-warning.js +1 -1
  265. package/dist/utils/env.cjs +17 -0
  266. package/dist/utils/env.d.ts +3 -0
  267. package/dist/utils/env.d.ts.map +1 -0
  268. package/dist/utils/env.js +17 -0
  269. package/dist/utils/keyboard-shortcuts.cjs +3 -10
  270. package/dist/utils/keyboard-shortcuts.d.ts +4 -4
  271. package/dist/utils/keyboard-shortcuts.d.ts.map +1 -1
  272. package/dist/utils/keyboard-shortcuts.js +3 -10
  273. package/dist/utils/seed-derivation.cjs +10 -6
  274. package/dist/utils/seed-derivation.d.ts.map +1 -1
  275. package/dist/utils/seed-derivation.js +10 -6
  276. package/fragments.json +1 -1
  277. package/package.json +6 -4
  278. package/src/assets/fragments-logo.tsx +2 -2
  279. package/src/assets/fragments-wordmark.tsx +4 -2
  280. package/src/components/Accordion/Accordion.contract.json +24 -48
  281. package/src/components/Alert/Alert.contract.json +37 -53
  282. package/src/components/Alert/Alert.module.scss +24 -0
  283. package/src/components/Alert/index.tsx +55 -29
  284. package/src/components/AppShell/AppShell.contract.json +34 -51
  285. package/src/components/AppShell/AppShell.module.scss +53 -40
  286. package/src/components/Avatar/Avatar.contract.json +31 -48
  287. package/src/components/Avatar/Avatar.module.scss +4 -1
  288. package/src/components/Badge/Badge.contract.json +37 -42
  289. package/src/components/Badge/Badge.module.scss +9 -2
  290. package/src/components/BentoGrid/BentoGrid.contract.json +21 -45
  291. package/src/components/Box/Box.contract.json +40 -148
  292. package/src/components/Box/index.tsx +92 -99
  293. package/src/components/Breadcrumbs/Breadcrumbs.contract.json +21 -34
  294. package/src/components/Breadcrumbs/Breadcrumbs.module.scss +12 -7
  295. package/src/components/Button/Button.module.scss +8 -7
  296. package/src/components/ButtonGroup/ButtonGroup.contract.json +32 -47
  297. package/src/components/Card/Card.module.scss +82 -1
  298. package/src/components/Card/index.tsx +21 -2
  299. package/src/components/Chart/Chart.contract.json +21 -29
  300. package/src/components/Chart/index.tsx +36 -6
  301. package/src/components/Checkbox/Checkbox.contract.json +24 -24
  302. package/src/components/Checkbox/Checkbox.module.scss +32 -23
  303. package/src/components/Checkbox/index.tsx +4 -2
  304. package/src/components/Chip/Chip.contract.json +33 -40
  305. package/src/components/Chip/Chip.module.scss +2 -2
  306. package/src/components/Chip/index.tsx +2 -1
  307. package/src/components/CodeBlock/CodeBlock.contract.json +46 -76
  308. package/src/components/CodeBlock/CodeBlock.module.scss +40 -15
  309. package/src/components/CodeBlock/css-variables-theme.ts +102 -0
  310. package/src/components/CodeBlock/index.tsx +91 -35
  311. package/src/components/Collapsible/Collapsible.contract.json +21 -36
  312. package/src/components/ColorPicker/ColorPicker.contract.json +29 -48
  313. package/src/components/ColorPicker/ColorPicker.module.scss +15 -12
  314. package/src/components/ColorPicker/index.tsx +5 -1
  315. package/src/components/Combobox/Combobox.contract.json +36 -37
  316. package/src/components/Combobox/Combobox.module.scss +1 -1
  317. package/src/components/Combobox/index.tsx +31 -5
  318. package/src/components/Command/Command.contract.json +21 -43
  319. package/src/components/Command/index.tsx +58 -47
  320. package/src/components/ConversationList/ConversationList.contract.json +27 -32
  321. package/src/components/DataTable/DataTable.icons.tsx +4 -21
  322. package/src/components/DataTable/DataTable.module.scss +12 -8
  323. package/src/components/DataTable/index.tsx +8 -7
  324. package/src/components/DatePicker/DatePicker.contract.json +27 -28
  325. package/src/components/DatePicker/DatePicker.module.scss +12 -5
  326. package/src/components/DatePicker/index.tsx +5 -2
  327. package/src/components/Dialog/Dialog.module.scss +3 -3
  328. package/src/components/Dialog/index.tsx +47 -37
  329. package/src/components/Drawer/Drawer.contract.json +22 -36
  330. package/src/components/Editor/Editor.contract.json +31 -48
  331. package/src/components/Editor/Editor.module.scss +36 -14
  332. package/src/components/Editor/index.tsx +240 -179
  333. package/src/components/EmptyState/EmptyState.contract.json +31 -43
  334. package/src/components/EmptyState/EmptyState.module.scss +8 -0
  335. package/src/components/EmptyState/index.tsx +48 -23
  336. package/src/components/Field/Field.contract.json +28 -46
  337. package/src/components/Field/index.tsx +5 -1
  338. package/src/components/Fieldset/Fieldset.contract.json +21 -38
  339. package/src/components/Fieldset/Fieldset.module.scss +10 -3
  340. package/src/components/Form/Form.contract.json +20 -20
  341. package/src/components/Grid/Grid.contract.json +28 -64
  342. package/src/components/Grid/index.tsx +10 -10
  343. package/src/components/Header/Header.contract.json +31 -67
  344. package/src/components/Header/Header.module.scss +36 -21
  345. package/src/components/Header/index.tsx +134 -122
  346. package/src/components/Icon/Icon.contract.json +22 -62
  347. package/src/components/IconButton/IconButton.contract.json +34 -18
  348. package/src/components/IconButton/IconButton.module.scss +6 -7
  349. package/src/components/IconButton/index.tsx +2 -1
  350. package/src/components/Image/Image.contract.json +23 -56
  351. package/src/components/Input/Input.contract.json +26 -32
  352. package/src/components/Input/Input.module.scss +3 -2
  353. package/src/components/Link/Link.contract.json +32 -52
  354. package/src/components/Link/Link.module.scss +23 -6
  355. package/src/components/Link/index.tsx +1 -1
  356. package/src/components/List/List.contract.json +23 -52
  357. package/src/components/List/List.module.scss +1 -1
  358. package/src/components/Listbox/Listbox.contract.json +21 -37
  359. package/src/components/Loading/Loading.contract.json +37 -61
  360. package/src/components/Loading/Loading.module.scss +10 -7
  361. package/src/components/Loading/index.tsx +2 -2
  362. package/src/components/Main/Main.contract.json +17 -9
  363. package/src/components/Markdown/Markdown.contract.json +22 -43
  364. package/src/components/Markdown/Markdown.module.scss +43 -5
  365. package/src/components/Markdown/index.tsx +48 -49
  366. package/src/components/Menu/Menu.contract.json +25 -41
  367. package/src/components/Menu/Menu.module.scss +23 -8
  368. package/src/components/Message/Message.contract.json +29 -52
  369. package/src/components/Message/Message.module.scss +12 -5
  370. package/src/components/NavigationMenu/NavigationMenu.contract.json +36 -45
  371. package/src/components/NavigationMenu/NavigationMenu.module.scss +64 -19
  372. package/src/components/NavigationMenu/index.tsx +105 -81
  373. package/src/components/Pagination/Pagination.contract.json +22 -40
  374. package/src/components/Pagination/Pagination.module.scss +2 -2
  375. package/src/components/Popover/Popover.contract.json +24 -46
  376. package/src/components/Popover/Popover.module.scss +6 -5
  377. package/src/components/Progress/Progress.contract.json +32 -28
  378. package/src/components/Progress/Progress.module.scss +3 -2
  379. package/src/components/Prompt/Prompt.contract.json +31 -47
  380. package/src/components/Prompt/Prompt.module.scss +13 -5
  381. package/src/components/RadioGroup/RadioGroup.contract.json +23 -24
  382. package/src/components/RadioGroup/RadioGroup.module.scss +13 -14
  383. package/src/components/ScrollArea/ScrollArea.contract.json +18 -19
  384. package/src/components/ScrollArea/ScrollArea.module.scss +15 -15
  385. package/src/components/ScrollArea/index.tsx +16 -16
  386. package/src/components/ScrollArea/scroll-state.ts +24 -24
  387. package/src/components/Select/Select.module.scss +2 -2
  388. package/src/components/Separator/Separator.contract.json +24 -48
  389. package/src/components/Sidebar/Sidebar.contract.json +35 -67
  390. package/src/components/Sidebar/Sidebar.module.scss +22 -13
  391. package/src/components/Sidebar/index.tsx +164 -164
  392. package/src/components/Skeleton/Skeleton.contract.json +28 -54
  393. package/src/components/Skeleton/Skeleton.module.scss +27 -10
  394. package/src/components/Slider/Slider.contract.json +27 -39
  395. package/src/components/Slider/Slider.module.scss +3 -3
  396. package/src/components/Stack/Stack.contract.json +29 -56
  397. package/src/components/Stack/Stack.module.scss +13 -12
  398. package/src/components/Stack/index.tsx +3 -3
  399. package/src/components/Switch/Switch.contract.json +33 -46
  400. package/src/components/Switch/Switch.module.scss +64 -26
  401. package/src/components/Table/Table.contract.json +28 -46
  402. package/src/components/Table/Table.module.scss +15 -3
  403. package/src/components/TableOfContents/TableOfContents.contract.json +34 -21
  404. package/src/components/TableOfContents/TableOfContents.module.scss +15 -5
  405. package/src/components/TableOfContents/index.tsx +26 -9
  406. package/src/components/Tabs/Tabs.contract.json +24 -45
  407. package/src/components/Tabs/Tabs.module.scss +1 -1
  408. package/src/components/Tabs/index.tsx +15 -3
  409. package/src/components/Text/Text.contract.json +30 -72
  410. package/src/components/Text/Text.module.scss +21 -4
  411. package/src/components/Text/index.tsx +113 -75
  412. package/src/components/Textarea/Textarea.contract.json +25 -43
  413. package/src/components/Textarea/Textarea.module.scss +2 -4
  414. package/src/components/Theme/Theme.contract.json +32 -51
  415. package/src/components/Theme/index.tsx +2 -1
  416. package/src/components/ThemeToggle/ThemeToggle.module.scss +23 -7
  417. package/src/components/ThemeToggle/index.tsx +43 -7
  418. package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +23 -40
  419. package/src/components/Toast/Toast.contract.json +30 -40
  420. package/src/components/Toast/Toast.module.scss +1 -1
  421. package/src/components/ToggleGroup/ToggleGroup.contract.json +29 -30
  422. package/src/components/ToggleGroup/ToggleGroup.module.scss +38 -5
  423. package/src/components/Tooltip/Tooltip.contract.json +31 -52
  424. package/src/components/Tooltip/index.tsx +19 -24
  425. package/src/components/VisuallyHidden/VisuallyHidden.contract.json +22 -44
  426. package/src/components/VisuallyHidden/index.tsx +5 -5
  427. package/src/index.ts +2 -2
  428. package/src/measurements/generated.ts +9 -2
  429. package/src/measurements/measurements.json +7 -0
  430. package/src/recipes/_boolean-range.scss +3 -11
  431. package/src/recipes/_field.scss +5 -1
  432. package/src/recipes/_layout.scss +14 -7
  433. package/src/recipes/_popup.scss +12 -2
  434. package/src/recipes/_prose.scss +13 -5
  435. package/src/recipes/_table-chrome.scss +16 -2
  436. package/src/scss.d.ts +1 -1
  437. package/src/styles/globals.scss +20 -19
  438. package/src/tokens/_computed.scss +5 -16
  439. package/src/tokens/_derive.scss +112 -210
  440. package/src/tokens/_measurements.catalog.generated.css +6 -1
  441. package/src/tokens/_measurements.generated.scss +14 -1
  442. package/src/tokens/_mixins.scss +7 -8
  443. package/src/tokens/_palettes.scss +39 -167
  444. package/src/tokens/_seeds.scss +20 -20
  445. package/src/tokens/_variables.scss +183 -38
  446. package/src/utils/a11y.tsx +69 -69
  447. package/src/utils/aria.ts +3 -3
  448. package/src/utils/canonical-stamp.ts +2 -12
  449. package/src/utils/css-warning.ts +7 -7
  450. package/src/utils/env.ts +25 -0
  451. package/src/utils/keyboard-shortcuts.ts +131 -126
  452. package/src/utils/seed-derivation.ts +10 -6
  453. package/src/components/Button/Button.contract.json +0 -218
  454. package/src/components/Card/Card.contract.json +0 -175
  455. package/src/components/DataTable/DataTable.contract.json +0 -302
  456. package/src/components/Dialog/Dialog.contract.json +0 -159
  457. package/src/components/Select/Select.contract.json +0 -259
@@ -1,14 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Avatar",
4
- "description": "Visual representation of a user or entity",
4
+ "description": "Shows who someone is their photo, or their initials when there is none.",
5
5
  "category": "display",
6
- "tags": [
7
- "user",
8
- "profile",
9
- "image",
10
- "identity"
11
- ],
6
+ "tags": ["user", "profile", "image", "identity"],
12
7
  "status": "stable",
13
8
  "sourcePath": "src/components/Avatar/index.tsx",
14
9
  "exportName": "Avatar",
@@ -52,13 +47,7 @@
52
47
  "description": "Size variant",
53
48
  "default": "md",
54
49
  "required": false,
55
- "values": [
56
- "xs",
57
- "sm",
58
- "md",
59
- "lg",
60
- "xl"
61
- ]
50
+ "values": ["xs", "sm", "md", "lg", "xl"]
62
51
  },
63
52
  "customSize": {
64
53
  "type": "union",
@@ -70,10 +59,7 @@
70
59
  "description": "Shape variant",
71
60
  "default": "circle",
72
61
  "required": false,
73
- "values": [
74
- "circle",
75
- "square"
76
- ]
62
+ "values": ["circle", "square"]
77
63
  },
78
64
  "color": {
79
65
  "type": "string",
@@ -98,66 +84,67 @@
98
84
  },
99
85
  "usage": {
100
86
  "when": [
101
- "Displaying user profile pictures",
102
- "Showing team member lists",
103
- "Representing entities in lists or cards",
104
- "User identification in comments or messages"
87
+ "A row, comment, or card needs to say who",
88
+ "Several people belong to one thing — use Avatar.Group"
105
89
  ],
106
90
  "whenNot": [
107
- "Decorative images (use Image)",
108
- "Logo display (use Logo component)",
109
- "Large profile headers (use custom layout)"
91
+ "The picture is content, not identity (use Image)",
92
+ "A profile hero at display size (build the layout yourself)"
110
93
  ],
111
94
  "guidelines": [
112
- "Always provide alt text or name for accessibility",
113
- "Use consistent sizes within the same context",
114
- "Provide fallback initials when image may not load",
115
- "Use Avatar.Group for multiple avatars in a row",
116
- "Use imageProps for advanced img attributes (loading, decoding, referrerPolicy, etc.)"
95
+ "Pass name even when you pass src — it is the fallback and the label",
96
+ "Hold one size per context; mixed sizes read as a mistake",
97
+ "Avatar.Group max caps the stack and counts the rest",
98
+ "imageProps carries loading, decoding, referrerPolicy"
117
99
  ],
118
100
  "accessibility": [
119
- "Include meaningful alt text describing the user",
120
- "Initials should be derived from name for screen readers",
121
- "Decorative avatars should have empty alt"
101
+ "alt describes the person, not the word \"avatar\"",
102
+ "Initials come from name, so screen readers get the whole name",
103
+ "Purely decorative? Pass alt=\"\""
122
104
  ]
123
105
  },
124
106
  "examples": [
125
107
  {
126
108
  "name": "Default",
127
- "description": "Avatar with image",
109
+ "description": "A photo, cropped to the circle and centred.",
128
110
  "code": "import { Avatar } from '@/components/Avatar';\n\n<Avatar\n src=\"https://i.pravatar.cc/150?u=jane\"\n alt=\"Jane Doe\"\n name=\"Jane Doe\"\n/>"
129
111
  },
130
112
  {
131
113
  "name": "With Initials",
132
- "description": "Fallback when no image is provided",
114
+ "description": "No src, so the name collapses to initials.",
133
115
  "code": "import { Avatar } from '@/components/Avatar';\n\n<Avatar name=\"John Smith\" />"
134
116
  },
135
117
  {
136
118
  "name": "Sizes",
137
- "description": "Available size options",
119
+ "description": "Five steps, xs through xl — pick one per context and stick to it.",
138
120
  "code": "import { Avatar } from '@/components/Avatar';\nimport { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" align=\"center\" wrap>\n <Avatar name=\"XS\" size=\"xs\" />\n <Avatar name=\"SM\" size=\"sm\" />\n <Avatar name=\"MD\" size=\"md\" />\n <Avatar name=\"LG\" size=\"lg\" />\n <Avatar name=\"XL\" size=\"xl\" />\n</Stack>"
139
121
  },
140
122
  {
141
123
  "name": "Custom Size",
142
- "description": "Set an exact avatar size",
124
+ "description": "customSize takes any number when the scale does not fit.",
143
125
  "code": "import { Avatar } from '@/components/Avatar';\n\n<Avatar name=\"Conan McNicholl\" customSize={36} />"
144
126
  },
145
127
  {
146
128
  "name": "Square Shape",
147
- "description": "Square variant for app icons or brands",
129
+ "description": "Squares read as products or orgs, circles as people.",
148
130
  "code": "import { Avatar } from '@/components/Avatar';\n\n<Avatar name=\"App\" shape=\"square\" />"
149
131
  },
150
132
  {
151
133
  "name": "Group",
152
- "description": "Multiple avatars stacked together",
134
+ "description": "Overlapping stack with a count for whoever did not fit.",
153
135
  "code": "import { Avatar } from '@/components/Avatar';\n\n<Avatar.Group max={3} size=\"md\">\n <Avatar name=\"Alice Johnson\" />\n <Avatar name=\"Bob Smith\" />\n <Avatar name=\"Carol Williams\" />\n <Avatar name=\"David Brown\" />\n <Avatar name=\"Eve Davis\" />\n</Avatar.Group>"
154
136
  }
155
137
  ],
156
138
  "relations": [
157
139
  {
158
- "component": "Avatar",
159
- "relationship": "parent",
160
- "note": "Use Avatar.Group for stacked avatar displays"
140
+ "component": "Image",
141
+ "relationship": "alternative",
142
+ "note": "Use Image for content pictures that are not a person or entity"
143
+ },
144
+ {
145
+ "component": "Badge",
146
+ "relationship": "sibling",
147
+ "note": "Pair with Badge to show presence or role beside a name"
161
148
  }
162
149
  ],
163
150
  "contract": {
@@ -170,15 +157,11 @@
170
157
  "imageProps: ImgHTMLAttributes - advanced img attributes",
171
158
  "shape: circle|square (default: circle)"
172
159
  ],
173
- "a11yRules": [
174
- "A11Y_IMG_ALT"
175
- ]
160
+ "a11yRules": ["A11Y_IMG_ALT"]
176
161
  },
177
162
  "ai": {
178
163
  "compositionPattern": "compound",
179
- "subComponents": [
180
- "Group"
181
- ]
164
+ "subComponents": ["Group"]
182
165
  },
183
166
  "provenance": {
184
167
  "source": "migrated",
@@ -84,7 +84,10 @@
84
84
  }
85
85
  }
86
86
 
87
- .groupItem:last-child {
87
+ // Must match the specificity of `.group .<size>.groupItem` above (and follow it
88
+ // in source order), otherwise the leading avatar keeps its negative margin and
89
+ // the whole stack sits offset from the content around it.
90
+ .group .groupItem:last-child {
88
91
  margin-inline-start: 0;
89
92
  }
90
93
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Badge",
4
- "description": "Compact label for status, counts, or categorization. Draws attention to metadata without dominating the layout.",
4
+ "description": "Labels a status, count, or category without pulling focus.",
5
5
  "category": "display",
6
6
  "tags": ["status", "label", "tag", "count", "chip"],
7
7
  "status": "stable",
@@ -87,71 +87,66 @@
87
87
  },
88
88
  "usage": {
89
89
  "when": [
90
- "Showing item status (active, pending, archived)",
91
- "Displaying counts or quantities inline",
92
- "Categorizing or tagging content",
93
- "Highlighting new or updated items"
90
+ "Marking item status: active, pending, archived",
91
+ "Showing a count inline",
92
+ "Tagging or categorising content",
93
+ "Flagging what is new or changed"
94
94
  ],
95
95
  "whenNot": [
96
- "Conveying critical errors (use Alert instead)",
97
- "Long-form status messages (use Alert)",
98
- "Interactive filtering (use Chip/ToggleGroup)",
99
- "Navigation labels (use Tabs or links)"
96
+ "Real errors that need attention — use Alert",
97
+ "Anything longer than a few words — use Alert",
98
+ "Clickable filters use Chip or ToggleGroup",
99
+ "View switching use Tabs or links"
100
100
  ],
101
101
  "guidelines": [
102
- "Keep badge text under 20 characters",
103
- "Use dot variant for live status indicators",
104
- "Pair success/error variants with meaningful labels, not just colors",
105
- "Semantic status badges are borderless pills using shared semantic bg/text tokens",
106
- "Use onRemove for user-created tags only, not system-generated badges",
107
- "Badges are not announced as live status updates by default; use announce for screen-reader status announcements when appropriate"
102
+ "Under 20 characters",
103
+ "dot for live status; add dotPulse only while it is still changing",
104
+ "Semantic variants are borderless pills on shared status tokens",
105
+ "label pairs with dotColor; dim pairs with active for filter chrome",
106
+ "onRemove for user-created tags only, never system labels"
108
107
  ],
109
108
  "accessibility": [
110
- "Badge text must be meaningful without relying on color alone",
111
- "Removable badges must have accessible dismiss button labels",
112
- "Avoid using badges as the sole indicator of important state changes"
109
+ "The text must carry the meaning colour alone never does",
110
+ "Removable badges need a named dismiss button",
111
+ "Badges are silent to screen readers unless you pass announce",
112
+ "Do not make a badge the only signal that something changed"
113
113
  ]
114
114
  },
115
115
  "examples": [
116
- {
117
- "name": "Default",
118
- "description": "Neutral badge for general labels",
119
- "code": "import { Badge } from '@/components/Badge';\n\n<Badge>Default</Badge>"
120
- },
121
116
  {
122
117
  "name": "Status Variants",
123
- "description": "All severity variants for different contexts",
124
- "code": "import { Badge } from '@/components/Badge';\nimport { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Badge variant=\"default\">Default</Badge>\n <Badge variant=\"success\">Active</Badge>\n <Badge variant=\"warning\">Pending</Badge>\n <Badge variant=\"error\">Failed</Badge>\n <Badge variant=\"info\">New</Badge>\n</Stack>"
125
- },
126
- {
127
- "name": "Delivery Status",
128
- "description": "Reference status pills with deep semantic fill and bright text",
129
- "code": "import { Badge } from '@/components/Badge';\nimport { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Badge variant=\"success\" size=\"lg\">Delivered</Badge>\n <Badge variant=\"error\" size=\"lg\">Bounced</Badge>\n</Stack>"
118
+ "description": "Neutral through info, on shared status tokens.",
119
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Badge variant=\"default\">Default</Badge>\n <Badge variant=\"success\">Active</Badge>\n <Badge variant=\"warning\">Pending</Badge>\n <Badge variant=\"error\">Failed</Badge>\n <Badge variant=\"info\">New</Badge>\n</Stack>"
130
120
  },
131
121
  {
132
122
  "name": "With Dot",
133
- "description": "Live status indicators using dot prefix",
134
- "code": "import { Badge } from '@/components/Badge';\nimport { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Badge variant=\"success\" dot>Online</Badge>\n <Badge variant=\"warning\" dot>Away</Badge>\n <Badge variant=\"error\" dot>Offline</Badge>\n</Stack>"
123
+ "description": "Leading dot for live state; it breathes while still moving.",
124
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Badge variant=\"success\" dot>Online</Badge>\n <Badge variant=\"warning\" dot>Away</Badge>\n <Badge variant=\"error\" dot>Offline</Badge>\n <Badge variant=\"info\" dot dotPulse>Syncing</Badge>\n</Stack>"
135
125
  },
136
126
  {
137
- "name": "Announced Status",
138
- "description": "Opt into screen-reader status announcement behavior",
139
- "code": "import { Badge } from '@/components/Badge';\n\n<Badge variant=\"success\" announce>Saved</Badge>"
127
+ "name": "Label and Filter",
128
+ "description": "Hairline metadata pill, and filter chrome that marks the active one.",
129
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Badge variant=\"label\" dotColor=\"var(--fui-color-accent)\">Design</Badge>\n <Badge variant=\"label\" dotColor=\"var(--fui-color-success)\">Shipped</Badge>\n <Badge variant=\"dim\" active>All</Badge>\n <Badge variant=\"dim\">Archived</Badge>\n</Stack>"
140
130
  },
141
131
  {
142
132
  "name": "Outline",
143
- "description": "Minimal bordered badge for neutral emphasis",
144
- "code": "import { Badge } from '@/components/Badge';\n\n<Badge variant=\"outline\">Outline</Badge>"
133
+ "description": "Bordered and transparent, when a fill would shout.",
134
+ "code": "<Badge variant=\"outline\">Outline</Badge>"
145
135
  },
146
136
  {
147
- "name": "Small Size",
148
- "description": "Compact badges for dense UIs",
149
- "code": "import { Badge } from '@/components/Badge';\nimport { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" align=\"center\" wrap>\n <Badge size=\"sm\" variant=\"info\">v2.1</Badge>\n <Badge size=\"sm\" variant=\"success\">Stable</Badge>\n <Badge size=\"md\" variant=\"info\">Standard</Badge>\n</Stack>"
137
+ "name": "Sizes",
138
+ "description": "sm for dense tables, lg for reference status pills.",
139
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" align=\"center\" wrap>\n <Badge variant=\"success\" size=\"sm\">Small</Badge>\n <Badge variant=\"success\" size=\"md\">Medium</Badge>\n <Badge variant=\"success\" size=\"lg\">Large</Badge>\n</Stack>"
150
140
  },
151
141
  {
152
142
  "name": "Removable",
153
- "description": "User-created tags that can be dismissed",
154
- "code": "import { Badge } from '@/components/Badge';\nimport { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Badge variant=\"info\" onRemove={() => {}}>React</Badge>\n <Badge variant=\"info\" onRemove={() => {}}>TypeScript</Badge>\n <Badge variant=\"info\" onRemove={() => {}}>CSS</Badge>\n</Stack>"
143
+ "description": "Dismissible tags the user added themselves.",
144
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Badge variant=\"info\" onRemove={() => {}}>React</Badge>\n <Badge variant=\"info\" onRemove={() => {}}>TypeScript</Badge>\n <Badge variant=\"info\" onRemove={() => {}}>CSS</Badge>\n</Stack>"
145
+ },
146
+ {
147
+ "name": "Announced Status",
148
+ "description": "Looks the same, but screen readers now hear the change.",
149
+ "code": "<Badge variant=\"success\" announce>Saved</Badge>"
155
150
  }
156
151
  ],
157
152
  "relations": [
@@ -1,4 +1,5 @@
1
1
  @use "../../tokens/variables" as *;
2
+ @use "../../tokens/mixins" as *;
2
3
  @use "../../recipes/action" as action;
3
4
  @use "../../recipes/representation" as representation;
4
5
  @use "../../recipes/target" as target;
@@ -85,7 +86,7 @@
85
86
 
86
87
  &.active {
87
88
  border-color: var(--fui-border, $fui-border);
88
- background-color: var(--fui-bg-hover, $fui-bg-hover);
89
+ background-color: var(--fui-control-selected-bg, $fui-bg-active);
89
90
  color: var(--fui-text-primary, $fui-text-primary);
90
91
  }
91
92
  }
@@ -109,7 +110,7 @@
109
110
  // motion the component has. Opacity only: nothing reflows, and a reader who has
110
111
  // asked for less motion loses the breathing and keeps the badge.
111
112
  .dotPulse {
112
- animation: fui-badge-dot-pulse 1.6s ease-in-out infinite;
113
+ animation: fui-badge-dot-pulse var(--fui-duration-pulse, $fui-duration-pulse) ease-in-out infinite;
113
114
  }
114
115
 
115
116
  @keyframes fui-badge-dot-pulse {
@@ -169,4 +170,10 @@
169
170
  &:hover {
170
171
  opacity: 1;
171
172
  }
173
+
174
+ &:focus-visible {
175
+ @include focus-ring;
176
+
177
+ opacity: 1;
178
+ }
172
179
  }
@@ -1,16 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "BentoGrid",
4
- "description": "Asymmetric grid layout with responsive spans and built-in surface styling for bento-style feature sections",
4
+ "description": "Asymmetric feature grid where tiles span different widths and heights.",
5
5
  "category": "layout",
6
- "tags": [
7
- "bento",
8
- "grid",
9
- "layout",
10
- "responsive",
11
- "feature-grid",
12
- "asymmetric"
13
- ],
6
+ "tags": ["bento", "grid", "layout", "responsive", "feature-grid", "asymmetric"],
14
7
  "status": "stable",
15
8
  "sourcePath": "src/components/BentoGrid/index.tsx",
16
9
  "exportName": "BentoGrid",
@@ -31,25 +24,14 @@
31
24
  "description": "Number of columns — auto-collapses responsively (3→2→1)",
32
25
  "default": "3",
33
26
  "required": false,
34
- "values": [
35
- "2",
36
- "3",
37
- "4"
38
- ]
27
+ "values": ["2", "3", "4"]
39
28
  },
40
29
  "gap": {
41
30
  "type": "enum",
42
31
  "description": "Gap between grid items, mapped to spacing tokens",
43
32
  "default": "md",
44
33
  "required": false,
45
- "values": [
46
- "none",
47
- "xs",
48
- "sm",
49
- "md",
50
- "lg",
51
- "xl"
52
- ]
34
+ "values": ["none", "xs", "sm", "md", "lg", "xl"]
53
35
  },
54
36
  "style": {
55
37
  "type": "object",
@@ -59,22 +41,21 @@
59
41
  },
60
42
  "usage": {
61
43
  "when": [
62
- "Asymmetric feature grids with hero + supporting items",
63
- "Dashboard overviews where cards have different visual weight",
64
- "Marketing pages with mixed-size content blocks",
65
- "Any layout where items need per-breakpoint column/row spans"
44
+ "Feature grids with one hero tile and supporting tiles",
45
+ "Dashboards where cards carry different weight",
46
+ "Marketing sections with mixed-size blocks"
66
47
  ],
67
48
  "whenNot": [
68
- "Uniform grids where all items are the same size (use Grid)",
69
- "Form layouts with labeled fields (use Grid)",
70
- "Simple stacked content (use Stack)"
49
+ "Uniform tiles of one size (use Grid)",
50
+ "Labelled form fields (use Grid)",
51
+ "A single column of content (use Stack)"
71
52
  ],
72
53
  "guidelines": [
73
- "Use colSpan/rowSpan with responsive objects for layouts that adapt across breakpoints",
74
- "The hero item typically uses colSpan={2} rowSpan={2} at lg and above",
75
- "Items include built-in surface styling no need to wrap children in Card",
76
- "Grid auto-collapses: 32 columns below lg, all→1 column below sm",
77
- "Root and Item forward DOM props (aria-*, data-*, handlers), and Item style merges with span CSS vars"
54
+ "colSpan and rowSpan take per-breakpoint objects",
55
+ "A hero tile is usually colSpan 2 and rowSpan 2 from lg up",
56
+ "Tiles carry their own surface — do not wrap them in Card",
57
+ "Columns collapse 3 to 2 below lg, and to 1 below sm",
58
+ "Keep source order equal to visual order for screen readers"
78
59
  ],
79
60
  "accessibility": [
80
61
  "Grid is purely visual — it does not affect reading order or semantics",
@@ -86,23 +67,18 @@
86
67
  "examples": [
87
68
  {
88
69
  "name": "Default",
89
- "description": "Basic 3-column uniform bento grid",
90
- "code": "<BentoGrid columns={3} gap=\"md\">\n <BentoGrid.Item>Item 1</BentoGrid.Item>\n <BentoGrid.Item>Item 2</BentoGrid.Item>\n <BentoGrid.Item>Item 3</BentoGrid.Item>\n <BentoGrid.Item>Item 4</BentoGrid.Item>\n <BentoGrid.Item>Item 5</BentoGrid.Item>\n <BentoGrid.Item>Item 6</BentoGrid.Item>\n</BentoGrid>"
70
+ "description": "Equal tiles, each on its own surface.",
71
+ "code": "import { BentoGrid } from '@/components/BentoGrid';\nimport { Box } from '@/components/Box';\n\n<Box width=\"100%\">\n <BentoGrid columns={3} gap=\"md\">\n <BentoGrid.Item>Item 1</BentoGrid.Item>\n <BentoGrid.Item>Item 2</BentoGrid.Item>\n <BentoGrid.Item>Item 3</BentoGrid.Item>\n <BentoGrid.Item>Item 4</BentoGrid.Item>\n <BentoGrid.Item>Item 5</BentoGrid.Item>\n <BentoGrid.Item>Item 6</BentoGrid.Item>\n </BentoGrid>\n</Box>"
91
72
  },
92
73
  {
93
74
  "name": "Hero Layout",
94
- "description": "2×2 hero item with 4 supporting items in a 3-column grid",
95
- "code": "<BentoGrid columns={3} gap=\"md\">\n <BentoGrid.Item colSpan={{ base: 1, lg: 2 }} rowSpan={{ base: 1, lg: 2 }}>\n Hero content\n </BentoGrid.Item>\n <BentoGrid.Item>Item 2</BentoGrid.Item>\n <BentoGrid.Item>Item 3</BentoGrid.Item>\n <BentoGrid.Item>Item 4</BentoGrid.Item>\n <BentoGrid.Item>Item 5</BentoGrid.Item>\n</BentoGrid>"
75
+ "description": "One tile takes two columns and two rows; the rest fill around it.",
76
+ "code": "import { BentoGrid } from '@/components/BentoGrid';\nimport { Box } from '@/components/Box';\n\n<Box width=\"100%\">\n <BentoGrid columns={3} gap=\"md\">\n <BentoGrid.Item colSpan={{ base: 1, lg: 2 }} rowSpan={{ base: 1, lg: 2 }}>\n Hero content\n </BentoGrid.Item>\n <BentoGrid.Item>Item 2</BentoGrid.Item>\n <BentoGrid.Item>Item 3</BentoGrid.Item>\n <BentoGrid.Item>Item 4</BentoGrid.Item>\n <BentoGrid.Item>Item 5</BentoGrid.Item>\n </BentoGrid>\n</Box>"
96
77
  },
97
78
  {
98
79
  "name": "Two Column",
99
- "description": "2-column bento with a wide item",
100
- "code": "<BentoGrid columns={2} gap=\"md\">\n <BentoGrid.Item>Item 1</BentoGrid.Item>\n <BentoGrid.Item>Item 2</BentoGrid.Item>\n <BentoGrid.Item colSpan={2}>Wide item</BentoGrid.Item>\n <BentoGrid.Item>Item 4</BentoGrid.Item>\n <BentoGrid.Item>Item 5</BentoGrid.Item>\n</BentoGrid>"
101
- },
102
- {
103
- "name": "Full-Width Banner",
104
- "description": "3-column grid with a full-width item spanning all columns",
105
- "code": "<BentoGrid columns={3} gap=\"md\">\n <BentoGrid.Item>Item 1</BentoGrid.Item>\n <BentoGrid.Item>Item 2</BentoGrid.Item>\n <BentoGrid.Item>Item 3</BentoGrid.Item>\n <BentoGrid.Item colSpan={3}>Full-width banner</BentoGrid.Item>\n</BentoGrid>"
80
+ "description": "colSpan stretches a tile across the whole row.",
81
+ "code": "import { BentoGrid } from '@/components/BentoGrid';\nimport { Box } from '@/components/Box';\n\n<Box width=\"100%\">\n <BentoGrid columns={2} gap=\"md\">\n <BentoGrid.Item>Item 1</BentoGrid.Item>\n <BentoGrid.Item>Item 2</BentoGrid.Item>\n <BentoGrid.Item colSpan={2}>Wide item</BentoGrid.Item>\n <BentoGrid.Item>Item 4</BentoGrid.Item>\n <BentoGrid.Item>Item 5</BentoGrid.Item>\n </BentoGrid>\n</Box>"
106
82
  }
107
83
  ],
108
84
  "relations": [