@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
@@ -74,27 +74,26 @@
74
74
  &[data-checked] {
75
75
  background-color: color-mix(
76
76
  in srgb,
77
- var(--fui-button-primary-base, #{$fui-color-accent}) 8%,
77
+ var(--fui-control-checked-bg, #{$fui-color-accent}) 8%,
78
78
  var(--fui-field-bg, #{$fui-bg-elevated})
79
79
  );
80
- border-color: var(--fui-button-primary-base, $fui-color-accent);
81
- box-shadow: inset 0 0 0 1px
82
- color-mix(in srgb, var(--fui-button-primary-base, #{$fui-color-accent}) 55%, transparent);
80
+ border-color: var(--fui-control-checked-border, $fui-color-accent);
81
+ box-shadow: inset 0 0 0 var(--fui-stroke-hairline, 1px)
82
+ color-mix(in srgb, var(--fui-control-checked-border, #{$fui-color-accent}) 55%, transparent);
83
83
  }
84
84
 
85
85
  &[data-checked]:hover:not([data-disabled]) {
86
86
  background-color: color-mix(
87
87
  in srgb,
88
- var(--fui-button-primary-hover, #{$fui-color-accent}) 12%,
88
+ var(--fui-control-checked-bg-hover, #{$fui-color-accent-hover}) 12%,
89
89
  var(--fui-field-bg, #{$fui-bg-elevated})
90
90
  );
91
- border-color: var(--fui-button-primary-hover, $fui-color-accent);
91
+ border-color: var(--fui-control-checked-border-hover, $fui-color-accent-hover);
92
92
  }
93
93
 
94
94
  &[data-invalid] {
95
95
  border-color: var(--fui-color-danger-text, $fui-color-danger-text);
96
96
  }
97
-
98
97
  }
99
98
 
100
99
  // Size variants
@@ -114,7 +113,7 @@
114
113
  left: 50%;
115
114
  width: var(--fui-raw-space-8, 8px);
116
115
  height: var(--fui-raw-space-8, 8px);
117
- background-color: var(--fui-button-primary-base, $fui-color-accent);
116
+ background-color: var(--fui-control-checked-bg, $fui-color-accent);
118
117
  border-radius: var(--fui-radius-full, $fui-radius-full);
119
118
 
120
119
  // Animation - use translate for centering combined with scale
@@ -186,23 +185,23 @@
186
185
  }
187
186
 
188
187
  &:focus-within:not([data-disabled]) {
189
- border-color: var(--fui-button-primary-base, $fui-color-accent);
188
+ border-color: var(--fui-control-checked-border, $fui-color-accent);
190
189
  @include focus-ring;
191
190
  }
192
191
 
193
192
  &:has([data-checked]) {
194
193
  background: color-mix(
195
194
  in srgb,
196
- var(--fui-button-primary-base, #{$fui-color-accent}) 13%,
195
+ var(--fui-control-checked-bg, #{$fui-color-accent}) 13%,
197
196
  transparent
198
197
  );
199
198
  border-color: color-mix(
200
199
  in srgb,
201
- var(--fui-button-primary-base, #{$fui-color-accent}) 62%,
200
+ var(--fui-control-checked-border, #{$fui-color-accent}) 62%,
202
201
  transparent
203
202
  );
204
- box-shadow: 0 0 0 1px
205
- color-mix(in srgb, var(--fui-button-primary-base, #{$fui-color-accent}) 28%, transparent);
203
+ box-shadow: 0 0 0 var(--fui-stroke-hairline, 1px)
204
+ color-mix(in srgb, var(--fui-control-checked-border, #{$fui-color-accent}) 28%, transparent);
206
205
  }
207
206
 
208
207
  &[data-size="sm"] {
@@ -233,7 +232,7 @@
233
232
  outline-offset: calc(-1 * var(--fui-stroke-default, 2px));
234
233
 
235
234
  &[data-checked] {
236
- border-color: var(--fui-button-primary-base, $fui-color-accent);
235
+ border-color: var(--fui-control-checked-border, $fui-color-accent);
237
236
  }
238
237
 
239
238
  &[data-invalid] {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "ScrollArea",
4
- "description": "A styled scrollable container with thin scrollbars and optional fade indicators.",
4
+ "description": "Scrolls overflowing content with a slim scrollbar and optional edge fades.",
5
5
  "category": "layout",
6
6
  "tags": ["scroll", "overflow", "scrollbar", "container", "layout"],
7
7
  "status": "stable",
@@ -48,20 +48,19 @@
48
48
  },
49
49
  "usage": {
50
50
  "when": [
51
- "Content overflows its container and needs scrolling",
52
- "Horizontal tab bars or chip lists that may overflow",
53
- "Scrollable panels, sidebars, or dropdown content",
54
- "Any area where native scrollbars look too heavy"
51
+ "Content that overflows a fixed-size container",
52
+ "Tab bars or chip rows that may run past the edge",
53
+ "Scrollable panels, sidebars, and menu content"
55
54
  ],
56
55
  "whenNot": [
57
- "Page-level scrolling (use native body scroll)",
58
- "Very short content that never overflows"
56
+ "Whole-page scrolling (use the native body scroll)",
57
+ "Content that can never overflow"
59
58
  ],
60
59
  "guidelines": [
61
- "Use `orientation` to constrain scroll direction",
62
- "Use `showFades` to hint at hidden content beyond the viewport",
63
- "The `auto` and `hover` modes keep the thumb quiet until hover or keyboard focus without changing track geometry",
64
- "Combine with `orientation=\"horizontal\"` for tab bars and chip rows"
60
+ "orientation constrains which axis can scroll",
61
+ "showFades hints at hidden content when nothing else does",
62
+ "scrollbarVisibility=\"hover\" hides the thumb without shifting layout",
63
+ "The container needs a fixed height or the area cannot scroll"
65
64
  ],
66
65
  "accessibility": [
67
66
  "Preserves native scroll behavior and keyboard support across both axes",
@@ -72,23 +71,23 @@
72
71
  "examples": [
73
72
  {
74
73
  "name": "Vertical",
75
- "description": "Vertical scrollable area with thin scrollbar.",
76
- "code": "<ScrollArea style={{ height: '200px' }}>\n {/* Long content */}\n</ScrollArea>"
74
+ "description": "Scrolls down with a thin, always-visible thumb.",
75
+ "code": "import { Box } from '@/components/Box';\nimport { ScrollArea } from '@/components/ScrollArea';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\n\n<Box width=\"100%\">\n <ScrollArea style={{ height: '200px' }}>\n <Box padding=\"sm\">\n <Stack gap=\"sm\">\n <Text>Row 1</Text>\n <Text>Row 2</Text>\n <Text>Row 3</Text>\n <Text>Row 4</Text>\n <Text>Row 5</Text>\n <Text>Row 6</Text>\n <Text>Row 7</Text>\n <Text>Row 8</Text>\n <Text>Row 9</Text>\n <Text>Row 10</Text>\n <Text>Row 11</Text>\n <Text>Row 12</Text>\n </Stack>\n </Box>\n </ScrollArea>\n</Box>"
77
76
  },
78
77
  {
79
78
  "name": "Horizontal",
80
- "description": "Horizontal scrollable area for overflowing inline content like tabs or chips.",
81
- "code": "<ScrollArea orientation=\"horizontal\">\n <div style={{ display: 'flex', gap: '8px' }}>\n {tags.map(tag => <Chip key={tag}>{tag}</Chip>)}\n </div>\n</ScrollArea>"
79
+ "description": "Keeps an overflowing row of chips on one line.",
80
+ "code": "import { Box } from '@/components/Box';\nimport { Chip } from '@/components/Chip';\nimport { ScrollArea } from '@/components/ScrollArea';\nimport { Stack } from '@/components/Stack';\n\n<Box width=\"100%\">\n <ScrollArea orientation=\"horizontal\">\n <Stack direction=\"row\" gap=\"sm\">\n <Chip>React</Chip>\n <Chip>TypeScript</Chip>\n <Chip>Accessibility</Chip>\n <Chip>Docs</Chip>\n <Chip>Playground</Chip>\n <Chip>CLI</Chip>\n <Chip>Tokens</Chip>\n <Chip>Governance</Chip>\n <Chip>Contracts</Chip>\n <Chip>Registry</Chip>\n </Stack>\n </ScrollArea>\n</Box>"
82
81
  },
83
82
  {
84
83
  "name": "With Fades",
85
- "description": "Fade indicators independently show the available logical direction on each scrollable axis.",
86
- "code": "<ScrollArea orientation=\"horizontal\" showFades>\n {/* Overflowing content */}\n</ScrollArea>"
84
+ "description": "Edge fades signal there is more content each way.",
85
+ "code": "import { Box } from '@/components/Box';\nimport { Chip } from '@/components/Chip';\nimport { ScrollArea } from '@/components/ScrollArea';\nimport { Stack } from '@/components/Stack';\n\n<Box width=\"100%\">\n <ScrollArea orientation=\"horizontal\" showFades>\n <Stack direction=\"row\" gap=\"sm\">\n <Chip>React</Chip>\n <Chip>TypeScript</Chip>\n <Chip>Accessibility</Chip>\n <Chip>Docs</Chip>\n <Chip>Playground</Chip>\n <Chip>CLI</Chip>\n <Chip>Tokens</Chip>\n <Chip>Governance</Chip>\n <Chip>Contracts</Chip>\n <Chip>Registry</Chip>\n </Stack>\n </ScrollArea>\n</Box>"
87
86
  },
88
87
  {
89
88
  "name": "Hover Scrollbar",
90
- "description": "Scrollbar thumb paint appears on hover or keyboard focus without changing track dimensions.",
91
- "code": "<ScrollArea scrollbarVisibility=\"hover\" style={{ height: '200px' }}>\n {/* Content */}\n</ScrollArea>"
89
+ "description": "Thumb stays invisible until hover or keyboard focus.",
90
+ "code": "import { Box } from '@/components/Box';\nimport { ScrollArea } from '@/components/ScrollArea';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\n\n<Box width=\"100%\">\n <ScrollArea scrollbarVisibility=\"hover\" style={{ height: '200px' }}>\n <Box padding=\"sm\">\n <Stack gap=\"sm\">\n <Text>Row 1</Text>\n <Text>Row 2</Text>\n <Text>Row 3</Text>\n <Text>Row 4</Text>\n <Text>Row 5</Text>\n <Text>Row 6</Text>\n <Text>Row 7</Text>\n <Text>Row 8</Text>\n <Text>Row 9</Text>\n <Text>Row 10</Text>\n <Text>Row 11</Text>\n <Text>Row 12</Text>\n </Stack>\n </Box>\n </ScrollArea>\n</Box>"
92
91
  }
93
92
  ],
94
93
  "contract": {
@@ -1,5 +1,5 @@
1
- @use '../../tokens/measurements.generated' as measurements;
2
- @use '../../tokens/variables' as *;
1
+ @use "../../tokens/measurements.generated" as measurements;
2
+ @use "../../tokens/variables" as *;
3
3
 
4
4
  .root {
5
5
  --fui-scrollarea-track-size: var(--fui-raw-space-6, #{measurements.raw-space(6)});
@@ -55,7 +55,7 @@
55
55
 
56
56
  &:hover,
57
57
  &:focus-within,
58
- &[data-scrollbar-visibility='always'] {
58
+ &[data-scrollbar-visibility="always"] {
59
59
  scrollbar-color: var(--fui-border-strong, #{$fui-border-strong}) transparent;
60
60
 
61
61
  &::-webkit-scrollbar-thumb {
@@ -82,17 +82,17 @@
82
82
  overflow: auto;
83
83
  }
84
84
 
85
- .horizontal:not([data-scroll-x='none']),
86
- .both:not([data-scroll-x='none']) {
85
+ .horizontal:not([data-scroll-x="none"]),
86
+ .both:not([data-scroll-x="none"]) {
87
87
  scroll-padding-inline: var(--_fui-scrollarea-inline-fade);
88
88
  }
89
89
 
90
- .vertical:not([data-scroll-y='none']),
91
- .both:not([data-scroll-y='none']) {
90
+ .vertical:not([data-scroll-y="none"]),
91
+ .both:not([data-scroll-y="none"]) {
92
92
  scroll-padding-block: var(--_fui-scrollarea-block-fade);
93
93
  }
94
94
 
95
- .viewport[data-scroll-x='end'] {
95
+ .viewport[data-scroll-x="end"] {
96
96
  --_fui-scrollarea-inline-mask: linear-gradient(
97
97
  to right,
98
98
  black calc(100% - var(--_fui-scrollarea-inline-fade)),
@@ -100,7 +100,7 @@
100
100
  );
101
101
  }
102
102
 
103
- .viewport[data-scroll-x='start'] {
103
+ .viewport[data-scroll-x="start"] {
104
104
  --_fui-scrollarea-inline-mask: linear-gradient(
105
105
  to right,
106
106
  transparent,
@@ -108,7 +108,7 @@
108
108
  );
109
109
  }
110
110
 
111
- .viewport[data-scroll-x='both'] {
111
+ .viewport[data-scroll-x="both"] {
112
112
  --_fui-scrollarea-inline-mask: linear-gradient(
113
113
  to right,
114
114
  transparent,
@@ -118,7 +118,7 @@
118
118
  );
119
119
  }
120
120
 
121
- .viewport[data-scroll-x='end']:dir(rtl) {
121
+ .viewport[data-scroll-x="end"]:dir(rtl) {
122
122
  --_fui-scrollarea-inline-mask: linear-gradient(
123
123
  to right,
124
124
  transparent,
@@ -126,7 +126,7 @@
126
126
  );
127
127
  }
128
128
 
129
- .viewport[data-scroll-x='start']:dir(rtl) {
129
+ .viewport[data-scroll-x="start"]:dir(rtl) {
130
130
  --_fui-scrollarea-inline-mask: linear-gradient(
131
131
  to right,
132
132
  black calc(100% - var(--_fui-scrollarea-inline-fade)),
@@ -134,7 +134,7 @@
134
134
  );
135
135
  }
136
136
 
137
- .viewport[data-scroll-y='end'] {
137
+ .viewport[data-scroll-y="end"] {
138
138
  --_fui-scrollarea-block-mask: linear-gradient(
139
139
  to bottom,
140
140
  black calc(100% - var(--_fui-scrollarea-block-fade)),
@@ -142,7 +142,7 @@
142
142
  );
143
143
  }
144
144
 
145
- .viewport[data-scroll-y='start'] {
145
+ .viewport[data-scroll-y="start"] {
146
146
  --_fui-scrollarea-block-mask: linear-gradient(
147
147
  to bottom,
148
148
  transparent,
@@ -150,7 +150,7 @@
150
150
  );
151
151
  }
152
152
 
153
- .viewport[data-scroll-y='both'] {
153
+ .viewport[data-scroll-y="both"] {
154
154
  --_fui-scrollarea-block-mask: linear-gradient(
155
155
  to bottom,
156
156
  transparent,
@@ -1,13 +1,13 @@
1
- 'use client';
1
+ "use client";
2
2
 
3
- import * as React from 'react';
4
- import styles from './ScrollArea.module.scss';
3
+ import * as React from "react";
4
+ import styles from "./ScrollArea.module.scss";
5
5
  import {
6
6
  detectRtlScrollModel,
7
7
  readScrollAxes,
8
8
  type ScrollAxesState,
9
9
  type ScrollOrientation,
10
- } from './scroll-state';
10
+ } from "./scroll-state";
11
11
 
12
12
  // ============================================
13
13
  // Types
@@ -18,8 +18,8 @@ export interface ScrollAreaProps extends React.HTMLAttributes<HTMLDivElement> {
18
18
  /** Scroll direction */
19
19
  orientation?: ScrollOrientation;
20
20
  /** Scrollbar visibility behavior */
21
- scrollbarVisibility?: 'auto' | 'always' | 'hover';
22
- /** Whether to show fade indicators at scroll edges */
21
+ scrollbarVisibility?: "auto" | "always" | "hover";
22
+ /** Whether to show fade indicators at scroll edges. Defaults to false. */
23
23
  showFades?: boolean;
24
24
  /** Additional class name */
25
25
  className?: string;
@@ -37,15 +37,15 @@ export interface ScrollAreaProps extends React.HTMLAttributes<HTMLDivElement> {
37
37
  */
38
38
  function ScrollAreaRoot({
39
39
  children,
40
- orientation = 'vertical',
41
- scrollbarVisibility = 'auto',
40
+ orientation = "vertical",
41
+ scrollbarVisibility = "auto",
42
42
  showFades = false,
43
43
  className,
44
44
  dir,
45
45
  ...htmlProps
46
46
  }: ScrollAreaProps) {
47
47
  const viewportRef = React.useRef<HTMLDivElement>(null);
48
- const [axes, setAxes] = React.useState<ScrollAxesState>({ x: 'none', y: 'none' });
48
+ const [axes, setAxes] = React.useState<ScrollAxesState>({ x: "none", y: "none" });
49
49
 
50
50
  React.useEffect(() => {
51
51
  const viewport = viewportRef.current;
@@ -58,11 +58,11 @@ function ScrollAreaRoot({
58
58
  frame = null;
59
59
  const view = viewport.ownerDocument.defaultView;
60
60
  const computedDirection = view?.getComputedStyle(viewport).direction;
61
- const direction = (computedDirection || dir) === 'rtl' ? 'rtl' : 'ltr';
61
+ const direction = (computedDirection || dir) === "rtl" ? "rtl" : "ltr";
62
62
  const nextAxes = readScrollAxes(viewport, {
63
63
  orientation,
64
64
  direction,
65
- rtlModel: direction === 'rtl' ? detectRtlScrollModel(viewport.ownerDocument) : undefined,
65
+ rtlModel: direction === "rtl" ? detectRtlScrollModel(viewport.ownerDocument) : undefined,
66
66
  });
67
67
 
68
68
  setAxes((currentAxes) =>
@@ -99,22 +99,22 @@ function ScrollAreaRoot({
99
99
  resizeObserver.observe(viewport);
100
100
  syncObservedChildren();
101
101
  mutationObserver.observe(viewport, { childList: true, subtree: true });
102
- viewport.addEventListener('scroll', schedule, { passive: true });
102
+ viewport.addEventListener("scroll", schedule, { passive: true });
103
103
  schedule();
104
104
 
105
105
  return () => {
106
106
  if (frame !== null) cancelAnimationFrame(frame);
107
- viewport.removeEventListener('scroll', schedule);
107
+ viewport.removeEventListener("scroll", schedule);
108
108
  resizeObserver.disconnect();
109
109
  mutationObserver.disconnect();
110
110
  observedChildren.clear();
111
111
  };
112
112
  }, [dir, orientation, showFades]);
113
113
 
114
- const rootClasses = [styles.root, className].filter(Boolean).join(' ');
115
- const visibleAxes = showFades ? axes : { x: 'none' as const, y: 'none' as const };
114
+ const rootClasses = [styles.root, className].filter(Boolean).join(" ");
115
+ const visibleAxes = showFades ? axes : { x: "none" as const, y: "none" as const };
116
116
 
117
- const viewportClasses = [styles.viewport, styles[orientation]].filter(Boolean).join(' ');
117
+ const viewportClasses = [styles.viewport, styles[orientation]].filter(Boolean).join(" ");
118
118
 
119
119
  return (
120
120
  <div {...htmlProps} className={rootClasses} data-orientation={orientation} dir={dir}>
@@ -1,6 +1,6 @@
1
- export type ScrollOrientation = 'horizontal' | 'vertical' | 'both';
2
- export type ScrollEdgeState = 'none' | 'start' | 'end' | 'both';
3
- export type RtlScrollModel = 'negative' | 'positive-descending' | 'positive-ascending';
1
+ export type ScrollOrientation = "horizontal" | "vertical" | "both";
2
+ export type ScrollEdgeState = "none" | "start" | "end" | "both";
3
+ export type RtlScrollModel = "negative" | "positive-descending" | "positive-ascending";
4
4
 
5
5
  export interface ScrollAxesState {
6
6
  x: ScrollEdgeState;
@@ -16,21 +16,21 @@ export function detectRtlScrollModel(document: Document): RtlScrollModel {
16
16
  const cachedModel = rtlScrollModels.get(document);
17
17
  if (cachedModel) return cachedModel;
18
18
 
19
- const viewport = document.createElement('div');
20
- const content = document.createElement('div');
21
- viewport.dir = 'rtl';
19
+ const viewport = document.createElement("div");
20
+ const content = document.createElement("div");
21
+ viewport.dir = "rtl";
22
22
  viewport.style.cssText =
23
- 'position:absolute;inset-block-start:-9999px;inline-size:4px;block-size:1px;overflow:scroll;visibility:hidden';
24
- content.style.cssText = 'inline-size:8px;block-size:1px';
23
+ "position:absolute;inset-block-start:-9999px;inline-size:4px;block-size:1px;overflow:scroll;visibility:hidden";
24
+ content.style.cssText = "inline-size:8px;block-size:1px";
25
25
  viewport.append(content);
26
26
  (document.body ?? document.documentElement).append(viewport);
27
27
 
28
28
  let model: RtlScrollModel;
29
29
  if (viewport.scrollLeft > 0) {
30
- model = 'positive-descending';
30
+ model = "positive-descending";
31
31
  } else {
32
32
  viewport.scrollLeft = 1;
33
- model = viewport.scrollLeft === 0 ? 'negative' : 'positive-ascending';
33
+ model = viewport.scrollLeft === 0 ? "negative" : "positive-ascending";
34
34
  }
35
35
 
36
36
  viewport.remove();
@@ -43,37 +43,37 @@ function clamp(value: number, min: number, max: number): number {
43
43
  }
44
44
 
45
45
  function resolveEdgeState(distanceFromStart: number, maxScroll: number): ScrollEdgeState {
46
- if (maxScroll <= SCROLL_EDGE_EPSILON_PX) return 'none';
47
- if (distanceFromStart <= SCROLL_EDGE_EPSILON_PX) return 'end';
48
- if (maxScroll - distanceFromStart <= SCROLL_EDGE_EPSILON_PX) return 'start';
49
- return 'both';
46
+ if (maxScroll <= SCROLL_EDGE_EPSILON_PX) return "none";
47
+ if (distanceFromStart <= SCROLL_EDGE_EPSILON_PX) return "end";
48
+ if (maxScroll - distanceFromStart <= SCROLL_EDGE_EPSILON_PX) return "start";
49
+ return "both";
50
50
  }
51
51
 
52
52
  export function readScrollAxes(
53
53
  element: Pick<
54
54
  HTMLElement,
55
- 'clientWidth' | 'clientHeight' | 'scrollWidth' | 'scrollHeight' | 'scrollLeft' | 'scrollTop'
55
+ "clientWidth" | "clientHeight" | "scrollWidth" | "scrollHeight" | "scrollLeft" | "scrollTop"
56
56
  >,
57
57
  options: {
58
58
  orientation: ScrollOrientation;
59
- direction: 'ltr' | 'rtl';
59
+ direction: "ltr" | "rtl";
60
60
  rtlModel?: RtlScrollModel;
61
61
  }
62
62
  ): ScrollAxesState {
63
- const allowX = options.orientation === 'horizontal' || options.orientation === 'both';
64
- const allowY = options.orientation === 'vertical' || options.orientation === 'both';
63
+ const allowX = options.orientation === "horizontal" || options.orientation === "both";
64
+ const allowY = options.orientation === "vertical" || options.orientation === "both";
65
65
 
66
66
  const maxX = Math.max(0, element.scrollWidth - element.clientWidth);
67
67
  const maxY = Math.max(0, element.scrollHeight - element.clientHeight);
68
68
 
69
- let x: ScrollEdgeState = 'none';
69
+ let x: ScrollEdgeState = "none";
70
70
  if (allowX) {
71
71
  let logicalScrollLeft = element.scrollLeft;
72
- if (options.direction === 'rtl') {
73
- const rtlModel = options.rtlModel ?? 'negative';
74
- if (rtlModel === 'negative') {
72
+ if (options.direction === "rtl") {
73
+ const rtlModel = options.rtlModel ?? "negative";
74
+ if (rtlModel === "negative") {
75
75
  logicalScrollLeft = -element.scrollLeft;
76
- } else if (rtlModel === 'positive-descending') {
76
+ } else if (rtlModel === "positive-descending") {
77
77
  logicalScrollLeft = maxX - element.scrollLeft;
78
78
  }
79
79
  }
@@ -81,7 +81,7 @@ export function readScrollAxes(
81
81
  x = resolveEdgeState(clamp(logicalScrollLeft, 0, maxX), maxX);
82
82
  }
83
83
 
84
- const y = allowY ? resolveEdgeState(clamp(element.scrollTop, 0, maxY), maxY) : 'none';
84
+ const y = allowY ? resolveEdgeState(clamp(element.scrollTop, 0, maxY), maxY) : "none";
85
85
 
86
86
  return { x, y };
87
87
  }
@@ -85,7 +85,7 @@
85
85
  // it owns is on screen.
86
86
  &[data-popup-open] {
87
87
  border-color: transparent;
88
- background-color: var(--fui-bg-tertiary, $fui-bg-tertiary);
88
+ background-color: var(--fui-control-selected-bg, $fui-bg-active);
89
89
  color: var(--fui-text-primary, $fui-text-primary);
90
90
  }
91
91
 
@@ -259,7 +259,7 @@
259
259
 
260
260
  @media (prefers-contrast: more) {
261
261
  .trigger {
262
- border-width: 2px;
262
+ border-width: var(--fui-stroke-default, 2px);
263
263
  border-color: var(--fui-text-primary, $fui-text-primary);
264
264
 
265
265
  &[data-popup-open] {
@@ -1,15 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Separator",
4
- "description": "Visual divider between content sections. Use to create clear visual boundaries and improve content organization.",
4
+ "description": "Draws a rule between sections of related content.",
5
5
  "category": "layout",
6
- "tags": [
7
- "separator",
8
- "divider",
9
- "hr",
10
- "line",
11
- "layout"
12
- ],
6
+ "tags": ["separator", "divider", "hr", "line", "layout"],
13
7
  "status": "stable",
14
8
  "sourcePath": "src/components/Separator/index.tsx",
15
9
  "exportName": "Separator",
@@ -26,22 +20,14 @@
26
20
  "description": "Direction of the separator",
27
21
  "default": "horizontal",
28
22
  "required": false,
29
- "values": [
30
- "horizontal",
31
- "vertical"
32
- ]
23
+ "values": ["horizontal", "vertical"]
33
24
  },
34
25
  "spacing": {
35
26
  "type": "enum",
36
27
  "description": "Margin around the separator",
37
28
  "default": "none",
38
29
  "required": false,
39
- "values": [
40
- "none",
41
- "sm",
42
- "md",
43
- "lg"
44
- ]
30
+ "values": ["none", "sm", "md", "lg"]
45
31
  },
46
32
  "soft": {
47
33
  "type": "boolean",
@@ -62,21 +48,20 @@
62
48
  },
63
49
  "usage": {
64
50
  "when": [
65
- "Dividing content sections",
66
- "Separating groups of related items",
67
- "Creating visual breathing room",
68
- "Labeled section breaks"
51
+ "Dividing sections that spacing alone cannot separate",
52
+ "Labelled breaks such as an Or divider",
53
+ "Splitting items inside a toolbar or row"
69
54
  ],
70
55
  "whenNot": [
71
- "Creating grid layouts (use CSS Grid)",
72
- "Decorative borders (use CSS)",
73
- "Spacing alone is sufficient"
56
+ "Whenever spacing already reads as a break",
57
+ "Decorative rules (use a border)",
58
+ "Building layout structure (use Grid)"
74
59
  ],
75
60
  "guidelines": [
76
- "Use sparingly - too many separators create visual noise",
77
- "Consider if spacing alone would work",
78
- "Use soft variant for subtle separation",
79
- "Labeled separators work well for major section breaks"
61
+ "Use sparingly stacked rules read as noise",
62
+ "soft halves the rule's weight for quieter breaks",
63
+ "orientation=\"vertical\" needs a parent with a set height",
64
+ "Add aria-hidden when the rule is purely decorative"
80
65
  ],
81
66
  "accessibility": [
82
67
  "Uses role=\"separator\" for semantic meaning",
@@ -86,28 +71,23 @@
86
71
  "examples": [
87
72
  {
88
73
  "name": "Default",
89
- "description": "Basic horizontal separator",
90
- "code": "<div style={{ width: '300px' }}>\n <p>Content above</p>\n <Separator spacing=\"md\" />\n <p>Content below</p>\n</div>"
74
+ "description": "Standard and soft weights, one above the other.",
75
+ "code": "import { Box } from '@/components/Box';\nimport { Separator } from '@/components/Separator';\nimport { Text } from '@/components/Text';\n\n<Box width=\"100%\">\n <Text>Standard weight</Text>\n <Separator spacing=\"md\" />\n <Text>Soft weight</Text>\n <Separator soft spacing=\"md\" />\n <Text>Below</Text>\n</Box>"
91
76
  },
92
77
  {
93
78
  "name": "With Label",
94
- "description": "Labeled section divider",
95
- "code": "<div style={{ width: '300px' }}>\n <p>First section</p>\n <Separator label=\"Or\" spacing=\"md\" />\n <p>Second section</p>\n</div>"
96
- },
97
- {
98
- "name": "Soft",
99
- "description": "Subtle separator",
100
- "code": "<div style={{ width: '300px' }}>\n <p>Content above</p>\n <Separator soft spacing=\"md\" />\n <p>Content below</p>\n</div>"
79
+ "description": "A label sits inside the rule for a major break.",
80
+ "code": "import { Box } from '@/components/Box';\nimport { Separator } from '@/components/Separator';\nimport { Text } from '@/components/Text';\n\n<Box width=\"100%\">\n <Text>First section</Text>\n <Separator label=\"Or\" spacing=\"md\" />\n <Text>Second section</Text>\n</Box>"
101
81
  },
102
82
  {
103
83
  "name": "Vertical",
104
- "description": "Vertical separator between elements",
105
- "code": "<div style={{ display: 'flex', alignItems: 'center', gap: '16px', height: '40px' }}>\n <span>Item 1</span>\n <Separator orientation=\"vertical\" />\n <span>Item 2</span>\n <Separator orientation=\"vertical\" />\n <span>Item 3</span>\n</div>"
84
+ "description": "Divides items sitting in a row.",
85
+ "code": "import { Box } from '@/components/Box';\nimport { Separator } from '@/components/Separator';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\n\n<Stack direction=\"row\" align=\"center\" gap=\"md\" style={{ height: '40px' }}>\n <Text>Item 1</Text>\n <Separator orientation=\"vertical\" />\n <Text>Item 2</Text>\n <Separator orientation=\"vertical\" />\n <Text>Item 3</Text>\n</Stack>"
106
86
  },
107
87
  {
108
88
  "name": "Spacing Options",
109
- "description": "Different spacing sizes",
110
- "code": "<div style={{ width: '300px' }}>\n <p>No spacing</p>\n <Separator spacing=\"none\" />\n <p>Small spacing</p>\n <Separator spacing=\"sm\" />\n <p>Medium spacing</p>\n <Separator spacing=\"md\" />\n <p>Large spacing</p>\n <Separator spacing=\"lg\" />\n <p>End</p>\n</div>"
89
+ "description": "spacing sets the breathing room around the rule.",
90
+ "code": "import { Box } from '@/components/Box';\nimport { Separator } from '@/components/Separator';\nimport { Text } from '@/components/Text';\n\n<Box width=\"100%\">\n <Text>none</Text>\n <Separator spacing=\"none\" />\n <Text>sm</Text>\n <Separator spacing=\"sm\" />\n <Text>md</Text>\n <Separator spacing=\"md\" />\n <Text>lg</Text>\n <Separator spacing=\"lg\" />\n <Text>End</Text>\n</Box>"
111
91
  }
112
92
  ],
113
93
  "relations": [
@@ -124,15 +104,11 @@
124
104
  "soft: boolean - lighter appearance",
125
105
  "label: string - centered label text"
126
106
  ],
127
- "a11yRules": [
128
- "A11Y_SEPARATOR_ROLE"
129
- ]
107
+ "a11yRules": ["A11Y_SEPARATOR_ROLE"]
130
108
  },
131
109
  "ai": {
132
110
  "compositionPattern": "compound",
133
- "subComponents": [
134
- "Root"
135
- ]
111
+ "subComponents": ["Root"]
136
112
  },
137
113
  "provenance": {
138
114
  "source": "migrated",