@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,16 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Menu",
4
- "description": "Dropdown menu for actions and commands. Supports submenus, check items, radio groups, and keyboard shortcuts.",
5
- "category": "feedback",
6
- "tags": [
7
- "menu",
8
- "dropdown",
9
- "actions",
10
- "context-menu",
11
- "commands",
12
- "submenu"
13
- ],
4
+ "description": "Drops a list of actions below a trigger, driveable entirely by keyboard.",
5
+ "category": "overlays",
6
+ "tags": ["menu", "dropdown", "actions", "context-menu", "commands", "submenu"],
14
7
  "status": "stable",
15
8
  "sourcePath": "src/components/Menu/index.tsx",
16
9
  "exportName": "Menu",
@@ -52,26 +45,23 @@
52
45
  },
53
46
  "usage": {
54
47
  "when": [
55
- "Overflow actions that dont fit in the toolbar",
56
- "Context menus (right-click)",
57
- "User account menus",
58
- "Grouped actions with separators",
59
- "Nested menus with submenus"
48
+ "Actions that do not fit in the toolbar",
49
+ "Right-click context actions",
50
+ "Account and profile actions",
51
+ "Related actions that read better grouped"
60
52
  ],
61
53
  "whenNot": [
62
- "Selecting from options (use Select)",
63
- "Navigation (use Tabs or navigation components)",
64
- "Form selection (use Select or RadioGroup)"
54
+ "Picking a value for a form (use Select)",
55
+ "Moving between pages or views (use Tabs or NavigationMenu)",
56
+ "One of a few visible choices (use RadioGroup)"
65
57
  ],
66
58
  "guidelines": [
67
- "Group related actions with Menu.Group",
68
- "Use separators to divide action categories",
69
- "Include keyboard shortcuts where applicable",
70
- "Use danger variant for destructive actions",
71
- "Keep menu items under 10-12 for usability",
72
- "Use checked prop on Menu.Item for simple selection state",
73
- "Use Menu.Submenu for nested secondary options",
74
- "Menu.Trigger supports asChild for links/router-link components (single valid element child required)"
59
+ "Group related actions and separate the rest",
60
+ "Show the keyboard shortcut where one exists",
61
+ "Mark destructive actions with the danger variant",
62
+ "Past a dozen rows, reach for Command instead",
63
+ "Nest at most one level of submenu",
64
+ "asChild on Trigger needs a single element child"
75
65
  ],
76
66
  "accessibility": [
77
67
  "Full keyboard navigation with arrow keys",
@@ -84,37 +74,37 @@
84
74
  "examples": [
85
75
  {
86
76
  "name": "Default",
87
- "description": "Basic dropdown menu",
77
+ "description": "Plain actions, one per row.",
88
78
  "code": "<Menu>\n <Menu.Trigger asChild>\n <Button variant=\"secondary\">Actions</Button>\n </Menu.Trigger>\n <Menu.Content>\n <Menu.Item onSelect={() => {}}>Edit</Menu.Item>\n <Menu.Item onSelect={() => {}}>Duplicate</Menu.Item>\n <Menu.Separator />\n <Menu.Item danger onSelect={() => {}}>Delete</Menu.Item>\n </Menu.Content>\n</Menu>"
89
79
  },
90
80
  {
91
81
  "name": "With Shortcuts",
92
- "description": "Menu items with keyboard shortcuts",
82
+ "description": "Trailing keys teach the faster path.",
93
83
  "code": "<Menu>\n <Menu.Trigger asChild>\n <Button variant=\"secondary\">Edit</Button>\n </Menu.Trigger>\n <Menu.Content>\n <Menu.Item shortcut=\"Ctrl+Z\" onSelect={() => {}}>Undo</Menu.Item>\n <Menu.Item shortcut=\"Ctrl+Y\" onSelect={() => {}}>Redo</Menu.Item>\n <Menu.Separator />\n <Menu.Item shortcut=\"Ctrl+C\" onSelect={() => {}}>Copy</Menu.Item>\n <Menu.Item shortcut=\"Ctrl+V\" onSelect={() => {}}>Paste</Menu.Item>\n </Menu.Content>\n</Menu>"
94
84
  },
95
85
  {
96
86
  "name": "With Groups",
97
- "description": "Menu with labeled groups",
87
+ "description": "Labels separate unrelated actions.",
98
88
  "code": "<Menu>\n <Menu.Trigger asChild>\n <Button variant=\"secondary\">Options</Button>\n </Menu.Trigger>\n <Menu.Content>\n <Menu.Group>\n <Menu.GroupLabel>View</Menu.GroupLabel>\n <Menu.Item onSelect={() => {}}>Zoom In</Menu.Item>\n <Menu.Item onSelect={() => {}}>Zoom Out</Menu.Item>\n </Menu.Group>\n <Menu.Separator />\n <Menu.Group>\n <Menu.GroupLabel>Layout</Menu.GroupLabel>\n <Menu.Item onSelect={() => {}}>Grid View</Menu.Item>\n <Menu.Item onSelect={() => {}}>List View</Menu.Item>\n </Menu.Group>\n </Menu.Content>\n</Menu>"
99
89
  },
100
90
  {
101
91
  "name": "With Checkboxes",
102
- "description": "Menu with toggleable checkbox options",
92
+ "description": "Rows that stay open while you toggle them.",
103
93
  "code": "<Menu>\n <Menu.Trigger asChild>\n <Button variant=\"secondary\">Display</Button>\n </Menu.Trigger>\n <Menu.Content>\n <Menu.CheckboxItem defaultChecked>Show Grid</Menu.CheckboxItem>\n <Menu.CheckboxItem defaultChecked>Show Rulers</Menu.CheckboxItem>\n <Menu.CheckboxItem>Show Guides</Menu.CheckboxItem>\n </Menu.Content>\n</Menu>"
104
94
  },
105
95
  {
106
96
  "name": "With Checked Items",
107
- "description": "Filter menu with check marks indicating active selections",
97
+ "description": "Ticks mark which filters are on.",
108
98
  "code": "<CheckedItemsMenuDemo />"
109
99
  },
110
100
  {
111
101
  "name": "With Submenu",
112
- "description": "Menu with nested submenu for grouped secondary options",
102
+ "description": "Secondary options nest one level deep.",
113
103
  "code": "<Menu>\n <Menu.Trigger asChild>\n <Button variant=\"secondary\">File</Button>\n </Menu.Trigger>\n <Menu.Content>\n <Menu.Item onSelect={() => {}}>New File</Menu.Item>\n <Menu.Item onSelect={() => {}}>Open</Menu.Item>\n <Menu.Separator />\n <Menu.Submenu>\n <Menu.SubmenuTrigger>Export As</Menu.SubmenuTrigger>\n <Menu.Content side=\"right\" align=\"start\">\n <Menu.Item onSelect={() => {}}>PNG</Menu.Item>\n <Menu.Item onSelect={() => {}}>SVG</Menu.Item>\n <Menu.Item onSelect={() => {}}>PDF</Menu.Item>\n </Menu.Content>\n </Menu.Submenu>\n <Menu.Separator />\n <Menu.Item danger onSelect={() => {}}>Delete</Menu.Item>\n </Menu.Content>\n</Menu>"
114
104
  },
115
105
  {
116
106
  "name": "Link Trigger",
117
- "description": "Use asChild with a non-button trigger element",
107
+ "description": "asChild lets a link open it.",
118
108
  "code": "<Menu>\n <Menu.Trigger asChild>\n <a href=\"#menu-actions\">Open menu</a>\n </Menu.Trigger>\n <Menu.Content>\n <Menu.Item onSelect={() => {}}>Inspect</Menu.Item>\n <Menu.Item onSelect={() => {}}>Rename</Menu.Item>\n </Menu.Content>\n</Menu>"
119
109
  }
120
110
  ],
@@ -140,10 +130,7 @@
140
130
  "Menu.Item shortcut: string - keyboard shortcut text",
141
131
  "Menu.Item checked: boolean - check indicator for selection state"
142
132
  ],
143
- "a11yRules": [
144
- "A11Y_MENU_KEYBOARD",
145
- "A11Y_MENU_ROLE"
146
- ]
133
+ "a11yRules": ["A11Y_MENU_KEYBOARD", "A11Y_MENU_ROLE"]
147
134
  },
148
135
  "ai": {
149
136
  "compositionPattern": "compound",
@@ -160,10 +147,7 @@
160
147
  "Submenu",
161
148
  "SubmenuTrigger"
162
149
  ],
163
- "requiredChildren": [
164
- "Trigger",
165
- "Content"
166
- ],
150
+ "requiredChildren": ["Trigger", "Content"],
167
151
  "commonPatterns": [
168
152
  "<Menu><Menu.Trigger asChild><Button>Actions</Button></Menu.Trigger><Menu.Content><Menu.Item>{action1}</Menu.Item><Menu.Separator /><Menu.Item danger>{delete}</Menu.Item></Menu.Content></Menu>"
169
153
  ]
@@ -1,4 +1,5 @@
1
1
  @use "../../tokens/variables" as *;
2
+ @use "../../recipes/layout" as layout;
2
3
  @use "../../recipes/popup" as popup;
3
4
  @use "../../recipes/typography" as typography;
4
5
 
@@ -6,23 +7,37 @@
6
7
  z-index: var(--fui-overlay-layer-anchored, 52);
7
8
  outline: none;
8
9
  pointer-events: auto;
10
+
11
+ // The popup is absolutely positioned inside the positioner whenever a
12
+ // Menu.Viewport is present (Base UI anchors it with top/bottom: 0). Without an
13
+ // explicit box the positioner collapses to zero height and any flipped
14
+ // (side="top") menu renders a full popup-height away from its trigger.
15
+ inline-size: var(--positioner-width);
16
+ block-size: var(--positioner-height);
9
17
  }
10
18
 
11
19
  .popup {
12
20
  @include popup.container;
13
21
 
14
- min-inline-size: var(--fui-menu-min-inline, 192px);
22
+ min-inline-size: layout.measure("menu-min");
15
23
  margin: 0;
16
24
  list-style: none;
17
- opacity: 1;
18
- transform: none;
25
+ opacity: 0;
26
+ transform: scale(0.95);
19
27
  transform-origin: var(--transform-origin);
28
+ transition:
29
+ opacity var(--fui-transition-fast, $fui-transition-fast),
30
+ transform var(--fui-transition-fast, $fui-transition-fast);
31
+
32
+ &[data-open] {
33
+ opacity: 1;
34
+ transform: scale(1);
35
+ }
20
36
 
21
- &[data-open],
22
37
  &[data-starting-style],
23
38
  &[data-ending-style] {
24
- opacity: 1;
25
- transform: none;
39
+ opacity: 0;
40
+ transform: scale(0.95);
26
41
  }
27
42
  }
28
43
 
@@ -126,8 +141,8 @@
126
141
  block-size: 0;
127
142
  margin-inline-start: auto;
128
143
  border-style: solid;
129
- border-width: var(--fui-menu-submenu-caret-block, 4px) 0 var(--fui-menu-submenu-caret-block, 4px)
130
- var(--fui-menu-submenu-caret-inline, 6px);
144
+ border-width: var(--fui-raw-space-4, 4px) 0 var(--fui-raw-space-4, 4px)
145
+ var(--fui-raw-space-6, 6px);
131
146
  border-color: transparent transparent transparent var(--fui-text-secondary, $fui-text-secondary);
132
147
  }
133
148
 
@@ -1,15 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Message",
4
- "description": "Individual chat message display with role-based styling",
4
+ "description": "Shows one chat message, styled by who sent it.",
5
5
  "category": "ai",
6
- "tags": [
7
- "message",
8
- "chat",
9
- "ai",
10
- "conversation",
11
- "bubble"
12
- ],
6
+ "tags": ["message", "chat", "ai", "conversation", "bubble"],
13
7
  "status": "stable",
14
8
  "sourcePath": "src/components/Message/index.tsx",
15
9
  "exportName": "Message",
@@ -26,11 +20,7 @@
26
20
  "type": "enum",
27
21
  "description": "Message role determines styling and alignment",
28
22
  "required": true,
29
- "values": [
30
- "user",
31
- "assistant",
32
- "system"
33
- ]
23
+ "values": ["user", "assistant", "system"]
34
24
  },
35
25
  "children": {
36
26
  "type": "node",
@@ -42,12 +32,7 @@
42
32
  "description": "Message state",
43
33
  "default": "complete",
44
34
  "required": false,
45
- "values": [
46
- "sending",
47
- "streaming",
48
- "complete",
49
- "error"
50
- ]
35
+ "values": ["sending", "streaming", "complete", "error"]
51
36
  },
52
37
  "timestamp": {
53
38
  "type": "object",
@@ -67,24 +52,24 @@
67
52
  },
68
53
  "usage": {
69
54
  "when": [
70
- "Displaying individual messages in a chat interface",
71
- "Building AI assistant or chatbot UIs",
72
- "Need role-based message styling (user vs assistant)",
73
- "Messages need actions like copy, regenerate, or feedback"
55
+ "Individual turns in a chat transcript",
56
+ "AI assistant and chatbot interfaces",
57
+ "User and assistant turns that must read differently",
58
+ "Turns carrying copy, regenerate, or feedback actions"
74
59
  ],
75
60
  "whenNot": [
76
- "Simple text display without chat context (use Text)",
77
- "Notification-style messages (use Alert or Toast)",
78
- "Comment threads with nested replies (use Card with custom layout)"
61
+ "Plain text with no chat context (use Text)",
62
+ "Notifications (use Alert or Toast)",
63
+ "Threads with nested replies (use Card with a custom layout)"
79
64
  ],
80
65
  "guidelines": [
81
- "Always provide a role prop to determine styling",
82
- "Use status prop to show message state (sending, streaming, error)",
83
- "Pass avatar={null}, or set showAvatars={false} on the parent ConversationList, to hide avatars; avatarless assistant content is flush while the user's own bubble keeps compact space-1/space-2 padding",
84
- "User message bubbles are capped at 80% of the available inline measure so they remain visually distinct from assistant responses",
85
- "User and assistant message chrome uses neutral surface tokens with the primary text foreground; reserve brand accent for actions or semantic state",
86
- "Consider showing timestamps for longer conversations",
87
- "Provide hover actions for assistant messages (copy, regenerate)"
66
+ "Always set role it drives alignment, avatar, and chrome",
67
+ "status covers sending, streaming, and error",
68
+ "Hide avatars with avatar={null}, or showAvatars={false} on ConversationList",
69
+ "User bubbles cap at 80% of the inline measure so the two sides stay distinct",
70
+ "Chrome stays on neutral surfaces; reserve accent for actions and semantic state",
71
+ "Add timestamps once a conversation runs long",
72
+ "Give assistant turns hover actions such as copy and regenerate"
88
73
  ],
89
74
  "accessibility": [
90
75
  "Uses semantic HTML for message structure",
@@ -96,43 +81,43 @@
96
81
  "examples": [
97
82
  {
98
83
  "name": "User Message",
99
- "description": "Message from the user (right-aligned)",
84
+ "description": "Right-aligned and capped at 80% of the available width.",
100
85
  "code": "<Message role=\"user\">\n <Message.Content>\n Hello! Can you help me with a coding question?\n </Message.Content>\n</Message>"
101
86
  },
102
87
  {
103
88
  "name": "Assistant Message",
104
- "description": "Response from the AI assistant",
89
+ "description": "Left-aligned with an avatar and a wider measure.",
105
90
  "code": "<Message role=\"assistant\">\n <Message.Content>\n Of course! I'd be happy to help. What would you like to know?\n </Message.Content>\n</Message>"
106
91
  },
107
92
  {
108
93
  "name": "System Message",
109
- "description": "System notification or context",
94
+ "description": "Centred and quiet, for context rather than conversation.",
110
95
  "code": "<Message role=\"system\">\n <Message.Content>\n Conversation started. Model: GPT-4\n </Message.Content>\n</Message>"
111
96
  },
112
97
  {
113
98
  "name": "Streaming",
114
- "description": "Message being streamed (with cursor)",
99
+ "description": "A blinking caret trails the text as it arrives.",
115
100
  "code": "<Message role=\"assistant\" status=\"streaming\">\n <Message.Content>\n I'm currently generating a response for you\n </Message.Content>\n</Message>"
116
101
  },
117
102
  {
118
103
  "name": "With Timestamp",
119
- "description": "Message with timestamp display",
104
+ "description": "A relative send time sits beneath the bubble.",
120
105
  "code": "<Message role=\"assistant\" timestamp={new Date(Date.now() - 300000)}>\n <Message.Content>\n This message was sent 5 minutes ago.\n </Message.Content>\n <Message.Timestamp />\n</Message>"
121
106
  },
122
107
  {
123
108
  "name": "Error State",
124
- "description": "Message that failed to send",
109
+ "description": "A failed send turns the bubble and its border red.",
125
110
  "code": "<Message role=\"user\" status=\"error\">\n <Message.Content>\n This message failed to send.\n </Message.Content>\n</Message>"
126
111
  },
127
112
  {
128
113
  "name": "Custom Avatars",
129
- "description": "Messages with image-based avatars",
114
+ "description": "Photos replace the default glyphs on both sides.",
130
115
  "code": "<>\n <Message\n role=\"user\"\n avatar={<Message.Avatar src=\"https://i.pravatar.cc/64?u=user\" alt=\"Jane\" />}\n >\n <Message.Content>\n Can you help me understand this error?\n </Message.Content>\n </Message>\n <Message\n role=\"assistant\"\n avatar={<Message.Avatar src=\"https://i.pravatar.cc/64?u=bot\" alt=\"AI Assistant\" />}\n >\n <Message.Content>\n Sure! Let me take a look at that for you.\n </Message.Content>\n </Message>\n</>"
131
116
  },
132
117
  {
133
118
  "name": "With Actions",
134
- "description": "Message with hover actions",
135
- "code": "<Message\n role=\"assistant\"\n actions={\n <>\n <button style={{ padding: '4px 8px', fontSize: '12px' }}>Copy</button>\n <button style={{ padding: '4px 8px', fontSize: '12px' }}>Regenerate</button>\n </>\n }\n>\n <Message.Content>\n Hover over this message to see the actions.\n </Message.Content>\n</Message>"
119
+ "description": "Controls stay hidden until the pointer enters the row.",
120
+ "code": "<Message\n role=\"assistant\"\n actions={\n <>\n <Button variant=\"ghost\" size=\"xs\">\n Copy\n </Button>\n <Button variant=\"ghost\" size=\"xs\">\n Regenerate\n </Button>\n </>\n }\n>\n <Message.Content>\n Hover over this message to see the actions.\n </Message.Content>\n</Message>"
136
121
  }
137
122
  ],
138
123
  "relations": [
@@ -163,19 +148,11 @@
163
148
  "Avatar.src: string - image URL for avatar",
164
149
  "Avatar.alt: string - alt text for image avatar"
165
150
  ],
166
- "a11yRules": [
167
- "A11Y_COLOR_CONTRAST",
168
- "A11Y_MOTION_PREFERENCE"
169
- ]
151
+ "a11yRules": ["A11Y_COLOR_CONTRAST", "A11Y_MOTION_PREFERENCE"]
170
152
  },
171
153
  "ai": {
172
154
  "compositionPattern": "compound",
173
- "subComponents": [
174
- "Content",
175
- "Actions",
176
- "Timestamp",
177
- "Avatar"
178
- ]
155
+ "subComponents": ["Content", "Actions", "Timestamp", "Avatar"]
179
156
  },
180
157
  "provenance": {
181
158
  "source": "migrated",
@@ -26,12 +26,16 @@
26
26
  flex-direction: row-reverse;
27
27
  margin-inline-start: auto;
28
28
 
29
+ // Cap against the conversation width, not the bubble's own shrink-wrapped
30
+ // width. On .content the percentage resolves against an already-collapsed
31
+ // parent and squeezes short messages until they break mid-word.
32
+ max-inline-size: 80%;
33
+
29
34
  .body {
30
35
  align-items: flex-end;
31
36
  }
32
37
 
33
38
  .content {
34
- max-inline-size: 80%;
35
39
  background-color: var(--fui-bg-tertiary, $fui-bg-tertiary);
36
40
  color: var(--fui-text-primary, $fui-text-primary);
37
41
  }
@@ -58,7 +62,8 @@
58
62
  }
59
63
 
60
64
  .error .content {
61
- border: var(--fui-stroke-hairline) solid var(--fui-color-danger-border, $fui-color-danger-border);
65
+ border: var(--fui-stroke-hairline, 1px) solid
66
+ var(--fui-color-danger-border, $fui-color-danger-border);
62
67
  background: var(--fui-color-danger-bg, $fui-color-danger-bg);
63
68
  color: var(--fui-color-danger-text, $fui-color-danger-text);
64
69
  }
@@ -102,7 +107,9 @@
102
107
  padding-block: layout.gap("sm");
103
108
  padding-inline: layout.gap("md");
104
109
  border-radius: var(--fui-radius-lg, $fui-radius-lg);
105
- overflow-wrap: anywhere;
110
+ // break-word, not anywhere: `anywhere` drops min-content to a single
111
+ // character, collapsing every shrink-to-fit ancestor around the bubble.
112
+ overflow-wrap: break-word;
106
113
 
107
114
  p {
108
115
  @include prose.paragraph;
@@ -140,9 +147,9 @@
140
147
  display: inline-block;
141
148
  inline-size: 0.5em;
142
149
  block-size: 1em;
143
- margin-inline-start: var(--fui-raw-space-2);
150
+ margin-inline-start: var(--fui-raw-space-2, 2px);
144
151
  background-color: currentColor;
145
- animation: blink 1s step-end infinite;
152
+ animation: blink var(--fui-duration-pulse, $fui-duration-pulse) step-end infinite;
146
153
  }
147
154
 
148
155
  @keyframes blink {
@@ -1,18 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "NavigationMenu",
4
- "description": "Rich navigation menu for site headers with dropdown content panels, animated viewport transitions, and automatic mobile drawer. Supports structured links with titles, descriptions, and icons.",
4
+ "description": "Site navigation whose dropdowns become a drawer on small screens.",
5
5
  "category": "navigation",
6
- "tags": [
7
- "navigation",
8
- "menu",
9
- "header",
10
- "dropdown",
11
- "navbar",
12
- "mobile",
13
- "responsive",
14
- "drawer"
15
- ],
6
+ "tags": ["navigation", "menu", "header", "dropdown", "navbar", "mobile", "responsive", "drawer"],
16
7
  "status": "stable",
17
8
  "sourcePath": "src/components/NavigationMenu/index.tsx",
18
9
  "exportName": "NavigationMenu",
@@ -24,7 +15,8 @@
24
15
  "orientation: horizontal|vertical (default: horizontal)",
25
16
  "delayDuration: number (default: 200)",
26
17
  "skipDelayDuration: number (default: 300)",
27
- "icons: object"
18
+ "icons: object",
19
+ "mobileBreakpoint: md|lg (default: md)"
28
20
  ],
29
21
  "props": {
30
22
  "children": {
@@ -53,10 +45,7 @@
53
45
  "description": "'horizontal' | 'vertical'",
54
46
  "default": "horizontal",
55
47
  "required": false,
56
- "values": [
57
- "horizontal",
58
- "vertical"
59
- ]
48
+ "values": ["horizontal", "vertical"]
60
49
  },
61
50
  "delayDuration": {
62
51
  "type": "number",
@@ -74,30 +63,37 @@
74
63
  "type": "object",
75
64
  "description": "Optional icon overrides for triggerChevron, mobileMenu, mobileClose, and drawerClose controls",
76
65
  "required": false
66
+ },
67
+ "mobileBreakpoint": {
68
+ "type": "enum",
69
+ "description": "Viewport breakpoint below which the mobile drawer replaces desktop navigation",
70
+ "default": "md",
71
+ "required": false,
72
+ "values": ["md", "lg"]
77
73
  }
78
74
  },
79
75
  "usage": {
80
76
  "when": [
81
- "Site-level header navigation with rich dropdown content",
82
- "Navigation with titles, descriptions, and icons in dropdowns",
83
- "Responsive navigation that converts to a mobile drawer automatically",
84
- "Multi-section navigation requiring animated viewport transitions"
77
+ "Header navigation with more than links",
78
+ "Dropdowns carrying titles, descriptions, or icons",
79
+ "Navigation that must survive a phone screen",
80
+ "Several sections that animate between each other"
85
81
  ],
86
82
  "whenNot": [
87
- "Simple flat navigation without dropdowns (use Header.Nav)",
88
- "Application menus with actions like cut/paste (use Menu)",
89
- "Sidebar navigation (use Sidebar)",
90
- "Breadcrumb trail navigation (use Breadcrumbs)"
83
+ "Flat links with no dropdowns (use Header.Nav)",
84
+ "Application actions like cut and paste (use Menu)",
85
+ "Persistent side navigation (use Sidebar)",
86
+ "Showing where the user already is (use Breadcrumbs)"
91
87
  ],
92
88
  "guidelines": [
93
- "Place inside Header component for site-level navigation",
94
- "Use NavigationMenu.Viewport for animated content panel transitions",
95
- "Use NavigationMenu.MobileContent to add extra sections to the mobile drawer",
96
- "Use structured links (title + description) for rich dropdown content",
97
- "Use simple NavigationMenu.Link for items without dropdown content",
98
- "NavigationMenu.Link asChild composes click handlers and respects event.preventDefault()",
99
- "Triggers open on hover (desktop) with configurable delay",
100
- "Use the icons prop to replace trigger chevrons and mobile drawer controls with icons from any package"
89
+ "Place it inside Header for site-level navigation",
90
+ "Add Viewport to animate between panels",
91
+ "Use MobileContent for sections that only make sense in the drawer",
92
+ "Title plus description for rich panels, plain Link for the rest",
93
+ "asChild on Link composes your handler and honours preventDefault()",
94
+ "Desktop triggers open on hover after a configurable delay",
95
+ "Point icons at your own icon package to replace the chevrons",
96
+ "Set mobileBreakpoint=\"lg\" when the shell drops its sidebar below 1024px"
101
97
  ],
102
98
  "accessibility": [
103
99
  "Uses disclosure pattern (not menu role) per W3C guidance",
@@ -110,27 +106,27 @@
110
106
  "examples": [
111
107
  {
112
108
  "name": "Default",
113
- "description": "Two trigger items with dropdown content and one direct link",
109
+ "description": "Two dropdowns beside one plain link.",
114
110
  "code": "<NavigationMenu>\n <NavigationMenu.List>\n <NavigationMenu.Item value=\"products\">\n <NavigationMenu.Trigger>Products</NavigationMenu.Trigger>\n <NavigationMenu.Content>\n <NavigationMenu.Link href=\"/analytics\" title=\"Analytics\" description=\"Track your metrics and KPIs.\" />\n <NavigationMenu.Link href=\"/automation\" title=\"Automation\" description=\"Automate your workflows.\" />\n </NavigationMenu.Content>\n </NavigationMenu.Item>\n <NavigationMenu.Item value=\"resources\">\n <NavigationMenu.Trigger>Resources</NavigationMenu.Trigger>\n <NavigationMenu.Content>\n <NavigationMenu.Link href=\"/docs\" title=\"Documentation\" description=\"Comprehensive API reference.\" />\n <NavigationMenu.Link href=\"/blog\" title=\"Blog\" description=\"Latest news and updates.\" />\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>"
115
111
  },
116
112
  {
117
113
  "name": "With Rich Content",
118
- "description": "Grid layout with icons, titles, and descriptions",
114
+ "description": "A grid of icons, titles, and descriptions.",
119
115
  "code": "<NavigationMenu>\n <NavigationMenu.List>\n <NavigationMenu.Item value=\"platform\">\n <NavigationMenu.Trigger>Platform</NavigationMenu.Trigger>\n <NavigationMenu.Content>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '4px', padding: '8px', minWidth: '400px' }}>\n <NavigationMenu.Link\n href=\"/dashboard\"\n title=\"Dashboard\"\n description=\"Overview of your project metrics.\"\n />\n <NavigationMenu.Link\n href=\"/analytics\"\n title=\"Analytics\"\n description=\"Deep dive into your data.\"\n />\n <NavigationMenu.Link\n href=\"/reports\"\n title=\"Reports\"\n description=\"Generate custom reports.\"\n />\n <NavigationMenu.Link\n href=\"/settings\"\n title=\"Settings\"\n description=\"Configure your workspace.\"\n />\n </div>\n </NavigationMenu.Content>\n </NavigationMenu.Item>\n </NavigationMenu.List>\n <NavigationMenu.Viewport />\n</NavigationMenu>"
120
116
  },
121
117
  {
122
118
  "name": "With Simple Links",
123
- "description": "Mix of triggers with simple link lists and plain links",
119
+ "description": "Link lists where descriptions would be noise.",
124
120
  "code": "<NavigationMenu>\n <NavigationMenu.List>\n <NavigationMenu.Item value=\"company\">\n <NavigationMenu.Trigger>Company</NavigationMenu.Trigger>\n <NavigationMenu.Content>\n <div style={{ display: 'flex', flexDirection: 'column', padding: '4px', minWidth: '160px' }}>\n <NavigationMenu.Link href=\"/about\">About</NavigationMenu.Link>\n <NavigationMenu.Link href=\"/careers\">Careers</NavigationMenu.Link>\n <NavigationMenu.Link href=\"/contact\">Contact</NavigationMenu.Link>\n </div>\n </NavigationMenu.Content>\n </NavigationMenu.Item>\n <NavigationMenu.Item>\n <NavigationMenu.Link href=\"/blog\">Blog</NavigationMenu.Link>\n </NavigationMenu.Item>\n <NavigationMenu.Item>\n <NavigationMenu.Link href=\"/docs\">Docs</NavigationMenu.Link>\n </NavigationMenu.Item>\n </NavigationMenu.List>\n <NavigationMenu.Viewport />\n</NavigationMenu>"
125
121
  },
126
122
  {
127
123
  "name": "With Featured Card",
128
- "description": "Highlighted featured item alongside regular links",
124
+ "description": "One promoted item leads the panel.",
129
125
  "code": "<NavigationMenu>\n <NavigationMenu.List>\n <NavigationMenu.Item value=\"learn\">\n <NavigationMenu.Trigger>Learn</NavigationMenu.Trigger>\n <NavigationMenu.Content>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '8px', padding: '8px', minWidth: '420px' }}>\n <NavigationMenu.Link\n href=\"/quickstart\"\n title=\"Quick Start\"\n description=\"Get up and running in 5 minutes with our getting started guide.\"\n featured\n />\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n <NavigationMenu.Link href=\"/docs\" title=\"Documentation\" description=\"API reference and guides.\" />\n <NavigationMenu.Link href=\"/examples\" title=\"Examples\" description=\"Browse example projects.\" />\n </div>\n </div>\n </NavigationMenu.Content>\n </NavigationMenu.Item>\n </NavigationMenu.List>\n <NavigationMenu.Viewport />\n</NavigationMenu>"
130
126
  },
131
127
  {
132
128
  "name": "Vertical",
133
- "description": "Vertical orientation with content panels to the right",
129
+ "description": "Panels open to the side instead of below.",
134
130
  "code": "<div style={{ display: 'flex' }}>\n <NavigationMenu orientation=\"vertical\">\n <NavigationMenu.List>\n <NavigationMenu.Item value=\"overview\">\n <NavigationMenu.Trigger>Overview</NavigationMenu.Trigger>\n <NavigationMenu.Content>\n <div style={{ padding: '8px', minWidth: '200px' }}>\n <NavigationMenu.Link href=\"/intro\" title=\"Introduction\" description=\"Learn the basics.\" />\n </div>\n </NavigationMenu.Content>\n </NavigationMenu.Item>\n <NavigationMenu.Item value=\"guides\">\n <NavigationMenu.Trigger>Guides</NavigationMenu.Trigger>\n <NavigationMenu.Content>\n <div style={{ padding: '8px', minWidth: '200px' }}>\n <NavigationMenu.Link href=\"/install\" title=\"Installation\" description=\"Get started quickly.\" />\n <NavigationMenu.Link href=\"/config\" title=\"Configuration\" description=\"Customize your setup.\" />\n </div>\n </NavigationMenu.Content>\n </NavigationMenu.Item>\n </NavigationMenu.List>\n <NavigationMenu.Viewport />\n </NavigationMenu>\n</div>"
135
131
  }
136
132
  ],
@@ -163,15 +159,12 @@
163
159
  "orientation: horizontal | vertical — layout direction",
164
160
  "delayDuration: number — hover open delay (default: 200ms)",
165
161
  "icons: { triggerChevron?, mobileMenu?, mobileClose?, drawerClose? } — custom internal control icons",
162
+ "mobileBreakpoint: md | lg — mobile drawer breakpoint (default: md)",
166
163
  "NavigationMenu.Link: title + description + icon for structured links, or children for simple links",
167
164
  "NavigationMenu.Link asChild: composes child and menu click handlers (preventDefault keeps menu open)",
168
165
  "NavigationMenu.MobileContent: slot for extra mobile-only sections"
169
166
  ],
170
- "a11yRules": [
171
- "A11Y_DISCLOSURE_PATTERN",
172
- "A11Y_KEYBOARD_NAV",
173
- "A11Y_FOCUS_TRAP"
174
- ]
167
+ "a11yRules": ["A11Y_DISCLOSURE_PATTERN", "A11Y_KEYBOARD_NAV", "A11Y_FOCUS_TRAP"]
175
168
  },
176
169
  "ai": {
177
170
  "compositionPattern": "compound",
@@ -187,9 +180,7 @@
187
180
  "MobileContent",
188
181
  "MobileSection"
189
182
  ],
190
- "requiredChildren": [
191
- "List"
192
- ],
183
+ "requiredChildren": ["List"],
193
184
  "commonPatterns": [
194
185
  "<NavigationMenu><NavigationMenu.List><NavigationMenu.Item value=\"docs\"><NavigationMenu.Trigger>Docs</NavigationMenu.Trigger><NavigationMenu.Content><NavigationMenu.Link href=\"/guides\" title=\"Guides\" description=\"Learn the basics\" /></NavigationMenu.Content></NavigationMenu.Item></NavigationMenu.List><NavigationMenu.Viewport /></NavigationMenu>"
195
186
  ]