@commercetools/nimbus-mcp 0.1.0 → 2.10.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 (450) hide show
  1. package/README.md +63 -14
  2. package/data/docs/route-manifest.json +10913 -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-separator.json +461 -0
  59. package/data/docs/routes/components-layout-simple-grid.json +519 -0
  60. package/data/docs/routes/components-layout-spacer.json +573 -0
  61. package/data/docs/routes/components-layout-stack.json +481 -0
  62. package/data/docs/routes/components-layout.json +34 -0
  63. package/data/docs/routes/components-media-avatar.json +427 -0
  64. package/data/docs/routes/components-media-icon.json +663 -0
  65. package/data/docs/routes/components-media-image.json +511 -0
  66. package/data/docs/routes/components-media-inline-svg.json +586 -0
  67. package/data/docs/routes/components-media.json +34 -0
  68. package/data/docs/routes/components-navigation-accordion.json +643 -0
  69. package/data/docs/routes/components-navigation-collapsible-motion.json +628 -0
  70. package/data/docs/routes/components-navigation-link.json +554 -0
  71. package/data/docs/routes/components-navigation-menu.json +546 -0
  72. package/data/docs/routes/components-navigation-pagination.json +502 -0
  73. package/data/docs/routes/components-navigation-steps.json +629 -0
  74. package/data/docs/routes/components-navigation-tabnav.json +546 -0
  75. package/data/docs/routes/components-navigation-tabs.json +635 -0
  76. package/data/docs/routes/components-navigation-toolbar.json +549 -0
  77. package/data/docs/routes/components-navigation.json +34 -0
  78. package/data/docs/routes/components-typography-code.json +39 -0
  79. package/data/docs/routes/components-typography-heading.json +402 -0
  80. package/data/docs/routes/components-typography-kbd.json +399 -0
  81. package/data/docs/routes/components-typography-list.json +593 -0
  82. package/data/docs/routes/components-typography-text.json +444 -0
  83. package/data/docs/routes/components-typography.json +34 -0
  84. package/data/docs/routes/components-utilities-nimbus-i18n-provider.json +295 -0
  85. package/data/docs/routes/components-utilities-nimbus-provider.json +663 -0
  86. package/data/docs/routes/components-utilities.json +34 -0
  87. package/data/docs/routes/components.json +33 -0
  88. package/data/docs/routes/home-contribute-adrs-adr0001-consumer-component-apis.json +314 -0
  89. package/data/docs/routes/home-contribute-adrs-adr0002-compound-component-extraction.json +160 -0
  90. package/data/docs/routes/home-contribute-adrs-adr0003-component-lifecycle-states.json +460 -0
  91. package/data/docs/routes/home-contribute-adrs.json +205 -0
  92. package/data/docs/routes/home-contribute-development-setup.json +213 -0
  93. package/data/docs/routes/home-contribute-stats.json +36 -0
  94. package/data/docs/routes/home-contribute.json +36 -0
  95. package/data/docs/routes/home-design-tokens-aspect-ratios.json +36 -0
  96. package/data/docs/routes/home-design-tokens-borders.json +35 -0
  97. package/data/docs/routes/home-design-tokens-colors.json +157 -0
  98. package/data/docs/routes/home-design-tokens-other-animations.json +119 -0
  99. package/data/docs/routes/home-design-tokens-other-blurs.json +36 -0
  100. package/data/docs/routes/home-design-tokens-other-breakpoints.json +61 -0
  101. package/data/docs/routes/home-design-tokens-other-cursors.json +36 -0
  102. package/data/docs/routes/home-design-tokens-other-z-indices.json +39 -0
  103. package/data/docs/routes/home-design-tokens-other.json +35 -0
  104. package/data/docs/routes/home-design-tokens-radii.json +59 -0
  105. package/data/docs/routes/home-design-tokens-shadows.json +57 -0
  106. package/data/docs/routes/home-design-tokens-sizes.json +137 -0
  107. package/data/docs/routes/home-design-tokens-spacing.json +36 -0
  108. package/data/docs/routes/home-design-tokens-typography.json +184 -0
  109. package/data/docs/routes/home-design-tokens.json +34 -0
  110. package/data/docs/routes/home-getting-started-core-concepts.json +301 -0
  111. package/data/docs/routes/home-getting-started-installation.json +621 -0
  112. package/data/docs/routes/home-getting-started-mcp-server-overview.json +139 -0
  113. package/data/docs/routes/home-getting-started-mcp-server-setup.json +316 -0
  114. package/data/docs/routes/home-getting-started-release-process.json +294 -0
  115. package/data/docs/routes/home-getting-started-testing-setup.json +296 -0
  116. package/data/docs/routes/home-playground-markdown.json +638 -0
  117. package/data/docs/routes/home-playground-toc.json +169 -0
  118. package/data/docs/routes/home-playground.json +34 -0
  119. package/data/docs/routes/home-style-props-background.json +236 -0
  120. package/data/docs/routes/home-style-props-border.json +310 -0
  121. package/data/docs/routes/home-style-props-display.json +120 -0
  122. package/data/docs/routes/home-style-props-effects.json +116 -0
  123. package/data/docs/routes/home-style-props-filters.json +396 -0
  124. package/data/docs/routes/home-style-props-flex-and-grid.json +496 -0
  125. package/data/docs/routes/home-style-props-interactivity.json +356 -0
  126. package/data/docs/routes/home-style-props-layout.json +422 -0
  127. package/data/docs/routes/home-style-props-list.json +116 -0
  128. package/data/docs/routes/home-style-props-sizing.json +244 -0
  129. package/data/docs/routes/home-style-props-spacing.json +228 -0
  130. package/data/docs/routes/home-style-props-svg.json +96 -0
  131. package/data/docs/routes/home-style-props-tables.json +116 -0
  132. package/data/docs/routes/home-style-props-transforms.json +216 -0
  133. package/data/docs/routes/home-style-props-transitions.json +216 -0
  134. package/data/docs/routes/home-style-props-typography.json +536 -0
  135. package/data/docs/routes/home-style-props.json +33 -0
  136. package/data/docs/routes/home.json +32 -0
  137. package/data/docs/routes/hooks-usecopytoclipboard.json +76 -0
  138. package/data/docs/routes/hooks-usehotkeys.json +117 -0
  139. package/data/docs/routes/hooks.json +33 -0
  140. package/data/docs/routes/icons.json +32 -0
  141. package/data/docs/routes/patterns-fields-date-range-picker-field.json +393 -0
  142. package/data/docs/routes/patterns-fields-money-input-field.json +415 -0
  143. package/data/docs/routes/patterns-fields-multiline-text-input-field.json +404 -0
  144. package/data/docs/routes/patterns-fields-number-input-field.json +470 -0
  145. package/data/docs/routes/patterns-fields-password-input-field.json +319 -0
  146. package/data/docs/routes/patterns-fields-search-input-field.json +382 -0
  147. package/data/docs/routes/patterns-fields-text-input-field.json +404 -0
  148. package/data/docs/routes/patterns-fields.json +78 -0
  149. package/data/docs/routes/patterns.json +34 -0
  150. package/data/docs/search-index.json +1 -0
  151. package/data/docs/types/Accordion.json +12 -0
  152. package/data/docs/types/AccordionContent.json +286 -0
  153. package/data/docs/types/AccordionHeader.json +891 -0
  154. package/data/docs/types/AccordionHeaderRightContent.json +27 -0
  155. package/data/docs/types/AccordionItem.json +242 -0
  156. package/data/docs/types/AccordionRoot.json +162 -0
  157. package/data/docs/types/Alert.json +12 -0
  158. package/data/docs/types/AlertActions.json +11 -0
  159. package/data/docs/types/AlertDescription.json +118 -0
  160. package/data/docs/types/AlertDismissButton.json +937 -0
  161. package/data/docs/types/AlertRoot.json +42 -0
  162. package/data/docs/types/AlertTitle.json +118 -0
  163. package/data/docs/types/Avatar.json +125 -0
  164. package/data/docs/types/Badge.json +64 -0
  165. package/data/docs/types/Body.json +67 -0
  166. package/data/docs/types/Box.json +85 -0
  167. package/data/docs/types/Button.json +1015 -0
  168. package/data/docs/types/Calendar.json +565 -0
  169. package/data/docs/types/Caption.json +67 -0
  170. package/data/docs/types/Card.json +12 -0
  171. package/data/docs/types/CardContent.json +27 -0
  172. package/data/docs/types/CardHeader.json +27 -0
  173. package/data/docs/types/CardRoot.json +106 -0
  174. package/data/docs/types/Cell.json +227 -0
  175. package/data/docs/types/Checkbox.json +897 -0
  176. package/data/docs/types/Code.json +112 -0
  177. package/data/docs/types/CollapsibleMotionContent.json +35 -0
  178. package/data/docs/types/CollapsibleMotionRoot.json +99 -0
  179. package/data/docs/types/CollapsibleMotionTrigger.json +71 -0
  180. package/data/docs/types/Column.json +101 -0
  181. package/data/docs/types/ColumnGroup.json +101 -0
  182. package/data/docs/types/ColumnHeader.json +193 -0
  183. package/data/docs/types/ComboBoxListBox.json +751 -0
  184. package/data/docs/types/ComboBoxOption.json +672 -0
  185. package/data/docs/types/ComboBoxPopover.json +786 -0
  186. package/data/docs/types/ComboBoxRoot.json +747 -0
  187. package/data/docs/types/ComboBoxSection.json +277 -0
  188. package/data/docs/types/ComboBoxTrigger.json +70 -0
  189. package/data/docs/types/Content.json +33 -0
  190. package/data/docs/types/DataTable.json +596 -0
  191. package/data/docs/types/DataTableBody.json +223 -0
  192. package/data/docs/types/DataTableFooter.json +27 -0
  193. package/data/docs/types/DataTableHeader.json +269 -0
  194. package/data/docs/types/DataTableManager.json +11 -0
  195. package/data/docs/types/DataTableRoot.json +590 -0
  196. package/data/docs/types/DataTableTable.json +271 -0
  197. package/data/docs/types/DateInput.json +792 -0
  198. package/data/docs/types/DatePicker.json +700 -0
  199. package/data/docs/types/DateRangePicker.json +936 -0
  200. package/data/docs/types/DateRangePickerField.json +1047 -0
  201. package/data/docs/types/DefaultPage.json +12 -0
  202. package/data/docs/types/DefaultPageActions.json +27 -0
  203. package/data/docs/types/DefaultPageBackLink.json +213 -0
  204. package/data/docs/types/DefaultPageContent.json +27 -0
  205. package/data/docs/types/DefaultPageFooter.json +27 -0
  206. package/data/docs/types/DefaultPageHeader.json +27 -0
  207. package/data/docs/types/DefaultPageRoot.json +106 -0
  208. package/data/docs/types/DefaultPageSubtitle.json +27 -0
  209. package/data/docs/types/DefaultPageTabNav.json +28 -0
  210. package/data/docs/types/DefaultPageTitle.json +27 -0
  211. package/data/docs/types/DialogBody.json +27 -0
  212. package/data/docs/types/DialogCloseTrigger.json +939 -0
  213. package/data/docs/types/DialogContent.json +27 -0
  214. package/data/docs/types/DialogFooter.json +27 -0
  215. package/data/docs/types/DialogHeader.json +27 -0
  216. package/data/docs/types/DialogRoot.json +138 -0
  217. package/data/docs/types/DialogTitle.json +27 -0
  218. package/data/docs/types/DialogTrigger.json +80 -0
  219. package/data/docs/types/DraggableList.json +12 -0
  220. package/data/docs/types/DraggableListField.json +894 -0
  221. package/data/docs/types/DraggableListItem.json +574 -0
  222. package/data/docs/types/DraggableListRoot.json +745 -0
  223. package/data/docs/types/Drawer.json +12 -0
  224. package/data/docs/types/DrawerBody.json +27 -0
  225. package/data/docs/types/DrawerCloseTrigger.json +939 -0
  226. package/data/docs/types/DrawerContent.json +27 -0
  227. package/data/docs/types/DrawerFooter.json +27 -0
  228. package/data/docs/types/DrawerHeader.json +27 -0
  229. package/data/docs/types/DrawerRoot.json +142 -0
  230. package/data/docs/types/DrawerTitle.json +27 -0
  231. package/data/docs/types/DrawerTrigger.json +80 -0
  232. package/data/docs/types/FieldErrors.getBuiltInMessage.json +11 -0
  233. package/data/docs/types/FieldErrors.getCustomMessage.json +9 -0
  234. package/data/docs/types/FieldErrors.json +109 -0
  235. package/data/docs/types/Flex.json +238 -0
  236. package/data/docs/types/Footer.json +67 -0
  237. package/data/docs/types/FormFieldDescription.json +11 -0
  238. package/data/docs/types/FormFieldError.json +11 -0
  239. package/data/docs/types/FormFieldInfoBox.json +27 -0
  240. package/data/docs/types/FormFieldInput.json +11 -0
  241. package/data/docs/types/FormFieldLabel.json +11 -0
  242. package/data/docs/types/FormFieldRoot.json +148 -0
  243. package/data/docs/types/Grid.json +253 -0
  244. package/data/docs/types/GridProps.json +11 -0
  245. package/data/docs/types/Group.json +143 -0
  246. package/data/docs/types/Header.json +67 -0
  247. package/data/docs/types/Heading.json +109 -0
  248. package/data/docs/types/Icon.json +112 -0
  249. package/data/docs/types/IconButton.json +1019 -0
  250. package/data/docs/types/IconToggleButton.json +787 -0
  251. package/data/docs/types/Image.json +373 -0
  252. package/data/docs/types/Indicator.json +67 -0
  253. package/data/docs/types/InlineSvg.json +98 -0
  254. package/data/docs/types/Item.json +67 -0
  255. package/data/docs/types/Kbd.json +118 -0
  256. package/data/docs/types/Link.json +380 -0
  257. package/data/docs/types/List.json +12 -0
  258. package/data/docs/types/ListIndicator.json +70 -0
  259. package/data/docs/types/ListItem.json +70 -0
  260. package/data/docs/types/ListRoot.json +124 -0
  261. package/data/docs/types/LoadingSpinner.json +87 -0
  262. package/data/docs/types/LocalizedField.json +460 -0
  263. package/data/docs/types/LocalizedStringFormatter.json +9 -0
  264. package/data/docs/types/MakeElementFocusable.json +196 -0
  265. package/data/docs/types/MenuContent.json +111 -0
  266. package/data/docs/types/MenuItem.json +671 -0
  267. package/data/docs/types/MenuRoot.json +670 -0
  268. package/data/docs/types/MenuSection.json +364 -0
  269. package/data/docs/types/MenuSubmenu.json +111 -0
  270. package/data/docs/types/MenuSubmenuTrigger.json +67 -0
  271. package/data/docs/types/MenuTrigger.json +906 -0
  272. package/data/docs/types/ModalPage.json +12 -0
  273. package/data/docs/types/ModalPageActions.json +27 -0
  274. package/data/docs/types/ModalPageContent.json +27 -0
  275. package/data/docs/types/ModalPageFooter.json +27 -0
  276. package/data/docs/types/ModalPageHeader.json +27 -0
  277. package/data/docs/types/ModalPageRoot.json +87 -0
  278. package/data/docs/types/ModalPageSubtitle.json +27 -0
  279. package/data/docs/types/ModalPageTabNav.json +28 -0
  280. package/data/docs/types/ModalPageTitle.json +27 -0
  281. package/data/docs/types/ModalPageTopBar.json +57 -0
  282. package/data/docs/types/MoneyInput.isEmpty.json +40 -0
  283. package/data/docs/types/MoneyInput.json +282 -0
  284. package/data/docs/types/MoneyInputField.json +379 -0
  285. package/data/docs/types/MoneyInputFieldProps.json +9 -0
  286. package/data/docs/types/MultilineTextInput.json +1194 -0
  287. package/data/docs/types/MultilineTextInputField.json +1269 -0
  288. package/data/docs/types/MultilineTextInputFieldProps.json +9 -0
  289. package/data/docs/types/NimbusI18nProvider.json +42 -0
  290. package/data/docs/types/NimbusI18nProviderProps.json +9 -0
  291. package/data/docs/types/NimbusProvider.json +270 -0
  292. package/data/docs/types/NumberInput.json +952 -0
  293. package/data/docs/types/NumberInputField.json +1004 -0
  294. package/data/docs/types/NumberInputFieldProps.json +9 -0
  295. package/data/docs/types/PageContent.json +11 -0
  296. package/data/docs/types/PageContentColumn.json +99 -0
  297. package/data/docs/types/PageContentRoot.json +114 -0
  298. package/data/docs/types/Pagination.json +159 -0
  299. package/data/docs/types/PasswordInput.json +1120 -0
  300. package/data/docs/types/PasswordInputField.json +1216 -0
  301. package/data/docs/types/PasswordInputFieldProps.json +9 -0
  302. package/data/docs/types/ProgressBar.json +280 -0
  303. package/data/docs/types/RadioInputOption.json +550 -0
  304. package/data/docs/types/RadioInputRoot.json +514 -0
  305. package/data/docs/types/RangeCalendar.json +618 -0
  306. package/data/docs/types/RichTextInput.json +134 -0
  307. package/data/docs/types/Root.json +122 -0
  308. package/data/docs/types/Row.json +67 -0
  309. package/data/docs/types/ScopedSearchInput.isEmpty.json +40 -0
  310. package/data/docs/types/ScopedSearchInput.json +253 -0
  311. package/data/docs/types/ScrollArea.json +82 -0
  312. package/data/docs/types/SearchInput.json +1165 -0
  313. package/data/docs/types/SearchInputField.json +1240 -0
  314. package/data/docs/types/Select.json +12 -0
  315. package/data/docs/types/SelectOption.json +572 -0
  316. package/data/docs/types/SelectOptionGroup.json +215 -0
  317. package/data/docs/types/SelectOptions.json +693 -0
  318. package/data/docs/types/SelectRoot.json +926 -0
  319. package/data/docs/types/Separator.json +65 -0
  320. package/data/docs/types/SimpleGrid.json +291 -0
  321. package/data/docs/types/Spacer.json +27 -0
  322. package/data/docs/types/SpacerProps.json +9 -0
  323. package/data/docs/types/SplitButton.json +203 -0
  324. package/data/docs/types/Stack.json +144 -0
  325. package/data/docs/types/Steps.json +12 -0
  326. package/data/docs/types/StepsChangeDetails.json +9 -0
  327. package/data/docs/types/StepsCompletedContent.json +28 -0
  328. package/data/docs/types/StepsCompletedContentProps.json +9 -0
  329. package/data/docs/types/StepsContent.json +43 -0
  330. package/data/docs/types/StepsContentProps.json +9 -0
  331. package/data/docs/types/StepsDescription.json +28 -0
  332. package/data/docs/types/StepsDescriptionProps.json +9 -0
  333. package/data/docs/types/StepsIndicator.json +28 -0
  334. package/data/docs/types/StepsIndicatorProps.json +9 -0
  335. package/data/docs/types/StepsItem.json +43 -0
  336. package/data/docs/types/StepsItemProps.json +9 -0
  337. package/data/docs/types/StepsList.json +28 -0
  338. package/data/docs/types/StepsListProps.json +9 -0
  339. package/data/docs/types/StepsNextTrigger.json +62 -0
  340. package/data/docs/types/StepsNextTriggerProps.json +9 -0
  341. package/data/docs/types/StepsNumber.json +28 -0
  342. package/data/docs/types/StepsNumberProps.json +9 -0
  343. package/data/docs/types/StepsPrevTrigger.json +62 -0
  344. package/data/docs/types/StepsPrevTriggerProps.json +9 -0
  345. package/data/docs/types/StepsRoot.json +183 -0
  346. package/data/docs/types/StepsRootProps.json +11 -0
  347. package/data/docs/types/StepsSeparator.json +28 -0
  348. package/data/docs/types/StepsSeparatorProps.json +9 -0
  349. package/data/docs/types/StepsStatus.json +57 -0
  350. package/data/docs/types/StepsStatusProps.json +9 -0
  351. package/data/docs/types/StepsTitle.json +28 -0
  352. package/data/docs/types/StepsTitleProps.json +9 -0
  353. package/data/docs/types/StepsTrigger.json +47 -0
  354. package/data/docs/types/StepsTriggerProps.json +9 -0
  355. package/data/docs/types/Switch.json +371 -0
  356. package/data/docs/types/TabListProps.json +9 -0
  357. package/data/docs/types/TabNav.json +12 -0
  358. package/data/docs/types/TabNavItem.json +300 -0
  359. package/data/docs/types/TabNavItemProps.json +9 -0
  360. package/data/docs/types/TabNavProps.json +9 -0
  361. package/data/docs/types/TabNavRoot.json +80 -0
  362. package/data/docs/types/TabPanelProps.json +9 -0
  363. package/data/docs/types/TabPanelsProps.json +9 -0
  364. package/data/docs/types/TabProps.json +9 -0
  365. package/data/docs/types/Table.json +9 -0
  366. package/data/docs/types/TableBody.json +67 -0
  367. package/data/docs/types/TableBodyProps.json +9 -0
  368. package/data/docs/types/TableCaption.json +67 -0
  369. package/data/docs/types/TableCaptionProps.json +9 -0
  370. package/data/docs/types/TableCell.json +227 -0
  371. package/data/docs/types/TableCellProps.json +9 -0
  372. package/data/docs/types/TableColumn.json +101 -0
  373. package/data/docs/types/TableColumnGroup.json +101 -0
  374. package/data/docs/types/TableColumnGroupProps.json +9 -0
  375. package/data/docs/types/TableColumnHeader.json +193 -0
  376. package/data/docs/types/TableColumnHeaderProps.json +9 -0
  377. package/data/docs/types/TableColumnProps.json +9 -0
  378. package/data/docs/types/TableFooter.json +67 -0
  379. package/data/docs/types/TableFooterProps.json +9 -0
  380. package/data/docs/types/TableHeader.json +67 -0
  381. package/data/docs/types/TableHeaderProps.json +9 -0
  382. package/data/docs/types/TableRoot.json +365 -0
  383. package/data/docs/types/TableRootProps.json +12 -0
  384. package/data/docs/types/TableRow.json +67 -0
  385. package/data/docs/types/TableRowProps.json +9 -0
  386. package/data/docs/types/TableScrollArea.json +82 -0
  387. package/data/docs/types/TableScrollAreaProps.json +9 -0
  388. package/data/docs/types/Tabs.json +12 -0
  389. package/data/docs/types/TabsList.json +110 -0
  390. package/data/docs/types/TabsPanel.json +112 -0
  391. package/data/docs/types/TabsPanels.json +108 -0
  392. package/data/docs/types/TabsRoot.json +211 -0
  393. package/data/docs/types/TabsTab.json +174 -0
  394. package/data/docs/types/TagGroup.json +12 -0
  395. package/data/docs/types/TagGroupRoot.json +306 -0
  396. package/data/docs/types/TagGroupTag.json +595 -0
  397. package/data/docs/types/TagGroupTagList.json +166 -0
  398. package/data/docs/types/Text.json +119 -0
  399. package/data/docs/types/TextInput.json +1156 -0
  400. package/data/docs/types/TextInputField.json +1263 -0
  401. package/data/docs/types/TimeInput.json +752 -0
  402. package/data/docs/types/ToastAction.json +9 -0
  403. package/data/docs/types/ToastManagerApi.json +9 -0
  404. package/data/docs/types/ToastOptions.json +9 -0
  405. package/data/docs/types/ToastOutlet.json +12 -0
  406. package/data/docs/types/ToastPlacement.json +9 -0
  407. package/data/docs/types/ToastPromiseOptions.json +9 -0
  408. package/data/docs/types/ToastType.json +9 -0
  409. package/data/docs/types/ToastVariant.json +9 -0
  410. package/data/docs/types/ToggleButton.json +789 -0
  411. package/data/docs/types/ToggleButtonGroup.json +9 -0
  412. package/data/docs/types/ToggleButtonGroupButton.json +331 -0
  413. package/data/docs/types/ToggleButtonGroupRoot.json +269 -0
  414. package/data/docs/types/Toolbar.json +176 -0
  415. package/data/docs/types/Tooltip.json +12 -0
  416. package/data/docs/types/TooltipContent.json +372 -0
  417. package/data/docs/types/TooltipRoot.json +179 -0
  418. package/data/docs/types/Trigger.json +69 -0
  419. package/data/docs/types/VisuallyHidden.json +93 -0
  420. package/data/docs/types/__object.json +12 -0
  421. package/data/docs/types/filters.json +11 -0
  422. package/data/docs/types/manifest.json +278 -0
  423. package/data/docs/types/toast.json +234 -0
  424. package/data/docs/types/useColorMode.json +13 -0
  425. package/data/docs/types/useColorModeValue.json +13 -0
  426. package/data/docs/types/useColorScheme.json +12 -0
  427. package/data/docs/types/useLocalizedStringFormatter.json +14 -0
  428. package/data/icons.json +21940 -0
  429. package/data/tokens.json +40061 -0
  430. package/dist/index.js +2516 -17
  431. package/package.json +25 -6
  432. package/dist/data-loader.d.ts +0 -102
  433. package/dist/data-loader.js +0 -104
  434. package/dist/index.d.ts +0 -13
  435. package/dist/server.d.ts +0 -9
  436. package/dist/server.js +0 -22
  437. package/dist/server.spec.d.ts +0 -1
  438. package/dist/server.spec.js +0 -69
  439. package/dist/tools/list-components.d.ts +0 -9
  440. package/dist/tools/list-components.js +0 -42
  441. package/dist/types.d.ts +0 -28
  442. package/dist/types.js +0 -4
  443. package/src/data-loader.ts +0 -226
  444. package/src/index.ts +0 -29
  445. package/src/server.spec.ts +0 -86
  446. package/src/server.ts +0 -28
  447. package/src/tools/list-components.ts +0 -49
  448. package/src/types.ts +0 -31
  449. package/tsconfig.json +0 -14
  450. package/vitest.config.ts +0 -9
@@ -0,0 +1,670 @@
1
+ {
2
+ "meta": {
3
+ "id": "Components-SplitButton",
4
+ "title": "Split button",
5
+ "exportName": "SplitButton",
6
+ "description": "A split button merges a main action with a dropdown for related, less common actions.",
7
+ "lifecycleState": "Stable",
8
+ "order": 999,
9
+ "repoPath": "packages/nimbus/src/components/split-button/split-button.mdx",
10
+ "menu": [
11
+ "Components",
12
+ "Buttons",
13
+ "Split button"
14
+ ],
15
+ "route": "components/buttons/split-button",
16
+ "tags": [
17
+ "component",
18
+ "buttons",
19
+ "actions",
20
+ "controls"
21
+ ],
22
+ "toc": [
23
+ {
24
+ "value": "Overview",
25
+ "href": "#overview",
26
+ "depth": 2,
27
+ "numbering": [
28
+ 1,
29
+ 1
30
+ ],
31
+ "parent": "root"
32
+ },
33
+ {
34
+ "value": "Resources",
35
+ "href": "#resources",
36
+ "depth": 3,
37
+ "numbering": [
38
+ 1,
39
+ 1,
40
+ 1
41
+ ],
42
+ "parent": "root"
43
+ },
44
+ {
45
+ "value": "Variables",
46
+ "href": "#variables",
47
+ "depth": 2,
48
+ "numbering": [
49
+ 1,
50
+ 2
51
+ ],
52
+ "parent": "root"
53
+ },
54
+ {
55
+ "value": "Visuals",
56
+ "href": "#visuals",
57
+ "depth": 3,
58
+ "numbering": [
59
+ 1,
60
+ 2,
61
+ 1
62
+ ],
63
+ "parent": "root"
64
+ },
65
+ {
66
+ "value": "Solid",
67
+ "href": "#solid",
68
+ "depth": 4,
69
+ "numbering": [
70
+ 1,
71
+ 2,
72
+ 1,
73
+ 1
74
+ ],
75
+ "parent": "root"
76
+ },
77
+ {
78
+ "value": "Outlined",
79
+ "href": "#outlined",
80
+ "depth": 4,
81
+ "numbering": [
82
+ 1,
83
+ 2,
84
+ 1,
85
+ 2
86
+ ],
87
+ "parent": "root"
88
+ },
89
+ {
90
+ "value": "Ghost",
91
+ "href": "#ghost",
92
+ "depth": 4,
93
+ "numbering": [
94
+ 1,
95
+ 2,
96
+ 1,
97
+ 3
98
+ ],
99
+ "parent": "root"
100
+ },
101
+ {
102
+ "value": "Icons",
103
+ "href": "#icons",
104
+ "depth": 3,
105
+ "numbering": [
106
+ 1,
107
+ 2,
108
+ 2
109
+ ],
110
+ "parent": "root"
111
+ },
112
+ {
113
+ "value": "Size",
114
+ "href": "#size",
115
+ "depth": 3,
116
+ "numbering": [
117
+ 1,
118
+ 2,
119
+ 3
120
+ ],
121
+ "parent": "root"
122
+ }
123
+ ],
124
+ "figmaLink": "https://www.figma.com/design/AvtPX6g7OGGCRvNlatGOIY/NIMBUS-design-system?m=auto&node-id=5748-39095&t=N9rn8aDkNAPrLOn4-1",
125
+ "layout": "app-frame",
126
+ "tabs": [
127
+ {
128
+ "key": "overview",
129
+ "title": "Overview",
130
+ "order": 0
131
+ },
132
+ {
133
+ "key": "guidelines",
134
+ "title": "Guidelines",
135
+ "order": 2
136
+ },
137
+ {
138
+ "key": "dev",
139
+ "title": "Implementation",
140
+ "order": 3
141
+ },
142
+ {
143
+ "key": "a11y",
144
+ "title": "Accessibility",
145
+ "order": 4
146
+ }
147
+ ]
148
+ },
149
+ "mdx": "\n## Overview\n\nA split button merges a main action that is immediate with a secondary dropdown\nmenu that holds related actions that are used less often. This component\nprovides quick access to essential functions while offering a complete list of\noptions, all while saving space.\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=5602-17630&p=f&focus-id=6765-49694&m=dev)\n\n## Variables\n\nGet familiar with the features.\n\n### Visuals\n\n#### Solid\n\nMost common styling of the split button. Try to keep only one solid primary\ntoned button in an area for user clarity for the most important task. Too many\nin an area can cause confusion.\n\n```jsx live\nconst App = () => {\n return (\n <SplitButton\n variant=\"solid\"\n tone=\"primary\"\n onAction={(actionId) => alert(`Action: ${actionId}`)}\n aria-label=\"More publish options\"\n >\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n );\n}\n```\n\n#### Outlined\n\nOutlined styled buttons are for secondary or less important actions.\n\n```jsx live\nconst App = () => {\n return (\n <SplitButton\n variant=\"outline\"\n tone=\"primary\"\n onAction={(actionId) => alert(`Action: ${actionId}`)}\n aria-label=\"More publish options\"\n >\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n );\n}\n```\n\n#### Ghost\n\nGhost styled buttons are helpful for UI simplification. You will find these in\nsmaller sizes within places like toolbars.\n\n```jsx live\nconst App = () => {\n return (\n <SplitButton\n variant=\"ghost\"\n tone=\"primary\"\n onAction={(actionId) => alert(`Action: ${actionId}`)}\n aria-label=\"More publish options\"\n >\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n );\n}\n```\n\n### Icons\n\nKeep consistency in mind for icons and consider other patterns that are nearby.\n\n```jsx live\nconst App = () => (\n <SplitButton\n tone=\"primary\"\n onAction={(actionId) => alert(`Action: ${actionId}`)}\n aria-label=\"More document actions\"\n icon={<Icons.Share />}\n >\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n )\n\n```\n\n### Size\n\nThere are three sizes to split buttons, the default size is medium (md), extra\nsmall (xs), and 2x-small (2xs).\n\n```jsx live\nconst App = () => (\n <Stack direction=\"horizontal\" gap=\"400\" alignItems=\"center\">\n <SplitButton tone=\"primary\" size=\"md\" onAction={(id) => {}} aria-label=\"publish options\">\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n <SplitButton tone=\"primary\" size=\"xs\" onAction={(id) => {}} aria-label=\"publish options\">\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n <SplitButton tone=\"primary\" size=\"2xs\" onAction={(id) => {}} aria-label=\"publish options\">\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n </Stack>\n)\n```\n",
150
+ "views": {
151
+ "overview": {
152
+ "mdx": "\n## Overview\n\nA split button merges a main action that is immediate with a secondary dropdown\nmenu that holds related actions that are used less often. This component\nprovides quick access to essential functions while offering a complete list of\noptions, all while saving space.\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=5602-17630&p=f&focus-id=6765-49694&m=dev)\n\n## Variables\n\nGet familiar with the features.\n\n### Visuals\n\n#### Solid\n\nMost common styling of the split button. Try to keep only one solid primary\ntoned button in an area for user clarity for the most important task. Too many\nin an area can cause confusion.\n\n```jsx live\nconst App = () => {\n return (\n <SplitButton\n variant=\"solid\"\n tone=\"primary\"\n onAction={(actionId) => alert(`Action: ${actionId}`)}\n aria-label=\"More publish options\"\n >\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n );\n}\n```\n\n#### Outlined\n\nOutlined styled buttons are for secondary or less important actions.\n\n```jsx live\nconst App = () => {\n return (\n <SplitButton\n variant=\"outline\"\n tone=\"primary\"\n onAction={(actionId) => alert(`Action: ${actionId}`)}\n aria-label=\"More publish options\"\n >\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n );\n}\n```\n\n#### Ghost\n\nGhost styled buttons are helpful for UI simplification. You will find these in\nsmaller sizes within places like toolbars.\n\n```jsx live\nconst App = () => {\n return (\n <SplitButton\n variant=\"ghost\"\n tone=\"primary\"\n onAction={(actionId) => alert(`Action: ${actionId}`)}\n aria-label=\"More publish options\"\n >\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n );\n}\n```\n\n### Icons\n\nKeep consistency in mind for icons and consider other patterns that are nearby.\n\n```jsx live\nconst App = () => (\n <SplitButton\n tone=\"primary\"\n onAction={(actionId) => alert(`Action: ${actionId}`)}\n aria-label=\"More document actions\"\n icon={<Icons.Share />}\n >\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n )\n\n```\n\n### Size\n\nThere are three sizes to split buttons, the default size is medium (md), extra\nsmall (xs), and 2x-small (2xs).\n\n```jsx live\nconst App = () => (\n <Stack direction=\"horizontal\" gap=\"400\" alignItems=\"center\">\n <SplitButton tone=\"primary\" size=\"md\" onAction={(id) => {}} aria-label=\"publish options\">\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n <SplitButton tone=\"primary\" size=\"xs\" onAction={(id) => {}} aria-label=\"publish options\">\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n <SplitButton tone=\"primary\" size=\"2xs\" onAction={(id) => {}} aria-label=\"publish options\">\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n </Stack>\n)\n```\n",
153
+ "toc": [
154
+ {
155
+ "value": "Overview",
156
+ "href": "#overview",
157
+ "depth": 2,
158
+ "numbering": [
159
+ 1,
160
+ 1
161
+ ],
162
+ "parent": "root"
163
+ },
164
+ {
165
+ "value": "Resources",
166
+ "href": "#resources",
167
+ "depth": 3,
168
+ "numbering": [
169
+ 1,
170
+ 1,
171
+ 1
172
+ ],
173
+ "parent": "root"
174
+ },
175
+ {
176
+ "value": "Variables",
177
+ "href": "#variables",
178
+ "depth": 2,
179
+ "numbering": [
180
+ 1,
181
+ 2
182
+ ],
183
+ "parent": "root"
184
+ },
185
+ {
186
+ "value": "Visuals",
187
+ "href": "#visuals",
188
+ "depth": 3,
189
+ "numbering": [
190
+ 1,
191
+ 2,
192
+ 1
193
+ ],
194
+ "parent": "root"
195
+ },
196
+ {
197
+ "value": "Solid",
198
+ "href": "#solid",
199
+ "depth": 4,
200
+ "numbering": [
201
+ 1,
202
+ 2,
203
+ 1,
204
+ 1
205
+ ],
206
+ "parent": "root"
207
+ },
208
+ {
209
+ "value": "Outlined",
210
+ "href": "#outlined",
211
+ "depth": 4,
212
+ "numbering": [
213
+ 1,
214
+ 2,
215
+ 1,
216
+ 2
217
+ ],
218
+ "parent": "root"
219
+ },
220
+ {
221
+ "value": "Ghost",
222
+ "href": "#ghost",
223
+ "depth": 4,
224
+ "numbering": [
225
+ 1,
226
+ 2,
227
+ 1,
228
+ 3
229
+ ],
230
+ "parent": "root"
231
+ },
232
+ {
233
+ "value": "Icons",
234
+ "href": "#icons",
235
+ "depth": 3,
236
+ "numbering": [
237
+ 1,
238
+ 2,
239
+ 2
240
+ ],
241
+ "parent": "root"
242
+ },
243
+ {
244
+ "value": "Size",
245
+ "href": "#size",
246
+ "depth": 3,
247
+ "numbering": [
248
+ 1,
249
+ 2,
250
+ 3
251
+ ],
252
+ "parent": "root"
253
+ }
254
+ ]
255
+ },
256
+ "a11y": {
257
+ "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 return (\n <SplitButton\n variant=\"solid\"\n tone=\"primary\"\n onAction={(actionId) => alert(`Action: ${actionId}`)}\n aria-label=\"More publish options\"\n >\n <Menu.Item id=\"publish\">Publish</Menu.Item>\n <Menu.Item id=\"publish-next\">Publish and open next</Menu.Item>\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n </SplitButton>\n );\n}\n```\n\n### Accessibility standards\n\n- **Keyboard navigation:** The component must be fully keyboard accessible. The\n Tab key should focus on the primary button first.\n- **Dual focus:** The primary action and the dropdown trigger must be treated as\n two distinct focusable elements or as a single component where the arrow key\n can be used to open the menu once the button is focused.\n- **ARIA roles:** The primary button uses role=\"button\". The dropdown trigger\n should use role=\"button\" combined with aria-haspopup=\"true\" to indicate that\n it controls a pop-up menu.\n- **Labeling:** Provide clear, unique aria-label text for both the primary\n action and the dropdown trigger to ensure screen readers convey the intended\n function of each segment.\n",
258
+ "toc": [
259
+ {
260
+ "value": "Accessibility",
261
+ "href": "#accessibility",
262
+ "depth": 2,
263
+ "numbering": [
264
+ 1,
265
+ 1
266
+ ],
267
+ "parent": "root"
268
+ },
269
+ {
270
+ "value": "Accessibility standards",
271
+ "href": "#accessibility-standards",
272
+ "depth": 3,
273
+ "numbering": [
274
+ 1,
275
+ 1,
276
+ 1
277
+ ],
278
+ "parent": "root"
279
+ }
280
+ ]
281
+ },
282
+ "dev": {
283
+ "mdx": "\n## Getting started\n\n### Import\n\n```tsx\nimport { SplitButton, Menu, type SplitButtonProps } from '@commercetools/nimbus';\n```\n\n### Basic usage\n\nThe simplest implementation combines a primary action button with a dropdown menu:\n\n```jsx live-dev\nconst App = () => (\n <SplitButton\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"More actions\"\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"save-publish\">Save and Publish</Menu.Item>\n <Menu.Item id=\"save-next\">Save and Continue</Menu.Item>\n </SplitButton>\n)\n```\n\nThe component automatically selects the first enabled `Menu.Item` as the primary action. Clicking the primary button executes that action, while the dropdown trigger opens a menu with all available options.\n\n## Usage examples\n\n### With icon\n\nAdd an icon to the primary button for visual emphasis:\n\n```jsx live-dev\nconst App = () => (\n <Stack direction=\"row\" gap=\"400\">\n <SplitButton\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Save options\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"save-copy\">Save as Copy</Menu.Item>\n <Menu.Item id=\"save-template\">Save as Template</Menu.Item>\n </SplitButton>\n\n <SplitButton\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Share options\"\n icon={<Icons.Share />}\n >\n <Menu.Item id=\"share\">Share Document</Menu.Item>\n <Menu.Item id=\"copy-link\">Copy Link</Menu.Item>\n <Menu.Item id=\"email\">Send via Email</Menu.Item>\n </SplitButton>\n </Stack>\n)\n```\n\n### Size options\n\nThe component supports three size variants to match your interface density:\n\n```jsx live-dev\nconst App = () => (\n <Stack direction=\"row\" gap=\"400\" alignItems=\"center\">\n <SplitButton\n size=\"2xs\"\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Extra small actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n\n <SplitButton\n size=\"xs\"\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Small actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n\n <SplitButton\n size=\"md\"\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Medium actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n </Stack>\n)\n```\n\n### Visual variants\n\nChoose between visual variants to match your design context:\n\n```jsx live-dev\nconst App = () => (\n <Stack direction=\"column\" gap=\"400\">\n <Stack direction=\"row\" gap=\"300\" wrap=\"wrap\">\n <SplitButton\n variant=\"solid\"\n colorPalette=\"primary\"\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Solid variant actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n\n <SplitButton\n variant=\"subtle\"\n colorPalette=\"neutral\"\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Subtle variant actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n\n <SplitButton\n variant=\"outline\"\n colorPalette=\"primary\"\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Outline variant actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n\n <SplitButton\n variant=\"ghost\"\n colorPalette=\"primary\"\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Ghost variant actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n </Stack>\n </Stack>\n)\n```\n\n### Color palettes\n\nUse different color palettes to indicate action importance:\n\n```jsx live-dev\nconst App = () => (\n <Stack direction=\"row\" gap=\"400\" wrap=\"wrap\">\n <SplitButton\n variant=\"solid\"\n colorPalette=\"primary\"\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Primary actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n\n <SplitButton\n variant=\"outline\"\n colorPalette=\"critical\"\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Critical actions\"\n icon={<Icons.Delete />}\n >\n <Menu.Item id=\"delete\">Delete</Menu.Item>\n <Menu.Item id=\"archive\">Archive</Menu.Item>\n </SplitButton>\n\n <SplitButton\n variant=\"subtle\"\n colorPalette=\"neutral\"\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Neutral actions\"\n icon={<Icons.MoreVert />}\n >\n <Menu.Item id=\"view\">View Details</Menu.Item>\n <Menu.Item id=\"edit\">Edit</Menu.Item>\n </SplitButton>\n </Stack>\n)\n```\n\n### With sections and separators\n\nOrganize menu items into logical groups:\n\n```jsx live-dev\nconst App = () => (\n <SplitButton\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Document actions\"\n icon={<Icons.Save />}\n >\n <Menu.Section label=\"File Actions\">\n <Menu.Item id=\"save\">Save Document</Menu.Item>\n <Menu.Item id=\"save-as\">Save As Copy</Menu.Item>\n <Menu.Item id=\"export\">Export PDF</Menu.Item>\n </Menu.Section>\n\n <Separator />\n\n <Menu.Section label=\"Share\">\n <Menu.Item id=\"share-link\">Share Link</Menu.Item>\n <Menu.Item id=\"send-email\">Send via Email</Menu.Item>\n </Menu.Section>\n\n <Separator />\n\n <Menu.Section label=\"Manage\">\n <Menu.Item id=\"archive\">Archive</Menu.Item>\n <Menu.Item id=\"delete\" isCritical>\n Delete Document\n </Menu.Item>\n </Menu.Section>\n </SplitButton>\n)\n```\n\n### Menu item states\n\nUse `isDisabled` and `isCritical` props on menu items:\n\n```jsx live-dev\nconst App = () => (\n <SplitButton\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Task actions\"\n icon={<Icons.Task />}\n >\n <Menu.Item id=\"complete\">Complete Task</Menu.Item>\n <Menu.Item id=\"edit\">Edit Task</Menu.Item>\n <Menu.Item id=\"duplicate\">Duplicate Task</Menu.Item>\n <Menu.Item id=\"share\" isDisabled>\n Share Task (Pro only)\n </Menu.Item>\n <Menu.Item id=\"delete\" isCritical>\n Delete Task\n </Menu.Item>\n </SplitButton>\n)\n```\n\n**Automatic primary selection behavior:**\n- When the first `Menu.Item` is disabled, the component automatically selects the next enabled item as the primary action\n- If all items are disabled, the primary button shows the first item but is disabled\n\n### Disabled state\n\nDisable the entire split button:\n\n```jsx live-dev\nconst App = () => (\n <Stack direction=\"row\" gap=\"400\">\n <SplitButton\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Enabled actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n\n <SplitButton\n isDisabled\n onAction={(id) => alert(`Action: ${id}`)}\n aria-label=\"Disabled actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n </Stack>\n)\n```\n\n### Controlled menu state\n\nControl the menu's open/closed state programmatically:\n\n```jsx live-dev\nconst App = () => {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <Stack direction=\"row\" gap=\"300\">\n <Button size=\"xs\" onPress={() => setIsOpen(true)}>\n Open Menu\n </Button>\n <Button size=\"xs\" variant=\"secondary\" onPress={() => setIsOpen(false)}>\n Close Menu\n </Button>\n </Stack>\n <Text fontSize=\"sm\">\n Menu is {isOpen ? 'open' : 'closed'}\n </Text>\n <SplitButton\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n onAction={(id) => {\n alert(`Action: ${id}`);\n setIsOpen(false);\n }}\n aria-label=\"Controlled menu actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"save-publish\">Save and Publish</Menu.Item>\n <Menu.Item id=\"save-next\">Save and Continue</Menu.Item>\n </SplitButton>\n </Stack>\n );\n}\n```\n\n### Uncontrolled menu state\n\nUse `defaultOpen` for uncontrolled menu behavior:\n\n```jsx live-dev\nconst App = () => {\n const [lastAction, setLastAction] = useState<string>('None');\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <Text fontSize=\"sm\">\n Last action: {lastAction}\n </Text>\n <SplitButton\n defaultOpen={true}\n onAction={(id) => setLastAction(id)}\n aria-label=\"Uncontrolled menu actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"save-publish\">Save and Publish</Menu.Item>\n <Menu.Item id=\"save-next\">Save and Continue</Menu.Item>\n </SplitButton>\n </Stack>\n );\n}\n```\n\n## Component requirements\n\n### Menu.Item requirements\n\nThe SplitButton requires `Menu.Item` children with the following structure:\n- Each `Menu.Item` **must** have an `id` prop (used for the `onAction` callback)\n- Items without an `id` prop are ignored during primary action selection\n- The component automatically selects the first enabled `Menu.Item` as the primary action\n- If all items are disabled, the primary button shows the first item but is disabled\n\n## Accessibility\n\nThe SplitButton handles most accessibility requirements internally. However, you must provide an `aria-label` for the dropdown trigger button:\n\n```tsx\n<SplitButton\n aria-label=\"More save options\"\n onAction={handleAction}\n>\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n</SplitButton>\n```\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 = \"document-actions-split-button\";\n\nexport const DocumentActions = () => (\n <SplitButton\n id={PERSISTENT_ID}\n aria-label=\"Document actions\"\n onAction={handleAction}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n);\n```\n\n#### Keyboard navigation\n\nThe component supports full keyboard interaction:\n- `Tab` / `Shift+Tab`: Move focus between the primary button and dropdown trigger\n- `Enter` / `Space` (on primary button): Execute the primary action\n- `Enter` / `Space` (on dropdown trigger): Open/close the menu\n- `Arrow Up` / `Arrow Down`: Navigate menu items when menu is open\n- `Enter` (on menu item): Execute the selected action and close menu\n- `Escape`: Close the menu\n\n## API reference\n\n<PropsTable id=\"SplitButton\" />\n\n## Common patterns\n\n### Document operations\n\nCommon pattern for document save operations with multiple options:\n\n```jsx live-dev\nconst App = () => {\n const [status, setStatus] = useState<string>('No action taken');\n const [isSaving, setIsSaving] = useState(false);\n\n const handleAction = async (id: string) => {\n setIsSaving(true);\n setStatus(`Executing: ${id}...`);\n \n // Simulate async operation\n await new Promise(resolve => setTimeout(resolve, 1000));\n \n setIsSaving(false);\n setStatus(`Completed: ${id}`);\n };\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <SplitButton\n onAction={handleAction}\n aria-label=\"Save options\"\n icon={<Icons.Save />}\n isDisabled={isSaving}\n >\n <Menu.Item id=\"save\">Save Draft</Menu.Item>\n <Menu.Item id=\"save-publish\">Save and Publish</Menu.Item>\n <Menu.Item id=\"save-schedule\">Save and Schedule</Menu.Item>\n <Menu.Item id=\"save-template\">Save as Template</Menu.Item>\n </SplitButton>\n <Text fontSize=\"sm\" color=\"neutral.11\">\n {status}\n </Text>\n </Stack>\n );\n}\n```\n\n### Conditional actions based on state\n\nShow different actions based on application state:\n\n```jsx live-dev\nconst App = () => {\n const [isPublished, setIsPublished] = useState(false);\n const [lastAction, setLastAction] = useState<string>('');\n\n const handleAction = (id: string) => {\n if (id === 'publish') {\n setIsPublished(true);\n setLastAction('Document published');\n } else if (id === 'unpublish') {\n setIsPublished(false);\n setLastAction('Document unpublished');\n } else {\n setLastAction(`Action: ${id}`);\n }\n };\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <Text fontSize=\"sm\" fontWeight=\"semibold\">\n Status: {isPublished ? 'Published' : 'Draft'}\n </Text>\n \n {isPublished ? (\n <SplitButton\n onAction={handleAction}\n aria-label=\"Published document actions\"\n icon={<Icons.Visibility />}\n colorPalette=\"primary\"\n >\n <Menu.Item id=\"unpublish\">Unpublish</Menu.Item>\n <Menu.Item id=\"update\">Update Published Version</Menu.Item>\n <Menu.Item id=\"analytics\">View Analytics</Menu.Item>\n <Menu.Item id=\"share\">Share Link</Menu.Item>\n </SplitButton>\n ) : (\n <SplitButton\n onAction={handleAction}\n aria-label=\"Draft document actions\"\n icon={<Icons.Save />}\n >\n <Menu.Item id=\"publish\">Publish Document</Menu.Item>\n <Menu.Item id=\"save-draft\">Save Draft</Menu.Item>\n <Menu.Item id=\"preview\">Preview</Menu.Item>\n <Menu.Item id=\"discard\">Discard Changes</Menu.Item>\n </SplitButton>\n )}\n \n {lastAction && (\n <Text fontSize=\"sm\" color=\"neutral.11\">\n {lastAction}\n </Text>\n )}\n </Stack>\n );\n}\n```\n\n## Testing your implementation\n\nThese examples demonstrate how to test your implementation when using SplitButton 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 Rendering Tests\n\nVerify the SplitButton renders with expected structure and elements\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, waitFor } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { SplitButton, Menu, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"SplitButton - Basic rendering\", () => {\n it(\"renders primary button and dropdown trigger\", () => {\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"More actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n // Primary button should show first action\n const buttons = screen.getAllByRole(\"button\");\n expect(buttons.length).toBeGreaterThanOrEqual(2);\n\n // Dropdown trigger should have aria-label\n const dropdownTrigger = screen.getByRole(\"button\", {\n name: /More actions/i,\n });\n expect(dropdownTrigger).toBeInTheDocument();\n });\n\n it(\"displays first enabled menu item as primary action\", () => {\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save Document</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n // Primary button should show \"Save Document\"\n expect(screen.getByText(\"Save Document\")).toBeInTheDocument();\n });\n\n it(\"renders with icon in primary button\", () => {\n const TestIcon = () => <svg data-testid=\"test-icon\" />;\n\n render(\n <NimbusProvider>\n <SplitButton\n onAction={vi.fn()}\n aria-label=\"Actions\"\n icon={<TestIcon />}\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n expect(screen.getByTestId(\"test-icon\")).toBeInTheDocument();\n });\n\n it(\"renders with different sizes\", () => {\n const { rerender } = render(\n <NimbusProvider>\n <SplitButton size=\"2xs\" onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n expect(\n screen.getByRole(\"button\", { name: /Actions/i })\n ).toBeInTheDocument();\n\n rerender(\n <NimbusProvider>\n <SplitButton size=\"md\" onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n expect(\n screen.getByRole(\"button\", { name: /Actions/i })\n ).toBeInTheDocument();\n });\n});\n```\n\n### Interaction Tests\n\nTest user interactions with primary button and dropdown menu\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, waitFor } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { SplitButton, Menu, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"SplitButton - Interactions\", () => {\n it(\"executes primary action when primary button is clicked\", async () => {\n const user = userEvent.setup();\n const handleAction = vi.fn();\n\n render(\n <NimbusProvider>\n <SplitButton onAction={handleAction} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n const primaryButton = screen.getByText(\"Save\");\n await user.click(primaryButton);\n\n expect(handleAction).toHaveBeenCalledWith(\"save\");\n });\n\n it(\"opens dropdown menu when trigger is clicked\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"More actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n const dropdownTrigger = screen.getByRole(\"button\", {\n name: /More actions/i,\n });\n await user.click(dropdownTrigger);\n\n await waitFor(() => {\n expect(screen.getByRole(\"menu\")).toBeInTheDocument();\n });\n });\n\n it(\"executes selected menu item action\", async () => {\n const user = userEvent.setup();\n const handleAction = vi.fn();\n\n render(\n <NimbusProvider>\n <SplitButton onAction={handleAction} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n // Open menu\n const dropdownTrigger = screen.getByRole(\"button\", { name: /Actions/i });\n await user.click(dropdownTrigger);\n\n // Click menu item\n await waitFor(() => {\n expect(screen.getByRole(\"menu\")).toBeInTheDocument();\n });\n\n const exportItem = screen.getByRole(\"menuitem\", { name: /Export/i });\n await user.click(exportItem);\n\n expect(handleAction).toHaveBeenCalledWith(\"export\");\n });\n\n it(\"closes menu after selecting an item\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n // Open menu\n const dropdownTrigger = screen.getByRole(\"button\", { name: /Actions/i });\n await user.click(dropdownTrigger);\n\n await waitFor(() => {\n expect(screen.getByRole(\"menu\")).toBeInTheDocument();\n });\n\n // Select item\n const saveItem = screen.getByRole(\"menuitem\", { name: /Save/i });\n await user.click(saveItem);\n\n // Menu should close\n await waitFor(() => {\n expect(screen.queryByRole(\"menu\")).not.toBeInTheDocument();\n });\n });\n});\n```\n\n### Primary Action Selection Tests\n\nTest automatic primary action selection logic\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, waitFor } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { SplitButton, Menu, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"SplitButton - Primary action selection\", () => {\n it(\"selects first enabled item when first item is disabled\", () => {\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\" isDisabled>\n Save\n </Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n // Primary button should show \"Export\" (first enabled item)\n expect(screen.getByText(\"Export\")).toBeInTheDocument();\n });\n\n it(\"shows first item even if all items are disabled\", () => {\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\" isDisabled>\n Save\n </Menu.Item>\n <Menu.Item id=\"export\" isDisabled>\n Export\n </Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n // Primary button should show first item\n expect(screen.getByText(\"Save\")).toBeInTheDocument();\n });\n\n it(\"handles Menu.Items nested in Menu.Section\", () => {\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Section label=\"File\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </Menu.Section>\n </SplitButton>\n </NimbusProvider>\n );\n\n // Should still find and display first item from section\n expect(screen.getByText(\"Save\")).toBeInTheDocument();\n });\n});\n```\n\n### Controlled Mode Tests\n\nTest controlled menu state behavior\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, waitFor } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { SplitButton, Menu, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"SplitButton - Controlled mode\", () => {\n it(\"respects controlled isOpen prop\", async () => {\n const { rerender } = render(\n <NimbusProvider>\n <SplitButton\n isOpen={false}\n onOpenChange={vi.fn()}\n onAction={vi.fn()}\n aria-label=\"Actions\"\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n expect(screen.queryByRole(\"menu\")).not.toBeInTheDocument();\n\n rerender(\n <NimbusProvider>\n <SplitButton\n isOpen={true}\n onOpenChange={vi.fn()}\n onAction={vi.fn()}\n aria-label=\"Actions\"\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n await waitFor(() => {\n expect(screen.getByRole(\"menu\")).toBeInTheDocument();\n });\n });\n\n it(\"calls onOpenChange when menu state changes\", async () => {\n const user = userEvent.setup();\n const handleOpenChange = vi.fn();\n\n render(\n <NimbusProvider>\n <SplitButton\n onOpenChange={handleOpenChange}\n onAction={vi.fn()}\n aria-label=\"Actions\"\n >\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n const dropdownTrigger = screen.getByRole(\"button\", { name: /Actions/i });\n await user.click(dropdownTrigger);\n\n expect(handleOpenChange).toHaveBeenCalledWith(true);\n });\n});\n```\n\n### Uncontrolled Mode Tests\n\nTest uncontrolled menu state with defaultOpen\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, waitFor } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { SplitButton, Menu, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"SplitButton - Uncontrolled mode\", () => {\n it(\"opens menu by default when defaultOpen is true\", async () => {\n render(\n <NimbusProvider>\n <SplitButton defaultOpen={true} onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n await waitFor(() => {\n expect(screen.getByRole(\"menu\")).toBeInTheDocument();\n });\n });\n\n it(\"manages internal state when uncontrolled\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n expect(screen.queryByRole(\"menu\")).not.toBeInTheDocument();\n\n const dropdownTrigger = screen.getByRole(\"button\", { name: /Actions/i });\n await user.click(dropdownTrigger);\n\n await waitFor(() => {\n expect(screen.getByRole(\"menu\")).toBeInTheDocument();\n });\n\n // Click outside or press escape to close\n await user.keyboard(\"{Escape}\");\n\n await waitFor(() => {\n expect(screen.queryByRole(\"menu\")).not.toBeInTheDocument();\n });\n });\n});\n```\n\n### State Tests\n\nTest different component states (disabled, menu item states)\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, waitFor } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { SplitButton, Menu, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"SplitButton - States\", () => {\n it(\"disables both buttons when isDisabled is true\", () => {\n render(\n <NimbusProvider>\n <SplitButton isDisabled onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n const buttons = screen.getAllByRole(\"button\");\n buttons.forEach((button) => {\n expect(button).toBeDisabled();\n });\n });\n\n it(\"disables primary button when primary action is disabled\", () => {\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\" isDisabled>\n Save\n </Menu.Item>\n <Menu.Item id=\"export\" isDisabled>\n Export\n </Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n const primaryButton = screen.getByText(\"Save\");\n expect(primaryButton).toBeDisabled();\n });\n\n it(\"disables dropdown trigger when no actionable items exist\", () => {\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\" isDisabled>\n Save\n </Menu.Item>\n <Menu.Item id=\"export\" isDisabled>\n Export\n </Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n const dropdownTrigger = screen.getByRole(\"button\", { name: /Actions/i });\n expect(dropdownTrigger).toBeDisabled();\n });\n\n it(\"renders critical menu items\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"delete\" isCritical>\n Delete\n </Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n const dropdownTrigger = screen.getByRole(\"button\", { name: /Actions/i });\n await user.click(dropdownTrigger);\n\n await waitFor(() => {\n expect(\n screen.getByRole(\"menuitem\", { name: /Delete/i })\n ).toBeInTheDocument();\n });\n });\n});\n```\n\n### Accessibility Tests\n\nVerify ARIA attributes and keyboard navigation\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, waitFor } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { SplitButton, Menu, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"SplitButton - Accessibility\", () => {\n it(\"has proper ARIA attributes on dropdown trigger\", () => {\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"More actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n const dropdownTrigger = screen.getByRole(\"button\", {\n name: /More actions/i,\n });\n expect(dropdownTrigger).toHaveAttribute(\"aria-label\", \"More actions\");\n expect(dropdownTrigger).toHaveAttribute(\"aria-expanded\", \"false\");\n });\n\n it(\"updates aria-expanded when menu opens\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n const dropdownTrigger = screen.getByRole(\"button\", { name: /Actions/i });\n expect(dropdownTrigger).toHaveAttribute(\"aria-expanded\", \"false\");\n\n await user.click(dropdownTrigger);\n\n await waitFor(() => {\n expect(dropdownTrigger).toHaveAttribute(\"aria-expanded\", \"true\");\n });\n });\n\n it(\"supports keyboard navigation in menu\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n <Menu.Item id=\"print\">Print</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n const dropdownTrigger = screen.getByRole(\"button\", { name: /Actions/i });\n await user.click(dropdownTrigger);\n\n await waitFor(() => {\n expect(screen.getByRole(\"menu\")).toBeInTheDocument();\n });\n\n const menuItems = screen.getAllByRole(\"menuitem\");\n\n // First item should have focus initially\n await waitFor(() => {\n expect(menuItems[0]).toHaveFocus();\n });\n\n // Navigate down\n await user.keyboard(\"{ArrowDown}\");\n expect(menuItems[1]).toHaveFocus();\n\n // Navigate down again\n await user.keyboard(\"{ArrowDown}\");\n expect(menuItems[2]).toHaveFocus();\n });\n\n it(\"closes menu with Escape key\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n const dropdownTrigger = screen.getByRole(\"button\", { name: /Actions/i });\n await user.click(dropdownTrigger);\n\n await waitFor(() => {\n expect(screen.getByRole(\"menu\")).toBeInTheDocument();\n });\n\n await user.keyboard(\"{Escape}\");\n\n await waitFor(() => {\n expect(screen.queryByRole(\"menu\")).not.toBeInTheDocument();\n });\n });\n\n it(\"primary button is keyboard accessible\", async () => {\n const user = userEvent.setup();\n const handleAction = vi.fn();\n\n render(\n <NimbusProvider>\n <SplitButton onAction={handleAction} aria-label=\"Actions\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n </SplitButton>\n </NimbusProvider>\n );\n\n // Tab to primary button\n await user.tab();\n\n const primaryButton = screen.getByText(\"Save\");\n expect(primaryButton).toHaveFocus();\n\n // Activate with Enter\n await user.keyboard(\"{Enter}\");\n\n expect(handleAction).toHaveBeenCalledWith(\"save\");\n });\n});\n```\n\n### Menu Content Tests\n\nTest rendering of menu sections and separators\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen, waitFor } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { SplitButton, Menu, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"SplitButton - Menu content\", () => {\n it(\"renders menu with sections\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <Menu.Section label=\"File\">\n <Menu.Item id=\"save\">Save</Menu.Item>\n <Menu.Item id=\"export\">Export</Menu.Item>\n </Menu.Section>\n <Menu.Section label=\"Edit\">\n <Menu.Item id=\"copy\">Copy</Menu.Item>\n </Menu.Section>\n </SplitButton>\n </NimbusProvider>\n );\n\n const dropdownTrigger = screen.getByRole(\"button\", { name: /Actions/i });\n await user.click(dropdownTrigger);\n\n await waitFor(() => {\n expect(screen.getByRole(\"menu\")).toBeInTheDocument();\n });\n\n // Check for section labels\n expect(screen.getByText(\"File\")).toBeInTheDocument();\n expect(screen.getByText(\"Edit\")).toBeInTheDocument();\n\n // Check for menu items\n expect(screen.getByRole(\"menuitem\", { name: /Save/i })).toBeInTheDocument();\n expect(screen.getByRole(\"menuitem\", { name: /Copy/i })).toBeInTheDocument();\n });\n\n it(\"handles empty menu gracefully\", () => {\n render(\n <NimbusProvider>\n <SplitButton onAction={vi.fn()} aria-label=\"Actions\">\n <></>\n </SplitButton>\n </NimbusProvider>\n );\n\n // Should render with fallback text\n expect(screen.getByText(/No actions available/i)).toBeInTheDocument();\n });\n});\n```\n\n\n## Resources\n\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/components-buttons-splitbutton--docs)\n- [React Aria Menu](https://react-spectrum.adobe.com/react-aria/Menu.html)\n- [ARIA Menu Button Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/menubutton/)\n- [Menu Component](/components/navigation/menu)\n- [Button Component](/components/inputs/button)\n- [IconButton Component](/components/inputs/iconbutton)\n",
284
+ "toc": [
285
+ {
286
+ "value": "Getting started",
287
+ "href": "#getting-started",
288
+ "depth": 2,
289
+ "numbering": [
290
+ 1,
291
+ 1
292
+ ],
293
+ "parent": "root"
294
+ },
295
+ {
296
+ "value": "Import",
297
+ "href": "#import",
298
+ "depth": 3,
299
+ "numbering": [
300
+ 1,
301
+ 1,
302
+ 1
303
+ ],
304
+ "parent": "root"
305
+ },
306
+ {
307
+ "value": "Basic usage",
308
+ "href": "#basic-usage",
309
+ "depth": 3,
310
+ "numbering": [
311
+ 1,
312
+ 1,
313
+ 2
314
+ ],
315
+ "parent": "root"
316
+ },
317
+ {
318
+ "value": "Usage examples",
319
+ "href": "#usage-examples",
320
+ "depth": 2,
321
+ "numbering": [
322
+ 1,
323
+ 2
324
+ ],
325
+ "parent": "root"
326
+ },
327
+ {
328
+ "value": "With icon",
329
+ "href": "#with-icon",
330
+ "depth": 3,
331
+ "numbering": [
332
+ 1,
333
+ 2,
334
+ 1
335
+ ],
336
+ "parent": "root"
337
+ },
338
+ {
339
+ "value": "Size options",
340
+ "href": "#size-options",
341
+ "depth": 3,
342
+ "numbering": [
343
+ 1,
344
+ 2,
345
+ 2
346
+ ],
347
+ "parent": "root"
348
+ },
349
+ {
350
+ "value": "Visual variants",
351
+ "href": "#visual-variants",
352
+ "depth": 3,
353
+ "numbering": [
354
+ 1,
355
+ 2,
356
+ 3
357
+ ],
358
+ "parent": "root"
359
+ },
360
+ {
361
+ "value": "Color palettes",
362
+ "href": "#color-palettes",
363
+ "depth": 3,
364
+ "numbering": [
365
+ 1,
366
+ 2,
367
+ 4
368
+ ],
369
+ "parent": "root"
370
+ },
371
+ {
372
+ "value": "With sections and separators",
373
+ "href": "#with-sections-and-separators",
374
+ "depth": 3,
375
+ "numbering": [
376
+ 1,
377
+ 2,
378
+ 5
379
+ ],
380
+ "parent": "root"
381
+ },
382
+ {
383
+ "value": "Menu item states",
384
+ "href": "#menu-item-states",
385
+ "depth": 3,
386
+ "numbering": [
387
+ 1,
388
+ 2,
389
+ 6
390
+ ],
391
+ "parent": "root"
392
+ },
393
+ {
394
+ "value": "Disabled state",
395
+ "href": "#disabled-state",
396
+ "depth": 3,
397
+ "numbering": [
398
+ 1,
399
+ 2,
400
+ 7
401
+ ],
402
+ "parent": "root"
403
+ },
404
+ {
405
+ "value": "Controlled menu state",
406
+ "href": "#controlled-menu-state",
407
+ "depth": 3,
408
+ "numbering": [
409
+ 1,
410
+ 2,
411
+ 8
412
+ ],
413
+ "parent": "root"
414
+ },
415
+ {
416
+ "value": "Uncontrolled menu state",
417
+ "href": "#uncontrolled-menu-state",
418
+ "depth": 3,
419
+ "numbering": [
420
+ 1,
421
+ 2,
422
+ 9
423
+ ],
424
+ "parent": "root"
425
+ },
426
+ {
427
+ "value": "Component requirements",
428
+ "href": "#component-requirements",
429
+ "depth": 2,
430
+ "numbering": [
431
+ 1,
432
+ 3
433
+ ],
434
+ "parent": "root"
435
+ },
436
+ {
437
+ "value": "Menu.Item requirements",
438
+ "href": "#menuitem-requirements",
439
+ "depth": 3,
440
+ "numbering": [
441
+ 1,
442
+ 3,
443
+ 1
444
+ ],
445
+ "parent": "root"
446
+ },
447
+ {
448
+ "value": "Accessibility",
449
+ "href": "#accessibility",
450
+ "depth": 2,
451
+ "numbering": [
452
+ 1,
453
+ 4
454
+ ],
455
+ "parent": "root"
456
+ },
457
+ {
458
+ "value": "Keyboard navigation",
459
+ "href": "#keyboard-navigation",
460
+ "depth": 4,
461
+ "numbering": [
462
+ 1,
463
+ 4,
464
+ 1,
465
+ 1
466
+ ],
467
+ "parent": "root"
468
+ },
469
+ {
470
+ "value": "API reference",
471
+ "href": "#api-reference",
472
+ "depth": 2,
473
+ "numbering": [
474
+ 1,
475
+ 5
476
+ ],
477
+ "parent": "root"
478
+ },
479
+ {
480
+ "value": "Common patterns",
481
+ "href": "#common-patterns",
482
+ "depth": 2,
483
+ "numbering": [
484
+ 1,
485
+ 6
486
+ ],
487
+ "parent": "root"
488
+ },
489
+ {
490
+ "value": "Document operations",
491
+ "href": "#document-operations",
492
+ "depth": 3,
493
+ "numbering": [
494
+ 1,
495
+ 6,
496
+ 1
497
+ ],
498
+ "parent": "root"
499
+ },
500
+ {
501
+ "value": "Conditional actions based on state",
502
+ "href": "#conditional-actions-based-on-state",
503
+ "depth": 3,
504
+ "numbering": [
505
+ 1,
506
+ 6,
507
+ 2
508
+ ],
509
+ "parent": "root"
510
+ },
511
+ {
512
+ "value": "Testing your implementation",
513
+ "href": "#testing-your-implementation",
514
+ "depth": 2,
515
+ "numbering": [
516
+ 1,
517
+ 7
518
+ ],
519
+ "parent": "root"
520
+ },
521
+ {
522
+ "value": "Basic Rendering Tests",
523
+ "href": "#basic-rendering-tests",
524
+ "depth": 3,
525
+ "numbering": [
526
+ 1,
527
+ 7,
528
+ 1
529
+ ],
530
+ "parent": "root"
531
+ },
532
+ {
533
+ "value": "Interaction Tests",
534
+ "href": "#interaction-tests",
535
+ "depth": 3,
536
+ "numbering": [
537
+ 1,
538
+ 7,
539
+ 2
540
+ ],
541
+ "parent": "root"
542
+ },
543
+ {
544
+ "value": "Primary Action Selection Tests",
545
+ "href": "#primary-action-selection-tests",
546
+ "depth": 3,
547
+ "numbering": [
548
+ 1,
549
+ 7,
550
+ 3
551
+ ],
552
+ "parent": "root"
553
+ },
554
+ {
555
+ "value": "Controlled Mode Tests",
556
+ "href": "#controlled-mode-tests",
557
+ "depth": 3,
558
+ "numbering": [
559
+ 1,
560
+ 7,
561
+ 4
562
+ ],
563
+ "parent": "root"
564
+ },
565
+ {
566
+ "value": "Uncontrolled Mode Tests",
567
+ "href": "#uncontrolled-mode-tests",
568
+ "depth": 3,
569
+ "numbering": [
570
+ 1,
571
+ 7,
572
+ 5
573
+ ],
574
+ "parent": "root"
575
+ },
576
+ {
577
+ "value": "State Tests",
578
+ "href": "#state-tests",
579
+ "depth": 3,
580
+ "numbering": [
581
+ 1,
582
+ 7,
583
+ 6
584
+ ],
585
+ "parent": "root"
586
+ },
587
+ {
588
+ "value": "Accessibility Tests",
589
+ "href": "#accessibility-tests",
590
+ "depth": 3,
591
+ "numbering": [
592
+ 1,
593
+ 7,
594
+ 7
595
+ ],
596
+ "parent": "root"
597
+ },
598
+ {
599
+ "value": "Menu Content Tests",
600
+ "href": "#menu-content-tests",
601
+ "depth": 3,
602
+ "numbering": [
603
+ 1,
604
+ 7,
605
+ 8
606
+ ],
607
+ "parent": "root"
608
+ },
609
+ {
610
+ "value": "Resources",
611
+ "href": "#resources",
612
+ "depth": 2,
613
+ "numbering": [
614
+ 1,
615
+ 8
616
+ ],
617
+ "parent": "root"
618
+ }
619
+ ]
620
+ },
621
+ "guidelines": {
622
+ "mdx": "\n## Guidelines\n\nThe SplitButton provides a space-efficient way to present a primary action\nalongside related secondary actions, maintaining visual hierarchy while offering\ncomprehensive functionality.\n\n### Best practices\n\n- **Clear primary action:** The main button segment must perform the most common\n or default action immediately upon being clicked. The label must be clear and\n action-oriented.\n - **If there is no default action** and you still want to use a button with a\n dropdown menu, consider using the menu component with a regular button (with\n a dropdown icon) as a trigger. In this case, the dropdown menu will open\n always when clicking the button and no default action will be triggered.\n Especially useful when all actions are equally important\n- **Visual distinction:** Clearly separate the primary action button from the\n dropdown trigger. This visually communicates that the two segments perform\n different functions.\n- **Dropdown content:** Keep the list of secondary actions concise and logically\n ordered (by frequency or relevance).\n- **State persistence:** When a user selects a secondary action from the\n dropdown, consider making that action the new primary button action if the\n user is likely to repeat it, or if it fits the new context.\n- **Sizing and responsiveness:** Ensure both the primary button and the dropdown\n trigger have adequate touch target sizes. The dropdown menu should be\n positioned to avoid obscuring important content and should adapt well on\n mobile devices.\n\n### Usage\n\n> [!TIP]\\\n> When to use\n\n- **Primary action focus:** Use a split button when one specific action (e.g.,\n \"Save,\" \"Download\") is performed significantly more often than its related\n alternatives (e.g., \"Save and Share,\" \"Download as PDF\").\n- **Contextual actions:** The dropdown menu must contain actions that are\n directly related to the primary button's function.\n- **Space efficiency:** Use split buttons in toolbars or dense interfaces where\n presenting every option as a full button would lead to clutter.\n\n> [!CAUTION]\\\n> When not to use\n\n- **When all actions are equally important:** Don't use a split button if all\n the related actions are performed with equal frequency or importance. Grouping\n them this way implies hierarchy where none exists, and a simple button group\n or vertical menu list might be clearer.\n- **When actions are unrelated:** Avoid grouping actions that have no logical\n connection under the same component. The primary button and all dropdown\n options must share a clear, single context.\n- **When the primary action changes frequently:** If the default action changes\n based on complex context or user state, constantly swapping the main button\n label can confuse the user and create visual instability. Use a standard\n dropdown menu where all options, including the default, are consistently\n located inside.\n- **When discovery is crucial:** If users must know all available options (e.g.,\n legally required export formats), burying them in a secondary dropdown menu is\n a poor choice. Displaying them as separate full buttons or in an obvious\n button group is better.\n- **For primary navigation:** A split button is an action control, not a primary\n navigation tool. Using it to link to major sections can confuse users about\n whether they are performing an action or moving to a new page.\n- **When screen space is not an issue:** If you have ample space, displaying the\n top two or three most common actions as individual, labeled buttons can\n sometimes be faster and more transparent than hiding them in a dropdown.\n- **When the dropdown contains complex controls:** Avoid filling the dropdown\n with complex inputs, multi-step forms, or large amounts of text. A split\n button dropdown should only contain simple, single-click actions.\n\n### Split buttons in use\n\n> [!TIP]\\\n> Do\n>\n> - Do prioritize the primary action. Ensure the main, large section performs\n> the most common or default action immediately upon being clicked.\n> - Do group related actions. Include only closely related actions in the\n> secondary dropdown menu.\n> - Do keep the dropdown menu concise. It should contain simple, single-click\n> actions, not complex forms or long text.\n\n```jsx live\nconst App = () => {\n return (\n <SplitButton\n variant=\"solid\"\n tone=\"primary\"\n onAction={(actionId) => alert(`Action: ${actionId}`)}\n aria-label=\"More publish options\"\n >\n <Menu.Item id=\"save\">Save as draft</Menu.Item>\n <Menu.Item id=\"schedule-publish\">Schedule publish date</Menu.Item>\n <Menu.Item id=\"revert\">Revert to last save</Menu.Item>\n </SplitButton>\n );\n}\n```\n\n> [!CAUTION]\\\n> Don't\n>\n> - Don’t add icons that don’t make sense with the action. If one uses an icon,\n> all options should have a corresponding icon. Don’t use icons on both sides.\n> - Don't dynamically swap the primary button's function based on minor changes\n> in the user's state.\n> - Don't group actions that have different contexts or objectives.\n> - Don't use a split button as a primary site navigation tool.\n> - Don't hide legally required or critical options in the dropdown.\n> - Don't use the dropdown to house long forms, multi-step processes, or complex\n> configuration settings.\n\n```jsx live\nconst App = () => {\n return (\n <SplitButton\n variant=\"solid\"\n tone=\"primary\"\n onAction={(actionId) => alert(`Action: ${actionId}`)}\n aria-label=\"ridiculous actions\"\n icon={<Icons.Snowshoeing/>}\n >\n <Menu.Item id=\"download\">Download Report</Menu.Item>\n <Menu.Item id=\"edit-permissions\">Edit user permissions</Menu.Item>\n <Menu.Item id=\"go-home\">Go to Homepage</Menu.Item>\n <Menu.Item id=\"send-email\">⭐️ Send email update</Menu.Item>\n </SplitButton>\n );\n}\n```\n",
623
+ "toc": [
624
+ {
625
+ "value": "Guidelines",
626
+ "href": "#guidelines",
627
+ "depth": 2,
628
+ "numbering": [
629
+ 1,
630
+ 1
631
+ ],
632
+ "parent": "root"
633
+ },
634
+ {
635
+ "value": "Best practices",
636
+ "href": "#best-practices",
637
+ "depth": 3,
638
+ "numbering": [
639
+ 1,
640
+ 1,
641
+ 1
642
+ ],
643
+ "parent": "root"
644
+ },
645
+ {
646
+ "value": "Usage",
647
+ "href": "#usage",
648
+ "depth": 3,
649
+ "numbering": [
650
+ 1,
651
+ 1,
652
+ 2
653
+ ],
654
+ "parent": "root"
655
+ },
656
+ {
657
+ "value": "Split buttons in use",
658
+ "href": "#split-buttons-in-use",
659
+ "depth": 3,
660
+ "numbering": [
661
+ 1,
662
+ 1,
663
+ 3
664
+ ],
665
+ "parent": "root"
666
+ }
667
+ ]
668
+ }
669
+ }
670
+ }