@usefragments/ui 1.7.0 → 2.0.1

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 (551) hide show
  1. package/README.md +54 -66
  2. package/dist/assets/nav-glyph.cjs +139 -0
  3. package/dist/assets/nav-glyph.d.ts +28 -0
  4. package/dist/assets/nav-glyph.d.ts.map +1 -0
  5. package/dist/assets/nav-glyph.js +139 -0
  6. package/dist/assets/nav-glyph.module.scss.cjs +71 -0
  7. package/dist/assets/nav-glyph.module.scss.js +71 -0
  8. package/dist/assets/ui.css +4975 -4959
  9. package/dist/blocks/components/StatsCard.d.ts +1 -1
  10. package/dist/blocks/components/StatsCard.d.ts.map +1 -1
  11. package/dist/codeblock.cjs +23 -16
  12. package/dist/codeblock.js +16 -9
  13. package/dist/colorpicker.cjs +1 -0
  14. package/dist/colorpicker.js +1 -0
  15. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  16. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  17. package/dist/components/Alert/Alert.module.scss.cjs +21 -21
  18. package/dist/components/Alert/Alert.module.scss.js +21 -21
  19. package/dist/components/Alert/index.cjs +14 -8
  20. package/dist/components/Alert/index.d.ts +9 -9
  21. package/dist/components/Alert/index.d.ts.map +1 -1
  22. package/dist/components/Alert/index.js +14 -8
  23. package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
  24. package/dist/components/AppShell/AppShell.module.scss.js +14 -14
  25. package/dist/components/AppShell/index.cjs +2 -2
  26. package/dist/components/AppShell/index.js +2 -2
  27. package/dist/components/Avatar/Avatar.module.scss.cjs +14 -14
  28. package/dist/components/Avatar/Avatar.module.scss.js +14 -14
  29. package/dist/components/Badge/Badge.module.scss.cjs +33 -31
  30. package/dist/components/Badge/Badge.module.scss.js +33 -31
  31. package/dist/components/Badge/index.cjs +13 -3
  32. package/dist/components/Badge/index.d.ts +18 -13
  33. package/dist/components/Badge/index.d.ts.map +1 -1
  34. package/dist/components/Badge/index.js +13 -3
  35. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +14 -14
  36. package/dist/components/BentoGrid/BentoGrid.module.scss.js +14 -14
  37. package/dist/components/Box/Box.module.scss.cjs +152 -152
  38. package/dist/components/Box/Box.module.scss.js +152 -152
  39. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +11 -8
  40. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +11 -8
  41. package/dist/components/Breadcrumbs/index.cjs +1 -1
  42. package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
  43. package/dist/components/Breadcrumbs/index.js +1 -1
  44. package/dist/components/Button/Button.module.scss.cjs +36 -27
  45. package/dist/components/Button/Button.module.scss.js +36 -27
  46. package/dist/components/Button/index.cjs +20 -4
  47. package/dist/components/Button/index.d.ts +18 -10
  48. package/dist/components/Button/index.d.ts.map +1 -1
  49. package/dist/components/Button/index.js +20 -4
  50. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +15 -15
  51. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +15 -15
  52. package/dist/components/Card/Card.module.scss.cjs +27 -34
  53. package/dist/components/Card/Card.module.scss.js +27 -34
  54. package/dist/components/Card/index.cjs +13 -8
  55. package/dist/components/Card/index.d.ts +23 -25
  56. package/dist/components/Card/index.d.ts.map +1 -1
  57. package/dist/components/Card/index.js +13 -8
  58. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  59. package/dist/components/Chart/Chart.module.scss.js +15 -15
  60. package/dist/components/Checkbox/Checkbox.module.scss.cjs +11 -11
  61. package/dist/components/Checkbox/Checkbox.module.scss.js +11 -11
  62. package/dist/components/Checkbox/index.cjs +2 -2
  63. package/dist/components/Checkbox/index.d.ts +4 -6
  64. package/dist/components/Checkbox/index.d.ts.map +1 -1
  65. package/dist/components/Checkbox/index.js +2 -2
  66. package/dist/components/Chip/Chip.module.scss.cjs +19 -19
  67. package/dist/components/Chip/Chip.module.scss.js +19 -19
  68. package/dist/components/Chip/index.cjs +1 -2
  69. package/dist/components/Chip/index.d.ts +8 -3
  70. package/dist/components/Chip/index.d.ts.map +1 -1
  71. package/dist/components/Chip/index.js +1 -2
  72. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +22 -22
  73. package/dist/components/CodeBlock/CodeBlock.module.scss.js +22 -22
  74. package/dist/components/CodeBlock/index.d.ts +3 -2
  75. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  76. package/dist/components/Collapsible/Collapsible.module.scss.cjs +9 -9
  77. package/dist/components/Collapsible/Collapsible.module.scss.js +9 -9
  78. package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +14 -14
  79. package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
  80. package/dist/components/ColorPicker/index.d.ts.map +1 -1
  81. package/dist/components/Combobox/Combobox.module.scss.cjs +21 -21
  82. package/dist/components/Combobox/Combobox.module.scss.js +21 -21
  83. package/dist/components/Combobox/index.cjs +9 -5
  84. package/dist/components/Combobox/index.d.ts.map +1 -1
  85. package/dist/components/Combobox/index.js +9 -5
  86. package/dist/components/Command/Command.module.scss.cjs +14 -11
  87. package/dist/components/Command/Command.module.scss.js +14 -11
  88. package/dist/components/Command/index.cjs +2 -1
  89. package/dist/components/Command/index.d.ts +6 -1
  90. package/dist/components/Command/index.d.ts.map +1 -1
  91. package/dist/components/Command/index.js +2 -1
  92. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  93. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  94. package/dist/components/ConversationList/index.cjs +2 -2
  95. package/dist/components/ConversationList/index.js +2 -2
  96. package/dist/components/DataTable/DataTable.module.scss.cjs +31 -28
  97. package/dist/components/DataTable/DataTable.module.scss.js +31 -28
  98. package/dist/components/DataTable/DataTable.virtual.d.ts.map +1 -1
  99. package/dist/components/DatePicker/DatePicker.module.scss.cjs +33 -33
  100. package/dist/components/DatePicker/DatePicker.module.scss.js +33 -33
  101. package/dist/components/DatePicker/index.d.ts.map +1 -1
  102. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  103. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  104. package/dist/components/Dialog/index.cjs +2 -2
  105. package/dist/components/Dialog/index.d.ts +5 -4
  106. package/dist/components/Dialog/index.d.ts.map +1 -1
  107. package/dist/components/Dialog/index.js +2 -2
  108. package/dist/components/Drawer/Drawer.module.scss.cjs +39 -39
  109. package/dist/components/Drawer/Drawer.module.scss.js +40 -40
  110. package/dist/components/Drawer/index.cjs +2 -2
  111. package/dist/components/Drawer/index.d.ts +5 -4
  112. package/dist/components/Drawer/index.d.ts.map +1 -1
  113. package/dist/components/Drawer/index.js +2 -2
  114. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  115. package/dist/components/Editor/Editor.module.scss.js +17 -17
  116. package/dist/components/EmptyState/EmptyState.module.scss.cjs +11 -11
  117. package/dist/components/EmptyState/EmptyState.module.scss.js +11 -11
  118. package/dist/components/EmptyState/index.cjs +9 -4
  119. package/dist/components/EmptyState/index.d.ts +8 -5
  120. package/dist/components/EmptyState/index.d.ts.map +1 -1
  121. package/dist/components/EmptyState/index.js +9 -4
  122. package/dist/components/Field/Field.module.scss.cjs +5 -5
  123. package/dist/components/Field/Field.module.scss.js +5 -5
  124. package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
  125. package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
  126. package/dist/components/Grid/Grid.module.scss.cjs +54 -54
  127. package/dist/components/Grid/Grid.module.scss.js +54 -54
  128. package/dist/components/Header/Header.module.scss.cjs +33 -33
  129. package/dist/components/Header/Header.module.scss.js +33 -33
  130. package/dist/components/Icon/Icon.module.scss.cjs +30 -33
  131. package/dist/components/Icon/Icon.module.scss.js +30 -33
  132. package/dist/components/Icon/index.cjs +15 -14
  133. package/dist/components/Icon/index.d.ts +23 -12
  134. package/dist/components/Icon/index.d.ts.map +1 -1
  135. package/dist/components/Icon/index.js +15 -14
  136. package/dist/components/IconButton/IconButton.module.scss.cjs +12 -12
  137. package/dist/components/IconButton/IconButton.module.scss.js +12 -12
  138. package/dist/components/IconButton/index.d.ts +4 -4
  139. package/dist/components/IconButton/index.d.ts.map +1 -1
  140. package/dist/components/Input/Input.module.scss.cjs +15 -21
  141. package/dist/components/Input/Input.module.scss.js +15 -21
  142. package/dist/components/Input/index.cjs +2 -14
  143. package/dist/components/Input/index.d.ts +0 -2
  144. package/dist/components/Input/index.d.ts.map +1 -1
  145. package/dist/components/Input/index.js +2 -14
  146. package/dist/components/Link/Link.module.scss.cjs +24 -16
  147. package/dist/components/Link/Link.module.scss.js +24 -16
  148. package/dist/components/Link/index.cjs +13 -2
  149. package/dist/components/Link/index.d.ts +10 -3
  150. package/dist/components/Link/index.d.ts.map +1 -1
  151. package/dist/components/Link/index.js +13 -2
  152. package/dist/components/List/List.module.scss.cjs +23 -19
  153. package/dist/components/List/List.module.scss.js +23 -19
  154. package/dist/components/List/index.cjs +7 -7
  155. package/dist/components/List/index.d.ts +10 -7
  156. package/dist/components/List/index.d.ts.map +1 -1
  157. package/dist/components/List/index.js +7 -7
  158. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  159. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  160. package/dist/components/Loading/Loading.module.scss.cjs +30 -30
  161. package/dist/components/Loading/Loading.module.scss.js +30 -30
  162. package/dist/components/Loading/index.cjs +5 -5
  163. package/dist/components/Loading/index.d.ts +8 -7
  164. package/dist/components/Loading/index.d.ts.map +1 -1
  165. package/dist/components/Loading/index.js +5 -5
  166. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  167. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  168. package/dist/components/Menu/Menu.module.scss.cjs +14 -14
  169. package/dist/components/Menu/Menu.module.scss.js +14 -14
  170. package/dist/components/Message/Message.module.scss.cjs +20 -20
  171. package/dist/components/Message/Message.module.scss.js +20 -20
  172. package/dist/components/Message/index.cjs +1 -1
  173. package/dist/components/Message/index.d.ts +1 -1
  174. package/dist/components/Message/index.js +1 -1
  175. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +29 -29
  176. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +29 -29
  177. package/dist/components/Pagination/Pagination.module.scss.cjs +10 -10
  178. package/dist/components/Pagination/Pagination.module.scss.js +10 -10
  179. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  180. package/dist/components/Popover/Popover.module.scss.js +10 -10
  181. package/dist/components/Progress/Progress.module.scss.cjs +28 -25
  182. package/dist/components/Progress/Progress.module.scss.js +28 -25
  183. package/dist/components/Progress/index.cjs +21 -12
  184. package/dist/components/Progress/index.d.ts +10 -6
  185. package/dist/components/Progress/index.d.ts.map +1 -1
  186. package/dist/components/Progress/index.js +21 -12
  187. package/dist/components/Prompt/Prompt.module.scss.cjs +30 -30
  188. package/dist/components/Prompt/Prompt.module.scss.js +30 -30
  189. package/dist/components/Prompt/index.cjs +7 -7
  190. package/dist/components/Prompt/index.d.ts +11 -9
  191. package/dist/components/Prompt/index.d.ts.map +1 -1
  192. package/dist/components/Prompt/index.js +7 -7
  193. package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +20 -17
  194. package/dist/components/RadioGroup/RadioGroup.module.scss.js +20 -17
  195. package/dist/components/RadioGroup/index.cjs +10 -5
  196. package/dist/components/RadioGroup/index.d.ts +11 -7
  197. package/dist/components/RadioGroup/index.d.ts.map +1 -1
  198. package/dist/components/RadioGroup/index.js +10 -5
  199. package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +5 -5
  200. package/dist/components/ScrollArea/ScrollArea.module.scss.js +5 -5
  201. package/dist/components/Select/Select.module.scss.cjs +21 -21
  202. package/dist/components/Select/Select.module.scss.js +21 -21
  203. package/dist/components/Select/index.cjs +26 -20
  204. package/dist/components/Select/index.d.ts +5 -5
  205. package/dist/components/Select/index.d.ts.map +1 -1
  206. package/dist/components/Select/index.js +26 -20
  207. package/dist/components/Separator/Separator.module.scss.cjs +25 -19
  208. package/dist/components/Separator/Separator.module.scss.js +25 -19
  209. package/dist/components/Separator/index.cjs +10 -8
  210. package/dist/components/Separator/index.d.ts +4 -2
  211. package/dist/components/Separator/index.d.ts.map +1 -1
  212. package/dist/components/Separator/index.js +10 -8
  213. package/dist/components/Sidebar/Sidebar.module.scss.cjs +43 -43
  214. package/dist/components/Sidebar/Sidebar.module.scss.js +43 -43
  215. package/dist/components/Sidebar/index.cjs +3 -3
  216. package/dist/components/Sidebar/index.js +3 -3
  217. package/dist/components/Skeleton/Skeleton.module.scss.cjs +46 -46
  218. package/dist/components/Skeleton/Skeleton.module.scss.js +46 -46
  219. package/dist/components/Skeleton/index.cjs +7 -7
  220. package/dist/components/Skeleton/index.d.ts +8 -7
  221. package/dist/components/Skeleton/index.d.ts.map +1 -1
  222. package/dist/components/Skeleton/index.js +7 -7
  223. package/dist/components/Slider/Slider.module.scss.cjs +12 -12
  224. package/dist/components/Slider/Slider.module.scss.js +12 -12
  225. package/dist/components/Switch/Switch.module.scss.cjs +9 -9
  226. package/dist/components/Switch/Switch.module.scss.js +9 -9
  227. package/dist/components/Table/Table.module.scss.cjs +15 -15
  228. package/dist/components/Table/Table.module.scss.js +15 -15
  229. package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +15 -15
  230. package/dist/components/TableOfContents/TableOfContents.module.scss.js +15 -15
  231. package/dist/components/TableOfContents/index.cjs +1 -1
  232. package/dist/components/TableOfContents/index.js +1 -1
  233. package/dist/components/Tabs/Tabs.module.scss.cjs +18 -18
  234. package/dist/components/Tabs/Tabs.module.scss.js +18 -18
  235. package/dist/components/Tabs/index.cjs +5 -6
  236. package/dist/components/Tabs/index.d.ts +8 -6
  237. package/dist/components/Tabs/index.d.ts.map +1 -1
  238. package/dist/components/Tabs/index.js +5 -6
  239. package/dist/components/Text/Text.module.scss.cjs +105 -105
  240. package/dist/components/Text/Text.module.scss.js +105 -105
  241. package/dist/components/Text/index.cjs +5 -9
  242. package/dist/components/Text/index.d.ts +15 -11
  243. package/dist/components/Text/index.d.ts.map +1 -1
  244. package/dist/components/Text/index.js +5 -9
  245. package/dist/components/Textarea/Textarea.module.scss.cjs +22 -28
  246. package/dist/components/Textarea/Textarea.module.scss.js +22 -28
  247. package/dist/components/Textarea/index.cjs +3 -10
  248. package/dist/components/Textarea/index.d.ts +0 -2
  249. package/dist/components/Textarea/index.d.ts.map +1 -1
  250. package/dist/components/Textarea/index.js +3 -10
  251. package/dist/components/Theme/index.cjs +20 -4
  252. package/dist/components/Theme/index.d.ts +6 -12
  253. package/dist/components/Theme/index.d.ts.map +1 -1
  254. package/dist/components/Theme/index.js +20 -4
  255. package/dist/components/ThemeToggle/ThemeButton.cjs +51 -0
  256. package/dist/components/ThemeToggle/ThemeButton.d.ts +16 -0
  257. package/dist/components/ThemeToggle/ThemeButton.d.ts.map +1 -0
  258. package/dist/components/ThemeToggle/ThemeButton.js +34 -0
  259. package/dist/components/ThemeToggle/ThemeToggle.module.scss.cjs +6 -9
  260. package/dist/components/ThemeToggle/ThemeToggle.module.scss.js +6 -9
  261. package/dist/components/ThemeToggle/icons.cjs +48 -0
  262. package/dist/components/ThemeToggle/icons.d.ts +10 -0
  263. package/dist/components/ThemeToggle/icons.d.ts.map +1 -0
  264. package/dist/components/ThemeToggle/icons.js +48 -0
  265. package/dist/components/ThemeToggle/index.cjs +5 -74
  266. package/dist/components/ThemeToggle/index.d.ts +5 -8
  267. package/dist/components/ThemeToggle/index.d.ts.map +1 -1
  268. package/dist/components/ThemeToggle/index.js +3 -72
  269. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +18 -15
  270. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +18 -15
  271. package/dist/components/ThinkingIndicator/index.cjs +7 -8
  272. package/dist/components/ThinkingIndicator/index.d.ts +6 -5
  273. package/dist/components/ThinkingIndicator/index.d.ts.map +1 -1
  274. package/dist/components/ThinkingIndicator/index.js +7 -8
  275. package/dist/components/Toast/Toast.module.scss.cjs +28 -29
  276. package/dist/components/Toast/Toast.module.scss.js +29 -30
  277. package/dist/components/Toast/index.cjs +28 -30
  278. package/dist/components/Toast/index.d.ts +9 -8
  279. package/dist/components/Toast/index.d.ts.map +1 -1
  280. package/dist/components/Toast/index.js +28 -30
  281. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +21 -19
  282. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +22 -20
  283. package/dist/components/ToggleGroup/index.cjs +4 -5
  284. package/dist/components/ToggleGroup/index.d.ts +7 -6
  285. package/dist/components/ToggleGroup/index.d.ts.map +1 -1
  286. package/dist/components/ToggleGroup/index.js +4 -5
  287. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  288. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  289. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.cjs +1 -1
  290. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.js +1 -1
  291. package/dist/data-table-virtual.cjs +3 -2
  292. package/dist/data-table-virtual.js +3 -2
  293. package/dist/data-table.cjs +1 -1
  294. package/dist/data-table.js +1 -1
  295. package/dist/datepicker.cjs +23 -11
  296. package/dist/datepicker.js +23 -11
  297. package/dist/index.cjs +5 -1
  298. package/dist/index.d.ts +8 -8
  299. package/dist/index.d.ts.map +1 -1
  300. package/dist/index.js +6 -2
  301. package/dist/measurements/generated.cjs +37 -93
  302. package/dist/measurements/generated.d.ts +37 -92
  303. package/dist/measurements/generated.d.ts.map +1 -1
  304. package/dist/measurements/generated.js +37 -93
  305. package/dist/measurements/index.d.ts +1 -1
  306. package/dist/measurements/index.d.ts.map +1 -1
  307. package/dist/utils/seed-derivation.cjs +0 -1
  308. package/dist/utils/seed-derivation.d.ts +1 -3
  309. package/dist/utils/seed-derivation.d.ts.map +1 -1
  310. package/dist/utils/seed-derivation.js +0 -1
  311. package/dist/utils/theme-presets.cjs +5 -10
  312. package/dist/utils/theme-presets.d.ts +1 -2
  313. package/dist/utils/theme-presets.d.ts.map +1 -1
  314. package/dist/utils/theme-presets.js +5 -10
  315. package/fragments.json +1 -1
  316. package/package.json +5 -8
  317. package/src/assets/nav-glyph.module.scss +166 -0
  318. package/src/assets/nav-glyph.tsx +188 -0
  319. package/src/components/Accordion/Accordion.module.scss +5 -3
  320. package/src/components/Alert/Alert.contract.json +18 -18
  321. package/src/components/Alert/Alert.module.scss +50 -64
  322. package/src/components/Alert/index.tsx +24 -17
  323. package/src/components/AppShell/AppShell.contract.json +7 -7
  324. package/src/components/AppShell/AppShell.module.scss +49 -17
  325. package/src/components/AppShell/index.tsx +2 -2
  326. package/src/components/Avatar/Avatar.module.scss +0 -1
  327. package/src/components/Badge/Badge.contract.json +58 -22
  328. package/src/components/Badge/Badge.module.scss +72 -47
  329. package/src/components/Badge/index.tsx +34 -17
  330. package/src/components/BentoGrid/BentoGrid.module.scss +4 -8
  331. package/src/components/Box/Box.module.scss +7 -6
  332. package/src/components/Breadcrumbs/Breadcrumbs.module.scss +15 -5
  333. package/src/components/Breadcrumbs/index.tsx +5 -1
  334. package/src/components/Button/Button.module.scss +261 -186
  335. package/src/components/Button/index.tsx +41 -28
  336. package/src/components/ButtonGroup/ButtonGroup.contract.json +5 -5
  337. package/src/components/ButtonGroup/ButtonGroup.module.scss +8 -6
  338. package/src/components/Card/Card.consumer-fixture.module.scss +5 -2
  339. package/src/components/Card/Card.module.scss +73 -133
  340. package/src/components/Card/index.tsx +41 -36
  341. package/src/components/Chart/Chart.module.scss +6 -5
  342. package/src/components/Checkbox/Checkbox.contract.json +4 -3
  343. package/src/components/Checkbox/Checkbox.module.scss +16 -32
  344. package/src/components/Checkbox/index.tsx +6 -8
  345. package/src/components/Chip/Chip.contract.json +10 -10
  346. package/src/components/Chip/Chip.module.scss +23 -22
  347. package/src/components/Chip/index.tsx +10 -6
  348. package/src/components/CodeBlock/CodeBlock.module.scss +47 -70
  349. package/src/components/CodeBlock/index.tsx +23 -16
  350. package/src/components/Collapsible/Collapsible.module.scss +1 -7
  351. package/src/components/ColorPicker/ColorPicker.module.scss +20 -13
  352. package/src/components/ColorPicker/index.tsx +1 -0
  353. package/src/components/Combobox/Combobox.module.scss +16 -19
  354. package/src/components/Combobox/index.tsx +10 -1
  355. package/src/components/Command/Command.contract.json +7 -1
  356. package/src/components/Command/Command.module.scss +19 -21
  357. package/src/components/Command/index.tsx +7 -1
  358. package/src/components/ComponentDefaults/ComponentDefaults.contract.json +91 -0
  359. package/src/components/ConversationList/ConversationList.module.scss +2 -3
  360. package/src/components/ConversationList/index.tsx +2 -2
  361. package/src/components/DataTable/DataTable.module.scss +12 -9
  362. package/src/components/DataTable/DataTable.virtual.tsx +3 -2
  363. package/src/components/DataTable/index.tsx +1 -1
  364. package/src/components/DatePicker/DatePicker.module.scss +32 -42
  365. package/src/components/DatePicker/index.tsx +18 -7
  366. package/src/components/Dialog/Dialog.module.scss +23 -29
  367. package/src/components/Dialog/index.tsx +7 -5
  368. package/src/components/Drawer/Drawer.contract.json +6 -6
  369. package/src/components/Drawer/Drawer.module.scss +123 -64
  370. package/src/components/Drawer/index.tsx +7 -5
  371. package/src/components/Editor/Editor.contract.json +1 -1
  372. package/src/components/Editor/Editor.module.scss +26 -13
  373. package/src/components/EmptyState/EmptyState.contract.json +6 -6
  374. package/src/components/EmptyState/EmptyState.module.scss +31 -23
  375. package/src/components/EmptyState/index.tsx +17 -9
  376. package/src/components/Field/Field.module.scss +2 -1
  377. package/src/components/Fieldset/Fieldset.module.scss +5 -4
  378. package/src/components/Form/Form.contract.json +4 -4
  379. package/src/components/Grid/Grid.module.scss +2 -2
  380. package/src/components/Header/Header.contract.json +2 -2
  381. package/src/components/Header/Header.module.scss +24 -36
  382. package/src/components/Icon/Icon.contract.json +19 -23
  383. package/src/components/Icon/Icon.module.scss +13 -12
  384. package/src/components/Icon/index.tsx +31 -31
  385. package/src/components/IconButton/IconButton.contract.json +8 -8
  386. package/src/components/IconButton/IconButton.module.scss +13 -4
  387. package/src/components/IconButton/index.tsx +4 -4
  388. package/src/components/Input/Input.contract.json +0 -13
  389. package/src/components/Input/Input.module.scss +4 -54
  390. package/src/components/Input/index.tsx +2 -18
  391. package/src/components/Link/Link.contract.json +19 -11
  392. package/src/components/Link/Link.module.scss +24 -10
  393. package/src/components/Link/index.tsx +26 -5
  394. package/src/components/List/List.contract.json +11 -11
  395. package/src/components/List/List.module.scss +10 -5
  396. package/src/components/List/index.tsx +17 -13
  397. package/src/components/Listbox/Listbox.module.scss +14 -20
  398. package/src/components/Loading/Loading.contract.json +6 -6
  399. package/src/components/Loading/Loading.module.scss +29 -26
  400. package/src/components/Loading/index.tsx +13 -12
  401. package/src/components/Markdown/Markdown.module.scss +2 -1
  402. package/src/components/Menu/Menu.contract.json +5 -5
  403. package/src/components/Menu/Menu.module.scss +11 -10
  404. package/src/components/Message/Message.contract.json +5 -5
  405. package/src/components/Message/Message.module.scss +8 -6
  406. package/src/components/Message/index.tsx +2 -2
  407. package/src/components/NavigationMenu/NavigationMenu.module.scss +22 -67
  408. package/src/components/Pagination/Pagination.module.scss +7 -14
  409. package/src/components/Popover/Popover.contract.json +4 -4
  410. package/src/components/Popover/Popover.module.scss +24 -23
  411. package/src/components/Progress/Progress.contract.json +11 -11
  412. package/src/components/Progress/Progress.module.scss +13 -8
  413. package/src/components/Progress/index.tsx +34 -16
  414. package/src/components/Prompt/Prompt.contract.json +12 -12
  415. package/src/components/Prompt/Prompt.module.scss +40 -47
  416. package/src/components/Prompt/index.tsx +17 -15
  417. package/src/components/RadioGroup/RadioGroup.contract.json +6 -4
  418. package/src/components/RadioGroup/RadioGroup.module.scss +38 -32
  419. package/src/components/RadioGroup/index.tsx +23 -10
  420. package/src/components/ScrollArea/ScrollArea.module.scss +30 -33
  421. package/src/components/Select/Select.module.scss +19 -18
  422. package/src/components/Select/index.tsx +26 -24
  423. package/src/components/Separator/Separator.contract.json +10 -10
  424. package/src/components/Separator/Separator.module.scss +24 -40
  425. package/src/components/Separator/index.tsx +16 -11
  426. package/src/components/Sidebar/Sidebar.contract.json +1 -1
  427. package/src/components/Sidebar/Sidebar.module.scss +92 -95
  428. package/src/components/Sidebar/index.tsx +3 -3
  429. package/src/components/Skeleton/Skeleton.contract.json +9 -9
  430. package/src/components/Skeleton/Skeleton.module.scss +23 -16
  431. package/src/components/Skeleton/index.tsx +16 -15
  432. package/src/components/Slider/Slider.module.scss +6 -19
  433. package/src/components/Stack/Stack.contract.json +1 -1
  434. package/src/components/Stack/Stack.module.scss +13 -12
  435. package/src/components/Switch/Switch.module.scss +44 -35
  436. package/src/components/Table/Table.module.scss +9 -13
  437. package/src/components/TableOfContents/TableOfContents.module.scss +12 -18
  438. package/src/components/TableOfContents/index.tsx +1 -1
  439. package/src/components/Tabs/Tabs.contract.json +14 -14
  440. package/src/components/Tabs/Tabs.module.scss +27 -31
  441. package/src/components/Tabs/index.tsx +15 -12
  442. package/src/components/Text/Text.contract.json +36 -14
  443. package/src/components/Text/Text.module.scss +19 -20
  444. package/src/components/Text/index.tsx +23 -21
  445. package/src/components/Textarea/Textarea.contract.json +0 -13
  446. package/src/components/Textarea/Textarea.module.scss +24 -52
  447. package/src/components/Textarea/index.tsx +3 -14
  448. package/src/components/Theme/Theme.contract.json +9 -8
  449. package/src/components/Theme/index.tsx +39 -12
  450. package/src/components/ThemeToggle/ThemeButton.tsx +49 -0
  451. package/src/components/ThemeToggle/ThemeToggle.module.scss +21 -44
  452. package/src/components/ThemeToggle/icons.tsx +46 -0
  453. package/src/components/ThemeToggle/index.tsx +8 -90
  454. package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +11 -10
  455. package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +9 -7
  456. package/src/components/ThinkingIndicator/index.tsx +12 -14
  457. package/src/components/Toast/Toast.contract.json +29 -13
  458. package/src/components/Toast/Toast.module.scss +49 -104
  459. package/src/components/Toast/index.tsx +39 -34
  460. package/src/components/ToggleGroup/ToggleGroup.contract.json +13 -13
  461. package/src/components/ToggleGroup/ToggleGroup.module.scss +16 -46
  462. package/src/components/ToggleGroup/index.tsx +11 -11
  463. package/src/components/Tooltip/Tooltip.contract.json +3 -3
  464. package/src/components/Tooltip/Tooltip.module.scss +16 -10
  465. package/src/components/VisuallyHidden/VisuallyHidden.module.scss +4 -14
  466. package/src/index.ts +14 -10
  467. package/src/measurements/MeasurementTargets.module.scss +6 -7
  468. package/src/measurements/generated.ts +38 -96
  469. package/src/measurements/index.ts +0 -1
  470. package/src/measurements/measurements.json +37 -116
  471. package/src/recipes/_action.scss +4 -4
  472. package/src/recipes/_boolean-range.scss +9 -5
  473. package/src/recipes/_feedback.scss +17 -16
  474. package/src/recipes/_field.scss +28 -20
  475. package/src/recipes/_navigation.scss +84 -29
  476. package/src/recipes/_overlay.scss +143 -43
  477. package/src/recipes/_popup.scss +46 -36
  478. package/src/recipes/_prose.scss +35 -23
  479. package/src/recipes/_representation.scss +10 -9
  480. package/src/recipes/_segmented.scss +1 -1
  481. package/src/recipes/_table-chrome.scss +27 -16
  482. package/src/recipes/_target.scss +2 -4
  483. package/src/recipes/_typography.scss +10 -0
  484. package/src/styles/globals.scss +14 -9
  485. package/src/tokens/_component-properties.scss +19 -1
  486. package/src/tokens/_computed.scss +27 -33
  487. package/src/tokens/_measurements.catalog.generated.css +58 -45
  488. package/src/tokens/_measurements.generated.scss +107 -250
  489. package/src/tokens/_mixins.scss +42 -40
  490. package/src/tokens/_palettes.scss +1 -1
  491. package/src/tokens/_property-registrations.scss +9 -0
  492. package/src/tokens/_seeds.scss +1 -12
  493. package/src/tokens/_variables.scss +71 -59
  494. package/src/utils/seed-derivation.ts +1 -8
  495. package/src/utils/theme-presets.ts +5 -12
  496. package/dist/blocks/AccountSettings.block.d.ts +0 -3
  497. package/dist/blocks/AccountSettings.block.d.ts.map +0 -1
  498. package/dist/blocks/ActivityFeedSkeleton.block.d.ts +0 -3
  499. package/dist/blocks/ActivityFeedSkeleton.block.d.ts.map +0 -1
  500. package/dist/blocks/BlogEditor.block.d.ts +0 -3
  501. package/dist/blocks/BlogEditor.block.d.ts.map +0 -1
  502. package/dist/blocks/ChatInterface.block.d.ts +0 -3
  503. package/dist/blocks/ChatInterface.block.d.ts.map +0 -1
  504. package/dist/blocks/ChatMessages.block.d.ts +0 -3
  505. package/dist/blocks/ChatMessages.block.d.ts.map +0 -1
  506. package/dist/blocks/CheckoutForm.block.d.ts +0 -3
  507. package/dist/blocks/CheckoutForm.block.d.ts.map +0 -1
  508. package/dist/blocks/CommandPalette.block.d.ts +0 -3
  509. package/dist/blocks/CommandPalette.block.d.ts.map +0 -1
  510. package/dist/blocks/ContactForm.block.d.ts +0 -3
  511. package/dist/blocks/ContactForm.block.d.ts.map +0 -1
  512. package/dist/blocks/DashboardPage.block.d.ts +0 -3
  513. package/dist/blocks/DashboardPage.block.d.ts.map +0 -1
  514. package/dist/blocks/DashboardSkeleton.block.d.ts +0 -3
  515. package/dist/blocks/DashboardSkeleton.block.d.ts.map +0 -1
  516. package/dist/blocks/DataTable.block.d.ts +0 -3
  517. package/dist/blocks/DataTable.block.d.ts.map +0 -1
  518. package/dist/blocks/EmptyState.block.d.ts +0 -3
  519. package/dist/blocks/EmptyState.block.d.ts.map +0 -1
  520. package/dist/blocks/FAQSection.block.d.ts +0 -3
  521. package/dist/blocks/FAQSection.block.d.ts.map +0 -1
  522. package/dist/blocks/FeatureGrid.block.d.ts +0 -3
  523. package/dist/blocks/FeatureGrid.block.d.ts.map +0 -1
  524. package/dist/blocks/HeroSection.block.d.ts +0 -3
  525. package/dist/blocks/HeroSection.block.d.ts.map +0 -1
  526. package/dist/blocks/NavigationHeader.block.d.ts +0 -3
  527. package/dist/blocks/NavigationHeader.block.d.ts.map +0 -1
  528. package/dist/blocks/PaginatedTable.block.d.ts +0 -3
  529. package/dist/blocks/PaginatedTable.block.d.ts.map +0 -1
  530. package/dist/blocks/PricingComparison.block.d.ts +0 -3
  531. package/dist/blocks/PricingComparison.block.d.ts.map +0 -1
  532. package/dist/blocks/ProductCard.block.d.ts +0 -3
  533. package/dist/blocks/ProductCard.block.d.ts.map +0 -1
  534. package/dist/blocks/RegistrationForm.block.d.ts +0 -3
  535. package/dist/blocks/RegistrationForm.block.d.ts.map +0 -1
  536. package/dist/blocks/SettingsDrawer.block.d.ts +0 -3
  537. package/dist/blocks/SettingsDrawer.block.d.ts.map +0 -1
  538. package/dist/blocks/SettingsPanel.block.d.ts +0 -3
  539. package/dist/blocks/SettingsPanel.block.d.ts.map +0 -1
  540. package/dist/blocks/ShoppingCart.block.d.ts +0 -3
  541. package/dist/blocks/ShoppingCart.block.d.ts.map +0 -1
  542. package/dist/blocks/StatsCardSkeleton.block.d.ts +0 -3
  543. package/dist/blocks/StatsCardSkeleton.block.d.ts.map +0 -1
  544. package/dist/blocks/TableSkeleton.block.d.ts +0 -3
  545. package/dist/blocks/TableSkeleton.block.d.ts.map +0 -1
  546. package/dist/blocks/ThinkingStates.block.d.ts +0 -3
  547. package/dist/blocks/ThinkingStates.block.d.ts.map +0 -1
  548. package/dist/components/Toggle/index.d.ts +0 -3
  549. package/dist/components/Toggle/index.d.ts.map +0 -1
  550. package/src/components/Toggle/index.ts +0 -7
  551. package/src/tokens/_density.scss +0 -85
@@ -7,10 +7,11 @@
7
7
  @include button-reset;
8
8
  @include interactive-base;
9
9
  @include action.base;
10
+ @include high-contrast-outline;
10
11
 
11
- border-radius: var(--fui-radius-md, $fui-radius-md);
12
+ border-radius: var(--fui-radius-l2, $fui-radius-l2);
12
13
  color: var(--fui-text-secondary, $fui-text-secondary);
13
- border: var(--fui-stroke-hairline, 1px) solid transparent;
14
+ border: var(--fui-stroke-hairline, #{$fui-stroke-hairline}) solid transparent;
14
15
  background-color: transparent;
15
16
  flex-shrink: 0;
16
17
 
@@ -18,6 +19,14 @@
18
19
  color: var(--fui-text-primary, $fui-text-primary);
19
20
  }
20
21
 
22
+ // Tactile press. 0.96 exactly: lower reads as exaggerated. Rides the
23
+ // interactive-base transition, so a release mid-press eases back.
24
+ @media (prefers-reduced-motion: no-preference) {
25
+ &:active:not(:disabled):not([data-disabled]) {
26
+ scale: 0.96;
27
+ }
28
+ }
29
+
21
30
  svg {
22
31
  display: block;
23
32
  }
@@ -59,7 +68,7 @@
59
68
  }
60
69
  }
61
70
 
62
- .subtle {
71
+ .soft {
63
72
  background-color: var(--fui-bg-tertiary, $fui-bg-tertiary);
64
73
 
65
74
  &:hover:not(:disabled):not([data-disabled]) {
@@ -71,7 +80,7 @@
71
80
  }
72
81
  }
73
82
 
74
- .outlined {
83
+ .outline {
75
84
  border-color: var(--fui-border, $fui-border);
76
85
 
77
86
  &:hover:not(:disabled):not([data-disabled]) {
@@ -28,12 +28,12 @@ export interface IconButtonProps extends Omit<
28
28
  *
29
29
  * - `ghost` (default): transparent at rest, subtle hover. Fits inside
30
30
  * dense topbars and row affordances.
31
- * - `subtle`: painted with the tertiary surface; use when the affordance
31
+ * - `soft`: painted with the tertiary surface; use when the affordance
32
32
  * sits on a matching surface and needs a touch more weight.
33
- * - `outlined`: hairline border; use as a secondary control alongside a
34
- * primary `Button`.
33
+ * - `outline`: hairline border; use as a secondary control alongside a
34
+ * solid `Button`.
35
35
  * @default "ghost" */
36
- variant?: "ghost" | "subtle" | "outlined";
36
+ variant?: "ghost" | "soft" | "outline";
37
37
  /** Button size. Uses the same height ladder as Button so icon-only
38
38
  * affordances align with toolbar actions and adjacent fields.
39
39
  * @default "md" */
@@ -15,7 +15,6 @@
15
15
  "size: sm|md|lg (default: md)",
16
16
  "disabled: boolean (default: false)",
17
17
  "error: boolean (default: false)",
18
- "success: boolean (default: false)",
19
18
  "label: string",
20
19
  "required: boolean (default: false)",
21
20
  "helperText: string",
@@ -78,12 +77,6 @@
78
77
  "default": "false",
79
78
  "required": false
80
79
  },
81
- "success": {
82
- "type": "boolean",
83
- "description": "Whether to show success/validated styling",
84
- "default": "false",
85
- "required": false
86
- },
87
80
  "label": {
88
81
  "type": "string",
89
82
  "description": "Label text displayed above input",
@@ -251,11 +244,6 @@
251
244
  "description": "Leading icon and a ⌘K hint that focuses the field.",
252
245
  "code": "<Input\n aria-label=\"Search findings\"\n placeholder=\"Search findings...\"\n shortcut=\"⌘K\"\n shortcutBehavior=\"focus-input\"\n startAdornment={<MagnifyingGlass aria-hidden=\"true\" />}\n withFieldWrapper={false}\n/>"
253
246
  },
254
- {
255
- "name": "Success State",
256
- "description": "Green border confirms the value passed validation.",
257
- "code": "<Input\n label=\"Email\"\n type=\"email\"\n value=\"user@example.com\"\n success\n helperText=\"Email verified\"\n/>"
258
- },
259
247
  {
260
248
  "name": "With Start Adornment",
261
249
  "description": "Prefix sits inside the field, before the text.",
@@ -293,7 +281,6 @@
293
281
  "disabled: boolean - disables interaction",
294
282
  "required: boolean - required field indicator",
295
283
  "error: boolean - shows error styling",
296
- "success: boolean - shows success/validated styling",
297
284
  "startAdornment: ReactNode - content before the input (icon or prefix)",
298
285
  "endAdornment: ReactNode - content after the input (icon or suffix)",
299
286
  "shortcut: string - visual kbd hint inside the input; do not hand-roll extra kbd markup",
@@ -40,6 +40,8 @@
40
40
  &:focus-visible {
41
41
  @include field.focus-state;
42
42
  }
43
+
44
+ @include high-contrast-outline;
43
45
  }
44
46
 
45
47
  // Size variants — shared control-size + field-padding path
@@ -63,18 +65,7 @@
63
65
  @include field.invalid-state;
64
66
 
65
67
  &:focus-visible {
66
- border-color: var(--fui-color-danger-text, $fui-color-danger-text);
67
- @include focus-ring-error;
68
- }
69
- }
70
-
71
- // Success state — green border for validated fields (DoorDash/Stocksy pattern)
72
- .success {
73
- border-color: var(--fui-color-success-text, $fui-color-success-text);
74
-
75
- &:focus-visible {
76
- border-color: var(--fui-color-success-text, $fui-color-success-text);
77
- @include focus-ring-success;
68
+ @include field.invalid-focus-state;
78
69
  }
79
70
  }
80
71
 
@@ -83,12 +74,6 @@
83
74
  color: var(--fui-color-danger-text, $fui-color-danger-text);
84
75
  }
85
76
 
86
- // Auto-detect success state via :has() — applies success color to helper
87
- .wrapper[data-success] .helper,
88
- .helperSuccess {
89
- color: var(--fui-color-success-text, $fui-color-success-text);
90
- }
91
-
92
77
  // ============================================
93
78
  // Input with adornments or shortcut indicator
94
79
  // ============================================
@@ -149,18 +134,7 @@
149
134
  @include field.invalid-state;
150
135
 
151
136
  &:focus-within {
152
- border-color: var(--fui-color-danger-text, $fui-color-danger-text);
153
- @include focus-ring-error;
154
- }
155
- }
156
-
157
- // Success state on adornment container
158
- &:has(.success) {
159
- border-color: var(--fui-color-success-text, $fui-color-success-text);
160
-
161
- &:focus-within {
162
- border-color: var(--fui-color-success-text, $fui-color-success-text);
163
- @include focus-ring-success;
137
+ @include field.invalid-focus-state;
164
138
  }
165
139
  }
166
140
  }
@@ -209,30 +183,6 @@
209
183
  user-select: none;
210
184
  }
211
185
 
212
- // ============================================
213
- // Accessibility: High Contrast Mode
214
- // ============================================
215
-
216
- @media (prefers-contrast: more) {
217
- .input {
218
- border-width: var(--fui-stroke-default, 2px);
219
- border-color: var(--fui-text-primary, $fui-text-primary);
220
-
221
- &:focus-visible {
222
- border-color: var(--fui-color-accent, $fui-color-accent);
223
- }
224
- }
225
-
226
- .error,
227
- .input[aria-invalid] {
228
- border-color: var(--fui-color-danger-text, $fui-color-danger-text);
229
- }
230
-
231
- .success {
232
- border-color: var(--fui-color-success-text, $fui-color-success-text);
233
- }
234
- }
235
-
236
186
  // ============================================
237
187
  // Accessibility: Reduced Motion
238
188
  // ============================================
@@ -30,8 +30,6 @@ export interface InputProps extends Omit<
30
30
  disabled?: boolean;
31
31
  /** Show error styling */
32
32
  error?: boolean;
33
- /** Show success styling */
34
- success?: boolean;
35
33
  /** Visible label text */
36
34
  label?: string;
37
35
  /** Whether the field is required */
@@ -105,7 +103,6 @@ const InputRoot = React.forwardRef<HTMLInputElement, InputProps>(function Input(
105
103
  size: sizeProp,
106
104
  disabled = false,
107
105
  error = false,
108
- success = false,
109
106
  required = false,
110
107
  label,
111
108
  helperText,
@@ -174,23 +171,11 @@ const InputRoot = React.forwardRef<HTMLInputElement, InputProps>(function Input(
174
171
 
175
172
  const hasAdornment = !!(startAdornment || endAdornment);
176
173
 
177
- const inputClasses = [
178
- styles.input,
179
- styles[size],
180
- error && styles.error,
181
- success && styles.success,
182
- inputClassName,
183
- ]
174
+ const inputClasses = [styles.input, styles[size], error && styles.error, inputClassName]
184
175
  .filter(Boolean)
185
176
  .join(" ");
186
177
 
187
- const helperClasses = [
188
- styles.helper,
189
- error && styles.helperError,
190
- success && styles.helperSuccess,
191
- ]
192
- .filter(Boolean)
193
- .join(" ");
178
+ const helperClasses = [styles.helper, error && styles.helperError].filter(Boolean).join(" ");
194
179
 
195
180
  const wrapperClasses = [styles.wrapper, className].filter(Boolean).join(" ");
196
181
  const labelClasses = styles.label;
@@ -275,7 +260,6 @@ const InputRoot = React.forwardRef<HTMLInputElement, InputProps>(function Input(
275
260
  {...rootProps}
276
261
  disabled={disabled}
277
262
  invalid={error}
278
- data-success={success || undefined}
279
263
  className={[wrapperClasses, rootProps?.className].filter(Boolean).join(" ")}
280
264
  style={{ ...(rootProps?.style ?? {}), ...(style ?? {}) }}
281
265
  >
@@ -9,7 +9,8 @@
9
9
  "exportName": "Link",
10
10
  "propsSummary": [
11
11
  "children: node (required)",
12
- "variant: default|subtle|muted (default: default)",
12
+ "tone: accent|neutral (default: accent)",
13
+ "color: primary|secondary|tertiary",
13
14
  "underline: always|hover|none|dotted (default: hover)",
14
15
  "external: boolean (default: false)",
15
16
  "asChild: boolean (default: false)",
@@ -24,12 +25,18 @@
24
25
  "description": "Link text content",
25
26
  "required": true
26
27
  },
27
- "variant": {
28
+ "tone": {
28
29
  "type": "enum",
29
- "description": "Visual style variant",
30
- "default": "default",
30
+ "description": "Colour. accent is the link ink; neutral reads as body text until hovered",
31
+ "default": "accent",
31
32
  "required": false,
32
- "values": ["default", "subtle", "muted"]
33
+ "values": ["accent", "neutral"]
34
+ },
35
+ "color": {
36
+ "type": "enum",
37
+ "description": "Text-hierarchy colour for a neutral link (Text color axis); tertiary is the quietest link",
38
+ "required": false,
39
+ "values": ["primary", "secondary", "tertiary"]
33
40
  },
34
41
  "underline": {
35
42
  "type": "enum",
@@ -86,7 +93,7 @@
86
93
  "guidelines": [
87
94
  "Name the destination; never \"click here\"",
88
95
  "external sets target and rel — add your own \"opens in a new tab\" cue",
89
- "subtle and muted for secondary and contextual links",
96
+ "tone=\"neutral\" for secondary links; add color=\"tertiary\" for metadata and footers",
90
97
  "Links must stay distinguishable from surrounding text",
91
98
  "asChild composes handlers with the child rather than replacing them"
92
99
  ],
@@ -104,9 +111,9 @@
104
111
  "code": "<Link href=\"#\">Learn more about our services</Link>"
105
112
  },
106
113
  {
107
- "name": "Variants",
108
- "description": "Accent, then quieter, then quietest.",
109
- "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"md\" align=\"center\" wrap>\n <Link href=\"#\" variant=\"default\">Default</Link>\n <Link href=\"#\" variant=\"subtle\">Subtle</Link>\n <Link href=\"#\" variant=\"muted\">Muted</Link>\n</Stack>"
114
+ "name": "Tones",
115
+ "description": "Accent, then neutral, then the quietest neutral.",
116
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"md\" align=\"center\" wrap>\n <Link href=\"#\" tone=\"accent\">Accent</Link>\n <Link href=\"#\" tone=\"neutral\">Neutral</Link>\n <Link href=\"#\" tone=\"neutral\" color=\"tertiary\">Tertiary</Link>\n</Stack>"
110
117
  },
111
118
  {
112
119
  "name": "Underline Styles",
@@ -121,7 +128,7 @@
121
128
  {
122
129
  "name": "As Child (Polymorphic)",
123
130
  "description": "Paints Link styling onto a router link and keeps both click handlers.",
124
- "code": "<Link asChild variant=\"subtle\" onClick={() => {}}>\n <a href=\"#pricing\" onClick={() => {}}>\n Client-side navigation\n </a>\n</Link>"
131
+ "code": "<Link asChild tone=\"neutral\" onClick={() => {}}>\n <a href=\"#pricing\" onClick={() => {}}>\n Client-side navigation\n </a>\n</Link>"
125
132
  }
126
133
  ],
127
134
  "relations": [
@@ -140,7 +147,8 @@
140
147
  "propsSummary": [
141
148
  "children: ReactNode - link text (required)",
142
149
  "href: string - destination URL",
143
- "variant: default|subtle|muted - visual style",
150
+ "tone: accent|neutral - colour",
151
+ "color: primary|secondary|tertiary - hierarchy colour on a neutral link",
144
152
  "underline: always|hover|none|dotted - underline behavior",
145
153
  "external: boolean - opens in new tab",
146
154
  "asChild: boolean - polymorphic child rendering with merged styles and composed event handlers"
@@ -17,16 +17,22 @@
17
17
  }
18
18
  }
19
19
 
20
- // Variants
21
- .default {
22
- color: var(--fui-link-color, var(--fui-link-ink, #{$fui-link-ink}));
20
+ // Tone. The accent ink is `--fui-link-ink` (the read-safe step, gated by
21
+ // read-safe-contrast.test.ts); hover keeps the same ink and underlines.
22
+ .toneAccent {
23
+ color: var(--fui-link-ink, #{$fui-link-ink});
24
+ }
25
+
26
+ .toneNeutral {
27
+ color: var(--fui-text-primary, $fui-text-primary);
23
28
 
24
29
  &:hover {
25
- color: var(--fui-link-color-hover, var(--fui-link-ink, #{$fui-link-ink}));
30
+ color: var(--fui-color-accent, $fui-color-accent);
26
31
  }
27
32
  }
28
33
 
29
- .subtle {
34
+ // Text-hierarchy colour on a neutral link; hover steps one rung up the ladder.
35
+ .colorPrimary {
30
36
  color: var(--fui-text-primary, $fui-text-primary);
31
37
 
32
38
  &:hover {
@@ -34,7 +40,15 @@
34
40
  }
35
41
  }
36
42
 
37
- .muted {
43
+ .colorSecondary {
44
+ color: var(--fui-text-secondary, $fui-text-secondary);
45
+
46
+ &:hover {
47
+ color: var(--fui-text-primary, $fui-text-primary);
48
+ }
49
+ }
50
+
51
+ .colorTertiary {
38
52
  color: var(--fui-text-tertiary, $fui-text-tertiary);
39
53
 
40
54
  &:hover {
@@ -45,19 +59,19 @@
45
59
  // Underline styles
46
60
  .underline-always {
47
61
  text-decoration: underline;
48
- text-decoration-style: var(--fui-link-underline-style, solid);
62
+ text-decoration-style: solid;
49
63
  text-underline-offset: 0.2em;
50
64
  }
51
65
 
52
66
  .underline-hover {
53
- text-decoration-line: var(--fui-link-underline-line, none);
54
- text-decoration-style: var(--fui-link-underline-style, solid);
67
+ text-decoration-line: none;
68
+ text-decoration-style: solid;
55
69
  text-underline-offset: 0.2em;
56
70
  text-decoration-color: color-mix(in srgb, currentColor 55%, transparent);
57
71
 
58
72
  &:hover {
59
73
  text-decoration-line: underline;
60
- text-decoration-style: var(--fui-link-underline-style, solid);
74
+ text-decoration-style: solid;
61
75
  text-decoration-color: currentColor;
62
76
  text-underline-offset: 0.2em;
63
77
  }
@@ -13,10 +13,18 @@ function composeEventHandlers<T extends (...args: any[]) => void>(
13
13
  }) as T;
14
14
  }
15
15
 
16
- export interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
16
+ export type LinkTone = 'accent' | 'neutral';
17
+ export type LinkColor = 'primary' | 'secondary' | 'tertiary';
18
+
19
+ export interface LinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'color'> {
17
20
  children: React.ReactNode;
18
- /** Visual variant */
19
- variant?: 'default' | 'subtle' | 'muted';
21
+ /** Colour. `accent` (default) is the link ink; `neutral` reads as body text
22
+ * until hovered, for secondary and contextual links.
23
+ * @default 'accent' */
24
+ tone?: LinkTone;
25
+ /** Text-hierarchy colour for a `neutral` link (Text's `color` axis).
26
+ * `tertiary` is the quietest link, for metadata and footers. */
27
+ color?: LinkColor;
20
28
  /** Underline style */
21
29
  underline?: 'always' | 'hover' | 'none' | 'dotted';
22
30
  /** Open in new tab (adds rel="noopener noreferrer") */
@@ -32,11 +40,23 @@ export interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement>
32
40
  style?: React.CSSProperties;
33
41
  }
34
42
 
43
+ const TONE_CLASS: Record<LinkTone, string> = {
44
+ accent: styles.toneAccent,
45
+ neutral: styles.toneNeutral,
46
+ };
47
+
48
+ const COLOR_CLASS: Record<LinkColor, string> = {
49
+ primary: styles.colorPrimary,
50
+ secondary: styles.colorSecondary,
51
+ tertiary: styles.colorTertiary,
52
+ };
53
+
35
54
  const LinkRoot = React.forwardRef<HTMLAnchorElement, LinkProps>(
36
55
  function Link(
37
56
  {
38
57
  children,
39
- variant = 'default',
58
+ tone = 'accent',
59
+ color,
40
60
  underline = 'hover',
41
61
  external = false,
42
62
  asChild = false,
@@ -50,7 +70,8 @@ const LinkRoot = React.forwardRef<HTMLAnchorElement, LinkProps>(
50
70
  ) {
51
71
  const classes = [
52
72
  styles.link,
53
- styles[variant],
73
+ TONE_CLASS[tone],
74
+ color && COLOR_CLASS[color],
54
75
  styles[`underline-${underline}`],
55
76
  className,
56
77
  ]
@@ -10,8 +10,8 @@
10
10
  "propsSummary": [
11
11
  "children: node (required)",
12
12
  "as: ul|ol (default: ul)",
13
- "variant: none|disc|decimal|icon (default: disc)",
14
- "gap: none|xs|sm|md|lg (default: sm)",
13
+ "marker: none|disc|decimal|icon (default: disc)",
14
+ "gap: none|xs|sm|md|lg|xl (default: sm)",
15
15
  "style: object"
16
16
  ],
17
17
  "props": {
@@ -27,9 +27,9 @@
27
27
  "required": false,
28
28
  "values": ["ul", "ol"]
29
29
  },
30
- "variant": {
30
+ "marker": {
31
31
  "type": "enum",
32
- "description": "List style variant",
32
+ "description": "Marker drawn before each item",
33
33
  "default": "disc",
34
34
  "required": false,
35
35
  "values": ["none", "disc", "decimal", "icon"]
@@ -39,7 +39,7 @@
39
39
  "description": "Spacing between items",
40
40
  "default": "sm",
41
41
  "required": false,
42
- "values": ["none", "xs", "sm", "md", "lg"]
42
+ "values": ["none", "xs", "sm", "md", "lg", "xl"]
43
43
  },
44
44
  "style": {
45
45
  "type": "object",
@@ -73,22 +73,22 @@
73
73
  {
74
74
  "name": "Bullet List",
75
75
  "description": "The default marker — reach for it when order does not matter.",
76
- "code": "<List variant=\"disc\">\n <List.Item>First item</List.Item>\n <List.Item>Second item</List.Item>\n <List.Item>Third item</List.Item>\n</List>"
76
+ "code": "<List marker=\"disc\">\n <List.Item>First item</List.Item>\n <List.Item>Second item</List.Item>\n <List.Item>Third item</List.Item>\n</List>"
77
77
  },
78
78
  {
79
79
  "name": "Numbered List",
80
80
  "description": "as=\"ol\" makes the sequence real, not just visual.",
81
- "code": "<List as=\"ol\" variant=\"decimal\">\n <List.Item>Create your account</List.Item>\n <List.Item>Configure your settings</List.Item>\n <List.Item>Start building</List.Item>\n</List>"
81
+ "code": "<List as=\"ol\" marker=\"decimal\">\n <List.Item>Create your account</List.Item>\n <List.Item>Configure your settings</List.Item>\n <List.Item>Start building</List.Item>\n</List>"
82
82
  },
83
83
  {
84
84
  "name": "Icon List",
85
85
  "description": "Each item takes its own icon — checkmarks sell a feature list.",
86
- "code": "<List variant=\"icon\">\n <List.Item icon={<Check weight=\"bold\" color=\"var(--fui-color-success)\" />}>\n Unlimited projects\n </List.Item>\n <List.Item icon={<Check weight=\"bold\" color=\"var(--fui-color-success)\" />}>\n Priority support\n </List.Item>\n <List.Item icon={<Check weight=\"bold\" color=\"var(--fui-color-success)\" />}>\n Advanced analytics\n </List.Item>\n</List>"
86
+ "code": "<List marker=\"icon\">\n <List.Item icon={<Check weight=\"bold\" color=\"var(--fui-color-success)\" />}>\n Unlimited projects\n </List.Item>\n <List.Item icon={<Check weight=\"bold\" color=\"var(--fui-color-success)\" />}>\n Priority support\n </List.Item>\n <List.Item icon={<Check weight=\"bold\" color=\"var(--fui-color-success)\" />}>\n Advanced analytics\n </List.Item>\n</List>"
87
87
  },
88
88
  {
89
89
  "name": "No Style",
90
90
  "description": "No markers, wider gap — the shape for stacked nav links.",
91
- "code": "<List variant=\"none\" gap=\"md\">\n <List.Item>Dashboard</List.Item>\n <List.Item>Settings</List.Item>\n <List.Item>Profile</List.Item>\n</List>"
91
+ "code": "<List marker=\"none\" gap=\"md\">\n <List.Item>Dashboard</List.Item>\n <List.Item>Settings</List.Item>\n <List.Item>Profile</List.Item>\n</List>"
92
92
  }
93
93
  ],
94
94
  "relations": [
@@ -107,8 +107,8 @@
107
107
  "propsSummary": [
108
108
  "children: List.Item[] - list items (required)",
109
109
  "as: ul|ol - list type",
110
- "variant: none|disc|decimal|icon - list style",
111
- "gap: none|xs|sm|md|lg - item spacing"
110
+ "marker: none|disc|decimal|icon - marker before each item",
111
+ "gap: none|xs|sm|md|lg|xl - item spacing"
112
112
  ],
113
113
  "a11yRules": ["A11Y_LIST_SEMANTIC", "A11Y_LIST_NESTING"]
114
114
  },
@@ -1,13 +1,14 @@
1
1
  @use "../../tokens/variables" as *;
2
+ @use "../../tokens/measurements.generated" as measurements;
2
3
  @use "../../recipes/layout" as layout;
3
4
  @use "../../recipes/prose" as prose;
4
5
 
5
6
  .list {
6
- margin: 0;
7
- padding: 0;
7
+ margin: var(--fui-raw-space-0, #{measurements.raw-space(0)});
8
+ padding: var(--fui-raw-space-0, #{measurements.raw-space(0)});
8
9
  }
9
10
 
10
- // Variants
11
+ // Markers
11
12
  .none {
12
13
  @include prose.list("none");
13
14
  }
@@ -24,7 +25,7 @@
24
25
  @include prose.list("icon");
25
26
  }
26
27
 
27
- // Gap variants
28
+ // Gap
28
29
  .gap-none {
29
30
  row-gap: layout.gap("none");
30
31
  }
@@ -45,6 +46,10 @@
45
46
  row-gap: layout.gap("lg");
46
47
  }
47
48
 
49
+ .gap-xl {
50
+ row-gap: layout.gap("xl");
51
+ }
52
+
48
53
  // List item
49
54
  .item {
50
55
  color: var(--fui-text-primary, $fui-text-primary);
@@ -58,7 +63,7 @@
58
63
  display: inline-flex;
59
64
  align-items: center;
60
65
  justify-content: center;
61
- min-inline-size: var(--fui-raw-space-12, 12px);
66
+ min-inline-size: var(--fui-raw-space-12, #{measurements.raw-space(12)});
62
67
  }
63
68
 
64
69
  .itemContent {
@@ -7,19 +7,23 @@ import styles from './List.module.scss';
7
7
  // Types
8
8
  // ============================================
9
9
 
10
+ export type ListMarker = 'none' | 'disc' | 'decimal' | 'icon';
11
+
10
12
  export interface ListProps extends React.HTMLAttributes<HTMLUListElement | HTMLOListElement> {
11
13
  children: React.ReactNode;
12
14
  /** List type */
13
15
  as?: 'ul' | 'ol';
14
- /** List style variant */
15
- variant?: 'none' | 'disc' | 'decimal' | 'icon';
16
- /** Spacing between items */
17
- gap?: 'none' | 'xs' | 'sm' | 'md' | 'lg';
16
+ /** Marker drawn before each item. Not chrome, so it is `marker`, not `variant`.
17
+ * @default 'disc' */
18
+ marker?: ListMarker;
19
+ /** Spacing between items
20
+ * @default 'sm' */
21
+ gap?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
18
22
  }
19
23
 
20
24
  export interface ListItemProps extends React.HTMLAttributes<HTMLLIElement> {
21
25
  children: React.ReactNode;
22
- /** Icon to display (only used with variant="icon") */
26
+ /** Icon to display (only used with marker="icon") */
23
27
  icon?: React.ReactNode;
24
28
  }
25
29
 
@@ -28,10 +32,10 @@ export interface ListItemProps extends React.HTMLAttributes<HTMLLIElement> {
28
32
  // ============================================
29
33
 
30
34
  interface ListContextValue {
31
- variant: NonNullable<ListProps['variant']>;
35
+ marker: ListMarker;
32
36
  }
33
37
 
34
- const ListContext = React.createContext<ListContextValue>({ variant: 'disc' });
38
+ const ListContext = React.createContext<ListContextValue>({ marker: 'disc' });
35
39
 
36
40
  function useListContext() {
37
41
  return React.useContext(ListContext);
@@ -44,7 +48,7 @@ function useListContext() {
44
48
  function ListRoot({
45
49
  children,
46
50
  as: Component = 'ul',
47
- variant = 'disc',
51
+ marker = 'disc',
48
52
  gap = 'sm',
49
53
  className,
50
54
  style,
@@ -52,7 +56,7 @@ function ListRoot({
52
56
  }: ListProps) {
53
57
  const classes = [
54
58
  styles.list,
55
- styles[variant],
59
+ styles[marker],
56
60
  styles[`gap-${gap}`],
57
61
  className,
58
62
  ]
@@ -60,7 +64,7 @@ function ListRoot({
60
64
  .join(' ');
61
65
 
62
66
  return (
63
- <ListContext.Provider value={{ variant }}>
67
+ <ListContext.Provider value={{ marker }}>
64
68
  <Component {...htmlProps} className={classes} style={style}>
65
69
  {children}
66
70
  </Component>
@@ -69,11 +73,11 @@ function ListRoot({
69
73
  }
70
74
 
71
75
  function ListItem({ children, icon, className, style, ...htmlProps }: ListItemProps) {
72
- const { variant } = useListContext();
76
+ const { marker } = useListContext();
73
77
 
74
78
  const classes = [
75
79
  styles.item,
76
- variant === 'icon' && styles.iconItem,
80
+ marker === 'icon' && styles.iconItem,
77
81
  className,
78
82
  ]
79
83
  .filter(Boolean)
@@ -81,7 +85,7 @@ function ListItem({ children, icon, className, style, ...htmlProps }: ListItemPr
81
85
 
82
86
  return (
83
87
  <li {...htmlProps} className={classes} style={style}>
84
- {variant === 'icon' && icon ? (
88
+ {marker === 'icon' && icon ? (
85
89
  <span className={styles.iconWrapper}>{icon}</span>
86
90
  ) : null}
87
91
  <span className={styles.itemContent}>{children}</span>