@usefragments/ui 1.6.0 → 2.0.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 (685) hide show
  1. package/README.md +54 -66
  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/nav-glyph.cjs +139 -0
  6. package/dist/assets/nav-glyph.d.ts +28 -0
  7. package/dist/assets/nav-glyph.d.ts.map +1 -0
  8. package/dist/assets/nav-glyph.js +139 -0
  9. package/dist/assets/nav-glyph.module.scss.cjs +71 -0
  10. package/dist/assets/nav-glyph.module.scss.js +71 -0
  11. package/dist/assets/ui.css +6885 -6308
  12. package/dist/blocks/components/StatsCard.d.ts +1 -1
  13. package/dist/blocks/components/StatsCard.d.ts.map +1 -1
  14. package/dist/chart.cjs +24 -6
  15. package/dist/chart.js +24 -6
  16. package/dist/codeblock.cjs +76 -43
  17. package/dist/codeblock.js +71 -38
  18. package/dist/colorpicker.cjs +4 -1
  19. package/dist/colorpicker.js +4 -1
  20. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  21. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  22. package/dist/components/Alert/Alert.module.scss.cjs +23 -20
  23. package/dist/components/Alert/Alert.module.scss.js +23 -20
  24. package/dist/components/Alert/index.cjs +20 -8
  25. package/dist/components/Alert/index.d.ts +17 -11
  26. package/dist/components/Alert/index.d.ts.map +1 -1
  27. package/dist/components/Alert/index.js +20 -8
  28. package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
  29. package/dist/components/AppShell/AppShell.module.scss.js +14 -14
  30. package/dist/components/AppShell/index.cjs +2 -2
  31. package/dist/components/AppShell/index.js +2 -2
  32. package/dist/components/Avatar/Avatar.module.scss.cjs +14 -14
  33. package/dist/components/Avatar/Avatar.module.scss.js +14 -14
  34. package/dist/components/Badge/Badge.module.scss.cjs +33 -31
  35. package/dist/components/Badge/Badge.module.scss.js +33 -31
  36. package/dist/components/Badge/index.cjs +13 -3
  37. package/dist/components/Badge/index.d.ts +18 -13
  38. package/dist/components/Badge/index.d.ts.map +1 -1
  39. package/dist/components/Badge/index.js +13 -3
  40. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +14 -14
  41. package/dist/components/BentoGrid/BentoGrid.module.scss.js +14 -14
  42. package/dist/components/Box/Box.module.scss.cjs +152 -152
  43. package/dist/components/Box/Box.module.scss.js +152 -152
  44. package/dist/components/Box/index.cjs +64 -75
  45. package/dist/components/Box/index.d.ts +16 -16
  46. package/dist/components/Box/index.d.ts.map +1 -1
  47. package/dist/components/Box/index.js +64 -75
  48. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.cjs +11 -8
  49. package/dist/components/Breadcrumbs/Breadcrumbs.module.scss.js +11 -8
  50. package/dist/components/Breadcrumbs/index.cjs +1 -1
  51. package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
  52. package/dist/components/Breadcrumbs/index.js +1 -1
  53. package/dist/components/Button/Button.module.scss.cjs +36 -27
  54. package/dist/components/Button/Button.module.scss.js +36 -27
  55. package/dist/components/Button/index.cjs +20 -4
  56. package/dist/components/Button/index.d.ts +18 -10
  57. package/dist/components/Button/index.d.ts.map +1 -1
  58. package/dist/components/Button/index.js +20 -4
  59. package/dist/components/ButtonGroup/ButtonGroup.module.scss.cjs +15 -15
  60. package/dist/components/ButtonGroup/ButtonGroup.module.scss.js +15 -15
  61. package/dist/components/Card/Card.module.scss.cjs +31 -26
  62. package/dist/components/Card/Card.module.scss.js +32 -27
  63. package/dist/components/Card/index.cjs +16 -3
  64. package/dist/components/Card/index.d.ts +23 -15
  65. package/dist/components/Card/index.d.ts.map +1 -1
  66. package/dist/components/Card/index.js +16 -3
  67. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  68. package/dist/components/Chart/Chart.module.scss.js +15 -15
  69. package/dist/components/Chart/index.d.ts.map +1 -1
  70. package/dist/components/Checkbox/Checkbox.module.scss.cjs +11 -11
  71. package/dist/components/Checkbox/Checkbox.module.scss.js +11 -11
  72. package/dist/components/Checkbox/index.cjs +4 -4
  73. package/dist/components/Checkbox/index.d.ts +4 -6
  74. package/dist/components/Checkbox/index.d.ts.map +1 -1
  75. package/dist/components/Checkbox/index.js +4 -4
  76. package/dist/components/Chip/Chip.module.scss.cjs +19 -19
  77. package/dist/components/Chip/Chip.module.scss.js +19 -19
  78. package/dist/components/Chip/index.cjs +3 -3
  79. package/dist/components/Chip/index.d.ts +8 -3
  80. package/dist/components/Chip/index.d.ts.map +1 -1
  81. package/dist/components/Chip/index.js +3 -3
  82. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +26 -23
  83. package/dist/components/CodeBlock/CodeBlock.module.scss.js +26 -23
  84. package/dist/components/CodeBlock/css-variables-theme.cjs +98 -0
  85. package/dist/components/CodeBlock/css-variables-theme.d.ts +27 -0
  86. package/dist/components/CodeBlock/css-variables-theme.d.ts.map +1 -0
  87. package/dist/components/CodeBlock/css-variables-theme.js +98 -0
  88. package/dist/components/CodeBlock/index.d.ts +20 -5
  89. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  90. package/dist/components/Collapsible/Collapsible.module.scss.cjs +9 -9
  91. package/dist/components/Collapsible/Collapsible.module.scss.js +9 -9
  92. package/dist/components/ColorPicker/ColorPicker.module.scss.cjs +14 -14
  93. package/dist/components/ColorPicker/ColorPicker.module.scss.js +14 -14
  94. package/dist/components/ColorPicker/index.d.ts.map +1 -1
  95. package/dist/components/Combobox/Combobox.module.scss.cjs +21 -21
  96. package/dist/components/Combobox/Combobox.module.scss.js +21 -21
  97. package/dist/components/Combobox/index.cjs +26 -6
  98. package/dist/components/Combobox/index.d.ts.map +1 -1
  99. package/dist/components/Combobox/index.js +26 -6
  100. package/dist/components/Command/Command.module.scss.cjs +14 -11
  101. package/dist/components/Command/Command.module.scss.js +14 -11
  102. package/dist/components/Command/index.cjs +28 -16
  103. package/dist/components/Command/index.d.ts +8 -3
  104. package/dist/components/Command/index.d.ts.map +1 -1
  105. package/dist/components/Command/index.js +28 -16
  106. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  107. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  108. package/dist/components/ConversationList/index.cjs +2 -2
  109. package/dist/components/ConversationList/index.js +2 -2
  110. package/dist/components/DataTable/DataTable.icons.cjs +6 -33
  111. package/dist/components/DataTable/DataTable.icons.d.ts.map +1 -1
  112. package/dist/components/DataTable/DataTable.icons.js +6 -33
  113. package/dist/components/DataTable/DataTable.module.scss.cjs +31 -28
  114. package/dist/components/DataTable/DataTable.module.scss.js +31 -28
  115. package/dist/components/DataTable/DataTable.virtual.d.ts.map +1 -1
  116. package/dist/components/DataTable/index.d.ts.map +1 -1
  117. package/dist/components/DatePicker/DatePicker.module.scss.cjs +33 -33
  118. package/dist/components/DatePicker/DatePicker.module.scss.js +33 -33
  119. package/dist/components/DatePicker/index.d.ts.map +1 -1
  120. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  121. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  122. package/dist/components/Dialog/index.cjs +13 -16
  123. package/dist/components/Dialog/index.d.ts +11 -10
  124. package/dist/components/Dialog/index.d.ts.map +1 -1
  125. package/dist/components/Dialog/index.js +13 -16
  126. package/dist/components/Drawer/Drawer.module.scss.cjs +39 -39
  127. package/dist/components/Drawer/Drawer.module.scss.js +40 -40
  128. package/dist/components/Drawer/index.cjs +2 -2
  129. package/dist/components/Drawer/index.d.ts +5 -4
  130. package/dist/components/Drawer/index.d.ts.map +1 -1
  131. package/dist/components/Drawer/index.js +2 -2
  132. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  133. package/dist/components/Editor/Editor.module.scss.js +17 -17
  134. package/dist/components/Editor/index.d.ts +10 -10
  135. package/dist/components/Editor/index.d.ts.map +1 -1
  136. package/dist/components/EmptyState/EmptyState.module.scss.cjs +11 -8
  137. package/dist/components/EmptyState/EmptyState.module.scss.js +11 -8
  138. package/dist/components/EmptyState/index.cjs +13 -6
  139. package/dist/components/EmptyState/index.d.ts +13 -5
  140. package/dist/components/EmptyState/index.d.ts.map +1 -1
  141. package/dist/components/EmptyState/index.js +13 -6
  142. package/dist/components/Field/Field.module.scss.cjs +5 -5
  143. package/dist/components/Field/Field.module.scss.js +5 -5
  144. package/dist/components/Field/index.cjs +9 -1
  145. package/dist/components/Field/index.d.ts.map +1 -1
  146. package/dist/components/Field/index.js +9 -1
  147. package/dist/components/Fieldset/Fieldset.module.scss.cjs +3 -3
  148. package/dist/components/Fieldset/Fieldset.module.scss.js +3 -3
  149. package/dist/components/Grid/Grid.module.scss.cjs +54 -54
  150. package/dist/components/Grid/Grid.module.scss.js +54 -54
  151. package/dist/components/Grid/index.cjs +1 -1
  152. package/dist/components/Grid/index.js +1 -1
  153. package/dist/components/Header/Header.module.scss.cjs +33 -33
  154. package/dist/components/Header/Header.module.scss.js +33 -33
  155. package/dist/components/Header/index.cjs +17 -38
  156. package/dist/components/Header/index.d.ts +15 -11
  157. package/dist/components/Header/index.d.ts.map +1 -1
  158. package/dist/components/Header/index.js +17 -38
  159. package/dist/components/Icon/Icon.module.scss.cjs +30 -33
  160. package/dist/components/Icon/Icon.module.scss.js +30 -33
  161. package/dist/components/Icon/index.cjs +15 -14
  162. package/dist/components/Icon/index.d.ts +23 -12
  163. package/dist/components/Icon/index.d.ts.map +1 -1
  164. package/dist/components/Icon/index.js +15 -14
  165. package/dist/components/IconButton/IconButton.module.scss.cjs +12 -12
  166. package/dist/components/IconButton/IconButton.module.scss.js +12 -12
  167. package/dist/components/IconButton/index.cjs +2 -1
  168. package/dist/components/IconButton/index.d.ts +4 -4
  169. package/dist/components/IconButton/index.d.ts.map +1 -1
  170. package/dist/components/IconButton/index.js +2 -1
  171. package/dist/components/Image/Image.module.scss.cjs +27 -27
  172. package/dist/components/Image/Image.module.scss.js +27 -27
  173. package/dist/components/Input/Input.module.scss.cjs +15 -21
  174. package/dist/components/Input/Input.module.scss.js +15 -21
  175. package/dist/components/Input/index.cjs +2 -14
  176. package/dist/components/Input/index.d.ts +0 -2
  177. package/dist/components/Input/index.d.ts.map +1 -1
  178. package/dist/components/Input/index.js +2 -14
  179. package/dist/components/Link/Link.module.scss.cjs +26 -14
  180. package/dist/components/Link/Link.module.scss.js +26 -14
  181. package/dist/components/Link/index.cjs +13 -2
  182. package/dist/components/Link/index.d.ts +11 -4
  183. package/dist/components/Link/index.d.ts.map +1 -1
  184. package/dist/components/Link/index.js +13 -2
  185. package/dist/components/List/List.module.scss.cjs +23 -19
  186. package/dist/components/List/List.module.scss.js +23 -19
  187. package/dist/components/List/index.cjs +7 -7
  188. package/dist/components/List/index.d.ts +10 -7
  189. package/dist/components/List/index.d.ts.map +1 -1
  190. package/dist/components/List/index.js +7 -7
  191. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  192. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  193. package/dist/components/Loading/Loading.module.scss.cjs +34 -34
  194. package/dist/components/Loading/Loading.module.scss.js +34 -34
  195. package/dist/components/Loading/index.cjs +5 -5
  196. package/dist/components/Loading/index.d.ts +8 -7
  197. package/dist/components/Loading/index.d.ts.map +1 -1
  198. package/dist/components/Loading/index.js +5 -5
  199. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  200. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  201. package/dist/components/Markdown/index.d.ts +2 -2
  202. package/dist/components/Markdown/index.d.ts.map +1 -1
  203. package/dist/components/Menu/Menu.module.scss.cjs +14 -14
  204. package/dist/components/Menu/Menu.module.scss.js +14 -14
  205. package/dist/components/Message/Message.module.scss.cjs +20 -20
  206. package/dist/components/Message/Message.module.scss.js +20 -20
  207. package/dist/components/Message/index.cjs +1 -1
  208. package/dist/components/Message/index.d.ts +1 -1
  209. package/dist/components/Message/index.js +1 -1
  210. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +34 -31
  211. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +34 -31
  212. package/dist/components/NavigationMenu/index.cjs +32 -15
  213. package/dist/components/NavigationMenu/index.d.ts +12 -6
  214. package/dist/components/NavigationMenu/index.d.ts.map +1 -1
  215. package/dist/components/NavigationMenu/index.js +32 -15
  216. package/dist/components/Pagination/Pagination.module.scss.cjs +10 -10
  217. package/dist/components/Pagination/Pagination.module.scss.js +10 -10
  218. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  219. package/dist/components/Popover/Popover.module.scss.js +10 -10
  220. package/dist/components/Progress/Progress.module.scss.cjs +28 -25
  221. package/dist/components/Progress/Progress.module.scss.js +28 -25
  222. package/dist/components/Progress/index.cjs +21 -12
  223. package/dist/components/Progress/index.d.ts +10 -6
  224. package/dist/components/Progress/index.d.ts.map +1 -1
  225. package/dist/components/Progress/index.js +21 -12
  226. package/dist/components/Prompt/Prompt.module.scss.cjs +30 -30
  227. package/dist/components/Prompt/Prompt.module.scss.js +30 -30
  228. package/dist/components/Prompt/index.cjs +7 -7
  229. package/dist/components/Prompt/index.d.ts +11 -9
  230. package/dist/components/Prompt/index.d.ts.map +1 -1
  231. package/dist/components/Prompt/index.js +7 -7
  232. package/dist/components/RadioGroup/RadioGroup.module.scss.cjs +20 -17
  233. package/dist/components/RadioGroup/RadioGroup.module.scss.js +20 -17
  234. package/dist/components/RadioGroup/index.cjs +10 -5
  235. package/dist/components/RadioGroup/index.d.ts +11 -7
  236. package/dist/components/RadioGroup/index.d.ts.map +1 -1
  237. package/dist/components/RadioGroup/index.js +10 -5
  238. package/dist/components/ScrollArea/ScrollArea.module.scss.cjs +5 -5
  239. package/dist/components/ScrollArea/ScrollArea.module.scss.js +5 -5
  240. package/dist/components/ScrollArea/index.d.ts +4 -4
  241. package/dist/components/ScrollArea/index.d.ts.map +1 -1
  242. package/dist/components/ScrollArea/scroll-state.d.ts +5 -5
  243. package/dist/components/Select/Select.module.scss.cjs +21 -21
  244. package/dist/components/Select/Select.module.scss.js +21 -21
  245. package/dist/components/Select/index.cjs +26 -20
  246. package/dist/components/Select/index.d.ts +5 -5
  247. package/dist/components/Select/index.d.ts.map +1 -1
  248. package/dist/components/Select/index.js +26 -20
  249. package/dist/components/Separator/Separator.module.scss.cjs +25 -19
  250. package/dist/components/Separator/Separator.module.scss.js +25 -19
  251. package/dist/components/Separator/index.cjs +10 -8
  252. package/dist/components/Separator/index.d.ts +4 -2
  253. package/dist/components/Separator/index.d.ts.map +1 -1
  254. package/dist/components/Separator/index.js +10 -8
  255. package/dist/components/Sidebar/Sidebar.module.scss.cjs +43 -43
  256. package/dist/components/Sidebar/Sidebar.module.scss.js +43 -43
  257. package/dist/components/Sidebar/index.cjs +15 -38
  258. package/dist/components/Sidebar/index.d.ts +19 -19
  259. package/dist/components/Sidebar/index.d.ts.map +1 -1
  260. package/dist/components/Sidebar/index.js +15 -38
  261. package/dist/components/Skeleton/Skeleton.module.scss.cjs +50 -46
  262. package/dist/components/Skeleton/Skeleton.module.scss.js +50 -46
  263. package/dist/components/Skeleton/index.cjs +7 -7
  264. package/dist/components/Skeleton/index.d.ts +8 -7
  265. package/dist/components/Skeleton/index.d.ts.map +1 -1
  266. package/dist/components/Skeleton/index.js +7 -7
  267. package/dist/components/Slider/Slider.module.scss.cjs +12 -12
  268. package/dist/components/Slider/Slider.module.scss.js +12 -12
  269. package/dist/components/Stack/Stack.module.scss.cjs +25 -25
  270. package/dist/components/Stack/Stack.module.scss.js +25 -25
  271. package/dist/components/Stack/index.cjs +1 -1
  272. package/dist/components/Stack/index.js +1 -1
  273. package/dist/components/Switch/Switch.module.scss.cjs +9 -9
  274. package/dist/components/Switch/Switch.module.scss.js +9 -9
  275. package/dist/components/Table/Table.module.scss.cjs +19 -19
  276. package/dist/components/Table/Table.module.scss.js +19 -19
  277. package/dist/components/TableOfContents/TableOfContents.module.scss.cjs +15 -15
  278. package/dist/components/TableOfContents/TableOfContents.module.scss.js +15 -15
  279. package/dist/components/TableOfContents/index.cjs +14 -10
  280. package/dist/components/TableOfContents/index.d.ts +5 -3
  281. package/dist/components/TableOfContents/index.d.ts.map +1 -1
  282. package/dist/components/TableOfContents/index.js +14 -10
  283. package/dist/components/Tabs/Tabs.module.scss.cjs +18 -18
  284. package/dist/components/Tabs/Tabs.module.scss.js +18 -18
  285. package/dist/components/Tabs/index.cjs +30 -11
  286. package/dist/components/Tabs/index.d.ts +8 -6
  287. package/dist/components/Tabs/index.d.ts.map +1 -1
  288. package/dist/components/Tabs/index.js +30 -11
  289. package/dist/components/Text/Text.module.scss.cjs +109 -97
  290. package/dist/components/Text/Text.module.scss.js +109 -97
  291. package/dist/components/Text/index.cjs +45 -41
  292. package/dist/components/Text/index.d.ts +24 -19
  293. package/dist/components/Text/index.d.ts.map +1 -1
  294. package/dist/components/Text/index.js +45 -41
  295. package/dist/components/Textarea/Textarea.module.scss.cjs +22 -28
  296. package/dist/components/Textarea/Textarea.module.scss.js +22 -28
  297. package/dist/components/Textarea/index.cjs +3 -10
  298. package/dist/components/Textarea/index.d.ts +0 -2
  299. package/dist/components/Textarea/index.d.ts.map +1 -1
  300. package/dist/components/Textarea/index.js +3 -10
  301. package/dist/components/Theme/index.cjs +22 -5
  302. package/dist/components/Theme/index.d.ts +6 -12
  303. package/dist/components/Theme/index.d.ts.map +1 -1
  304. package/dist/components/Theme/index.js +22 -5
  305. package/dist/components/ThemeToggle/ThemeButton.cjs +51 -0
  306. package/dist/components/ThemeToggle/ThemeButton.d.ts +16 -0
  307. package/dist/components/ThemeToggle/ThemeButton.d.ts.map +1 -0
  308. package/dist/components/ThemeToggle/ThemeButton.js +34 -0
  309. package/dist/components/ThemeToggle/ThemeToggle.module.scss.cjs +6 -6
  310. package/dist/components/ThemeToggle/ThemeToggle.module.scss.js +6 -6
  311. package/dist/components/ThemeToggle/icons.cjs +48 -0
  312. package/dist/components/ThemeToggle/icons.d.ts +10 -0
  313. package/dist/components/ThemeToggle/icons.d.ts.map +1 -0
  314. package/dist/components/ThemeToggle/icons.js +48 -0
  315. package/dist/components/ThemeToggle/index.cjs +6 -50
  316. package/dist/components/ThemeToggle/index.d.ts +5 -3
  317. package/dist/components/ThemeToggle/index.d.ts.map +1 -1
  318. package/dist/components/ThemeToggle/index.js +3 -47
  319. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +18 -15
  320. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +18 -15
  321. package/dist/components/ThinkingIndicator/index.cjs +7 -8
  322. package/dist/components/ThinkingIndicator/index.d.ts +6 -5
  323. package/dist/components/ThinkingIndicator/index.d.ts.map +1 -1
  324. package/dist/components/ThinkingIndicator/index.js +7 -8
  325. package/dist/components/Toast/Toast.module.scss.cjs +28 -29
  326. package/dist/components/Toast/Toast.module.scss.js +29 -30
  327. package/dist/components/Toast/index.cjs +28 -30
  328. package/dist/components/Toast/index.d.ts +9 -8
  329. package/dist/components/Toast/index.d.ts.map +1 -1
  330. package/dist/components/Toast/index.js +28 -30
  331. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +21 -19
  332. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +22 -20
  333. package/dist/components/ToggleGroup/index.cjs +4 -5
  334. package/dist/components/ToggleGroup/index.d.ts +7 -6
  335. package/dist/components/ToggleGroup/index.d.ts.map +1 -1
  336. package/dist/components/ToggleGroup/index.js +4 -5
  337. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  338. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  339. package/dist/components/Tooltip/index.cjs +24 -40
  340. package/dist/components/Tooltip/index.d.ts +4 -4
  341. package/dist/components/Tooltip/index.d.ts.map +1 -1
  342. package/dist/components/Tooltip/index.js +24 -40
  343. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.cjs +1 -1
  344. package/dist/components/VisuallyHidden/VisuallyHidden.module.scss.js +1 -1
  345. package/dist/components/VisuallyHidden/index.d.ts +2 -2
  346. package/dist/data-table-virtual.cjs +3 -2
  347. package/dist/data-table-virtual.js +3 -2
  348. package/dist/data-table.cjs +3 -2
  349. package/dist/data-table.js +3 -2
  350. package/dist/datepicker.cjs +26 -13
  351. package/dist/datepicker.js +26 -13
  352. package/dist/editor.cjs +68 -28
  353. package/dist/editor.js +68 -28
  354. package/dist/index.cjs +6 -2
  355. package/dist/index.d.ts +9 -9
  356. package/dist/index.d.ts.map +1 -1
  357. package/dist/index.js +8 -4
  358. package/dist/markdown.cjs +21 -29
  359. package/dist/markdown.js +21 -29
  360. package/dist/measurements/generated.cjs +46 -94
  361. package/dist/measurements/generated.d.ts +44 -92
  362. package/dist/measurements/generated.d.ts.map +1 -1
  363. package/dist/measurements/generated.js +46 -94
  364. package/dist/measurements/index.d.ts +1 -1
  365. package/dist/measurements/index.d.ts.map +1 -1
  366. package/dist/utils/a11y.cjs +5 -2
  367. package/dist/utils/a11y.d.ts +5 -5
  368. package/dist/utils/a11y.d.ts.map +1 -1
  369. package/dist/utils/a11y.js +5 -2
  370. package/dist/utils/canonical-stamp.cjs +2 -8
  371. package/dist/utils/canonical-stamp.d.ts.map +1 -1
  372. package/dist/utils/canonical-stamp.js +1 -7
  373. package/dist/utils/css-warning.cjs +1 -1
  374. package/dist/utils/css-warning.js +1 -1
  375. package/dist/utils/env.cjs +17 -0
  376. package/dist/utils/env.d.ts +3 -0
  377. package/dist/utils/env.d.ts.map +1 -0
  378. package/dist/utils/env.js +17 -0
  379. package/dist/utils/keyboard-shortcuts.cjs +3 -10
  380. package/dist/utils/keyboard-shortcuts.d.ts +4 -4
  381. package/dist/utils/keyboard-shortcuts.d.ts.map +1 -1
  382. package/dist/utils/keyboard-shortcuts.js +3 -10
  383. package/dist/utils/seed-derivation.cjs +10 -7
  384. package/dist/utils/seed-derivation.d.ts +1 -3
  385. package/dist/utils/seed-derivation.d.ts.map +1 -1
  386. package/dist/utils/seed-derivation.js +10 -7
  387. package/dist/utils/theme-presets.cjs +5 -10
  388. package/dist/utils/theme-presets.d.ts +1 -2
  389. package/dist/utils/theme-presets.d.ts.map +1 -1
  390. package/dist/utils/theme-presets.js +5 -10
  391. package/fragments.json +1 -1
  392. package/package.json +9 -10
  393. package/src/assets/fragments-logo.tsx +2 -2
  394. package/src/assets/fragments-wordmark.tsx +4 -2
  395. package/src/assets/nav-glyph.module.scss +166 -0
  396. package/src/assets/nav-glyph.tsx +188 -0
  397. package/src/components/Accordion/Accordion.contract.json +24 -48
  398. package/src/components/Accordion/Accordion.module.scss +5 -3
  399. package/src/components/Alert/Alert.contract.json +49 -65
  400. package/src/components/Alert/Alert.module.scss +57 -47
  401. package/src/components/Alert/index.tsx +72 -39
  402. package/src/components/AppShell/AppShell.contract.json +34 -51
  403. package/src/components/AppShell/AppShell.module.scss +99 -54
  404. package/src/components/AppShell/index.tsx +2 -2
  405. package/src/components/Avatar/Avatar.contract.json +31 -48
  406. package/src/components/Avatar/Avatar.module.scss +4 -2
  407. package/src/components/Badge/Badge.contract.json +86 -55
  408. package/src/components/Badge/Badge.module.scss +80 -48
  409. package/src/components/Badge/index.tsx +34 -17
  410. package/src/components/BentoGrid/BentoGrid.contract.json +21 -45
  411. package/src/components/BentoGrid/BentoGrid.module.scss +4 -8
  412. package/src/components/Box/Box.contract.json +40 -148
  413. package/src/components/Box/Box.module.scss +7 -6
  414. package/src/components/Box/index.tsx +92 -99
  415. package/src/components/Breadcrumbs/Breadcrumbs.contract.json +21 -34
  416. package/src/components/Breadcrumbs/Breadcrumbs.module.scss +27 -12
  417. package/src/components/Breadcrumbs/index.tsx +5 -1
  418. package/src/components/Button/Button.module.scss +261 -185
  419. package/src/components/Button/index.tsx +41 -28
  420. package/src/components/ButtonGroup/ButtonGroup.contract.json +34 -49
  421. package/src/components/ButtonGroup/ButtonGroup.module.scss +8 -6
  422. package/src/components/Card/Card.consumer-fixture.module.scss +5 -2
  423. package/src/components/Card/Card.module.scss +97 -76
  424. package/src/components/Card/index.tsx +44 -20
  425. package/src/components/Chart/Chart.contract.json +21 -29
  426. package/src/components/Chart/Chart.module.scss +6 -5
  427. package/src/components/Chart/index.tsx +36 -6
  428. package/src/components/Checkbox/Checkbox.contract.json +28 -27
  429. package/src/components/Checkbox/Checkbox.module.scss +47 -54
  430. package/src/components/Checkbox/index.tsx +10 -10
  431. package/src/components/Chip/Chip.contract.json +38 -45
  432. package/src/components/Chip/Chip.module.scss +24 -23
  433. package/src/components/Chip/index.tsx +12 -7
  434. package/src/components/CodeBlock/CodeBlock.contract.json +46 -76
  435. package/src/components/CodeBlock/CodeBlock.module.scss +75 -73
  436. package/src/components/CodeBlock/css-variables-theme.ts +102 -0
  437. package/src/components/CodeBlock/index.tsx +114 -51
  438. package/src/components/Collapsible/Collapsible.contract.json +21 -36
  439. package/src/components/Collapsible/Collapsible.module.scss +1 -7
  440. package/src/components/ColorPicker/ColorPicker.contract.json +29 -48
  441. package/src/components/ColorPicker/ColorPicker.module.scss +34 -24
  442. package/src/components/ColorPicker/index.tsx +6 -1
  443. package/src/components/Combobox/Combobox.contract.json +36 -37
  444. package/src/components/Combobox/Combobox.module.scss +16 -19
  445. package/src/components/Combobox/index.tsx +41 -6
  446. package/src/components/Command/Command.contract.json +28 -44
  447. package/src/components/Command/Command.module.scss +19 -21
  448. package/src/components/Command/index.tsx +64 -47
  449. package/src/components/ComponentDefaults/ComponentDefaults.contract.json +91 -0
  450. package/src/components/ConversationList/ConversationList.contract.json +27 -32
  451. package/src/components/ConversationList/ConversationList.module.scss +2 -3
  452. package/src/components/ConversationList/index.tsx +2 -2
  453. package/src/components/DataTable/DataTable.icons.tsx +4 -21
  454. package/src/components/DataTable/DataTable.module.scss +24 -17
  455. package/src/components/DataTable/DataTable.virtual.tsx +3 -2
  456. package/src/components/DataTable/index.tsx +9 -8
  457. package/src/components/DatePicker/DatePicker.contract.json +27 -28
  458. package/src/components/DatePicker/DatePicker.module.scss +41 -44
  459. package/src/components/DatePicker/index.tsx +23 -9
  460. package/src/components/Dialog/Dialog.module.scss +26 -32
  461. package/src/components/Dialog/index.tsx +51 -39
  462. package/src/components/Drawer/Drawer.contract.json +28 -42
  463. package/src/components/Drawer/Drawer.module.scss +123 -64
  464. package/src/components/Drawer/index.tsx +7 -5
  465. package/src/components/Editor/Editor.contract.json +32 -49
  466. package/src/components/Editor/Editor.module.scss +60 -25
  467. package/src/components/Editor/index.tsx +240 -179
  468. package/src/components/EmptyState/EmptyState.contract.json +33 -45
  469. package/src/components/EmptyState/EmptyState.module.scss +37 -21
  470. package/src/components/EmptyState/index.tsx +56 -23
  471. package/src/components/Field/Field.contract.json +28 -46
  472. package/src/components/Field/Field.module.scss +2 -1
  473. package/src/components/Field/index.tsx +5 -1
  474. package/src/components/Fieldset/Fieldset.contract.json +21 -38
  475. package/src/components/Fieldset/Fieldset.module.scss +15 -7
  476. package/src/components/Form/Form.contract.json +23 -23
  477. package/src/components/Grid/Grid.contract.json +28 -64
  478. package/src/components/Grid/Grid.module.scss +2 -2
  479. package/src/components/Grid/index.tsx +10 -10
  480. package/src/components/Header/Header.contract.json +31 -67
  481. package/src/components/Header/Header.module.scss +57 -54
  482. package/src/components/Header/index.tsx +134 -122
  483. package/src/components/Icon/Icon.contract.json +37 -81
  484. package/src/components/Icon/Icon.module.scss +13 -12
  485. package/src/components/Icon/index.tsx +31 -31
  486. package/src/components/IconButton/IconButton.contract.json +37 -21
  487. package/src/components/IconButton/IconButton.module.scss +19 -11
  488. package/src/components/IconButton/index.tsx +6 -5
  489. package/src/components/Image/Image.contract.json +23 -56
  490. package/src/components/Input/Input.contract.json +25 -44
  491. package/src/components/Input/Input.module.scss +6 -55
  492. package/src/components/Input/index.tsx +2 -18
  493. package/src/components/Link/Link.contract.json +46 -58
  494. package/src/components/Link/Link.module.scss +41 -10
  495. package/src/components/Link/index.tsx +27 -6
  496. package/src/components/List/List.contract.json +33 -62
  497. package/src/components/List/List.module.scss +10 -5
  498. package/src/components/List/index.tsx +17 -13
  499. package/src/components/Listbox/Listbox.contract.json +21 -37
  500. package/src/components/Listbox/Listbox.module.scss +14 -20
  501. package/src/components/Loading/Loading.contract.json +41 -65
  502. package/src/components/Loading/Loading.module.scss +37 -31
  503. package/src/components/Loading/index.tsx +15 -14
  504. package/src/components/Main/Main.contract.json +17 -9
  505. package/src/components/Markdown/Markdown.contract.json +22 -43
  506. package/src/components/Markdown/Markdown.module.scss +45 -6
  507. package/src/components/Markdown/index.tsx +48 -49
  508. package/src/components/Menu/Menu.contract.json +30 -46
  509. package/src/components/Menu/Menu.module.scss +32 -16
  510. package/src/components/Message/Message.contract.json +31 -54
  511. package/src/components/Message/Message.module.scss +18 -9
  512. package/src/components/Message/index.tsx +2 -2
  513. package/src/components/NavigationMenu/NavigationMenu.contract.json +36 -45
  514. package/src/components/NavigationMenu/NavigationMenu.module.scss +66 -66
  515. package/src/components/NavigationMenu/index.tsx +105 -81
  516. package/src/components/Pagination/Pagination.contract.json +22 -40
  517. package/src/components/Pagination/Pagination.module.scss +9 -16
  518. package/src/components/Popover/Popover.contract.json +28 -50
  519. package/src/components/Popover/Popover.module.scss +30 -28
  520. package/src/components/Progress/Progress.contract.json +39 -35
  521. package/src/components/Progress/Progress.module.scss +16 -10
  522. package/src/components/Progress/index.tsx +34 -16
  523. package/src/components/Prompt/Prompt.contract.json +40 -56
  524. package/src/components/Prompt/Prompt.module.scss +49 -48
  525. package/src/components/Prompt/index.tsx +17 -15
  526. package/src/components/RadioGroup/RadioGroup.contract.json +29 -28
  527. package/src/components/RadioGroup/RadioGroup.module.scss +50 -45
  528. package/src/components/RadioGroup/index.tsx +23 -10
  529. package/src/components/ScrollArea/ScrollArea.contract.json +18 -19
  530. package/src/components/ScrollArea/ScrollArea.module.scss +45 -48
  531. package/src/components/ScrollArea/index.tsx +16 -16
  532. package/src/components/ScrollArea/scroll-state.ts +24 -24
  533. package/src/components/Select/Select.module.scss +20 -19
  534. package/src/components/Select/index.tsx +26 -24
  535. package/src/components/Separator/Separator.contract.json +29 -53
  536. package/src/components/Separator/Separator.module.scss +24 -40
  537. package/src/components/Separator/index.tsx +16 -11
  538. package/src/components/Sidebar/Sidebar.contract.json +35 -67
  539. package/src/components/Sidebar/Sidebar.module.scss +94 -88
  540. package/src/components/Sidebar/index.tsx +167 -167
  541. package/src/components/Skeleton/Skeleton.contract.json +34 -60
  542. package/src/components/Skeleton/Skeleton.module.scss +50 -26
  543. package/src/components/Skeleton/index.tsx +16 -15
  544. package/src/components/Slider/Slider.contract.json +27 -39
  545. package/src/components/Slider/Slider.module.scss +9 -22
  546. package/src/components/Stack/Stack.contract.json +30 -57
  547. package/src/components/Stack/Stack.module.scss +26 -24
  548. package/src/components/Stack/index.tsx +3 -3
  549. package/src/components/Switch/Switch.contract.json +33 -46
  550. package/src/components/Switch/Switch.module.scss +106 -59
  551. package/src/components/Table/Table.contract.json +28 -46
  552. package/src/components/Table/Table.module.scss +24 -16
  553. package/src/components/TableOfContents/TableOfContents.contract.json +34 -21
  554. package/src/components/TableOfContents/TableOfContents.module.scss +17 -13
  555. package/src/components/TableOfContents/index.tsx +27 -10
  556. package/src/components/Tabs/Tabs.contract.json +35 -56
  557. package/src/components/Tabs/Tabs.module.scss +27 -31
  558. package/src/components/Tabs/index.tsx +30 -15
  559. package/src/components/Text/Text.contract.json +52 -72
  560. package/src/components/Text/Text.module.scss +34 -18
  561. package/src/components/Text/index.tsx +123 -83
  562. package/src/components/Textarea/Textarea.contract.json +24 -55
  563. package/src/components/Textarea/Textarea.module.scss +22 -52
  564. package/src/components/Textarea/index.tsx +3 -14
  565. package/src/components/Theme/Theme.contract.json +35 -53
  566. package/src/components/Theme/index.tsx +41 -13
  567. package/src/components/ThemeToggle/ThemeButton.tsx +49 -0
  568. package/src/components/ThemeToggle/ThemeToggle.module.scss +20 -27
  569. package/src/components/ThemeToggle/icons.tsx +46 -0
  570. package/src/components/ThemeToggle/index.tsx +9 -55
  571. package/src/components/ThinkingIndicator/ThinkingIndicator.contract.json +34 -50
  572. package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +9 -7
  573. package/src/components/ThinkingIndicator/index.tsx +12 -14
  574. package/src/components/Toast/Toast.contract.json +55 -49
  575. package/src/components/Toast/Toast.module.scss +50 -105
  576. package/src/components/Toast/index.tsx +39 -34
  577. package/src/components/ToggleGroup/ToggleGroup.contract.json +39 -40
  578. package/src/components/ToggleGroup/ToggleGroup.module.scss +30 -27
  579. package/src/components/ToggleGroup/index.tsx +11 -11
  580. package/src/components/Tooltip/Tooltip.contract.json +31 -52
  581. package/src/components/Tooltip/Tooltip.module.scss +16 -10
  582. package/src/components/Tooltip/index.tsx +19 -24
  583. package/src/components/VisuallyHidden/VisuallyHidden.contract.json +22 -44
  584. package/src/components/VisuallyHidden/VisuallyHidden.module.scss +4 -14
  585. package/src/components/VisuallyHidden/index.tsx +5 -5
  586. package/src/index.ts +16 -12
  587. package/src/measurements/MeasurementTargets.module.scss +6 -7
  588. package/src/measurements/generated.ts +46 -97
  589. package/src/measurements/index.ts +0 -1
  590. package/src/measurements/measurements.json +44 -116
  591. package/src/recipes/_action.scss +4 -4
  592. package/src/recipes/_boolean-range.scss +12 -16
  593. package/src/recipes/_feedback.scss +17 -16
  594. package/src/recipes/_field.scss +28 -16
  595. package/src/recipes/_layout.scss +14 -7
  596. package/src/recipes/_navigation.scss +84 -29
  597. package/src/recipes/_overlay.scss +143 -43
  598. package/src/recipes/_popup.scss +54 -34
  599. package/src/recipes/_prose.scss +48 -28
  600. package/src/recipes/_representation.scss +10 -9
  601. package/src/recipes/_segmented.scss +1 -1
  602. package/src/recipes/_table-chrome.scss +42 -17
  603. package/src/recipes/_target.scss +2 -4
  604. package/src/recipes/_typography.scss +10 -0
  605. package/src/scss.d.ts +1 -1
  606. package/src/styles/globals.scss +31 -25
  607. package/src/tokens/_component-properties.scss +19 -1
  608. package/src/tokens/_computed.scss +32 -49
  609. package/src/tokens/_derive.scss +112 -210
  610. package/src/tokens/_measurements.catalog.generated.css +62 -44
  611. package/src/tokens/_measurements.generated.scss +119 -249
  612. package/src/tokens/_mixins.scss +49 -48
  613. package/src/tokens/_palettes.scss +39 -167
  614. package/src/tokens/_property-registrations.scss +9 -0
  615. package/src/tokens/_seeds.scss +20 -31
  616. package/src/tokens/_variables.scss +251 -94
  617. package/src/utils/a11y.tsx +69 -69
  618. package/src/utils/aria.ts +3 -3
  619. package/src/utils/canonical-stamp.ts +2 -12
  620. package/src/utils/css-warning.ts +7 -7
  621. package/src/utils/env.ts +25 -0
  622. package/src/utils/keyboard-shortcuts.ts +131 -126
  623. package/src/utils/seed-derivation.ts +11 -14
  624. package/src/utils/theme-presets.ts +5 -12
  625. package/dist/blocks/AccountSettings.block.d.ts +0 -3
  626. package/dist/blocks/AccountSettings.block.d.ts.map +0 -1
  627. package/dist/blocks/ActivityFeedSkeleton.block.d.ts +0 -3
  628. package/dist/blocks/ActivityFeedSkeleton.block.d.ts.map +0 -1
  629. package/dist/blocks/BlogEditor.block.d.ts +0 -3
  630. package/dist/blocks/BlogEditor.block.d.ts.map +0 -1
  631. package/dist/blocks/ChatInterface.block.d.ts +0 -3
  632. package/dist/blocks/ChatInterface.block.d.ts.map +0 -1
  633. package/dist/blocks/ChatMessages.block.d.ts +0 -3
  634. package/dist/blocks/ChatMessages.block.d.ts.map +0 -1
  635. package/dist/blocks/CheckoutForm.block.d.ts +0 -3
  636. package/dist/blocks/CheckoutForm.block.d.ts.map +0 -1
  637. package/dist/blocks/CommandPalette.block.d.ts +0 -3
  638. package/dist/blocks/CommandPalette.block.d.ts.map +0 -1
  639. package/dist/blocks/ContactForm.block.d.ts +0 -3
  640. package/dist/blocks/ContactForm.block.d.ts.map +0 -1
  641. package/dist/blocks/DashboardPage.block.d.ts +0 -3
  642. package/dist/blocks/DashboardPage.block.d.ts.map +0 -1
  643. package/dist/blocks/DashboardSkeleton.block.d.ts +0 -3
  644. package/dist/blocks/DashboardSkeleton.block.d.ts.map +0 -1
  645. package/dist/blocks/DataTable.block.d.ts +0 -3
  646. package/dist/blocks/DataTable.block.d.ts.map +0 -1
  647. package/dist/blocks/EmptyState.block.d.ts +0 -3
  648. package/dist/blocks/EmptyState.block.d.ts.map +0 -1
  649. package/dist/blocks/FAQSection.block.d.ts +0 -3
  650. package/dist/blocks/FAQSection.block.d.ts.map +0 -1
  651. package/dist/blocks/FeatureGrid.block.d.ts +0 -3
  652. package/dist/blocks/FeatureGrid.block.d.ts.map +0 -1
  653. package/dist/blocks/HeroSection.block.d.ts +0 -3
  654. package/dist/blocks/HeroSection.block.d.ts.map +0 -1
  655. package/dist/blocks/NavigationHeader.block.d.ts +0 -3
  656. package/dist/blocks/NavigationHeader.block.d.ts.map +0 -1
  657. package/dist/blocks/PaginatedTable.block.d.ts +0 -3
  658. package/dist/blocks/PaginatedTable.block.d.ts.map +0 -1
  659. package/dist/blocks/PricingComparison.block.d.ts +0 -3
  660. package/dist/blocks/PricingComparison.block.d.ts.map +0 -1
  661. package/dist/blocks/ProductCard.block.d.ts +0 -3
  662. package/dist/blocks/ProductCard.block.d.ts.map +0 -1
  663. package/dist/blocks/RegistrationForm.block.d.ts +0 -3
  664. package/dist/blocks/RegistrationForm.block.d.ts.map +0 -1
  665. package/dist/blocks/SettingsDrawer.block.d.ts +0 -3
  666. package/dist/blocks/SettingsDrawer.block.d.ts.map +0 -1
  667. package/dist/blocks/SettingsPanel.block.d.ts +0 -3
  668. package/dist/blocks/SettingsPanel.block.d.ts.map +0 -1
  669. package/dist/blocks/ShoppingCart.block.d.ts +0 -3
  670. package/dist/blocks/ShoppingCart.block.d.ts.map +0 -1
  671. package/dist/blocks/StatsCardSkeleton.block.d.ts +0 -3
  672. package/dist/blocks/StatsCardSkeleton.block.d.ts.map +0 -1
  673. package/dist/blocks/TableSkeleton.block.d.ts +0 -3
  674. package/dist/blocks/TableSkeleton.block.d.ts.map +0 -1
  675. package/dist/blocks/ThinkingStates.block.d.ts +0 -3
  676. package/dist/blocks/ThinkingStates.block.d.ts.map +0 -1
  677. package/dist/components/Toggle/index.d.ts +0 -3
  678. package/dist/components/Toggle/index.d.ts.map +0 -1
  679. package/src/components/Button/Button.contract.json +0 -218
  680. package/src/components/Card/Card.contract.json +0 -175
  681. package/src/components/DataTable/DataTable.contract.json +0 -302
  682. package/src/components/Dialog/Dialog.contract.json +0 -159
  683. package/src/components/Select/Select.contract.json +0 -259
  684. package/src/components/Toggle/index.ts +0 -7
  685. package/src/tokens/_density.scss +0 -85
@@ -5,30 +5,82 @@
5
5
  @use "../../recipes/target" as target;
6
6
  @use "../../recipes/typography" as typography;
7
7
 
8
+ // Fallback travel for the thumb when no size class has set the track: the md
9
+ // track's inline size minus its block size, exactly what `switch-track` computes.
10
+ $_switch-travel-md: calc(#{boolean.switch-inline-size("md")} - #{boolean.switch-block-size("md")});
11
+
8
12
  .root {
9
13
  --_switch-off-bg: light-dark(
10
- color-mix(in srgb, var(--fui-bg-elevated) 92%, var(--fui-text-primary) 8%),
11
- color-mix(in srgb, var(--fui-bg-elevated) 82%, var(--fui-text-primary) 18%)
14
+ color-mix(
15
+ in srgb,
16
+ var(--fui-bg-elevated, #{$fui-bg-elevated}) 92%,
17
+ var(--fui-text-primary, #{$fui-text-primary}) 8%
18
+ ),
19
+ color-mix(
20
+ in srgb,
21
+ var(--fui-bg-elevated, #{$fui-bg-elevated}) 82%,
22
+ var(--fui-text-primary, #{$fui-text-primary}) 18%
23
+ )
12
24
  );
13
25
  --_switch-off-bg-hover: light-dark(
14
- color-mix(in srgb, var(--fui-bg-elevated) 88%, var(--fui-text-primary) 12%),
15
- color-mix(in srgb, var(--fui-bg-elevated) 76%, var(--fui-text-primary) 24%)
26
+ color-mix(
27
+ in srgb,
28
+ var(--fui-bg-elevated, #{$fui-bg-elevated}) 88%,
29
+ var(--fui-text-primary, #{$fui-text-primary}) 12%
30
+ ),
31
+ color-mix(
32
+ in srgb,
33
+ var(--fui-bg-elevated, #{$fui-bg-elevated}) 76%,
34
+ var(--fui-text-primary, #{$fui-text-primary}) 24%
35
+ )
16
36
  );
17
37
  --_switch-off-border: light-dark(
18
- color-mix(in srgb, var(--fui-border-strong) 72%, var(--fui-text-primary) 28%),
19
- color-mix(in srgb, var(--fui-border-strong) 58%, var(--fui-text-primary) 42%)
38
+ color-mix(
39
+ in srgb,
40
+ var(--fui-border-strong, #{$fui-border-strong}) 72%,
41
+ var(--fui-text-primary, #{$fui-text-primary}) 28%
42
+ ),
43
+ color-mix(
44
+ in srgb,
45
+ var(--fui-border-strong, #{$fui-border-strong}) 58%,
46
+ var(--fui-text-primary, #{$fui-text-primary}) 42%
47
+ )
20
48
  );
21
49
  --_switch-off-border-hover: light-dark(
22
- color-mix(in srgb, var(--fui-border-strong) 58%, var(--fui-text-primary) 42%),
23
- color-mix(in srgb, var(--fui-border-strong) 44%, var(--fui-text-primary) 56%)
50
+ color-mix(
51
+ in srgb,
52
+ var(--fui-border-strong, #{$fui-border-strong}) 58%,
53
+ var(--fui-text-primary, #{$fui-text-primary}) 42%
54
+ ),
55
+ color-mix(
56
+ in srgb,
57
+ var(--fui-border-strong, #{$fui-border-strong}) 44%,
58
+ var(--fui-text-primary, #{$fui-text-primary}) 56%
59
+ )
24
60
  );
25
61
  --_switch-thumb-bg: light-dark(
26
- color-mix(in srgb, var(--fui-bg-primary) 98%, white 2%),
27
- color-mix(in srgb, var(--fui-bg-primary) 56%, var(--fui-text-primary) 44%)
62
+ color-mix(
63
+ in srgb,
64
+ var(--fui-bg-primary, #{$fui-bg-primary}) 98%,
65
+ var(--fui-bg-elevated, #{$fui-bg-elevated}) 2%
66
+ ),
67
+ color-mix(
68
+ in srgb,
69
+ var(--fui-bg-primary, #{$fui-bg-primary}) 56%,
70
+ var(--fui-text-primary, #{$fui-text-primary}) 44%
71
+ )
28
72
  );
29
73
  --_switch-thumb-border: light-dark(
30
- color-mix(in srgb, var(--fui-border-strong) 68%, var(--fui-text-primary) 32%),
31
- color-mix(in srgb, var(--fui-border-strong) 45%, var(--fui-text-primary) 55%)
74
+ color-mix(
75
+ in srgb,
76
+ var(--fui-border-strong, #{$fui-border-strong}) 68%,
77
+ var(--fui-text-primary, #{$fui-text-primary}) 32%
78
+ ),
79
+ color-mix(
80
+ in srgb,
81
+ var(--fui-border-strong, #{$fui-border-strong}) 45%,
82
+ var(--fui-text-primary, #{$fui-text-primary}) 55%
83
+ )
32
84
  );
33
85
 
34
86
  @include target.hit-area("compact");
@@ -57,8 +109,15 @@
57
109
  }
58
110
 
59
111
  &[data-disabled] {
60
- cursor: not-allowed;
61
- opacity: 0.5;
112
+ @include disabled-state;
113
+ }
114
+
115
+ // The focused element is the label root, but the field ring is drawn on
116
+ // .track — the box a user reads as the control. Left alone the root also
117
+ // takes the global :focus-visible ring, so a focused Switch paints two
118
+ // concentric rings where every other field paints one.
119
+ &:focus-visible {
120
+ outline: none;
62
121
  }
63
122
 
64
123
  @media (pointer: coarse) {
@@ -74,36 +133,36 @@
74
133
  flex-shrink: 0;
75
134
  box-sizing: border-box;
76
135
  border-radius: var(--fui-radius-full, $fui-radius-full);
77
- border: var(--fui-stroke-hairline, 1px) solid var(--_switch-off-border);
78
- background-color: var(--_switch-off-bg);
136
+ border: var(--fui-stroke-hairline, #{$fui-stroke-hairline}) solid
137
+ var(--_switch-off-border, var(--fui-border-strong, #{$fui-border-strong}));
138
+ background-color: var(--_switch-off-bg, var(--fui-bg-elevated, #{$fui-bg-elevated}));
139
+ // Specular sheen: the lightest neutral surface over the track, the ink under it.
79
140
  box-shadow:
80
- inset 0 1px 0 color-mix(in srgb, white 26%, transparent),
81
- inset 0 -1px 0 color-mix(in srgb, var(--fui-text-primary, $fui-text-primary) 5%, transparent);
141
+ inset 0 var(--fui-stroke-hairline, #{$fui-stroke-hairline}) 0
142
+ color-mix(in srgb, var(--fui-bg-elevated, #{$fui-bg-elevated}) 26%, transparent),
143
+ inset 0 calc(-1 * var(--fui-stroke-hairline, #{$fui-stroke-hairline})) 0
144
+ color-mix(in srgb, var(--fui-text-primary, #{$fui-text-primary}) 5%, transparent);
145
+ @include high-contrast-outline;
82
146
  transition:
83
147
  background-color var(--fui-transition-normal, $fui-transition-normal),
84
148
  border-color var(--fui-transition-normal, $fui-transition-normal),
85
149
  box-shadow var(--fui-transition-normal, $fui-transition-normal);
86
150
 
87
151
  .root[data-checked] & {
88
- background-color: var(--fui-button-primary-base, $fui-color-accent);
89
- border-color: var(
90
- --fui-button-primary-border,
91
- var(--fui-button-primary-base, #{$fui-color-accent})
92
- );
93
- box-shadow: inset 0 1px 0 color-mix(in srgb, white 24%, transparent);
152
+ background-color: var(--fui-control-checked-bg, $fui-color-accent);
153
+ border-color: var(--fui-control-checked-border, $fui-color-accent);
154
+ box-shadow: inset 0 var(--fui-stroke-hairline, #{$fui-stroke-hairline}) 0
155
+ color-mix(in srgb, var(--fui-control-checked-color, #{$fui-color-on-accent}) 24%, transparent);
94
156
  }
95
157
 
96
158
  .root:not([data-disabled]):not([data-checked]) &:hover {
97
- background-color: var(--_switch-off-bg-hover);
98
- border-color: var(--_switch-off-border-hover);
159
+ background-color: var(--_switch-off-bg-hover, var(--fui-bg-hover, #{$fui-bg-hover}));
160
+ border-color: var(--_switch-off-border-hover, var(--fui-border-strong, #{$fui-border-strong}));
99
161
  }
100
162
 
101
163
  .root:not([data-disabled])[data-checked] &:hover {
102
- background-color: var(--fui-button-primary-hover, $fui-color-accent);
103
- border-color: var(
104
- --fui-button-primary-border-hover,
105
- var(--fui-button-primary-hover, #{$fui-color-accent})
106
- );
164
+ background-color: var(--fui-control-checked-bg-hover, $fui-color-accent-hover);
165
+ border-color: var(--fui-control-checked-border-hover, $fui-color-accent-hover);
107
166
  }
108
167
 
109
168
  .root:focus-visible & {
@@ -135,17 +194,21 @@
135
194
  .thumb {
136
195
  position: absolute;
137
196
  inset-block-start: 50%;
138
- inset-inline-start: var(--_fui-switch-inset);
197
+ inset-inline-start: var(--_fui-switch-inset, var(--fui-stroke-default, #{$fui-stroke-default}));
139
198
  box-sizing: border-box;
140
- width: var(--_fui-switch-thumb-size);
141
- height: var(--_fui-switch-thumb-size);
142
- border-radius: 50%;
199
+ width: var(--_fui-switch-thumb-size, #{boolean.switch-thumb-size("md")});
200
+ height: var(--_fui-switch-thumb-size, #{boolean.switch-thumb-size("md")});
201
+ border-radius: var(--fui-radius-full, $fui-radius-full);
143
202
  pointer-events: none;
144
- background-color: var(--_switch-thumb-bg);
145
- border: var(--fui-stroke-hairline, 1px) solid var(--_switch-thumb-border);
203
+ background-color: var(--_switch-thumb-bg, var(--fui-bg-primary, #{$fui-bg-primary}));
204
+ border: var(--fui-stroke-hairline, #{$fui-stroke-hairline}) solid
205
+ var(--_switch-thumb-border, var(--fui-border-strong, #{$fui-border-strong}));
146
206
  box-shadow:
147
- 0 1px 1px color-mix(in srgb, black 18%, transparent),
148
- inset 0 1px 0 color-mix(in srgb, white 42%, transparent);
207
+ 0 var(--fui-stroke-hairline, #{$fui-stroke-hairline})
208
+ var(--fui-stroke-hairline, #{$fui-stroke-hairline})
209
+ color-mix(in srgb, var(--fui-text-primary, #{$fui-text-primary}) 18%, transparent),
210
+ inset 0 var(--fui-stroke-hairline, #{$fui-stroke-hairline}) 0
211
+ color-mix(in srgb, var(--fui-bg-elevated, #{$fui-bg-elevated}) 42%, transparent);
149
212
  transform: translateY(-50%);
150
213
  transition:
151
214
  transform var(--fui-transition-normal, $fui-transition-normal),
@@ -154,17 +217,17 @@
154
217
  box-shadow var(--fui-transition-fast, $fui-transition-fast);
155
218
 
156
219
  .root[data-checked] & {
157
- transform: translate(var(--_fui-switch-travel), -50%);
158
- background-color: var(--fui-button-primary-color, #fff);
220
+ transform: translate(var(--_fui-switch-travel, #{$_switch-travel-md}), -50%);
221
+ background-color: var(--fui-control-checked-color, $fui-color-on-accent);
159
222
  border-color: color-mix(
160
223
  in srgb,
161
- var(--fui-button-primary-active, #{$fui-color-accent}) 28%,
224
+ var(--fui-control-checked-border, #{$fui-color-accent}) 28%,
162
225
  transparent
163
226
  );
164
227
  }
165
228
 
166
229
  .root:dir(rtl)[data-checked] & {
167
- transform: translate(calc(-1 * var(--_fui-switch-travel)), -50%);
230
+ transform: translate(calc(-1 * var(--_fui-switch-travel, #{$_switch-travel-md})), -50%);
168
231
  }
169
232
 
170
233
  .root:active:not([data-disabled]) & {
@@ -186,22 +249,6 @@
186
249
  @include field.helper;
187
250
  }
188
251
 
189
- // ============================================
190
- // Accessibility: High Contrast Mode
191
- // ============================================
192
-
193
- @media (prefers-contrast: more) {
194
- .track {
195
- border-color: var(--fui-text-primary, $fui-text-primary);
196
- outline: var(--fui-stroke-hairline, 1px) solid var(--fui-text-primary, $fui-text-primary);
197
- outline-offset: calc(-1 * var(--fui-stroke-default, 2px));
198
- }
199
-
200
- .root[data-checked] .track {
201
- border-color: var(--fui-button-primary-base, $fui-color-accent);
202
- }
203
- }
204
-
205
252
  // ============================================
206
253
  // Accessibility: Reduced Motion
207
254
  // ============================================
@@ -1,14 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Table",
4
- "description": "Semantic HTML table with compound API. For data-rich tables with sorting and selection, use DataTable.",
4
+ "description": "Renders tabular data as a real HTML table headers, rows, footer.",
5
5
  "category": "display",
6
- "tags": [
7
- "table",
8
- "semantic",
9
- "html",
10
- "layout"
11
- ],
6
+ "tags": ["table", "semantic", "html", "layout"],
12
7
  "status": "stable",
13
8
  "sourcePath": "src/components/Table/index.tsx",
14
9
  "exportName": "Table",
@@ -26,10 +21,7 @@
26
21
  "description": "Table density",
27
22
  "default": "md",
28
23
  "required": false,
29
- "values": [
30
- "sm",
31
- "md"
32
- ]
24
+ "values": ["sm", "md"]
33
25
  },
34
26
  "striped": {
35
27
  "type": "boolean",
@@ -61,22 +53,19 @@
61
53
  },
62
54
  "usage": {
63
55
  "when": [
64
- "Displaying simple tabular data with semantic HTML",
65
- "Static data that does not need sorting or selection",
66
- "Showing structured information with headers and rows",
67
- "Tables with footers or captions"
56
+ "The data is static — read it, do not interact with it",
57
+ "You need real thead/tbody/tfoot semantics",
58
+ "The table needs a caption or a totals footer"
68
59
  ],
69
60
  "whenNot": [
70
- "Data that needs sorting (use DataTable)",
71
- "Data that needs row selection (use DataTable)",
72
- "Data that needs clickable rows (use DataTable)",
73
- "Simple lists (use List component)"
61
+ "Rows need sorting, selection, or clicking (use DataTable)",
62
+ "Content is a single column of items (use List)"
74
63
  ],
75
64
  "guidelines": [
76
- "Use Table.HeaderCell for column headers (adds scope=\"col\" by default)",
77
- "Use Table.Caption for table descriptions (can be visually hidden)",
78
- "Keep tables simple use DataTable for interactive features",
79
- "Consider mobile responsiveness; table scrolls horizontally on small screens"
65
+ "Header cells go in Table.HeaderCell it sets scope=\"col\" for you",
66
+ "Give every table a caption or aria-label; visuallyHidden keeps it off screen",
67
+ "Reach for density, not the deprecated size prop",
68
+ "Narrow viewports scroll the table sideways keep column count low"
80
69
  ],
81
70
  "accessibility": [
82
71
  "Semantic HTML table elements (thead, tbody, tfoot, th, td)",
@@ -88,37 +77,42 @@
88
77
  "examples": [
89
78
  {
90
79
  "name": "Default",
91
- "description": "Basic semantic table",
80
+ "description": "Header row plus body rows, no extra styling.",
92
81
  "code": "<Table aria-label=\"Team members\">\n <Table.Head>\n <Table.Row>\n <Table.HeaderCell>Name</Table.HeaderCell>\n <Table.HeaderCell>Role</Table.HeaderCell>\n <Table.HeaderCell>Status</Table.HeaderCell>\n </Table.Row>\n </Table.Head>\n <Table.Body>\n <Table.Row>\n <Table.Cell>Alice Johnson</Table.Cell>\n <Table.Cell>Engineer</Table.Cell>\n <Table.Cell>Active</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Bob Smith</Table.Cell>\n <Table.Cell>Designer</Table.Cell>\n <Table.Cell>Active</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Carol Williams</Table.Cell>\n <Table.Cell>PM</Table.Cell>\n <Table.Cell>Away</Table.Cell>\n </Table.Row>\n </Table.Body>\n</Table>"
93
82
  },
83
+ {
84
+ "name": "Empty",
85
+ "description": "Keep the headers and fill one full-width cell so the layout holds.",
86
+ "code": "<Table aria-label=\"Team members\">\n <Table.Head>\n <Table.Row>\n <Table.HeaderCell>Name</Table.HeaderCell>\n <Table.HeaderCell>Role</Table.HeaderCell>\n <Table.HeaderCell>Status</Table.HeaderCell>\n </Table.Row>\n </Table.Head>\n <Table.Body>\n <Table.Row>\n <Table.Cell colSpan={3}>No team members yet.</Table.Cell>\n </Table.Row>\n </Table.Body>\n</Table>"
87
+ },
94
88
  {
95
89
  "name": "Striped",
96
- "description": "Alternating row backgrounds for readability",
90
+ "description": "Row tint alternates so the eye tracks across wide rows.",
97
91
  "code": "<Table striped aria-label=\"Inventory\">\n <Table.Head>\n <Table.Row>\n <Table.HeaderCell>Item</Table.HeaderCell>\n <Table.HeaderCell>Category</Table.HeaderCell>\n <Table.HeaderCell>Qty</Table.HeaderCell>\n </Table.Row>\n </Table.Head>\n <Table.Body>\n <Table.Row>\n <Table.Cell>Widget A</Table.Cell>\n <Table.Cell>Hardware</Table.Cell>\n <Table.Cell>120</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Widget B</Table.Cell>\n <Table.Cell>Software</Table.Cell>\n <Table.Cell>85</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Widget C</Table.Cell>\n <Table.Cell>Hardware</Table.Cell>\n <Table.Cell>200</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Widget D</Table.Cell>\n <Table.Cell>Software</Table.Cell>\n <Table.Cell>50</Table.Cell>\n </Table.Row>\n </Table.Body>\n</Table>"
98
92
  },
99
93
  {
100
94
  "name": "Bordered",
101
- "description": "Table with bordered container",
95
+ "description": "A border wraps the data so it reads as one block on a busy page.",
102
96
  "code": "<Table bordered aria-label=\"Pricing\">\n <Table.Head>\n <Table.Row>\n <Table.HeaderCell>Plan</Table.HeaderCell>\n <Table.HeaderCell>Price</Table.HeaderCell>\n <Table.HeaderCell>Features</Table.HeaderCell>\n </Table.Row>\n </Table.Head>\n <Table.Body>\n <Table.Row>\n <Table.Cell>Basic</Table.Cell>\n <Table.Cell>$9/mo</Table.Cell>\n <Table.Cell>5 projects</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Pro</Table.Cell>\n <Table.Cell>$29/mo</Table.Cell>\n <Table.Cell>Unlimited</Table.Cell>\n </Table.Row>\n </Table.Body>\n</Table>"
103
97
  },
104
98
  {
105
99
  "name": "Compact",
106
- "description": "Small, dense table",
107
- "code": "<Table size=\"sm\" aria-label=\"Shortcuts\">\n <Table.Head>\n <Table.Row>\n <Table.HeaderCell>Key</Table.HeaderCell>\n <Table.HeaderCell>Action</Table.HeaderCell>\n </Table.Row>\n </Table.Head>\n <Table.Body>\n <Table.Row>\n <Table.Cell>Ctrl+S</Table.Cell>\n <Table.Cell>Save</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Ctrl+Z</Table.Cell>\n <Table.Cell>Undo</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Ctrl+C</Table.Cell>\n <Table.Cell>Copy</Table.Cell>\n </Table.Row>\n </Table.Body>\n</Table>"
100
+ "description": "Tighter rows fit more data in the same height.",
101
+ "code": "<Table density=\"compact\" aria-label=\"Shortcuts\">\n <Table.Head>\n <Table.Row>\n <Table.HeaderCell>Key</Table.HeaderCell>\n <Table.HeaderCell>Action</Table.HeaderCell>\n </Table.Row>\n </Table.Head>\n <Table.Body>\n <Table.Row>\n <Table.Cell>Ctrl+S</Table.Cell>\n <Table.Cell>Save</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Ctrl+Z</Table.Cell>\n <Table.Cell>Undo</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Ctrl+C</Table.Cell>\n <Table.Cell>Copy</Table.Cell>\n </Table.Row>\n </Table.Body>\n</Table>"
108
102
  },
109
103
  {
110
104
  "name": "With Caption",
111
- "description": "Table with visible caption",
105
+ "description": "A visible caption titles the data for every reader.",
112
106
  "code": "<Table aria-label=\"Q1 results\">\n <Table.Caption>Quarterly Results (Q1 2026)</Table.Caption>\n <Table.Head>\n <Table.Row>\n <Table.HeaderCell>Metric</Table.HeaderCell>\n <Table.HeaderCell>Value</Table.HeaderCell>\n <Table.HeaderCell>Change</Table.HeaderCell>\n </Table.Row>\n </Table.Head>\n <Table.Body>\n <Table.Row>\n <Table.Cell>Revenue</Table.Cell>\n <Table.Cell>$1.2M</Table.Cell>\n <Table.Cell>+15%</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Users</Table.Cell>\n <Table.Cell>24,500</Table.Cell>\n <Table.Cell>+8%</Table.Cell>\n </Table.Row>\n </Table.Body>\n</Table>"
113
107
  },
114
108
  {
115
109
  "name": "Screen Reader Caption",
116
- "description": "Visually hidden caption for screen-reader context while keeping visual UI compact",
117
- "code": "<Table\n aria-label=\"API keys\"\n wrapperProps={{ 'data-demo': 'table-wrapper' }}\n wrapperClassName=\"demo-table-wrapper\"\n>\n <Table.Caption visuallyHidden>API keys and last-used timestamps</Table.Caption>\n <Table.Head>\n <Table.Row>\n <Table.HeaderCell>Name</Table.HeaderCell>\n <Table.HeaderCell>Prefix</Table.HeaderCell>\n <Table.HeaderCell>Last Used</Table.HeaderCell>\n </Table.Row>\n </Table.Head>\n <Table.Body>\n <Table.Row>\n <Table.Cell>Deploy</Table.Cell>\n <Table.Cell>frg_live_...</Table.Cell>\n <Table.Cell>2 hours ago</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>CI</Table.Cell>\n <Table.Cell>frg_test_...</Table.Cell>\n <Table.Cell>Yesterday</Table.Cell>\n </Table.Row>\n </Table.Body>\n</Table>"
110
+ "description": "The caption reaches screen readers only; the layout stays tight.",
111
+ "code": "<Table aria-label=\"API keys\">\n <Table.Caption visuallyHidden>API keys and last-used timestamps</Table.Caption>\n <Table.Head>\n <Table.Row>\n <Table.HeaderCell>Name</Table.HeaderCell>\n <Table.HeaderCell>Prefix</Table.HeaderCell>\n <Table.HeaderCell>Last Used</Table.HeaderCell>\n </Table.Row>\n </Table.Head>\n <Table.Body>\n <Table.Row>\n <Table.Cell>Deploy</Table.Cell>\n <Table.Cell>frg_live_...</Table.Cell>\n <Table.Cell>2 hours ago</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>CI</Table.Cell>\n <Table.Cell>frg_test_...</Table.Cell>\n <Table.Cell>Yesterday</Table.Cell>\n </Table.Row>\n </Table.Body>\n</Table>"
118
112
  },
119
113
  {
120
114
  "name": "With Footer",
121
- "description": "Table with footer row for totals",
115
+ "description": "Totals sit in a footer that stays separate from the data.",
122
116
  "code": "<Table bordered aria-label=\"Expenses\">\n <Table.Head>\n <Table.Row>\n <Table.HeaderCell>Category</Table.HeaderCell>\n <Table.HeaderCell>Amount</Table.HeaderCell>\n </Table.Row>\n </Table.Head>\n <Table.Body>\n <Table.Row>\n <Table.Cell>Marketing</Table.Cell>\n <Table.Cell>$12,000</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Engineering</Table.Cell>\n <Table.Cell>$45,000</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>Operations</Table.Cell>\n <Table.Cell>$8,000</Table.Cell>\n </Table.Row>\n </Table.Body>\n <Table.Footer>\n <Table.Row>\n <Table.Cell>Total</Table.Cell>\n <Table.Cell>$65,000</Table.Cell>\n </Table.Row>\n </Table.Footer>\n</Table>"
123
117
  }
124
118
  ],
@@ -141,23 +135,11 @@
141
135
  "wrapperClassName/wrapperProps - customize outer scroll wrapper",
142
136
  "Table.Caption - caption with visuallyHidden prop (hidden is deprecated alias)"
143
137
  ],
144
- "a11yRules": [
145
- "A11Y_TABLE_HEADERS",
146
- "A11Y_TABLE_CAPTION"
147
- ]
138
+ "a11yRules": ["A11Y_TABLE_HEADERS", "A11Y_TABLE_CAPTION"]
148
139
  },
149
140
  "ai": {
150
141
  "compositionPattern": "compound",
151
- "subComponents": [
152
- "Root",
153
- "Head",
154
- "Body",
155
- "Footer",
156
- "Row",
157
- "Cell",
158
- "HeaderCell",
159
- "Caption"
160
- ],
142
+ "subComponents": ["Root", "Head", "Body", "Footer", "Row", "Cell", "HeaderCell", "Caption"],
161
143
  "commonPatterns": [
162
144
  "<Table><Table.Head><Table.Row><Table.HeaderCell>Name</Table.HeaderCell></Table.Row></Table.Head><Table.Body><Table.Row><Table.Cell>Alice</Table.Cell></Table.Row></Table.Body></Table>"
163
145
  ]
@@ -38,6 +38,7 @@
38
38
 
39
39
  > tr {
40
40
  @include table-chrome.row;
41
+ @include high-contrast-outline;
41
42
  }
42
43
  }
43
44
 
@@ -50,7 +51,7 @@
50
51
  .headerContent {
51
52
  display: flex;
52
53
  align-items: center;
53
- gap: var(--fui-raw-space-4);
54
+ gap: var(--fui-raw-space-4, 4px);
54
55
  }
55
56
 
56
57
  .row {
@@ -62,8 +63,9 @@
62
63
  );
63
64
  --fui-table-row-bg: var(--fui-table-row-base-bg);
64
65
 
65
- background-color: var(--fui-table-row-bg);
66
+ background-color: var(--fui-table-row-bg, var(--fui-bg-primary, #{$fui-bg-primary}));
66
67
  transition: background-color var(--fui-transition-fast, $fui-transition-fast);
68
+ @include high-contrast-outline;
67
69
 
68
70
  &:last-child {
69
71
  border-block-end: 0;
@@ -78,6 +80,17 @@
78
80
  @include table-chrome.body-cell;
79
81
  }
80
82
 
83
+ // Unbordered ledger edge: the first column starts at the surrounding surface's
84
+ // own inset so a table inside a card reads as part of the card, not a box within
85
+ // a box. A bordered table owns its frame and keeps the recipe's inline inset.
86
+ .wrapper:not(.bordered) > .table {
87
+ > .thead > .row > .th:first-child,
88
+ > .tbody > .row > .td:first-child,
89
+ > .tfoot > .row > .td:first-child {
90
+ padding-inline-start: 0;
91
+ }
92
+ }
93
+
81
94
  .selected {
82
95
  --fui-table-row-bg: var(
83
96
  --fui-table-row-selected-bg,
@@ -85,19 +98,20 @@
85
98
  );
86
99
 
87
100
  .td:first-child {
88
- box-shadow: inset var(--fui-table-divider-size) 0 0
89
- var(--fui-table-row-selected-border, var(--fui-border-strong, #{$fui-border-strong}));
101
+ box-shadow: inset var(--fui-table-divider-size, var(--fui-stroke-hairline, #{$fui-stroke-hairline}))
102
+ 0 0 var(--fui-table-row-selected-border, var(--fui-border-strong, #{$fui-border-strong}));
90
103
  }
91
104
 
92
105
  &:dir(rtl) .td:first-child {
93
- box-shadow: inset calc(-1 * var(--fui-table-divider-size)) 0 0
106
+ box-shadow: inset
107
+ calc(-1 * var(--fui-table-divider-size, var(--fui-stroke-hairline, #{$fui-stroke-hairline}))) 0 0
94
108
  var(--fui-table-row-selected-border, var(--fui-border-strong, #{$fui-border-strong}));
95
109
  }
96
110
  }
97
111
 
98
112
  .tfoot {
99
- border-block-start: var(--fui-table-divider-size) solid
100
- var(--fui-table-header-border, var(--fui-border, #{$fui-border}));
113
+ border-block-start: var(--fui-table-divider-size, var(--fui-stroke-hairline, #{$fui-stroke-hairline}))
114
+ solid var(--fui-table-header-border, var(--fui-border, #{$fui-border}));
101
115
  }
102
116
 
103
117
  .striped {
@@ -112,19 +126,13 @@
112
126
  }
113
127
 
114
128
  .bordered {
115
- overflow: hidden;
116
- border: var(--fui-table-divider-size, var(--fui-stroke-hairline)) solid
129
+ overflow-x: auto;
130
+ overflow-y: hidden;
131
+ border: var(--fui-table-divider-size, var(--fui-stroke-hairline, $fui-stroke-hairline)) solid
117
132
  var(--fui-table-border, var(--fui-border, #{$fui-border}));
118
133
  border-radius: var(--fui-radius-md, $fui-radius-md);
119
134
  }
120
135
 
121
- @media (prefers-contrast: more) {
122
- .row,
123
- .thead > tr {
124
- border-block-end-color: CanvasText;
125
- }
126
- }
127
-
128
136
  @media (prefers-reduced-motion: reduce) {
129
137
  .row {
130
138
  transition: none;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "TableOfContents",
4
- "description": "Sticky sidebar navigation for long-form content or filterable lists. Renders a quiet, flush index with nested indentation and an ink-weight active state.",
4
+ "description": "Indexes a long page and marks the section currently in view.",
5
5
  "category": "navigation",
6
6
  "tags": [
7
7
  "toc",
@@ -20,7 +20,8 @@
20
20
  "children: node (required)",
21
21
  "label: string (default: Table of contents)",
22
22
  "title: string (default: On This Page)",
23
- "hideTitle: boolean (default: false)"
23
+ "hideTitle: boolean (default: false)",
24
+ "hideSubItems: boolean (default: false)"
24
25
  ],
25
26
  "props": {
26
27
  "children": {
@@ -45,28 +46,34 @@
45
46
  "description": "Hide the visible title",
46
47
  "default": "false",
47
48
  "required": false
49
+ },
50
+ "hideSubItems": {
51
+ "type": "boolean",
52
+ "description": "Hide indented items and nested groups",
53
+ "default": "false",
54
+ "required": false
48
55
  }
49
56
  },
50
57
  "usage": {
51
58
  "when": [
52
- "Long-form content pages (docs, blog posts, articles)",
53
- "Component documentation with multiple sections",
54
- "Filterable list sidebars where items are grouped by category",
55
- "Any page with 3+ headings or nested sections that benefit from quick navigation"
59
+ "Docs, articles, and other long reads",
60
+ "Reference pages with many sections",
61
+ "Filterable sidebars grouped by category",
62
+ "Anything past three headings"
56
63
  ],
57
64
  "whenNot": [
58
- "Short pages with only 1-2 sections",
59
- "Primary site navigation (use Sidebar or Header)",
60
- "Step-by-step flows (use Stepper)"
65
+ "Pages with one or two sections",
66
+ "Site navigation (use Sidebar or Header)",
67
+ "Steps in an order (use Stepper)"
61
68
  ],
62
69
  "guidelines": [
63
- "Pair with a scroll spy hook (e.g., IntersectionObserver) to track active heading",
64
- "Use TableOfContents.Group to nest items under a labeled, optionally-collapsible parent",
65
- "The legacy `indent` boolean on Item is preserved for back-compat; prefer Group for new code",
66
- "Place in a sticky aside for best UX",
67
- "Heading IDs must match between TOC items and the actual DOM headings",
68
- "TableOfContents.Item performs smooth scrolling by default; call event.preventDefault() in onClick to override",
69
- "Group is uncontrolled (defaultOpen=true) by default; pass open + onOpenChange for controlled state"
70
+ "Drive the active item from an IntersectionObserver scroll spy",
71
+ "Sub-items show by default pass hideSubItems for a compact index",
72
+ "Group nests items under a labelled, optionally collapsible parent",
73
+ "Item ids must match the real heading ids",
74
+ "Items smooth-scroll call preventDefault() in onClick to take over",
75
+ "Group is uncontrolled and open by default; pass open and onOpenChange to drive it",
76
+ "The legacy indent boolean still works; prefer Group in new code"
70
77
  ],
71
78
  "accessibility": [
72
79
  "Uses <nav aria-label=\"Table of contents\"> for landmark navigation",
@@ -79,27 +86,32 @@
79
86
  "examples": [
80
87
  {
81
88
  "name": "Default",
82
- "description": "Basic table of contents with section links",
89
+ "description": "Sections and their subsections, indented.",
83
90
  "code": "<TableOfContents>\n <TableOfContents.Item id=\"introduction\">Introduction</TableOfContents.Item>\n <TableOfContents.Item id=\"getting-started\">Getting Started</TableOfContents.Item>\n <TableOfContents.Item id=\"installation\" indent>Installation</TableOfContents.Item>\n <TableOfContents.Item id=\"configuration\" indent>Configuration</TableOfContents.Item>\n <TableOfContents.Item id=\"api-reference\">API Reference</TableOfContents.Item>\n <TableOfContents.Item id=\"examples\">Examples</TableOfContents.Item>\n</TableOfContents>"
84
91
  },
92
+ {
93
+ "name": "Top-level Only",
94
+ "description": "Drops subsections when the index would crowd.",
95
+ "code": "<TableOfContents hideSubItems>\n <TableOfContents.Item id=\"overview\">Overview</TableOfContents.Item>\n <TableOfContents.Item id=\"basic-usage\" indent>Basic usage</TableOfContents.Item>\n <TableOfContents.Item id=\"advanced-usage\" indent>Advanced usage</TableOfContents.Item>\n <TableOfContents.Item id=\"accessibility\">Accessibility</TableOfContents.Item>\n</TableOfContents>"
96
+ },
85
97
  {
86
98
  "name": "Nested Groups",
87
- "description": "Filterable list grouped by category with clear nested indentation",
99
+ "description": "Collapsible categories with counts.",
88
100
  "code": "<TableOfContents title=\"Components\">\n <TableOfContents.Item id=\"all\" active>All</TableOfContents.Item>\n <TableOfContents.Group label=\"Primitives\" trailing={<span>3</span>}>\n <TableOfContents.Item id=\"button\">Button</TableOfContents.Item>\n <TableOfContents.Item id=\"card\">Card</TableOfContents.Item>\n <TableOfContents.Item id=\"input\">Input</TableOfContents.Item>\n </TableOfContents.Group>\n <TableOfContents.Group label=\"Custom\" defaultOpen={false}>\n <TableOfContents.Item id=\"features\">Features</TableOfContents.Item>\n <TableOfContents.Item id=\"plans\">Plans</TableOfContents.Item>\n </TableOfContents.Group>\n</TableOfContents>"
89
101
  },
90
102
  {
91
103
  "name": "With Active Item",
92
- "description": "Active state highlighting the current section",
104
+ "description": "The current section stays marked while you read.",
93
105
  "code": "<TableOfContents>\n <TableOfContents.Item id=\"overview\">Overview</TableOfContents.Item>\n <TableOfContents.Item id=\"setup\" active>Setup</TableOfContents.Item>\n <TableOfContents.Item id=\"usage\" indent>Basic Usage</TableOfContents.Item>\n <TableOfContents.Item id=\"advanced\" indent>Advanced</TableOfContents.Item>\n <TableOfContents.Item id=\"props\">Props</TableOfContents.Item>\n <TableOfContents.Item id=\"accessibility\">Accessibility</TableOfContents.Item>\n</TableOfContents>"
94
106
  },
95
107
  {
96
108
  "name": "Custom Title",
97
- "description": "Table of contents with a custom title",
109
+ "description": "Any heading in place of the default.",
98
110
  "code": "<TableOfContents title=\"Contents\">\n <TableOfContents.Item id=\"chapter-1\">Chapter 1: The Beginning</TableOfContents.Item>\n <TableOfContents.Item id=\"chapter-2\">Chapter 2: The Middle</TableOfContents.Item>\n <TableOfContents.Item id=\"chapter-3\">Chapter 3: The End</TableOfContents.Item>\n</TableOfContents>"
99
111
  },
100
112
  {
101
113
  "name": "No Title",
102
- "description": "Table of contents without a visible title",
114
+ "description": "Bare list where the surrounding layout already says enough.",
103
115
  "code": "<TableOfContents hideTitle>\n <TableOfContents.Item id=\"section-a\">Section A</TableOfContents.Item>\n <TableOfContents.Item id=\"section-b\" active>Section B</TableOfContents.Item>\n <TableOfContents.Item id=\"section-c\">Section C</TableOfContents.Item>\n</TableOfContents>"
104
116
  }
105
117
  ],
@@ -124,6 +136,7 @@
124
136
  "propsSummary": [
125
137
  "title: string - visible heading (default \"On This Page\")",
126
138
  "hideTitle: boolean - hide the title",
139
+ "hideSubItems: boolean - hide indented items and nested groups (default false)",
127
140
  "label: string - aria-label for nav landmark",
128
141
  "TableOfContents.Item id: string - heading ID to link to",
129
142
  "TableOfContents.Item active: boolean - highlight the current item with ink and weight",