@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
@@ -1,3 +1,4 @@
1
+ @use "../../tokens/measurements.generated" as measurements;
1
2
  @use "../../tokens/variables" as *;
2
3
  @use "../../tokens/mixins" as *;
3
4
  @use "../../recipes/navigation" as navigation;
@@ -10,19 +11,24 @@
10
11
  }
11
12
 
12
13
  .title {
13
- margin: 0 0 var(--fui-space-2, $fui-space-2);
14
- padding: 0 var(--fui-space-2, $fui-space-2);
14
+ @include navigation.properties;
15
+
16
+ margin: 0 0 var(--fui-space-2, #{$fui-space-2});
17
+ // Same inline inset as `.link` (navigation.row) so the label and the index
18
+ // share one left edge — extra title padding made "On This Page" sit inward
19
+ // of the items below it.
20
+ padding-inline: var(--fui-navigation-inline-inset, #{navigation.gutter()});
15
21
  }
16
22
 
17
23
  // The quiet index is flush; links and group headers share the title inset.
18
24
  .list {
19
25
  list-style: none;
20
- margin: 0;
21
- padding: 0;
26
+ margin: var(--fui-raw-space-0, #{measurements.raw-space(0)});
27
+ padding: var(--fui-raw-space-0, #{measurements.raw-space(0)});
22
28
  position: relative;
23
29
  display: flex;
24
30
  flex-direction: column;
25
- gap: var(--fui-stroke-hairline, 1px);
31
+ gap: var(--fui-stroke-hairline, #{$fui-stroke-hairline});
26
32
  }
27
33
 
28
34
  // ============================================
@@ -48,7 +54,7 @@
48
54
  color var(--fui-transition-fast, $fui-transition-fast);
49
55
 
50
56
  &:hover {
51
- background-color: var(--fui-bg-hover, $fui-bg-hover);
57
+ background-color: var(--fui-bg-hover, #{$fui-bg-hover});
52
58
  color: var(--fui-text-primary, $fui-text-primary);
53
59
  }
54
60
 
@@ -61,7 +67,7 @@
61
67
  // flush with the title and group headers.
62
68
  [data-depth="1"] .link {
63
69
  margin-left: var(--fui-space-2, $fui-space-2);
64
- padding-inline-start: var(--fui-raw-space-16, 16px);
70
+ padding-inline-start: var(--fui-raw-space-16, #{measurements.raw-space(16)});
65
71
  }
66
72
 
67
73
  .linkLabel {
@@ -107,7 +113,6 @@
107
113
  width: 100%;
108
114
  border-radius: var(--fui-radius-md, $fui-radius-md);
109
115
  color: var(--fui-text-tertiary, $fui-text-tertiary);
110
- text-transform: uppercase;
111
116
  background: transparent;
112
117
  border: 0;
113
118
  text-align: left;
@@ -122,7 +127,7 @@
122
127
  color var(--fui-transition-fast, $fui-transition-fast);
123
128
 
124
129
  &:hover {
125
- background-color: var(--fui-bg-hover, $fui-bg-hover);
130
+ background-color: var(--fui-bg-hover, #{$fui-bg-hover});
126
131
  color: var(--fui-text-secondary, $fui-text-secondary);
127
132
  }
128
133
 
@@ -142,12 +147,12 @@
142
147
  width: var(--fui-icon-xs, $fui-icon-xs);
143
148
  height: var(--fui-icon-xs, $fui-icon-xs);
144
149
  color: inherit;
145
- opacity: 0.7;
150
+ opacity: var(--fui-opacity-muted, #{$fui-opacity-muted});
146
151
  transition: transform var(--fui-transition-fast, $fui-transition-fast);
147
152
 
148
153
  svg {
149
- width: var(--fui-raw-space-10, 10px);
150
- height: var(--fui-raw-space-10, 10px);
154
+ width: var(--fui-raw-space-10, #{measurements.raw-space(10)});
155
+ height: var(--fui-raw-space-10, #{measurements.raw-space(10)});
151
156
  }
152
157
 
153
158
  &[data-open] {
@@ -169,5 +174,4 @@
169
174
  .groupChevron {
170
175
  transition: none;
171
176
  }
172
-
173
177
  }
@@ -16,6 +16,8 @@ export interface TableOfContentsProps extends React.HTMLAttributes<HTMLElement>
16
16
  title?: string;
17
17
  /** Hide the title */
18
18
  hideTitle?: boolean;
19
+ /** Hide indented items and nested groups. Defaults to false. */
20
+ hideSubItems?: boolean;
19
21
  }
20
22
 
21
23
  export interface TableOfContentsItemProps extends Omit<
@@ -63,9 +65,10 @@ export interface TableOfContentsGroupProps {
63
65
 
64
66
  interface TocContextValue {
65
67
  depth: number;
68
+ hideSubItems: boolean;
66
69
  }
67
70
 
68
- const TocContext = React.createContext<TocContextValue>({ depth: 0 });
71
+ const TocContext = React.createContext<TocContextValue>({ depth: 0, hideSubItems: false });
69
72
 
70
73
  // ============================================
71
74
  // Icons
@@ -95,6 +98,7 @@ function TableOfContentsRoot({
95
98
  label = "Table of contents",
96
99
  title = "On This Page",
97
100
  hideTitle = false,
101
+ hideSubItems = false,
98
102
  className,
99
103
  "aria-label": ariaLabel,
100
104
  ...htmlProps
@@ -104,11 +108,11 @@ function TableOfContentsRoot({
104
108
  return (
105
109
  <nav {...htmlProps} aria-label={ariaLabel ?? label} className={classes}>
106
110
  {!hideTitle && (
107
- <Text as="p" variant="section-label" className={styles.title}>
111
+ <Text as="p" role="section-label" className={styles.title}>
108
112
  {title}
109
113
  </Text>
110
114
  )}
111
- <TocContext.Provider value={{ depth: 0 }}>
115
+ <TocContext.Provider value={{ depth: 0, hideSubItems }}>
112
116
  <ul className={styles.list}>{children}</ul>
113
117
  </TocContext.Provider>
114
118
  </nav>
@@ -124,22 +128,29 @@ function TableOfContentsItem({
124
128
  trailing,
125
129
  className,
126
130
  onClick,
127
- href: _href,
131
+ href,
128
132
  ...htmlProps
129
133
  }: TableOfContentsItemProps) {
130
- const { depth } = React.useContext(TocContext);
134
+ const { depth, hideSubItems } = React.useContext(TocContext);
131
135
  const effectiveDepth = depth > 0 ? depth : indent ? 1 : 0;
132
136
 
137
+ if (hideSubItems && effectiveDepth > 0) return null;
138
+
133
139
  const linkClasses = [styles.link, active && styles.active, className].filter(Boolean).join(" ");
134
140
 
135
141
  const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {
136
142
  onClick?.(e);
137
- if (e.defaultPrevented) return;
143
+ // An explicit href is a route, not an in-page anchor: let the browser
144
+ // (or a wrapping router link) own navigation.
145
+ if (e.defaultPrevented || href) return;
138
146
 
139
147
  e.preventDefault();
140
148
  const el = document.getElementById(id);
141
149
  if (el) {
142
- el.scrollIntoView({ behavior: "smooth" });
150
+ const prefersReducedMotion =
151
+ typeof window.matchMedia === "function" &&
152
+ window.matchMedia("(prefers-reduced-motion: reduce)").matches;
153
+ el.scrollIntoView({ behavior: prefersReducedMotion ? "auto" : "smooth" });
143
154
  window.history.replaceState(null, "", `#${id}`);
144
155
  }
145
156
  };
@@ -148,7 +159,7 @@ function TableOfContentsItem({
148
159
  <li className={styles.item} data-depth={effectiveDepth} data-active={active || undefined}>
149
160
  <a
150
161
  {...htmlProps}
151
- href={`#${id}`}
162
+ href={href ?? `#${id}`}
152
163
  className={linkClasses}
153
164
  onClick={handleClick}
154
165
  aria-current={active ? "location" : undefined}
@@ -194,9 +205,11 @@ function TableOfContentsGroup({
194
205
  disabled = false,
195
206
  active = false,
196
207
  }: TableOfContentsGroupProps) {
197
- const { depth } = React.useContext(TocContext);
208
+ const { depth, hideSubItems } = React.useContext(TocContext);
198
209
  const [open, setOpen] = useControlledOpen(controlledOpen, defaultOpen, onOpenChange);
199
210
 
211
+ if (hideSubItems) return null;
212
+
200
213
  const isToggleable = collapsible && !disabled;
201
214
  const isOpen = isToggleable ? open : true;
202
215
 
@@ -237,7 +250,11 @@ function TableOfContentsGroup({
237
250
  <div className={headerClasses}>{headerContent}</div>
238
251
  )}
239
252
  </li>
240
- {isOpen && <TocContext.Provider value={{ depth: depth + 1 }}>{children}</TocContext.Provider>}
253
+ {isOpen && (
254
+ <TocContext.Provider value={{ depth: depth + 1, hideSubItems }}>
255
+ {children}
256
+ </TocContext.Provider>
257
+ )}
241
258
  </>
242
259
  );
243
260
  }
@@ -1,14 +1,9 @@
1
1
  {
2
2
  "$schema": "https://usefragments.com/schemas/contract.v1.json",
3
3
  "name": "Tabs",
4
- "description": "Organize content into switchable panels. Use for related content that benefits from a compact, navigable layout.",
4
+ "description": "Swaps between sibling panels without leaving the page.",
5
5
  "category": "navigation",
6
- "tags": [
7
- "tabs",
8
- "navigation",
9
- "panels",
10
- "content-switcher"
11
- ],
6
+ "tags": ["tabs", "navigation", "panels", "content-switcher"],
12
7
  "status": "stable",
13
8
  "sourcePath": "src/components/Tabs/index.tsx",
14
9
  "exportName": "Tabs",
@@ -18,7 +13,7 @@
18
13
  "value: string",
19
14
  "onValueChange: function",
20
15
  "orientation: horizontal|vertical (default: horizontal)",
21
- "variant: underline|pills (default: underline)"
16
+ "variant: ghost|soft (default: ghost)"
22
17
  ],
23
18
  "props": {
24
19
  "children": {
@@ -46,41 +41,35 @@
46
41
  "description": "Tab list orientation",
47
42
  "default": "horizontal",
48
43
  "required": false,
49
- "values": [
50
- "horizontal",
51
- "vertical"
52
- ]
44
+ "values": ["horizontal", "vertical"]
53
45
  },
54
46
  "variant": {
55
47
  "type": "enum",
56
- "description": "Default visual style for Tabs.List (can be overridden on Tabs.List)",
57
- "default": "underline",
48
+ "description": "Default chrome for Tabs.List (can be overridden on Tabs.List): ghost draws a rule under the active tab, soft is a filled rail with a selected segment",
49
+ "default": "ghost",
58
50
  "required": false,
59
- "values": [
60
- "underline",
61
- "pills"
62
- ]
51
+ "values": ["ghost", "soft"]
63
52
  }
64
53
  },
65
54
  "usage": {
66
55
  "when": [
67
- "Organizing related content into sections",
68
- "Reducing page scrolling by grouping content",
69
- "Settings pages with multiple categories",
70
- "Dashboard views with different data perspectives"
56
+ "Sibling sections of equal weight",
57
+ "Cutting scroll on a long page",
58
+ "Settings split by category",
59
+ "One data set seen several ways"
71
60
  ],
72
61
  "whenNot": [
73
- "Primary navigation (use sidebar or header nav)",
74
- "Sequential steps (use Stepper or wizard)",
75
- "Comparing content side-by-side",
76
- "Very long lists of options (use Select or Menu)"
62
+ "Moving between pages (use Sidebar or header navigation)",
63
+ "Steps in an order (use Stepper)",
64
+ "Content the user compares side by side",
65
+ "More options than fit in a row (use Select)"
77
66
  ],
78
67
  "guidelines": [
79
- "Keep tab labels short (1-2 words)",
80
- "Order tabs by usage frequency or logical sequence",
81
- "Avoid more than 5-6 tabs; consider sub-navigation for more",
82
- "Tab content should be roughly equivalent in scope",
83
- "Use pills variant for contained sections, underline for page-level tabs"
68
+ "One or two words per label",
69
+ "Order by how often each panel is used",
70
+ "Past five or six tabs, split the page instead",
71
+ "Keep panels comparable in depth",
72
+ "Soft rails inside cards, ghost at page level"
84
73
  ],
85
74
  "accessibility": [
86
75
  "Keyboard navigation with arrow keys",
@@ -90,24 +79,24 @@
90
79
  },
91
80
  "examples": [
92
81
  {
93
- "name": "Underline",
94
- "description": "Default underline style tabs",
95
- "code": "<Tabs defaultValue=\"overview\" variant=\"underline\">\n <Tabs.List>\n <Tabs.Tab value=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab value=\"analytics\">Analytics</Tabs.Tab>\n <Tabs.Tab value=\"settings\">Settings</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"overview\">\n <p>Overview content goes here.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"analytics\">\n <p>Analytics content goes here.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"settings\">\n <p>Settings content goes here.</p>\n </Tabs.Panel>\n</Tabs>"
82
+ "name": "Ghost",
83
+ "description": "A rule tracks the active panel.",
84
+ "code": "<Tabs defaultValue=\"overview\" variant=\"ghost\">\n <Tabs.List>\n <Tabs.Tab value=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab value=\"analytics\">Analytics</Tabs.Tab>\n <Tabs.Tab value=\"settings\">Settings</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"overview\">\n <p>Overview content goes here.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"analytics\">\n <p>Analytics content goes here.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"settings\">\n <p>Settings content goes here.</p>\n </Tabs.Panel>\n</Tabs>"
96
85
  },
97
86
  {
98
- "name": "Pills",
99
- "description": "Pill-style tabs for contained sections",
100
- "code": "<Tabs defaultValue=\"all\" variant=\"pills\">\n <Tabs.List>\n <Tabs.Tab value=\"all\">All</Tabs.Tab>\n <Tabs.Tab value=\"active\">Active</Tabs.Tab>\n <Tabs.Tab value=\"archived\">Archived</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"all\">\n <p>Showing all items.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"active\">\n <p>Showing active items only.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"archived\">\n <p>Showing archived items.</p>\n </Tabs.Panel>\n</Tabs>"
87
+ "name": "Soft",
88
+ "description": "A filled rail suits panels inside a card.",
89
+ "code": "<Tabs defaultValue=\"all\" variant=\"soft\">\n <Tabs.List>\n <Tabs.Tab value=\"all\">All</Tabs.Tab>\n <Tabs.Tab value=\"active\">Active</Tabs.Tab>\n <Tabs.Tab value=\"archived\">Archived</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"all\">\n <p>Showing all items.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"active\">\n <p>Showing active items only.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"archived\">\n <p>Showing archived items.</p>\n </Tabs.Panel>\n</Tabs>"
101
90
  },
102
91
  {
103
92
  "name": "With Disabled",
104
- "description": "Tabs with a disabled option",
105
- "code": "<Tabs defaultValue=\"general\" variant=\"underline\">\n <Tabs.List>\n <Tabs.Tab value=\"general\">General</Tabs.Tab>\n <Tabs.Tab value=\"security\">Security</Tabs.Tab>\n <Tabs.Tab value=\"billing\" disabled>Billing</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"general\">\n <p>General settings panel.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"security\">\n <p>Security settings panel.</p>\n </Tabs.Panel>\n</Tabs>"
93
+ "description": "An unavailable panel stays visible but unreachable.",
94
+ "code": "<Tabs defaultValue=\"general\" variant=\"ghost\">\n <Tabs.List>\n <Tabs.Tab value=\"general\">General</Tabs.Tab>\n <Tabs.Tab value=\"security\">Security</Tabs.Tab>\n <Tabs.Tab value=\"billing\" disabled>Billing</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"general\">\n <p>General settings panel.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"security\">\n <p>Security settings panel.</p>\n </Tabs.Panel>\n</Tabs>"
106
95
  },
107
96
  {
108
97
  "name": "List Variant Override",
109
- "description": "Tabs sets a default variant, and Tabs.List can override it per list",
110
- "code": "<Tabs defaultValue=\"overview\" variant=\"pills\">\n <Tabs.List variant=\"underline\">\n <Tabs.Tab value=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab value=\"activity\">Activity</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"overview\">\n <p>Root sets pills, but this list overrides to underline.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"activity\">\n <p>Per-list variant override example.</p>\n </Tabs.Panel>\n</Tabs>"
98
+ "description": "One list can opt out of the root's style.",
99
+ "code": "<Tabs defaultValue=\"overview\" variant=\"soft\">\n <Tabs.List variant=\"ghost\">\n <Tabs.Tab value=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab value=\"activity\">Activity</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"overview\">\n <p>Root sets soft, but this list overrides to ghost.</p>\n </Tabs.Panel>\n <Tabs.Panel value=\"activity\">\n <p>Per-list variant override example.</p>\n </Tabs.Panel>\n</Tabs>"
111
100
  }
112
101
  ],
113
102
  "relations": [
@@ -127,25 +116,15 @@
127
116
  "value: string - controlled active tab",
128
117
  "defaultValue: string - initial active tab",
129
118
  "onValueChange: (value) => void - tab change handler",
130
- "variant: underline|pills - default style for Tabs.List",
131
- "Tabs.List variant?: underline|pills - optional per-list override"
119
+ "variant: ghost|soft - default chrome for Tabs.List",
120
+ "Tabs.List variant?: ghost|soft - optional per-list override"
132
121
  ],
133
- "a11yRules": [
134
- "A11Y_TABS_KEYBOARD",
135
- "A11Y_TABS_LABELS"
136
- ]
122
+ "a11yRules": ["A11Y_TABS_KEYBOARD", "A11Y_TABS_LABELS"]
137
123
  },
138
124
  "ai": {
139
125
  "compositionPattern": "compound",
140
- "subComponents": [
141
- "List",
142
- "Tab",
143
- "Panel"
144
- ],
145
- "requiredChildren": [
146
- "List",
147
- "Panel"
148
- ],
126
+ "subComponents": ["List", "Tab", "Panel"],
127
+ "requiredChildren": ["List", "Panel"],
149
128
  "commonPatterns": [
150
129
  "<Tabs defaultValue=\"tab1\"><Tabs.List><Tabs.Tab value=\"tab1\">{label1}</Tabs.Tab><Tabs.Tab value=\"tab2\">{label2}</Tabs.Tab></Tabs.List><Tabs.Panel value=\"tab1\">{content1}</Tabs.Panel><Tabs.Panel value=\"tab2\">{content2}</Tabs.Panel></Tabs>"
151
130
  ]
@@ -1,5 +1,6 @@
1
1
  @use "../../tokens/variables" as *;
2
2
  @use "../../tokens/mixins" as *;
3
+ @use "../../tokens/measurements.generated" as measurements;
3
4
  @use "../../recipes/layout";
4
5
  @use "../../recipes/segmented";
5
6
 
@@ -14,37 +15,39 @@
14
15
  }
15
16
  }
16
17
 
17
- // Tab list container
18
+ // Tab list container (ghost: a rule under the row, the indicator tracks the active tab)
18
19
  .list {
19
20
  position: relative;
20
21
  display: flex;
21
22
  align-items: center;
22
23
  gap: layout.gap("xs");
23
- border-bottom: var(--fui-stroke-hairline, 1px) solid var(--fui-border, $fui-border);
24
+ border-bottom: var(--fui-stroke-hairline, #{$fui-stroke-hairline}) solid
25
+ var(--fui-border, $fui-border);
24
26
  padding-inline: layout.gap("xs");
25
27
 
26
28
  &[data-orientation="vertical"] {
27
29
  flex-direction: column;
28
30
  align-items: stretch;
29
31
  border-bottom: none;
30
- border-right: var(--fui-stroke-hairline, 1px) solid var(--fui-border, $fui-border);
32
+ border-right: var(--fui-stroke-hairline, #{$fui-stroke-hairline}) solid
33
+ var(--fui-border, $fui-border);
31
34
  padding-block: layout.gap("xs");
32
- padding-inline: 0;
35
+ padding-inline: var(--fui-raw-space-0, #{measurements.raw-space(0)});
33
36
  }
34
37
  }
35
38
 
36
- // Variant: pills (shadcn-style with background container)
37
- .listPills {
39
+ // Variant: soft (filled rail with a selected segment)
40
+ .listSoft {
38
41
  border-bottom: none;
39
42
  border: 0;
40
43
  background-color: var(
41
44
  --fui-tabs-pills-bg,
42
45
  color-mix(in srgb, var(--fui-text-primary, #{$fui-text-primary}) 5%, transparent)
43
46
  );
44
- border-radius: var(--fui-radius-lg, $fui-radius-lg);
45
- padding: 0;
46
- gap: 0;
47
- box-shadow: inset 0 0 0 1px
47
+ border-radius: var(--fui-radius-l1, $fui-radius-l1);
48
+ padding: var(--fui-raw-space-0, #{measurements.raw-space(0)});
49
+ gap: var(--fui-raw-space-0, #{measurements.raw-space(0)});
50
+ box-shadow: inset 0 0 0 var(--fui-stroke-hairline, #{$fui-stroke-hairline})
48
51
  var(
49
52
  --fui-tabs-pills-border,
50
53
  color-mix(in srgb, var(--fui-border, #{$fui-border}) 72%, transparent)
@@ -52,11 +55,6 @@
52
55
  width: fit-content;
53
56
  }
54
57
 
55
- // Variant: underline (default, with indicator line)
56
- .listUnderline {
57
- // Default styles already applied to .list
58
- }
59
-
60
58
  // Individual tab button
61
59
  .tab {
62
60
  @include button-reset;
@@ -65,7 +63,7 @@
65
63
  position: relative;
66
64
  color: var(--fui-text-secondary, $fui-text-secondary);
67
65
  white-space: nowrap;
68
- border-radius: var(--fui-radius-sm, $fui-radius-sm);
66
+ border-radius: var(--fui-radius-l3, $fui-radius-l3);
69
67
 
70
68
  &:hover:not([data-disabled]) {
71
69
  color: var(--fui-text-primary, $fui-text-primary);
@@ -105,18 +103,18 @@
105
103
  }
106
104
  }
107
105
 
108
- // Tab in underline variant
109
- .tabUnderline {
110
- border-radius: 0;
106
+ // Tab in the ghost variant: the indicator carries the selection, the tab stays flat
107
+ .tabGhost {
108
+ border-radius: var(--fui-radius-none, #{$fui-radius-none});
111
109
 
112
110
  &:hover:not([data-disabled]) {
113
111
  background-color: transparent;
114
112
  }
115
113
  }
116
114
 
117
- // Tab in pills variant (shadcn-style)
118
- .tabPills {
119
- border-radius: var(--fui-radius-md, $fui-radius-md);
115
+ // Tab in the soft variant: a segment on the rail
116
+ .tabSoft {
117
+ border-radius: var(--fui-radius-l2, $fui-radius-l2);
120
118
  transition:
121
119
  background-color var(--fui-transition-fast, $fui-transition-fast),
122
120
  color var(--fui-transition-fast, $fui-transition-fast),
@@ -128,18 +126,16 @@
128
126
  }
129
127
 
130
128
  &[data-active] {
131
- background-color: var(--fui-tabs-pill-active-bg, var(--fui-bg-elevated, #{$fui-bg-elevated}));
132
- color: var(--fui-text-primary, $fui-text-primary);
133
- box-shadow: var(--fui-tabs-pill-active-shadow, none);
129
+ @include segmented-selection;
134
130
  }
135
131
  }
136
132
 
137
- // Animated indicator (underline variant)
133
+ // Animated indicator (ghost variant)
138
134
  .indicator {
139
135
  position: absolute;
140
136
  bottom: 0;
141
137
  left: 0;
142
- height: var(--fui-stroke-default, 2px);
138
+ height: var(--fui-stroke-default, #{$fui-stroke-default});
143
139
  background-color: var(--fui-color-accent, $fui-color-accent);
144
140
  border-radius: var(--fui-radius-full, $fui-radius-full);
145
141
 
@@ -155,7 +151,7 @@
155
151
  left: auto;
156
152
  right: 0;
157
153
  top: 0;
158
- width: var(--fui-stroke-default, 2px);
154
+ width: var(--fui-stroke-default, #{$fui-stroke-default});
159
155
  height: var(--active-tab-height);
160
156
  transform: translateY(var(--active-tab-top));
161
157
  }
@@ -164,7 +160,7 @@
164
160
  // Tab panel content
165
161
  .panel {
166
162
  padding-block: layout.gap("sm");
167
- padding-inline: 0;
163
+ padding-inline: var(--fui-raw-space-0, #{measurements.raw-space(0)});
168
164
  outline: none;
169
165
 
170
166
  &[data-hidden] {
@@ -174,11 +170,11 @@
174
170
  // Focus visible for keyboard navigation
175
171
  &:focus-visible {
176
172
  @include focus-ring;
177
- border-radius: var(--fui-radius-md, $fui-radius-md);
173
+ border-radius: var(--fui-radius-l2, $fui-radius-l2);
178
174
  }
179
175
  }
180
176
 
181
177
  // Panel with no padding (for custom layouts)
182
178
  .panelFlush {
183
- padding: 0;
179
+ padding: var(--fui-raw-space-0, #{measurements.raw-space(0)});
184
180
  }
@@ -10,6 +10,7 @@ import styles from "./Tabs.module.scss";
10
10
  // ============================================
11
11
 
12
12
  export type TabValue = string;
13
+ export type TabsVariant = "ghost" | "soft";
13
14
  export type TabsChangeEventDetails = Parameters<
14
15
  NonNullable<React.ComponentProps<typeof BaseTabs.Root>["onValueChange"]>
15
16
  >[1];
@@ -29,19 +30,20 @@ export interface TabsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "d
29
30
  /** Tab layout direction.
30
31
  * @default "horizontal" */
31
32
  orientation?: "horizontal" | "vertical";
32
- /** Tab list visual style (default for Tabs.List).
33
- * @default "underline" */
34
- variant?: "underline" | "pills";
33
+ /** Tab list chrome (default for Tabs.List): `ghost` draws a rule under the
34
+ * active tab, `soft` is a filled rail with a selected segment.
35
+ * @default "ghost" */
36
+ variant?: TabsVariant;
35
37
  /** Tab control size. Defaults to the component-default control size. */
36
38
  size?: ControlSize;
37
39
  }
38
40
 
39
41
  export interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {
40
42
  children: React.ReactNode;
41
- /** Tab list visual style.
42
- * @default "underline"
43
+ /** Tab list chrome.
44
+ * @default "ghost"
43
45
  * @see https://usefragments.com/components/tabs#variants */
44
- variant?: "underline" | "pills";
46
+ variant?: TabsVariant;
45
47
  /** Tab control size. Defaults to the nearest Tabs root or provider default. */
46
48
  size?: ControlSize;
47
49
  }
@@ -64,7 +66,7 @@ export interface TabsPanelProps extends React.HTMLAttributes<HTMLDivElement> {
64
66
  // Context for variant
65
67
  // ============================================
66
68
 
67
- const TabsVariantContext = React.createContext<"underline" | "pills">("underline");
69
+ const TabsVariantContext = React.createContext<TabsVariant>("ghost");
68
70
  const TabsSizeContext = React.createContext<ControlSize>("md");
69
71
 
70
72
  // ============================================
@@ -77,7 +79,7 @@ function TabsRoot({
77
79
  value,
78
80
  onValueChange,
79
81
  orientation = "horizontal",
80
- variant = "underline",
82
+ variant = "ghost",
81
83
  size: sizeProp,
82
84
  className,
83
85
  ...htmlProps
@@ -95,6 +97,7 @@ function TabsRoot({
95
97
  onValueChange={onValueChange}
96
98
  orientation={orientation}
97
99
  className={classes}
100
+ data-slot="tabs"
98
101
  >
99
102
  {children}
100
103
  </BaseTabs.Root>
@@ -108,15 +111,21 @@ function TabsList({ children, variant, size: sizeProp, className, ...htmlProps }
108
111
  const rootSize = React.useContext(TabsSizeContext);
109
112
  const size = sizeProp ?? rootSize;
110
113
  const resolvedVariant = variant ?? rootVariant;
111
- const variantClass = resolvedVariant === "pills" ? styles.listPills : styles.listUnderline;
112
- const classes = [styles.list, variantClass, className].filter(Boolean).join(" ");
114
+ const classes = [styles.list, resolvedVariant === "soft" && styles.listSoft, className]
115
+ .filter(Boolean)
116
+ .join(" ");
113
117
 
114
118
  return (
115
119
  <TabsVariantContext.Provider value={resolvedVariant}>
116
120
  <TabsSizeContext.Provider value={size}>
117
- <BaseTabs.List {...htmlProps} className={classes}>
121
+ <BaseTabs.List
122
+ {...htmlProps}
123
+ className={classes}
124
+ data-slot="tabs-list"
125
+ data-variant={resolvedVariant}
126
+ >
118
127
  {children}
119
- {resolvedVariant === "underline" && <BaseTabs.Indicator className={styles.indicator} />}
128
+ {resolvedVariant === "ghost" && <BaseTabs.Indicator className={styles.indicator} />}
120
129
  </BaseTabs.List>
121
130
  </TabsSizeContext.Provider>
122
131
  </TabsVariantContext.Provider>
@@ -126,12 +135,12 @@ function TabsList({ children, variant, size: sizeProp, className, ...htmlProps }
126
135
  function Tab({ children, value, disabled, className }: TabProps) {
127
136
  const variant = React.useContext(TabsVariantContext);
128
137
  const size = React.useContext(TabsSizeContext);
129
- const variantClass = variant === "pills" ? styles.tabPills : styles.tabUnderline;
138
+ const variantClass = variant === "soft" ? styles.tabSoft : styles.tabGhost;
130
139
  const sizeClass = size === "sm" ? styles.tabSm : size === "lg" ? styles.tabLg : styles.tabMd;
131
140
  const classes = [styles.tab, sizeClass, variantClass, className].filter(Boolean).join(" ");
132
141
 
133
142
  return (
134
- <BaseTabs.Tab value={value} disabled={disabled} className={classes}>
143
+ <BaseTabs.Tab value={value} disabled={disabled} className={classes} data-slot="tabs-tab">
135
144
  {children}
136
145
  </BaseTabs.Tab>
137
146
  );
@@ -148,7 +157,13 @@ function TabsPanel({
148
157
  const classes = [styles.panel, flush && styles.panelFlush, className].filter(Boolean).join(" ");
149
158
 
150
159
  return (
151
- <BaseTabs.Panel {...htmlProps} value={value} keepMounted={keepMounted} className={classes}>
160
+ <BaseTabs.Panel
161
+ {...htmlProps}
162
+ value={value}
163
+ keepMounted={keepMounted}
164
+ className={classes}
165
+ data-slot="tabs-panel"
166
+ >
152
167
  {children}
153
168
  </BaseTabs.Panel>
154
169
  );