@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
@@ -10,8 +10,13 @@
10
10
  }
11
11
 
12
12
  .title {
13
- margin: 0 0 var(--fui-space-2, $fui-space-2);
14
- padding: 0 var(--fui-space-2, $fui-space-2);
13
+ @include navigation.properties;
14
+
15
+ margin: 0 0 var(--fui-toc-title-gap, var(--fui-space-2, #{$fui-space-2}));
16
+ // Same inline inset as `.link` (navigation.row) so the label and the index
17
+ // share one left edge — extra title padding made "On This Page" sit inward
18
+ // of the items below it.
19
+ padding-inline: var(--fui-toc-inline-inset, var(--fui-navigation-inline-inset));
15
20
  }
16
21
 
17
22
  // The quiet index is flush; links and group headers share the title inset.
@@ -40,6 +45,9 @@
40
45
 
41
46
  display: flex;
42
47
  align-items: center;
48
+ min-block-size: var(--fui-toc-row-track, var(--fui-navigation-row-track));
49
+ padding-inline: var(--fui-toc-inline-inset, var(--fui-navigation-inline-inset));
50
+ gap: var(--fui-toc-content-gap, var(--fui-navigation-content-gap));
43
51
  border-radius: var(--fui-radius-md, $fui-radius-md);
44
52
  color: var(--fui-text-secondary, $fui-text-secondary);
45
53
  text-decoration: none;
@@ -48,7 +56,7 @@
48
56
  color var(--fui-transition-fast, $fui-transition-fast);
49
57
 
50
58
  &:hover {
51
- background-color: var(--fui-bg-hover, $fui-bg-hover);
59
+ background-color: var(--fui-toc-hover-bg, var(--fui-bg-hover, #{$fui-bg-hover}));
52
60
  color: var(--fui-text-primary, $fui-text-primary);
53
61
  }
54
62
 
@@ -104,6 +112,9 @@
104
112
 
105
113
  display: flex;
106
114
  align-items: center;
115
+ min-block-size: var(--fui-toc-section-track, var(--fui-navigation-section-track));
116
+ padding-inline: var(--fui-toc-inline-inset, var(--fui-navigation-inline-inset));
117
+ gap: var(--fui-toc-content-gap, var(--fui-navigation-content-gap));
107
118
  width: 100%;
108
119
  border-radius: var(--fui-radius-md, $fui-radius-md);
109
120
  color: var(--fui-text-tertiary, $fui-text-tertiary);
@@ -122,7 +133,7 @@
122
133
  color var(--fui-transition-fast, $fui-transition-fast);
123
134
 
124
135
  &:hover {
125
- background-color: var(--fui-bg-hover, $fui-bg-hover);
136
+ background-color: var(--fui-toc-hover-bg, var(--fui-bg-hover, #{$fui-bg-hover}));
126
137
  color: var(--fui-text-secondary, $fui-text-secondary);
127
138
  }
128
139
 
@@ -169,5 +180,4 @@
169
180
  .groupChevron {
170
181
  transition: none;
171
182
  }
172
-
173
183
  }
@@ -16,6 +16,8 @@ export interface TableOfContentsProps extends React.HTMLAttributes<HTMLElement>
16
16
  title?: string;
17
17
  /** Hide the title */
18
18
  hideTitle?: boolean;
19
+ /** Hide indented items and nested groups. Defaults to false. */
20
+ hideSubItems?: boolean;
19
21
  }
20
22
 
21
23
  export interface TableOfContentsItemProps extends Omit<
@@ -63,9 +65,10 @@ export interface TableOfContentsGroupProps {
63
65
 
64
66
  interface TocContextValue {
65
67
  depth: number;
68
+ hideSubItems: boolean;
66
69
  }
67
70
 
68
- const TocContext = React.createContext<TocContextValue>({ depth: 0 });
71
+ const TocContext = React.createContext<TocContextValue>({ depth: 0, hideSubItems: false });
69
72
 
70
73
  // ============================================
71
74
  // Icons
@@ -95,6 +98,7 @@ function TableOfContentsRoot({
95
98
  label = "Table of contents",
96
99
  title = "On This Page",
97
100
  hideTitle = false,
101
+ hideSubItems = false,
98
102
  className,
99
103
  "aria-label": ariaLabel,
100
104
  ...htmlProps
@@ -108,7 +112,7 @@ function TableOfContentsRoot({
108
112
  {title}
109
113
  </Text>
110
114
  )}
111
- <TocContext.Provider value={{ depth: 0 }}>
115
+ <TocContext.Provider value={{ depth: 0, hideSubItems }}>
112
116
  <ul className={styles.list}>{children}</ul>
113
117
  </TocContext.Provider>
114
118
  </nav>
@@ -124,22 +128,29 @@ function TableOfContentsItem({
124
128
  trailing,
125
129
  className,
126
130
  onClick,
127
- href: _href,
131
+ href,
128
132
  ...htmlProps
129
133
  }: TableOfContentsItemProps) {
130
- const { depth } = React.useContext(TocContext);
134
+ const { depth, hideSubItems } = React.useContext(TocContext);
131
135
  const effectiveDepth = depth > 0 ? depth : indent ? 1 : 0;
132
136
 
137
+ if (hideSubItems && effectiveDepth > 0) return null;
138
+
133
139
  const linkClasses = [styles.link, active && styles.active, className].filter(Boolean).join(" ");
134
140
 
135
141
  const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {
136
142
  onClick?.(e);
137
- if (e.defaultPrevented) return;
143
+ // An explicit href is a route, not an in-page anchor: let the browser
144
+ // (or a wrapping router link) own navigation.
145
+ if (e.defaultPrevented || href) return;
138
146
 
139
147
  e.preventDefault();
140
148
  const el = document.getElementById(id);
141
149
  if (el) {
142
- el.scrollIntoView({ behavior: "smooth" });
150
+ const prefersReducedMotion =
151
+ typeof window.matchMedia === "function" &&
152
+ window.matchMedia("(prefers-reduced-motion: reduce)").matches;
153
+ el.scrollIntoView({ behavior: prefersReducedMotion ? "auto" : "smooth" });
143
154
  window.history.replaceState(null, "", `#${id}`);
144
155
  }
145
156
  };
@@ -148,7 +159,7 @@ function TableOfContentsItem({
148
159
  <li className={styles.item} data-depth={effectiveDepth} data-active={active || undefined}>
149
160
  <a
150
161
  {...htmlProps}
151
- href={`#${id}`}
162
+ href={href ?? `#${id}`}
152
163
  className={linkClasses}
153
164
  onClick={handleClick}
154
165
  aria-current={active ? "location" : undefined}
@@ -194,9 +205,11 @@ function TableOfContentsGroup({
194
205
  disabled = false,
195
206
  active = false,
196
207
  }: TableOfContentsGroupProps) {
197
- const { depth } = React.useContext(TocContext);
208
+ const { depth, hideSubItems } = React.useContext(TocContext);
198
209
  const [open, setOpen] = useControlledOpen(controlledOpen, defaultOpen, onOpenChange);
199
210
 
211
+ if (hideSubItems) return null;
212
+
200
213
  const isToggleable = collapsible && !disabled;
201
214
  const isOpen = isToggleable ? open : true;
202
215
 
@@ -237,7 +250,11 @@ function TableOfContentsGroup({
237
250
  <div className={headerClasses}>{headerContent}</div>
238
251
  )}
239
252
  </li>
240
- {isOpen && <TocContext.Provider value={{ depth: depth + 1 }}>{children}</TocContext.Provider>}
253
+ {isOpen && (
254
+ <TocContext.Provider value={{ depth: depth + 1, hideSubItems }}>
255
+ {children}
256
+ </TocContext.Provider>
257
+ )}
241
258
  </>
242
259
  );
243
260
  }
@@ -1,14 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Tabs",
4
- "description": "Organize content into switchable panels. Use for related content that benefits from a compact, navigable layout.",
4
+ "description": "Swaps between sibling panels without leaving the page.",
5
5
  "category": "navigation",
6
- "tags": [
7
- "tabs",
8
- "navigation",
9
- "panels",
10
- "content-switcher"
11
- ],
6
+ "tags": ["tabs", "navigation", "panels", "content-switcher"],
12
7
  "status": "stable",
13
8
  "sourcePath": "src/components/Tabs/index.tsx",
14
9
  "exportName": "Tabs",
@@ -46,41 +41,35 @@
46
41
  "description": "Tab list orientation",
47
42
  "default": "horizontal",
48
43
  "required": false,
49
- "values": [
50
- "horizontal",
51
- "vertical"
52
- ]
44
+ "values": ["horizontal", "vertical"]
53
45
  },
54
46
  "variant": {
55
47
  "type": "enum",
56
48
  "description": "Default visual style for Tabs.List (can be overridden on Tabs.List)",
57
49
  "default": "underline",
58
50
  "required": false,
59
- "values": [
60
- "underline",
61
- "pills"
62
- ]
51
+ "values": ["underline", "pills"]
63
52
  }
64
53
  },
65
54
  "usage": {
66
55
  "when": [
67
- "Organizing related content into sections",
68
- "Reducing page scrolling by grouping content",
69
- "Settings pages with multiple categories",
70
- "Dashboard views with different data perspectives"
56
+ "Sibling sections of equal weight",
57
+ "Cutting scroll on a long page",
58
+ "Settings split by category",
59
+ "One data set seen several ways"
71
60
  ],
72
61
  "whenNot": [
73
- "Primary navigation (use sidebar or header nav)",
74
- "Sequential steps (use Stepper or wizard)",
75
- "Comparing content side-by-side",
76
- "Very long lists of options (use Select or Menu)"
62
+ "Moving between pages (use Sidebar or header navigation)",
63
+ "Steps in an order (use Stepper)",
64
+ "Content the user compares side by side",
65
+ "More options than fit in a row (use Select)"
77
66
  ],
78
67
  "guidelines": [
79
- "Keep tab labels short (1-2 words)",
80
- "Order tabs by usage frequency or logical sequence",
81
- "Avoid more than 5-6 tabs; consider sub-navigation for more",
82
- "Tab content should be roughly equivalent in scope",
83
- "Use pills variant for contained sections, underline for page-level tabs"
68
+ "One or two words per label",
69
+ "Order by how often each panel is used",
70
+ "Past five or six tabs, split the page instead",
71
+ "Keep panels comparable in depth",
72
+ "Pills inside cards, underline at page level"
84
73
  ],
85
74
  "accessibility": [
86
75
  "Keyboard navigation with arrow keys",
@@ -91,22 +80,22 @@
91
80
  "examples": [
92
81
  {
93
82
  "name": "Underline",
94
- "description": "Default underline style tabs",
83
+ "description": "A rule tracks the active panel.",
95
84
  "code": "<Tabs defaultValue=\"overview\" variant=\"underline\">\n <Tabs.List>\n <Tabs.Tab value=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab value=\"analytics\">Analytics</Tabs.Tab>\n <Tabs.Tab value=\"settings\">Settings</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"overview\">\n <p>Overview content goes here.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"analytics\">\n <p>Analytics content goes here.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"settings\">\n <p>Settings content goes here.</p>\n </Tabs.Panel>\n</Tabs>"
96
85
  },
97
86
  {
98
87
  "name": "Pills",
99
- "description": "Pill-style tabs for contained sections",
88
+ "description": "A filled track suits panels inside a card.",
100
89
  "code": "<Tabs defaultValue=\"all\" variant=\"pills\">\n <Tabs.List>\n <Tabs.Tab value=\"all\">All</Tabs.Tab>\n <Tabs.Tab value=\"active\">Active</Tabs.Tab>\n <Tabs.Tab value=\"archived\">Archived</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"all\">\n <p>Showing all items.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"active\">\n <p>Showing active items only.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"archived\">\n <p>Showing archived items.</p>\n </Tabs.Panel>\n</Tabs>"
101
90
  },
102
91
  {
103
92
  "name": "With Disabled",
104
- "description": "Tabs with a disabled option",
93
+ "description": "An unavailable panel stays visible but unreachable.",
105
94
  "code": "<Tabs defaultValue=\"general\" variant=\"underline\">\n <Tabs.List>\n <Tabs.Tab value=\"general\">General</Tabs.Tab>\n <Tabs.Tab value=\"security\">Security</Tabs.Tab>\n <Tabs.Tab value=\"billing\" disabled>Billing</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"general\">\n <p>General settings panel.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"security\">\n <p>Security settings panel.</p>\n </Tabs.Panel>\n</Tabs>"
106
95
  },
107
96
  {
108
97
  "name": "List Variant Override",
109
- "description": "Tabs sets a default variant, and Tabs.List can override it per list",
98
+ "description": "One list can opt out of the root's style.",
110
99
  "code": "<Tabs defaultValue=\"overview\" variant=\"pills\">\n <Tabs.List variant=\"underline\">\n <Tabs.Tab value=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab value=\"activity\">Activity</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"overview\">\n <p>Root sets pills, but this list overrides to underline.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"activity\">\n <p>Per-list variant override example.</p>\n </Tabs.Panel>\n</Tabs>"
111
100
  }
112
101
  ],
@@ -130,22 +119,12 @@
130
119
  "variant: underline|pills - default style for Tabs.List",
131
120
  "Tabs.List variant?: underline|pills - optional per-list override"
132
121
  ],
133
- "a11yRules": [
134
- "A11Y_TABS_KEYBOARD",
135
- "A11Y_TABS_LABELS"
136
- ]
122
+ "a11yRules": ["A11Y_TABS_KEYBOARD", "A11Y_TABS_LABELS"]
137
123
  },
138
124
  "ai": {
139
125
  "compositionPattern": "compound",
140
- "subComponents": [
141
- "List",
142
- "Tab",
143
- "Panel"
144
- ],
145
- "requiredChildren": [
146
- "List",
147
- "Panel"
148
- ],
126
+ "subComponents": ["List", "Tab", "Panel"],
127
+ "requiredChildren": ["List", "Panel"],
149
128
  "commonPatterns": [
150
129
  "<Tabs defaultValue=\"tab1\"><Tabs.List><Tabs.Tab value=\"tab1\">{label1}</Tabs.Tab><Tabs.Tab value=\"tab2\">{label2}</Tabs.Tab></Tabs.List><Tabs.Panel value=\"tab1\">{content1}</Tabs.Panel><Tabs.Panel value=\"tab2\">{content2}</Tabs.Panel></Tabs>"
151
130
  ]
@@ -44,7 +44,7 @@
44
44
  border-radius: var(--fui-radius-lg, $fui-radius-lg);
45
45
  padding: 0;
46
46
  gap: 0;
47
- box-shadow: inset 0 0 0 1px
47
+ box-shadow: inset 0 0 0 var(--fui-stroke-hairline, 1px)
48
48
  var(
49
49
  --fui-tabs-pills-border,
50
50
  color-mix(in srgb, var(--fui-border, #{$fui-border}) 72%, transparent)
@@ -95,6 +95,7 @@ function TabsRoot({
95
95
  onValueChange={onValueChange}
96
96
  orientation={orientation}
97
97
  className={classes}
98
+ data-slot="tabs"
98
99
  >
99
100
  {children}
100
101
  </BaseTabs.Root>
@@ -114,7 +115,12 @@ function TabsList({ children, variant, size: sizeProp, className, ...htmlProps }
114
115
  return (
115
116
  <TabsVariantContext.Provider value={resolvedVariant}>
116
117
  <TabsSizeContext.Provider value={size}>
117
- <BaseTabs.List {...htmlProps} className={classes}>
118
+ <BaseTabs.List
119
+ {...htmlProps}
120
+ className={classes}
121
+ data-slot="tabs-list"
122
+ data-variant={resolvedVariant}
123
+ >
118
124
  {children}
119
125
  {resolvedVariant === "underline" && <BaseTabs.Indicator className={styles.indicator} />}
120
126
  </BaseTabs.List>
@@ -131,7 +137,7 @@ function Tab({ children, value, disabled, className }: TabProps) {
131
137
  const classes = [styles.tab, sizeClass, variantClass, className].filter(Boolean).join(" ");
132
138
 
133
139
  return (
134
- <BaseTabs.Tab value={value} disabled={disabled} className={classes}>
140
+ <BaseTabs.Tab value={value} disabled={disabled} className={classes} data-slot="tabs-tab">
135
141
  {children}
136
142
  </BaseTabs.Tab>
137
143
  );
@@ -148,7 +154,13 @@ function TabsPanel({
148
154
  const classes = [styles.panel, flush && styles.panelFlush, className].filter(Boolean).join(" ");
149
155
 
150
156
  return (
151
- <BaseTabs.Panel {...htmlProps} value={value} keepMounted={keepMounted} className={classes}>
157
+ <BaseTabs.Panel
158
+ {...htmlProps}
159
+ value={value}
160
+ keepMounted={keepMounted}
161
+ className={classes}
162
+ data-slot="tabs-panel"
163
+ >
152
164
  {children}
153
165
  </BaseTabs.Panel>
154
166
  );
@@ -1,15 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Text",
4
- "description": "Typography component for rendering text with consistent styling. Supports various sizes, weights, colors, and semantic elements.",
4
+ "description": "Applies the type scale to any text element, without hand-rolling font rules.",
5
5
  "category": "display",
6
- "tags": [
7
- "text",
8
- "typography",
9
- "heading",
10
- "paragraph",
11
- "font"
12
- ],
6
+ "tags": ["text", "typography", "heading", "paragraph", "font"],
13
7
  "status": "stable",
14
8
  "sourcePath": "src/components/Text/index.tsx",
15
9
  "exportName": "Text",
@@ -19,7 +13,7 @@
19
13
  "variant: section-label",
20
14
  "size: 2xs|xs|sm|base|md|lg|xl|2xl|3xl|4xl",
21
15
  "weight: normal|medium|semibold|bold (default: \"normal\")",
22
- "color: primary|secondary|tertiary|muted|success|warning|danger (default: \"primary\")",
16
+ "color: primary|secondary|tertiary|muted|accent|success|warning|danger (default: \"primary\")",
23
17
  "font: sans|mono (default: sans)",
24
18
  "truncate: boolean",
25
19
  "lineClamp: number",
@@ -67,63 +61,34 @@
67
61
  "type": "enum",
68
62
  "description": "Preset text variant",
69
63
  "required": false,
70
- "values": [
71
- "section-label"
72
- ]
64
+ "values": ["section-label", "eyebrow"]
73
65
  },
74
66
  "size": {
75
67
  "type": "enum",
76
68
  "description": "Font size. 2xs (10), xs (12), sm/base (14), md (15 prose body), lg (20), xl (24), 2xl (30), 3xl (36 page title), 4xl (48 hero).",
77
69
  "required": false,
78
- "values": [
79
- "2xs",
80
- "xs",
81
- "sm",
82
- "base",
83
- "md",
84
- "lg",
85
- "xl",
86
- "2xl",
87
- "3xl",
88
- "4xl"
89
- ]
70
+ "values": ["2xs", "xs", "sm", "base", "md", "lg", "xl", "2xl", "3xl", "4xl"]
90
71
  },
91
72
  "weight": {
92
73
  "type": "enum",
93
74
  "description": "Font weight",
94
75
  "default": "\"normal\"",
95
76
  "required": false,
96
- "values": [
97
- "normal",
98
- "medium",
99
- "semibold",
100
- "bold"
101
- ]
77
+ "values": ["normal", "medium", "semibold", "bold"]
102
78
  },
103
79
  "color": {
104
80
  "type": "enum",
105
- "description": "Text color (muted is an alias for tertiary; success/warning/danger are for a run of text that carries a state on its own \u2014 prefer Badge or Alert when the state deserves a container)",
81
+ "description": "Text color (muted is an alias for tertiary; success/warning/danger are for a run of text that carries a state on its own prefer Badge or Alert when the state deserves a container)",
106
82
  "default": "\"primary\"",
107
83
  "required": false,
108
- "values": [
109
- "primary",
110
- "secondary",
111
- "tertiary",
112
- "muted",
113
- "success",
114
- "warning",
115
- "danger"
116
- ]
84
+ "values": ["primary", "secondary", "tertiary", "muted", "accent", "success", "warning", "danger"]
117
85
  },
118
86
  "font": {
119
87
  "type": "enum",
120
88
  "description": "Font family",
121
89
  "default": "sans",
122
90
  "required": false,
123
- "values": [
124
- "sans",
125
- "mono"
126
- ]
91
+ "values": ["sans", "mono"]
127
92
  },
128
93
  "truncate": {
129
94
  "type": "boolean",
@@ -143,57 +108,55 @@
143
108
  },
144
109
  "usage": {
145
110
  "when": [
146
- "Displaying text with specific typography styles",
147
- "Creating headings, paragraphs, or labels",
148
- "Text that needs truncation or line clamping",
149
- "Consistent typography across the application"
111
+ "Any text that should sit on the type scale",
112
+ "Headings and paragraphs that need real tags",
113
+ "Text that must truncate or clamp"
150
114
  ],
151
115
  "whenNot": [
152
- "Complex rich text (use a rich text editor)",
153
- "Code display (use CodeBlock)",
154
- "Interactive text (use Link or Button)"
116
+ "Rich or authored content (use Markdown)",
117
+ "Code (use CodeBlock)",
118
+ "Anything clickable (use Link or Button)"
155
119
  ],
156
120
  "guidelines": [
157
- "Use semantic elements (h1-h6, p) via the \"as\" prop",
158
- "Maintain heading hierarchy for accessibility",
159
- "Use color variants sparingly for visual hierarchy",
160
- "Consider truncation for user-generated content"
121
+ "Pick the tag with as, the look with size — they are separate decisions",
122
+ "Never skip heading levels to get a smaller heading",
123
+ "Color is for hierarchy and state, not decoration",
124
+ "Truncated text needs the full string in title or a tooltip"
161
125
  ],
162
126
  "accessibility": [
163
- "Use proper heading levels (h1-h6) for document structure",
164
- "Semantic elements convey meaning to screen readers",
165
- "Truncated text should have full content in title/tooltip"
127
+ "as keeps the document outline intact for screen readers",
128
+ "Clamped text still exposes its full content to assistive tech"
166
129
  ]
167
130
  },
168
131
  "examples": [
169
132
  {
170
133
  "name": "Sizes",
171
- "description": "Different text sizes",
134
+ "description": "Ten steps from caption to hero, all on the same scale.",
172
135
  "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <Text size=\"2xs\">Extra extra small (2xs — 10px)</Text>\n <Text size=\"xs\">Extra small (xs — 12px)</Text>\n <Text size=\"sm\">Small (sm — 14px)</Text>\n <Text size=\"base\">Base size (14px)</Text>\n <Text size=\"md\">Medium prose body (md — 15px)</Text>\n <Text size=\"lg\">Large (lg — 20px)</Text>\n <Text size=\"xl\">Extra large (xl — 24px)</Text>\n <Text size=\"2xl\">Extra extra large (2xl — 30px)</Text>\n <Text size=\"3xl\">Page title (3xl — 36px)</Text>\n <Text size=\"4xl\">Hero display (4xl — 48px)</Text>\n</div>"
173
136
  },
174
137
  {
175
138
  "name": "Weights",
176
- "description": "Different font weights",
139
+ "description": "Four weights — reach past semibold only for real emphasis.",
177
140
  "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <Text weight=\"normal\">Normal weight</Text>\n <Text weight=\"medium\">Medium weight</Text>\n <Text weight=\"semibold\">Semibold weight</Text>\n <Text weight=\"bold\">Bold weight</Text>\n</div>"
178
141
  },
179
142
  {
180
143
  "name": "Colors",
181
- "description": "Different text colors",
144
+ "description": "Dimmer tones push text back; success and danger carry state.",
182
145
  "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <Text color=\"primary\">Primary color (default)</Text>\n <Text color=\"secondary\">Secondary color</Text>\n <Text color=\"tertiary\">Tertiary color</Text>\n <Text color=\"muted\">Muted color (alias for tertiary)</Text>\n</div>"
183
146
  },
184
147
  {
185
148
  "name": "Semantic Elements",
186
- "description": "Using appropriate HTML elements",
149
+ "description": "The as prop picks the tag, so the outline stays correct.",
187
150
  "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <Text as=\"h1\" size=\"3xl\" weight=\"semibold\">Heading 1</Text>\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Heading 2</Text>\n <Text as=\"h3\" size=\"lg\" weight=\"semibold\">Heading 3</Text>\n <Text as=\"p\" size=\"md\" color=\"secondary\">\n This is a paragraph of text that demonstrates the Text component\n with semantic paragraph element.\n </Text>\n</div>"
188
151
  },
189
152
  {
190
153
  "name": "Monospace",
191
- "description": "Monospace font for code-like text",
154
+ "description": "Fixed width for IDs, keys, and anything meant to be compared.",
192
155
  "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <Text font=\"mono\" size=\"sm\">const greeting = \"Hello, World!\";</Text>\n <Text font=\"mono\" size=\"sm\" color=\"secondary\">npm install @usefragments/ui</Text>\n</div>"
193
156
  },
194
157
  {
195
158
  "name": "Truncation",
196
- "description": "Text truncation with ellipsis",
159
+ "description": "One line with an ellipsis, or clamp to a set number of lines.",
197
160
  "code": "<div style={{ width: '200px', display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <Text truncate>\n This is a very long text that will be truncated with an ellipsis when it overflows.\n </Text>\n <Text truncate lineClamp={2}>\n This text will be clamped to two lines. Any content beyond two lines\n will be hidden and replaced with an ellipsis at the end.\n </Text>\n</div>"
198
161
  }
199
162
  ],
@@ -219,21 +182,16 @@
219
182
  "as: string - HTML element",
220
183
  "size: 2xs|xs|sm|base|md|lg|xl|2xl|3xl|4xl - font size (px: 10/12/14/14/15/20/24/30/36/48)",
221
184
  "weight: normal|medium|semibold|bold - font weight",
222
- "color: primary|secondary|tertiary|muted|success|warning|danger - text color (muted = tertiary; semantic colours for inline state)",
185
+ "color: primary|secondary|tertiary|muted|accent|success|warning|danger - text color (muted = tertiary; accent = brand spend; semantic colours for inline state)",
223
186
  "font: sans|mono - font family",
224
187
  "truncate: boolean - enable truncation",
225
188
  "lineClamp: number - max lines"
226
189
  ],
227
- "a11yRules": [
228
- "A11Y_HEADING_HIERARCHY",
229
- "A11Y_SEMANTIC_ELEMENTS"
230
- ]
190
+ "a11yRules": ["A11Y_HEADING_HIERARCHY", "A11Y_SEMANTIC_ELEMENTS"]
231
191
  },
232
192
  "ai": {
233
193
  "compositionPattern": "compound",
234
- "subComponents": [
235
- "Root"
236
- ]
194
+ "subComponents": ["Root"]
237
195
  },
238
196
  "provenance": {
239
197
  "source": "migrated",
@@ -13,6 +13,17 @@
13
13
  @include typography.role("ui-compact");
14
14
  }
15
15
 
16
+ // Eyebrow: the small-caps label that names a surface above its statement
17
+ // (page label, card section head). Always tertiary ink — it is never the
18
+ // thing the reader is meant to look at.
19
+ .variant-eyebrow {
20
+ @include typography.role("caption");
21
+ font-weight: var(--fui-font-weight-semibold, $fui-font-weight-semibold);
22
+ letter-spacing: var(--fui-letter-spacing-wide, $fui-letter-spacing-wide);
23
+ text-transform: uppercase;
24
+ color: var(--fui-text-tertiary, $fui-text-tertiary);
25
+ }
26
+
16
27
  @each $role
17
28
  in (
18
29
  "caption",
@@ -23,6 +34,7 @@
23
34
  "title-sm",
24
35
  "title-md",
25
36
  "title-lg",
37
+ "display",
26
38
  "code"
27
39
  )
28
40
  {
@@ -107,22 +119,27 @@
107
119
  color: var(--fui-text-tertiary, $fui-text-tertiary);
108
120
  }
109
121
 
122
+ .color-accent {
123
+ color: var(--fui-color-accent, $fui-color-accent);
124
+ }
125
+
110
126
  // Semantic colours, for a run of text that carries a state on its own — a
111
127
  // count going over budget, an inline "expired", a figure in the red. Where
112
128
  // there is a component for the job (Badge, Alert, Callout) use that instead:
113
129
  // this is for the cases where the state is one word inside a line, and
114
130
  // wrapping it in a box would be more chrome than the fact is worth. Colour is
115
- // never the only carrier — the words still have to say it.
131
+ // never the only carrier — the words still have to say it. Text uses the
132
+ // same *-text stop as Badge so inline ink and chips stay one family.
116
133
  .color-success {
117
- color: var(--fui-color-success, $fui-color-success);
134
+ color: var(--fui-color-success-text, $fui-color-success-text);
118
135
  }
119
136
 
120
137
  .color-warning {
121
- color: var(--fui-color-warning, $fui-color-warning);
138
+ color: var(--fui-color-warning-text, $fui-color-warning-text);
122
139
  }
123
140
 
124
141
  .color-danger {
125
- color: var(--fui-color-danger, $fui-color-danger);
142
+ color: var(--fui-color-danger-text, $fui-color-danger-text);
126
143
  }
127
144
 
128
145
  // Font family