@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,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Form",
4
- "description": "Form wrapper that handles server-side error distribution to Field components. Pairs with Field for complete form validation.",
5
- "category": "forms",
4
+ "description": "Distributes server-side validation errors to its Field components.",
5
+ "category": "inputs",
6
6
  "tags": ["form", "validation", "errors", "submit", "server"],
7
7
  "status": "stable",
8
8
  "sourcePath": "src/components/Form/index.tsx",
@@ -50,47 +50,47 @@
50
50
  },
51
51
  "usage": {
52
52
  "when": [
53
- "Building forms that need server-side error handling",
54
- "Distributing validation errors to specific fields by name",
55
- "Combining client and server validation in one form"
53
+ "The server rejects a submission and each reason must reach its own field",
54
+ "Client and server validation live in the same form"
56
55
  ],
57
56
  "whenNot": [
58
- "Simple forms with only client-side validation (use native form or Field alone)",
59
- "Non-form layouts (use Grid or Card)"
57
+ "Client-side validation only (a native form plus Field is enough)",
58
+ "Layout without submission (use Grid or Card)"
60
59
  ],
61
60
  "guidelines": [
62
- "Pass errors as Record<string, string | string[]> keyed by field name",
63
- "Use onClearErrors to clear errors when fields are modified",
64
- "Use onSubmit for form submission handling (onFormSubmit is deprecated alias)",
65
- "Field components with matching name prop display errors automatically",
66
- "Use Grid inside Form or Fieldset for multi-column layouts",
67
- "Place form buttons inside Form.Actions so cancel and submit actions are consistently right-aligned"
61
+ "errors is keyed by field name: Record<string, string | string[]>",
62
+ "Clear a field's error in onClearErrors when the user edits it",
63
+ "Use onSubmit; onFormSubmit is a deprecated alias",
64
+ "A Field picks up its error by matching name",
65
+ "Leave Field.Error unmatched so it shows whatever the server sent",
66
+ "Put a Grid inside Form or Fieldset for multi-column layouts",
67
+ "Buttons go in Form.Actions so they stay right-aligned"
68
68
  ],
69
69
  "accessibility": [
70
- "Renders semantic form element",
71
- "Error messages linked to fields via aria-describedby"
70
+ "Renders a real form element",
71
+ "Errors link back to their field via aria-describedby"
72
72
  ]
73
73
  },
74
74
  "examples": [
75
75
  {
76
76
  "name": "Sign up",
77
- "description": "Registration form with two-column name fields",
77
+ "description": "Paired name fields, then full-width rows and a right-aligned submit.",
78
78
  "code": "<Form onSubmit={(e) => { e.preventDefault(); }}>\n <Grid columns={2} gap=\"md\">\n <Field name=\"firstName\">\n <Field.Label>First Name</Field.Label>\n <Field.Control>\n <Input placeholder=\"Jane\" />\n </Field.Control>\n </Field>\n <Field name=\"lastName\">\n <Field.Label>Last Name</Field.Label>\n <Field.Control>\n <Input placeholder=\"Doe\" />\n </Field.Control>\n </Field>\n <Grid.Item colSpan=\"full\">\n <Field name=\"email\">\n <Field.Label>Email</Field.Label>\n <Field.Control>\n <Input type=\"email\" placeholder=\"jane@example.com\" />\n </Field.Control>\n <Field.Error match=\"typeMismatch\">Enter a valid email address</Field.Error>\n </Field>\n </Grid.Item>\n <Grid.Item colSpan=\"full\">\n <Field name=\"password\">\n <Field.Label>Password</Field.Label>\n <Field.Control>\n <Input type=\"password\" placeholder=\"At least 8 characters\" />\n </Field.Control>\n <Field.Description>Must be at least 8 characters</Field.Description>\n </Field>\n </Grid.Item>\n <Grid.Item colSpan=\"full\">\n <Field name=\"terms\">\n <Field.Control>\n <Checkbox label=\"I agree to the terms and conditions\" />\n </Field.Control>\n </Field>\n </Grid.Item>\n </Grid>\n <Form.Actions>\n <Button type=\"submit\" variant=\"primary\">Create Account</Button>\n </Form.Actions>\n</Form>"
79
79
  },
80
80
  {
81
81
  "name": "Profile settings",
82
- "description": "Multi-section form with Fieldsets, switches, and radio group",
82
+ "description": "Fieldsets split a long form into sections the user can scan.",
83
83
  "code": "<Form onSubmit={(e) => { e.preventDefault(); }}>\n <Fieldset>\n <Fieldset.Legend>Profile</Fieldset.Legend>\n <Grid columns={2} gap=\"md\">\n <Field name=\"displayName\">\n <Field.Label>Display Name</Field.Label>\n <Field.Control>\n <Input placeholder=\"How others see you\" />\n </Field.Control>\n </Field>\n <Field name=\"timezone\">\n <Field.Label>Timezone</Field.Label>\n <Field.Control>\n <Select placeholder=\"Select timezone\">\n <Select.Trigger />\n <Select.Content>\n <Select.Item value=\"utc\">UTC</Select.Item>\n <Select.Item value=\"est\">Eastern (EST)</Select.Item>\n <Select.Item value=\"pst\">Pacific (PST)</Select.Item>\n <Select.Item value=\"gmt\">GMT</Select.Item>\n </Select.Content>\n </Select>\n </Field.Control>\n </Field>\n <Grid.Item colSpan=\"full\">\n <Field name=\"bio\">\n <Field.Label>Bio</Field.Label>\n <Field.Control>\n <Textarea placeholder=\"Tell us about yourself\" rows={3} maxLength={280} />\n </Field.Control>\n <Field.Description>Max 280 characters</Field.Description>\n </Field>\n </Grid.Item>\n </Grid>\n </Fieldset>\n <Fieldset>\n <Fieldset.Legend>Notifications</Fieldset.Legend>\n <Field name=\"emailNotifs\">\n <Field.Control>\n <Switch label=\"Email notifications\" />\n </Field.Control>\n </Field>\n <Field name=\"marketingEmails\">\n <Field.Control>\n <Switch label=\"Marketing emails\" />\n </Field.Control>\n </Field>\n <Field name=\"frequency\">\n <Field.Label>Digest frequency</Field.Label>\n <Field.Control>\n <RadioGroup name=\"frequency\" orientation=\"vertical\">\n <RadioGroup.Item value=\"daily\" label=\"Daily\" />\n <RadioGroup.Item value=\"weekly\" label=\"Weekly\" />\n <RadioGroup.Item value=\"monthly\" label=\"Monthly\" />\n </RadioGroup>\n </Field.Control>\n </Field>\n </Fieldset>\n <Form.Actions>\n <Button type=\"submit\" variant=\"primary\">Save Changes</Button>\n </Form.Actions>\n</Form>"
84
84
  },
85
85
  {
86
86
  "name": "Contact form",
87
- "description": "Contact form with select, textarea, and checkbox",
87
+ "description": "Mixed control types in one submission flow.",
88
88
  "code": "<Form onSubmit={(e) => { e.preventDefault(); }}>\n <Grid columns={2} gap=\"md\">\n <Field name=\"name\">\n <Field.Label>Name</Field.Label>\n <Field.Control>\n <Input placeholder=\"Your name\" />\n </Field.Control>\n </Field>\n <Field name=\"email\">\n <Field.Label>Email</Field.Label>\n <Field.Control>\n <Input type=\"email\" placeholder=\"you@example.com\" />\n </Field.Control>\n </Field>\n <Grid.Item colSpan=\"full\">\n <Field name=\"subject\">\n <Field.Label>Subject</Field.Label>\n <Field.Control>\n <Select placeholder=\"What is this about?\">\n <Select.Trigger />\n <Select.Content>\n <Select.Item value=\"general\">General Inquiry</Select.Item>\n <Select.Item value=\"support\">Technical Support</Select.Item>\n <Select.Item value=\"billing\">Billing</Select.Item>\n <Select.Item value=\"feedback\">Feedback</Select.Item>\n </Select.Content>\n </Select>\n </Field.Control>\n </Field>\n </Grid.Item>\n <Grid.Item colSpan=\"full\">\n <Field name=\"message\">\n <Field.Label>Message</Field.Label>\n <Field.Control>\n <Textarea placeholder=\"How can we help?\" rows={5} />\n </Field.Control>\n </Field>\n </Grid.Item>\n <Grid.Item colSpan=\"full\">\n <Field name=\"copy\">\n <Field.Control>\n <Checkbox label=\"Send me a copy\" />\n </Field.Control>\n </Field>\n </Grid.Item>\n </Grid>\n <Form.Actions>\n <Button type=\"submit\" variant=\"primary\">Send Message</Button>\n </Form.Actions>\n</Form>"
89
89
  },
90
90
  {
91
91
  "name": "With server errors",
92
- "description": "Form displaying server-side validation errors",
93
- "code": "<Form errors={{ username: 'Username is already taken', email: 'Email is already registered' }}>\n <Grid columns={2} gap=\"md\">\n <Field name=\"username\">\n <Field.Label>Username</Field.Label>\n <Field.Control>\n <Input defaultValue=\"janedoe\" />\n </Field.Control>\n <Field.Error match=\"customError\" />\n </Field>\n <Field name=\"email\">\n <Field.Label>Email</Field.Label>\n <Field.Control>\n <Input type=\"email\" defaultValue=\"jane@example.com\" />\n </Field.Control>\n <Field.Error match=\"customError\" />\n </Field>\n </Grid>\n <Form.Actions>\n <Button type=\"submit\" variant=\"primary\">Submit</Button>\n </Form.Actions>\n</Form>"
92
+ "description": "Errors from the server land on the fields that caused them.",
93
+ "code": "<Form errors={{ username: 'Username is already taken', email: 'Email is already registered' }}>\n <Grid columns={2} gap=\"md\">\n <Field name=\"username\">\n <Field.Label>Username</Field.Label>\n <Field.Control>\n <Input defaultValue=\"janedoe\" />\n </Field.Control>\n <Field.Error />\n </Field>\n <Field name=\"email\">\n <Field.Label>Email</Field.Label>\n <Field.Control>\n <Input type=\"email\" defaultValue=\"jane@example.com\" />\n </Field.Control>\n <Field.Error />\n </Field>\n </Grid>\n <Form.Actions>\n <Button type=\"submit\" variant=\"primary\">Submit</Button>\n </Form.Actions>\n</Form>"
94
94
  }
95
95
  ],
96
96
  "relations": [
@@ -1,14 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Grid",
4
- "description": "Responsive grid layout for arranging items in columns with consistent spacing",
4
+ "description": "Arranges items into responsive columns with one shared gap.",
5
5
  "category": "layout",
6
- "tags": [
7
- "grid",
8
- "layout",
9
- "columns",
10
- "responsive"
11
- ],
6
+ "tags": ["grid", "layout", "columns", "responsive"],
12
7
  "status": "stable",
13
8
  "sourcePath": "src/components/Grid/index.tsx",
14
9
  "exportName": "Grid",
@@ -43,57 +38,33 @@
43
38
  "type": "string",
44
39
  "description": "Minimum width for auto-fill columns (e.g., \"16rem\", \"250px\")",
45
40
  "required": false,
46
- "constraints": [
47
- "Only applies when columns=\"auto\""
48
- ]
41
+ "constraints": ["Only applies when columns=\"auto\""]
49
42
  },
50
43
  "gap": {
51
44
  "type": "union",
52
45
  "description": "Gap between grid items. Accepts string tokens or numbers (1-8) mapped to the spacing scale",
53
46
  "default": "md",
54
47
  "required": false,
55
- "values": [
56
- "none",
57
- "xs",
58
- "sm",
59
- "md",
60
- "lg",
61
- "xl"
62
- ]
48
+ "values": ["none", "xs", "sm", "md", "lg", "xl"]
63
49
  },
64
50
  "alignItems": {
65
51
  "type": "enum",
66
52
  "description": "Vertical alignment of items within their cells",
67
53
  "required": false,
68
- "values": [
69
- "start",
70
- "center",
71
- "end",
72
- "stretch"
73
- ]
54
+ "values": ["start", "center", "end", "stretch"]
74
55
  },
75
56
  "justifyItems": {
76
57
  "type": "enum",
77
58
  "description": "Horizontal alignment of items within their cells",
78
59
  "required": false,
79
- "values": [
80
- "start",
81
- "center",
82
- "end",
83
- "stretch"
84
- ]
60
+ "values": ["start", "center", "end", "stretch"]
85
61
  },
86
62
  "padding": {
87
63
  "type": "enum",
88
64
  "description": "Internal padding of the grid container",
89
65
  "default": "none",
90
66
  "required": false,
91
- "values": [
92
- "none",
93
- "sm",
94
- "md",
95
- "lg"
96
- ]
67
+ "values": ["none", "sm", "md", "lg"]
97
68
  },
98
69
  "className": {
99
70
  "type": "string",
@@ -108,23 +79,21 @@
108
79
  },
109
80
  "usage": {
110
81
  "when": [
111
- "Arranging cards, tiles, or media in a responsive grid",
112
- "Building form layouts with multi-column fields",
113
- "Creating dashboard layouts with widgets",
114
- "Any content that should reflow across breakpoints"
82
+ "Cards, tiles, or media that reflow across breakpoints",
83
+ "Multi-column form layouts",
84
+ "Dashboard widget layouts"
115
85
  ],
116
86
  "whenNot": [
117
- "Single-column stacked content (use a simple flex column or Stack)",
118
- "Navigation bars or toolbars (use a dedicated nav component)",
119
- "Content that must not wrap (use inline layout)"
87
+ "One-directional lists (use Stack)",
88
+ "Editorial mosaics with feature tiles (use BentoGrid)",
89
+ "Navigation bars (use Header)"
120
90
  ],
121
91
  "guidelines": [
122
- "Use columns=\"auto\" with minChildWidth for grids that adapt without breakpoints",
123
- "Use responsive object { base: 1, md: 2, lg: 3 } when you need explicit control per breakpoint",
124
- "Use fixed column counts when exact column control is needed and responsiveness is not required",
125
- "Use Grid.Item with colSpan to create asymmetric layouts within a fixed grid",
126
- "Keep gap consistent within a contextmd is the default and works for most cases",
127
- "Pass DOM attributes (id, role, aria-*, data-*, event handlers) directly to Grid and Grid.Item roots when needed"
92
+ "columns=\"auto\" with minChildWidth adapts without breakpoints",
93
+ "Pass { base, md, lg } to columns for explicit per-breakpoint control",
94
+ "Numeric gaps (1-8) map to the same spacing scale as the tokens",
95
+ "Wrap a child in Grid.Item to span columns; colSpan=\"full\" spans the row",
96
+ "Keep source order equal to visual order Grid does not reorder for screen readers"
128
97
  ],
129
98
  "accessibility": [
130
99
  "Grid is purely visual — it does not affect reading order or semantics",
@@ -134,33 +103,28 @@
134
103
  "examples": [
135
104
  {
136
105
  "name": "Default",
137
- "description": "Basic 3-column grid",
138
- "code": "<Grid columns={3} gap=\"md\">\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Item 1</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Item 2</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Item 3</div>\n</Grid>"
106
+ "description": "A fixed count of equal columns.",
107
+ "code": "import { Box } from '@/components/Box';\nimport { Grid } from '@/components/Grid';\n\n<Box width=\"100%\">\n <Grid columns={3} gap=\"md\">\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">One</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Two</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Three</Box>\n </Grid>\n</Box>"
139
108
  },
140
109
  {
141
110
  "name": "Responsive",
142
- "description": "1 column on mobile, 2 on tablet, 3 on desktop",
143
- "code": "<Grid columns={{ base: 1, md: 2, lg: 3 }} gap=\"md\">\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Card 1</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Card 2</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Card 3</div>\n</Grid>"
111
+ "description": "Column count changes per breakpoint.",
112
+ "code": "import { Box } from '@/components/Box';\nimport { Grid } from '@/components/Grid';\n\n<Box width=\"100%\">\n <Grid columns={{ base: 1, md: 2, lg: 3 }} gap=\"md\">\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 1</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 2</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 3</Box>\n </Grid>\n</Box>"
144
113
  },
145
114
  {
146
115
  "name": "Auto-fill",
147
- "description": "Responsive grid that auto-fills based on minimum child width",
148
- "code": "<Grid columns=\"auto\" minChildWidth=\"12rem\" gap=\"md\">\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Card 1</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Card 2</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Card 3</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Card 4</div>\n</Grid>"
149
- },
150
- {
151
- "name": "Numeric Gap",
152
- "description": "Using number values (1-8) mapped to the spacing scale",
153
- "code": "<Grid columns={3} gap={4}>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Gap 4</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Gap 4</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Gap 4</div>\n</Grid>"
116
+ "description": "Columns fit themselves to a minimum child width — no breakpoints needed.",
117
+ "code": "import { Box } from '@/components/Box';\nimport { Grid } from '@/components/Grid';\n\n<Box width=\"100%\">\n <Grid columns=\"auto\" minChildWidth=\"10rem\" gap=\"md\">\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 1</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 2</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 3</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Card 4</Box>\n </Grid>\n</Box>"
154
118
  },
155
119
  {
156
120
  "name": "With Spanning",
157
- "description": "Grid items spanning multiple columns",
158
- "code": "<Grid columns={4} gap=\"md\">\n <Grid.Item colSpan={2}>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Spans 2 cols</div>\n </Grid.Item>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>1 col</div>\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>1 col</div>\n <Grid.Item colSpan=\"full\">\n <div style={{ padding: 'var(--fui-space-2)', background: 'var(--fui-bg-secondary)' }}>Full width</div>\n </Grid.Item>\n</Grid>"
121
+ "description": "Grid.Item stretches a child across columns.",
122
+ "code": "import { Box } from '@/components/Box';\nimport { Grid } from '@/components/Grid';\n\n<Box width=\"100%\">\n <Grid columns={4} gap=\"md\">\n <Grid.Item colSpan={2}>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Spans 2 columns</Box>\n </Grid.Item>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">1 col</Box>\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">1 col</Box>\n <Grid.Item colSpan=\"full\">\n <Box background=\"secondary\" rounded=\"sm\" padding=\"sm\">Full width</Box>\n </Grid.Item>\n </Grid>\n</Box>"
159
123
  },
160
124
  {
161
125
  "name": "Form Layout",
162
- "description": "Two-column form that collapses to single column on mobile",
163
- "code": "<Grid columns={{ base: 1, md: 2 }} gap=\"md\">\n <div style={{ padding: 'var(--fui-space-1)', background: 'var(--fui-bg-secondary)' }}>First Name</div>\n <div style={{ padding: 'var(--fui-space-1)', background: 'var(--fui-bg-secondary)' }}>Last Name</div>\n <Grid.Item colSpan=\"full\">\n <div style={{ padding: 'var(--fui-space-1)', background: 'var(--fui-bg-secondary)' }}>Email Address</div>\n </Grid.Item>\n</Grid>"
126
+ "description": "Paired fields with one full-width row.",
127
+ "code": "import { Box } from '@/components/Box';\nimport { Field } from '@/components/Field';\nimport { Grid } from '@/components/Grid';\nimport { Input } from '@/components/Input';\n\n<Box width=\"100%\">\n <Grid columns={{ base: 1, md: 2 }} gap=\"md\">\n <Field>\n <Field.Label>First name</Field.Label>\n <Input placeholder=\"Ada\" />\n </Field>\n <Field>\n <Field.Label>Last name</Field.Label>\n <Input placeholder=\"Lovelace\" />\n </Field>\n <Grid.Item colSpan=\"full\">\n <Field>\n <Field.Label>Email address</Field.Label>\n <Input type=\"email\" placeholder=\"ada@example.com\" />\n </Field>\n </Grid.Item>\n </Grid>\n</Box>"
164
128
  }
165
129
  ],
166
130
  "relations": [
@@ -88,10 +88,10 @@ function isResponsiveColumns(columns: GridProps["columns"]): columns is Responsi
88
88
  }
89
89
 
90
90
  const paddingClasses: Record<NonNullable<GridProps["padding"]>, string> = {
91
- none: styles.paddingNone,
92
- sm: styles.paddingSm,
93
- md: styles.paddingMd,
94
- lg: styles.paddingLg,
91
+ none: styles.paddingNone ?? "",
92
+ sm: styles.paddingSm ?? "",
93
+ md: styles.paddingMd ?? "",
94
+ lg: styles.paddingLg ?? "",
95
95
  };
96
96
 
97
97
  // ============================================
@@ -118,12 +118,12 @@ export const Grid = React.forwardRef<HTMLDivElement, GridProps>(function Grid(
118
118
  let inlineStyle: React.CSSProperties | undefined;
119
119
 
120
120
  if (columns === "auto") {
121
- columnsClass = styles.columnsAuto;
121
+ columnsClass = styles.columnsAuto ?? "";
122
122
  if (minChildWidth) {
123
123
  inlineStyle = { "--fui-grid-min-child-width": minChildWidth } as React.CSSProperties;
124
124
  }
125
125
  } else if (isResponsiveColumns(columns)) {
126
- columnsClass = styles.columnsResponsive;
126
+ columnsClass = styles.columnsResponsive ?? "";
127
127
  const vars: Record<string, string> = {};
128
128
  if (columns.base) vars["--fui-grid-cols"] = String(columns.base);
129
129
  if (columns.sm) vars["--fui-grid-cols-sm"] = String(columns.sm);
@@ -132,7 +132,7 @@ export const Grid = React.forwardRef<HTMLDivElement, GridProps>(function Grid(
132
132
  if (columns.xl) vars["--fui-grid-cols-xl"] = String(columns.xl);
133
133
  inlineStyle = vars as unknown as React.CSSProperties;
134
134
  } else {
135
- columnsClass = styles[`columns${columns}`];
135
+ columnsClass = styles[`columns${columns}`] ?? "";
136
136
  }
137
137
 
138
138
  inlineStyle = {
@@ -165,9 +165,9 @@ export const Grid = React.forwardRef<HTMLDivElement, GridProps>(function Grid(
165
165
  // ============================================
166
166
 
167
167
  const subgridClasses: Record<string, string> = {
168
- rows: styles.subgridRows,
169
- columns: styles.subgridColumns,
170
- both: styles.subgridBoth,
168
+ rows: styles.subgridRows ?? "",
169
+ columns: styles.subgridColumns ?? "",
170
+ both: styles.subgridBoth ?? "",
171
171
  };
172
172
 
173
173
  const GridItem = React.forwardRef<HTMLDivElement, GridItemProps>(function GridItem(
@@ -1,16 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Header",
4
- "description": "Composable header with slots for brand, navigation, search, and actions. Supports dropdown nav groups via Header.NavMenu. Designed for use within AppShell with responsive mobile support.",
5
- "category": "navigation",
6
- "tags": [
7
- "header",
8
- "navigation",
9
- "navbar",
10
- "brand",
11
- "layout",
12
- "dropdown"
13
- ],
4
+ "description": "Composes brand, navigation, search, and actions into one responsive app bar.",
5
+ "category": "layout",
6
+ "tags": ["header", "navigation", "navbar", "brand", "layout", "dropdown"],
14
7
  "status": "stable",
15
8
  "sourcePath": "src/components/Header/index.tsx",
16
9
  "exportName": "Header",
@@ -41,11 +34,7 @@
41
34
  "description": "Position behavior (usually controlled by AppShell)",
42
35
  "default": "static",
43
36
  "required": false,
44
- "values": [
45
- "static",
46
- "fixed",
47
- "sticky"
48
- ]
37
+ "values": ["static", "fixed", "sticky"]
49
38
  },
50
39
  "elevatedOnScroll": {
51
40
  "type": "boolean|object",
@@ -80,37 +69,22 @@
80
69
  },
81
70
  "usage": {
82
71
  "when": [
83
- "Primary site or app header inside AppShell",
84
- "Navigation bar with branding (default layout)",
85
- "Search and actions bar (sidebar layout)",
86
- "Header with responsive mobile menu trigger",
87
- "Grouping related nav items under a dropdown menu"
72
+ "Top-level navigation for an app or site",
73
+ "Inside AppShell.Header",
74
+ "Anywhere brand, nav, and actions share one row"
88
75
  ],
89
76
  "whenNot": [
90
- "Simple page titles (use heading elements)",
91
- "Footer navigation (use Footer component)",
92
- "Standalone sidebar navigation (use Sidebar directly)"
77
+ "Section headings inside a page (use a heading)",
78
+ "Toolbars scoped to one panel (use Toolbar)",
79
+ "Sidebar-only navigation (use Sidebar)"
93
80
  ],
94
81
  "guidelines": [
95
- "Use Header.SkipLink for accessibility (skip to main content)",
96
- "In default layout: include Header.Brand for logo",
97
- "In sidebar layout: omit Header.Brand (logo in sidebar)",
98
- "Header.Trigger integrates with SidebarProvider for mobile menus",
99
- "Header.Trigger composes your onClick handler with sidebar toggle behavior",
100
- "Header.Nav is hidden on mobile; use sidebar for mobile navigation",
101
- "Use Header.Spacer to push items apart",
102
- "Use Header.NavMenu to group related nav items under a dropdown",
103
- "Use Header.NavMenuItem inside Header.NavMenu for dropdown items",
104
- "Header sub-components forward DOM props (id, aria-*, data-*, handlers) to their rendered elements",
105
- "Header.Brand asChild composes custom link components while preserving canonical brand styling",
106
- "Header.NavItem asChild composes click handlers instead of overwriting the child handler",
107
- "Use elevatedOnScroll on sticky marketing headers that need a boundary after scrolling",
108
- "Use navAlign=\"center\" when navigation must stay centered independently of brand and actions",
109
- "Use container=\"page\" when the header should share a bounded page gutter",
110
- "Use Header.MobileNavActions for the primary action row inside Header.MobileNav",
111
- "Use the Header icons prop to replace internal mobile trigger and dropdown chevron icons with any icon package",
112
- "For rich dropdown content (titles, descriptions, icons), use NavigationMenu instead of Header.Nav",
113
- "NavigationMenu also provides an automatic mobile drawer, replacing Header.Trigger + Sidebar for mobile nav"
82
+ "Header.Spacer pushes the actions cluster to the right",
83
+ "Omit Header.Brand when the sidebar already shows the logo",
84
+ "container=\"page\" caps the content at page width for marketing bars",
85
+ "elevatedOnScroll adds a bottom border once the page scrolls",
86
+ "Pair Header.Trigger with Header.MobileNav for small screens",
87
+ "Header.SkipLink should be the first child"
114
88
  ],
115
89
  "accessibility": [
116
90
  "Include Header.SkipLink for keyboard users",
@@ -123,43 +97,38 @@
123
97
  "examples": [
124
98
  {
125
99
  "name": "For Default Layout",
126
- "description": "Header with brand, nav, and actions. Use with AppShell layout=\"default\".",
127
- "code": "<ThemeProvider defaultMode=\"light\">\n <Header>\n <Header.SkipLink />\n <Header.Trigger />\n <Header.Brand href=\"/\">MyApp</Header.Brand>\n <Header.Nav>\n <Header.NavItem href=\"/dashboard\" active>Dashboard</Header.NavItem>\n <Header.NavItem href=\"/projects\">Projects</Header.NavItem>\n <Header.NavItem href=\"/settings\">Settings</Header.NavItem>\n </Header.Nav>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n <Button variant=\"secondary\" size=\"sm\">Sign In</Button>\n </Header.Actions>\n </Header>\n</ThemeProvider>"
100
+ "description": "Brand, nav, and actions for AppShell layout=\"default\".",
101
+ "code": "import { Box } from '@/components/Box';\nimport { Button } from '@/components/Button';\nimport { Header } from '@/components/Header';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.SkipLink />\n <Header.Trigger />\n <Header.Brand href=\"/\">MyApp</Header.Brand>\n <Header.Nav>\n <Header.NavItem href=\"/dashboard\" active>Dashboard</Header.NavItem>\n <Header.NavItem href=\"/projects\">Projects</Header.NavItem>\n <Header.NavItem href=\"/settings\">Settings</Header.NavItem>\n </Header.Nav>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n <Button variant=\"secondary\" size=\"sm\">Sign In</Button>\n </Header.Actions>\n </Header>\n</Box>"
128
102
  },
129
103
  {
130
104
  "name": "Marketing Header",
131
- "description": "Sticky, page-width marketing header with centered navigation, scroll elevation, custom link composition, and mobile actions.",
132
- "code": "<Header position=\"sticky\" elevatedOnScroll navAlign=\"center\" container=\"page\">\n <Header.SkipLink href=\"#main-content\" />\n <Header.Brand asChild>\n <a href=\"/\" aria-label=\"Home\">Logo</a>\n </Header.Brand>\n <Header.Nav aria-label=\"Main navigation\">\n <Header.NavItem href=\"/docs\">Docs</Header.NavItem>\n </Header.Nav>\n <Header.Actions>\n <Button size=\"sm\">Start free</Button>\n </Header.Actions>\n <Header.Trigger />\n <Header.MobileNav>\n <Header.MobileNavLink href=\"/docs\">Docs</Header.MobileNavLink>\n <Header.MobileNavActions>\n <Button size=\"sm\">Start free</Button>\n </Header.MobileNavActions>\n </Header.MobileNav>\n</Header>"
105
+ "description": "Sticky page-width bar that gains a border on scroll, with a mobile drawer.",
106
+ "code": "import { Box } from '@/components/Box';\nimport { Button } from '@/components/Button';\nimport { Header } from '@/components/Header';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header position=\"sticky\" elevatedOnScroll navAlign=\"center\" container=\"page\">\n <Header.SkipLink href=\"#main-content\" />\n <Header.Brand asChild>\n <a href=\"/\" aria-label=\"Home\">Logo</a>\n </Header.Brand>\n <Header.Nav aria-label=\"Main navigation\">\n <Header.NavItem href=\"/docs\">Docs</Header.NavItem>\n <Header.NavItem href=\"/pricing\">Pricing</Header.NavItem>\n </Header.Nav>\n <Header.Actions>\n <Button size=\"sm\">Start free</Button>\n </Header.Actions>\n <Header.Trigger />\n <Header.MobileNav>\n <Header.MobileNavLink href=\"/docs\">Docs</Header.MobileNavLink>\n <Header.MobileNavLink href=\"/pricing\">Pricing</Header.MobileNavLink>\n <Header.MobileNavActions>\n <Button size=\"sm\">Start free</Button>\n </Header.MobileNavActions>\n </Header.MobileNav>\n </Header>\n</Box>"
133
107
  },
134
108
  {
135
109
  "name": "With Dropdown Nav",
136
- "description": "Header with a dropdown menu grouping related navigation links.",
137
- "code": "<ThemeProvider defaultMode=\"light\">\n <Header>\n <Header.Brand href=\"/\">MyApp</Header.Brand>\n <Header.Nav>\n <Header.NavItem href=\"/components\" active>Components</Header.NavItem>\n <Header.NavItem href=\"/blocks\">Blocks</Header.NavItem>\n <Header.NavMenu label=\"Docs\">\n <Header.NavMenuItem href=\"/getting-started\">Getting Started</Header.NavMenuItem>\n <Header.NavMenuItem href=\"/cli\">CLI Reference</Header.NavMenuItem>\n <Header.NavMenuItem href=\"/mcp\">MCP Tools</Header.NavMenuItem>\n </Header.NavMenu>\n <Header.NavItem href=\"/blog\">Blog</Header.NavItem>\n </Header.Nav>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n </Header.Actions>\n </Header>\n</ThemeProvider>"
110
+ "description": "Header.NavMenu groups related links behind one trigger.",
111
+ "code": "import { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.Brand href=\"/\">MyApp</Header.Brand>\n <Header.Nav>\n <Header.NavItem href=\"/components\" active>Components</Header.NavItem>\n <Header.NavItem href=\"/blocks\">Blocks</Header.NavItem>\n <Header.NavMenu label=\"Docs\">\n <Header.NavMenuItem href=\"/getting-started\">Getting Started</Header.NavMenuItem>\n <Header.NavMenuItem href=\"/cli\">CLI Reference</Header.NavMenuItem>\n <Header.NavMenuItem href=\"/mcp\">MCP Tools</Header.NavMenuItem>\n </Header.NavMenu>\n <Header.NavItem href=\"/blog\">Blog</Header.NavItem>\n </Header.Nav>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n </Header.Actions>\n </Header>\n</Box>"
138
112
  },
139
113
  {
140
114
  "name": "For Sidebar Layout",
141
- "description": "Header without brand (logo is in sidebar). Use with AppShell layout=\"sidebar\" or \"sidebar-floating\".",
142
- "code": "<ThemeProvider defaultMode=\"light\">\n <Header>\n <Header.SkipLink />\n <Header.Trigger />\n <Header.Search>\n <Input placeholder=\"Search...\" style={{ width: '240px' }} />\n </Header.Search>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n </Header.Actions>\n </Header>\n</ThemeProvider>"
115
+ "description": "No brand — the logo lives in the sidebar instead.",
116
+ "code": "import { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Input } from '@/components/Input';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.SkipLink />\n <Header.Trigger />\n <Header.Search>\n <Input placeholder=\"Search...\" style={{ width: '240px' }} />\n </Header.Search>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n </Header.Actions>\n </Header>\n</Box>"
143
117
  },
144
118
  {
145
119
  "name": "Minimal",
146
- "description": "Clean header with just trigger and actions",
147
- "code": "<ThemeProvider defaultMode=\"light\">\n <Header>\n <Header.Trigger />\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n </Header.Actions>\n </Header>\n</ThemeProvider>"
148
- },
149
- {
150
- "name": "With Search",
151
- "description": "Header featuring a prominent search input",
152
- "code": "<ThemeProvider defaultMode=\"light\">\n <Header>\n <Header.Brand>Docs</Header.Brand>\n <Header.Search>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n background: 'var(--fui-bg-secondary)',\n borderRadius: '6px',\n color: 'var(--fui-text-tertiary)',\n fontSize: '14px',\n width: '280px'\n }}>\n <MagnifyingGlass size={16} /> Search documentation...\n </div>\n </Header.Search>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n </Header.Actions>\n </Header>\n</ThemeProvider>"
120
+ "description": "Just the drawer trigger and actions.",
121
+ "code": "import { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.Trigger />\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n </Header.Actions>\n </Header>\n</Box>"
153
122
  },
154
123
  {
155
124
  "name": "With Skip Link",
156
- "description": "Accessible header with skip link for keyboard navigation",
157
- "code": "<Header>\n <Header.SkipLink href=\"#main-content\">Skip to content</Header.SkipLink>\n <Header.Brand>Accessible App</Header.Brand>\n <Header.Nav>\n <Header.NavItem href=\"/\" active>Home</Header.NavItem>\n <Header.NavItem href=\"/about\">About</Header.NavItem>\n </Header.Nav>\n</Header>"
125
+ "description": "Header.SkipLink gives keyboard users a jump to main content.",
126
+ "code": "import { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.SkipLink href=\"#main-content\">Skip to content</Header.SkipLink>\n <Header.Brand>Accessible App</Header.Brand>\n <Header.Nav>\n <Header.NavItem href=\"/\" active>Home</Header.NavItem>\n <Header.NavItem href=\"/about\">About</Header.NavItem>\n </Header.Nav>\n </Header>\n</Box>"
158
127
  },
159
128
  {
160
129
  "name": "With NavigationMenu",
161
- "description": "Header using NavigationMenu for rich dropdown content panels with titles, descriptions, and automatic mobile drawer.",
162
- "code": "<ThemeProvider defaultMode=\"light\">\n <Header>\n <Header.Brand href=\"/\">MyApp</Header.Brand>\n <NavigationMenu aria-label=\"Site navigation\">\n <NavigationMenu.List>\n <NavigationMenu.Item value=\"products\">\n <NavigationMenu.Trigger>Products</NavigationMenu.Trigger>\n <NavigationMenu.Content>\n <div style={{ display: 'flex', flexDirection: 'column', padding: '4px', minWidth: '200px' }}>\n <NavigationMenu.Link href=\"/analytics\" title=\"Analytics\" description=\"Track your metrics.\" />\n <NavigationMenu.Link href=\"/automation\" title=\"Automation\" description=\"Automate workflows.\" />\n </div>\n </NavigationMenu.Content>\n </NavigationMenu.Item>\n <NavigationMenu.Item>\n <NavigationMenu.Link href=\"/pricing\">Pricing</NavigationMenu.Link>\n </NavigationMenu.Item>\n </NavigationMenu.List>\n <NavigationMenu.Viewport />\n </NavigationMenu>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n <Button variant=\"primary\" size=\"sm\">Sign Up</Button>\n </Header.Actions>\n </Header>\n</ThemeProvider>"
130
+ "description": "Rich dropdown panels with titles and descriptions.",
131
+ "code": "import { Box } from '@/components/Box';\nimport { Button } from '@/components/Button';\nimport { Header } from '@/components/Header';\nimport { NavigationMenu } from '@/components/NavigationMenu';\nimport { Stack } from '@/components/Stack';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box width=\"100%\" border rounded=\"md\" overflow=\"hidden\">\n <Header>\n <Header.Brand href=\"/\">MyApp</Header.Brand>\n <Header.Nav>\n <NavigationMenu aria-label=\"Site navigation\">\n <NavigationMenu.List>\n <NavigationMenu.Item value=\"products\">\n <NavigationMenu.Trigger>Products</NavigationMenu.Trigger>\n <NavigationMenu.Content>\n <Box padding=\"xs\" style={{ minWidth: '200px' }}>\n <Stack gap=\"none\">\n <NavigationMenu.Link href=\"/analytics\" title=\"Analytics\" description=\"Track your metrics.\" />\n <NavigationMenu.Link href=\"/automation\" title=\"Automation\" description=\"Automate workflows.\" />\n </Stack>\n </Box>\n </NavigationMenu.Content>\n </NavigationMenu.Item>\n <NavigationMenu.Item>\n <NavigationMenu.Link href=\"/pricing\">Pricing</NavigationMenu.Link>\n </NavigationMenu.Item>\n </NavigationMenu.List>\n <NavigationMenu.Viewport />\n </NavigationMenu>\n </Header.Nav>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"md\" />\n <Button variant=\"primary\" size=\"sm\">Sign Up</Button>\n </Header.Actions>\n </Header>\n</Box>"
163
132
  }
164
133
  ],
165
134
  "relations": [
@@ -197,12 +166,7 @@
197
166
  "Header.NavMenu provides dropdown groups via Base UI Menu",
198
167
  "Header.MobileNavActions provides an action row inside the mobile drawer"
199
168
  ],
200
- "a11yRules": [
201
- "A11Y_HEADER_LANDMARK",
202
- "A11Y_NAV_LABEL",
203
- "A11Y_SKIP_LINK",
204
- "A11Y_BUTTON_LABEL"
205
- ]
169
+ "a11yRules": ["A11Y_HEADER_LANDMARK", "A11Y_NAV_LABEL", "A11Y_SKIP_LINK", "A11Y_BUTTON_LABEL"]
206
170
  },
207
171
  "ai": {
208
172
  "compositionPattern": "compound",