@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
@@ -3,6 +3,7 @@
3
3
  import * as React from "react";
4
4
  import { mergeAriaIds } from "../../utils/aria";
5
5
  import styles from "./Chart.module.scss";
6
+ import { isDevelopmentBuild } from "../../utils/env";
6
7
 
7
8
  // ============================================
8
9
  // Types (self-owned — no external dependency for types)
@@ -74,7 +75,7 @@ function loadChartDeps(): Promise<void> {
74
75
  _RechartsLegend = rc.Legend as unknown as React.ComponentType<Record<string, unknown>>;
75
76
  } catch {
76
77
  _chartFailed = true;
77
- if (process.env.NODE_ENV === "development") {
78
+ if (isDevelopmentBuild()) {
78
79
  console.warn(
79
80
  "[@usefragments/ui] Chart: recharts is not installed. " +
80
81
  "Install it with: npm install recharts"
@@ -132,6 +133,34 @@ export function ChartContainer({
132
133
  ...htmlProps
133
134
  }: ChartContainerProps) {
134
135
  const chartId = React.useId();
136
+ const frameRef = React.useRef<HTMLDivElement | null>(null);
137
+ // Recharts only lays a chart out once it knows a pixel box. Percentage
138
+ // sizing leaves the first paint blank until something else happens to
139
+ // resize the window, so the container measures its own frame and hands the
140
+ // chart real numbers — re-measured whenever the frame changes.
141
+ const [frame, setFrame] = React.useState<{ width: number; height: number } | null>(null);
142
+
143
+ React.useEffect(() => {
144
+ const element = frameRef.current;
145
+ if (!element || typeof ResizeObserver === "undefined") return;
146
+
147
+ const measure = () => {
148
+ const rect = element.getBoundingClientRect();
149
+ const width = Math.round(rect.width);
150
+ const height = Math.round(rect.height);
151
+ setFrame((current) =>
152
+ current && current.width === width && current.height === height
153
+ ? current
154
+ : { width, height }
155
+ );
156
+ };
157
+
158
+ measure();
159
+ const observer = new ResizeObserver(measure);
160
+ observer.observe(element);
161
+ return () => observer.disconnect();
162
+ }, []);
163
+
135
164
  const summaryId = summary ? `chart-summary-${chartId}` : undefined;
136
165
  const dataTableId = dataTable ? `chart-data-${chartId}` : undefined;
137
166
 
@@ -149,12 +178,12 @@ export function ChartContainer({
149
178
  // Inject sizing props into the chart child (recharts API).
150
179
  // Only pass `responsive` for custom component types to avoid leaking the
151
180
  // prop to intrinsic DOM nodes in test/demo usage.
152
- const chartChildProps: Record<string, unknown> = {
153
- width: "100%",
154
- height: "100%",
155
- };
181
+ const measured = frame !== null && frame.width > 0 && frame.height > 0;
182
+ const chartChildProps: Record<string, unknown> = measured
183
+ ? { width: frame.width, height: frame.height }
184
+ : { width: "100%", height: "100%" };
156
185
 
157
- if (typeof children.type !== "string") {
186
+ if (!measured && typeof children.type !== "string") {
158
187
  chartChildProps.responsive = true;
159
188
  }
160
189
 
@@ -167,6 +196,7 @@ export function ChartContainer({
167
196
  <ChartConfigContext.Provider value={config}>
168
197
  <div
169
198
  {...htmlProps}
199
+ ref={frameRef}
170
200
  className={rootClasses}
171
201
  style={{ ...cssVars, ...style }}
172
202
  role="img"
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Checkbox",
4
- "description": "Binary toggle for form fields. Use for options that require explicit submission, unlike Switch which takes effect immediately.",
5
- "category": "forms",
4
+ "description": "Selects options that take effect when a form is submitted.",
5
+ "category": "inputs",
6
6
  "tags": ["checkbox", "form", "boolean", "selection", "input"],
7
7
  "status": "stable",
8
8
  "sourcePath": "src/components/Checkbox/index.tsx",
@@ -139,63 +139,63 @@
139
139
  },
140
140
  "usage": {
141
141
  "when": [
142
- "Form fields requiring explicit submission",
143
- "Multi-select from a list of options",
144
- "Terms and conditions acceptance",
145
- "Filter or preference checklists"
142
+ "Choices that apply only once the form is submitted",
143
+ "Picking several items from a list",
144
+ "Accepting terms",
145
+ "Filter and preference lists"
146
146
  ],
147
147
  "whenNot": [
148
- "Immediate effect settings (use Switch)",
149
- "Single selection from options (use RadioGroup)",
150
- "Selecting from many options (use Select)"
148
+ "Settings that apply instantly (use Switch)",
149
+ "One choice from a few (use RadioGroup)",
150
+ "Many options (use Select)"
151
151
  ],
152
152
  "guidelines": [
153
- "Always include a visible label",
154
- "Use helperText for additional context when needed",
155
- "Group related checkboxes visually",
156
- "Use indeterminate state for parent/child relationships"
153
+ "Always show a label",
154
+ "Add helperText when the consequence is not obvious",
155
+ "Keep related boxes together",
156
+ "Use indeterminate for a parent whose children are partly checked"
157
157
  ],
158
158
  "accessibility": [
159
- "Proper label association",
160
- "Keyboard accessible (Space to toggle)",
161
- "Visible focus indicator",
162
- "Indeterminate state properly announced"
159
+ "Label is tied to the box",
160
+ "Space toggles it",
161
+ "Focus ring stays visible",
162
+ "Indeterminate is announced as mixed"
163
163
  ]
164
164
  },
165
165
  "examples": [
166
166
  {
167
167
  "name": "Default",
168
- "description": "Basic checkbox with label",
168
+ "description": "One box, one label, off to start.",
169
169
  "code": "<StatefulCheckbox label=\"Accept terms and conditions\" />"
170
170
  },
171
171
  {
172
172
  "name": "With Helper Text",
173
- "description": "Checkbox with helper text",
173
+ "description": "Second line spells out what opting in does.",
174
174
  "code": "<StatefulCheckbox\n label=\"Email notifications\"\n helperText=\"Receive email updates about your account activity\"\n/>"
175
175
  },
176
176
  {
177
177
  "name": "Checked",
178
- "description": "Pre-checked checkbox",
178
+ "description": "Starts on.",
179
179
  "code": "<StatefulCheckbox defaultChecked label=\"Subscribe to newsletter\" />"
180
180
  },
181
181
  {
182
182
  "name": "Indeterminate",
183
- "description": "Partial selection state",
183
+ "description": "A dash on the parent means only some children are on.",
184
184
  "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <Checkbox indeterminate label=\"Select all\" />\n <div style={{ marginLeft: '24px', display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <StatefulCheckbox defaultChecked label=\"Option 1\" />\n <StatefulCheckbox label=\"Option 2\" />\n <StatefulCheckbox defaultChecked label=\"Option 3\" />\n </div>\n</div>"
185
185
  },
186
186
  {
187
187
  "name": "Sizes",
188
- "description": "Available size options",
188
+ "description": "Three box sizes: sm, md, lg.",
189
189
  "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n <StatefulCheckbox size=\"sm\" label=\"Small checkbox\" />\n <StatefulCheckbox size=\"md\" label=\"Medium checkbox\" />\n <StatefulCheckbox size=\"lg\" label=\"Large checkbox\" />\n</div>"
190
190
  },
191
191
  {
192
192
  "name": "Disabled",
193
- "description": "Non-interactive states",
193
+ "description": "Locked in both positions, on and off.",
194
194
  "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <Checkbox disabled label=\"Disabled unchecked\" />\n <Checkbox disabled checked label=\"Disabled checked\" />\n</div>"
195
195
  },
196
196
  {
197
197
  "name": "Custom Styling Targets",
198
- "description": "Use explicit class targets for control vs content styling",
198
+ "description": "controlClassName styles the box, contentClassName the text.",
199
199
  "code": "<Checkbox\n label=\"Styled checkbox\"\n helperText=\"Control and content wrappers can be targeted independently\"\n controlClassName=\"demo-checkbox-control\"\n contentClassName=\"demo-checkbox-content\"\n/>"
200
200
  }
201
201
  ],
@@ -49,21 +49,15 @@
49
49
 
50
50
  &[data-checked],
51
51
  &[data-indeterminate] {
52
- background-color: var(--fui-button-primary-base, $fui-color-accent);
53
- border-color: var(
54
- --fui-button-primary-border,
55
- var(--fui-button-primary-base, #{$fui-color-accent})
56
- );
52
+ background-color: var(--fui-control-checked-bg, $fui-color-accent);
53
+ border-color: var(--fui-control-checked-border, $fui-color-accent);
57
54
  box-shadow: inset 0 1px 0 color-mix(in srgb, white 24%, transparent);
58
55
  }
59
56
 
60
57
  &[data-checked]:hover:not([data-disabled]),
61
58
  &[data-indeterminate]:hover:not([data-disabled]) {
62
- background-color: var(--fui-button-primary-hover, $fui-color-accent);
63
- border-color: var(
64
- --fui-button-primary-border-hover,
65
- var(--fui-button-primary-hover, #{$fui-color-accent})
66
- );
59
+ background-color: var(--fui-control-checked-bg-hover, $fui-color-accent-hover);
60
+ border-color: var(--fui-control-checked-border-hover, $fui-color-accent-hover);
67
61
  }
68
62
 
69
63
  &[data-invalid] {
@@ -77,7 +71,6 @@
77
71
  box-shadow: inset 0 0 0 1px
78
72
  color-mix(in srgb, var(--fui-color-danger-text, #{$fui-color-danger-text}) 35%, transparent);
79
73
  }
80
-
81
74
  }
82
75
 
83
76
  // Size variants
@@ -99,24 +92,40 @@
99
92
  display: flex;
100
93
  align-items: center;
101
94
  justify-content: center;
102
- color: var(--fui-button-primary-color, #fff);
95
+ color: var(--fui-control-checked-color, $fui-color-on-accent);
103
96
 
104
97
  svg {
105
98
  width: var(--fui-icon-xs, $fui-icon-xs);
106
99
  height: var(--fui-icon-xs, $fui-icon-xs);
107
100
  }
108
101
 
109
- // Animation
102
+ // Animation: the mark draws itself in (stroke-dashoffset over the
103
+ // pathLength-normalized glyphs) instead of popping. Opacity keeps the
104
+ // un-draw exit from lingering.
110
105
  opacity: 0;
111
- transform: scale(0.8);
112
- transition:
113
- opacity var(--fui-transition-fast, $fui-transition-fast),
114
- transform var(--fui-transition-fast, $fui-transition-fast);
106
+ transition: opacity var(--fui-transition-fast, $fui-transition-fast);
107
+
108
+ svg :is(polyline, line) {
109
+ stroke-dasharray: 24;
110
+ stroke-dashoffset: 24;
111
+ transition: stroke-dashoffset var(--fui-transition-normal, $fui-transition-normal);
112
+ }
115
113
 
116
114
  [data-checked] > &,
117
115
  [data-indeterminate] > & {
118
116
  opacity: 1;
119
- transform: scale(1);
117
+
118
+ svg :is(polyline, line) {
119
+ stroke-dashoffset: 0;
120
+ }
121
+ }
122
+
123
+ @media (prefers-reduced-motion: reduce) {
124
+ transition: none;
125
+
126
+ svg :is(polyline, line) {
127
+ transition: none;
128
+ }
120
129
  }
121
130
 
122
131
  [data-invalid][data-checked] > &,
@@ -173,23 +182,23 @@
173
182
 
174
183
  &:focus-within:not([data-disabled]) {
175
184
  @include focus-ring;
176
- border-color: var(--fui-button-primary-base, $fui-color-accent);
185
+ border-color: var(--fui-control-checked-border, $fui-color-accent);
177
186
  }
178
187
 
179
188
  &:has([data-checked]),
180
189
  &:has([data-indeterminate]) {
181
190
  background: color-mix(
182
191
  in srgb,
183
- var(--fui-button-primary-base, #{$fui-color-accent}) 13%,
192
+ var(--fui-control-checked-bg, #{$fui-color-accent}) 13%,
184
193
  transparent
185
194
  );
186
195
  border-color: color-mix(
187
196
  in srgb,
188
- var(--fui-button-primary-base, #{$fui-color-accent}) 62%,
197
+ var(--fui-control-checked-border, #{$fui-color-accent}) 62%,
189
198
  transparent
190
199
  );
191
200
  box-shadow: 0 0 0 1px
192
- color-mix(in srgb, var(--fui-button-primary-base, #{$fui-color-accent}) 28%, transparent);
201
+ color-mix(in srgb, var(--fui-control-checked-border, #{$fui-color-accent}) 28%, transparent);
193
202
  }
194
203
 
195
204
  &[data-size="sm"] {
@@ -217,7 +226,7 @@
217
226
 
218
227
  &[data-checked],
219
228
  &[data-indeterminate] {
220
- border-color: var(--fui-button-primary-base, $fui-color-accent);
229
+ border-color: var(--fui-control-checked-border, $fui-color-accent);
221
230
  }
222
231
 
223
232
  &[data-invalid] {
@@ -93,7 +93,9 @@ function CheckIcon() {
93
93
  strokeLinejoin="round"
94
94
  aria-hidden="true"
95
95
  >
96
- <polyline points="20 6 9 17 4 12" />
96
+ {/* Point order = draw order: the mark draws short arm first, then the
97
+ long stroke. pathLength normalizes the dash budget for the CSS draw. */}
98
+ <polyline points="4 12 9 17 20 6" pathLength={24} />
97
99
  </svg>
98
100
  );
99
101
  }
@@ -110,7 +112,7 @@ function MinusIcon() {
110
112
  strokeLinejoin="round"
111
113
  aria-hidden="true"
112
114
  >
113
- <line x1="5" y1="12" x2="19" y2="12" />
115
+ <line x1="5" y1="12" x2="19" y2="12" pathLength={24} />
114
116
  </svg>
115
117
  );
116
118
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Chip",
4
- "description": "Interactive pill-shaped element for filtering, selecting, and tagging. Supports single and multi-select via Chip.Group.",
5
- "category": "forms",
4
+ "description": "Pill control for filtering, multi-select, and removable tags.",
5
+ "category": "inputs",
6
6
  "tags": ["chip", "tag", "filter", "selection", "multi-select", "action"],
7
7
  "status": "stable",
8
8
  "sourcePath": "src/components/Chip/index.tsx",
@@ -79,77 +79,70 @@
79
79
  },
80
80
  "usage": {
81
81
  "when": [
82
- "Filtering content by categories or tags",
83
- "Multi-select scenarios like choosing interests or skills",
84
- "Toggling options in a compact pill-shaped control",
85
- "Displaying removable user-applied filters"
82
+ "Filtering a list by tag or category",
83
+ "Multi-select from a compact set",
84
+ "Showing filters the user can dismiss"
86
85
  ],
87
86
  "whenNot": [
88
- "Display-only status labels (use Badge)",
89
- "Navigation between views (use Tabs)",
90
- "Binary on/off state (use Switch)",
91
- "Primary call-to-action (use Button)"
87
+ "Read-only status use Badge",
88
+ "Switching views use Tabs",
89
+ "On/off state use Switch",
90
+ "A main call to action use Button"
92
91
  ],
93
92
  "guidelines": [
94
- "Keep chip labels short (1-3 words)",
95
- "Use Chip.Group for multi-select sets with shared state",
96
- "Keep the default micro size for filters and tags; opt into a larger size only when the surrounding control track requires it",
97
- "Use onRemove only when users should be able to dismiss the chip",
98
- "Pair avatar chips with user-related selections (assignees, reviewers)",
99
- "Provide an explicit value on Chip when using non-string/custom JSX children inside Chip.Group"
93
+ "One to three words per chip",
94
+ "Chip.Group when chips share selection state",
95
+ "Keep xs for filters and tags; size up only to match a taller control track",
96
+ "onRemove only when the chip is genuinely dismissible",
97
+ "Pass an explicit value when children are custom JSX"
100
98
  ],
101
99
  "accessibility": [
102
- "Chips are buttons and use aria-pressed for selection state",
103
- "Chip.Group is a grouping wrapper; add role/aria-label when needed for assistive context",
104
- "Remove buttons include descriptive aria-label with chip text",
105
- "Disabled chips are properly excluded from interaction"
100
+ "Chips are buttons; selection is reported via aria-pressed",
101
+ "Add role and aria-label to Chip.Group when the set needs a name",
102
+ "Remove buttons carry the chip text in their aria-label",
103
+ "Disabled chips are skipped by keyboard and pointer"
106
104
  ]
107
105
  },
108
106
  "examples": [
109
107
  {
110
- "name": "Default",
111
- "description": "Basic filled chip",
112
- "code": "<Chip>Default</Chip>"
108
+ "name": "Variants",
109
+ "description": "Tinted, hairline, and accent-soft chrome.",
110
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Chip variant=\"filled\">Filled</Chip>\n <Chip variant=\"outlined\">Outlined</Chip>\n <Chip variant=\"soft\">Soft</Chip>\n</Stack>"
113
111
  },
114
112
  {
115
- "name": "Outline",
116
- "description": "Chip with border using the \"outline\" alias for \"outlined\"",
117
- "code": "<div style={{ display: 'flex', gap: '8px' }}>\n <Chip variant=\"outline\">Outline</Chip>\n <Chip variant=\"outline\" selected>Outline Selected</Chip>\n</div>"
113
+ "name": "Sizes",
114
+ "description": "xs for filter rows; larger sizes match taller field tracks.",
115
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" align=\"center\" wrap>\n <Chip variant=\"outlined\" size=\"xs\">Extra small</Chip>\n <Chip variant=\"outlined\" size=\"sm\">Small</Chip>\n <Chip variant=\"outlined\" size=\"md\">Medium</Chip>\n <Chip variant=\"outlined\" size=\"lg\">Large</Chip>\n</Stack>"
118
116
  },
119
117
  {
120
118
  "name": "Selected",
121
- "description": "Chip in selected state across variants",
122
- "code": "<Stack direction=\"row\" gap=\"sm\" wrap>\n <Chip selected>Filled</Chip>\n <Chip variant=\"outlined\" selected>Outlined</Chip>\n <Chip variant=\"soft\" selected>Soft</Chip>\n</Stack>"
119
+ "description": "All three variants share one selection treatment.",
120
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Chip selected>Filled</Chip>\n <Chip variant=\"outlined\" selected>Outlined</Chip>\n <Chip variant=\"soft\" selected>Soft</Chip>\n</Stack>"
123
121
  },
124
122
  {
125
123
  "name": "With Avatar",
126
- "description": "Chip with a leading avatar image",
124
+ "description": "Leading face, for people-shaped selections.",
127
125
  "code": "<Chip avatar={<img src=\"https://i.pravatar.cc/32?u=chip\" alt=\"\" />}>\n Jane Doe\n</Chip>"
128
126
  },
129
127
  {
130
128
  "name": "With Remove",
131
- "description": "Removable chip with dismiss button",
132
- "code": "<div style={{ display: 'flex', gap: '8px' }}>\n <Chip onRemove={() => {}}>React</Chip>\n <Chip onRemove={() => {}}>TypeScript</Chip>\n <Chip onRemove={() => {}}>SCSS</Chip>\n</div>"
133
- },
134
- {
135
- "name": "Selected Removable",
136
- "description": "Selected removable chips retain the shared selection treatment across variants",
137
- "code": "<Stack direction=\"row\" gap=\"sm\" wrap>\n <Chip selected onRemove={() => {}}>Filled</Chip>\n <Chip variant=\"outlined\" selected onRemove={() => {}}>Outlined</Chip>\n <Chip variant=\"soft\" selected onRemove={() => {}}>Soft</Chip>\n</Stack>"
129
+ "description": "Trailing dismiss button clears the tag.",
130
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Chip variant=\"outlined\" onRemove={() => {}}>React</Chip>\n <Chip variant=\"outlined\" selected onRemove={() => {}}>TypeScript</Chip>\n <Chip variant=\"soft\" onRemove={() => {}}>SCSS</Chip>\n</Stack>"
138
131
  },
139
132
  {
140
133
  "name": "Chip Group",
141
- "description": "Multi-select chip set with shared state",
134
+ "description": "Selection state is held by the group, not each chip.",
142
135
  "code": "<Chip.Group defaultValue={['react']}>\n <Chip value=\"react\">React</Chip>\n <Chip value=\"vue\">Vue</Chip>\n <Chip value=\"angular\">Angular</Chip>\n <Chip value=\"svelte\">Svelte</Chip>\n</Chip.Group>"
143
136
  },
144
137
  {
145
138
  "name": "Chip Group with Custom Labels",
146
- "description": "Use explicit values when chip labels are custom JSX",
139
+ "description": "Custom JSX children need an explicit value.",
147
140
  "code": "<Chip.Group aria-label=\"Assignees\">\n <Chip value=\"jane\">\n <span>Jane Doe</span>\n </Chip>\n <Chip value=\"sam\">\n <span>Sam Lee</span>\n </Chip>\n</Chip.Group>"
148
141
  },
149
142
  {
150
143
  "name": "Disabled",
151
- "description": "Chip in disabled state",
152
- "code": "<div style={{ display: 'flex', gap: '8px' }}>\n <Chip disabled>Disabled</Chip>\n <Chip disabled selected>Disabled Selected</Chip>\n</div>"
144
+ "description": "Dimmed and unreachable, selected or not.",
145
+ "code": "import { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\" wrap>\n <Chip variant=\"outlined\" disabled>Disabled</Chip>\n <Chip variant=\"outlined\" disabled selected>Disabled selected</Chip>\n</Stack>"
153
146
  }
154
147
  ],
155
148
  "relations": [
@@ -13,7 +13,8 @@
13
13
 
14
14
  &:active:not(:disabled) {
15
15
  background-color: var(--fui-field-selection-bg-hover, $fui-bg-hover);
16
- box-shadow: inset 0 0 0 1px var(--fui-field-selection-border, $fui-border-strong);
16
+ box-shadow: inset 0 0 0 var(--fui-stroke-hairline, 1px)
17
+ var(--fui-field-selection-border, $fui-border-strong);
17
18
  }
18
19
  }
19
20
 
@@ -24,7 +25,6 @@
24
25
 
25
26
  border-radius: var(--fui-radius-full, $fui-radius-full);
26
27
  white-space: nowrap;
27
- user-select: none;
28
28
  }
29
29
 
30
30
  .withRemove {
@@ -2,6 +2,7 @@
2
2
 
3
3
  import * as React from "react";
4
4
  import styles from "./Chip.module.scss";
5
+ import { isProductionBuild } from "../../utils/env";
5
6
 
6
7
  /**
7
8
  * Chip for selections, filters, and tags. Use with Chip.Group for multi-select.
@@ -165,7 +166,7 @@ function ChipGroupInner(
165
166
  if (child.props.value != null) return child.props.value;
166
167
  if (typeof child.props.children === "string") return child.props.children;
167
168
  if (child.key != null) return String(child.key);
168
- if (process.env.NODE_ENV !== "production") {
169
+ if (!isProductionBuild()) {
169
170
  // Non-string labels need an explicit value to avoid unstable group selection keys.
170
171
  console.warn(
171
172
  "Chip.Group: Chips with non-string children should provide a `value` prop."