@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
@@ -1,36 +1,71 @@
1
- import * as React from 'react';
2
- import styles from './Text.module.scss';
1
+ import * as React from "react";
2
+ import styles from "./Text.module.scss";
3
+ import { isProductionBuild } from "../../utils/env";
3
4
 
4
5
  /**
5
6
  * Typography component for rendering text with consistent styling.
6
7
  * @see https://usefragments.com/components/text
7
8
  */
8
9
  export type TextRole =
9
- | 'caption'
10
- | 'ui-compact'
11
- | 'ui-standard'
12
- | 'body-compact'
13
- | 'body-relaxed'
14
- | 'title-sm'
15
- | 'title-md'
16
- | 'title-lg'
17
- | 'code';
10
+ | "caption"
11
+ | "ui-compact"
12
+ | "ui-standard"
13
+ | "body-compact"
14
+ | "body-relaxed"
15
+ | "title-sm"
16
+ | "title-md"
17
+ | "title-lg"
18
+ | "display"
19
+ | "code";
18
20
 
19
- export type TextSize = '2xs' | 'xs' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';
20
- export type TextWeight = 'normal' | 'medium' | 'semibold' | 'bold';
21
- export type TextFont = 'sans' | 'mono';
22
- export type TextTracking = 'normal' | 'tight' | 'tighter' | 'tightest';
21
+ export type TextSize = "2xs" | "xs" | "sm" | "base" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl";
22
+ export type TextWeight = "normal" | "medium" | "semibold" | "bold";
23
+ export type TextFont = "sans" | "mono";
24
+ export type TextTracking = "normal" | "tight" | "tighter" | "tightest";
23
25
 
24
- type TextSharedProps = Omit<React.HTMLAttributes<HTMLElement>, 'color' | 'role'> & {
26
+ type TextSharedProps = Omit<React.HTMLAttributes<HTMLElement>, "color" | "role"> & {
25
27
  children: React.ReactNode;
26
28
  /** HTML element to render.
27
29
  * @default "span" */
28
- as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'label' | 'div' | 'strong' | 'em' | 'small' | 'mark' | 'del' | 'ins' | 'sub' | 'sup' | 'time' | 'address' | 'blockquote' | 'cite' | 'code' | 'abbr';
29
- /** Text color. `"muted"` is an alias for `"tertiary"`. `"success" | "warning" | "danger"`
30
+ as?:
31
+ | "h1"
32
+ | "h2"
33
+ | "h3"
34
+ | "h4"
35
+ | "h5"
36
+ | "h6"
37
+ | "p"
38
+ | "span"
39
+ | "label"
40
+ | "div"
41
+ | "strong"
42
+ | "em"
43
+ | "small"
44
+ | "mark"
45
+ | "del"
46
+ | "ins"
47
+ | "sub"
48
+ | "sup"
49
+ | "time"
50
+ | "address"
51
+ | "blockquote"
52
+ | "cite"
53
+ | "code"
54
+ | "abbr";
55
+ /** Text color. `"muted"` is an alias for `"tertiary"`. `"accent"` is the brand
56
+ * spend for one word inside a line (a repo name). `"success" | "warning" | "danger"`
30
57
  * are for a run of text that carries a state on its own; prefer Badge or Alert when the
31
58
  * state deserves a container.
32
59
  * @default "primary" */
33
- color?: 'primary' | 'secondary' | 'tertiary' | 'muted' | 'success' | 'warning' | 'danger';
60
+ color?:
61
+ | "primary"
62
+ | "secondary"
63
+ | "tertiary"
64
+ | "muted"
65
+ | "accent"
66
+ | "success"
67
+ | "warning"
68
+ | "danger";
34
69
  /** Truncate text with ellipsis when it overflows */
35
70
  truncate?: boolean;
36
71
  /** Number of lines before truncating (requires truncate=true) */
@@ -55,7 +90,7 @@ type TextRoleProps = {
55
90
  type TextLegacyScaleProps = {
56
91
  role?: never;
57
92
  size?: TextSize;
58
- variant?: 'section-label';
93
+ variant?: "section-label" | "eyebrow";
59
94
  weight?: TextWeight;
60
95
  font?: TextFont;
61
96
  letterSpacing?: TextTracking;
@@ -63,65 +98,68 @@ type TextLegacyScaleProps = {
63
98
 
64
99
  export type TextProps = TextSharedProps & (TextRoleProps | TextLegacyScaleProps);
65
100
 
66
- const TextRoot = React.forwardRef<HTMLElement, TextProps>(
67
- function Text(
68
- {
69
- children,
70
- as: Component = 'span',
71
- role,
72
- variant,
73
- size,
74
- weight,
75
- color,
76
- font,
77
- truncate,
78
- lineClamp,
79
- letterSpacing,
80
- tabularNums,
81
- className,
82
- style,
83
- ...htmlProps
84
- },
85
- ref
86
- ) {
87
- const ignoredLegacyProps = role
88
- ? [size, variant, weight, font, letterSpacing].some((value) => value !== undefined)
89
- : false;
101
+ const TextRoot = React.forwardRef<HTMLElement, TextProps>(function Text(
102
+ {
103
+ children,
104
+ as: Component = "span",
105
+ role,
106
+ variant,
107
+ size,
108
+ weight,
109
+ color,
110
+ font,
111
+ truncate,
112
+ lineClamp,
113
+ letterSpacing,
114
+ tabularNums,
115
+ className,
116
+ style,
117
+ ...htmlProps
118
+ },
119
+ ref
120
+ ) {
121
+ const ignoredLegacyProps = role
122
+ ? [size, variant, weight, font, letterSpacing].some((value) => value !== undefined)
123
+ : false;
90
124
 
91
- if (process.env.NODE_ENV !== 'production' && ignoredLegacyProps) {
92
- console.warn(
93
- '[Text] Semantic role takes precedence over size, variant, weight, font, and letterSpacing.'
94
- );
95
- }
125
+ if (!isProductionBuild() && ignoredLegacyProps) {
126
+ console.warn(
127
+ "[Text] Semantic role takes precedence over size, variant, weight, font, and letterSpacing."
128
+ );
129
+ }
96
130
 
97
- const classes = [
98
- styles.text,
99
- role && styles[`role-${role}`],
100
- !role && variant && styles[`variant-${variant}`],
101
- !role && size && styles[`size-${size}`],
102
- !role && weight && styles[`weight-${weight}`],
103
- color && styles[`color-${color}`],
104
- !role && font === 'mono' && styles.mono,
105
- truncate && styles.truncate,
106
- lineClamp && styles.lineClamp,
107
- !role && letterSpacing && styles[`tracking-${letterSpacing}`],
108
- tabularNums && styles.tabularNums,
109
- className,
110
- ]
111
- .filter(Boolean)
112
- .join(' ');
131
+ const classes = [
132
+ styles.text,
133
+ role && styles[`role-${role}`],
134
+ !role && variant && styles[`variant-${variant}`],
135
+ !role && size && styles[`size-${size}`],
136
+ !role && weight && styles[`weight-${weight}`],
137
+ color && styles[`color-${color}`],
138
+ !role && font === "mono" && styles.mono,
139
+ truncate && styles.truncate,
140
+ lineClamp && styles.lineClamp,
141
+ !role && letterSpacing && styles[`tracking-${letterSpacing}`],
142
+ tabularNums && styles.tabularNums,
143
+ className,
144
+ ]
145
+ .filter(Boolean)
146
+ .join(" ");
113
147
 
114
- const lineClampStyle = lineClamp
115
- ? { '--fui-line-clamp': lineClamp, ...style } as React.CSSProperties
116
- : style;
148
+ const lineClampStyle = lineClamp
149
+ ? ({ "--fui-line-clamp": lineClamp, ...style } as React.CSSProperties)
150
+ : style;
117
151
 
118
- return (
119
- <Component ref={ref as React.Ref<never>} className={classes} style={lineClampStyle} {...htmlProps}>
120
- {children}
121
- </Component>
122
- );
123
- }
124
- );
152
+ return (
153
+ <Component
154
+ ref={ref as React.Ref<never>}
155
+ className={classes}
156
+ style={lineClampStyle}
157
+ {...htmlProps}
158
+ >
159
+ {children}
160
+ </Component>
161
+ );
162
+ });
125
163
 
126
164
  export const Text = Object.assign(TextRoot, {
127
165
  Root: TextRoot,
@@ -1,14 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Textarea",
4
- "description": "Multi-line text input for longer form content",
5
- "category": "forms",
6
- "tags": [
7
- "input",
8
- "text",
9
- "form",
10
- "multiline"
11
- ],
4
+ "description": "Collects multi-line text for longer form content.",
5
+ "category": "inputs",
6
+ "tags": ["input", "text", "form", "multiline"],
12
7
  "status": "stable",
13
8
  "sourcePath": "src/components/Textarea/index.tsx",
14
9
  "exportName": "Textarea",
@@ -78,23 +73,14 @@
78
73
  "description": "Resize behavior",
79
74
  "default": "vertical",
80
75
  "required": false,
81
- "values": [
82
- "none",
83
- "vertical",
84
- "horizontal",
85
- "both"
86
- ]
76
+ "values": ["none", "vertical", "horizontal", "both"]
87
77
  },
88
78
  "size": {
89
79
  "type": "enum",
90
80
  "description": "Size variant",
91
81
  "default": "md",
92
82
  "required": false,
93
- "values": [
94
- "sm",
95
- "md",
96
- "lg"
97
- ]
83
+ "values": ["sm", "md", "lg"]
98
84
  },
99
85
  "disabled": {
100
86
  "type": "boolean",
@@ -209,61 +195,61 @@
209
195
  "Selecting from predefined options (use Select)"
210
196
  ],
211
197
  "guidelines": [
212
- "Set appropriate rows for expected content length",
213
- "Use placeholder to show example format",
214
- "Show character count when maxLength is set",
215
- "Consider auto-resize for better UX"
198
+ "Set rows to match the expected answer length",
199
+ "Placeholder shows an example, not the label",
200
+ "Pair maxLength with showCharCount so the limit is visible",
201
+ "Use resize=\"none\" only when the layout truly cannot flex"
216
202
  ],
217
203
  "accessibility": [
218
- "Always provide a visible label",
219
- "Use helperText for format hints",
220
- "Error messages should be descriptive"
204
+ "Give every textarea a visible label",
205
+ "Put format hints in helperText, not the placeholder",
206
+ "Error text says what to fix, not just that it failed"
221
207
  ]
222
208
  },
223
209
  "examples": [
224
210
  {
225
211
  "name": "Default",
226
- "description": "Basic textarea with label",
212
+ "description": "Three rows, draggable from the bottom-right corner.",
227
213
  "code": "<Textarea\n label=\"Description\"\n placeholder=\"Enter a description...\"\n/>"
228
214
  },
229
215
  {
230
216
  "name": "With Helper Text",
231
- "description": "Textarea with additional guidance",
217
+ "description": "Supporting text sits under the box.",
232
218
  "code": "<Textarea\n label=\"Bio\"\n placeholder=\"Tell us about yourself...\"\n helperText=\"Max 500 characters\"\n maxLength={500}\n/>"
233
219
  },
234
220
  {
235
221
  "name": "Error State",
236
- "description": "Textarea showing validation error",
222
+ "description": "Red border, and helperText becomes the reason.",
237
223
  "code": "<Textarea\n label=\"Comments\"\n placeholder=\"Add your comments...\"\n error\n helperText=\"This field is required\"\n/>"
238
224
  },
239
225
  {
240
226
  "name": "Disabled",
241
- "description": "Non-interactive textarea",
227
+ "description": "Dimmed and unfocusable.",
242
228
  "code": "<Textarea\n label=\"Notes\"\n placeholder=\"Cannot edit...\"\n disabled\n/>"
243
229
  },
244
230
  {
245
231
  "name": "Custom Rows",
246
- "description": "Textarea with more visible rows",
232
+ "description": "rows={6} doubles the visible height before scrolling.",
247
233
  "code": "<Textarea\n label=\"Long Description\"\n placeholder=\"Enter detailed information...\"\n rows={6}\n/>"
248
234
  },
249
235
  {
250
236
  "name": "Sizes",
251
- "description": "Available size variants",
237
+ "description": "Three heights: sm, md, lg.",
252
238
  "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '12px', maxWidth: '400px' }}>\n <Textarea label=\"Small\" size=\"sm\" placeholder=\"Small textarea\" />\n <Textarea label=\"Medium\" size=\"md\" placeholder=\"Medium textarea\" />\n <Textarea label=\"Large\" size=\"lg\" placeholder=\"Large textarea\" />\n</div>"
253
239
  },
254
240
  {
255
- "name": "With Root Props",
256
- "description": "Pass wrapper attributes/styling via rootProps",
257
- "code": "<Textarea\n label=\"Notes\"\n placeholder=\"Add notes...\"\n rootProps={{ 'data-demo': 'textarea-wrapper' }}\n/>"
241
+ "name": "Fixed Height",
242
+ "description": "resize=\"none\" removes the drag handle so the box stays put.",
243
+ "code": "<Textarea\n label=\"Notes\"\n placeholder=\"Add notes...\"\n resize=\"none\"\n/>"
258
244
  },
259
245
  {
260
246
  "name": "Success State",
261
- "description": "Textarea showing validated/success styling",
247
+ "description": "Green border confirms the value passed validation.",
262
248
  "code": "<Textarea\n label=\"Bio\"\n value=\"A short bio about myself.\"\n success\n helperText=\"Looks great!\"\n/>"
263
249
  },
264
250
  {
265
251
  "name": "With Character Counter",
266
- "description": "Textarea with character count and maxLength",
252
+ "description": "Live count against maxLength sits below the box.",
267
253
  "code": "<Textarea\n label=\"Bio\"\n placeholder=\"Tell us about yourself...\"\n maxLength={200}\n showCharCount\n/>"
268
254
  }
269
255
  ],
@@ -289,15 +275,11 @@
289
275
  "rootProps: HTMLAttributes<HTMLDivElement> - wrapper element props",
290
276
  "...native textarea attributes are supported (readOnly, autoComplete, maxLength, onKeyDown, etc.)"
291
277
  ],
292
- "a11yRules": [
293
- "A11Y_LABEL_REQUIRED"
294
- ]
278
+ "a11yRules": ["A11Y_LABEL_REQUIRED"]
295
279
  },
296
280
  "ai": {
297
281
  "compositionPattern": "compound",
298
- "subComponents": [
299
- "Root"
300
- ]
282
+ "subComponents": ["Root"]
301
283
  },
302
284
  "provenance": {
303
285
  "source": "migrated",
@@ -58,9 +58,7 @@
58
58
  &[rows="1"] {
59
59
  block-size: var(--_fui-field-track);
60
60
  min-block-size: var(--_fui-field-track);
61
- padding-block: calc(
62
- (var(--_fui-field-track) - 1lh - 2 * var(--_fui-field-stroke)) / 2
63
- );
61
+ padding-block: calc((var(--_fui-field-track) - 1lh - 2 * var(--_fui-field-stroke)) / 2);
64
62
  overflow-y: hidden;
65
63
  }
66
64
  }
@@ -166,7 +164,7 @@
166
164
 
167
165
  @media (prefers-contrast: more) {
168
166
  .textarea {
169
- border-width: 2px;
167
+ border-width: var(--fui-stroke-default, 2px);
170
168
  border-color: var(--fui-text-primary, $fui-text-primary);
171
169
 
172
170
  &:focus-visible {
@@ -1,15 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Theme",
4
- "description": "Theme management system with provider, toggle, and hook pattern. Supports light, dark, and system modes with localStorage persistence.",
5
- "category": "navigation",
6
- "tags": [
7
- "theme",
8
- "dark-mode",
9
- "light-mode",
10
- "provider",
11
- "toggle"
12
- ],
4
+ "description": "Gives every component below it a light, dark, or system color mode, and remembers the choice.",
5
+ "category": "utilities",
6
+ "tags": ["theme", "dark-mode", "light-mode", "provider", "toggle"],
13
7
  "status": "stable",
14
8
  "sourcePath": "src/components/Theme/index.tsx",
15
9
  "exportName": "ThemeProvider",
@@ -20,7 +14,8 @@
20
14
  "mode: light|dark|system",
21
15
  "onModeChange: function",
22
16
  "storageKey: string (default: fui-theme)",
23
- "attribute: data-theme|class (default: data-theme)"
17
+ "attribute: data-theme|class (default: data-theme)",
18
+ "ThemeToggle appearance: group|icon (default: group)"
24
19
  ],
25
20
  "props": {
26
21
  "children": {
@@ -33,31 +28,19 @@
33
28
  "description": "Default theme mode for uncontrolled usage",
34
29
  "default": "system",
35
30
  "required": false,
36
- "values": [
37
- "light",
38
- "dark",
39
- "system"
40
- ]
31
+ "values": ["light", "dark", "system"]
41
32
  },
42
33
  "defaultTheme": {
43
34
  "type": "enum",
44
35
  "description": "",
45
36
  "required": false,
46
- "values": [
47
- "light",
48
- "dark",
49
- "system"
50
- ]
37
+ "values": ["light", "dark", "system"]
51
38
  },
52
39
  "mode": {
53
40
  "type": "enum",
54
41
  "description": "Controlled theme mode",
55
42
  "required": false,
56
- "values": [
57
- "light",
58
- "dark",
59
- "system"
60
- ]
43
+ "values": ["light", "dark", "system"]
61
44
  },
62
45
  "onModeChange": {
63
46
  "type": "function",
@@ -75,52 +58,51 @@
75
58
  "description": "How to apply theme to DOM",
76
59
  "default": "data-theme",
77
60
  "required": false,
78
- "values": [
79
- "data-theme",
80
- "class"
81
- ]
61
+ "values": ["data-theme", "class"]
82
62
  }
83
63
  },
84
64
  "usage": {
85
65
  "when": [
86
- "Providing theme context to an application",
87
- "Toggling between light and dark modes",
88
- "Respecting system color scheme preference",
89
- "Persisting theme preference across sessions"
66
+ "An app needs light and dark modes",
67
+ "The user's choice should survive a reload",
68
+ "You want to honour the OS setting by default"
90
69
  ],
91
70
  "whenNot": [
92
- "Simple one-off color changes (use CSS variables)",
93
- "Component-level theming (use component props)"
71
+ "Recoloring one component (use its props)",
72
+ "A single one-off color swap (use a CSS variable)"
94
73
  ],
95
74
  "guidelines": [
96
- "Wrap your app with ThemeProvider at the root level",
97
- "Use useTheme hook to access theme state in components",
98
- "ThemeToggle cycles through light → dark → system",
99
- "Use storageKey to customize localStorage key",
100
- "Set attribute=\"class\" if your CSS uses .dark class instead of data-theme",
101
- "ThemeToggle forwards DOM props (id, data-*, className, handlers) to the toggle group"
75
+ "ThemeProvider goes at the root, once",
76
+ "useTheme reads and sets the mode anywhere below it",
77
+ "storageKey renames the localStorage entry",
78
+ "attribute=\"class\" if your CSS keys off .dark instead of data-theme",
79
+ "appearance=\"icon\" for tight toolbars; the default group shows both modes"
102
80
  ],
103
81
  "accessibility": [
104
- "ThemeToggle button has accessible label indicating current mode",
105
- "Theme changes are applied via CSS custom properties for smooth transitions",
106
- "System preference is detected via prefers-color-scheme media query"
82
+ "The toggle's label names the mode it is in",
83
+ "System mode follows prefers-color-scheme"
107
84
  ]
108
85
  },
109
86
  "examples": [
110
87
  {
111
88
  "name": "Default",
112
- "description": "ThemeProvider with system default",
113
- "code": "<ThemeProvider defaultMode=\"system\">\n <ThemeDemo />\n</ThemeProvider>"
89
+ "description": "Wrap the app once; every token below resolves to the active mode.",
90
+ "code": "<ThemeProvider defaultMode=\"system\">\n <div\n style={{\n padding: '16px',\n borderRadius: '8px',\n background: 'var(--fui-bg-elevated)',\n color: 'var(--fui-text-primary)',\n }}\n >\n Everything inside follows the system color scheme.\n </div>\n</ThemeProvider>"
114
91
  },
115
92
  {
116
93
  "name": "With Toggle",
117
- "description": "ThemeProvider with toggle button",
94
+ "description": "The toggle cycles light, dark, then back to system.",
118
95
  "code": "<ThemeProvider defaultMode=\"light\">\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n <ThemeToggle />\n <span>Click to cycle themes</span>\n </div>\n</ThemeProvider>"
119
96
  },
120
97
  {
121
98
  "name": "Toggle Sizes",
122
- "description": "ThemeToggle in different sizes",
99
+ "description": "Three sizes so the control fits whatever bar holds it.",
123
100
  "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
+ {
103
+ "name": "Icon Toggle",
104
+ "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>"
124
106
  }
125
107
  ],
126
108
  "relations": [
@@ -137,11 +119,10 @@
137
119
  "onModeChange: (mode) => void - change handler",
138
120
  "attribute: data-theme|class - DOM theme attribute",
139
121
  "ThemeToggle size: sm|md|lg - toggle button size",
122
+ "ThemeToggle appearance: group|icon - segmented or compact icon control (default: group)",
140
123
  "ThemeToggle forwards div DOM props to the button group root"
141
124
  ],
142
- "a11yRules": [
143
- "A11Y_TARGET_SIZE_MIN"
144
- ]
125
+ "a11yRules": ["A11Y_TARGET_SIZE_MIN"]
145
126
  },
146
127
  "provenance": {
147
128
  "source": "migrated",
@@ -81,7 +81,7 @@ function ThemeProvider({
81
81
  const systemPreference = useSystemPreference();
82
82
 
83
83
  // Warn on deprecated prop usage (dev only)
84
- if (process.env.NODE_ENV !== "production" && defaultTheme !== undefined) {
84
+ if (!isProductionBuild() && defaultTheme !== undefined) {
85
85
  console.warn(
86
86
  "[Fragments] ThemeProvider: `defaultTheme` is deprecated. Use `defaultMode` instead. " +
87
87
  "`defaultTheme` will be removed in v1.0."
@@ -194,6 +194,7 @@ export { ThemeProvider, ThemeToggle, useTheme };
194
194
  // Import + re-export seed derivation types — canonical definitions in utils/seed-derivation.ts
195
195
  import type { NeutralPalette, DensityPreset, RadiusStyle } from "../../utils/seed-derivation";
196
196
  import { applyMeasurementSelection } from "../../measurements";
197
+ import { isProductionBuild } from "../../utils/env";
197
198
  export type { NeutralPalette, DensityPreset, RadiusStyle };
198
199
 
199
200
  export interface ConfigureThemeOptions {
@@ -11,7 +11,7 @@
11
11
  align-items: stretch;
12
12
  gap: 0;
13
13
  padding: 0;
14
- background-color: var(--fui-bg-tertiary, $fui-bg-tertiary);
14
+ background-color: var(--fui-theme-toggle-bg, var(--fui-bg-tertiary, #{$fui-bg-tertiary}));
15
15
  border-radius: var(--fui-radius-md, $fui-radius-md);
16
16
  }
17
17
 
@@ -36,14 +36,28 @@
36
36
  }
37
37
 
38
38
  .toggleButtonActive {
39
- background-color: var(--fui-bg-elevated, $fui-bg-elevated);
39
+ background-color: var(
40
+ --fui-theme-toggle-active-bg,
41
+ var(--fui-control-selected-bg, #{$fui-bg-active})
42
+ );
40
43
  color: var(--fui-text-primary, $fui-text-primary);
41
- box-shadow: var(--fui-shadow-sm, $fui-shadow-sm);
44
+ box-shadow: var(--fui-theme-toggle-active-shadow, none);
42
45
  }
43
46
 
44
- // Size variants
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"
45
58
  .sizeSm {
46
- .toggleButton {
59
+ .toggleButton,
60
+ &.toggleButton {
47
61
  @include action.icon-only("sm");
48
62
 
49
63
  svg {
@@ -53,7 +67,8 @@
53
67
  }
54
68
 
55
69
  .sizeMd {
56
- .toggleButton {
70
+ .toggleButton,
71
+ &.toggleButton {
57
72
  @include action.icon-only("md");
58
73
 
59
74
  svg {
@@ -63,7 +78,8 @@
63
78
  }
64
79
 
65
80
  .sizeLg {
66
- .toggleButton {
81
+ .toggleButton,
82
+ &.toggleButton {
67
83
  @include action.icon-only("lg");
68
84
 
69
85
  svg {