@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,14 @@
1
- 'use client';
1
+ "use client";
2
2
 
3
- import * as React from 'react';
4
- import { Button as BaseButton } from '@base-ui/react/button';
5
- import styles from './Alert.module.scss';
3
+ import * as React from "react";
4
+ import { Button as BaseButton } from "@base-ui/react/button";
5
+ import styles from "./Alert.module.scss";
6
6
 
7
7
  // ============================================
8
8
  // Types
9
9
  // ============================================
10
10
 
11
- export type AlertSeverity = 'info' | 'success' | 'warning' | 'error';
11
+ export type AlertSeverity = "info" | "success" | "warning" | "error";
12
12
 
13
13
  /**
14
14
  * Alert for contextual feedback messages (info, success, warning, error).
@@ -20,6 +20,12 @@ export interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {
20
20
  * @default "info"
21
21
  * @see https://usefragments.com/components/alert#variants */
22
22
  severity?: AlertSeverity;
23
+ /** How much surface the severity claims. `tint` washes the whole card in the
24
+ * severity colour. `surface` keeps the card on the page's own background and
25
+ * spends the colour only on the hairline and the title — for a standing
26
+ * failure that owns the view, where a full wash would read as a red page.
27
+ * @default "tint" */
28
+ emphasis?: "tint" | "surface";
23
29
  }
24
30
 
25
31
  export interface AlertIconProps extends React.HTMLAttributes<HTMLSpanElement> {
@@ -38,12 +44,18 @@ export interface AlertActionsProps extends React.HTMLAttributes<HTMLDivElement>
38
44
  children: React.ReactNode;
39
45
  }
40
46
 
41
- export interface AlertActionProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {
47
+ export interface AlertActionProps extends Omit<
48
+ React.ButtonHTMLAttributes<HTMLButtonElement>,
49
+ "onClick"
50
+ > {
42
51
  children: React.ReactNode;
43
52
  onClick?: React.MouseEventHandler<HTMLButtonElement>;
44
53
  }
45
54
 
46
- export interface AlertCloseProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
55
+ export interface AlertCloseProps extends Omit<
56
+ React.ButtonHTMLAttributes<HTMLButtonElement>,
57
+ "children"
58
+ > {
47
59
  children?: React.ReactNode;
48
60
  }
49
61
 
@@ -67,7 +79,7 @@ const AlertContext = React.createContext<AlertContextValue | null>(null);
67
79
  function useAlertContext() {
68
80
  const context = React.useContext(AlertContext);
69
81
  if (!context) {
70
- throw new Error('Alert compound components must be used within an Alert');
82
+ throw new Error("Alert compound components must be used within an Alert");
71
83
  }
72
84
  return context;
73
85
  }
@@ -88,10 +100,10 @@ function composeEventHandlers<E extends { defaultPrevented: boolean }>(
88
100
  // ============================================
89
101
 
90
102
  const severityIcons: Record<AlertSeverity, string> = {
91
- info: 'i',
92
- success: '\u2713',
93
- warning: '!',
94
- error: '\u2717',
103
+ info: "i",
104
+ success: "\u2713",
105
+ warning: "!",
106
+ error: "\u2717",
95
107
  };
96
108
 
97
109
  // ============================================
@@ -100,7 +112,8 @@ const severityIcons: Record<AlertSeverity, string> = {
100
112
 
101
113
  function AlertRoot({
102
114
  children,
103
- severity = 'info',
115
+ severity = "info",
116
+ emphasis = "tint",
104
117
  className,
105
118
  ...htmlProps
106
119
  }: AlertProps) {
@@ -114,10 +127,15 @@ function AlertRoot({
114
127
 
115
128
  if (dismissed) return null;
116
129
 
117
- const classes = [styles.alert, styles[severity], className]
130
+ const classes = [
131
+ styles.alert,
132
+ styles[severity],
133
+ emphasis === "surface" ? styles.surface : null,
134
+ className,
135
+ ]
118
136
  .filter(Boolean)
119
- .join(' ');
120
- const role = severity === 'warning' || severity === 'error' ? 'alert' : 'status';
137
+ .join(" ");
138
+ const role = severity === "warning" || severity === "error" ? "alert" : "status";
121
139
 
122
140
  const contextValue: AlertContextValue = {
123
141
  severity,
@@ -143,7 +161,7 @@ function AlertRoot({
143
161
 
144
162
  function AlertIcon({ children, className, ...htmlProps }: AlertIconProps) {
145
163
  const { severity } = useAlertContext();
146
- const classes = [styles.icon, className].filter(Boolean).join(' ');
164
+ const classes = [styles.icon, className].filter(Boolean).join(" ");
147
165
 
148
166
  return (
149
167
  <span {...htmlProps} className={classes} aria-hidden="true">
@@ -153,13 +171,17 @@ function AlertIcon({ children, className, ...htmlProps }: AlertIconProps) {
153
171
  }
154
172
 
155
173
  function AlertBody({ children, className, ...htmlProps }: AlertBodyProps) {
156
- const classes = [styles.body, className].filter(Boolean).join(' ');
157
- return <div {...htmlProps} className={classes}>{children}</div>;
174
+ const classes = [styles.body, className].filter(Boolean).join(" ");
175
+ return (
176
+ <div {...htmlProps} className={classes}>
177
+ {children}
178
+ </div>
179
+ );
158
180
  }
159
181
 
160
182
  function AlertTitle({ children, className, ...htmlProps }: AlertTitleProps) {
161
183
  const { titleId } = useAlertContext();
162
- const classes = [styles.title, className].filter(Boolean).join(' ');
184
+ const classes = [styles.title, className].filter(Boolean).join(" ");
163
185
  return (
164
186
  <div {...htmlProps} id={htmlProps.id ?? titleId} className={classes}>
165
187
  {children}
@@ -169,7 +191,7 @@ function AlertTitle({ children, className, ...htmlProps }: AlertTitleProps) {
169
191
 
170
192
  function AlertContent({ children, className, ...htmlProps }: AlertContentProps) {
171
193
  const { descId } = useAlertContext();
172
- const classes = [styles.content, className].filter(Boolean).join(' ');
194
+ const classes = [styles.content, className].filter(Boolean).join(" ");
173
195
  return (
174
196
  <div {...htmlProps} id={htmlProps.id ?? descId} className={classes}>
175
197
  {children}
@@ -178,18 +200,22 @@ function AlertContent({ children, className, ...htmlProps }: AlertContentProps)
178
200
  }
179
201
 
180
202
  function AlertActions({ children, className, ...htmlProps }: AlertActionsProps) {
181
- const classes = [styles.actions, className].filter(Boolean).join(' ');
182
- return <div {...htmlProps} className={classes}>{children}</div>;
203
+ const classes = [styles.actions, className].filter(Boolean).join(" ");
204
+ return (
205
+ <div {...htmlProps} className={classes}>
206
+ {children}
207
+ </div>
208
+ );
183
209
  }
184
210
 
185
211
  function AlertAction({
186
212
  children,
187
213
  onClick,
188
- type = 'button',
214
+ type = "button",
189
215
  className,
190
216
  ...htmlProps
191
217
  }: AlertActionProps) {
192
- const classes = [styles.action, className].filter(Boolean).join(' ');
218
+ const classes = [styles.action, className].filter(Boolean).join(" ");
193
219
  return (
194
220
  <BaseButton {...htmlProps} onClick={onClick} type={type} className={classes}>
195
221
  {children}
@@ -201,12 +227,12 @@ function AlertClose({
201
227
  children,
202
228
  className,
203
229
  onClick,
204
- type = 'button',
205
- 'aria-label': ariaLabel = 'Dismiss alert',
230
+ type = "button",
231
+ "aria-label": ariaLabel = "Dismiss alert",
206
232
  ...htmlProps
207
233
  }: AlertCloseProps) {
208
234
  const { dismiss } = useAlertContext();
209
- const classes = [styles.close, className].filter(Boolean).join(' ');
235
+ const classes = [styles.close, className].filter(Boolean).join(" ");
210
236
 
211
237
  return (
212
238
  <BaseButton
@@ -216,7 +242,7 @@ function AlertClose({
216
242
  aria-label={ariaLabel}
217
243
  className={classes}
218
244
  >
219
- {children ?? '\u00D7'}
245
+ {children ?? "\u00D7"}
220
246
  </BaseButton>
221
247
  );
222
248
  }
@@ -1,15 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "AppShell",
4
- "description": "Full layout wrapper integrating sidebar, header, main content, and optional aside panel. Two structural layouts (default, sidebar) combine with per-slot variant=\"floating\" for full flexibility.",
4
+ "description": "Lays out header, sidebar, main, and optional aside as one responsive app frame.",
5
5
  "category": "layout",
6
- "tags": [
7
- "layout",
8
- "shell",
9
- "scaffold",
10
- "dashboard",
11
- "app-layout"
12
- ],
6
+ "tags": ["layout", "shell", "scaffold", "dashboard", "app-layout"],
13
7
  "status": "stable",
14
8
  "sourcePath": "src/components/AppShell/index.tsx",
15
9
  "exportName": "AppShell",
@@ -30,12 +24,7 @@
30
24
  "description": "Structural layout for CSS grid areas",
31
25
  "default": "default",
32
26
  "required": false,
33
- "values": [
34
- "default",
35
- "sidebar",
36
- "sidebar-floating",
37
- "floating"
38
- ]
27
+ "values": ["default", "sidebar", "sidebar-floating", "floating"]
39
28
  },
40
29
  "bg": {
41
30
  "type": "string",
@@ -50,26 +39,25 @@
50
39
  },
51
40
  "usage": {
52
41
  "when": [
53
- "Building dashboard-style applications",
42
+ "Dashboards and internal tools",
54
43
  "Apps with persistent sidebar navigation",
55
- "Layouts requiring header, sidebar, and main content areas",
56
- "Responsive layouts that need mobile drawer behavior"
44
+ "Layouts needing header, sidebar, and main together",
45
+ "Navigation that must collapse to a drawer on mobile"
57
46
  ],
58
47
  "whenNot": [
59
- "Simple marketing pages (use standard layout)",
60
- "Content-first sites without navigation (use simpler layout)",
61
- "Single-page apps with minimal UI (use minimal layout)"
48
+ "Marketing and landing pages",
49
+ "Content-first sites with no app navigation",
50
+ "Single-screen tools with no chrome"
62
51
  ],
63
52
  "guidelines": [
64
- "Use layout=\"default\" when header should span full width (logo in header)",
65
- "Use layout=\"sidebar\" when sidebar should be full height (logo in sidebar)",
66
- "Add variant=\"floating\" to individual slots for rounded, elevated appearance",
67
- "Use bg prop on any slot to override its background color",
68
- "Combine layout with per-slot variants freely no enum explosion",
69
- "AppShell automatically wraps with SidebarProvider",
70
- "Use AppShell.Sidebar to configure sidebar width and collapse behavior",
71
- "Main content responds to sidebar collapsed state",
72
- "Aside panel is hidden on mobile automatically"
53
+ "layout=\"default\" puts the logo in a full-width header",
54
+ "layout=\"sidebar\" puts the logo in a full-height sidebar",
55
+ "variant=\"floating\" is per slot mix it with any layout",
56
+ "bg overrides one slot's background without touching the rest",
57
+ "AppShell supplies SidebarProvider; do not add your own",
58
+ "Set width and collapse behaviour on AppShell.Sidebar",
59
+ "Main reflows automatically when the sidebar collapses",
60
+ "Aside hides itself on mobile"
73
61
  ],
74
62
  "accessibility": [
75
63
  "Main content area has id=\"main-content\" for skip links",
@@ -81,43 +69,43 @@
81
69
  "examples": [
82
70
  {
83
71
  "name": "Default Layout",
84
- "description": "Header spans full width above sidebar (default). Best when brand/logo should be prominent in header.",
85
- "code": "import { ChartBar, Gear, House } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box minHeight=\"100vh\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"default\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Brand>MyApp</Header.Brand>\n <Header.Nav>\n <Header.NavItem active>Dashboard</Header.NavItem>\n <Header.NavItem>Settings</Header.NavItem>\n </Header.Nav>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"200px\" collapsible=\"offcanvas\">\n <Sidebar.Nav>\n <Sidebar.Section label=\"Menu\">\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={Gear} size=\"md\" />}>Settings</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Default Layout</Text>\n <Text as=\"p\" color=\"secondary\">\n Header spans full width. Logo is in the header.\n </Text>\n </Stack>\n </AppShell.Main>\n </AppShell>\n</Box>"
72
+ "description": "Header spans the full width above the sidebar.",
73
+ "code": "import { ChartBar, Gear, House } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box height=\"360px\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"default\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Brand>MyApp</Header.Brand>\n <Header.Nav>\n <Header.NavItem active>Dashboard</Header.NavItem>\n <Header.NavItem>Settings</Header.NavItem>\n </Header.Nav>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"200px\" collapsible=\"offcanvas\">\n <Sidebar.Nav>\n <Sidebar.Section label=\"Menu\">\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={Gear} size=\"md\" />}>Settings</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Default Layout</Text>\n <Text as=\"p\" color=\"secondary\">\n Header spans full width. Logo is in the header.\n </Text>\n </Stack>\n </AppShell.Main>\n </AppShell>\n</Box>"
86
74
  },
87
75
  {
88
76
  "name": "Sidebar Layout",
89
- "description": "Sidebar is full height, header sits next to it. Best for documentation sites or when sidebar branding is preferred.",
90
- "code": "import { ChartBar, Gear, House, MagnifyingGlass } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box minHeight=\"100vh\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"sidebar\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Search>\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"sm\" paddingY=\"xs\">\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n <Icon icon={MagnifyingGlass} size=\"sm\" variant=\"tertiary\" />\n <Text size=\"sm\" color=\"tertiary\">Search...</Text>\n </Stack>\n </Box>\n </Header.Search>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"200px\" collapsible=\"offcanvas\">\n <Sidebar.Header>\n <Text weight=\"semibold\">MyApp</Text>\n </Sidebar.Header>\n <Sidebar.Nav>\n <Sidebar.Section label=\"Menu\">\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={Gear} size=\"md\" />}>Settings</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n <Sidebar.Footer>v1.0.0</Sidebar.Footer>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Sidebar Layout</Text>\n <Text as=\"p\" color=\"secondary\">\n Sidebar is full height. Logo is in the sidebar header.\n </Text>\n </Stack>\n </AppShell.Main>\n </AppShell>\n</Box>"
77
+ "description": "Sidebar runs full height with the header beside it.",
78
+ "code": "import { ChartBar, Gear, House, MagnifyingGlass } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box height=\"360px\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"sidebar\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Search>\n <Box background=\"secondary\" rounded=\"sm\" paddingX=\"sm\" paddingY=\"xs\">\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n <Icon icon={MagnifyingGlass} size=\"sm\" variant=\"tertiary\" />\n <Text size=\"sm\" color=\"tertiary\">Search...</Text>\n </Stack>\n </Box>\n </Header.Search>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"200px\" collapsible=\"offcanvas\">\n <Sidebar.Header>\n <Text weight=\"semibold\">MyApp</Text>\n </Sidebar.Header>\n <Sidebar.Nav>\n <Sidebar.Section label=\"Menu\">\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={Gear} size=\"md\" />}>Settings</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n <Sidebar.Footer>v1.0.0</Sidebar.Footer>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Sidebar Layout</Text>\n <Text as=\"p\" color=\"secondary\">\n Sidebar is full height. Logo is in the sidebar header.\n </Text>\n </Stack>\n </AppShell.Main>\n </AppShell>\n</Box>"
91
79
  },
92
80
  {
93
81
  "name": "With Aside Panel",
94
- "description": "App shell with optional right panel for additional context or actions.",
95
- "code": "import { ChartBar, House } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box minHeight=\"100vh\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"default\">\n <AppShell.Header>\n <Header>\n <Header.Brand>App</Header.Brand>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"180px\" collapsible=\"offcanvas\">\n <Sidebar.Nav>\n <Sidebar.Section>\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Stats</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Main Content</Text>\n <Text as=\"p\">Content with aside panel on the right.</Text>\n </Stack>\n </AppShell.Main>\n\n <AppShell.Aside width=\"180px\">\n <Box padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h3\" size=\"sm\" weight=\"semibold\">Aside Panel</Text>\n <Text as=\"p\" size=\"sm\" color=\"secondary\">\n Additional context, filters, or quick actions.\n </Text>\n </Stack>\n </Box>\n </AppShell.Aside>\n </AppShell>\n</Box>"
82
+ "description": "Adds a right rail for context, filters, or actions.",
83
+ "code": "import { ChartBar, House } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box height=\"360px\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"default\">\n <AppShell.Header>\n <Header>\n <Header.Brand>App</Header.Brand>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"180px\" collapsible=\"offcanvas\">\n <Sidebar.Nav>\n <Sidebar.Section>\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Stats</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Main Content</Text>\n <Text as=\"p\">Content with aside panel on the right.</Text>\n </Stack>\n </AppShell.Main>\n\n <AppShell.Aside width=\"180px\">\n <Box padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h3\" size=\"sm\" weight=\"semibold\">Aside Panel</Text>\n <Text as=\"p\" size=\"sm\" color=\"secondary\">\n Additional context, filters, or quick actions.\n </Text>\n </Stack>\n </Box>\n </AppShell.Aside>\n </AppShell>\n</Box>"
96
84
  },
97
85
  {
98
86
  "name": "Collapsible Icon Sidebar",
99
- "description": "Sidebar that collapses to icons only on desktop.",
100
- "code": "import { ChartBar, Gear, House } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box minHeight=\"100vh\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"sidebar\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar collapsible=\"icon\" width=\"200px\" collapsedWidth=\"56px\">\n <Sidebar.Header>\n <Text weight=\"semibold\">App</Text>\n </Sidebar.Header>\n <Sidebar.Nav>\n <Sidebar.Section>\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={Gear} size=\"md\" />}>Settings</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n <Sidebar.Footer>\n <Sidebar.CollapseToggle />\n </Sidebar.Footer>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\">\n <Text as=\"p\">\n Click the collapse button in the sidebar footer to toggle between expanded and icon-only modes.\n </Text>\n </AppShell.Main>\n </AppShell>\n</Box>"
87
+ "description": "Sidebar shrinks to icons on desktop via the footer toggle.",
88
+ "code": "import { ChartBar, Gear, House } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box height=\"360px\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"sidebar\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar collapsible=\"icon\" width=\"200px\" collapsedWidth=\"56px\">\n <Sidebar.Header>\n <Text weight=\"semibold\">App</Text>\n </Sidebar.Header>\n <Sidebar.Nav>\n <Sidebar.Section>\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={Gear} size=\"md\" />}>Settings</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n <Sidebar.Footer>\n <Sidebar.CollapseToggle />\n </Sidebar.Footer>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\">\n <Text as=\"p\">\n Click the collapse button in the sidebar footer to toggle between expanded and icon-only modes.\n </Text>\n </AppShell.Main>\n </AppShell>\n</Box>"
101
89
  },
102
90
  {
103
91
  "name": "Floating Main",
104
- "description": "Sidebar layout with floating main content. Per-slot variant=\"floating\" gives the main area rounded corners and a distinct background, while the sidebar blends with the shell.",
105
- "code": "import { ChartBar, Gear, House, MagnifyingGlass } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box minHeight=\"100vh\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"sidebar\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Search>\n <Box background=\"primary\" border rounded=\"sm\" paddingX=\"sm\" paddingY=\"xs\">\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n <Icon icon={MagnifyingGlass} size=\"sm\" variant=\"tertiary\" />\n <Text size=\"sm\" color=\"tertiary\">Search...</Text>\n </Stack>\n </Box>\n </Header.Search>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"200px\" collapsible=\"offcanvas\" variant=\"floating\">\n <Sidebar.Header>\n <Text weight=\"semibold\">MyApp</Text>\n </Sidebar.Header>\n <Sidebar.Nav>\n <Sidebar.Section label=\"Menu\">\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={Gear} size=\"md\" />}>Settings</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n <Sidebar.Footer>v1.0.0</Sidebar.Footer>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\" variant=\"floating\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Floating Main</Text>\n <Text as=\"p\" color=\"secondary\">\n Main content has rounded corners and visual separation from the sidebar.\n </Text>\n </Stack>\n </AppShell.Main>\n </AppShell>\n</Box>"
92
+ "description": "Only the main slot floats rounded, raised, on its own background.",
93
+ "code": "import { ChartBar, Gear, House, MagnifyingGlass } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box height=\"360px\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"sidebar\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Search>\n <Box background=\"primary\" border rounded=\"sm\" paddingX=\"sm\" paddingY=\"xs\">\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n <Icon icon={MagnifyingGlass} size=\"sm\" variant=\"tertiary\" />\n <Text size=\"sm\" color=\"tertiary\">Search...</Text>\n </Stack>\n </Box>\n </Header.Search>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"200px\" collapsible=\"offcanvas\" variant=\"floating\">\n <Sidebar.Header>\n <Text weight=\"semibold\">MyApp</Text>\n </Sidebar.Header>\n <Sidebar.Nav>\n <Sidebar.Section label=\"Menu\">\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={Gear} size=\"md\" />}>Settings</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n <Sidebar.Footer>v1.0.0</Sidebar.Footer>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\" variant=\"floating\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Floating Main</Text>\n <Text as=\"p\" color=\"secondary\">\n Main content has rounded corners and visual separation from the sidebar.\n </Text>\n </Stack>\n </AppShell.Main>\n </AppShell>\n</Box>"
106
94
  },
107
95
  {
108
96
  "name": "Floating Main & Aside",
109
- "description": "Both main content and aside panel float with rounded corners. Each slot independently opts into the floating visual treatment via variant=\"floating\".",
110
- "code": "import { ChartBar, Gear, House, MagnifyingGlass } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box minHeight=\"100vh\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"sidebar\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Search>\n <Box background=\"primary\" border rounded=\"sm\" paddingX=\"sm\" paddingY=\"xs\">\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n <Icon icon={MagnifyingGlass} size=\"sm\" variant=\"tertiary\" />\n <Text size=\"sm\" color=\"tertiary\">Search...</Text>\n </Stack>\n </Box>\n </Header.Search>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"200px\" collapsible=\"offcanvas\" variant=\"floating\">\n <Sidebar.Header>\n <Text weight=\"semibold\">MyApp</Text>\n </Sidebar.Header>\n <Sidebar.Nav>\n <Sidebar.Section label=\"Menu\">\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={Gear} size=\"md\" />}>Settings</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n <Sidebar.Footer>v1.0.0</Sidebar.Footer>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\" variant=\"floating\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Floating Main & Aside</Text>\n <Text as=\"p\" color=\"secondary\">\n Both main content and aside panel float with rounded corners.\n </Text>\n </Stack>\n </AppShell.Main>\n\n <AppShell.Aside width=\"200px\" variant=\"floating\">\n <Box padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h3\" size=\"sm\" weight=\"semibold\">Aside Panel</Text>\n <Text as=\"p\" size=\"sm\" color=\"secondary\">\n This aside also floats, matching the main content area.\n </Text>\n </Stack>\n </Box>\n </AppShell.Aside>\n </AppShell>\n</Box>"
97
+ "description": "Two slots float independently; the sidebar stays flush.",
98
+ "code": "import { ChartBar, Gear, House, MagnifyingGlass } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box height=\"360px\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"sidebar\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Search>\n <Box background=\"primary\" border rounded=\"sm\" paddingX=\"sm\" paddingY=\"xs\">\n <Stack direction=\"row\" align=\"center\" gap=\"sm\">\n <Icon icon={MagnifyingGlass} size=\"sm\" variant=\"tertiary\" />\n <Text size=\"sm\" color=\"tertiary\">Search...</Text>\n </Stack>\n </Box>\n </Header.Search>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"200px\" collapsible=\"offcanvas\" variant=\"floating\">\n <Sidebar.Header>\n <Text weight=\"semibold\">MyApp</Text>\n </Sidebar.Header>\n <Sidebar.Nav>\n <Sidebar.Section label=\"Menu\">\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={Gear} size=\"md\" />}>Settings</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n <Sidebar.Footer>v1.0.0</Sidebar.Footer>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\" variant=\"floating\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Floating Main & Aside</Text>\n <Text as=\"p\" color=\"secondary\">\n Both main content and aside panel float with rounded corners.\n </Text>\n </Stack>\n </AppShell.Main>\n\n <AppShell.Aside width=\"200px\" variant=\"floating\">\n <Box padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h3\" size=\"sm\" weight=\"semibold\">Aside Panel</Text>\n <Text as=\"p\" size=\"sm\" color=\"secondary\">\n This aside also floats, matching the main content area.\n </Text>\n </Stack>\n </Box>\n </AppShell.Aside>\n </AppShell>\n</Box>"
111
99
  },
112
100
  {
113
101
  "name": "Floating Default Layout",
114
- "description": "Default header-on-top structure with a floating main content area. Demonstrates that floating is independent of structure — any slot can float in any layout.",
115
- "code": "import { ChartBar, House } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box minHeight=\"100vh\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"default\">\n <AppShell.Header>\n <Header>\n <Header.Brand>MyApp</Header.Brand>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"180px\" collapsible=\"offcanvas\" variant=\"floating\">\n <Sidebar.Nav>\n <Sidebar.Section>\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Stats</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\" variant=\"floating\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Floating Default Layout</Text>\n <Text as=\"p\" color=\"secondary\">\n Default structure (header on top) with floating main content. Any slot can float in any layout.\n </Text>\n </Stack>\n </AppShell.Main>\n </AppShell>\n</Box>"
102
+ "description": "Floating works under any layout, including header-on-top.",
103
+ "code": "import { ChartBar, House } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box height=\"360px\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"default\">\n <AppShell.Header>\n <Header>\n <Header.Brand>MyApp</Header.Brand>\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"180px\" collapsible=\"offcanvas\" variant=\"floating\">\n <Sidebar.Nav>\n <Sidebar.Section>\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Stats</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\" variant=\"floating\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Floating Default Layout</Text>\n <Text as=\"p\" color=\"secondary\">\n Default structure (header on top) with floating main content. Any slot can float in any layout.\n </Text>\n </Stack>\n </AppShell.Main>\n </AppShell>\n</Box>"
116
104
  },
117
105
  {
118
106
  "name": "Custom Backgrounds",
119
- "description": "Each slot accepts a bg prop to override its background color independently. Here the sidebar and aside use bg-elevated (lighter) while main uses bg-primary (darker).",
120
- "code": "import { ChartBar, House } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box minHeight=\"100vh\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"sidebar\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"200px\" collapsible=\"offcanvas\" bg=\"var(--fui-bg-elevated)\">\n <Sidebar.Header>\n <Text weight=\"semibold\">MyApp</Text>\n </Sidebar.Header>\n <Sidebar.Nav>\n <Sidebar.Section label=\"Menu\">\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\" bg=\"var(--fui-bg-primary)\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Custom Backgrounds</Text>\n <Text as=\"p\" color=\"secondary\">\n Sidebar uses bg-elevated (lighter), main uses bg-primary (darker). Any CSS color or token works.\n </Text>\n </Stack>\n </AppShell.Main>\n\n <AppShell.Aside width=\"200px\" bg=\"var(--fui-bg-elevated)\">\n <Box padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h3\" size=\"sm\" weight=\"semibold\">Aside Panel</Text>\n <Text as=\"p\" size=\"sm\" color=\"secondary\">\n Aside with bg-elevated background matching the sidebar.\n </Text>\n </Stack>\n </Box>\n </AppShell.Aside>\n </AppShell>\n</Box>"
107
+ "description": "Each slot takes its own bg, so regions read apart.",
108
+ "code": "import { ChartBar, House } from '@phosphor-icons/react';\nimport { AppShell } from '@/components/AppShell';\nimport { Box } from '@/components/Box';\nimport { Header } from '@/components/Header';\nimport { Icon } from '@/components/Icon';\nimport { Sidebar } from '@/components/Sidebar';\nimport { Stack } from '@/components/Stack';\nimport { Text } from '@/components/Text';\nimport { ThemeToggle } from '@/components/Theme';\n\n<Box height=\"360px\" overflow=\"hidden\" border rounded=\"md\">\n <AppShell layout=\"sidebar\">\n <AppShell.Header>\n <Header>\n <Header.Trigger />\n <Header.Spacer />\n <Header.Actions>\n <ThemeToggle size=\"sm\" />\n </Header.Actions>\n </Header>\n </AppShell.Header>\n\n <AppShell.Sidebar width=\"200px\" collapsible=\"offcanvas\" bg=\"var(--fui-bg-elevated)\">\n <Sidebar.Header>\n <Text weight=\"semibold\">MyApp</Text>\n </Sidebar.Header>\n <Sidebar.Nav>\n <Sidebar.Section label=\"Menu\">\n <Sidebar.Item icon={<Icon icon={House} size=\"md\" />} active>Home</Sidebar.Item>\n <Sidebar.Item icon={<Icon icon={ChartBar} size=\"md\" />}>Analytics</Sidebar.Item>\n </Sidebar.Section>\n </Sidebar.Nav>\n </AppShell.Sidebar>\n\n <AppShell.Main padding=\"md\" bg=\"var(--fui-bg-primary)\">\n <Stack gap=\"xs\">\n <Text as=\"h2\" size=\"xl\" weight=\"semibold\">Custom Backgrounds</Text>\n <Text as=\"p\" color=\"secondary\">\n Sidebar uses bg-elevated (lighter), main uses bg-primary (darker). Any CSS color or token works.\n </Text>\n </Stack>\n </AppShell.Main>\n\n <AppShell.Aside width=\"200px\" bg=\"var(--fui-bg-elevated)\">\n <Box padding=\"md\">\n <Stack gap=\"xs\">\n <Text as=\"h3\" size=\"sm\" weight=\"semibold\">Aside Panel</Text>\n <Text as=\"p\" size=\"sm\" color=\"secondary\">\n Aside with bg-elevated background matching the sidebar.\n </Text>\n </Stack>\n </Box>\n </AppShell.Aside>\n </AppShell>\n</Box>"
121
109
  }
122
110
  ],
123
111
  "relations": [
@@ -139,12 +127,7 @@
139
127
  ],
140
128
  "ai": {
141
129
  "compositionPattern": "compound",
142
- "subComponents": [
143
- "Header",
144
- "Sidebar",
145
- "Main",
146
- "Aside"
147
- ]
130
+ "subComponents": ["Header", "Sidebar", "Main", "Aside"]
148
131
  },
149
132
  "provenance": {
150
133
  "source": "migrated",
@@ -32,8 +32,13 @@
32
32
  var(--appshell-header-height, var(--fui-appshell-header-height, $fui-appshell-header-height))
33
33
  1fr;
34
34
 
35
- // Smooth transition for sidebar collapse/expand
36
- transition: grid-template-columns var(--fui-transition-normal, $fui-transition-normal) ease;
35
+ // Smooth transition for sidebar collapse/expand.
36
+ // The token already carries its own easing curve — do not append another.
37
+ transition: grid-template-columns var(--fui-transition-normal, $fui-transition-normal);
38
+
39
+ @media (prefers-reduced-motion: reduce) {
40
+ transition: none;
41
+ }
37
42
 
38
43
  // Mobile: single column layout
39
44
  @include below-md {
@@ -80,10 +85,11 @@
80
85
  var(--fui-appshell-header-height, $fui-appshell-header-height)
81
86
  );
82
87
  z-index: var(--fui-header-z-index, $fui-header-z-index);
83
- background-color: inherit;
88
+ // Match the reading pane (`--fui-app-main-bg`), not the rail.
89
+ background-color: var(--fui-app-main-bg, var(--fui-main-bg, #{$fui-main-bg}));
84
90
 
85
91
  > header {
86
- background-color: inherit;
92
+ background-color: var(--fui-app-main-bg, var(--fui-main-bg, #{$fui-main-bg}));
87
93
  }
88
94
  }
89
95
 
@@ -93,29 +99,42 @@
93
99
 
94
100
  .sidebar {
95
101
  grid-area: sidebar;
96
- position: sticky;
97
- top: var(
98
- --appshell-header-height,
99
- var(--fui-appshell-header-height, $fui-appshell-header-height)
100
- );
101
- height: calc(
102
- 100vh - var(
103
- --appshell-header-height,
104
- var(--fui-appshell-header-height, $fui-appshell-header-height)
105
- )
106
- );
107
- height: calc(
108
- 100dvh - var(
109
- --appshell-header-height,
110
- var(--fui-appshell-header-height, $fui-appshell-header-height)
111
- )
112
- );
102
+ align-self: stretch;
103
+ position: relative;
104
+ height: auto;
105
+ min-height: 100%;
113
106
  z-index: 30;
114
- overflow: hidden;
107
+ overflow: visible;
115
108
  background-color: inherit;
109
+ // Border lives on the grid column so the rail runs the full content
110
+ // height; the sticky inner sidebar is viewport-tall for nav scrolling.
111
+ border-inline-end: var(--fui-stroke-hairline, 1px) solid
112
+ var(
113
+ --fui-sidebar-border,
114
+ var(--fui-border-subtle, var(--fui-border-default, #{$fui-border-default}))
115
+ );
116
116
 
117
117
  > aside {
118
+ position: sticky;
119
+ top: var(
120
+ --appshell-header-height,
121
+ var(--fui-appshell-header-height, $fui-appshell-header-height)
122
+ );
123
+ height: calc(
124
+ 100vh - var(
125
+ --appshell-header-height,
126
+ var(--fui-appshell-header-height, $fui-appshell-header-height)
127
+ )
128
+ );
129
+ height: calc(
130
+ 100dvh - var(
131
+ --appshell-header-height,
132
+ var(--fui-appshell-header-height, $fui-appshell-header-height)
133
+ )
134
+ );
135
+ overflow: hidden;
118
136
  background-color: inherit;
137
+ border-inline-end: 0;
119
138
  }
120
139
 
121
140
  // On mobile, sidebar becomes a fixed overlay
@@ -128,33 +147,27 @@
128
147
  height: 100vh;
129
148
  height: 100dvh;
130
149
  z-index: 51;
150
+ border-inline-end: 0;
131
151
 
132
- // Allow the sidebar to appear as overlay on mobile
133
- & > :global(.root) {
152
+ > aside {
153
+ position: relative;
154
+ top: 0;
134
155
  width: var(--appshell-sidebar-expanded-width, 240px);
135
- }
136
- }
137
-
138
- // Override Sidebar component's height
139
- :global(.root) {
140
- height: 100%;
141
-
142
- @include below-md {
143
156
  height: 100vh;
144
157
  height: 100dvh;
145
158
  }
146
159
  }
147
160
  }
148
161
 
149
- // Sidebar in sidebar structure: full height
162
+ // Sidebar in sidebar structure: column stretches both rows; inner sticks
163
+ // from the top of the viewport.
150
164
  .sidebarFullHeight {
151
- top: 0;
152
- height: 100vh;
153
- height: 100dvh;
154
165
  z-index: var(--fui-header-z-index, $fui-header-z-index);
155
166
 
156
- :global(.root) {
157
- height: 100%;
167
+ > aside {
168
+ top: 0;
169
+ height: 100vh;
170
+ height: 100dvh;
158
171
  }
159
172
  }
160
173
 
@@ -190,7 +203,7 @@
190
203
  border: var(--fui-stroke-hairline, 1px) solid var(--fui-border, $fui-border);
191
204
  border-radius: var(--fui-radius-xl, $fui-radius-xl);
192
205
  background-color: var(--fui-app-main-bg, var(--fui-main-bg, #{$fui-main-bg}));
193
- box-shadow: inset 0 1px 0
206
+ box-shadow: inset 0 var(--fui-stroke-hairline, 1px) 0
194
207
  color-mix(in srgb, var(--fui-text-primary, #{$fui-text-primary}) 5%, transparent);
195
208
  overflow: hidden auto;
196
209
 
@@ -285,7 +298,7 @@
285
298
  border: var(--fui-stroke-hairline, 1px) solid var(--fui-border, $fui-border);
286
299
  border-radius: var(--fui-radius-xl, $fui-radius-xl);
287
300
  background-color: var(--fui-panel-bg, inherit);
288
- box-shadow: inset 0 1px 0
301
+ box-shadow: inset 0 var(--fui-stroke-hairline, 1px) 0
289
302
  color-mix(in srgb, var(--fui-text-primary, #{$fui-text-primary}) 5%, transparent);
290
303
  overflow: hidden;
291
304