@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,14 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Skeleton",
4
- "description": "Placeholder loading state for content",
4
+ "description": "Holds the shape of content that has not arrived yet.",
5
5
  "category": "feedback",
6
- "tags": [
7
- "loading",
8
- "placeholder",
9
- "skeleton",
10
- "shimmer"
11
- ],
6
+ "tags": ["loading", "placeholder", "skeleton", "shimmer"],
12
7
  "status": "stable",
13
8
  "sourcePath": "src/components/Skeleton/index.tsx",
14
9
  "exportName": "Skeleton",
@@ -27,25 +22,14 @@
27
22
  "description": "Semantic variant that auto-sizes",
28
23
  "default": "rect",
29
24
  "required": false,
30
- "values": [
31
- "text",
32
- "heading",
33
- "avatar",
34
- "button",
35
- "input",
36
- "rect"
37
- ]
25
+ "values": ["text", "heading", "avatar", "button", "input", "rect"]
38
26
  },
39
27
  "size": {
40
28
  "type": "enum",
41
29
  "description": "Size for avatar/button variants",
42
30
  "default": "md",
43
31
  "required": false,
44
- "values": [
45
- "sm",
46
- "md",
47
- "lg"
48
- ]
32
+ "values": ["sm", "md", "lg"]
49
33
  },
50
34
  "width": {
51
35
  "type": "union",
@@ -67,13 +51,7 @@
67
51
  "type": "enum",
68
52
  "description": "Border radius override",
69
53
  "required": false,
70
- "values": [
71
- "sm",
72
- "md",
73
- "lg",
74
- "none",
75
- "full"
76
- ]
54
+ "values": ["sm", "md", "lg", "none", "full"]
77
55
  },
78
56
  "static": {
79
57
  "type": "boolean",
@@ -84,54 +62,53 @@
84
62
  },
85
63
  "usage": {
86
64
  "when": [
87
- "Content is loading asynchronously",
88
- "Preventing layout shift during data fetching",
89
- "Providing visual feedback that content is coming",
90
- "Improving perceived performance"
65
+ "Content is still being fetched",
66
+ "You want to stop the layout jumping when it lands",
67
+ "Making a wait feel shorter than it is"
91
68
  ],
92
69
  "whenNot": [
93
- "Short loading times (< 300ms)",
94
- "When spinner is more appropriate",
95
- "Background operations without visible impact"
70
+ "Waits under about 300ms",
71
+ "A spinner says it better",
72
+ "Work the user cannot see anyway"
96
73
  ],
97
74
  "guidelines": [
98
- "Match skeleton shape to expected content",
99
- "Use semantic variants (text, heading, avatar) for consistency",
100
- "Maintain similar dimensions to loaded content",
101
- "Avoid too many skeleton elements - simplify complex layouts",
102
- "Skeleton and Skeleton.Text forward DOM props (id, aria-*, data-*, handlers)"
75
+ "Match the shape and size of the real content",
76
+ "Prefer the text, heading, and avatar variants over hand-rolled boxes",
77
+ "Give Skeleton.Text an ancestor with a real width — percentage lines collapse without one",
78
+ "A few big shapes beat many small ones",
79
+ "Skeleton and Skeleton.Text forward id, aria-*, data-* and handlers"
103
80
  ],
104
81
  "accessibility": [
105
- "Skeletons are decorative - use aria-hidden",
106
- "Announce loading state separately if needed",
107
- "Ensure sufficient contrast for the animation"
82
+ "Skeletons are decoration hide them with aria-hidden",
83
+ "Announce the loading state separately if it matters",
84
+ "Keep the pulse subtle but visible against the surface"
108
85
  ]
109
86
  },
110
87
  "examples": [
111
88
  {
112
89
  "name": "Default",
113
- "description": "Basic rectangle skeleton",
90
+ "description": "One rectangle at an explicit size.",
114
91
  "code": "<Skeleton width={200} height={20} />"
115
92
  },
116
93
  {
117
94
  "name": "Text Lines",
118
- "description": "Multi-line text placeholder",
119
- "code": "<Skeleton.Text lines={3} />"
95
+ "description": "Stacked lines that fill the width they are given.",
96
+ "code": "<div style={{ width: 260 }}>\n <Skeleton.Text lines={3} />\n</div>"
120
97
  },
121
98
  {
122
99
  "name": "Semantic Variants",
123
- "description": "Pre-configured shapes for common elements",
124
- "code": "<div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--fui-space-2)' }}>\n <Skeleton variant=\"heading\" width={200} />\n <Skeleton variant=\"text\" width=\"100%\" />\n <Skeleton variant=\"text\" width=\"80%\" />\n</div>"
100
+ "description": "Heading sits taller than the body lines under it.",
101
+ "code": "<div\n style={{\n width: 260,\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--fui-space-2)',\n }}\n>\n <Skeleton variant=\"heading\" width={200} />\n <Skeleton variant=\"text\" width=\"100%\" />\n <Skeleton variant=\"text\" width=\"80%\" />\n</div>"
125
102
  },
126
103
  {
127
104
  "name": "Avatar Skeleton",
128
- "description": "Circular placeholder for avatars",
105
+ "description": "Circles matching the three avatar sizes.",
129
106
  "code": "<div style={{ display: 'flex', gap: 'var(--fui-space-1)', alignItems: 'center' }}>\n <Skeleton.Circle size=\"sm\" />\n <Skeleton.Circle size=\"md\" />\n <Skeleton.Circle size=\"lg\" />\n</div>"
130
107
  },
131
108
  {
132
109
  "name": "Card Skeleton",
133
- "description": "Composed skeleton for a card layout",
134
- "code": "<div style={{ width: 300, padding: 'var(--fui-space-2)', border: '1px solid var(--fui-border)', borderRadius: 'var(--fui-radius-lg)' }}>\n <Skeleton variant=\"rect\" height={120} radius=\"md\" />\n <div style={{ marginTop: 'var(--fui-space-2)' }}>\n <Skeleton variant=\"heading\" width=\"60%\" />\n </div>\n <div style={{ marginTop: 'var(--fui-space-1)' }}>\n <Skeleton.Text lines={2} />\n </div>\n</div>"
110
+ "description": "Media, title, then body — the card before it loads.",
111
+ "code": "<div\n style={{\n width: 300,\n padding: 'var(--fui-space-2)',\n border: '1px solid var(--fui-border)',\n borderRadius: 'var(--fui-radius-lg)',\n }}\n>\n <Skeleton variant=\"rect\" height={120} radius=\"md\" />\n <div style={{ marginTop: 'var(--fui-space-2)' }}>\n <Skeleton variant=\"heading\" width=\"60%\" />\n </div>\n <div style={{ marginTop: 'var(--fui-space-1)' }}>\n <Skeleton.Text lines={2} />\n </div>\n</div>"
135
112
  }
136
113
  ],
137
114
  "relations": [
@@ -152,10 +129,7 @@
152
129
  },
153
130
  "ai": {
154
131
  "compositionPattern": "compound",
155
- "subComponents": [
156
- "Text",
157
- "Circle"
158
- ]
132
+ "subComponents": ["Text", "Circle"]
159
133
  },
160
134
  "provenance": {
161
135
  "source": "migrated",
@@ -5,28 +5,44 @@
5
5
  // Skeleton Component Styles
6
6
  // ============================================
7
7
 
8
- // Animation
9
- @keyframes skeleton-pulse {
10
- 0%,
11
- 100% {
12
- opacity: 1;
8
+ // Animation — a highlight travelling across the placeholder, not the whole
9
+ // block fading out. A pulsing opacity spends half its cycle invisible on a
10
+ // light surface; the shimmer keeps the missing fact legible the entire time.
11
+ @keyframes skeleton-shimmer {
12
+ from {
13
+ background-position: 120% 0;
13
14
  }
14
- 50% {
15
- opacity: 0.5;
15
+ to {
16
+ background-position: -120% 0;
16
17
  }
17
18
  }
18
19
 
19
20
  // Base skeleton
20
21
  .skeleton {
21
22
  display: block;
22
- background-color: var(--fui-bg-tertiary, #{$fui-bg-tertiary});
23
- animation: skeleton-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
23
+ background-color: var(--fui-skeleton, #{$fui-bg-tertiary});
24
+ background-image: linear-gradient(
25
+ 90deg,
26
+ var(--fui-skeleton, #{$fui-bg-tertiary}) 0%,
27
+ var(--fui-skeleton-hi, #{$fui-bg-secondary}) 45%,
28
+ var(--fui-skeleton, #{$fui-bg-tertiary}) 90%
29
+ );
30
+ background-size: 240% 100%;
31
+ animation: skeleton-shimmer var(--fui-duration-shimmer, $fui-duration-shimmer) linear infinite;
24
32
  border-radius: var(--fui-radius-md, #{$fui-radius-md});
25
33
  }
26
34
 
27
35
  // Static (no animation)
28
36
  .static {
29
37
  animation: none;
38
+ background-image: none;
39
+ }
40
+
41
+ @media (prefers-reduced-motion: reduce) {
42
+ .skeleton {
43
+ animation: none;
44
+ background-image: none;
45
+ }
30
46
  }
31
47
 
32
48
  // Fill parent
@@ -150,7 +166,8 @@
150
166
  height: 1em;
151
167
  width: 100%;
152
168
  background-color: var(--fui-bg-tertiary, #{$fui-bg-tertiary});
153
- animation: skeleton-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
169
+ animation: skeleton-pulse var(--fui-duration-shimmer, $fui-duration-shimmer)
170
+ cubic-bezier(0.4, 0, 0.6, 1) infinite;
154
171
  border-radius: var(--fui-radius-sm, #{$fui-radius-sm});
155
172
  }
156
173
 
@@ -1,15 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Slider",
4
- "description": "Range input control for selecting a numeric value within a defined range. Supports labels, value display, and custom step intervals.",
5
- "category": "forms",
6
- "tags": [
7
- "slider",
8
- "range",
9
- "input",
10
- "number",
11
- "control"
12
- ],
4
+ "description": "Selects a numeric value within a defined range.",
5
+ "category": "inputs",
6
+ "tags": ["slider", "range", "input", "number", "control"],
13
7
  "status": "stable",
14
8
  "sourcePath": "src/components/Slider/index.tsx",
15
9
  "exportName": "Slider",
@@ -141,63 +135,63 @@
141
135
  },
142
136
  "usage": {
143
137
  "when": [
144
- "Selecting a value from a continuous range",
145
- "Volume or brightness controls",
146
- "Price range filters",
147
- "Settings that benefit from visual feedback"
138
+ "Any value along a range, where roughly right is good enough",
139
+ "Volume, brightness, opacity",
140
+ "Price and range filters",
141
+ "The effect is visible as the user drags"
148
142
  ],
149
143
  "whenNot": [
150
- "Precise numeric input (use Input type=\"number\")",
151
- "Discrete options (use RadioGroup or Select)",
152
- "Yes/no choices (use Switch)"
144
+ "An exact number matters (use Input type=\"number\")",
145
+ "A handful of fixed choices (use RadioGroup or Select)",
146
+ "On or off (use Switch)"
153
147
  ],
154
148
  "guidelines": [
155
- "Always provide a label describing what the slider controls",
156
- "Show the current value when precision matters",
157
- "Use appropriate min/max values for the context",
158
- "Consider step size for usability"
149
+ "Label what the track controls",
150
+ "Turn on showValue whenever the number matters",
151
+ "Set min and max to the real limits, not 0-100 by habit",
152
+ "Pick a step the user can actually land on"
159
153
  ],
160
154
  "accessibility": [
161
- "Label is associated with the slider",
162
- "Keyboard accessible with arrow keys",
163
- "Current value is announced to screen readers",
164
- "Uses native slider semantics"
155
+ "Label is tied to the track",
156
+ "Arrow keys move the thumb",
157
+ "The current value is announced",
158
+ "Native slider semantics throughout"
165
159
  ]
166
160
  },
167
161
  "examples": [
168
162
  {
169
163
  "name": "Default",
170
- "description": "Basic slider with label",
164
+ "description": "0-100 with no number shown.",
171
165
  "code": "<div style={{ width: '300px' }}>\n <Slider label=\"Volume\" defaultValue={50} />\n</div>"
172
166
  },
173
167
  {
174
168
  "name": "With Value Display",
175
- "description": "Shows current value alongside the slider",
169
+ "description": "showValue prints the number opposite the label.",
176
170
  "code": "<div style={{ width: '300px' }}>\n <Slider\n label=\"Brightness\"\n defaultValue={75}\n showValue\n valueSuffix=\"%\"\n />\n</div>"
177
171
  },
178
172
  {
179
173
  "name": "Custom Range",
180
- "description": "Custom min, max, and step values",
174
+ "description": "min, max and step bound the track to real-world units.",
181
175
  "code": "<div style={{ width: '300px', display: 'flex', flexDirection: 'column', gap: '16px' }}>\n <Slider\n label=\"Temperature\"\n min={60}\n max={80}\n step={1}\n defaultValue={72}\n showValue\n valueSuffix=\"°F\"\n />\n <Slider\n label=\"Font Size\"\n min={12}\n max={32}\n step={2}\n defaultValue={16}\n showValue\n valueSuffix=\"px\"\n />\n</div>"
182
176
  },
183
177
  {
184
178
  "name": "Controlled",
185
- "description": "Controlled slider with external state",
179
+ "description": "The parent owns the value and can react to every move.",
186
180
  "code": "<ControlledSliderDemo />"
187
181
  },
188
182
  {
189
183
  "name": "Drag Value Bubble",
190
- "description": "Shows a floating value bubble while the thumb is being dragged",
184
+ "description": "The number floats above the thumb only while dragging.",
191
185
  "code": "<div style={{ width: '300px' }}>\n <Slider\n label=\"Mix\"\n defaultValue={40}\n showValueOnDrag\n valueSuffix=\"%\"\n />\n</div>"
192
186
  },
193
187
  {
194
188
  "name": "With Helper Text",
195
- "description": "Slider with helper text guidance",
189
+ "description": "A line below the track explains the trade-off.",
196
190
  "code": "<div style={{ width: '300px' }}>\n <Slider\n label=\"Quality\"\n defaultValue={80}\n showValue\n valueSuffix=\"%\"\n helperText=\"Higher quality increases file size\"\n />\n</div>"
197
191
  },
198
192
  {
199
193
  "name": "Disabled",
200
- "description": "Disabled slider",
194
+ "description": "Dimmed; the thumb will not move.",
201
195
  "code": "<div style={{ width: '300px' }}>\n <Slider\n label=\"Locked Setting\"\n defaultValue={30}\n showValue\n disabled\n />\n</div>"
202
196
  }
203
197
  ],
@@ -227,17 +221,11 @@
227
221
  "showValueOnDrag: boolean - show value bubble during drag",
228
222
  "valueSuffix: string - unit suffix"
229
223
  ],
230
- "a11yRules": [
231
- "A11Y_LABEL_REQUIRED",
232
- "A11Y_KEYBOARD_ACCESSIBLE",
233
- "A11Y_TARGET_SIZE_MIN"
234
- ]
224
+ "a11yRules": ["A11Y_LABEL_REQUIRED", "A11Y_KEYBOARD_ACCESSIBLE", "A11Y_TARGET_SIZE_MIN"]
235
225
  },
236
226
  "ai": {
237
227
  "compositionPattern": "compound",
238
- "subComponents": [
239
- "Root"
240
- ]
228
+ "subComponents": ["Root"]
241
229
  },
242
230
  "provenance": {
243
231
  "source": "migrated",
@@ -45,7 +45,7 @@
45
45
  position: relative;
46
46
  width: 100%;
47
47
  background-color: var(--fui-form-group-bg, $fui-bg-secondary);
48
- box-shadow: inset 0 0 0 1px var(--fui-form-group-border, $fui-border);
48
+ box-shadow: inset 0 0 0 var(--fui-stroke-hairline, 1px) var(--fui-form-group-border, $fui-border);
49
49
  border-radius: var(--fui-radius-full, $fui-radius-full);
50
50
  cursor: pointer;
51
51
 
@@ -58,7 +58,7 @@
58
58
  .indicator {
59
59
  position: absolute;
60
60
  height: 100%;
61
- background-color: var(--fui-field-selection-border, $fui-color-accent);
61
+ background-color: var(--fui-color-accent, $fui-color-accent);
62
62
  border-radius: var(--fui-radius-full, $fui-radius-full);
63
63
  }
64
64
 
@@ -67,7 +67,7 @@
67
67
  @include target.hit-area("compact");
68
68
 
69
69
  background-color: var(--fui-bg-primary, $fui-bg-primary);
70
- border: var(--fui-stroke-hairline, 1px) solid var(--fui-field-selection-border, $fui-color-accent);
70
+ border: var(--fui-stroke-hairline, 1px) solid var(--fui-color-accent, $fui-color-accent);
71
71
  border-radius: var(--fui-radius-full, $fui-radius-full);
72
72
  box-shadow: var(--fui-shadow-sm, $fui-shadow-sm);
73
73
  cursor: grab;
@@ -1,15 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Stack",
4
- "description": "Flexible layout component for arranging children in rows or columns with consistent spacing. Supports responsive direction and gap.",
4
+ "description": "Stacks children in a row or column with one consistent gap.",
5
5
  "category": "layout",
6
- "tags": [
7
- "stack",
8
- "layout",
9
- "flex",
10
- "spacing",
11
- "responsive"
12
- ],
6
+ "tags": ["stack", "layout", "flex", "spacing", "responsive"],
13
7
  "status": "stable",
14
8
  "sourcePath": "src/components/Stack/index.tsx",
15
9
  "exportName": "Stack",
@@ -47,24 +41,13 @@
47
41
  "type": "enum",
48
42
  "description": "Cross-axis alignment",
49
43
  "required": false,
50
- "values": [
51
- "start",
52
- "center",
53
- "end",
54
- "stretch",
55
- "baseline"
56
- ]
44
+ "values": ["start", "center", "end", "stretch", "baseline"]
57
45
  },
58
46
  "justify": {
59
47
  "type": "enum",
60
48
  "description": "Main-axis alignment",
61
49
  "required": false,
62
- "values": [
63
- "start",
64
- "center",
65
- "end",
66
- "between"
67
- ]
50
+ "values": ["start", "center", "end", "between"]
68
51
  },
69
52
  "wrap": {
70
53
  "type": "boolean",
@@ -108,22 +91,21 @@
108
91
  },
109
92
  "usage": {
110
93
  "when": [
111
- "Arranging elements in a row or column",
112
- "Creating consistent spacing between items",
113
- "Building responsive layouts",
114
- "Simple flexbox-based arrangements"
94
+ "Spacing a short row or column of elements",
95
+ "Any one-directional flexbox arrangement",
96
+ "Layouts that flip direction at a breakpoint"
115
97
  ],
116
98
  "whenNot": [
117
- "Complex grid layouts (use Grid)",
118
- "Button-specific grouping (use ButtonGroup)",
119
- "Page-level layout (use AppShell)"
99
+ "Two-dimensional layouts (use Grid)",
100
+ "Grouping buttons into one control (use ButtonGroup)",
101
+ "Page shell regions (use AppShell)"
120
102
  ],
121
103
  "guidelines": [
122
- "Use semantic elements via the \"as\" prop when appropriate",
123
- "Leverage responsive props for mobile-first layouts",
124
- "Keep spacing consistent within related sections",
125
- "Consider alignment for visual balance",
126
- "Pass DOM attributes (id, role, aria-*, data-*, event handlers) directly to Stack root when needed"
104
+ "Set gap once on the parent instead of margins on children",
105
+ "Numeric gaps (1-8) map to the same spacing scale as the tokens",
106
+ "direction, gap, and align all accept per-breakpoint objects",
107
+ "Use as=\"nav\" or as=\"ul\" so the markup stays semantic",
108
+ "separator draws dividers without extra elements"
127
109
  ],
128
110
  "accessibility": [
129
111
  "Use semantic elements (nav, section, etc.) via \"as\" prop",
@@ -134,42 +116,37 @@
134
116
  "examples": [
135
117
  {
136
118
  "name": "Vertical Stack",
137
- "description": "Default column layout",
138
- "code": "<Stack gap=\"sm\">\n <Badge>Item 1</Badge>\n <Badge>Item 2</Badge>\n <Badge>Item 3</Badge>\n</Stack>"
119
+ "description": "Children flow top to bottom — the default.",
120
+ "code": "import { Box } from '@/components/Box';\nimport { Stack } from '@/components/Stack';\n\n<Stack gap=\"sm\">\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">One</Box>\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">Two</Box>\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">Three</Box>\n</Stack>"
139
121
  },
140
122
  {
141
123
  "name": "Horizontal Stack",
142
- "description": "Row layout",
143
- "code": "<Stack direction=\"row\" gap=\"sm\">\n <Badge>Item 1</Badge>\n <Badge>Item 2</Badge>\n <Badge>Item 3</Badge>\n</Stack>"
124
+ "description": "Children flow left to right.",
125
+ "code": "import { Box } from '@/components/Box';\nimport { Stack } from '@/components/Stack';\n\n<Stack direction=\"row\" gap=\"sm\">\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">One</Box>\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">Two</Box>\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">Three</Box>\n</Stack>"
144
126
  },
145
127
  {
146
128
  "name": "Gap Sizes",
147
- "description": "Different spacing options",
148
- "code": "<Stack gap=\"lg\">\n <Stack direction=\"row\" gap=\"xs\">\n <Badge variant=\"info\">XS</Badge>\n <Badge variant=\"info\">Gap</Badge>\n </Stack>\n <Stack direction=\"row\" gap=\"sm\">\n <Badge variant=\"info\">SM</Badge>\n <Badge variant=\"info\">Gap</Badge>\n </Stack>\n <Stack direction=\"row\" gap=\"md\">\n <Badge variant=\"info\">MD</Badge>\n <Badge variant=\"info\">Gap</Badge>\n </Stack>\n <Stack direction=\"row\" gap=\"lg\">\n <Badge variant=\"info\">LG</Badge>\n <Badge variant=\"info\">Gap</Badge>\n </Stack>\n</Stack>"
149
- },
150
- {
151
- "name": "Numeric Gap",
152
- "description": "Using number values (1-8) mapped to the spacing scale",
153
- "code": "<Stack gap=\"lg\">\n <Stack direction=\"row\" gap={2}>\n <Badge variant=\"info\">Gap 2</Badge>\n <Badge variant=\"info\">Gap 2</Badge>\n </Stack>\n <Stack direction=\"row\" gap={4}>\n <Badge variant=\"info\">Gap 4</Badge>\n <Badge variant=\"info\">Gap 4</Badge>\n </Stack>\n <Stack direction=\"row\" gap={6}>\n <Badge variant=\"info\">Gap 6</Badge>\n <Badge variant=\"info\">Gap 6</Badge>\n </Stack>\n</Stack>"
129
+ "description": "One spacing token sets every gap in the stack.",
130
+ "code": "import { Box } from '@/components/Box';\nimport { Stack } from '@/components/Stack';\n\n<Stack gap=\"lg\">\n <Stack direction=\"row\" gap=\"xs\">\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">xs</Box>\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">xs</Box>\n </Stack>\n <Stack direction=\"row\" gap=\"sm\">\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">sm</Box>\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">sm</Box>\n </Stack>\n <Stack direction=\"row\" gap=\"md\">\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">md</Box>\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">md</Box>\n </Stack>\n <Stack direction=\"row\" gap=\"lg\">\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">lg</Box>\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"md\" paddingY=\"sm\">lg</Box>\n </Stack>\n</Stack>"
154
131
  },
155
132
  {
156
133
  "name": "Alignment",
157
- "description": "Cross-axis and main-axis alignment",
158
- "code": "<Stack gap=\"md\">\n <Stack direction=\"row\" gap=\"sm\" justify=\"between\" style={{ width: '200px', padding: '8px', background: 'var(--fui-bg-secondary)', borderRadius: '4px' }}>\n <Badge>Start</Badge>\n <Badge>End</Badge>\n </Stack>\n <Stack direction=\"row\" gap=\"sm\" justify=\"center\" style={{ width: '200px', padding: '8px', background: 'var(--fui-bg-secondary)', borderRadius: '4px' }}>\n <Badge>Centered</Badge>\n </Stack>\n</Stack>"
134
+ "description": "justify positions children along the main axis.",
135
+ "code": "import { Box } from '@/components/Box';\nimport { Stack } from '@/components/Stack';\n\n<Stack gap=\"md\">\n <Box width=\"240px\" border rounded=\"sm\" padding=\"sm\">\n <Stack direction=\"row\" gap=\"sm\" justify=\"between\">\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"sm\" paddingY=\"xs\">Start</Box>\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"sm\" paddingY=\"xs\">End</Box>\n </Stack>\n </Box>\n <Box width=\"240px\" border rounded=\"sm\" padding=\"sm\">\n <Stack direction=\"row\" gap=\"sm\" justify=\"center\">\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"sm\" paddingY=\"xs\">Centered</Box>\n </Stack>\n </Box>\n</Stack>"
159
136
  },
160
137
  {
161
138
  "name": "Responsive",
162
- "description": "Direction changes at breakpoints",
139
+ "description": "Swap direction and gap per breakpoint with an object value.",
163
140
  "code": "<Stack\n direction={{ base: 'column', md: 'row' }}\n gap={{ base: 'sm', md: 'lg' }}\n>\n <Button variant=\"secondary\">First</Button>\n <Button variant=\"secondary\">Second</Button>\n <Button variant=\"secondary\">Third</Button>\n</Stack>"
164
141
  },
165
142
  {
166
143
  "name": "With Separator",
167
- "description": "Default line separator between items",
168
- "code": "<Stack gap=\"md\" separator>\n <div>Section One</div>\n <div>Section Two</div>\n <div>Section Three</div>\n</Stack>"
144
+ "description": "Draws a divider between each child.",
145
+ "code": "import { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\n\n<Stack gap=\"md\" separator>\n <Text>Section one</Text>\n <Text>Section two</Text>\n <Text>Section three</Text>\n</Stack>"
169
146
  },
170
147
  {
171
148
  "name": "Semantic Element",
172
- "description": "Using nav element for navigation",
149
+ "description": "The as prop renders a real nav, section, or list element.",
173
150
  "code": "<Stack as=\"nav\" direction=\"row\" gap=\"md\">\n <Button variant=\"ghost\" size=\"sm\">Home</Button>\n <Button variant=\"ghost\" size=\"sm\">About</Button>\n <Button variant=\"ghost\" size=\"sm\">Contact</Button>\n</Stack>"
174
151
  }
175
152
  ],
@@ -201,15 +178,11 @@
201
178
  "as: string - HTML element",
202
179
  "Pass-through DOM props supported on the root (id, role, aria-*, data-*, handlers)"
203
180
  ],
204
- "a11yRules": [
205
- "A11Y_SEMANTIC_ELEMENTS"
206
- ]
181
+ "a11yRules": ["A11Y_SEMANTIC_ELEMENTS"]
207
182
  },
208
183
  "ai": {
209
184
  "compositionPattern": "compound",
210
- "subComponents": [
211
- "Root"
212
- ]
185
+ "subComponents": ["Root"]
213
186
  },
214
187
  "provenance": {
215
188
  "source": "migrated",
@@ -1,4 +1,5 @@
1
1
  @use "../../recipes/layout";
2
+ @use "../../tokens/mixins" as *;
2
3
  @use "../../tokens/variables" as *;
3
4
 
4
5
  .stack {
@@ -19,18 +20,18 @@
19
20
  .directionResponsive {
20
21
  flex-direction: var(--fui-stack-direction, column);
21
22
 
22
- @media (min-width: 640px) {
23
+ @include breakpoint-sm {
23
24
  flex-direction: var(--fui-stack-direction-sm, var(--fui-stack-direction, column));
24
25
  }
25
26
 
26
- @media (min-width: 768px) {
27
+ @include breakpoint-md {
27
28
  flex-direction: var(
28
29
  --fui-stack-direction-md,
29
30
  var(--fui-stack-direction-sm, var(--fui-stack-direction, column))
30
31
  );
31
32
  }
32
33
 
33
- @media (min-width: 1024px) {
34
+ @include breakpoint-lg {
34
35
  flex-direction: var(
35
36
  --fui-stack-direction-lg,
36
37
  var(
@@ -40,7 +41,7 @@
40
41
  );
41
42
  }
42
43
 
43
- @media (min-width: 1280px) {
44
+ @include breakpoint-xl {
44
45
  flex-direction: var(
45
46
  --fui-stack-direction-xl,
46
47
  var(
@@ -58,22 +59,22 @@
58
59
  .gapResponsive {
59
60
  gap: var(--fui-stack-gap, #{layout.gap("none")});
60
61
 
61
- @media (min-width: 640px) {
62
+ @include breakpoint-sm {
62
63
  gap: var(--fui-stack-gap-sm, var(--fui-stack-gap, 0));
63
64
  }
64
65
 
65
- @media (min-width: 768px) {
66
+ @include breakpoint-md {
66
67
  gap: var(--fui-stack-gap-md, var(--fui-stack-gap-sm, var(--fui-stack-gap, 0)));
67
68
  }
68
69
 
69
- @media (min-width: 1024px) {
70
+ @include breakpoint-lg {
70
71
  gap: var(
71
72
  --fui-stack-gap-lg,
72
73
  var(--fui-stack-gap-md, var(--fui-stack-gap-sm, var(--fui-stack-gap, 0)))
73
74
  );
74
75
  }
75
76
 
76
- @media (min-width: 1280px) {
77
+ @include breakpoint-xl {
77
78
  gap: var(
78
79
  --fui-stack-gap-xl,
79
80
  var(
@@ -154,7 +155,7 @@
154
155
  height: var(--fui-stroke-hairline, 1px);
155
156
  }
156
157
 
157
- @media (min-width: 640px) {
158
+ @include breakpoint-sm {
158
159
  .directionResponsive[data-direction-sm="row"] > .separator {
159
160
  width: var(--fui-stroke-hairline, 1px);
160
161
  height: auto;
@@ -167,7 +168,7 @@
167
168
  }
168
169
  }
169
170
 
170
- @media (min-width: 768px) {
171
+ @include breakpoint-md {
171
172
  .directionResponsive[data-direction-md="row"] > .separator {
172
173
  width: var(--fui-stroke-hairline, 1px);
173
174
  height: auto;
@@ -180,7 +181,7 @@
180
181
  }
181
182
  }
182
183
 
183
- @media (min-width: 1024px) {
184
+ @include breakpoint-lg {
184
185
  .directionResponsive[data-direction-lg="row"] > .separator {
185
186
  width: var(--fui-stroke-hairline, 1px);
186
187
  height: auto;
@@ -193,7 +194,7 @@
193
194
  }
194
195
  }
195
196
 
196
- @media (min-width: 1280px) {
197
+ @include breakpoint-xl {
197
198
  .directionResponsive[data-direction-xl="row"] > .separator {
198
199
  width: var(--fui-stroke-hairline, 1px);
199
200
  height: auto;