@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
@@ -5,9 +5,14 @@ import { useResolvedControlSize } from "../ComponentDefaults";
5
5
  import { useTheme, type ThemeMode } from "../Theme/context";
6
6
  import styles from "./ThemeToggle.module.scss";
7
7
 
8
- export interface ThemeToggleProps extends React.HTMLAttributes<HTMLDivElement> {
8
+ export interface ThemeToggleProps extends React.HTMLAttributes<HTMLElement> {
9
9
  /** Size of the toggle button */
10
10
  size?: "sm" | "md" | "lg";
11
+ /**
12
+ * `group` is the segmented light/dark control. `icon` is a single button
13
+ * that shows the current resolved theme and toggles light ↔ dark.
14
+ */
15
+ appearance?: "group" | "icon";
11
16
  /** Whether to include system mode option (default: false) */
12
17
  showSystem?: boolean;
13
18
  /** Controlled value for custom usage (bypasses theme context) */
@@ -71,6 +76,7 @@ function MonitorIcon({ size = 20 }: { size?: number }) {
71
76
  */
72
77
  export function ThemeToggle({
73
78
  size: sizeProp,
79
+ appearance = "group",
74
80
  showSystem = false,
75
81
  value: controlledValue,
76
82
  onValueChange,
@@ -79,10 +85,44 @@ export function ThemeToggle({
79
85
  ...htmlProps
80
86
  }: ThemeToggleProps) {
81
87
  const size = useResolvedControlSize(sizeProp);
82
- const { mode: contextMode, setMode: setContextMode } = useTheme();
88
+ const {
89
+ mode: contextMode,
90
+ setMode: setContextMode,
91
+ resolvedMode,
92
+ toggleMode,
93
+ } = useTheme();
83
94
 
84
95
  const isControlled = controlledValue !== undefined;
85
96
  const currentMode = isControlled ? controlledValue : contextMode;
97
+ const sizeClass = styles[`size${size.charAt(0).toUpperCase() + size.slice(1)}`];
98
+
99
+ if (appearance === "icon") {
100
+ const resolved = isControlled ? controlledValue : resolvedMode;
101
+ const nextMode = resolved === "dark" ? "light" : "dark";
102
+ const iconClasses = [styles.toggleButton, styles.iconButton, sizeClass, className]
103
+ .filter(Boolean)
104
+ .join(" ");
105
+
106
+ return (
107
+ <button
108
+ {...(htmlProps as React.ButtonHTMLAttributes<HTMLButtonElement>)}
109
+ type="button"
110
+ className={iconClasses}
111
+ onClick={() => {
112
+ if (isControlled) {
113
+ onValueChange?.(nextMode);
114
+ } else {
115
+ toggleMode();
116
+ }
117
+ }}
118
+ aria-label={
119
+ ariaLabel ?? (resolved === "dark" ? "Switch to light mode" : "Switch to dark mode")
120
+ }
121
+ >
122
+ {resolved === "dark" ? <MoonIcon /> : <SunIcon />}
123
+ </button>
124
+ );
125
+ }
86
126
 
87
127
  const handleModeChange = (newMode: "light" | "dark") => {
88
128
  if (isControlled) {
@@ -92,11 +132,7 @@ export function ThemeToggle({
92
132
  }
93
133
  };
94
134
 
95
- const groupClasses = [
96
- styles.toggleGroup,
97
- styles[`size${size.charAt(0).toUpperCase() + size.slice(1)}`],
98
- className,
99
- ]
135
+ const groupClasses = [styles.toggleGroup, sizeClass, className]
100
136
  .filter(Boolean)
101
137
  .join(" ");
102
138
 
@@ -1,16 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "ThinkingIndicator",
4
- "description": "Animated indicator showing AI is processing",
4
+ "description": "Shows that an AI response is being generated.",
5
5
  "category": "ai",
6
- "tags": [
7
- "thinking",
8
- "loading",
9
- "ai",
10
- "processing",
11
- "indicator",
12
- "animation"
13
- ],
6
+ "tags": ["thinking", "loading", "ai", "processing", "indicator", "animation"],
14
7
  "status": "stable",
15
8
  "sourcePath": "src/components/ThinkingIndicator/index.tsx",
16
9
  "exportName": "ThinkingIndicator",
@@ -39,11 +32,7 @@
39
32
  "description": "Animation style",
40
33
  "default": "dots",
41
34
  "required": false,
42
- "values": [
43
- "dots",
44
- "pulse",
45
- "spinner"
46
- ]
35
+ "values": ["dots", "pulse", "spinner"]
47
36
  },
48
37
  "showElapsed": {
49
38
  "type": "boolean",
@@ -59,21 +48,21 @@
59
48
  },
60
49
  "usage": {
61
50
  "when": [
62
- "AI is processing a request and generating a response",
63
- "Need visual feedback during async AI operations",
64
- "Want to show multi-step progress for complex AI tasks",
65
- "Indicating streaming is about to begin"
51
+ "A model is working on a request",
52
+ "Async AI work that would otherwise look frozen",
53
+ "Multi-stage tasks worth showing stage by stage",
54
+ "The moment before streaming starts"
66
55
  ],
67
56
  "whenNot": [
68
- "Simple loading states (use Progress or Skeleton)",
69
- "Form submission loading (use Button loading state)",
70
- "Page-level loading (use Progress or Skeleton)"
57
+ "Ordinary loading (use Progress or Skeleton)",
58
+ "Form submission (use the Button loading state)",
59
+ "Whole-page loading (use Progress or Skeleton)"
71
60
  ],
72
61
  "guidelines": [
73
- "Use active prop to control visibility",
74
- "Choose variant based on context (dots for chat, spinner for actions)",
75
- "Enable showElapsed for longer operations",
76
- "Use steps for multi-step AI workflows (tool calls, research)"
62
+ "active controls whether it shows at all",
63
+ "dots suits chat; spinner suits a discrete action",
64
+ "Turn on showElapsed once waits run past a few seconds",
65
+ "Use steps for tool calls, research, and other staged work"
77
66
  ],
78
67
  "accessibility": [
79
68
  "Uses role=\"status\" and aria-live=\"polite\"",
@@ -85,37 +74,37 @@
85
74
  "examples": [
86
75
  {
87
76
  "name": "Dots (Default)",
88
- "description": "Bouncing dots animation",
77
+ "description": "Three dots bounce in sequence; the quietest option.",
89
78
  "code": "<ThinkingIndicator variant=\"dots\" label=\"Thinking...\" />"
90
79
  },
91
80
  {
92
81
  "name": "Pulse",
93
- "description": "Pulsing ring animation",
82
+ "description": "A single ring breathes in place.",
94
83
  "code": "<ThinkingIndicator variant=\"pulse\" label=\"Processing...\" />"
95
84
  },
96
85
  {
97
86
  "name": "Spinner",
98
- "description": "Rotating spinner animation",
87
+ "description": "A rotating arc, for work with a definite end.",
99
88
  "code": "<ThinkingIndicator variant=\"spinner\" label=\"Loading...\" />"
100
89
  },
101
90
  {
102
91
  "name": "With Elapsed Time",
103
- "description": "Shows time since started",
92
+ "description": "A live counter reassures the reader during long waits.",
104
93
  "code": "<ThinkingIndicator\n variant=\"dots\"\n label=\"Generating response...\"\n showElapsed\n/>"
105
94
  },
106
95
  {
107
96
  "name": "Multi-Step Progress",
108
- "description": "Shows progress through multiple steps",
97
+ "description": "Finished, running, and queued stages read at a glance.",
109
98
  "code": "<ThinkingIndicator\n variant=\"spinner\"\n label=\"Working...\"\n steps={[\n { id: '1', label: 'Analyzing request', status: 'complete' },\n { id: '2', label: 'Searching knowledge base', status: 'active' },\n { id: '3', label: 'Generating response', status: 'pending' },\n ]}\n/>"
110
99
  },
111
100
  {
112
101
  "name": "With Error Step",
113
- "description": "Shows a step that encountered an error",
102
+ "description": "A failed stage turns red while the next one retries.",
114
103
  "code": "<ThinkingIndicator\n variant=\"spinner\"\n label=\"Retrying...\"\n steps={[\n { id: '1', label: 'Connecting to API', status: 'complete' },\n { id: '2', label: 'Fetching data', status: 'error' },\n { id: '3', label: 'Retrying with fallback', status: 'active' },\n ]}\n/>"
115
104
  },
116
105
  {
117
106
  "name": "Custom Label",
118
- "description": "Custom status text",
107
+ "description": "Name the actual task instead of a generic status.",
119
108
  "code": "<ThinkingIndicator\n variant=\"dots\"\n label=\"Claude is writing code...\"\n/>"
120
109
  }
121
110
  ],
@@ -144,17 +133,11 @@
144
133
  "showElapsed: boolean - show elapsed time",
145
134
  "steps: ThinkingStep[] - multi-step progress"
146
135
  ],
147
- "a11yRules": [
148
- "A11Y_ARIA_LIVE",
149
- "A11Y_MOTION_PREFERENCE"
150
- ]
136
+ "a11yRules": ["A11Y_ARIA_LIVE", "A11Y_MOTION_PREFERENCE"]
151
137
  },
152
138
  "ai": {
153
139
  "compositionPattern": "compound",
154
- "subComponents": [
155
- "Steps",
156
- "Step"
157
- ]
140
+ "subComponents": ["Steps", "Step"]
158
141
  },
159
142
  "provenance": {
160
143
  "source": "migrated",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Toast",
4
- "description": "Brief, non-blocking notification messages",
4
+ "description": "Briefly reports what just happened, without blocking the page.",
5
5
  "category": "feedback",
6
6
  "tags": ["notification", "alert", "message", "feedback"],
7
7
  "status": "stable",
@@ -70,62 +70,52 @@
70
70
  },
71
71
  "usage": {
72
72
  "when": [
73
- "Providing feedback after an action",
74
- "Showing success/error status of operations",
75
- "Non-critical information that doesn't require action",
76
- "Temporary messages that auto-dismiss"
73
+ "Confirming an action landed",
74
+ "Reporting whether an operation worked",
75
+ "News the user does not have to act on",
76
+ "Messages that can disappear on their own"
77
77
  ],
78
78
  "whenNot": [
79
- "Critical errors requiring user action (use Dialog)",
80
- "Persistent information (use Alert)",
81
- "Inline validation (use form error states)",
82
- "System-wide announcements (use Banner)"
79
+ "Errors the user must resolve — use Dialog",
80
+ "Anything that must stay on screen — use Alert",
81
+ "Field-level validation use form error states",
82
+ "Site-wide notices use a banner"
83
83
  ],
84
84
  "guidelines": [
85
- "Keep messages brief and actionable",
86
- "Use appropriate variant for the message type",
87
- "Auto-dismiss after reasonable duration (3-5s)",
88
- "Allow manual dismissal for longer messages",
89
- "Limit number of simultaneous toasts",
90
- "useToast() variant helpers accept either (title, description?) or an options object for action/duration/id"
85
+ "One sentence, plus a title if it helps",
86
+ "Match the variant to what actually happened",
87
+ "Auto-dismiss in three to five seconds",
88
+ "Anything with an action needs a manual dismiss too",
89
+ "Two or three on screen at once, no more",
90
+ "useToast() helpers take (title, description) or an options object for action, duration, and id"
91
91
  ],
92
92
  "accessibility": [
93
- "Use role=\"alert\" for important messages",
94
- "Ensure sufficient display time for reading",
95
- "Don't rely solely on color for meaning",
96
- "Provide dismiss button with accessible label"
93
+ "role=\"alert\" for anything the user must not miss",
94
+ "Leave enough time to read it",
95
+ "Never let colour be the only signal",
96
+ "Give the dismiss button a real label"
97
97
  ]
98
98
  },
99
99
  "examples": [
100
100
  {
101
101
  "name": "Default",
102
- "description": "Interactive toast demo - click buttons to trigger toasts (includes helper object syntax example)",
103
- "code": "<ToastDemoWrapper />"
102
+ "description": "Neutral message with a title and one line under it.",
103
+ "code": "<Toast\n title=\"Draft saved\"\n description=\"We will keep it until you publish.\"\n/>"
104
104
  },
105
105
  {
106
- "name": "Success",
107
- "description": "Success message variant",
108
- "code": "<Toast\n title=\"Success!\"\n description=\"Your changes have been saved.\"\n variant=\"success\"\n/>"
106
+ "name": "Variants",
107
+ "description": "Icon and colour together carry the outcome.",
108
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"column\" gap=\"sm\">\n <Toast\n title=\"Success!\"\n description=\"Your changes have been saved.\"\n variant=\"success\"\n />\n <Toast\n title=\"Error\"\n description=\"Failed to save changes. Please try again.\"\n variant=\"error\"\n />\n <Toast\n title=\"Warning\"\n description=\"This action cannot be undone.\"\n variant=\"warning\"\n />\n <Toast\n title=\"New update\"\n description=\"Version 2.0 is now available.\"\n variant=\"info\"\n />\n</Stack>"
109
109
  },
110
110
  {
111
- "name": "Error",
112
- "description": "Error message variant",
113
- "code": "<Toast\n title=\"Error\"\n description=\"Failed to save changes. Please try again.\"\n variant=\"error\"\n/>"
114
- },
115
- {
116
- "name": "Warning",
117
- "description": "Warning message variant",
118
- "code": "<Toast\n title=\"Warning\"\n description=\"This action cannot be undone.\"\n variant=\"warning\"\n/>"
119
- },
120
- {
121
- "name": "Info",
122
- "description": "Informational message variant",
123
- "code": "<Toast\n title=\"New Update\"\n description=\"Version 2.0 is now available.\"\n variant=\"info\"\n/>"
111
+ "name": "With Action",
112
+ "description": "One-tap way back from something destructive.",
113
+ "code": "<Toast\n title=\"File deleted\"\n description=\"The file has been moved to trash.\"\n action={{\n label: 'Undo',\n onClick: () => {},\n }}\n/>"
124
114
  },
125
115
  {
126
- "name": "With Action",
127
- "description": "Toast with an action button",
128
- "code": "<Toast\n title=\"File deleted\"\n description=\"The file has been moved to trash.\"\n action={{\n label: 'Undo',\n onClick: () => console.log('Undo clicked'),\n }}\n/>"
116
+ "name": "Dismissible",
117
+ "description": "onDismiss adds a close button for longer messages.",
118
+ "code": "<Toast\n title=\"Export running\"\n description=\"We will email you when the file is ready.\"\n variant=\"info\"\n onDismiss={() => {}}\n/>"
129
119
  }
130
120
  ],
131
121
  "relations": [
@@ -68,7 +68,7 @@
68
68
  @keyframes toastEnter {
69
69
  from {
70
70
  opacity: 0;
71
- transform: translateY($fui-anim-offset-md) scale(0.96);
71
+ transform: translateY(var(--fui-anim-offset-md, #{$fui-anim-offset-md})) scale(0.95);
72
72
  }
73
73
 
74
74
  to {
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "ToggleGroup",
4
- "description": "A group of toggle buttons where only one can be selected at a time. Useful for switching between views, modes, or options.",
5
- "category": "forms",
4
+ "description": "Picks exactly one option from a short row of toggle buttons.",
5
+ "category": "actions",
6
6
  "tags": ["toggle", "group", "fragmented", "control", "tabs", "switch"],
7
7
  "status": "stable",
8
8
  "sourcePath": "src/components/ToggleGroup/index.tsx",
@@ -75,64 +75,63 @@
75
75
  "usage": {
76
76
  "when": [
77
77
  "Switching between mutually exclusive views or modes",
78
- "Selecting one option from a small set (2-5 options)",
79
- "Fragmented controls like view switchers",
80
- "Filter or sort options"
78
+ "Choosing one of two to five options",
79
+ "View switchers and segmented filters"
81
80
  ],
82
81
  "whenNot": [
83
- "Multiple selections allowed (use Checkbox group)",
84
- "Many options (use Select or RadioGroup)",
85
- "Navigation between pages (use Tabs)",
86
- "On/off toggle (use Switch component)"
82
+ "More than one can be picked — use a Checkbox group",
83
+ "More than five options use Select or RadioGroup",
84
+ "Moving between pages use Tabs",
85
+ "A single on/off use Switch"
87
86
  ],
88
87
  "guidelines": [
89
- "Keep options to 2-5 items for clarity",
90
- "Use clear, concise labels",
91
- "Consider icons for common actions (grid/list view)",
92
- "Use default for an inset tonal rail, pills for an open filter cluster, and outline for connected bordered segments",
93
- "Ensure adequate touch targets on mobile"
88
+ "Two to five items",
89
+ "Labels short enough to scan in one pass",
90
+ "Icons work for well-known modes like grid and list",
91
+ "default for an inset tonal rail, pills for an open filter cluster, outlined for connected segments",
92
+ "Keep targets at least 24px on touch"
94
93
  ],
95
94
  "accessibility": [
96
- "Uses role=\"radiogroup\" for single-selection semantics",
97
- "Each item has role=\"radio\" with aria-checked",
98
- "Keyboard navigable with Tab and arrow keys",
99
- "Focus visible on active item"
95
+ "The group is a radiogroup; each item is a radio with aria-checked",
96
+ "Arrow keys move between items, Tab enters and leaves the group",
97
+ "Icon-only items still need an aria-label",
98
+ "Focus stays visible on the selected item"
100
99
  ]
101
100
  },
102
101
  "examples": [
103
102
  {
104
103
  "name": "Default",
105
- "description": "Basic toggle group",
104
+ "description": "Inset tonal rail; the selected segment lifts.",
106
105
  "code": "<ToggleGroup value={value} onChange={setValue}>\n <ToggleGroup.Item value=\"left\">Left</ToggleGroup.Item>\n <ToggleGroup.Item value=\"center\">Center</ToggleGroup.Item>\n <ToggleGroup.Item value=\"right\">Right</ToggleGroup.Item>\n</ToggleGroup>"
107
106
  },
108
107
  {
109
- "name": "Pills Variant",
110
- "description": "Pill-shaped toggle buttons",
108
+ "name": "Pills",
109
+ "description": "Detached rounded buttons for open filter clusters.",
111
110
  "code": "<ToggleGroup value={value} onChange={setValue} variant=\"pills\">\n <ToggleGroup.Item value=\"all\">All</ToggleGroup.Item>\n <ToggleGroup.Item value=\"active\">Active</ToggleGroup.Item>\n <ToggleGroup.Item value=\"completed\">Completed</ToggleGroup.Item>\n</ToggleGroup>"
112
111
  },
113
112
  {
114
- "name": "Outline Variant",
115
- "description": "Outlined toggle buttons",
113
+ "name": "Outlined",
114
+ "description": "Bordered segments sharing one continuous edge.",
116
115
  "code": "<ToggleGroup value={value} onChange={setValue} variant=\"outlined\">\n <ToggleGroup.Item value=\"day\">Day</ToggleGroup.Item>\n <ToggleGroup.Item value=\"week\">Week</ToggleGroup.Item>\n <ToggleGroup.Item value=\"month\">Month</ToggleGroup.Item>\n</ToggleGroup>"
117
116
  },
118
117
  {
119
118
  "name": "Uncontrolled",
120
- "description": "Use defaultValue for simple single-select state",
119
+ "description": "defaultValue when nothing outside needs the selection.",
121
120
  "code": "<ToggleGroup defaultValue=\"list\">\n <ToggleGroup.Item value=\"grid\">Grid</ToggleGroup.Item>\n <ToggleGroup.Item value=\"list\">List</ToggleGroup.Item>\n</ToggleGroup>"
122
121
  },
123
122
  {
124
123
  "name": "Sizes",
125
- "description": "Different size variants",
126
- "code": "<ToggleGroup value={value} onChange={setValue} size=\"sm\">\n <ToggleGroup.Item value=\"a\">Small</ToggleGroup.Item>\n <ToggleGroup.Item value=\"b\">Size</ToggleGroup.Item>\n</ToggleGroup>\n<ToggleGroup value={value} onChange={setValue} size=\"md\">\n <ToggleGroup.Item value=\"a\">Medium</ToggleGroup.Item>\n <ToggleGroup.Item value=\"b\">Size</ToggleGroup.Item>\n</ToggleGroup>"
124
+ "description": "sm for toolbars, lg where the rail anchors a page.",
125
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"column\" gap=\"md\" align=\"start\">\n <ToggleGroup defaultValue=\"a\" size=\"sm\">\n <ToggleGroup.Item value=\"a\">Small</ToggleGroup.Item>\n <ToggleGroup.Item value=\"b\">Rail</ToggleGroup.Item>\n </ToggleGroup>\n <ToggleGroup defaultValue=\"a\" size=\"md\">\n <ToggleGroup.Item value=\"a\">Medium</ToggleGroup.Item>\n <ToggleGroup.Item value=\"b\">Rail</ToggleGroup.Item>\n </ToggleGroup>\n <ToggleGroup defaultValue=\"a\" size=\"lg\">\n <ToggleGroup.Item value=\"a\">Large</ToggleGroup.Item>\n <ToggleGroup.Item value=\"b\">Rail</ToggleGroup.Item>\n </ToggleGroup>\n</Stack>"
127
126
  },
128
127
  {
129
128
  "name": "View Switcher",
130
- "description": "Common pattern for switching between views",
131
- "code": "<ToggleGroup value={view} onChange={setView} size=\"sm\">\n <ToggleGroup.Item value=\"grid\"><GridIcon /></ToggleGroup.Item>\n <ToggleGroup.Item value=\"list\"><ListIcon /></ToggleGroup.Item>\n</ToggleGroup>"
129
+ "description": "Icon-only modes, each named for screen readers.",
130
+ "code": "import { SquaresFour as GridIcon, ListBullets as ListIcon } from '@phosphor-icons/react';\n\n<ToggleGroup value={view} onChange={setView} size=\"sm\">\n <ToggleGroup.Item value=\"grid\" aria-label=\"Grid view\">\n <GridIcon aria-hidden />\n </ToggleGroup.Item>\n <ToggleGroup.Item value=\"list\" aria-label=\"List view\">\n <ListIcon aria-hidden />\n </ToggleGroup.Item>\n</ToggleGroup>"
132
131
  },
133
132
  {
134
- "name": "With Disabled Item",
135
- "description": "Toggle group with a disabled option",
133
+ "name": "Disabled Item",
134
+ "description": "One option locked out; the rest stay reachable.",
136
135
  "code": "<ToggleGroup value={value} onChange={setValue}>\n <ToggleGroup.Item value=\"basic\">Basic</ToggleGroup.Item>\n <ToggleGroup.Item value=\"pro\">Pro</ToggleGroup.Item>\n <ToggleGroup.Item value=\"enterprise\" disabled>Enterprise</ToggleGroup.Item>\n</ToggleGroup>"
137
136
  }
138
137
  ],
@@ -34,7 +34,6 @@
34
34
  position: relative;
35
35
  border: 0;
36
36
  white-space: nowrap;
37
- user-select: none;
38
37
  transition:
39
38
  background-color var(--fui-transition-fast, $fui-transition-fast),
40
39
  border-color var(--fui-transition-fast, $fui-transition-fast),
@@ -112,14 +111,36 @@
112
111
  var(--_fui-segmented-track) - var(--fui-raw-space-2, 2px) - var(--fui-raw-space-2, 2px)
113
112
  );
114
113
  background-color: transparent;
115
- border-radius: var(--fui-radius-md, $fui-radius-md);
114
+ // Connected segments: only outer corners are rounded. Per-item full radius
115
+ // left a rail-colored notch between items that reads as a gap.
116
+ border-radius: 0;
117
+
118
+ &:first-child {
119
+ border-start-start-radius: var(--fui-radius-md, $fui-radius-md);
120
+ border-end-start-radius: var(--fui-radius-md, $fui-radius-md);
121
+ }
122
+
123
+ &:last-child {
124
+ border-start-end-radius: var(--fui-radius-md, $fui-radius-md);
125
+ border-end-end-radius: var(--fui-radius-md, $fui-radius-md);
126
+ }
127
+
128
+ &:only-child {
129
+ border-radius: var(--fui-radius-md, $fui-radius-md);
130
+ }
116
131
 
117
132
  &:hover:not(:disabled):not(.selected) {
118
133
  background-color: var(--fui-bg-hover, $fui-bg-hover);
119
134
  }
120
135
 
121
136
  &.selected {
122
- background-color: var(--fui-toggle-group-selected-bg, var(--fui-selection-bg));
137
+ background-color: var(
138
+ --fui-toggle-group-selected-bg,
139
+ var(
140
+ --fui-control-selected-bg,
141
+ color-mix(in srgb, var(--fui-text-primary, #{$fui-text-primary}) 9%, transparent)
142
+ )
143
+ );
123
144
  box-shadow:
124
145
  inset 0 0 0 var(--fui-stroke-hairline, 1px)
125
146
  var(--fui-toggle-group-selected-border, transparent),
@@ -143,7 +164,13 @@
143
164
  }
144
165
 
145
166
  &.selected {
146
- background-color: var(--fui-toggle-group-selected-bg, var(--fui-selection-bg));
167
+ background-color: var(
168
+ --fui-toggle-group-selected-bg,
169
+ var(
170
+ --fui-control-selected-bg,
171
+ color-mix(in srgb, var(--fui-text-primary, #{$fui-text-primary}) 9%, transparent)
172
+ )
173
+ );
147
174
  box-shadow:
148
175
  inset 0 0 0 var(--fui-stroke-hairline, 1px)
149
176
  var(--fui-toggle-group-selected-border, transparent),
@@ -197,7 +224,13 @@
197
224
  }
198
225
 
199
226
  &.selected {
200
- background-color: var(--fui-toggle-group-selected-bg, var(--fui-selection-bg));
227
+ background-color: var(
228
+ --fui-toggle-group-selected-bg,
229
+ var(
230
+ --fui-control-selected-bg,
231
+ color-mix(in srgb, var(--fui-text-primary, #{$fui-text-primary}) 9%, transparent)
232
+ )
233
+ );
201
234
  box-shadow:
202
235
  inset 0 0 0 var(--fui-stroke-hairline, 1px)
203
236
  var(--fui-toggle-group-selected-border, transparent),