@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
@@ -47,8 +47,8 @@ $fui-base-unit: computed.$computed-base-unit !default;
47
47
  // Typography
48
48
  // --------------------------------------------
49
49
  $fui-font-sans:
50
- "Inter Variable",
51
- Inter,
50
+ "Onest Variable",
51
+ Onest,
52
52
  -apple-system,
53
53
  BlinkMacSystemFont,
54
54
  "Segoe UI",
@@ -188,6 +188,17 @@ $fui-radius-lg: computed.$computed-radius-lg !default;
188
188
  $fui-radius-xl: computed.$computed-radius-xl !default;
189
189
  $fui-radius-full: computed.$computed-radius-full !default;
190
190
 
191
+ // --------------------------------------------
192
+ // Strokes + control tracks (mirror the measurement CSS vars for SCSS fallbacks)
193
+ // --------------------------------------------
194
+ $fui-stroke-hairline: measurements.target-value("stroke", "hairline") !default;
195
+ $fui-stroke-default: measurements.target-value("stroke", "default") !default;
196
+ $fui-stroke-strong: measurements.target-value("stroke", "strong") !default;
197
+ $fui-control-track-micro: measurements.target-value("controlTrack", "micro") !default;
198
+ $fui-control-track-sm: measurements.target-value("controlTrack", "sm") !default;
199
+ $fui-control-track-md: measurements.target-value("controlTrack", "md") !default;
200
+ $fui-control-track-lg: measurements.target-value("controlTrack", "lg") !default;
201
+
191
202
  // --------------------------------------------
192
203
  // Transitions
193
204
  // --------------------------------------------
@@ -236,9 +247,10 @@ $fui-bg-elevated: computed.$computed-bg-elevated !default;
236
247
  $fui-bg-subtle: computed.$computed-bg-subtle !default;
237
248
  $fui-bg-hover: computed.$computed-bg-hover !default;
238
249
  $fui-bg-active: computed.$computed-bg-active !default;
239
- // The document canvas stays white in light mode. Component and app surfaces
240
- // continue to use the computed neutral palette.
241
- $fui-body-bg: #fff !default;
250
+ // The document canvas is the derived "paper" tone in light mode (carbon 100).
251
+ // Body and main stay on that shared plane; raised component roles provide the
252
+ // contrast instead of consumer-specific page overrides.
253
+ $fui-body-bg: computed.$computed-body-bg !default;
242
254
  $fui-main-bg: computed.$computed-main-bg !default;
243
255
 
244
256
  // Text colors (derived from $fui-neutral palette)
@@ -413,6 +425,19 @@ $fui-icon-2xl: measurements.target-value("icon", "2xl") !default;
413
425
  $fui-anim-offset-sm: 4px !default; // Small slide animation
414
426
  $fui-anim-offset-md: 8px !default; // Medium slide animation
415
427
 
428
+ // Ambient loop durations — infinite animations (spinners, pulses, shimmer).
429
+ // Easing stays per-effect; duration is the system knob.
430
+ $fui-duration-spin: 800ms !default; // Busy indicators
431
+ $fui-duration-pulse: 1500ms !default; // Breathing / attention loops
432
+ $fui-duration-shimmer: 2000ms !default; // Placeholder shimmer
433
+
434
+ // Overlay stacking layers (kept adjacent so relative order is auditable)
435
+ $fui-overlay-layer-swipe: 49 !default;
436
+ $fui-overlay-layer-backdrop: 50 !default;
437
+ $fui-overlay-layer-modal: 51 !default;
438
+ $fui-overlay-layer-anchored: 52 !default;
439
+ $fui-overlay-layer-tooltip: 60 !default;
440
+
416
441
  // Sidebar (multi-consumer — used by Sidebar, NavigationMenu, Theme)
417
442
  $fui-sidebar-item-height: computed.$computed-sidebar-item-height !default; // density-responsive (compact/default: 32px, relaxed: 36px)
418
443
 
@@ -427,12 +452,48 @@ $fui-header-z-index: 40 !default;
427
452
  // CodeBlock background — shared with Markdown's <pre> prose styling — and
428
453
  // selection tint are runtime hooks so consuming apps can preserve their own
429
454
  // code-surface treatment without forking either component.
430
- $fui-code-bg: #171717 !default;
455
+ // Light stop is the paper tertiary well — not a second dark grey.
456
+ $fui-code-bg: light-dark(#{$fui-bg-tertiary}, #{$fui-dark-bg-tertiary}) !default;
457
+ // Accent capsule — the tertiary well + wash/hairline, so the earned moment
458
+ // sits *into* the page rather than floating a white slab on it (lifted-verdict
459
+ // direction, 2026-08-22). Do not mix toward black: that paints a dark slab on
460
+ // the light canvas.
461
+ $fui-card-accent-bg: $fui-bg-tertiary !default;
462
+ $fui-card-accent-border: color-mix(in srgb, $fui-color-accent 30%, $fui-border) !default;
463
+ // Softer than a panel: the capsule is a moment, not another card.
464
+ $fui-card-accent-radius: $fui-radius-xl !default;
465
+ // Selection tint tracks the accent (pine light / sage dark), not the button
466
+ // chrome — the ink-first default theme paints buttons with the inverse
467
+ // surface, which would grey out code selection.
431
468
  $fui-code-selection-bg: color-mix(
432
469
  in srgb,
433
- var(--fui-button-primary-base, #006b57) 30%,
470
+ var(--fui-color-accent, #f56138) 30%,
434
471
  transparent
435
472
  ) !default;
473
+ // Default code ink follows primary text so unhighlighted fallback and shiki
474
+ // `css-variables` foreground stay on the same contrast floor.
475
+ $fui-code-text: $fui-text-primary !default;
476
+ // Syntax ink for CodeBlock's css-variables theme. Each light stop is ≥ 4.5:1
477
+ // on the light code well; each dark stop is ≥ 4.5:1 on the dark code well
478
+ // (gated by read-safe-contrast.test.ts).
479
+ $fui-code-token-keyword: #9a3412 !default;
480
+ $fui-code-token-string: #166534 !default;
481
+ $fui-code-token-comment: #5c5348 !default;
482
+ $fui-code-token-function: #1e3a8a !default;
483
+ $fui-code-token-number: #92400e !default;
484
+ $fui-code-token-punctuation: #3d3429 !default;
485
+ $fui-code-token-variable: #3d3429 !default;
486
+ $fui-dark-code-token-keyword: #f56138 !default;
487
+ $fui-dark-code-token-string: #7dcea0 !default;
488
+ $fui-dark-code-token-comment: #a89b8c !default;
489
+ $fui-dark-code-token-function: #8cb4e8 !default;
490
+ $fui-dark-code-token-number: #e8b86d !default;
491
+ $fui-dark-code-token-punctuation: #c9c2b8 !default;
492
+ $fui-dark-code-token-variable: #f0ede9 !default;
493
+ // Prose/link ink. Light is a darker accent step so 4.5:1 holds on
494
+ // --fui-app-main-bg; dark keeps the theme accent (already ≥ 4.5).
495
+ $fui-link-ink: #9a3412 !default;
496
+ $fui-dark-link-ink: $fui-dark-color-accent !default;
436
497
 
437
498
  // --------------------------------------------
438
499
  // CSS Custom Properties Export
@@ -525,6 +586,20 @@ $fui-code-selection-bg: color-mix(
525
586
  --fui-transition-fast: #{$fui-transition-fast};
526
587
  --fui-transition-normal: #{$fui-transition-normal};
527
588
 
589
+ // Motion primitives
590
+ --fui-anim-offset-sm: #{$fui-anim-offset-sm};
591
+ --fui-anim-offset-md: #{$fui-anim-offset-md};
592
+ --fui-duration-spin: #{$fui-duration-spin};
593
+ --fui-duration-pulse: #{$fui-duration-pulse};
594
+ --fui-duration-shimmer: #{$fui-duration-shimmer};
595
+
596
+ // Overlay stacking layers
597
+ --fui-overlay-layer-swipe: #{$fui-overlay-layer-swipe};
598
+ --fui-overlay-layer-backdrop: #{$fui-overlay-layer-backdrop};
599
+ --fui-overlay-layer-modal: #{$fui-overlay-layer-modal};
600
+ --fui-overlay-layer-anchored: #{$fui-overlay-layer-anchored};
601
+ --fui-overlay-layer-tooltip: #{$fui-overlay-layer-tooltip};
602
+
528
603
  // Colors — Accent (light-dark for automatic dark mode)
529
604
  --fui-color-accent: light-dark(#{$fui-color-accent}, #{$fui-dark-color-accent});
530
605
  --fui-color-on-accent: light-dark(#{$fui-color-on-accent}, #{$fui-dark-color-on-accent});
@@ -626,15 +701,36 @@ $fui-code-selection-bg: color-mix(
626
701
  --fui-border-strong: light-dark(#{$fui-border-strong}, #{$fui-dark-border-strong});
627
702
  --fui-border-subtle: color-mix(in srgb, var(--fui-border-default) 68%, transparent);
628
703
 
704
+ // Placeholder fills. A skeleton has to read as a *missing fact* against the
705
+ // card it sits in — a hairline-weight tint is invisible on paper, so the
706
+ // base leans on the border colour and the highlight is the shimmer stop.
707
+ --fui-skeleton: color-mix(in srgb, var(--fui-border-default) 62%, var(--fui-bg-secondary));
708
+ --fui-skeleton-hi: color-mix(in srgb, var(--fui-border-default) 24%, var(--fui-bg-secondary));
709
+
629
710
  // Native browser text selection tracks the accent (pine in light, sage in
630
711
  // dark) as a soft wash — matching the Flight Recorder accent-tint.
631
712
  // Component-selected states stay tuned per control density.
632
713
  --fui-selection-bg: light-dark(
633
- color-mix(in srgb, var(--fui-color-accent, #006b57) 18%, transparent),
634
- color-mix(in srgb, var(--fui-color-accent, #7fc9b3) 22%, transparent)
714
+ color-mix(in srgb, var(--fui-color-accent, #f56138) 18%, transparent),
715
+ color-mix(in srgb, var(--fui-color-accent, #f56138) 22%, transparent)
635
716
  );
636
717
  --fui-selection-color: var(--fui-text-primary);
637
718
 
719
+ // Persistent neutral selection for navigation, segmented controls, fields,
720
+ // and rows. Keep this separate from --fui-bg-active: active is the brief
721
+ // pointer-down state; selected must remain visible without dominating its
722
+ // surrounding surface.
723
+ --fui-control-selected-bg: color-mix(in srgb, var(--fui-text-primary) 9%, transparent);
724
+
725
+ // Checked/value controls carry product meaning, so they follow the accent
726
+ // rather than button chrome. This keeps Checkbox, RadioGroup, and Switch
727
+ // stable when a consumer customizes primary actions independently.
728
+ --fui-control-checked-bg: var(--fui-color-accent);
729
+ --fui-control-checked-bg-hover: var(--fui-color-accent-hover);
730
+ --fui-control-checked-border: var(--fui-color-accent);
731
+ --fui-control-checked-border-hover: var(--fui-color-accent-hover);
732
+ --fui-control-checked-color: var(--fui-color-on-accent);
733
+
638
734
  // Form chrome (shared by Input, Textarea, Select, Combobox, DatePicker,
639
735
  // ColorPicker, Editor, and listbox-style controls).
640
736
  --fui-field-bg: color-mix(in srgb, var(--fui-bg-elevated) 72%, transparent);
@@ -646,7 +742,7 @@ $fui-code-selection-bg: color-mix(
646
742
  var(--fui-border-strong)
647
743
  );
648
744
  --fui-field-border-focus: var(--fui-text-primary);
649
- --fui-field-selection-bg: color-mix(in srgb, var(--fui-text-primary) 8%, transparent);
745
+ --fui-field-selection-bg: var(--fui-control-selected-bg);
650
746
  --fui-field-selection-bg-hover: color-mix(in srgb, var(--fui-text-primary) 11%, transparent);
651
747
  --fui-field-selection-border: var(--fui-border-strong);
652
748
  --fui-field-selection-color: var(--fui-text-primary);
@@ -673,28 +769,36 @@ $fui-code-selection-bg: color-mix(
673
769
 
674
770
  // Button chrome. Every theme uses flat fills: hierarchy comes from colour,
675
771
  // border, and state contrast rather than a second raised/gradient material.
676
- // Radius remains brand-aware for compatibility with consumer themes.
677
- --fui-button-primary-base: light-dark(#006b57, #006b57);
678
- --fui-button-primary-hover: light-dark(#187762, #187762);
679
- --fui-button-primary-active: light-dark(#005f4c, #005f4c);
680
- --fui-button-primary-border-hover: color-mix(
681
- in srgb,
682
- var(--fui-button-primary-active) 86%,
683
- black 14%
684
- );
685
- --fui-button-primary-border: color-mix(
686
- in srgb,
687
- var(--fui-button-primary-active) 74%,
688
- black 26%
689
- );
690
- --fui-button-primary-color: #fff;
691
-
772
+ //
773
+ // The Fragments default is ink-first: the primary action wears the inverse
774
+ // surface (near-black on paper, near-white on charcoal) with the accent
775
+ // reserved for meaning — links, selection, focus, "contract passing".
776
+ // A consumer-supplied $fui-brand switches primary chrome to the accent
777
+ // ramp so their brand colour actually paints their buttons (previously the
778
+ // chrome stayed pine regardless of seed).
692
779
  @if $fui-brand-is-default {
693
- --fui-button-radius: var(--fui-radius-full);
780
+ --fui-button-primary-base: var(--fui-bg-inverse);
781
+ --fui-button-primary-hover: light-dark(
782
+ color-mix(in srgb, var(--fui-bg-inverse) 88%, white),
783
+ #ffffff
784
+ );
785
+ --fui-button-primary-active: light-dark(
786
+ color-mix(in srgb, var(--fui-bg-inverse) 92%, black),
787
+ color-mix(in srgb, var(--fui-bg-inverse) 94%, black)
788
+ );
789
+ --fui-button-primary-color: var(--fui-text-inverse);
790
+ --fui-button-radius: var(--fui-radius-xl);
694
791
  } @else {
792
+ --fui-button-primary-base: var(--fui-color-accent);
793
+ --fui-button-primary-hover: var(--fui-color-accent-hover);
794
+ --fui-button-primary-active: var(--fui-color-accent-active);
795
+ --fui-button-primary-color: var(--fui-color-on-accent);
695
796
  --fui-button-radius: var(--fui-radius-lg);
696
797
  }
697
798
 
799
+ --fui-button-primary-border: var(--fui-button-primary-base);
800
+ --fui-button-primary-border-hover: var(--fui-button-primary-hover);
801
+
698
802
  --fui-button-primary-bg: var(--fui-button-primary-base);
699
803
  --fui-button-primary-bg-hover: var(--fui-button-primary-hover);
700
804
  --fui-button-primary-bg-active: var(--fui-button-primary-active);
@@ -730,6 +834,33 @@ $fui-code-selection-bg: color-mix(
730
834
 
731
835
  --fui-code-bg: #{$fui-code-bg};
732
836
  --fui-code-selection-bg: #{$fui-code-selection-bg};
837
+ --fui-code-text: var(--fui-text-primary);
838
+ --fui-code-token-keyword: light-dark(
839
+ #{$fui-code-token-keyword},
840
+ #{$fui-dark-code-token-keyword}
841
+ );
842
+ --fui-code-token-string: light-dark(#{$fui-code-token-string}, #{$fui-dark-code-token-string});
843
+ --fui-code-token-comment: light-dark(
844
+ #{$fui-code-token-comment},
845
+ #{$fui-dark-code-token-comment}
846
+ );
847
+ --fui-code-token-function: light-dark(
848
+ #{$fui-code-token-function},
849
+ #{$fui-dark-code-token-function}
850
+ );
851
+ --fui-code-token-number: light-dark(#{$fui-code-token-number}, #{$fui-dark-code-token-number});
852
+ --fui-code-token-punctuation: light-dark(
853
+ #{$fui-code-token-punctuation},
854
+ #{$fui-dark-code-token-punctuation}
855
+ );
856
+ --fui-code-token-variable: light-dark(
857
+ #{$fui-code-token-variable},
858
+ #{$fui-dark-code-token-variable}
859
+ );
860
+ --fui-link-ink: light-dark(#{$fui-link-ink}, #{$fui-dark-link-ink});
861
+ --fui-card-accent-bg: var(--fui-bg-tertiary);
862
+ --fui-card-accent-border: color-mix(in srgb, var(--fui-color-accent) 30%, var(--fui-border));
863
+ --fui-card-accent-radius: #{$fui-card-accent-radius};
733
864
 
734
865
  // Popup/menu active-item highlight — neutral, deliberately stronger than
735
866
  // --fui-bg-hover (which is tuned for subtle surface hovers and reads as ~invisible
@@ -740,15 +871,18 @@ $fui-code-selection-bg: color-mix(
740
871
  // Product shell and navigation chrome. These stay neutral-first so a
741
872
  // dashboard page reads as one system instead of brand-tinted islands.
742
873
  --fui-app-canvas-bg: var(--fui-body-bg);
743
- --fui-app-main-bg: var(--fui-main-bg);
744
- --fui-app-sidebar-bg: color-mix(in srgb, var(--fui-bg-primary) 78%, var(--fui-bg-secondary));
874
+ // Same surface order in both themes: the rail is recessed, the main
875
+ // reading sheet is raised. Light: tertiary paper rail, body-bg sheet.
876
+ // Dark keeps the lifted rail on a deeper body.
877
+ --fui-app-main-bg: var(--fui-body-bg);
878
+ --fui-app-sidebar-bg: var(--fui-bg-tertiary);
745
879
  --fui-sidebar-bg: var(--fui-app-sidebar-bg);
746
880
  --fui-sidebar-border: var(--fui-border-default);
747
881
  --fui-sidebar-item-color: var(--fui-text-secondary);
748
882
  --fui-sidebar-item-icon-color: var(--fui-text-tertiary);
749
883
  --fui-sidebar-item-hover-bg: var(--fui-bg-hover);
750
884
  --fui-sidebar-item-hover-color: var(--fui-text-primary);
751
- --fui-sidebar-item-active-bg: color-mix(in srgb, var(--fui-text-primary) 8%, transparent);
885
+ --fui-sidebar-item-active-bg: var(--fui-control-selected-bg);
752
886
  --fui-sidebar-item-active-border: transparent;
753
887
  --fui-sidebar-item-active-color: var(--fui-text-primary);
754
888
  --fui-sidebar-item-active-indicator: transparent;
@@ -759,6 +893,11 @@ $fui-code-selection-bg: color-mix(
759
893
  --fui-badge-dot-color: currentColor;
760
894
  --fui-card-radius: var(--fui-radius-lg);
761
895
  --fui-card-bg: color-mix(in srgb, var(--fui-bg-elevated) 92%, transparent);
896
+ // Full-bleed card chrome (for example `Card.Header divided`) shares the
897
+ // raised-neutral plane with shell controls. Keep the semantic alias
898
+ // component-specific so consumers can tune card hierarchy without
899
+ // changing every subtle surface.
900
+ --fui-card-header-bg: var(--fui-bg-subtle);
762
901
  --fui-card-border: color-mix(in srgb, var(--fui-border-default) 86%, transparent);
763
902
  --fui-card-outlined-border: var(--fui-card-border);
764
903
  --fui-card-shadow: inset 0 1px 0
@@ -791,7 +930,7 @@ $fui-code-selection-bg: color-mix(
791
930
  --fui-table-header-border: var(--fui-border-strong);
792
931
  --fui-table-row-hover-bg: var(--fui-bg-hover);
793
932
  --fui-table-row-active-bg: var(--fui-bg-active);
794
- --fui-table-row-selected-bg: color-mix(in srgb, var(--fui-text-primary) 8%, transparent);
933
+ --fui-table-row-selected-bg: var(--fui-control-selected-bg);
795
934
  --fui-table-row-selected-border: var(--fui-border-strong);
796
935
  --fui-table-subrow-bg: color-mix(in srgb, var(--fui-bg-secondary) 62%, transparent);
797
936
 
@@ -799,17 +938,18 @@ $fui-code-selection-bg: color-mix(
799
938
  --fui-tabs-pills-bg: color-mix(in srgb, var(--fui-text-primary) 5%, transparent);
800
939
  --fui-tabs-pills-border: var(--fui-border-default);
801
940
  --fui-tabs-pill-hover-bg: transparent;
802
- --fui-tabs-pill-active-bg: color-mix(in srgb, var(--fui-text-primary) 9%, transparent);
941
+ --fui-tabs-pill-active-bg: var(--fui-control-selected-bg);
803
942
  --fui-tabs-pill-active-border: transparent;
804
943
  --fui-tabs-pill-active-shadow: none;
805
- --fui-toggle-group-selected-bg: var(--fui-selection-bg);
806
- --fui-toggle-group-selected-border: color-mix(
807
- in srgb,
808
- var(--fui-color-accent) 42%,
809
- transparent
810
- );
944
+ --fui-toggle-group-selected-bg: var(--fui-control-selected-bg);
945
+ --fui-toggle-group-selected-border: transparent;
811
946
  --fui-toggle-group-selected-shadow: none;
812
947
 
948
+ // Header search is persistent shell chrome rather than a ghost action.
949
+ // One surface step above divided card headers keeps this global affordance
950
+ // easy to find in both themes without turning it into a selected control.
951
+ --fui-header-search-bg: var(--fui-bg-hover);
952
+
813
953
  // Shadows (not <color> type — light-dark() can't be used, handled in dark overrides)
814
954
  --fui-shadow-sm: #{$fui-shadow-sm};
815
955
  --fui-shadow-md: #{$fui-shadow-md};
@@ -1091,6 +1231,11 @@ $fui-code-selection-bg: color-mix(
1091
1231
  --fui-bg-highlight: color-mix(in srgb, var(--fui-text-primary) 10%, transparent);
1092
1232
  --fui-body-bg: #{$fui-dark-body-bg};
1093
1233
  --fui-main-bg: #{$fui-dark-main-bg};
1234
+ --fui-app-main-bg: var(--fui-main-bg);
1235
+ // Paper primary == secondary in dark, so a mix of the two is a no-op.
1236
+ // Tertiary is the lifted rail; main stays the deeper body.
1237
+ --fui-app-sidebar-bg: var(--fui-bg-tertiary);
1238
+ --fui-sidebar-bg: var(--fui-app-sidebar-bg);
1094
1239
  --fui-bg-inverse: #{$fui-dark-bg-inverse};
1095
1240
 
1096
1241
  // Text
@@ -1,6 +1,6 @@
1
- 'use client';
1
+ "use client";
2
2
 
3
- import * as React from 'react';
3
+ import * as React from "react";
4
4
 
5
5
  // ============================================
6
6
  // Unique ID Generator
@@ -27,7 +27,7 @@ export function useId(prefix?: string): string {
27
27
 
28
28
  const [id] = React.useState(() => {
29
29
  if (reactId) return reactId;
30
- return `${prefix ? `${prefix}-` : 'fui-'}${++idCounter}`;
30
+ return `${prefix ? `${prefix}-` : "fui-"}${++idCounter}`;
31
31
  });
32
32
 
33
33
  return id;
@@ -55,45 +55,45 @@ export function useId(prefix?: string): string {
55
55
  * ```
56
56
  */
57
57
  export function useAnnounce(): {
58
- announce: (message: string, priority?: 'polite' | 'assertive') => void;
58
+ announce: (message: string, priority?: "polite" | "assertive") => void;
59
59
  } {
60
60
  const politeRef = React.useRef<HTMLDivElement | null>(null);
61
61
  const assertiveRef = React.useRef<HTMLDivElement | null>(null);
62
62
 
63
63
  React.useEffect(() => {
64
64
  // Create live regions on mount
65
- const polite = document.createElement('div');
66
- polite.setAttribute('aria-live', 'polite');
67
- polite.setAttribute('aria-atomic', 'true');
68
- polite.setAttribute('role', 'status');
65
+ const polite = document.createElement("div");
66
+ polite.setAttribute("aria-live", "polite");
67
+ polite.setAttribute("aria-atomic", "true");
68
+ polite.setAttribute("role", "status");
69
69
  Object.assign(polite.style, {
70
- position: 'absolute',
71
- width: '1px',
72
- height: '1px',
73
- padding: '0',
74
- margin: '-1px',
75
- overflow: 'hidden',
76
- clip: 'rect(0, 0, 0, 0)',
77
- whiteSpace: 'nowrap',
78
- border: '0',
70
+ position: "absolute",
71
+ width: "1px",
72
+ height: "1px",
73
+ padding: "0",
74
+ margin: "-1px",
75
+ overflow: "hidden",
76
+ clip: "rect(0, 0, 0, 0)",
77
+ whiteSpace: "nowrap",
78
+ border: "0",
79
79
  });
80
80
  document.body.appendChild(polite);
81
81
  politeRef.current = polite;
82
82
 
83
- const assertive = document.createElement('div');
84
- assertive.setAttribute('aria-live', 'assertive');
85
- assertive.setAttribute('aria-atomic', 'true');
86
- assertive.setAttribute('role', 'alert');
83
+ const assertive = document.createElement("div");
84
+ assertive.setAttribute("aria-live", "assertive");
85
+ assertive.setAttribute("aria-atomic", "true");
86
+ assertive.setAttribute("role", "alert");
87
87
  Object.assign(assertive.style, {
88
- position: 'absolute',
89
- width: '1px',
90
- height: '1px',
91
- padding: '0',
92
- margin: '-1px',
93
- overflow: 'hidden',
94
- clip: 'rect(0, 0, 0, 0)',
95
- whiteSpace: 'nowrap',
96
- border: '0',
88
+ position: "absolute",
89
+ width: "1px",
90
+ height: "1px",
91
+ padding: "0",
92
+ margin: "-1px",
93
+ overflow: "hidden",
94
+ clip: "rect(0, 0, 0, 0)",
95
+ whiteSpace: "nowrap",
96
+ border: "0",
97
97
  });
98
98
  document.body.appendChild(assertive);
99
99
  assertiveRef.current = assertive;
@@ -106,11 +106,11 @@ export function useAnnounce(): {
106
106
  }, []);
107
107
 
108
108
  const announce = React.useCallback(
109
- (message: string, priority: 'polite' | 'assertive' = 'polite') => {
110
- const region = priority === 'assertive' ? assertiveRef.current : politeRef.current;
109
+ (message: string, priority: "polite" | "assertive" = "polite") => {
110
+ const region = priority === "assertive" ? assertiveRef.current : politeRef.current;
111
111
  if (region) {
112
112
  // Clear and re-set to ensure announcement
113
- region.textContent = '';
113
+ region.textContent = "";
114
114
  // Use requestAnimationFrame to ensure the clear is processed
115
115
  requestAnimationFrame(() => {
116
116
  region.textContent = message;
@@ -146,20 +146,20 @@ export function usePrefersReducedMotion(): boolean {
146
146
  const [prefersReducedMotion, setPrefersReducedMotion] = React.useState(false);
147
147
 
148
148
  React.useEffect(() => {
149
- const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
149
+ const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
150
150
 
151
151
  const handleChange = (event: MediaQueryListEvent) => {
152
152
  setPrefersReducedMotion(event.matches);
153
153
  };
154
154
 
155
155
  // Modern browsers
156
- mediaQuery.addEventListener('change', handleChange);
156
+ mediaQuery.addEventListener("change", handleChange);
157
157
 
158
158
  // Set initial value
159
159
  setPrefersReducedMotion(mediaQuery.matches);
160
160
 
161
161
  return () => {
162
- mediaQuery.removeEventListener('change', handleChange);
162
+ mediaQuery.removeEventListener("change", handleChange);
163
163
  };
164
164
  }, []);
165
165
 
@@ -183,17 +183,17 @@ export function usePrefersContrast(): boolean {
183
183
  const [prefersContrast, setPrefersContrast] = React.useState(false);
184
184
 
185
185
  React.useEffect(() => {
186
- const mediaQuery = window.matchMedia('(prefers-contrast: more)');
186
+ const mediaQuery = window.matchMedia("(prefers-contrast: more)");
187
187
 
188
188
  const handleChange = (event: MediaQueryListEvent) => {
189
189
  setPrefersContrast(event.matches);
190
190
  };
191
191
 
192
- mediaQuery.addEventListener('change', handleChange);
192
+ mediaQuery.addEventListener("change", handleChange);
193
193
  setPrefersContrast(mediaQuery.matches);
194
194
 
195
195
  return () => {
196
- mediaQuery.removeEventListener('change', handleChange);
196
+ mediaQuery.removeEventListener("change", handleChange);
197
197
  };
198
198
  }, []);
199
199
 
@@ -219,10 +219,7 @@ export function usePrefersContrast(): boolean {
219
219
  * return <div ref={dialogRef}>...</div>;
220
220
  * ```
221
221
  */
222
- export function useFocusTrap(
223
- ref: React.RefObject<HTMLElement | null>,
224
- active: boolean
225
- ): void {
222
+ export function useFocusTrap(ref: React.RefObject<HTMLElement | null>, active: boolean): void {
226
223
  const previousActiveElement = React.useRef<Element | null>(null);
227
224
 
228
225
  React.useEffect(() => {
@@ -238,7 +235,7 @@ export function useFocusTrap(
238
235
  }
239
236
 
240
237
  const handleKeyDown = (event: KeyboardEvent) => {
241
- if (event.key !== 'Tab') return;
238
+ if (event.key !== "Tab") return;
242
239
 
243
240
  const focusable = getFocusableElements(container);
244
241
  if (focusable.length === 0) return;
@@ -261,10 +258,10 @@ export function useFocusTrap(
261
258
  }
262
259
  };
263
260
 
264
- container.addEventListener('keydown', handleKeyDown);
261
+ container.addEventListener("keydown", handleKeyDown);
265
262
 
266
263
  return () => {
267
- container.removeEventListener('keydown', handleKeyDown);
264
+ container.removeEventListener("keydown", handleKeyDown);
268
265
 
269
266
  // Restore focus when trap is deactivated
270
267
  if (previousActiveElement.current instanceof HTMLElement) {
@@ -315,11 +312,11 @@ export function handleArrowNavigation(
315
312
  items: readonly unknown[],
316
313
  currentIndex: number,
317
314
  options: {
318
- orientation?: 'horizontal' | 'vertical' | 'both';
315
+ orientation?: "horizontal" | "vertical" | "both";
319
316
  loop?: boolean;
320
317
  } = {}
321
318
  ): number | undefined {
322
- const { orientation = 'vertical', loop = true } = options;
319
+ const { orientation = "vertical", loop = true } = options;
323
320
  const length = items.length;
324
321
 
325
322
  if (length === 0) return undefined;
@@ -327,8 +324,8 @@ export function handleArrowNavigation(
327
324
  let newIndex: number | undefined;
328
325
 
329
326
  switch (event.key) {
330
- case 'ArrowDown':
331
- if (orientation === 'horizontal') return undefined;
327
+ case "ArrowDown":
328
+ if (orientation === "horizontal") return undefined;
332
329
  event.preventDefault();
333
330
  newIndex = currentIndex + 1;
334
331
  if (newIndex >= length) {
@@ -336,8 +333,8 @@ export function handleArrowNavigation(
336
333
  }
337
334
  break;
338
335
 
339
- case 'ArrowUp':
340
- if (orientation === 'horizontal') return undefined;
336
+ case "ArrowUp":
337
+ if (orientation === "horizontal") return undefined;
341
338
  event.preventDefault();
342
339
  newIndex = currentIndex - 1;
343
340
  if (newIndex < 0) {
@@ -345,8 +342,8 @@ export function handleArrowNavigation(
345
342
  }
346
343
  break;
347
344
 
348
- case 'ArrowRight':
349
- if (orientation === 'vertical') return undefined;
345
+ case "ArrowRight":
346
+ if (orientation === "vertical") return undefined;
350
347
  event.preventDefault();
351
348
  newIndex = currentIndex + 1;
352
349
  if (newIndex >= length) {
@@ -354,8 +351,8 @@ export function handleArrowNavigation(
354
351
  }
355
352
  break;
356
353
 
357
- case 'ArrowLeft':
358
- if (orientation === 'vertical') return undefined;
354
+ case "ArrowLeft":
355
+ if (orientation === "vertical") return undefined;
359
356
  event.preventDefault();
360
357
  newIndex = currentIndex - 1;
361
358
  if (newIndex < 0) {
@@ -363,12 +360,12 @@ export function handleArrowNavigation(
363
360
  }
364
361
  break;
365
362
 
366
- case 'Home':
363
+ case "Home":
367
364
  event.preventDefault();
368
365
  newIndex = 0;
369
366
  break;
370
367
 
371
- case 'End':
368
+ case "End":
372
369
  event.preventDefault();
373
370
  newIndex = length - 1;
374
371
  break;
@@ -384,7 +381,7 @@ export function handleArrowNavigation(
384
381
  // Screen Reader Only Component
385
382
  // ============================================
386
383
 
387
- export interface VisuallyHiddenProps {
384
+ export interface A11yVisuallyHiddenProps {
388
385
  children: React.ReactNode;
389
386
  /** If true, becomes visible when focused (useful for skip links) */
390
387
  focusable?: boolean;
@@ -408,19 +405,22 @@ export interface VisuallyHiddenProps {
408
405
  * </VisuallyHidden>
409
406
  * ```
410
407
  */
411
- export function VisuallyHidden({ children, focusable = false }: VisuallyHiddenProps): React.ReactElement {
408
+ export function A11yVisuallyHidden({
409
+ children,
410
+ focusable = false,
411
+ }: A11yVisuallyHiddenProps): React.ReactElement {
412
412
  const style: React.CSSProperties = focusable
413
413
  ? {}
414
414
  : {
415
- position: 'absolute',
416
- width: '1px',
417
- height: '1px',
418
- padding: '0',
419
- margin: '-1px',
420
- overflow: 'hidden',
421
- clip: 'rect(0, 0, 0, 0)',
422
- whiteSpace: 'nowrap',
423
- border: '0',
415
+ position: "absolute",
416
+ width: "1px",
417
+ height: "1px",
418
+ padding: "0",
419
+ margin: "-1px",
420
+ overflow: "hidden",
421
+ clip: "rect(0, 0, 0, 0)",
422
+ whiteSpace: "nowrap",
423
+ border: "0",
424
424
  };
425
425
 
426
426
  return (
package/src/utils/aria.ts CHANGED
@@ -1,11 +1,11 @@
1
- import * as React from 'react';
1
+ import * as React from "react";
2
2
 
3
3
  /**
4
4
  * Merge multiple aria ID values into a single space-separated string.
5
5
  * Filters out undefined/empty values. Returns undefined if no valid IDs.
6
6
  */
7
7
  export function mergeAriaIds(...ids: Array<string | undefined>): string | undefined {
8
- const merged = ids.filter(Boolean).join(' ').trim();
8
+ const merged = ids.filter(Boolean).join(" ").trim();
9
9
  return merged.length > 0 ? merged : undefined;
10
10
  }
11
11
 
@@ -19,7 +19,7 @@ export function normalizeError(error?: boolean | string): {
19
19
  } {
20
20
  return {
21
21
  hasError: !!error,
22
- errorMessage: typeof error === 'string' ? error : undefined,
22
+ errorMessage: typeof error === "string" ? error : undefined,
23
23
  };
24
24
  }
25
25