@commercetools/nimbus-mcp 0.1.0 → 2.11.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 (453) hide show
  1. package/README.md +63 -14
  2. package/data/docs/route-manifest.json +10998 -0
  3. package/data/docs/routes/components-accessibility-visually-hidden.json +388 -0
  4. package/data/docs/routes/components-accessibility.json +34 -0
  5. package/data/docs/routes/components-buttons-button.json +715 -0
  6. package/data/docs/routes/components-buttons-icon-button.json +852 -0
  7. package/data/docs/routes/components-buttons-icon-toggle-button.json +594 -0
  8. package/data/docs/routes/components-buttons-split-button.json +670 -0
  9. package/data/docs/routes/components-buttons-toggle-button-group.json +722 -0
  10. package/data/docs/routes/components-buttons-toggle-button.json +689 -0
  11. package/data/docs/routes/components-buttons.json +36 -0
  12. package/data/docs/routes/components-data-display-badge.json +555 -0
  13. package/data/docs/routes/components-data-display-card.json +338 -0
  14. package/data/docs/routes/components-data-display-data-table.json +855 -0
  15. package/data/docs/routes/components-data-display-draggable-list.json +596 -0
  16. package/data/docs/routes/components-data-display-table.json +472 -0
  17. package/data/docs/routes/components-data-display-tag-group.json +535 -0
  18. package/data/docs/routes/components-data-display.json +34 -0
  19. package/data/docs/routes/components-feedback-alert.json +696 -0
  20. package/data/docs/routes/components-feedback-dialog.json +682 -0
  21. package/data/docs/routes/components-feedback-drawer.json +600 -0
  22. package/data/docs/routes/components-feedback-loading-spinner.json +415 -0
  23. package/data/docs/routes/components-feedback-progress-bar.json +661 -0
  24. package/data/docs/routes/components-feedback-toast.json +1040 -0
  25. package/data/docs/routes/components-feedback-tooltip.json +510 -0
  26. package/data/docs/routes/components-feedback.json +34 -0
  27. package/data/docs/routes/components-forms-field-errors.json +557 -0
  28. package/data/docs/routes/components-forms-form-field.json +848 -0
  29. package/data/docs/routes/components-forms-group.json +427 -0
  30. package/data/docs/routes/components-forms-localized-field.json +770 -0
  31. package/data/docs/routes/components-forms.json +37 -0
  32. package/data/docs/routes/components-inputs-calendar.json +611 -0
  33. package/data/docs/routes/components-inputs-checkbox.json +774 -0
  34. package/data/docs/routes/components-inputs-combo-box.json +761 -0
  35. package/data/docs/routes/components-inputs-date-input.json +628 -0
  36. package/data/docs/routes/components-inputs-date-picker.json +709 -0
  37. package/data/docs/routes/components-inputs-date-range-picker.json +599 -0
  38. package/data/docs/routes/components-inputs-money-input.json +721 -0
  39. package/data/docs/routes/components-inputs-multiline-text-input.json +611 -0
  40. package/data/docs/routes/components-inputs-number-input.json +647 -0
  41. package/data/docs/routes/components-inputs-password-input.json +576 -0
  42. package/data/docs/routes/components-inputs-radio-input.json +583 -0
  43. package/data/docs/routes/components-inputs-range-calendar.json +607 -0
  44. package/data/docs/routes/components-inputs-rich-text-input.json +599 -0
  45. package/data/docs/routes/components-inputs-scoped-search-input.json +570 -0
  46. package/data/docs/routes/components-inputs-search-input.json +588 -0
  47. package/data/docs/routes/components-inputs-select-input.json +960 -0
  48. package/data/docs/routes/components-inputs-switch.json +720 -0
  49. package/data/docs/routes/components-inputs-text-input.json +566 -0
  50. package/data/docs/routes/components-inputs-time-input.json +775 -0
  51. package/data/docs/routes/components-inputs.json +34 -0
  52. package/data/docs/routes/components-layout-box.json +501 -0
  53. package/data/docs/routes/components-layout-defaultpage.json +748 -0
  54. package/data/docs/routes/components-layout-flex.json +587 -0
  55. package/data/docs/routes/components-layout-grid.json +393 -0
  56. package/data/docs/routes/components-layout-modalpage.json +716 -0
  57. package/data/docs/routes/components-layout-pagecontent.json +673 -0
  58. package/data/docs/routes/components-layout-scrollarea.json +428 -0
  59. package/data/docs/routes/components-layout-separator.json +461 -0
  60. package/data/docs/routes/components-layout-simple-grid.json +519 -0
  61. package/data/docs/routes/components-layout-spacer.json +573 -0
  62. package/data/docs/routes/components-layout-stack.json +481 -0
  63. package/data/docs/routes/components-layout.json +34 -0
  64. package/data/docs/routes/components-media-avatar.json +427 -0
  65. package/data/docs/routes/components-media-icon.json +663 -0
  66. package/data/docs/routes/components-media-image.json +511 -0
  67. package/data/docs/routes/components-media-inline-svg.json +586 -0
  68. package/data/docs/routes/components-media.json +34 -0
  69. package/data/docs/routes/components-navigation-accordion.json +643 -0
  70. package/data/docs/routes/components-navigation-collapsible-motion.json +628 -0
  71. package/data/docs/routes/components-navigation-link.json +554 -0
  72. package/data/docs/routes/components-navigation-menu.json +546 -0
  73. package/data/docs/routes/components-navigation-pagination.json +502 -0
  74. package/data/docs/routes/components-navigation-steps.json +629 -0
  75. package/data/docs/routes/components-navigation-tabnav.json +546 -0
  76. package/data/docs/routes/components-navigation-tabs.json +635 -0
  77. package/data/docs/routes/components-navigation-toolbar.json +549 -0
  78. package/data/docs/routes/components-navigation.json +34 -0
  79. package/data/docs/routes/components-typography-code.json +39 -0
  80. package/data/docs/routes/components-typography-heading.json +402 -0
  81. package/data/docs/routes/components-typography-kbd.json +399 -0
  82. package/data/docs/routes/components-typography-list.json +593 -0
  83. package/data/docs/routes/components-typography-text.json +444 -0
  84. package/data/docs/routes/components-typography.json +34 -0
  85. package/data/docs/routes/components-utilities-nimbus-i18n-provider.json +295 -0
  86. package/data/docs/routes/components-utilities-nimbus-provider.json +663 -0
  87. package/data/docs/routes/components-utilities.json +34 -0
  88. package/data/docs/routes/components.json +33 -0
  89. package/data/docs/routes/home-contribute-adrs-adr0001-consumer-component-apis.json +314 -0
  90. package/data/docs/routes/home-contribute-adrs-adr0002-compound-component-extraction.json +160 -0
  91. package/data/docs/routes/home-contribute-adrs-adr0003-component-lifecycle-states.json +460 -0
  92. package/data/docs/routes/home-contribute-adrs.json +205 -0
  93. package/data/docs/routes/home-contribute-development-setup.json +213 -0
  94. package/data/docs/routes/home-contribute-stats.json +36 -0
  95. package/data/docs/routes/home-contribute.json +36 -0
  96. package/data/docs/routes/home-design-tokens-aspect-ratios.json +36 -0
  97. package/data/docs/routes/home-design-tokens-borders.json +35 -0
  98. package/data/docs/routes/home-design-tokens-colors.json +157 -0
  99. package/data/docs/routes/home-design-tokens-other-animations.json +119 -0
  100. package/data/docs/routes/home-design-tokens-other-blurs.json +36 -0
  101. package/data/docs/routes/home-design-tokens-other-breakpoints.json +61 -0
  102. package/data/docs/routes/home-design-tokens-other-cursors.json +36 -0
  103. package/data/docs/routes/home-design-tokens-other-z-indices.json +39 -0
  104. package/data/docs/routes/home-design-tokens-other.json +35 -0
  105. package/data/docs/routes/home-design-tokens-radii.json +59 -0
  106. package/data/docs/routes/home-design-tokens-shadows.json +57 -0
  107. package/data/docs/routes/home-design-tokens-sizes.json +137 -0
  108. package/data/docs/routes/home-design-tokens-spacing.json +36 -0
  109. package/data/docs/routes/home-design-tokens-typography.json +184 -0
  110. package/data/docs/routes/home-design-tokens.json +34 -0
  111. package/data/docs/routes/home-getting-started-core-concepts.json +301 -0
  112. package/data/docs/routes/home-getting-started-installation.json +621 -0
  113. package/data/docs/routes/home-getting-started-mcp-server-overview.json +139 -0
  114. package/data/docs/routes/home-getting-started-mcp-server-setup.json +316 -0
  115. package/data/docs/routes/home-getting-started-release-process.json +294 -0
  116. package/data/docs/routes/home-getting-started-testing-setup.json +296 -0
  117. package/data/docs/routes/home-playground-markdown.json +638 -0
  118. package/data/docs/routes/home-playground-toc.json +169 -0
  119. package/data/docs/routes/home-playground.json +34 -0
  120. package/data/docs/routes/home-style-props-background.json +236 -0
  121. package/data/docs/routes/home-style-props-border.json +310 -0
  122. package/data/docs/routes/home-style-props-display.json +120 -0
  123. package/data/docs/routes/home-style-props-effects.json +116 -0
  124. package/data/docs/routes/home-style-props-filters.json +396 -0
  125. package/data/docs/routes/home-style-props-flex-and-grid.json +496 -0
  126. package/data/docs/routes/home-style-props-interactivity.json +356 -0
  127. package/data/docs/routes/home-style-props-layout.json +422 -0
  128. package/data/docs/routes/home-style-props-list.json +116 -0
  129. package/data/docs/routes/home-style-props-sizing.json +244 -0
  130. package/data/docs/routes/home-style-props-spacing.json +228 -0
  131. package/data/docs/routes/home-style-props-svg.json +96 -0
  132. package/data/docs/routes/home-style-props-tables.json +116 -0
  133. package/data/docs/routes/home-style-props-transforms.json +216 -0
  134. package/data/docs/routes/home-style-props-transitions.json +216 -0
  135. package/data/docs/routes/home-style-props-typography.json +536 -0
  136. package/data/docs/routes/home-style-props.json +33 -0
  137. package/data/docs/routes/home.json +32 -0
  138. package/data/docs/routes/hooks-usecopytoclipboard.json +76 -0
  139. package/data/docs/routes/hooks-usehotkeys.json +117 -0
  140. package/data/docs/routes/hooks.json +33 -0
  141. package/data/docs/routes/icons.json +32 -0
  142. package/data/docs/routes/patterns-fields-date-range-picker-field.json +393 -0
  143. package/data/docs/routes/patterns-fields-money-input-field.json +415 -0
  144. package/data/docs/routes/patterns-fields-multiline-text-input-field.json +404 -0
  145. package/data/docs/routes/patterns-fields-number-input-field.json +470 -0
  146. package/data/docs/routes/patterns-fields-password-input-field.json +319 -0
  147. package/data/docs/routes/patterns-fields-search-input-field.json +382 -0
  148. package/data/docs/routes/patterns-fields-text-input-field.json +404 -0
  149. package/data/docs/routes/patterns-fields.json +78 -0
  150. package/data/docs/routes/patterns.json +34 -0
  151. package/data/docs/search-index.json +1 -0
  152. package/data/docs/types/Accordion.json +12 -0
  153. package/data/docs/types/AccordionContent.json +286 -0
  154. package/data/docs/types/AccordionHeader.json +891 -0
  155. package/data/docs/types/AccordionHeaderRightContent.json +27 -0
  156. package/data/docs/types/AccordionItem.json +242 -0
  157. package/data/docs/types/AccordionRoot.json +162 -0
  158. package/data/docs/types/Alert.json +12 -0
  159. package/data/docs/types/AlertActions.json +11 -0
  160. package/data/docs/types/AlertDescription.json +118 -0
  161. package/data/docs/types/AlertDismissButton.json +937 -0
  162. package/data/docs/types/AlertRoot.json +42 -0
  163. package/data/docs/types/AlertTitle.json +118 -0
  164. package/data/docs/types/Avatar.json +125 -0
  165. package/data/docs/types/Badge.json +64 -0
  166. package/data/docs/types/Body.json +67 -0
  167. package/data/docs/types/Box.json +85 -0
  168. package/data/docs/types/Button.json +1015 -0
  169. package/data/docs/types/Calendar.json +565 -0
  170. package/data/docs/types/Caption.json +67 -0
  171. package/data/docs/types/Card.json +12 -0
  172. package/data/docs/types/CardContent.json +27 -0
  173. package/data/docs/types/CardHeader.json +27 -0
  174. package/data/docs/types/CardRoot.json +106 -0
  175. package/data/docs/types/Cell.json +227 -0
  176. package/data/docs/types/Checkbox.json +897 -0
  177. package/data/docs/types/Code.json +112 -0
  178. package/data/docs/types/CollapsibleMotionContent.json +35 -0
  179. package/data/docs/types/CollapsibleMotionRoot.json +99 -0
  180. package/data/docs/types/CollapsibleMotionTrigger.json +71 -0
  181. package/data/docs/types/Column.json +101 -0
  182. package/data/docs/types/ColumnGroup.json +101 -0
  183. package/data/docs/types/ColumnHeader.json +193 -0
  184. package/data/docs/types/ComboBoxListBox.json +751 -0
  185. package/data/docs/types/ComboBoxOption.json +672 -0
  186. package/data/docs/types/ComboBoxPopover.json +786 -0
  187. package/data/docs/types/ComboBoxRoot.json +747 -0
  188. package/data/docs/types/ComboBoxSection.json +277 -0
  189. package/data/docs/types/ComboBoxTrigger.json +70 -0
  190. package/data/docs/types/Content.json +33 -0
  191. package/data/docs/types/DataTable.json +596 -0
  192. package/data/docs/types/DataTableBody.json +223 -0
  193. package/data/docs/types/DataTableFooter.json +27 -0
  194. package/data/docs/types/DataTableHeader.json +269 -0
  195. package/data/docs/types/DataTableManager.json +11 -0
  196. package/data/docs/types/DataTableRoot.json +590 -0
  197. package/data/docs/types/DataTableTable.json +271 -0
  198. package/data/docs/types/DateInput.json +792 -0
  199. package/data/docs/types/DatePicker.json +700 -0
  200. package/data/docs/types/DateRangePicker.json +936 -0
  201. package/data/docs/types/DateRangePickerField.json +1047 -0
  202. package/data/docs/types/DefaultPage.json +12 -0
  203. package/data/docs/types/DefaultPageActions.json +27 -0
  204. package/data/docs/types/DefaultPageBackLink.json +213 -0
  205. package/data/docs/types/DefaultPageContent.json +27 -0
  206. package/data/docs/types/DefaultPageFooter.json +27 -0
  207. package/data/docs/types/DefaultPageHeader.json +27 -0
  208. package/data/docs/types/DefaultPageRoot.json +106 -0
  209. package/data/docs/types/DefaultPageSubtitle.json +27 -0
  210. package/data/docs/types/DefaultPageTabNav.json +28 -0
  211. package/data/docs/types/DefaultPageTitle.json +27 -0
  212. package/data/docs/types/DialogBody.json +27 -0
  213. package/data/docs/types/DialogCloseTrigger.json +939 -0
  214. package/data/docs/types/DialogContent.json +27 -0
  215. package/data/docs/types/DialogFooter.json +27 -0
  216. package/data/docs/types/DialogHeader.json +27 -0
  217. package/data/docs/types/DialogRoot.json +138 -0
  218. package/data/docs/types/DialogTitle.json +27 -0
  219. package/data/docs/types/DialogTrigger.json +80 -0
  220. package/data/docs/types/DraggableList.json +12 -0
  221. package/data/docs/types/DraggableListField.json +894 -0
  222. package/data/docs/types/DraggableListItem.json +574 -0
  223. package/data/docs/types/DraggableListRoot.json +745 -0
  224. package/data/docs/types/Drawer.json +12 -0
  225. package/data/docs/types/DrawerBody.json +27 -0
  226. package/data/docs/types/DrawerCloseTrigger.json +939 -0
  227. package/data/docs/types/DrawerContent.json +27 -0
  228. package/data/docs/types/DrawerFooter.json +27 -0
  229. package/data/docs/types/DrawerHeader.json +27 -0
  230. package/data/docs/types/DrawerRoot.json +142 -0
  231. package/data/docs/types/DrawerTitle.json +27 -0
  232. package/data/docs/types/DrawerTrigger.json +80 -0
  233. package/data/docs/types/FieldErrors.getBuiltInMessage.json +11 -0
  234. package/data/docs/types/FieldErrors.getCustomMessage.json +9 -0
  235. package/data/docs/types/FieldErrors.json +109 -0
  236. package/data/docs/types/Flex.json +238 -0
  237. package/data/docs/types/Footer.json +67 -0
  238. package/data/docs/types/FormFieldDescription.json +11 -0
  239. package/data/docs/types/FormFieldError.json +11 -0
  240. package/data/docs/types/FormFieldInfoBox.json +27 -0
  241. package/data/docs/types/FormFieldInput.json +11 -0
  242. package/data/docs/types/FormFieldLabel.json +11 -0
  243. package/data/docs/types/FormFieldRoot.json +148 -0
  244. package/data/docs/types/Grid.json +253 -0
  245. package/data/docs/types/GridProps.json +11 -0
  246. package/data/docs/types/Group.json +143 -0
  247. package/data/docs/types/Header.json +67 -0
  248. package/data/docs/types/Heading.json +109 -0
  249. package/data/docs/types/Icon.json +112 -0
  250. package/data/docs/types/IconButton.json +1019 -0
  251. package/data/docs/types/IconToggleButton.json +787 -0
  252. package/data/docs/types/Image.json +373 -0
  253. package/data/docs/types/Indicator.json +67 -0
  254. package/data/docs/types/InlineSvg.json +98 -0
  255. package/data/docs/types/Item.json +67 -0
  256. package/data/docs/types/Kbd.json +118 -0
  257. package/data/docs/types/Link.json +380 -0
  258. package/data/docs/types/List.json +12 -0
  259. package/data/docs/types/ListIndicator.json +70 -0
  260. package/data/docs/types/ListItem.json +70 -0
  261. package/data/docs/types/ListRoot.json +124 -0
  262. package/data/docs/types/LoadingSpinner.json +87 -0
  263. package/data/docs/types/LocalizedField.json +460 -0
  264. package/data/docs/types/LocalizedStringFormatter.json +9 -0
  265. package/data/docs/types/MakeElementFocusable.json +196 -0
  266. package/data/docs/types/MenuContent.json +111 -0
  267. package/data/docs/types/MenuItem.json +671 -0
  268. package/data/docs/types/MenuRoot.json +670 -0
  269. package/data/docs/types/MenuSection.json +364 -0
  270. package/data/docs/types/MenuSubmenu.json +111 -0
  271. package/data/docs/types/MenuSubmenuTrigger.json +67 -0
  272. package/data/docs/types/MenuTrigger.json +906 -0
  273. package/data/docs/types/ModalPage.json +12 -0
  274. package/data/docs/types/ModalPageActions.json +27 -0
  275. package/data/docs/types/ModalPageContent.json +27 -0
  276. package/data/docs/types/ModalPageFooter.json +27 -0
  277. package/data/docs/types/ModalPageHeader.json +27 -0
  278. package/data/docs/types/ModalPageRoot.json +87 -0
  279. package/data/docs/types/ModalPageSubtitle.json +27 -0
  280. package/data/docs/types/ModalPageTabNav.json +28 -0
  281. package/data/docs/types/ModalPageTitle.json +27 -0
  282. package/data/docs/types/ModalPageTopBar.json +57 -0
  283. package/data/docs/types/MoneyInput.isEmpty.json +40 -0
  284. package/data/docs/types/MoneyInput.json +282 -0
  285. package/data/docs/types/MoneyInputField.json +379 -0
  286. package/data/docs/types/MoneyInputFieldProps.json +9 -0
  287. package/data/docs/types/MultilineTextInput.json +1194 -0
  288. package/data/docs/types/MultilineTextInputField.json +1269 -0
  289. package/data/docs/types/MultilineTextInputFieldProps.json +9 -0
  290. package/data/docs/types/NimbusI18nProvider.json +42 -0
  291. package/data/docs/types/NimbusI18nProviderProps.json +9 -0
  292. package/data/docs/types/NimbusProvider.json +270 -0
  293. package/data/docs/types/NumberInput.json +952 -0
  294. package/data/docs/types/NumberInputField.json +1004 -0
  295. package/data/docs/types/NumberInputFieldProps.json +9 -0
  296. package/data/docs/types/PageContent.json +11 -0
  297. package/data/docs/types/PageContentColumn.json +99 -0
  298. package/data/docs/types/PageContentRoot.json +114 -0
  299. package/data/docs/types/Pagination.json +159 -0
  300. package/data/docs/types/PasswordInput.json +1120 -0
  301. package/data/docs/types/PasswordInputField.json +1216 -0
  302. package/data/docs/types/PasswordInputFieldProps.json +9 -0
  303. package/data/docs/types/ProgressBar.json +280 -0
  304. package/data/docs/types/RadioInputOption.json +550 -0
  305. package/data/docs/types/RadioInputRoot.json +514 -0
  306. package/data/docs/types/RangeCalendar.json +618 -0
  307. package/data/docs/types/RichTextInput.json +134 -0
  308. package/data/docs/types/Root.json +122 -0
  309. package/data/docs/types/Row.json +67 -0
  310. package/data/docs/types/ScopedSearchInput.isEmpty.json +40 -0
  311. package/data/docs/types/ScopedSearchInput.json +253 -0
  312. package/data/docs/types/ScrollArea.json +179 -0
  313. package/data/docs/types/ScrollAreaElementIds.json +9 -0
  314. package/data/docs/types/ScrollAreaProps.json +9 -0
  315. package/data/docs/types/SearchInput.json +1165 -0
  316. package/data/docs/types/SearchInputField.json +1240 -0
  317. package/data/docs/types/Select.json +12 -0
  318. package/data/docs/types/SelectOption.json +572 -0
  319. package/data/docs/types/SelectOptionGroup.json +215 -0
  320. package/data/docs/types/SelectOptions.json +693 -0
  321. package/data/docs/types/SelectRoot.json +926 -0
  322. package/data/docs/types/Separator.json +65 -0
  323. package/data/docs/types/SimpleGrid.json +291 -0
  324. package/data/docs/types/Spacer.json +27 -0
  325. package/data/docs/types/SpacerProps.json +9 -0
  326. package/data/docs/types/SplitButton.json +203 -0
  327. package/data/docs/types/Stack.json +144 -0
  328. package/data/docs/types/Steps.json +12 -0
  329. package/data/docs/types/StepsChangeDetails.json +9 -0
  330. package/data/docs/types/StepsCompletedContent.json +28 -0
  331. package/data/docs/types/StepsCompletedContentProps.json +9 -0
  332. package/data/docs/types/StepsContent.json +43 -0
  333. package/data/docs/types/StepsContentProps.json +9 -0
  334. package/data/docs/types/StepsDescription.json +28 -0
  335. package/data/docs/types/StepsDescriptionProps.json +9 -0
  336. package/data/docs/types/StepsIndicator.json +28 -0
  337. package/data/docs/types/StepsIndicatorProps.json +9 -0
  338. package/data/docs/types/StepsItem.json +43 -0
  339. package/data/docs/types/StepsItemProps.json +9 -0
  340. package/data/docs/types/StepsList.json +28 -0
  341. package/data/docs/types/StepsListProps.json +9 -0
  342. package/data/docs/types/StepsNextTrigger.json +62 -0
  343. package/data/docs/types/StepsNextTriggerProps.json +9 -0
  344. package/data/docs/types/StepsNumber.json +28 -0
  345. package/data/docs/types/StepsNumberProps.json +9 -0
  346. package/data/docs/types/StepsPrevTrigger.json +62 -0
  347. package/data/docs/types/StepsPrevTriggerProps.json +9 -0
  348. package/data/docs/types/StepsRoot.json +183 -0
  349. package/data/docs/types/StepsRootProps.json +11 -0
  350. package/data/docs/types/StepsSeparator.json +28 -0
  351. package/data/docs/types/StepsSeparatorProps.json +9 -0
  352. package/data/docs/types/StepsStatus.json +57 -0
  353. package/data/docs/types/StepsStatusProps.json +9 -0
  354. package/data/docs/types/StepsTitle.json +28 -0
  355. package/data/docs/types/StepsTitleProps.json +9 -0
  356. package/data/docs/types/StepsTrigger.json +47 -0
  357. package/data/docs/types/StepsTriggerProps.json +9 -0
  358. package/data/docs/types/Switch.json +371 -0
  359. package/data/docs/types/TabListProps.json +9 -0
  360. package/data/docs/types/TabNav.json +12 -0
  361. package/data/docs/types/TabNavItem.json +300 -0
  362. package/data/docs/types/TabNavItemProps.json +9 -0
  363. package/data/docs/types/TabNavProps.json +9 -0
  364. package/data/docs/types/TabNavRoot.json +80 -0
  365. package/data/docs/types/TabPanelProps.json +9 -0
  366. package/data/docs/types/TabPanelsProps.json +9 -0
  367. package/data/docs/types/TabProps.json +9 -0
  368. package/data/docs/types/Table.json +9 -0
  369. package/data/docs/types/TableBody.json +67 -0
  370. package/data/docs/types/TableBodyProps.json +9 -0
  371. package/data/docs/types/TableCaption.json +67 -0
  372. package/data/docs/types/TableCaptionProps.json +9 -0
  373. package/data/docs/types/TableCell.json +227 -0
  374. package/data/docs/types/TableCellProps.json +9 -0
  375. package/data/docs/types/TableColumn.json +101 -0
  376. package/data/docs/types/TableColumnGroup.json +101 -0
  377. package/data/docs/types/TableColumnGroupProps.json +9 -0
  378. package/data/docs/types/TableColumnHeader.json +193 -0
  379. package/data/docs/types/TableColumnHeaderProps.json +9 -0
  380. package/data/docs/types/TableColumnProps.json +9 -0
  381. package/data/docs/types/TableFooter.json +67 -0
  382. package/data/docs/types/TableFooterProps.json +9 -0
  383. package/data/docs/types/TableHeader.json +67 -0
  384. package/data/docs/types/TableHeaderProps.json +9 -0
  385. package/data/docs/types/TableRoot.json +365 -0
  386. package/data/docs/types/TableRootProps.json +12 -0
  387. package/data/docs/types/TableRow.json +67 -0
  388. package/data/docs/types/TableRowProps.json +9 -0
  389. package/data/docs/types/TableScrollArea.json +82 -0
  390. package/data/docs/types/TableScrollAreaProps.json +9 -0
  391. package/data/docs/types/Tabs.json +12 -0
  392. package/data/docs/types/TabsList.json +110 -0
  393. package/data/docs/types/TabsPanel.json +112 -0
  394. package/data/docs/types/TabsPanels.json +108 -0
  395. package/data/docs/types/TabsRoot.json +211 -0
  396. package/data/docs/types/TabsTab.json +174 -0
  397. package/data/docs/types/TagGroup.json +12 -0
  398. package/data/docs/types/TagGroupRoot.json +306 -0
  399. package/data/docs/types/TagGroupTag.json +595 -0
  400. package/data/docs/types/TagGroupTagList.json +166 -0
  401. package/data/docs/types/Text.json +119 -0
  402. package/data/docs/types/TextInput.json +1156 -0
  403. package/data/docs/types/TextInputField.json +1263 -0
  404. package/data/docs/types/TimeInput.json +752 -0
  405. package/data/docs/types/ToastAction.json +9 -0
  406. package/data/docs/types/ToastManagerApi.json +9 -0
  407. package/data/docs/types/ToastOptions.json +9 -0
  408. package/data/docs/types/ToastOutlet.json +12 -0
  409. package/data/docs/types/ToastPlacement.json +9 -0
  410. package/data/docs/types/ToastPromiseOptions.json +9 -0
  411. package/data/docs/types/ToastType.json +9 -0
  412. package/data/docs/types/ToastVariant.json +9 -0
  413. package/data/docs/types/ToggleButton.json +789 -0
  414. package/data/docs/types/ToggleButtonGroup.json +9 -0
  415. package/data/docs/types/ToggleButtonGroupButton.json +331 -0
  416. package/data/docs/types/ToggleButtonGroupRoot.json +269 -0
  417. package/data/docs/types/Toolbar.json +176 -0
  418. package/data/docs/types/Tooltip.json +12 -0
  419. package/data/docs/types/TooltipContent.json +372 -0
  420. package/data/docs/types/TooltipRoot.json +179 -0
  421. package/data/docs/types/Trigger.json +69 -0
  422. package/data/docs/types/VisuallyHidden.json +93 -0
  423. package/data/docs/types/__object.json +12 -0
  424. package/data/docs/types/filters.json +11 -0
  425. package/data/docs/types/manifest.json +280 -0
  426. package/data/docs/types/toast.json +234 -0
  427. package/data/docs/types/useColorMode.json +13 -0
  428. package/data/docs/types/useColorModeValue.json +13 -0
  429. package/data/docs/types/useColorScheme.json +12 -0
  430. package/data/docs/types/useLocalizedStringFormatter.json +14 -0
  431. package/data/icons.json +21940 -0
  432. package/data/tokens.json +40061 -0
  433. package/dist/index.js +2516 -17
  434. package/package.json +25 -6
  435. package/dist/data-loader.d.ts +0 -102
  436. package/dist/data-loader.js +0 -104
  437. package/dist/index.d.ts +0 -13
  438. package/dist/server.d.ts +0 -9
  439. package/dist/server.js +0 -22
  440. package/dist/server.spec.d.ts +0 -1
  441. package/dist/server.spec.js +0 -69
  442. package/dist/tools/list-components.d.ts +0 -9
  443. package/dist/tools/list-components.js +0 -42
  444. package/dist/types.d.ts +0 -28
  445. package/dist/types.js +0 -4
  446. package/src/data-loader.ts +0 -226
  447. package/src/index.ts +0 -29
  448. package/src/server.spec.ts +0 -86
  449. package/src/server.ts +0 -28
  450. package/src/tools/list-components.ts +0 -49
  451. package/src/types.ts +0 -31
  452. package/tsconfig.json +0 -14
  453. package/vitest.config.ts +0 -9
@@ -0,0 +1,635 @@
1
+ {
2
+ "meta": {
3
+ "id": "Components-Tabs",
4
+ "title": "Tabs",
5
+ "exportName": "Tabs",
6
+ "description": "Organizes content into distinct sections, enabling users to switch views within a single container.",
7
+ "lifecycleState": "Stable",
8
+ "order": 999,
9
+ "repoPath": "packages/nimbus/src/components/tabs/tabs.mdx",
10
+ "menu": [
11
+ "Components",
12
+ "Navigation",
13
+ "Tabs"
14
+ ],
15
+ "route": "components/navigation/tabs",
16
+ "tags": [
17
+ "component",
18
+ "navigation",
19
+ "tabs"
20
+ ],
21
+ "toc": [
22
+ {
23
+ "value": "Overview",
24
+ "href": "#overview",
25
+ "depth": 2,
26
+ "numbering": [
27
+ 1,
28
+ 1
29
+ ],
30
+ "parent": "root"
31
+ },
32
+ {
33
+ "value": "Resources",
34
+ "href": "#resources",
35
+ "depth": 3,
36
+ "numbering": [
37
+ 1,
38
+ 1,
39
+ 1
40
+ ],
41
+ "parent": "root"
42
+ },
43
+ {
44
+ "value": "Tabs vs TabNav",
45
+ "href": "#tabs-vs-tabnav",
46
+ "depth": 2,
47
+ "numbering": [
48
+ 1,
49
+ 2
50
+ ],
51
+ "parent": "root"
52
+ },
53
+ {
54
+ "value": "Variables",
55
+ "href": "#variables",
56
+ "depth": 2,
57
+ "numbering": [
58
+ 1,
59
+ 3
60
+ ],
61
+ "parent": "root"
62
+ },
63
+ {
64
+ "value": "Direction for tabs",
65
+ "href": "#direction-for-tabs",
66
+ "depth": 3,
67
+ "numbering": [
68
+ 1,
69
+ 3,
70
+ 1
71
+ ],
72
+ "parent": "root"
73
+ },
74
+ {
75
+ "value": "Horizontal tabs",
76
+ "href": "#horizontal-tabs",
77
+ "depth": 4,
78
+ "numbering": [
79
+ 1,
80
+ 3,
81
+ 1,
82
+ 1
83
+ ],
84
+ "parent": "root"
85
+ },
86
+ {
87
+ "value": "Vertical tabs",
88
+ "href": "#vertical-tabs",
89
+ "depth": 4,
90
+ "numbering": [
91
+ 1,
92
+ 3,
93
+ 1,
94
+ 2
95
+ ],
96
+ "parent": "root"
97
+ }
98
+ ],
99
+ "figmaLink": "https://www.figma.com/design/AvtPX6g7OGGCRvNlatGOIY/NIMBUS-design-system?node-id=8571-34966&m=dev",
100
+ "layout": "app-frame",
101
+ "tabs": [
102
+ {
103
+ "key": "overview",
104
+ "title": "Overview",
105
+ "order": 0
106
+ },
107
+ {
108
+ "key": "guidelines",
109
+ "title": "Guidelines",
110
+ "order": 2
111
+ },
112
+ {
113
+ "key": "dev",
114
+ "title": "Implementation",
115
+ "order": 3
116
+ },
117
+ {
118
+ "key": "a11y",
119
+ "title": "Accessibility",
120
+ "order": 4
121
+ }
122
+ ]
123
+ },
124
+ "mdx": "\n## Overview\n\nTabs are a navigational component used to organize and switch between different\nsections of content within the same contextual view, allowing users to access\nmultiple related pages or views without navigating away from the main screen.\n\n### Resources\n\nDeep dive into implementation details and access the Nimbus design library.\n\n[Figma library](https://www.figma.com/design/AvtPX6g7OGGCRvNlatGOIY/NIMBUS-design-system?node-id=8571-34966&m=dev)\n[React Aria Docs](https://react-spectrum.adobe.com/react-aria/Tabs.html)\n\n## Tabs vs TabNav\n\n`Tabs` and `TabNav` look identical but serve fundamentally different purposes.\n\n| | `Tabs` | `TabNav` |\n|---|---|---|\n| **Use case** | Switching content panels within a page | Page-level navigation between routes |\n| **HTML semantics** | `role=\"tablist\"` + `role=\"tab\"` | `<nav>` + `<a>` |\n| **Active state** | `aria-selected=\"true\"` | `aria-current=\"page\"` |\n| **Keyboard** | Arrow keys (roving tabindex) | Sequential Tab key |\n| **Content** | Owns associated `TabPanel` | No panel — content managed by router |\n| **URL** | Optional (`href` prop) | Always (`href` required) |\n\nBoth `Tabs` and `TabNav` support client-side routing — the deciding factor is whether the component owns its content panels or delegates to the router. Use `Tabs` when the content lives alongside the tab list. Use [`TabNav`](/components/navigation/tab-nav) when each item navigates to a different route and the router manages what's rendered.\n\n## Variables\n\nGet familiar with the features.\n\n### Direction for tabs\n\nTabs can be oriented horizontally or vertically to suit different layout\nrequirements.\n\n#### Horizontal tabs\n\nOrganize and display distinct, related sections of content immediately beneath a\ncommon navigation bar or header, serving primarily to group content contextually\nwhile conserving vertical screen space.\n\n```jsx live\nconst App = () => (\n <Stack direction=\"column\" gap=\"600\">\n <Box>\n <Text fontWeight=\"bold\" mb=\"300\">Large</Text>\n <Tabs.Root size=\"lg\">\n <Tabs.List>\n <Tabs.Tab id=\"general\">General info</Tabs.Tab>\n <Tabs.Tab id=\"history\">History</Tabs.Tab>\n <Tabs.Tab id=\"subscription\">Subscription</Tabs.Tab>\n <Tabs.Tab id=\"downloads\">Downloads</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels pt=\"400\">\n <Tabs.Panel id=\"general\">General information content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"history\">History content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"subscription\">Subscription content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"downloads\">Downloads content goes here.</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Box>\n\n <Box>\n <Text fontWeight=\"bold\" mb=\"300\">Medium</Text>\n <Tabs.Root size=\"md\">\n <Tabs.List>\n <Tabs.Tab id=\"general\">General info</Tabs.Tab>\n <Tabs.Tab id=\"history\">History</Tabs.Tab>\n <Tabs.Tab id=\"subscription\">Subscription</Tabs.Tab>\n <Tabs.Tab id=\"downloads\">Downloads</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels pt=\"400\">\n <Tabs.Panel id=\"general\">General information content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"history\">History content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"subscription\">Subscription content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"downloads\">Downloads content goes here.</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Box>\n\n <Box>\n <Text fontWeight=\"bold\" mb=\"300\">Small</Text>\n <Tabs.Root size=\"sm\">\n <Tabs.List>\n <Tabs.Tab id=\"general\">General info</Tabs.Tab>\n <Tabs.Tab id=\"history\">History</Tabs.Tab>\n <Tabs.Tab id=\"subscription\">Subscription</Tabs.Tab>\n <Tabs.Tab id=\"downloads\">Downloads</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels pt=\"400\">\n <Tabs.Panel id=\"general\">General information content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"history\">History content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"subscription\">Subscription content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"downloads\">Downloads content goes here.</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Box>\n </Stack>\n)\n```\n\n#### Vertical tabs\n\nMaximize horizontal reading space and accommodate a larger number of\nconsistently visible options than traditional horizontal tabs allow.\n\n```jsx live\nconst App = () => (\n <Stack direction=\"row\" gap=\"1000\">\n <Box flex=\"1\">\n <Text fontWeight=\"bold\" mb=\"300\">Vertical left</Text>\n <Tabs.Root orientation=\"vertical\" placement=\"start\">\n <Tabs.List>\n <Tabs.Tab id=\"foryou\">\n <Icons.SentimentSatisfied />\n For you\n </Tabs.Tab>\n <Tabs.Tab id=\"recent\">\n <Icons.Schedule />\n Recent\n </Tabs.Tab>\n <Tabs.Tab id=\"starred\">\n <Icons.Star />\n Starred\n </Tabs.Tab>\n <Tabs.Tab id=\"apps\">\n <Icons.Apps />\n Apps\n </Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"foryou\">For you content</Tabs.Panel>\n <Tabs.Panel id=\"recent\">Recent content</Tabs.Panel>\n <Tabs.Panel id=\"starred\">Starred content</Tabs.Panel>\n <Tabs.Panel id=\"apps\">Apps content</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Box>\n\n <Box flex=\"1\">\n <Text fontWeight=\"bold\" mb=\"300\">Vertical right</Text>\n <Tabs.Root orientation=\"vertical\" placement=\"end\">\n <Tabs.List>\n <Tabs.Tab id=\"foryou\">\n <Icons.SentimentSatisfied />\n For you\n </Tabs.Tab>\n <Tabs.Tab id=\"recent\">\n <Icons.Schedule />\n Recent\n </Tabs.Tab>\n <Tabs.Tab id=\"starred\">\n <Icons.Star />\n Starred\n </Tabs.Tab>\n <Tabs.Tab id=\"apps\">\n <Icons.Apps />\n Apps\n </Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"foryou\">For you content</Tabs.Panel>\n <Tabs.Panel id=\"recent\">Recent content</Tabs.Panel>\n <Tabs.Panel id=\"starred\">Starred content</Tabs.Panel>\n <Tabs.Panel id=\"apps\">Apps content</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Box>\n </Stack>\n)\n```\n",
125
+ "views": {
126
+ "overview": {
127
+ "mdx": "\n## Overview\n\nTabs are a navigational component used to organize and switch between different\nsections of content within the same contextual view, allowing users to access\nmultiple related pages or views without navigating away from the main screen.\n\n### Resources\n\nDeep dive into implementation details and access the Nimbus design library.\n\n[Figma library](https://www.figma.com/design/AvtPX6g7OGGCRvNlatGOIY/NIMBUS-design-system?node-id=8571-34966&m=dev)\n[React Aria Docs](https://react-spectrum.adobe.com/react-aria/Tabs.html)\n\n## Tabs vs TabNav\n\n`Tabs` and `TabNav` look identical but serve fundamentally different purposes.\n\n| | `Tabs` | `TabNav` |\n|---|---|---|\n| **Use case** | Switching content panels within a page | Page-level navigation between routes |\n| **HTML semantics** | `role=\"tablist\"` + `role=\"tab\"` | `<nav>` + `<a>` |\n| **Active state** | `aria-selected=\"true\"` | `aria-current=\"page\"` |\n| **Keyboard** | Arrow keys (roving tabindex) | Sequential Tab key |\n| **Content** | Owns associated `TabPanel` | No panel — content managed by router |\n| **URL** | Optional (`href` prop) | Always (`href` required) |\n\nBoth `Tabs` and `TabNav` support client-side routing — the deciding factor is whether the component owns its content panels or delegates to the router. Use `Tabs` when the content lives alongside the tab list. Use [`TabNav`](/components/navigation/tab-nav) when each item navigates to a different route and the router manages what's rendered.\n\n## Variables\n\nGet familiar with the features.\n\n### Direction for tabs\n\nTabs can be oriented horizontally or vertically to suit different layout\nrequirements.\n\n#### Horizontal tabs\n\nOrganize and display distinct, related sections of content immediately beneath a\ncommon navigation bar or header, serving primarily to group content contextually\nwhile conserving vertical screen space.\n\n```jsx live\nconst App = () => (\n <Stack direction=\"column\" gap=\"600\">\n <Box>\n <Text fontWeight=\"bold\" mb=\"300\">Large</Text>\n <Tabs.Root size=\"lg\">\n <Tabs.List>\n <Tabs.Tab id=\"general\">General info</Tabs.Tab>\n <Tabs.Tab id=\"history\">History</Tabs.Tab>\n <Tabs.Tab id=\"subscription\">Subscription</Tabs.Tab>\n <Tabs.Tab id=\"downloads\">Downloads</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels pt=\"400\">\n <Tabs.Panel id=\"general\">General information content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"history\">History content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"subscription\">Subscription content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"downloads\">Downloads content goes here.</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Box>\n\n <Box>\n <Text fontWeight=\"bold\" mb=\"300\">Medium</Text>\n <Tabs.Root size=\"md\">\n <Tabs.List>\n <Tabs.Tab id=\"general\">General info</Tabs.Tab>\n <Tabs.Tab id=\"history\">History</Tabs.Tab>\n <Tabs.Tab id=\"subscription\">Subscription</Tabs.Tab>\n <Tabs.Tab id=\"downloads\">Downloads</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels pt=\"400\">\n <Tabs.Panel id=\"general\">General information content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"history\">History content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"subscription\">Subscription content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"downloads\">Downloads content goes here.</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Box>\n\n <Box>\n <Text fontWeight=\"bold\" mb=\"300\">Small</Text>\n <Tabs.Root size=\"sm\">\n <Tabs.List>\n <Tabs.Tab id=\"general\">General info</Tabs.Tab>\n <Tabs.Tab id=\"history\">History</Tabs.Tab>\n <Tabs.Tab id=\"subscription\">Subscription</Tabs.Tab>\n <Tabs.Tab id=\"downloads\">Downloads</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels pt=\"400\">\n <Tabs.Panel id=\"general\">General information content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"history\">History content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"subscription\">Subscription content goes here.</Tabs.Panel>\n <Tabs.Panel id=\"downloads\">Downloads content goes here.</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Box>\n </Stack>\n)\n```\n\n#### Vertical tabs\n\nMaximize horizontal reading space and accommodate a larger number of\nconsistently visible options than traditional horizontal tabs allow.\n\n```jsx live\nconst App = () => (\n <Stack direction=\"row\" gap=\"1000\">\n <Box flex=\"1\">\n <Text fontWeight=\"bold\" mb=\"300\">Vertical left</Text>\n <Tabs.Root orientation=\"vertical\" placement=\"start\">\n <Tabs.List>\n <Tabs.Tab id=\"foryou\">\n <Icons.SentimentSatisfied />\n For you\n </Tabs.Tab>\n <Tabs.Tab id=\"recent\">\n <Icons.Schedule />\n Recent\n </Tabs.Tab>\n <Tabs.Tab id=\"starred\">\n <Icons.Star />\n Starred\n </Tabs.Tab>\n <Tabs.Tab id=\"apps\">\n <Icons.Apps />\n Apps\n </Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"foryou\">For you content</Tabs.Panel>\n <Tabs.Panel id=\"recent\">Recent content</Tabs.Panel>\n <Tabs.Panel id=\"starred\">Starred content</Tabs.Panel>\n <Tabs.Panel id=\"apps\">Apps content</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Box>\n\n <Box flex=\"1\">\n <Text fontWeight=\"bold\" mb=\"300\">Vertical right</Text>\n <Tabs.Root orientation=\"vertical\" placement=\"end\">\n <Tabs.List>\n <Tabs.Tab id=\"foryou\">\n <Icons.SentimentSatisfied />\n For you\n </Tabs.Tab>\n <Tabs.Tab id=\"recent\">\n <Icons.Schedule />\n Recent\n </Tabs.Tab>\n <Tabs.Tab id=\"starred\">\n <Icons.Star />\n Starred\n </Tabs.Tab>\n <Tabs.Tab id=\"apps\">\n <Icons.Apps />\n Apps\n </Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"foryou\">For you content</Tabs.Panel>\n <Tabs.Panel id=\"recent\">Recent content</Tabs.Panel>\n <Tabs.Panel id=\"starred\">Starred content</Tabs.Panel>\n <Tabs.Panel id=\"apps\">Apps content</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Box>\n </Stack>\n)\n```\n",
128
+ "toc": [
129
+ {
130
+ "value": "Overview",
131
+ "href": "#overview",
132
+ "depth": 2,
133
+ "numbering": [
134
+ 1,
135
+ 1
136
+ ],
137
+ "parent": "root"
138
+ },
139
+ {
140
+ "value": "Resources",
141
+ "href": "#resources",
142
+ "depth": 3,
143
+ "numbering": [
144
+ 1,
145
+ 1,
146
+ 1
147
+ ],
148
+ "parent": "root"
149
+ },
150
+ {
151
+ "value": "Tabs vs TabNav",
152
+ "href": "#tabs-vs-tabnav",
153
+ "depth": 2,
154
+ "numbering": [
155
+ 1,
156
+ 2
157
+ ],
158
+ "parent": "root"
159
+ },
160
+ {
161
+ "value": "Variables",
162
+ "href": "#variables",
163
+ "depth": 2,
164
+ "numbering": [
165
+ 1,
166
+ 3
167
+ ],
168
+ "parent": "root"
169
+ },
170
+ {
171
+ "value": "Direction for tabs",
172
+ "href": "#direction-for-tabs",
173
+ "depth": 3,
174
+ "numbering": [
175
+ 1,
176
+ 3,
177
+ 1
178
+ ],
179
+ "parent": "root"
180
+ },
181
+ {
182
+ "value": "Horizontal tabs",
183
+ "href": "#horizontal-tabs",
184
+ "depth": 4,
185
+ "numbering": [
186
+ 1,
187
+ 3,
188
+ 1,
189
+ 1
190
+ ],
191
+ "parent": "root"
192
+ },
193
+ {
194
+ "value": "Vertical tabs",
195
+ "href": "#vertical-tabs",
196
+ "depth": 4,
197
+ "numbering": [
198
+ 1,
199
+ 3,
200
+ 1,
201
+ 2
202
+ ],
203
+ "parent": "root"
204
+ }
205
+ ]
206
+ },
207
+ "a11y": {
208
+ "mdx": "\n## Accessibility\n\nAccessibility ensures that digital content and functionality are usable by\neveryone, including people with disabilities, by addressing visual, auditory,\ncognitive, and physical limitations.\n\n```jsx live\nconst App = () => (\n <Tabs.Root defaultSelectedKey=\"history\">\n <Tabs.List>\n <Tabs.Tab id=\"general\">General info</Tabs.Tab>\n <Tabs.Tab id=\"history\">History</Tabs.Tab>\n <Tabs.Tab id=\"subscription\">Subscription</Tabs.Tab>\n <Tabs.Tab id=\"downloads\">Downloads</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels pt=\"400\">\n <Tabs.Panel id=\"general\">\n <Stack direction=\"column\" gap=\"200\">\n <Text>Name: Jon Doe</Text>\n <Text>Email: Jon.Doe@domain.com</Text>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"history\">\n <List.Root>\n <List.Item>03.15.25 - Jon Doe created an account.</List.Item>\n <List.Item>04.03.25 - Jon Doe updated profile information.</List.Item>\n <List.Item>06.06.25 - Jon Doe made their first purchase.</List.Item>\n </List.Root>\n </Tabs.Panel>\n <Tabs.Panel id=\"subscription\">\n <Stack direction=\"column\" gap=\"200\">\n <Text>Current subscription: Coffee delivery subscription $15/mo</Text>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"downloads\">\n <Stack direction=\"column\" gap=\"200\">\n <Text>No downloads available</Text>\n </Stack>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n)\n```\n\n### Accessibility standards\n\n- **Keyboard navigation:** The Tab key should move focus to the entire tab list.\n The Left/Right Arrow keys must be used to navigate between tabs once the tab\n list is focused. Enter or Space selects the focused tab.\n- **ARIA roles and states:**\n - The container must use `role=\"tablist\"`.\n - Individual tabs must use `role=\"tab\"` and `aria-selected=\"true/false\"`.\n - The content area must use `role=\"tabpanel\"` and be linked to its respective\n tab via `aria-labelledby`.\n- **Focus management:** Ensure that when a tab is activated, focus moves\n logically to the associated tab panel or the first interactive element within\n it.\n- **Contrast:** The contrast ratio between the active tab text and its\n background must be high, and the focus indicator must be easily visible.\n",
209
+ "toc": [
210
+ {
211
+ "value": "Accessibility",
212
+ "href": "#accessibility",
213
+ "depth": 2,
214
+ "numbering": [
215
+ 1,
216
+ 1
217
+ ],
218
+ "parent": "root"
219
+ },
220
+ {
221
+ "value": "Accessibility standards",
222
+ "href": "#accessibility-standards",
223
+ "depth": 3,
224
+ "numbering": [
225
+ 1,
226
+ 1,
227
+ 1
228
+ ],
229
+ "parent": "root"
230
+ }
231
+ ]
232
+ },
233
+ "dev": {
234
+ "mdx": "\n## Getting started\n\n### Import\n\n```tsx\nimport { Tabs, type TabsProps } from '@commercetools/nimbus';\n```\n\n### Basic usage\n\nThe Tabs component supports two approaches depending on your needs.\n\nFor maximum control over tab structure and content, use the **Compound API** with manual composition:\n\n```jsx live-dev\nconst App = () => {\n return (\n <Tabs.Root>\n <Tabs.List>\n <Tabs.Tab id=\"tab1\">First Tab</Tabs.Tab>\n <Tabs.Tab id=\"tab2\">Second Tab</Tabs.Tab>\n <Tabs.Tab id=\"tab3\">Third Tab</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"tab1\">\n <Text>Content for the first tab.</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"tab2\">\n <Text>Content for the second tab.</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"tab3\">\n <Text>Content for the third tab.</Text>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n );\n};\n```\n\nFor data-driven tabs that render from an array, use the **Dynamic rendering** approach:\n\n```jsx live-dev\nconst App = () => {\n const tabs = [\n {\n id: 'tab1',\n tabLabel: 'First Tab',\n panelContent: <Text>Content for the first tab.</Text>,\n },\n {\n id: 'tab2',\n tabLabel: 'Second Tab',\n panelContent: <Text>Content for the second tab.</Text>,\n },\n {\n id: 'tab3',\n tabLabel: 'Third Tab',\n panelContent: <Text>Content for the third tab.</Text>,\n },\n ];\n\n return <Tabs.Root tabs={tabs} tabListAriaLabel=\"Tab sections\" />;\n};\n```\n\nWhen using the `tabs` prop, provide a `tabListAriaLabel` for accessibility. This label is applied to the tab list element for screen readers.\n\n## Usage examples\n\n### Size variants\n\nThe Tabs component supports three size variants: `sm`, `md` (default), and `lg`.\n\n```jsx live-dev\nconst App = () => {\n const tabs = [\n { id: '1', tabLabel: 'Overview', panelContent: 'Overview content' },\n { id: '2', tabLabel: 'Details', panelContent: 'Details content' },\n { id: '3', tabLabel: 'Settings', panelContent: 'Settings content' },\n ];\n\n return (\n <Stack direction=\"column\" gap=\"600\">\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Small</Text>\n <Tabs.Root size=\"sm\" tabs={tabs} />\n </Stack>\n\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Medium (default)</Text>\n <Tabs.Root size=\"md\" tabs={tabs} />\n </Stack>\n\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Large</Text>\n <Tabs.Root size=\"lg\" tabs={tabs} />\n </Stack>\n </Stack>\n );\n};\n```\n\n### Visual variants\n\nThe Tabs component offers two visual styles:\n- **line** (default) - Tabs with an underline indicator\n- **pills** - Tabs with a pill-shaped background when active\n\n```jsx live-dev\nconst App = () => {\n const tabs = [\n { id: '1', tabLabel: 'Dashboard', panelContent: 'Dashboard view' },\n { id: '2', tabLabel: 'Analytics', panelContent: 'Analytics view' },\n { id: '3', tabLabel: 'Reports', panelContent: 'Reports view' },\n ];\n\n return (\n <Stack direction=\"column\" gap=\"600\">\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Line variant (default)</Text>\n <Tabs.Root variant=\"line\" tabs={tabs} />\n </Stack>\n\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Pills variant</Text>\n <Tabs.Root variant=\"pills\" tabs={tabs} />\n </Stack>\n </Stack>\n );\n};\n```\n\n### Orientation\n\nTabs can be displayed horizontally or vertically using the `orientation` prop.\n\n```jsx live-dev\nconst App = () => {\n return (\n <Stack direction=\"column\" gap=\"600\">\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Horizontal (default)</Text>\n <Tabs.Root orientation=\"horizontal\">\n <Tabs.List>\n <Tabs.Tab id=\"home\">Home</Tabs.Tab>\n <Tabs.Tab id=\"about\">About</Tabs.Tab>\n <Tabs.Tab id=\"contact\">Contact</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"home\">\n <Text>Welcome to our homepage!</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"about\">\n <Text>Learn more about us.</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"contact\">\n <Text>Get in touch with us.</Text>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Stack>\n\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Vertical</Text>\n <Tabs.Root orientation=\"vertical\">\n <Tabs.List>\n <Tabs.Tab id=\"profile\">Profile</Tabs.Tab>\n <Tabs.Tab id=\"security\">Security</Tabs.Tab>\n <Tabs.Tab id=\"notifications\">Notifications</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"profile\">\n <Text>Manage your profile settings.</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"security\">\n <Text>Configure security options.</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"notifications\">\n <Text>Adjust notification preferences.</Text>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Stack>\n </Stack>\n );\n};\n```\n\n### Placement\n\nThe `placement` prop controls where the tab list appears relative to the panels:\n- **horizontal orientation**: `start` (left-aligned) or `end` (right-aligned)\n- **vertical orientation**: `start` (tabs on left) or `end` (tabs on right)\n\n```jsx live-dev\nconst App = () => {\n const tabs = [\n { id: '1', tabLabel: 'First', panelContent: 'First panel content' },\n { id: '2', tabLabel: 'Second', panelContent: 'Second panel content' },\n { id: '3', tabLabel: 'Third', panelContent: 'Third panel content' },\n ];\n\n return (\n <Stack direction=\"column\" gap=\"600\">\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Horizontal with placement=\"start\"</Text>\n <Tabs.Root orientation=\"horizontal\" placement=\"start\" tabs={tabs} />\n </Stack>\n\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Horizontal with placement=\"end\"</Text>\n <Tabs.Root orientation=\"horizontal\" placement=\"end\" tabs={tabs} />\n </Stack>\n\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Vertical with placement=\"start\" (tabs on left)</Text>\n <Tabs.Root orientation=\"vertical\" placement=\"start\" tabs={tabs} />\n </Stack>\n\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Vertical with placement=\"end\" (tabs on right)</Text>\n <Tabs.Root orientation=\"vertical\" placement=\"end\" tabs={tabs} />\n </Stack>\n </Stack>\n );\n};\n```\n\n### Disabled tabs\n\nIndividual tabs can be disabled using the `disabledKeys` prop on `Tabs.Root`, or the `isDisabled` prop on individual `Tabs.Tab` components.\n\n```jsx live-dev\nconst App = () => {\n return (\n <Stack direction=\"column\" gap=\"600\">\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Disabled via disabledKeys prop</Text>\n <Tabs.Root disabledKeys={['tab2']}>\n <Tabs.List>\n <Tabs.Tab id=\"tab1\">Active Tab</Tabs.Tab>\n <Tabs.Tab id=\"tab2\">Disabled Tab</Tabs.Tab>\n <Tabs.Tab id=\"tab3\">Another Active Tab</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"tab1\">\n <Text>First tab content is accessible.</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"tab2\">\n <Text>This content cannot be accessed.</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"tab3\">\n <Text>Third tab content is accessible.</Text>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Stack>\n\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Disabled via isDisabled prop</Text>\n <Tabs.Root>\n <Tabs.List>\n <Tabs.Tab id=\"enabled1\">Available</Tabs.Tab>\n <Tabs.Tab id=\"disabled1\" isDisabled>\n Unavailable\n </Tabs.Tab>\n <Tabs.Tab id=\"enabled2\">Available</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"enabled1\">\n <Text>This tab is enabled.</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"disabled1\">\n <Text>This tab is disabled.</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"enabled2\">\n <Text>This tab is also enabled.</Text>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Stack>\n </Stack>\n );\n};\n```\n\n### Dynamic tabs with tabs prop\n\nFor dynamic content, pass an array of tab configurations to the `tabs` prop. This is useful when tab data comes from an API or changes at runtime.\n\n```jsx live-dev\nconst App = () => {\n const [tabs, setTabs] = useState([\n {\n id: '1',\n tabLabel: 'Introduction',\n panelContent: 'Welcome to our product documentation.',\n },\n {\n id: '2',\n tabLabel: 'Getting Started',\n panelContent: 'Learn how to get started with our product.',\n },\n {\n id: '3',\n tabLabel: 'API Reference',\n panelContent: 'Explore our comprehensive API documentation.',\n },\n ]);\n\n const addTab = () => {\n const newId = String(tabs.length + 1);\n setTabs([\n ...tabs,\n {\n id: newId,\n tabLabel: `Tab ${newId}`,\n panelContent: `Dynamic content for tab ${newId}`,\n },\n ]);\n };\n\n const removeLastTab = () => {\n if (tabs.length > 1) {\n setTabs(tabs.slice(0, -1));\n }\n };\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <Stack direction=\"row\" gap=\"300\">\n <Button onClick={addTab} size=\"md\">\n Add Tab\n </Button>\n <Button onClick={removeLastTab} size=\"md\" variant=\"outline\">\n Remove Last Tab\n </Button>\n </Stack>\n\n <Tabs.Root tabs={tabs} />\n </Stack>\n );\n};\n```\n\n### Manual composition with compound API\n\nUse the compound API for more control over tab and panel rendering, including custom content and complex layouts.\n\n```jsx live-dev\nconst App = () => {\n return (\n <Tabs.Root variant=\"pills\">\n <Tabs.List>\n <Tabs.Tab id=\"overview\">\n <Icons.Home />\n Overview\n </Tabs.Tab>\n <Tabs.Tab id=\"analytics\">\n <Icons.BarChart />\n Analytics\n </Tabs.Tab>\n <Tabs.Tab id=\"settings\">\n <Icons.Settings />\n Settings\n </Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"overview\">\n <Stack direction=\"column\" gap=\"300\" padding=\"400\">\n <Heading as=\"h3\" fontSize=\"500\">\n Dashboard Overview\n </Heading>\n <Text>\n View your key metrics and recent activity at a glance.\n </Text>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"analytics\">\n <Stack direction=\"column\" gap=\"300\" padding=\"400\">\n <Heading as=\"h3\" fontSize=\"500\">\n Analytics & Reports\n </Heading>\n <Text>\n Dive deep into your data with comprehensive analytics tools.\n </Text>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"settings\">\n <Stack direction=\"column\" gap=\"300\" padding=\"400\">\n <Heading as=\"h3\" fontSize=\"500\">\n Configuration Settings\n </Heading>\n <Text>\n Customize your experience with advanced settings options.\n </Text>\n </Stack>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n );\n};\n```\n\n### Uncontrolled mode\n\nBy default, Tabs operates in uncontrolled mode where it manages its own state. Use `defaultSelectedKey` to set the initially selected tab.\n\n```jsx live-dev\nconst App = () => {\n return (\n <Tabs.Root defaultSelectedKey=\"tab2\">\n <Tabs.List>\n <Tabs.Tab id=\"tab1\">Tab 1</Tabs.Tab>\n <Tabs.Tab id=\"tab2\">Tab 2 (Initially Selected)</Tabs.Tab>\n <Tabs.Tab id=\"tab3\">Tab 3</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"tab1\">\n <Text>First tab content</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"tab2\">\n <Text>Second tab content - selected by default</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"tab3\">\n <Text>Third tab content</Text>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n );\n};\n```\n\n### Controlled mode\n\nFor full control over tab selection, use the `selectedKey` and `onSelectionChange` props.\n\n```jsx live-dev\nconst App = () => {\n const [selectedTab, setSelectedTab] = useState<TabsProps['selectedKey']>('profile');\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <Text>\n Currently selected tab: <strong>{String(selectedTab)}</strong>\n </Text>\n\n <Tabs.Root\n selectedKey={selectedTab}\n onSelectionChange={setSelectedTab}\n >\n <Tabs.List>\n <Tabs.Tab id=\"profile\">Profile</Tabs.Tab>\n <Tabs.Tab id=\"account\">Account</Tabs.Tab>\n <Tabs.Tab id=\"preferences\">Preferences</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"profile\">\n <Text>Manage your profile information</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"account\">\n <Text>View and edit account settings</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"preferences\">\n <Text>Customize your preferences</Text>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n\n <Stack direction=\"row\" gap=\"300\">\n <Button\n size=\"md\"\n onClick={() => setSelectedTab('profile')}\n variant={selectedTab === 'profile' ? 'solid' : 'outline'}\n >\n Go to Profile\n </Button>\n <Button\n size=\"md\"\n onClick={() => setSelectedTab('account')}\n variant={selectedTab === 'account' ? 'solid' : 'outline'}\n >\n Go to Account\n </Button>\n <Button\n size=\"md\"\n onClick={() => setSelectedTab('preferences')}\n variant={selectedTab === 'preferences' ? 'solid' : 'outline'}\n >\n Go to Preferences\n </Button>\n </Stack>\n </Stack>\n );\n};\n```\n\n### Router-integrated tabs\n\nTabs can render as links for URL-driven navigation by providing an `href` prop. When used with a `NimbusProvider` router configuration, clicking a tab calls the router's navigate function instead of triggering a full page reload.\n\n```jsx live-dev\nconst App = () => {\n // In a real app, this would be your router's navigate function\n // e.g. React Router's useNavigate() or Next.js router.push()\n const router = {\n navigate: (href) => {\n alert(`Navigating to: ${href}`);\n },\n };\n\n return (\n <NimbusProvider router={router}>\n <Tabs.Root>\n <Tabs.List>\n <Tabs.Tab id=\"overview\" href=\"/products/overview\">\n Overview\n </Tabs.Tab>\n <Tabs.Tab id=\"details\" href=\"/products/details\">\n Details\n </Tabs.Tab>\n <Tabs.Tab id=\"reviews\" href=\"/products/reviews\">\n Reviews\n </Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"overview\">\n <Text>Product overview content.</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"details\">\n <Text>Product detail specifications.</Text>\n </Tabs.Panel>\n <Tabs.Panel id=\"reviews\">\n <Text>Customer reviews and ratings.</Text>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </NimbusProvider>\n );\n};\n```\n\nLink tabs also work with the simplified `tabs` prop API:\n\n```jsx live-dev\nconst App = () => {\n const router = {\n navigate: (href) => {\n alert(`Navigating to: ${href}`);\n },\n };\n\n const tabs = [\n { id: 'overview', tabLabel: 'Overview', href: '/products/overview', panelContent: 'Product overview content.' },\n { id: 'details', tabLabel: 'Details', href: '/products/details', panelContent: 'Product detail specifications.' },\n { id: 'reviews', tabLabel: 'Reviews', href: '/products/reviews', panelContent: 'Customer reviews and ratings.' },\n ];\n\n return (\n <NimbusProvider router={router}>\n <Tabs.Root tabs={tabs} tabListAriaLabel=\"Product sections\" />\n </NimbusProvider>\n );\n};\n```\n\nAdditional link props like `target` and `rel` can be used for external links:\n\n```tsx\n<Tabs.Tab id=\"docs\" href=\"https://docs.example.com\" target=\"_blank\" rel=\"noopener noreferrer\">\n External Docs\n</Tabs.Tab>\n```\n\n## Component requirements\n\n## Accessibility\n\nThe Tabs component follows WCAG 2.1 AA guidelines and implements the WAI-ARIA tabs pattern.\n\n#### Role\n\n- `Tabs.Root` contains the tablist and tabpanels\n- `Tabs.List` has `role=\"tablist\"`\n- `Tabs.Tab` has `role=\"tab\"` with `aria-selected` indicating active state\n- `Tabs.Panel` has `role=\"tabpanel\"` and is associated with its tab via `aria-labelledby`\n\n#### Labeling\n\n- Each tab must have an `id` prop that matches its corresponding panel\n- Tab content should be descriptive and concise\n- Complex tab labels can include icons and text\n- When using the `tabs` prop API, provide `tabListAriaLabel` to label the tab list for screen readers\n- When using the compound API, apply `aria-label` directly to `Tabs.List`\n\n#### Keyboard navigation\n\n| Key | Action |\n|-----|--------|\n| `Tab` | Move focus into and out of the tab list |\n| `ArrowRight` / `ArrowDown` | Move focus to the next tab (horizontal/vertical) |\n| `ArrowLeft` / `ArrowUp` | Move focus to the previous tab (horizontal/vertical) |\n| `Home` | Move focus to the first tab |\n| `End` | Move focus to the last tab |\n| `Enter` / `Space` | Activate the focused tab (when `keyboardActivation=\"manual\"`) |\n\n#### Persistent ID\n\nIf your use case requires tracking and analytics for this component, it is good practice to add a **persistent**, **unique** id to the component:\n\n```tsx\nconst PERSISTENT_ID = \"user-settings-tabs\";\n\nexport const SettingsTabs = () => (\n <Tabs.Root id={PERSISTENT_ID}>\n <Tabs.List>\n <Tabs.Tab id=\"profile\">Profile</Tabs.Tab>\n <Tabs.Tab id=\"security\">Security</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"profile\">Profile content</Tabs.Panel>\n <Tabs.Panel id=\"security\">Security content</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n);\n```\n\n## API reference\n\n<PropsTable id=\"Tabs\" />\n\n## Common patterns\n\n### Tab content with icons\n\nCombine icons with text labels for more expressive tabs.\n\n```jsx live-dev\nconst App = () => {\n return (\n <Tabs.Root variant=\"pills\" size=\"lg\">\n <Tabs.List>\n <Tabs.Tab id=\"dashboard\">\n <Icons.Dashboard />\n Dashboard\n </Tabs.Tab>\n <Tabs.Tab id=\"reports\">\n <Icons.Assessment />\n Reports\n </Tabs.Tab>\n <Tabs.Tab id=\"settings\">\n <Icons.Settings />\n Settings\n </Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"dashboard\">\n <Stack direction=\"column\" gap=\"300\" padding=\"500\">\n <Text>Dashboard content with key metrics and visualizations.</Text>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"reports\">\n <Stack direction=\"column\" gap=\"300\" padding=\"500\">\n <Text>Generate and view comprehensive reports.</Text>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"settings\">\n <Stack direction=\"column\" gap=\"300\" padding=\"500\">\n <Text>Configure application settings and preferences.</Text>\n </Stack>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n );\n};\n```\n\n### Tabs with badges\n\nDisplay notification counts or status indicators alongside tab labels using badges.\n\n```jsx live-dev\nconst App = () => {\n return (\n <Tabs.Root>\n <Tabs.List>\n <Tabs.Tab id=\"inbox\">\n <Stack direction=\"row\" gap=\"200\" alignItems=\"center\">\n <Text>Inbox</Text>\n <Badge colorPalette=\"primary\" size=\"xs\">12</Badge>\n </Stack>\n </Tabs.Tab>\n <Tabs.Tab id=\"drafts\">\n <Stack direction=\"row\" gap=\"200\" alignItems=\"center\">\n <Text>Drafts</Text>\n <Badge colorPalette=\"neutral\" size=\"xs\">3</Badge>\n </Stack>\n </Tabs.Tab>\n <Tabs.Tab id=\"sent\">\n <Text>Sent</Text>\n </Tabs.Tab>\n <Tabs.Tab id=\"spam\">\n <Stack direction=\"row\" gap=\"200\" alignItems=\"center\">\n <Text>Spam</Text>\n <Badge colorPalette=\"critical\" size=\"xs\">2</Badge>\n </Stack>\n </Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"inbox\">\n <Stack direction=\"column\" gap=\"300\" padding=\"400\">\n <Text>You have 12 new messages in your inbox.</Text>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"drafts\">\n <Stack direction=\"column\" gap=\"300\" padding=\"400\">\n <Text>You have 3 draft messages.</Text>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"sent\">\n <Stack direction=\"column\" gap=\"300\" padding=\"400\">\n <Text>View your sent messages.</Text>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"spam\">\n <Stack direction=\"column\" gap=\"300\" padding=\"400\">\n <Text>2 messages marked as spam.</Text>\n </Stack>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n );\n};\n```\n\n## Testing your implementation\n\nThese examples demonstrate how to test your implementation when using Tabs within your application. As the component's internal functionality is already tested by Nimbus, these patterns help you verify your integration and application-specific logic.\n\n### Basic Usage\n\nHow to render tabs using the compound composition API\n\n```tsx\nimport React from \"react\";\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { Tabs, NimbusProvider } from \"@commercetools/nimbus\";\nimport type { NimbusRouterConfig } from \"../nimbus-provider/nimbus-provider.types\";\n\ndescribe(\"Tabs - Basic usage\", () => {\n it(\"renders tabs with compound composition\", () => {\n render(\n <NimbusProvider>\n <Tabs.Root>\n <Tabs.List>\n <Tabs.Tab id=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab id=\"details\">Details</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"overview\">Overview content</Tabs.Panel>\n <Tabs.Panel id=\"details\">Details content</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByRole(\"tablist\")).toBeInTheDocument();\n expect(screen.getByRole(\"tab\", { name: \"Overview\" })).toBeInTheDocument();\n expect(screen.getByRole(\"tab\", { name: \"Details\" })).toBeInTheDocument();\n expect(screen.getByRole(\"tabpanel\")).toHaveTextContent(\"Overview content\");\n });\n\n it(\"renders tabs with the simplified tabs prop\", () => {\n const tabs = [\n {\n id: \"overview\",\n tabLabel: \"Overview\",\n panelContent: \"Overview content\",\n },\n { id: \"details\", tabLabel: \"Details\", panelContent: \"Details content\" },\n ];\n\n render(\n <NimbusProvider>\n <Tabs.Root tabs={tabs} />\n </NimbusProvider>\n );\n\n expect(screen.getByRole(\"tab\", { name: \"Overview\" })).toBeInTheDocument();\n expect(screen.getByRole(\"tab\", { name: \"Details\" })).toBeInTheDocument();\n });\n});\n```\n\n### Controlled Tabs\n\nHow to control the active tab from external state (e.g., URL parameters)\n\n```tsx\nimport React from \"react\";\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { Tabs, NimbusProvider } from \"@commercetools/nimbus\";\nimport type { NimbusRouterConfig } from \"../nimbus-provider/nimbus-provider.types\";\n\ndescribe(\"Tabs - Controlled tabs\", () => {\n it(\"controls the selected tab via selectedKey and onSelectionChange\", async () => {\n const user = userEvent.setup();\n const handleSelectionChange = vi.fn();\n\n const ControlledExample = () => {\n const [selectedKey, setSelectedKey] = React.useState<string | number>(\n \"overview\"\n );\n\n return (\n <Tabs.Root\n selectedKey={selectedKey}\n onSelectionChange={(key) => {\n setSelectedKey(key);\n handleSelectionChange(key);\n }}\n >\n <Tabs.List>\n <Tabs.Tab id=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab id=\"details\">Details</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"overview\">Overview content</Tabs.Panel>\n <Tabs.Panel id=\"details\">Details content</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n );\n };\n\n render(\n <NimbusProvider>\n <ControlledExample />\n </NimbusProvider>\n );\n\n await user.click(screen.getByRole(\"tab\", { name: \"Details\" }));\n\n expect(handleSelectionChange).toHaveBeenCalledWith(\"details\");\n expect(screen.getByRole(\"tabpanel\")).toHaveTextContent(\"Details content\");\n });\n\n it(\"sets the initial tab with defaultSelectedKey\", () => {\n render(\n <NimbusProvider>\n <Tabs.Root defaultSelectedKey=\"details\">\n <Tabs.List>\n <Tabs.Tab id=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab id=\"details\">Details</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"overview\">Overview content</Tabs.Panel>\n <Tabs.Panel id=\"details\">Details content</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByRole(\"tab\", { name: \"Details\" })).toHaveAttribute(\n \"aria-selected\",\n \"true\"\n );\n });\n});\n```\n\n### Router Integration\n\nHow to use tabs as links for URL-driven navigation with a client-side router\n\n```tsx\nimport React from \"react\";\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { Tabs, NimbusProvider } from \"@commercetools/nimbus\";\nimport type { NimbusRouterConfig } from \"../nimbus-provider/nimbus-provider.types\";\n\ndescribe(\"Tabs - Router integration\", () => {\n it(\"renders link tabs that navigate via the router\", async () => {\n const user = userEvent.setup();\n const navigate = vi.fn();\n\n const router: NimbusRouterConfig = { navigate };\n\n render(\n <NimbusProvider router={router}>\n <Tabs.Root>\n <Tabs.List>\n <Tabs.Tab id=\"overview\" href=\"/products?tab=overview\">\n Overview\n </Tabs.Tab>\n <Tabs.Tab id=\"details\" href=\"/products?tab=details\">\n Details\n </Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"overview\">Overview content</Tabs.Panel>\n <Tabs.Panel id=\"details\">Details content</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </NimbusProvider>\n );\n\n // Link tabs render as anchor elements\n const detailsTab = screen.getByRole(\"tab\", { name: \"Details\" });\n expect(detailsTab.tagName).toBe(\"A\");\n expect(detailsTab).toHaveAttribute(\"href\", \"/products?tab=details\");\n\n // Clicking calls the router navigate function\n await user.click(detailsTab);\n expect(navigate).toHaveBeenCalledWith(\"/products?tab=details\", undefined);\n });\n});\n```\n\n### Disabled Tabs\n\nHow to disable individual tabs or sets of tabs\n\n```tsx\nimport React from \"react\";\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { Tabs, NimbusProvider } from \"@commercetools/nimbus\";\nimport type { NimbusRouterConfig } from \"../nimbus-provider/nimbus-provider.types\";\n\ndescribe(\"Tabs - Disabled tabs\", () => {\n it(\"disables specific tabs via disabledKeys on the root\", () => {\n render(\n <NimbusProvider>\n <Tabs.Root disabledKeys={[\"details\"]}>\n <Tabs.List>\n <Tabs.Tab id=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab id=\"details\">Details</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"overview\">Overview content</Tabs.Panel>\n <Tabs.Panel id=\"details\">Details content</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </NimbusProvider>\n );\n\n const disabledTab = screen.getByRole(\"tab\", { name: \"Details\" });\n expect(disabledTab).toHaveAttribute(\"aria-disabled\", \"true\");\n });\n\n it(\"disables individual tabs via the isDisabled prop\", () => {\n render(\n <NimbusProvider>\n <Tabs.Root>\n <Tabs.List>\n <Tabs.Tab id=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab id=\"details\" isDisabled>\n Details\n </Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels>\n <Tabs.Panel id=\"overview\">Overview content</Tabs.Panel>\n <Tabs.Panel id=\"details\">Details content</Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByRole(\"tab\", { name: \"Details\" })).toHaveAttribute(\n \"aria-disabled\",\n \"true\"\n );\n });\n});\n```\n\n### Dynamic Tabs\n\nHow to render tabs from dynamic data and handle updates\n\n```tsx\nimport React from \"react\";\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { Tabs, NimbusProvider } from \"@commercetools/nimbus\";\nimport type { NimbusRouterConfig } from \"../nimbus-provider/nimbus-provider.types\";\n\ndescribe(\"Tabs - Dynamic tabs\", () => {\n it(\"renders tabs from a dynamic array and updates when data changes\", () => {\n const initialTabs = [\n { id: \"1\", tabLabel: \"First\", panelContent: \"First content\" },\n { id: \"2\", tabLabel: \"Second\", panelContent: \"Second content\" },\n ];\n\n const { rerender } = render(\n <NimbusProvider>\n <Tabs.Root tabs={initialTabs} />\n </NimbusProvider>\n );\n\n expect(screen.getByRole(\"tab\", { name: \"First\" })).toBeInTheDocument();\n expect(screen.getByRole(\"tab\", { name: \"Second\" })).toBeInTheDocument();\n\n const updatedTabs = [\n ...initialTabs,\n { id: \"3\", tabLabel: \"Third\", panelContent: \"Third content\" },\n ];\n\n rerender(\n <NimbusProvider>\n <Tabs.Root tabs={updatedTabs} />\n </NimbusProvider>\n );\n\n expect(screen.getByRole(\"tab\", { name: \"Third\" })).toBeInTheDocument();\n });\n});\n```\n\n\n## Resources\n\n- [Tabs Storybook](https://nimbus-storybook.vercel.app/?path=/docs/components-tabs--docs)\n- [React Aria Tabs Documentation](https://react-spectrum.adobe.com/react-aria/Tabs.html)\n- [WAI-ARIA Tabs Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/)\n",
235
+ "toc": [
236
+ {
237
+ "value": "Getting started",
238
+ "href": "#getting-started",
239
+ "depth": 2,
240
+ "numbering": [
241
+ 1,
242
+ 1
243
+ ],
244
+ "parent": "root"
245
+ },
246
+ {
247
+ "value": "Import",
248
+ "href": "#import",
249
+ "depth": 3,
250
+ "numbering": [
251
+ 1,
252
+ 1,
253
+ 1
254
+ ],
255
+ "parent": "root"
256
+ },
257
+ {
258
+ "value": "Basic usage",
259
+ "href": "#basic-usage",
260
+ "depth": 3,
261
+ "numbering": [
262
+ 1,
263
+ 1,
264
+ 2
265
+ ],
266
+ "parent": "root"
267
+ },
268
+ {
269
+ "value": "Usage examples",
270
+ "href": "#usage-examples",
271
+ "depth": 2,
272
+ "numbering": [
273
+ 1,
274
+ 2
275
+ ],
276
+ "parent": "root"
277
+ },
278
+ {
279
+ "value": "Size variants",
280
+ "href": "#size-variants",
281
+ "depth": 3,
282
+ "numbering": [
283
+ 1,
284
+ 2,
285
+ 1
286
+ ],
287
+ "parent": "root"
288
+ },
289
+ {
290
+ "value": "Visual variants",
291
+ "href": "#visual-variants",
292
+ "depth": 3,
293
+ "numbering": [
294
+ 1,
295
+ 2,
296
+ 2
297
+ ],
298
+ "parent": "root"
299
+ },
300
+ {
301
+ "value": "Orientation",
302
+ "href": "#orientation",
303
+ "depth": 3,
304
+ "numbering": [
305
+ 1,
306
+ 2,
307
+ 3
308
+ ],
309
+ "parent": "root"
310
+ },
311
+ {
312
+ "value": "Placement",
313
+ "href": "#placement",
314
+ "depth": 3,
315
+ "numbering": [
316
+ 1,
317
+ 2,
318
+ 4
319
+ ],
320
+ "parent": "root"
321
+ },
322
+ {
323
+ "value": "Disabled tabs",
324
+ "href": "#disabled-tabs",
325
+ "depth": 3,
326
+ "numbering": [
327
+ 1,
328
+ 2,
329
+ 5
330
+ ],
331
+ "parent": "root"
332
+ },
333
+ {
334
+ "value": "Dynamic tabs with tabs prop",
335
+ "href": "#dynamic-tabs-with-tabs-prop",
336
+ "depth": 3,
337
+ "numbering": [
338
+ 1,
339
+ 2,
340
+ 6
341
+ ],
342
+ "parent": "root"
343
+ },
344
+ {
345
+ "value": "Manual composition with compound API",
346
+ "href": "#manual-composition-with-compound-api",
347
+ "depth": 3,
348
+ "numbering": [
349
+ 1,
350
+ 2,
351
+ 7
352
+ ],
353
+ "parent": "root"
354
+ },
355
+ {
356
+ "value": "Uncontrolled mode",
357
+ "href": "#uncontrolled-mode",
358
+ "depth": 3,
359
+ "numbering": [
360
+ 1,
361
+ 2,
362
+ 8
363
+ ],
364
+ "parent": "root"
365
+ },
366
+ {
367
+ "value": "Controlled mode",
368
+ "href": "#controlled-mode",
369
+ "depth": 3,
370
+ "numbering": [
371
+ 1,
372
+ 2,
373
+ 9
374
+ ],
375
+ "parent": "root"
376
+ },
377
+ {
378
+ "value": "Router-integrated tabs",
379
+ "href": "#router-integrated-tabs",
380
+ "depth": 3,
381
+ "numbering": [
382
+ 1,
383
+ 2,
384
+ 10
385
+ ],
386
+ "parent": "root"
387
+ },
388
+ {
389
+ "value": "Component requirements",
390
+ "href": "#component-requirements",
391
+ "depth": 2,
392
+ "numbering": [
393
+ 1,
394
+ 3
395
+ ],
396
+ "parent": "root"
397
+ },
398
+ {
399
+ "value": "Accessibility",
400
+ "href": "#accessibility",
401
+ "depth": 2,
402
+ "numbering": [
403
+ 1,
404
+ 4
405
+ ],
406
+ "parent": "root"
407
+ },
408
+ {
409
+ "value": "Role",
410
+ "href": "#role",
411
+ "depth": 4,
412
+ "numbering": [
413
+ 1,
414
+ 4,
415
+ 1,
416
+ 1
417
+ ],
418
+ "parent": "root"
419
+ },
420
+ {
421
+ "value": "Labeling",
422
+ "href": "#labeling",
423
+ "depth": 4,
424
+ "numbering": [
425
+ 1,
426
+ 4,
427
+ 1,
428
+ 2
429
+ ],
430
+ "parent": "root"
431
+ },
432
+ {
433
+ "value": "Keyboard navigation",
434
+ "href": "#keyboard-navigation",
435
+ "depth": 4,
436
+ "numbering": [
437
+ 1,
438
+ 4,
439
+ 1,
440
+ 3
441
+ ],
442
+ "parent": "root"
443
+ },
444
+ {
445
+ "value": "Persistent ID",
446
+ "href": "#persistent-id",
447
+ "depth": 4,
448
+ "numbering": [
449
+ 1,
450
+ 4,
451
+ 1,
452
+ 4
453
+ ],
454
+ "parent": "root"
455
+ },
456
+ {
457
+ "value": "API reference",
458
+ "href": "#api-reference",
459
+ "depth": 2,
460
+ "numbering": [
461
+ 1,
462
+ 5
463
+ ],
464
+ "parent": "root"
465
+ },
466
+ {
467
+ "value": "Common patterns",
468
+ "href": "#common-patterns",
469
+ "depth": 2,
470
+ "numbering": [
471
+ 1,
472
+ 6
473
+ ],
474
+ "parent": "root"
475
+ },
476
+ {
477
+ "value": "Tab content with icons",
478
+ "href": "#tab-content-with-icons",
479
+ "depth": 3,
480
+ "numbering": [
481
+ 1,
482
+ 6,
483
+ 1
484
+ ],
485
+ "parent": "root"
486
+ },
487
+ {
488
+ "value": "Tabs with badges",
489
+ "href": "#tabs-with-badges",
490
+ "depth": 3,
491
+ "numbering": [
492
+ 1,
493
+ 6,
494
+ 2
495
+ ],
496
+ "parent": "root"
497
+ },
498
+ {
499
+ "value": "Testing your implementation",
500
+ "href": "#testing-your-implementation",
501
+ "depth": 2,
502
+ "numbering": [
503
+ 1,
504
+ 7
505
+ ],
506
+ "parent": "root"
507
+ },
508
+ {
509
+ "value": "Basic Usage",
510
+ "href": "#basic-usage-1",
511
+ "depth": 3,
512
+ "numbering": [
513
+ 1,
514
+ 7,
515
+ 1
516
+ ],
517
+ "parent": "root"
518
+ },
519
+ {
520
+ "value": "Controlled Tabs",
521
+ "href": "#controlled-tabs",
522
+ "depth": 3,
523
+ "numbering": [
524
+ 1,
525
+ 7,
526
+ 2
527
+ ],
528
+ "parent": "root"
529
+ },
530
+ {
531
+ "value": "Router Integration",
532
+ "href": "#router-integration",
533
+ "depth": 3,
534
+ "numbering": [
535
+ 1,
536
+ 7,
537
+ 3
538
+ ],
539
+ "parent": "root"
540
+ },
541
+ {
542
+ "value": "Disabled Tabs",
543
+ "href": "#disabled-tabs-1",
544
+ "depth": 3,
545
+ "numbering": [
546
+ 1,
547
+ 7,
548
+ 4
549
+ ],
550
+ "parent": "root"
551
+ },
552
+ {
553
+ "value": "Dynamic Tabs",
554
+ "href": "#dynamic-tabs",
555
+ "depth": 3,
556
+ "numbering": [
557
+ 1,
558
+ 7,
559
+ 5
560
+ ],
561
+ "parent": "root"
562
+ },
563
+ {
564
+ "value": "Resources",
565
+ "href": "#resources",
566
+ "depth": 2,
567
+ "numbering": [
568
+ 1,
569
+ 8
570
+ ],
571
+ "parent": "root"
572
+ }
573
+ ]
574
+ },
575
+ "guidelines": {
576
+ "mdx": "\n## Guidelines\n\nProvides a structured, predictable pattern for displaying multiple panes of\nrelated content in the same area. It minimizes screen clutter by allowing\ncontent sections to be easily hidden and revealed, typically used for navigation\nwithin a product or configuration panel.\n\n### Best practices\n\n- **Consistency and context:** Ensure all content within the tab panels is\n closely related to the parent context (e.g., all tabs relate to \"User\n Settings\" or \"Product Details\").\n- **Concise labels:** Keep tab labels short (one or two words is ideal) and\n descriptive, clearly indicating the content of the corresponding panel.\n- **Maintain visibility:** Ensure the current active tab is clearly\n distinguishable from inactive tabs using strong visual cues (e.g., accent\n color, bold text, contrasting underline).\n- **Maintain content position:** Do not use tabs to reorganize or filter the\n content of a single continuous list. The content associated with each tab\n should be unique and distinct.\n- **Limit number of tabs:** Avoid creating a large number of tabs (ideally 3–7\n visible tabs) to prevent horizontal scrolling or overcrowding, which harms\n usability. Use a dropdown menu or alternative navigation pattern for overflow.\n- **Avoid sub-navigation:** Do not place secondary navigation elements (like\n another row of tabs) directly inside the tab panel unless absolutely\n necessary.\n\n### Usage\n\nTabs are used to organize related content into distinct, switchable sections,\nallowing users to efficiently access different views within the same area\nwithout leaving the context of the main page.\n\n> [!TIP]\\\n> When to use\n\n- **Organizing related views:** To switch between different views of the same\n object (e.g., \"Details,\" \"Inventory,\" \"History\" tabs on a Product page).\n- **Configuration settings:** For grouping diverse settings categories (e.g.,\n \"General,\" \"Billing,\" \"Security\" sections within a settings page).\n- **Conserving vertical space:** To maximize vertical screen space by presenting\n options horizontally.\n\n> [!CAUTION]\\\n> When not to use\n\n- **Primary site navigation:** Do not use tabs for navigating between major,\n top-level sections of an application (use main navigation menus or links\n instead).\n- **Too many options:** If the number of tabs causes horizontal scrolling or\n requires hiding options in an overflow menu on desktop.\n- **Linear workflows:** Avoid using tabs to guide users through a mandatory,\n step-by-step process.\n\n### Router-integrated tabs\n\nWhen tabs represent distinct views that map to URLs (e.g., `/products/overview`,\n`/products/details`), use the `href` prop to render tabs as links. This enables:\n\n- **SEO-friendly URLs:** Each tab section gets a unique, shareable URL.\n- **Browser history integration:** Users can navigate back/forward between tabs.\n- **Accessibility:** Tabs render as `<a>` elements, providing native link\n semantics.\n\n> [!TIP]\\\n> **Do**\n>\n> - Use `href` tabs when each tab represents a distinct page or route in your\n> application.\n> - Configure a router via `NimbusProvider` to enable client-side navigation\n> without full page reloads.\n> - Use `target=\"_blank\"` and `rel=\"noopener noreferrer\"` for tabs that link to\n> external resources.\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Don't use `href` tabs for content that should switch instantly without URL\n> changes (use standard tabs instead).\n> - Don't mix `href` and non-`href` tabs within the same tab list, as this\n> creates inconsistent navigation behavior.\n\n### Tab labeling\n\n> [!TIP]\\\n> **Do**\n>\n> - Choose concise, descriptive labels (1-2 words) that accurately preview the\n> content within the panel to aid quick visual scanning.\n> - Ensure all tab content is closely related to the parent screen's context,\n> maintaining a single-page feel.\n> - Implement an overflow strategy (like a \"More\" menu) if the tab count exceeds\n> 7, rather than allowing horizontal scrolling, which is poor usability.\n> - Verify that content inside the hidden tab panels remains available to screen\n> readers, aligning with accessibility best practices.\n\n```jsx live\nconst App = () => (\n <Tabs.Root defaultSelectedKey=\"history\">\n <Tabs.List>\n <Tabs.Tab id=\"general\">General info</Tabs.Tab>\n <Tabs.Tab id=\"history\">History</Tabs.Tab>\n <Tabs.Tab id=\"subscription\">Subscription</Tabs.Tab>\n <Tabs.Tab id=\"downloads\">Downloads</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels pt=\"400\">\n <Tabs.Panel id=\"general\">\n <Stack direction=\"column\" gap=\"200\">\n <Text>Name: Jon Doe</Text>\n <Text>Email: Jon.Doe@domain.com</Text>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"history\">\n <List.Root>\n <List.Item>03.15.25 - Jon Doe created an account.</List.Item>\n <List.Item>04.03.25 - Jon Doe updated profile information.</List.Item>\n <List.Item>06.06.25 - Jon Doe made their first purchase.</List.Item>\n </List.Root>\n </Tabs.Panel>\n <Tabs.Panel id=\"subscription\">\n <Stack direction=\"column\" gap=\"200\">\n <Text>Current subscription: Coffee delivery subscription $15/mo</Text>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"downloads\">\n <Stack direction=\"column\" gap=\"200\">\n <Text>No downloads available</Text>\n </Stack>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n)\n```\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Don't use tabs for site-wide or primary application navigation; reserve them\n> for internal to pages, contextual navigation.\n> - Don't place tabs on the screen if they cause the content area below them to\n> feel disconnected or unrelated.\n> - Don't use tabs to reorganize the content of a single continuous list; the\n> content under each tab should be unique and distinct.\n> - Don't use overly long, descriptive sentences as tab labels, as they clutter\n> the interface and harm quick visual scanning.\n\n```jsx live\nconst App = () => (\n <Tabs.Root defaultSelectedKey=\"fruit\">\n <Tabs.List>\n <Tabs.Tab id=\"grocerylist\">Grocery list</Tabs.Tab>\n <Tabs.Tab id=\"fruit\">Fruit</Tabs.Tab>\n <Tabs.Tab id=\"veggies\">Veggies</Tabs.Tab>\n <Tabs.Tab id=\"junkfood\">Junk food</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels pt=\"400\">\n <Tabs.Panel id=\"grocerylist\">\n <List.Root>\n <List.Item>Peaches</List.Item>\n <List.Item>Durian</List.Item>\n <List.Item>Mangosteen</List.Item>\n <List.Item>Carrots</List.Item>\n <List.Item>Broccoli</List.Item>\n <List.Item>Spinach</List.Item>\n <List.Item>Potato chips</List.Item>\n <List.Item>Cookies</List.Item>\n <List.Item>Candy bars</List.Item>\n </List.Root>\n </Tabs.Panel>\n <Tabs.Panel id=\"fruit\">\n <List.Root>\n <List.Item>Peaches</List.Item>\n <List.Item>Durian</List.Item>\n <List.Item>Mangosteen</List.Item>\n </List.Root>\n </Tabs.Panel>\n <Tabs.Panel id=\"veggies\">\n <List.Root>\n <List.Item>Carrots</List.Item>\n <List.Item>Broccoli</List.Item>\n <List.Item>Spinach</List.Item>\n </List.Root>\n </Tabs.Panel>\n <Tabs.Panel id=\"junkfood\">\n <List.Root>\n <List.Item>Potato chips</List.Item>\n <List.Item>Cookies</List.Item>\n <List.Item>Candy bars</List.Item>\n </List.Root>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n)\n```\n",
577
+ "toc": [
578
+ {
579
+ "value": "Guidelines",
580
+ "href": "#guidelines",
581
+ "depth": 2,
582
+ "numbering": [
583
+ 1,
584
+ 1
585
+ ],
586
+ "parent": "root"
587
+ },
588
+ {
589
+ "value": "Best practices",
590
+ "href": "#best-practices",
591
+ "depth": 3,
592
+ "numbering": [
593
+ 1,
594
+ 1,
595
+ 1
596
+ ],
597
+ "parent": "root"
598
+ },
599
+ {
600
+ "value": "Usage",
601
+ "href": "#usage",
602
+ "depth": 3,
603
+ "numbering": [
604
+ 1,
605
+ 1,
606
+ 2
607
+ ],
608
+ "parent": "root"
609
+ },
610
+ {
611
+ "value": "Router-integrated tabs",
612
+ "href": "#router-integrated-tabs",
613
+ "depth": 3,
614
+ "numbering": [
615
+ 1,
616
+ 1,
617
+ 3
618
+ ],
619
+ "parent": "root"
620
+ },
621
+ {
622
+ "value": "Tab labeling",
623
+ "href": "#tab-labeling",
624
+ "depth": 3,
625
+ "numbering": [
626
+ 1,
627
+ 1,
628
+ 4
629
+ ],
630
+ "parent": "root"
631
+ }
632
+ ]
633
+ }
634
+ }
635
+ }