@usefragments/ui 1.7.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (551) hide show
  1. package/README.md +54 -66
  2. package/dist/assets/nav-glyph.cjs +139 -0
  3. package/dist/assets/nav-glyph.d.ts +28 -0
  4. package/dist/assets/nav-glyph.d.ts.map +1 -0
  5. package/dist/assets/nav-glyph.js +139 -0
  6. package/dist/assets/nav-glyph.module.scss.cjs +71 -0
  7. package/dist/assets/nav-glyph.module.scss.js +71 -0
  8. package/dist/assets/ui.css +4975 -4959
  9. package/dist/blocks/components/StatsCard.d.ts +1 -1
  10. package/dist/blocks/components/StatsCard.d.ts.map +1 -1
  11. package/dist/codeblock.cjs +23 -16
  12. package/dist/codeblock.js +16 -9
  13. package/dist/colorpicker.cjs +1 -0
  14. package/dist/colorpicker.js +1 -0
  15. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  16. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  17. package/dist/components/Alert/Alert.module.scss.cjs +21 -21
  18. package/dist/components/Alert/Alert.module.scss.js +21 -21
  19. package/dist/components/Alert/index.cjs +14 -8
  20. package/dist/components/Alert/index.d.ts +9 -9
  21. package/dist/components/Alert/index.d.ts.map +1 -1
  22. package/dist/components/Alert/index.js +14 -8
  23. package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
  24. package/dist/components/AppShell/AppShell.module.scss.js +14 -14
  25. package/dist/components/AppShell/index.cjs +2 -2
  26. package/dist/components/AppShell/index.js +2 -2
  27. package/dist/components/Avatar/Avatar.module.scss.cjs +14 -14
  28. package/dist/components/Avatar/Avatar.module.scss.js +14 -14
  29. package/dist/components/Badge/Badge.module.scss.cjs +33 -31
  30. package/dist/components/Badge/Badge.module.scss.js +33 -31
  31. package/dist/components/Badge/index.cjs +13 -3
  32. package/dist/components/Badge/index.d.ts +18 -13
  33. package/dist/components/Badge/index.d.ts.map +1 -1
  34. package/dist/components/Badge/index.js +13 -3
  35. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +14 -14
  36. package/dist/components/BentoGrid/BentoGrid.module.scss.js +14 -14
  37. package/dist/components/Box/Box.module.scss.cjs +152 -152
  38. package/dist/components/Box/Box.module.scss.js +152 -152
  39. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +11 -8
  40. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +11 -8
  41. package/dist/components/Breadcrumbs/index.cjs +1 -1
  42. package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
  43. package/dist/components/Breadcrumbs/index.js +1 -1
  44. package/dist/components/Button/Button.module.scss.cjs +36 -27
  45. package/dist/components/Button/Button.module.scss.js +36 -27
  46. package/dist/components/Button/index.cjs +20 -4
  47. package/dist/components/Button/index.d.ts +18 -10
  48. package/dist/components/Button/index.d.ts.map +1 -1
  49. package/dist/components/Button/index.js +20 -4
  50. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +15 -15
  51. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +15 -15
  52. package/dist/components/Card/Card.module.scss.cjs +27 -34
  53. package/dist/components/Card/Card.module.scss.js +27 -34
  54. package/dist/components/Card/index.cjs +13 -8
  55. package/dist/components/Card/index.d.ts +23 -25
  56. package/dist/components/Card/index.d.ts.map +1 -1
  57. package/dist/components/Card/index.js +13 -8
  58. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  59. package/dist/components/Chart/Chart.module.scss.js +15 -15
  60. package/dist/components/Checkbox/Checkbox.module.scss.cjs +11 -11
  61. package/dist/components/Checkbox/Checkbox.module.scss.js +11 -11
  62. package/dist/components/Checkbox/index.cjs +2 -2
  63. package/dist/components/Checkbox/index.d.ts +4 -6
  64. package/dist/components/Checkbox/index.d.ts.map +1 -1
  65. package/dist/components/Checkbox/index.js +2 -2
  66. package/dist/components/Chip/Chip.module.scss.cjs +19 -19
  67. package/dist/components/Chip/Chip.module.scss.js +19 -19
  68. package/dist/components/Chip/index.cjs +1 -2
  69. package/dist/components/Chip/index.d.ts +8 -3
  70. package/dist/components/Chip/index.d.ts.map +1 -1
  71. package/dist/components/Chip/index.js +1 -2
  72. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +22 -22
  73. package/dist/components/CodeBlock/CodeBlock.module.scss.js +22 -22
  74. package/dist/components/CodeBlock/index.d.ts +3 -2
  75. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  76. package/dist/components/Collapsible/Collapsible.module.scss.cjs +9 -9
  77. package/dist/components/Collapsible/Collapsible.module.scss.js +9 -9
  78. package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +14 -14
  79. package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
  80. package/dist/components/ColorPicker/index.d.ts.map +1 -1
  81. package/dist/components/Combobox/Combobox.module.scss.cjs +21 -21
  82. package/dist/components/Combobox/Combobox.module.scss.js +21 -21
  83. package/dist/components/Combobox/index.cjs +9 -5
  84. package/dist/components/Combobox/index.d.ts.map +1 -1
  85. package/dist/components/Combobox/index.js +9 -5
  86. package/dist/components/Command/Command.module.scss.cjs +14 -11
  87. package/dist/components/Command/Command.module.scss.js +14 -11
  88. package/dist/components/Command/index.cjs +2 -1
  89. package/dist/components/Command/index.d.ts +6 -1
  90. package/dist/components/Command/index.d.ts.map +1 -1
  91. package/dist/components/Command/index.js +2 -1
  92. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  93. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  94. package/dist/components/ConversationList/index.cjs +2 -2
  95. package/dist/components/ConversationList/index.js +2 -2
  96. package/dist/components/DataTable/DataTable.module.scss.cjs +31 -28
  97. package/dist/components/DataTable/DataTable.module.scss.js +31 -28
  98. package/dist/components/DataTable/DataTable.virtual.d.ts.map +1 -1
  99. package/dist/components/DatePicker/DatePicker.module.scss.cjs +33 -33
  100. package/dist/components/DatePicker/DatePicker.module.scss.js +33 -33
  101. package/dist/components/DatePicker/index.d.ts.map +1 -1
  102. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  103. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  104. package/dist/components/Dialog/index.cjs +2 -2
  105. package/dist/components/Dialog/index.d.ts +5 -4
  106. package/dist/components/Dialog/index.d.ts.map +1 -1
  107. package/dist/components/Dialog/index.js +2 -2
  108. package/dist/components/Drawer/Drawer.module.scss.cjs +39 -39
  109. package/dist/components/Drawer/Drawer.module.scss.js +40 -40
  110. package/dist/components/Drawer/index.cjs +2 -2
  111. package/dist/components/Drawer/index.d.ts +5 -4
  112. package/dist/components/Drawer/index.d.ts.map +1 -1
  113. package/dist/components/Drawer/index.js +2 -2
  114. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  115. package/dist/components/Editor/Editor.module.scss.js +17 -17
  116. package/dist/components/EmptyState/EmptyState.module.scss.cjs +11 -11
  117. package/dist/components/EmptyState/EmptyState.module.scss.js +11 -11
  118. package/dist/components/EmptyState/index.cjs +9 -4
  119. package/dist/components/EmptyState/index.d.ts +8 -5
  120. package/dist/components/EmptyState/index.d.ts.map +1 -1
  121. package/dist/components/EmptyState/index.js +9 -4
  122. package/dist/components/Field/Field.module.scss.cjs +5 -5
  123. package/dist/components/Field/Field.module.scss.js +5 -5
  124. package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
  125. package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
  126. package/dist/components/Grid/Grid.module.scss.cjs +54 -54
  127. package/dist/components/Grid/Grid.module.scss.js +54 -54
  128. package/dist/components/Header/Header.module.scss.cjs +33 -33
  129. package/dist/components/Header/Header.module.scss.js +33 -33
  130. package/dist/components/Icon/Icon.module.scss.cjs +30 -33
  131. package/dist/components/Icon/Icon.module.scss.js +30 -33
  132. package/dist/components/Icon/index.cjs +15 -14
  133. package/dist/components/Icon/index.d.ts +23 -12
  134. package/dist/components/Icon/index.d.ts.map +1 -1
  135. package/dist/components/Icon/index.js +15 -14
  136. package/dist/components/IconButton/IconButton.module.scss.cjs +12 -12
  137. package/dist/components/IconButton/IconButton.module.scss.js +12 -12
  138. package/dist/components/IconButton/index.d.ts +4 -4
  139. package/dist/components/IconButton/index.d.ts.map +1 -1
  140. package/dist/components/Input/Input.module.scss.cjs +15 -21
  141. package/dist/components/Input/Input.module.scss.js +15 -21
  142. package/dist/components/Input/index.cjs +2 -14
  143. package/dist/components/Input/index.d.ts +0 -2
  144. package/dist/components/Input/index.d.ts.map +1 -1
  145. package/dist/components/Input/index.js +2 -14
  146. package/dist/components/Link/Link.module.scss.cjs +24 -16
  147. package/dist/components/Link/Link.module.scss.js +24 -16
  148. package/dist/components/Link/index.cjs +13 -2
  149. package/dist/components/Link/index.d.ts +10 -3
  150. package/dist/components/Link/index.d.ts.map +1 -1
  151. package/dist/components/Link/index.js +13 -2
  152. package/dist/components/List/List.module.scss.cjs +23 -19
  153. package/dist/components/List/List.module.scss.js +23 -19
  154. package/dist/components/List/index.cjs +7 -7
  155. package/dist/components/List/index.d.ts +10 -7
  156. package/dist/components/List/index.d.ts.map +1 -1
  157. package/dist/components/List/index.js +7 -7
  158. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  159. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  160. package/dist/components/Loading/Loading.module.scss.cjs +30 -30
  161. package/dist/components/Loading/Loading.module.scss.js +30 -30
  162. package/dist/components/Loading/index.cjs +5 -5
  163. package/dist/components/Loading/index.d.ts +8 -7
  164. package/dist/components/Loading/index.d.ts.map +1 -1
  165. package/dist/components/Loading/index.js +5 -5
  166. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  167. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  168. package/dist/components/Menu/Menu.module.scss.cjs +14 -14
  169. package/dist/components/Menu/Menu.module.scss.js +14 -14
  170. package/dist/components/Message/Message.module.scss.cjs +20 -20
  171. package/dist/components/Message/Message.module.scss.js +20 -20
  172. package/dist/components/Message/index.cjs +1 -1
  173. package/dist/components/Message/index.d.ts +1 -1
  174. package/dist/components/Message/index.js +1 -1
  175. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +29 -29
  176. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +29 -29
  177. package/dist/components/Pagination/Pagination.module.scss.cjs +10 -10
  178. package/dist/components/Pagination/Pagination.module.scss.js +10 -10
  179. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  180. package/dist/components/Popover/Popover.module.scss.js +10 -10
  181. package/dist/components/Progress/Progress.module.scss.cjs +28 -25
  182. package/dist/components/Progress/Progress.module.scss.js +28 -25
  183. package/dist/components/Progress/index.cjs +21 -12
  184. package/dist/components/Progress/index.d.ts +10 -6
  185. package/dist/components/Progress/index.d.ts.map +1 -1
  186. package/dist/components/Progress/index.js +21 -12
  187. package/dist/components/Prompt/Prompt.module.scss.cjs +30 -30
  188. package/dist/components/Prompt/Prompt.module.scss.js +30 -30
  189. package/dist/components/Prompt/index.cjs +7 -7
  190. package/dist/components/Prompt/index.d.ts +11 -9
  191. package/dist/components/Prompt/index.d.ts.map +1 -1
  192. package/dist/components/Prompt/index.js +7 -7
  193. package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +20 -17
  194. package/dist/components/RadioGroup/RadioGroup.module.scss.js +20 -17
  195. package/dist/components/RadioGroup/index.cjs +10 -5
  196. package/dist/components/RadioGroup/index.d.ts +11 -7
  197. package/dist/components/RadioGroup/index.d.ts.map +1 -1
  198. package/dist/components/RadioGroup/index.js +10 -5
  199. package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +5 -5
  200. package/dist/components/ScrollArea/ScrollArea.module.scss.js +5 -5
  201. package/dist/components/Select/Select.module.scss.cjs +21 -21
  202. package/dist/components/Select/Select.module.scss.js +21 -21
  203. package/dist/components/Select/index.cjs +26 -20
  204. package/dist/components/Select/index.d.ts +5 -5
  205. package/dist/components/Select/index.d.ts.map +1 -1
  206. package/dist/components/Select/index.js +26 -20
  207. package/dist/components/Separator/Separator.module.scss.cjs +25 -19
  208. package/dist/components/Separator/Separator.module.scss.js +25 -19
  209. package/dist/components/Separator/index.cjs +10 -8
  210. package/dist/components/Separator/index.d.ts +4 -2
  211. package/dist/components/Separator/index.d.ts.map +1 -1
  212. package/dist/components/Separator/index.js +10 -8
  213. package/dist/components/Sidebar/Sidebar.module.scss.cjs +43 -43
  214. package/dist/components/Sidebar/Sidebar.module.scss.js +43 -43
  215. package/dist/components/Sidebar/index.cjs +3 -3
  216. package/dist/components/Sidebar/index.js +3 -3
  217. package/dist/components/Skeleton/Skeleton.module.scss.cjs +46 -46
  218. package/dist/components/Skeleton/Skeleton.module.scss.js +46 -46
  219. package/dist/components/Skeleton/index.cjs +7 -7
  220. package/dist/components/Skeleton/index.d.ts +8 -7
  221. package/dist/components/Skeleton/index.d.ts.map +1 -1
  222. package/dist/components/Skeleton/index.js +7 -7
  223. package/dist/components/Slider/Slider.module.scss.cjs +12 -12
  224. package/dist/components/Slider/Slider.module.scss.js +12 -12
  225. package/dist/components/Switch/Switch.module.scss.cjs +9 -9
  226. package/dist/components/Switch/Switch.module.scss.js +9 -9
  227. package/dist/components/Table/Table.module.scss.cjs +15 -15
  228. package/dist/components/Table/Table.module.scss.js +15 -15
  229. package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +15 -15
  230. package/dist/components/TableOfContents/TableOfContents.module.scss.js +15 -15
  231. package/dist/components/TableOfContents/index.cjs +1 -1
  232. package/dist/components/TableOfContents/index.js +1 -1
  233. package/dist/components/Tabs/Tabs.module.scss.cjs +18 -18
  234. package/dist/components/Tabs/Tabs.module.scss.js +18 -18
  235. package/dist/components/Tabs/index.cjs +5 -6
  236. package/dist/components/Tabs/index.d.ts +8 -6
  237. package/dist/components/Tabs/index.d.ts.map +1 -1
  238. package/dist/components/Tabs/index.js +5 -6
  239. package/dist/components/Text/Text.module.scss.cjs +105 -105
  240. package/dist/components/Text/Text.module.scss.js +105 -105
  241. package/dist/components/Text/index.cjs +5 -9
  242. package/dist/components/Text/index.d.ts +15 -11
  243. package/dist/components/Text/index.d.ts.map +1 -1
  244. package/dist/components/Text/index.js +5 -9
  245. package/dist/components/Textarea/Textarea.module.scss.cjs +22 -28
  246. package/dist/components/Textarea/Textarea.module.scss.js +22 -28
  247. package/dist/components/Textarea/index.cjs +3 -10
  248. package/dist/components/Textarea/index.d.ts +0 -2
  249. package/dist/components/Textarea/index.d.ts.map +1 -1
  250. package/dist/components/Textarea/index.js +3 -10
  251. package/dist/components/Theme/index.cjs +20 -4
  252. package/dist/components/Theme/index.d.ts +6 -12
  253. package/dist/components/Theme/index.d.ts.map +1 -1
  254. package/dist/components/Theme/index.js +20 -4
  255. package/dist/components/ThemeToggle/ThemeButton.cjs +51 -0
  256. package/dist/components/ThemeToggle/ThemeButton.d.ts +16 -0
  257. package/dist/components/ThemeToggle/ThemeButton.d.ts.map +1 -0
  258. package/dist/components/ThemeToggle/ThemeButton.js +34 -0
  259. package/dist/components/ThemeToggle/ThemeToggle.module.scss.cjs +6 -9
  260. package/dist/components/ThemeToggle/ThemeToggle.module.scss.js +6 -9
  261. package/dist/components/ThemeToggle/icons.cjs +48 -0
  262. package/dist/components/ThemeToggle/icons.d.ts +10 -0
  263. package/dist/components/ThemeToggle/icons.d.ts.map +1 -0
  264. package/dist/components/ThemeToggle/icons.js +48 -0
  265. package/dist/components/ThemeToggle/index.cjs +5 -74
  266. package/dist/components/ThemeToggle/index.d.ts +5 -8
  267. package/dist/components/ThemeToggle/index.d.ts.map +1 -1
  268. package/dist/components/ThemeToggle/index.js +3 -72
  269. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +18 -15
  270. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +18 -15
  271. package/dist/components/ThinkingIndicator/index.cjs +7 -8
  272. package/dist/components/ThinkingIndicator/index.d.ts +6 -5
  273. package/dist/components/ThinkingIndicator/index.d.ts.map +1 -1
  274. package/dist/components/ThinkingIndicator/index.js +7 -8
  275. package/dist/components/Toast/Toast.module.scss.cjs +28 -29
  276. package/dist/components/Toast/Toast.module.scss.js +29 -30
  277. package/dist/components/Toast/index.cjs +28 -30
  278. package/dist/components/Toast/index.d.ts +9 -8
  279. package/dist/components/Toast/index.d.ts.map +1 -1
  280. package/dist/components/Toast/index.js +28 -30
  281. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +21 -19
  282. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +22 -20
  283. package/dist/components/ToggleGroup/index.cjs +4 -5
  284. package/dist/components/ToggleGroup/index.d.ts +7 -6
  285. package/dist/components/ToggleGroup/index.d.ts.map +1 -1
  286. package/dist/components/ToggleGroup/index.js +4 -5
  287. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  288. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  289. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.cjs +1 -1
  290. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.js +1 -1
  291. package/dist/data-table-virtual.cjs +3 -2
  292. package/dist/data-table-virtual.js +3 -2
  293. package/dist/data-table.cjs +1 -1
  294. package/dist/data-table.js +1 -1
  295. package/dist/datepicker.cjs +23 -11
  296. package/dist/datepicker.js +23 -11
  297. package/dist/index.cjs +5 -1
  298. package/dist/index.d.ts +8 -8
  299. package/dist/index.d.ts.map +1 -1
  300. package/dist/index.js +6 -2
  301. package/dist/measurements/generated.cjs +37 -93
  302. package/dist/measurements/generated.d.ts +37 -92
  303. package/dist/measurements/generated.d.ts.map +1 -1
  304. package/dist/measurements/generated.js +37 -93
  305. package/dist/measurements/index.d.ts +1 -1
  306. package/dist/measurements/index.d.ts.map +1 -1
  307. package/dist/utils/seed-derivation.cjs +0 -1
  308. package/dist/utils/seed-derivation.d.ts +1 -3
  309. package/dist/utils/seed-derivation.d.ts.map +1 -1
  310. package/dist/utils/seed-derivation.js +0 -1
  311. package/dist/utils/theme-presets.cjs +5 -10
  312. package/dist/utils/theme-presets.d.ts +1 -2
  313. package/dist/utils/theme-presets.d.ts.map +1 -1
  314. package/dist/utils/theme-presets.js +5 -10
  315. package/fragments.json +1 -1
  316. package/package.json +5 -8
  317. package/src/assets/nav-glyph.module.scss +166 -0
  318. package/src/assets/nav-glyph.tsx +188 -0
  319. package/src/components/Accordion/Accordion.module.scss +5 -3
  320. package/src/components/Alert/Alert.contract.json +18 -18
  321. package/src/components/Alert/Alert.module.scss +50 -64
  322. package/src/components/Alert/index.tsx +24 -17
  323. package/src/components/AppShell/AppShell.contract.json +7 -7
  324. package/src/components/AppShell/AppShell.module.scss +49 -17
  325. package/src/components/AppShell/index.tsx +2 -2
  326. package/src/components/Avatar/Avatar.module.scss +0 -1
  327. package/src/components/Badge/Badge.contract.json +58 -22
  328. package/src/components/Badge/Badge.module.scss +72 -47
  329. package/src/components/Badge/index.tsx +34 -17
  330. package/src/components/BentoGrid/BentoGrid.module.scss +4 -8
  331. package/src/components/Box/Box.module.scss +7 -6
  332. package/src/components/Breadcrumbs/Breadcrumbs.module.scss +15 -5
  333. package/src/components/Breadcrumbs/index.tsx +5 -1
  334. package/src/components/Button/Button.module.scss +261 -186
  335. package/src/components/Button/index.tsx +41 -28
  336. package/src/components/ButtonGroup/ButtonGroup.contract.json +5 -5
  337. package/src/components/ButtonGroup/ButtonGroup.module.scss +8 -6
  338. package/src/components/Card/Card.consumer-fixture.module.scss +5 -2
  339. package/src/components/Card/Card.module.scss +73 -133
  340. package/src/components/Card/index.tsx +41 -36
  341. package/src/components/Chart/Chart.module.scss +6 -5
  342. package/src/components/Checkbox/Checkbox.contract.json +4 -3
  343. package/src/components/Checkbox/Checkbox.module.scss +16 -32
  344. package/src/components/Checkbox/index.tsx +6 -8
  345. package/src/components/Chip/Chip.contract.json +10 -10
  346. package/src/components/Chip/Chip.module.scss +23 -22
  347. package/src/components/Chip/index.tsx +10 -6
  348. package/src/components/CodeBlock/CodeBlock.module.scss +47 -70
  349. package/src/components/CodeBlock/index.tsx +23 -16
  350. package/src/components/Collapsible/Collapsible.module.scss +1 -7
  351. package/src/components/ColorPicker/ColorPicker.module.scss +20 -13
  352. package/src/components/ColorPicker/index.tsx +1 -0
  353. package/src/components/Combobox/Combobox.module.scss +16 -19
  354. package/src/components/Combobox/index.tsx +10 -1
  355. package/src/components/Command/Command.contract.json +7 -1
  356. package/src/components/Command/Command.module.scss +19 -21
  357. package/src/components/Command/index.tsx +7 -1
  358. package/src/components/ComponentDefaults/ComponentDefaults.contract.json +91 -0
  359. package/src/components/ConversationList/ConversationList.module.scss +2 -3
  360. package/src/components/ConversationList/index.tsx +2 -2
  361. package/src/components/DataTable/DataTable.module.scss +12 -9
  362. package/src/components/DataTable/DataTable.virtual.tsx +3 -2
  363. package/src/components/DataTable/index.tsx +1 -1
  364. package/src/components/DatePicker/DatePicker.module.scss +32 -42
  365. package/src/components/DatePicker/index.tsx +18 -7
  366. package/src/components/Dialog/Dialog.module.scss +23 -29
  367. package/src/components/Dialog/index.tsx +7 -5
  368. package/src/components/Drawer/Drawer.contract.json +6 -6
  369. package/src/components/Drawer/Drawer.module.scss +123 -64
  370. package/src/components/Drawer/index.tsx +7 -5
  371. package/src/components/Editor/Editor.contract.json +1 -1
  372. package/src/components/Editor/Editor.module.scss +26 -13
  373. package/src/components/EmptyState/EmptyState.contract.json +6 -6
  374. package/src/components/EmptyState/EmptyState.module.scss +31 -23
  375. package/src/components/EmptyState/index.tsx +17 -9
  376. package/src/components/Field/Field.module.scss +2 -1
  377. package/src/components/Fieldset/Fieldset.module.scss +5 -4
  378. package/src/components/Form/Form.contract.json +4 -4
  379. package/src/components/Grid/Grid.module.scss +2 -2
  380. package/src/components/Header/Header.contract.json +2 -2
  381. package/src/components/Header/Header.module.scss +24 -36
  382. package/src/components/Icon/Icon.contract.json +19 -23
  383. package/src/components/Icon/Icon.module.scss +13 -12
  384. package/src/components/Icon/index.tsx +31 -31
  385. package/src/components/IconButton/IconButton.contract.json +8 -8
  386. package/src/components/IconButton/IconButton.module.scss +13 -4
  387. package/src/components/IconButton/index.tsx +4 -4
  388. package/src/components/Input/Input.contract.json +0 -13
  389. package/src/components/Input/Input.module.scss +4 -54
  390. package/src/components/Input/index.tsx +2 -18
  391. package/src/components/Link/Link.contract.json +19 -11
  392. package/src/components/Link/Link.module.scss +24 -10
  393. package/src/components/Link/index.tsx +26 -5
  394. package/src/components/List/List.contract.json +11 -11
  395. package/src/components/List/List.module.scss +10 -5
  396. package/src/components/List/index.tsx +17 -13
  397. package/src/components/Listbox/Listbox.module.scss +14 -20
  398. package/src/components/Loading/Loading.contract.json +6 -6
  399. package/src/components/Loading/Loading.module.scss +29 -26
  400. package/src/components/Loading/index.tsx +13 -12
  401. package/src/components/Markdown/Markdown.module.scss +2 -1
  402. package/src/components/Menu/Menu.contract.json +5 -5
  403. package/src/components/Menu/Menu.module.scss +11 -10
  404. package/src/components/Message/Message.contract.json +5 -5
  405. package/src/components/Message/Message.module.scss +8 -6
  406. package/src/components/Message/index.tsx +2 -2
  407. package/src/components/NavigationMenu/NavigationMenu.module.scss +22 -67
  408. package/src/components/Pagination/Pagination.module.scss +7 -14
  409. package/src/components/Popover/Popover.contract.json +4 -4
  410. package/src/components/Popover/Popover.module.scss +24 -23
  411. package/src/components/Progress/Progress.contract.json +11 -11
  412. package/src/components/Progress/Progress.module.scss +13 -8
  413. package/src/components/Progress/index.tsx +34 -16
  414. package/src/components/Prompt/Prompt.contract.json +12 -12
  415. package/src/components/Prompt/Prompt.module.scss +40 -47
  416. package/src/components/Prompt/index.tsx +17 -15
  417. package/src/components/RadioGroup/RadioGroup.contract.json +6 -4
  418. package/src/components/RadioGroup/RadioGroup.module.scss +38 -32
  419. package/src/components/RadioGroup/index.tsx +23 -10
  420. package/src/components/ScrollArea/ScrollArea.module.scss +30 -33
  421. package/src/components/Select/Select.module.scss +19 -18
  422. package/src/components/Select/index.tsx +26 -24
  423. package/src/components/Separator/Separator.contract.json +10 -10
  424. package/src/components/Separator/Separator.module.scss +24 -40
  425. package/src/components/Separator/index.tsx +16 -11
  426. package/src/components/Sidebar/Sidebar.contract.json +1 -1
  427. package/src/components/Sidebar/Sidebar.module.scss +92 -95
  428. package/src/components/Sidebar/index.tsx +3 -3
  429. package/src/components/Skeleton/Skeleton.contract.json +9 -9
  430. package/src/components/Skeleton/Skeleton.module.scss +23 -16
  431. package/src/components/Skeleton/index.tsx +16 -15
  432. package/src/components/Slider/Slider.module.scss +6 -19
  433. package/src/components/Stack/Stack.contract.json +1 -1
  434. package/src/components/Stack/Stack.module.scss +13 -12
  435. package/src/components/Switch/Switch.module.scss +44 -35
  436. package/src/components/Table/Table.module.scss +9 -13
  437. package/src/components/TableOfContents/TableOfContents.module.scss +12 -18
  438. package/src/components/TableOfContents/index.tsx +1 -1
  439. package/src/components/Tabs/Tabs.contract.json +14 -14
  440. package/src/components/Tabs/Tabs.module.scss +27 -31
  441. package/src/components/Tabs/index.tsx +15 -12
  442. package/src/components/Text/Text.contract.json +36 -14
  443. package/src/components/Text/Text.module.scss +19 -20
  444. package/src/components/Text/index.tsx +23 -21
  445. package/src/components/Textarea/Textarea.contract.json +0 -13
  446. package/src/components/Textarea/Textarea.module.scss +24 -52
  447. package/src/components/Textarea/index.tsx +3 -14
  448. package/src/components/Theme/Theme.contract.json +9 -8
  449. package/src/components/Theme/index.tsx +39 -12
  450. package/src/components/ThemeToggle/ThemeButton.tsx +49 -0
  451. package/src/components/ThemeToggle/ThemeToggle.module.scss +21 -44
  452. package/src/components/ThemeToggle/icons.tsx +46 -0
  453. package/src/components/ThemeToggle/index.tsx +8 -90
  454. package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +11 -10
  455. package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +9 -7
  456. package/src/components/ThinkingIndicator/index.tsx +12 -14
  457. package/src/components/Toast/Toast.contract.json +29 -13
  458. package/src/components/Toast/Toast.module.scss +49 -104
  459. package/src/components/Toast/index.tsx +39 -34
  460. package/src/components/ToggleGroup/ToggleGroup.contract.json +13 -13
  461. package/src/components/ToggleGroup/ToggleGroup.module.scss +16 -46
  462. package/src/components/ToggleGroup/index.tsx +11 -11
  463. package/src/components/Tooltip/Tooltip.contract.json +3 -3
  464. package/src/components/Tooltip/Tooltip.module.scss +16 -10
  465. package/src/components/VisuallyHidden/VisuallyHidden.module.scss +4 -14
  466. package/src/index.ts +14 -10
  467. package/src/measurements/MeasurementTargets.module.scss +6 -7
  468. package/src/measurements/generated.ts +38 -96
  469. package/src/measurements/index.ts +0 -1
  470. package/src/measurements/measurements.json +37 -116
  471. package/src/recipes/_action.scss +4 -4
  472. package/src/recipes/_boolean-range.scss +9 -5
  473. package/src/recipes/_feedback.scss +17 -16
  474. package/src/recipes/_field.scss +28 -20
  475. package/src/recipes/_navigation.scss +84 -29
  476. package/src/recipes/_overlay.scss +143 -43
  477. package/src/recipes/_popup.scss +46 -36
  478. package/src/recipes/_prose.scss +35 -23
  479. package/src/recipes/_representation.scss +10 -9
  480. package/src/recipes/_segmented.scss +1 -1
  481. package/src/recipes/_table-chrome.scss +27 -16
  482. package/src/recipes/_target.scss +2 -4
  483. package/src/recipes/_typography.scss +10 -0
  484. package/src/styles/globals.scss +14 -9
  485. package/src/tokens/_component-properties.scss +19 -1
  486. package/src/tokens/_computed.scss +27 -33
  487. package/src/tokens/_measurements.catalog.generated.css +58 -45
  488. package/src/tokens/_measurements.generated.scss +107 -250
  489. package/src/tokens/_mixins.scss +42 -40
  490. package/src/tokens/_palettes.scss +1 -1
  491. package/src/tokens/_property-registrations.scss +9 -0
  492. package/src/tokens/_seeds.scss +1 -12
  493. package/src/tokens/_variables.scss +71 -59
  494. package/src/utils/seed-derivation.ts +1 -8
  495. package/src/utils/theme-presets.ts +5 -12
  496. package/dist/blocks/AccountSettings.block.d.ts +0 -3
  497. package/dist/blocks/AccountSettings.block.d.ts.map +0 -1
  498. package/dist/blocks/ActivityFeedSkeleton.block.d.ts +0 -3
  499. package/dist/blocks/ActivityFeedSkeleton.block.d.ts.map +0 -1
  500. package/dist/blocks/BlogEditor.block.d.ts +0 -3
  501. package/dist/blocks/BlogEditor.block.d.ts.map +0 -1
  502. package/dist/blocks/ChatInterface.block.d.ts +0 -3
  503. package/dist/blocks/ChatInterface.block.d.ts.map +0 -1
  504. package/dist/blocks/ChatMessages.block.d.ts +0 -3
  505. package/dist/blocks/ChatMessages.block.d.ts.map +0 -1
  506. package/dist/blocks/CheckoutForm.block.d.ts +0 -3
  507. package/dist/blocks/CheckoutForm.block.d.ts.map +0 -1
  508. package/dist/blocks/CommandPalette.block.d.ts +0 -3
  509. package/dist/blocks/CommandPalette.block.d.ts.map +0 -1
  510. package/dist/blocks/ContactForm.block.d.ts +0 -3
  511. package/dist/blocks/ContactForm.block.d.ts.map +0 -1
  512. package/dist/blocks/DashboardPage.block.d.ts +0 -3
  513. package/dist/blocks/DashboardPage.block.d.ts.map +0 -1
  514. package/dist/blocks/DashboardSkeleton.block.d.ts +0 -3
  515. package/dist/blocks/DashboardSkeleton.block.d.ts.map +0 -1
  516. package/dist/blocks/DataTable.block.d.ts +0 -3
  517. package/dist/blocks/DataTable.block.d.ts.map +0 -1
  518. package/dist/blocks/EmptyState.block.d.ts +0 -3
  519. package/dist/blocks/EmptyState.block.d.ts.map +0 -1
  520. package/dist/blocks/FAQSection.block.d.ts +0 -3
  521. package/dist/blocks/FAQSection.block.d.ts.map +0 -1
  522. package/dist/blocks/FeatureGrid.block.d.ts +0 -3
  523. package/dist/blocks/FeatureGrid.block.d.ts.map +0 -1
  524. package/dist/blocks/HeroSection.block.d.ts +0 -3
  525. package/dist/blocks/HeroSection.block.d.ts.map +0 -1
  526. package/dist/blocks/NavigationHeader.block.d.ts +0 -3
  527. package/dist/blocks/NavigationHeader.block.d.ts.map +0 -1
  528. package/dist/blocks/PaginatedTable.block.d.ts +0 -3
  529. package/dist/blocks/PaginatedTable.block.d.ts.map +0 -1
  530. package/dist/blocks/PricingComparison.block.d.ts +0 -3
  531. package/dist/blocks/PricingComparison.block.d.ts.map +0 -1
  532. package/dist/blocks/ProductCard.block.d.ts +0 -3
  533. package/dist/blocks/ProductCard.block.d.ts.map +0 -1
  534. package/dist/blocks/RegistrationForm.block.d.ts +0 -3
  535. package/dist/blocks/RegistrationForm.block.d.ts.map +0 -1
  536. package/dist/blocks/SettingsDrawer.block.d.ts +0 -3
  537. package/dist/blocks/SettingsDrawer.block.d.ts.map +0 -1
  538. package/dist/blocks/SettingsPanel.block.d.ts +0 -3
  539. package/dist/blocks/SettingsPanel.block.d.ts.map +0 -1
  540. package/dist/blocks/ShoppingCart.block.d.ts +0 -3
  541. package/dist/blocks/ShoppingCart.block.d.ts.map +0 -1
  542. package/dist/blocks/StatsCardSkeleton.block.d.ts +0 -3
  543. package/dist/blocks/StatsCardSkeleton.block.d.ts.map +0 -1
  544. package/dist/blocks/TableSkeleton.block.d.ts +0 -3
  545. package/dist/blocks/TableSkeleton.block.d.ts.map +0 -1
  546. package/dist/blocks/ThinkingStates.block.d.ts +0 -3
  547. package/dist/blocks/ThinkingStates.block.d.ts.map +0 -1
  548. package/dist/components/Toggle/index.d.ts +0 -3
  549. package/dist/components/Toggle/index.d.ts.map +0 -1
  550. package/src/components/Toggle/index.ts +0 -7
  551. package/src/tokens/_density.scss +0 -85
@@ -18,7 +18,6 @@
18
18
  "size: sm|md|lg (default: md)",
19
19
  "disabled: boolean (default: false)",
20
20
  "error: boolean (default: false)",
21
- "success: boolean (default: false)",
22
21
  "showCharCount: boolean (default: false)",
23
22
  "label: string",
24
23
  "helperText: string",
@@ -94,12 +93,6 @@
94
93
  "default": "false",
95
94
  "required": false
96
95
  },
97
- "success": {
98
- "type": "boolean",
99
- "description": "Whether to show success/validated styling",
100
- "default": "false",
101
- "required": false
102
- },
103
96
  "showCharCount": {
104
97
  "type": "boolean",
105
98
  "description": "Show character counter when maxLength is set",
@@ -242,11 +235,6 @@
242
235
  "description": "resize=\"none\" removes the drag handle so the box stays put.",
243
236
  "code": "<Textarea\n label=\"Notes\"\n placeholder=\"Add notes...\"\n resize=\"none\"\n/>"
244
237
  },
245
- {
246
- "name": "Success State",
247
- "description": "Green border confirms the value passed validation.",
248
- "code": "<Textarea\n label=\"Bio\"\n value=\"A short bio about myself.\"\n success\n helperText=\"Looks great!\"\n/>"
249
- },
250
238
  {
251
239
  "name": "With Character Counter",
252
240
  "description": "Live count against maxLength sits below the box.",
@@ -267,7 +255,6 @@
267
255
  "label: string - label text",
268
256
  "size: sm|md|lg (default: md)",
269
257
  "error: boolean - error state",
270
- "success: boolean - shows success/validated styling",
271
258
  "showCharCount: boolean - show character counter (requires maxLength)",
272
259
  "disabled: boolean - disabled state",
273
260
  "resize: none|vertical|horizontal|both",
@@ -5,6 +5,11 @@
5
5
  @use "../../recipes/layout";
6
6
  @use "../../recipes/typography";
7
7
 
8
+ // Fallbacks for the field recipe's size hooks when no size class has set them.
9
+ $_track: field.track("md");
10
+ $_stroke: field.stroke();
11
+ $_block-inset: var(--fui-raw-space-8, #{measurements.raw-space(8)});
12
+
8
13
  .wrapper {
9
14
  @include field.wrapper;
10
15
  }
@@ -34,17 +39,18 @@
34
39
  display: block;
35
40
  width: 100%;
36
41
  min-block-size: max(
37
- var(--_fui-field-track),
42
+ var(--_fui-field-track, #{$_track}),
38
43
  calc(
39
- var(--_fui-textarea-min-rows) * 1lh + 2 * var(--_fui-textarea-block-inset) + 2 *
40
- var(--_fui-field-stroke)
44
+ var(--fui-textarea-min-rows, 1) * 1lh + 2 *
45
+ var(--_fui-textarea-block-inset, #{$_block-inset}) + 2 *
46
+ var(--_fui-field-stroke, #{$_stroke})
41
47
  )
42
48
  );
43
49
  max-block-size: calc(
44
- var(--_fui-textarea-max-rows) * 1lh + 2 * var(--_fui-textarea-block-inset) + 2 *
45
- var(--_fui-field-stroke)
50
+ var(--fui-textarea-max-rows, 9999) * 1lh + 2 *
51
+ var(--_fui-textarea-block-inset, #{$_block-inset}) + 2 * var(--_fui-field-stroke, #{$_stroke})
46
52
  );
47
- padding-block: var(--_fui-textarea-block-inset);
53
+ padding-block: var(--_fui-textarea-block-inset, #{$_block-inset});
48
54
 
49
55
  &::placeholder {
50
56
  color: var(--fui-text-tertiary, $fui-text-tertiary);
@@ -54,11 +60,15 @@
54
60
  @include field.focus-state;
55
61
  }
56
62
 
63
+ @include high-contrast-outline;
64
+
57
65
  // Single-line: same track as Input — height lock, horizontal pad only.
58
66
  &[rows="1"] {
59
- block-size: var(--_fui-field-track);
60
- min-block-size: var(--_fui-field-track);
61
- padding-block: calc((var(--_fui-field-track) - 1lh - 2 * var(--_fui-field-stroke)) / 2);
67
+ block-size: var(--_fui-field-track, #{$_track});
68
+ min-block-size: var(--_fui-field-track, #{$_track});
69
+ padding-block: calc(
70
+ (var(--_fui-field-track, #{$_track}) - 1lh - 2 * var(--_fui-field-stroke, #{$_stroke})) / 2
71
+ );
62
72
  overflow-y: hidden;
63
73
  }
64
74
  }
@@ -105,18 +115,7 @@
105
115
  @include field.invalid-state;
106
116
 
107
117
  &:focus-visible {
108
- border-color: var(--fui-color-danger-text, $fui-color-danger-text);
109
- @include focus-ring-error;
110
- }
111
- }
112
-
113
- // Success state — green border for validated fields
114
- .success {
115
- border-color: var(--fui-color-success-text, $fui-color-success-text);
116
-
117
- &:focus-visible {
118
- border-color: var(--fui-color-success-text, $fui-color-success-text);
119
- @include focus-ring-success;
118
+ @include field.invalid-focus-state;
120
119
  }
121
120
  }
122
121
 
@@ -125,12 +124,6 @@
125
124
  color: var(--fui-color-danger-text, $fui-color-danger-text);
126
125
  }
127
126
 
128
- // Auto-detect success state
129
- .wrapper[data-success] .helper,
130
- .helperSuccess {
131
- color: var(--fui-color-success-text, $fui-color-success-text);
132
- }
133
-
134
127
  // Footer row — helper + character counter side by side
135
128
  .footer {
136
129
  display: flex;
@@ -148,7 +141,10 @@
148
141
  .charCount {
149
142
  @include typography.role("caption");
150
143
 
151
- margin-block-start: var(--fui-field-message-gap);
144
+ margin-block-start: var(
145
+ --fui-field-message-gap,
146
+ var(--fui-raw-space-4, #{measurements.raw-space(4)})
147
+ );
152
148
  margin-inline-start: auto;
153
149
  font-family: var(--fui-font-mono, $fui-font-mono);
154
150
  white-space: nowrap;
@@ -158,30 +154,6 @@
158
154
  color: var(--fui-color-danger-text, $fui-color-danger-text);
159
155
  }
160
156
 
161
- // ============================================
162
- // Accessibility: High Contrast Mode
163
- // ============================================
164
-
165
- @media (prefers-contrast: more) {
166
- .textarea {
167
- border-width: var(--fui-stroke-default, 2px);
168
- border-color: var(--fui-text-primary, $fui-text-primary);
169
-
170
- &:focus-visible {
171
- border-color: var(--fui-color-accent, $fui-color-accent);
172
- }
173
- }
174
-
175
- .error,
176
- .textarea[aria-invalid] {
177
- border-color: var(--fui-color-danger-text, $fui-color-danger-text);
178
- }
179
-
180
- .success {
181
- border-color: var(--fui-color-success-text, $fui-color-success-text);
182
- }
183
- }
184
-
185
157
  // ============================================
186
158
  // Accessibility: Reduced Motion
187
159
  // ============================================
@@ -28,8 +28,6 @@ export interface TextareaProps extends Omit<
28
28
  disabled?: boolean;
29
29
  /** Error state */
30
30
  error?: boolean;
31
- /** Success state */
32
- success?: boolean;
33
31
  /** Show character count when maxLength is set */
34
32
  showCharCount?: boolean;
35
33
  /** Label text above the textarea */
@@ -76,7 +74,6 @@ const TextareaRoot = React.forwardRef<HTMLTextAreaElement, TextareaProps>(functi
76
74
  size: sizeProp,
77
75
  disabled = false,
78
76
  error = false,
79
- success = false,
80
77
  showCharCount = false,
81
78
  label,
82
79
  helperText,
@@ -113,29 +110,21 @@ const TextareaRoot = React.forwardRef<HTMLTextAreaElement, TextareaProps>(functi
113
110
  styles.textarea,
114
111
  styles[size],
115
112
  error && styles.error,
116
- success && styles.success,
117
113
  styles[`resize-${resize}`],
118
114
  ]
119
115
  .filter(Boolean)
120
116
  .join(" ");
121
117
 
122
- const helperClasses = [
123
- styles.helper,
124
- error && styles.helperError,
125
- success && styles.helperSuccess,
126
- ]
127
- .filter(Boolean)
128
- .join(" ");
118
+ const helperClasses = [styles.helper, error && styles.helperError].filter(Boolean).join(" ");
129
119
 
130
120
  const textareaInlineStyle = {
131
- "--_fui-textarea-min-rows": minRows ?? 1,
132
- "--_fui-textarea-max-rows": maxRows ?? 9999,
121
+ "--fui-textarea-min-rows": minRows ?? 1,
122
+ "--fui-textarea-max-rows": maxRows ?? 9999,
133
123
  } as React.CSSProperties;
134
124
 
135
125
  return (
136
126
  <div
137
127
  {...rootProps}
138
- data-success={success || undefined}
139
128
  className={[styles.wrapper, rootProps?.className, className].filter(Boolean).join(" ")}
140
129
  style={{ ...(rootProps?.style ?? {}), ...(wrapperStyle ?? {}) }}
141
130
  >
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Theme",
4
- "description": "Gives every component below it a light, dark, or system color mode, and remembers the choice.",
4
+ "description": "Utility provider that gives everything below it a light, dark, or system color mode.",
5
5
  "category": "utilities",
6
6
  "tags": ["theme", "dark-mode", "light-mode", "provider", "toggle"],
7
7
  "status": "stable",
@@ -15,7 +15,8 @@
15
15
  "onModeChange: function",
16
16
  "storageKey: string (default: fui-theme)",
17
17
  "attribute: data-theme|class (default: data-theme)",
18
- "ThemeToggle appearance: group|icon (default: group)"
18
+ "Theme.Toggle size: sm|md|lg",
19
+ "Theme.Button size: sm|md|lg"
19
20
  ],
20
21
  "props": {
21
22
  "children": {
@@ -76,7 +77,7 @@
76
77
  "useTheme reads and sets the mode anywhere below it",
77
78
  "storageKey renames the localStorage entry",
78
79
  "attribute=\"class\" if your CSS keys off .dark instead of data-theme",
79
- "appearance=\"icon\" for tight toolbars; the default group shows both modes"
80
+ "ThemeProvider renders no chrome of its own; Theme.Toggle is the segmented light/dark/system control and Theme.Button the single icon button for tight toolbars"
80
81
  ],
81
82
  "accessibility": [
82
83
  "The toggle's label names the mode it is in",
@@ -100,9 +101,9 @@
100
101
  "code": "<ThemeProvider defaultMode=\"light\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n <ThemeToggle size=\"sm\" />\n <ThemeToggle size=\"md\" />\n <ThemeToggle size=\"lg\" />\n </div>\n</ThemeProvider>"
101
102
  },
102
103
  {
103
- "name": "Icon Toggle",
104
+ "name": "Theme Button",
104
105
  "description": "A single icon button for toolbars with no room to spare.",
105
- "code": "<ThemeProvider defaultMode=\"system\">\n <ThemeToggle appearance=\"icon\" aria-label=\"Switch color mode\" />\n</ThemeProvider>"
106
+ "code": "<ThemeProvider defaultMode=\"system\">\n <ThemeButton aria-label=\"Switch color mode\" />\n</ThemeProvider>"
106
107
  }
107
108
  ],
108
109
  "relations": [
@@ -118,9 +119,9 @@
118
119
  "mode: light|dark|system - controlled mode",
119
120
  "onModeChange: (mode) => void - change handler",
120
121
  "attribute: data-theme|class - DOM theme attribute",
121
- "ThemeToggle size: sm|md|lg - toggle button size",
122
- "ThemeToggle appearance: group|icon - segmented or compact icon control (default: group)",
123
- "ThemeToggle forwards div DOM props to the button group root"
122
+ "Theme.Toggle size: sm|md|lg - segmented light/dark/system control",
123
+ "Theme.Toggle forwards div DOM props to the button group root",
124
+ "Theme.Button size: sm|md|lg - single ghost icon button that flips light and dark, built on IconButton"
124
125
  ],
125
126
  "a11yRules": ["A11Y_TARGET_SIZE_MIN"]
126
127
  },
@@ -2,10 +2,10 @@
2
2
 
3
3
  import * as React from "react";
4
4
  import { ComponentDefaultsProvider, type ComponentDefaults } from "../ComponentDefaults";
5
- import { ThemeToggle } from "../ThemeToggle";
5
+ import { ThemeButton, ThemeToggle } from "../ThemeToggle";
6
6
  import { ThemeContext, useTheme, type ThemeContextValue, type ThemeMode } from "./context";
7
7
 
8
- export type { ThemeToggleProps } from "../ThemeToggle";
8
+ export type { ThemeButtonProps, ThemeToggleProps } from "../ThemeToggle";
9
9
  export type { ThemeMode, UseThemeReturn } from "./context";
10
10
 
11
11
  // ============================================
@@ -68,6 +68,22 @@ function useSystemPreference(): "light" | "dark" {
68
68
  * ThemeProvider - Provides theme context to children
69
69
  * SSR-safe: initializes from localStorage in useEffect
70
70
  */
71
+ function suppressTransitions(): () => void {
72
+ const style = document.createElement("style");
73
+ style.textContent = "*,*::before,*::after{transition:none!important}";
74
+ document.head.append(style);
75
+ return () => {
76
+ // Read layout for its side effect: a synchronous style flush commits the
77
+ // new colors while the override still applies, so nothing starts moving.
78
+ void document.body.offsetHeight;
79
+ if (typeof requestAnimationFrame === "function") {
80
+ requestAnimationFrame(() => requestAnimationFrame(() => style.remove()));
81
+ } else {
82
+ style.remove();
83
+ }
84
+ };
85
+ }
86
+
71
87
  function ThemeProvider({
72
88
  children,
73
89
  componentDefaults,
@@ -121,6 +137,20 @@ function ThemeProvider({
121
137
  if (typeof document === "undefined" || !mounted) return;
122
138
 
123
139
  const root = document.documentElement;
140
+ const current =
141
+ attribute === "data-theme"
142
+ ? root.getAttribute("data-theme")
143
+ : root.classList.contains("dark")
144
+ ? "dark"
145
+ : root.classList.contains("light")
146
+ ? "light"
147
+ : null;
148
+
149
+ // A flip changes color, background, border and shadow on nearly every
150
+ // element at once; every transition on those properties would fire
151
+ // together and the switch smears instead of snapping. Turn transitions
152
+ // off for the swap, flush, then restore on the next frame.
153
+ const restore = current !== resolvedMode ? suppressTransitions() : null;
124
154
 
125
155
  if (attribute === "data-theme") {
126
156
  root.setAttribute("data-theme", resolvedMode);
@@ -128,6 +158,8 @@ function ThemeProvider({
128
158
  root.classList.remove("light", "dark");
129
159
  root.classList.add(resolvedMode);
130
160
  }
161
+
162
+ restore?.();
131
163
  }, [resolvedMode, attribute, mounted]);
132
164
 
133
165
  // Persist to localStorage when mode changes
@@ -182,28 +214,27 @@ export const Theme = Object.assign(ThemeProvider, {
182
214
  Root: ThemeProvider,
183
215
  Provider: ThemeProvider,
184
216
  Toggle: ThemeToggle,
217
+ Button: ThemeButton,
185
218
  useTheme,
186
219
  });
187
220
 
188
- export { ThemeProvider, ThemeToggle, useTheme };
221
+ export { ThemeProvider, ThemeToggle, ThemeButton, useTheme };
189
222
 
190
223
  // ============================================
191
224
  // configureTheme — JS-only seed configuration
192
225
  // ============================================
193
226
 
194
227
  // Import + re-export seed derivation types — canonical definitions in utils/seed-derivation.ts
195
- import type { NeutralPalette, DensityPreset, RadiusStyle } from "../../utils/seed-derivation";
228
+ import type { NeutralPalette, RadiusStyle } from "../../utils/seed-derivation";
196
229
  import { applyMeasurementSelection } from "../../measurements";
197
230
  import { isProductionBuild } from "../../utils/env";
198
- export type { NeutralPalette, DensityPreset, RadiusStyle };
231
+ export type { NeutralPalette, RadiusStyle };
199
232
 
200
233
  export interface ConfigureThemeOptions {
201
234
  /** Brand/accent color as hex */
202
235
  brand?: string;
203
236
  /** Neutral palette name */
204
237
  neutral?: NeutralPalette;
205
- /** Spacing density preset */
206
- density?: DensityPreset;
207
238
  /** Border radius style */
208
239
  radiusStyle?: RadiusStyle;
209
240
  /** Danger/error color as hex */
@@ -248,7 +279,6 @@ function setVar(el: HTMLElement, name: string, value: string) {
248
279
  * configureTheme({
249
280
  * brand: '#6366f1',
250
281
  * neutral: 'ice',
251
- * density: 'compact',
252
282
  * radiusStyle: 'rounded',
253
283
  * });
254
284
  * ```
@@ -278,8 +308,5 @@ export function configureTheme(options: ConfigureThemeOptions): void {
278
308
  // Named geometry is selected through the generated Measurement Module.
279
309
  // Partial calls leave the omitted selector untouched and never write numeric
280
310
  // CSS maps inline.
281
- applyMeasurementSelection(root, {
282
- density: options.density,
283
- radiusStyle: options.radiusStyle,
284
- });
311
+ applyMeasurementSelection(root, { radiusStyle: options.radiusStyle });
285
312
  }
@@ -0,0 +1,49 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import { IconButton, type IconButtonProps } from "../IconButton";
5
+ import { useTheme } from "../Theme/context";
6
+ import { MoonIcon, SunIcon } from "./icons";
7
+
8
+ export interface ThemeButtonProps
9
+ extends Omit<IconButtonProps, "children" | "variant" | "pressed" | "onClick"> {
10
+ /** Controlled value for custom usage (bypasses theme context) */
11
+ value?: "light" | "dark";
12
+ /** Callback when value changes (for controlled usage) */
13
+ onValueChange?: (value: "light" | "dark") => void;
14
+ }
15
+
16
+ /**
17
+ * A single ghost icon button that shows the resolved color mode and flips
18
+ * light and dark on click. Built on `IconButton`, so it takes the same
19
+ * `size` and forwards button DOM props. For the segmented light/dark/system
20
+ * control, use `ThemeToggle`.
21
+ */
22
+ export const ThemeButton = React.forwardRef<HTMLButtonElement, ThemeButtonProps>(
23
+ function ThemeButton({ value: controlledValue, onValueChange, "aria-label": ariaLabel, ...rest }, ref) {
24
+ const { resolvedMode, toggleMode } = useTheme();
25
+ const isControlled = controlledValue !== undefined;
26
+ const resolved = isControlled ? controlledValue : resolvedMode;
27
+ const nextMode = resolved === "dark" ? "light" : "dark";
28
+
29
+ return (
30
+ <IconButton
31
+ ref={ref}
32
+ variant="ghost"
33
+ aria-label={
34
+ ariaLabel ?? (resolved === "dark" ? "Switch to light mode" : "Switch to dark mode")
35
+ }
36
+ onClick={() => {
37
+ if (isControlled) {
38
+ onValueChange?.(nextMode);
39
+ } else {
40
+ toggleMode();
41
+ }
42
+ }}
43
+ {...rest}
44
+ >
45
+ {resolved === "dark" ? <MoonIcon /> : <SunIcon />}
46
+ </IconButton>
47
+ );
48
+ }
49
+ );
@@ -1,18 +1,19 @@
1
1
  @use "../../tokens/variables" as *;
2
2
  @use "../../tokens/mixins" as *;
3
+ @use "../../tokens/measurements.generated" as measurements;
3
4
  @use "../../recipes/action";
4
5
 
5
6
  // ============================================
6
- // Theme Toggle - Fragmented Button Group
7
+ // Theme Toggle - segmented light / dark / system control
7
8
  // ============================================
8
9
 
9
10
  .toggleGroup {
10
11
  display: inline-flex;
11
12
  align-items: stretch;
12
- gap: 0;
13
- padding: 0;
14
- background-color: var(--fui-theme-toggle-bg, var(--fui-bg-tertiary, #{$fui-bg-tertiary}));
15
- border-radius: var(--fui-radius-md, $fui-radius-md);
13
+ gap: var(--fui-raw-space-0, #{measurements.raw-space(0)});
14
+ padding: var(--fui-raw-space-0, #{measurements.raw-space(0)});
15
+ background-color: var(--fui-bg-tertiary, $fui-bg-tertiary);
16
+ border-radius: var(--fui-radius-l2, $fui-radius-l2);
16
17
  }
17
18
 
18
19
  .toggleButton {
@@ -20,7 +21,7 @@
20
21
  @include interactive-base;
21
22
  @include action.base;
22
23
 
23
- border-radius: var(--fui-radius-sm, $fui-radius-sm);
24
+ border-radius: var(--fui-radius-l3, $fui-radius-l3);
24
25
  color: var(--fui-text-secondary, $fui-text-secondary);
25
26
  background-color: transparent;
26
27
 
@@ -36,54 +37,30 @@
36
37
  }
37
38
 
38
39
  .toggleButtonActive {
39
- background-color: var(
40
- --fui-theme-toggle-active-bg,
41
- var(--fui-control-selected-bg, #{$fui-bg-active})
42
- );
43
- color: var(--fui-text-primary, $fui-text-primary);
44
- box-shadow: var(--fui-theme-toggle-active-shadow, none);
40
+ @include segmented-selection;
45
41
  }
46
42
 
47
- .iconButton {
48
- background-color: transparent;
49
- color: var(--fui-text-secondary, $fui-text-secondary);
50
-
51
- &:hover {
52
- color: var(--fui-text-primary, $fui-text-primary);
53
- background-color: var(--fui-bg-hover, $fui-bg-hover);
54
- }
55
- }
56
-
57
- // Size variants — nested for the group, same-element for appearance="icon"
58
- .sizeSm {
59
- .toggleButton,
60
- &.toggleButton {
61
- @include action.icon-only("sm");
43
+ // Size variants (the buttons inherit the size from the group)
44
+ .sizeSm .toggleButton {
45
+ @include action.icon-only("sm");
62
46
 
63
- svg {
64
- @include action.glyph("sm");
65
- }
47
+ svg {
48
+ @include action.glyph("sm");
66
49
  }
67
50
  }
68
51
 
69
- .sizeMd {
70
- .toggleButton,
71
- &.toggleButton {
72
- @include action.icon-only("md");
52
+ .sizeMd .toggleButton {
53
+ @include action.icon-only("md");
73
54
 
74
- svg {
75
- @include action.glyph("md");
76
- }
55
+ svg {
56
+ @include action.glyph("md");
77
57
  }
78
58
  }
79
59
 
80
- .sizeLg {
81
- .toggleButton,
82
- &.toggleButton {
83
- @include action.icon-only("lg");
60
+ .sizeLg .toggleButton {
61
+ @include action.icon-only("lg");
84
62
 
85
- svg {
86
- @include action.glyph("lg");
87
- }
63
+ svg {
64
+ @include action.glyph("lg");
88
65
  }
89
66
  }
@@ -0,0 +1,46 @@
1
+ import * as React from "react";
2
+
3
+ export function SunIcon({ size = 20 }: { size?: number }) {
4
+ return (
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={size}
8
+ height={size}
9
+ viewBox="0 0 256 256"
10
+ fill="currentColor"
11
+ aria-hidden="true"
12
+ >
13
+ <path d="M120,40V16a8,8,0,0,1,16,0V40a8,8,0,0,1-16,0Zm72,88a64,64,0,1,1-64-64A64.07,64.07,0,0,1,192,128Zm-16,0a48,48,0,1,0-48,48A48.05,48.05,0,0,0,176,128ZM58.34,69.66A8,8,0,0,0,69.66,58.34l-16-16A8,8,0,0,0,42.34,53.66Zm0,116.68-16,16a8,8,0,0,0,11.32,11.32l16-16a8,8,0,0,0-11.32-11.32ZM192,72a8,8,0,0,0,5.66-2.34l16-16a8,8,0,0,0-11.32-11.32l-16,16A8,8,0,0,0,192,72Zm5.66,114.34a8,8,0,0,0-11.32,11.32l16,16a8,8,0,0,0,11.32-11.32ZM48,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H40A8,8,0,0,0,48,128Zm80,80a8,8,0,0,0-8,8v24a8,8,0,0,0,16,0V216A8,8,0,0,0,128,208Zm112-88H216a8,8,0,0,0,0,16h24a8,8,0,0,0,0-16Z" />
14
+ </svg>
15
+ );
16
+ }
17
+
18
+ export function MoonIcon({ size = 20 }: { size?: number }) {
19
+ return (
20
+ <svg
21
+ xmlns="http://www.w3.org/2000/svg"
22
+ width={size}
23
+ height={size}
24
+ viewBox="0 0 256 256"
25
+ fill="currentColor"
26
+ aria-hidden="true"
27
+ >
28
+ <path d="M233.54,142.23a8,8,0,0,0-8-2,88.08,88.08,0,0,1-109.8-109.8,8,8,0,0,0-10-10,104.84,104.84,0,0,0-52.91,37A104,104,0,0,0,136,224a103.09,103.09,0,0,0,62.52-20.88,104.84,104.84,0,0,0,37-52.91A8,8,0,0,0,233.54,142.23ZM188.9,190.34A88,88,0,0,1,65.66,67.11a89,89,0,0,1,31.4-26A106,106,0,0,0,96,56,104.11,104.11,0,0,0,200,160a106,106,0,0,0,14.92-1.06A89,89,0,0,1,188.9,190.34Z" />
29
+ </svg>
30
+ );
31
+ }
32
+
33
+ export function MonitorIcon({ size = 20 }: { size?: number }) {
34
+ return (
35
+ <svg
36
+ xmlns="http://www.w3.org/2000/svg"
37
+ width={size}
38
+ height={size}
39
+ viewBox="0 0 256 256"
40
+ fill="currentColor"
41
+ aria-hidden="true"
42
+ >
43
+ <path d="M208,40H48A24,24,0,0,0,24,64V176a24,24,0,0,0,24,24H208a24,24,0,0,0,24-24V64A24,24,0,0,0,208,40Zm8,136a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V64a8,8,0,0,1,8-8H208a8,8,0,0,1,8,8Zm-48,48a8,8,0,0,1-8,8H96a8,8,0,0,1,0-16h64A8,8,0,0,1,168,224Z" />
44
+ </svg>
45
+ );
46
+ }