@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.
- package/README.md +63 -14
- package/data/docs/route-manifest.json +10913 -0
- package/data/docs/routes/components-accessibility-visually-hidden.json +388 -0
- package/data/docs/routes/components-accessibility.json +34 -0
- package/data/docs/routes/components-buttons-button.json +715 -0
- package/data/docs/routes/components-buttons-icon-button.json +852 -0
- package/data/docs/routes/components-buttons-icon-toggle-button.json +594 -0
- package/data/docs/routes/components-buttons-split-button.json +670 -0
- package/data/docs/routes/components-buttons-toggle-button-group.json +722 -0
- package/data/docs/routes/components-buttons-toggle-button.json +689 -0
- package/data/docs/routes/components-buttons.json +36 -0
- package/data/docs/routes/components-data-display-badge.json +555 -0
- package/data/docs/routes/components-data-display-card.json +338 -0
- package/data/docs/routes/components-data-display-data-table.json +855 -0
- package/data/docs/routes/components-data-display-draggable-list.json +596 -0
- package/data/docs/routes/components-data-display-table.json +472 -0
- package/data/docs/routes/components-data-display-tag-group.json +535 -0
- package/data/docs/routes/components-data-display.json +34 -0
- package/data/docs/routes/components-feedback-alert.json +696 -0
- package/data/docs/routes/components-feedback-dialog.json +682 -0
- package/data/docs/routes/components-feedback-drawer.json +600 -0
- package/data/docs/routes/components-feedback-loading-spinner.json +415 -0
- package/data/docs/routes/components-feedback-progress-bar.json +661 -0
- package/data/docs/routes/components-feedback-toast.json +1040 -0
- package/data/docs/routes/components-feedback-tooltip.json +510 -0
- package/data/docs/routes/components-feedback.json +34 -0
- package/data/docs/routes/components-forms-field-errors.json +557 -0
- package/data/docs/routes/components-forms-form-field.json +848 -0
- package/data/docs/routes/components-forms-group.json +427 -0
- package/data/docs/routes/components-forms-localized-field.json +770 -0
- package/data/docs/routes/components-forms.json +37 -0
- package/data/docs/routes/components-inputs-calendar.json +611 -0
- package/data/docs/routes/components-inputs-checkbox.json +774 -0
- package/data/docs/routes/components-inputs-combo-box.json +761 -0
- package/data/docs/routes/components-inputs-date-input.json +628 -0
- package/data/docs/routes/components-inputs-date-picker.json +709 -0
- package/data/docs/routes/components-inputs-date-range-picker.json +599 -0
- package/data/docs/routes/components-inputs-money-input.json +721 -0
- package/data/docs/routes/components-inputs-multiline-text-input.json +611 -0
- package/data/docs/routes/components-inputs-number-input.json +647 -0
- package/data/docs/routes/components-inputs-password-input.json +576 -0
- package/data/docs/routes/components-inputs-radio-input.json +583 -0
- package/data/docs/routes/components-inputs-range-calendar.json +607 -0
- package/data/docs/routes/components-inputs-rich-text-input.json +599 -0
- package/data/docs/routes/components-inputs-scoped-search-input.json +570 -0
- package/data/docs/routes/components-inputs-search-input.json +588 -0
- package/data/docs/routes/components-inputs-select-input.json +960 -0
- package/data/docs/routes/components-inputs-switch.json +720 -0
- package/data/docs/routes/components-inputs-text-input.json +566 -0
- package/data/docs/routes/components-inputs-time-input.json +775 -0
- package/data/docs/routes/components-inputs.json +34 -0
- package/data/docs/routes/components-layout-box.json +501 -0
- package/data/docs/routes/components-layout-defaultpage.json +748 -0
- package/data/docs/routes/components-layout-flex.json +587 -0
- package/data/docs/routes/components-layout-grid.json +393 -0
- package/data/docs/routes/components-layout-modalpage.json +716 -0
- package/data/docs/routes/components-layout-pagecontent.json +673 -0
- package/data/docs/routes/components-layout-separator.json +461 -0
- package/data/docs/routes/components-layout-simple-grid.json +519 -0
- package/data/docs/routes/components-layout-spacer.json +573 -0
- package/data/docs/routes/components-layout-stack.json +481 -0
- package/data/docs/routes/components-layout.json +34 -0
- package/data/docs/routes/components-media-avatar.json +427 -0
- package/data/docs/routes/components-media-icon.json +663 -0
- package/data/docs/routes/components-media-image.json +511 -0
- package/data/docs/routes/components-media-inline-svg.json +586 -0
- package/data/docs/routes/components-media.json +34 -0
- package/data/docs/routes/components-navigation-accordion.json +643 -0
- package/data/docs/routes/components-navigation-collapsible-motion.json +628 -0
- package/data/docs/routes/components-navigation-link.json +554 -0
- package/data/docs/routes/components-navigation-menu.json +546 -0
- package/data/docs/routes/components-navigation-pagination.json +502 -0
- package/data/docs/routes/components-navigation-steps.json +629 -0
- package/data/docs/routes/components-navigation-tabnav.json +546 -0
- package/data/docs/routes/components-navigation-tabs.json +635 -0
- package/data/docs/routes/components-navigation-toolbar.json +549 -0
- package/data/docs/routes/components-navigation.json +34 -0
- package/data/docs/routes/components-typography-code.json +39 -0
- package/data/docs/routes/components-typography-heading.json +402 -0
- package/data/docs/routes/components-typography-kbd.json +399 -0
- package/data/docs/routes/components-typography-list.json +593 -0
- package/data/docs/routes/components-typography-text.json +444 -0
- package/data/docs/routes/components-typography.json +34 -0
- package/data/docs/routes/components-utilities-nimbus-i18n-provider.json +295 -0
- package/data/docs/routes/components-utilities-nimbus-provider.json +663 -0
- package/data/docs/routes/components-utilities.json +34 -0
- package/data/docs/routes/components.json +33 -0
- package/data/docs/routes/home-contribute-adrs-adr0001-consumer-component-apis.json +314 -0
- package/data/docs/routes/home-contribute-adrs-adr0002-compound-component-extraction.json +160 -0
- package/data/docs/routes/home-contribute-adrs-adr0003-component-lifecycle-states.json +460 -0
- package/data/docs/routes/home-contribute-adrs.json +205 -0
- package/data/docs/routes/home-contribute-development-setup.json +213 -0
- package/data/docs/routes/home-contribute-stats.json +36 -0
- package/data/docs/routes/home-contribute.json +36 -0
- package/data/docs/routes/home-design-tokens-aspect-ratios.json +36 -0
- package/data/docs/routes/home-design-tokens-borders.json +35 -0
- package/data/docs/routes/home-design-tokens-colors.json +157 -0
- package/data/docs/routes/home-design-tokens-other-animations.json +119 -0
- package/data/docs/routes/home-design-tokens-other-blurs.json +36 -0
- package/data/docs/routes/home-design-tokens-other-breakpoints.json +61 -0
- package/data/docs/routes/home-design-tokens-other-cursors.json +36 -0
- package/data/docs/routes/home-design-tokens-other-z-indices.json +39 -0
- package/data/docs/routes/home-design-tokens-other.json +35 -0
- package/data/docs/routes/home-design-tokens-radii.json +59 -0
- package/data/docs/routes/home-design-tokens-shadows.json +57 -0
- package/data/docs/routes/home-design-tokens-sizes.json +137 -0
- package/data/docs/routes/home-design-tokens-spacing.json +36 -0
- package/data/docs/routes/home-design-tokens-typography.json +184 -0
- package/data/docs/routes/home-design-tokens.json +34 -0
- package/data/docs/routes/home-getting-started-core-concepts.json +301 -0
- package/data/docs/routes/home-getting-started-installation.json +621 -0
- package/data/docs/routes/home-getting-started-mcp-server-overview.json +139 -0
- package/data/docs/routes/home-getting-started-mcp-server-setup.json +316 -0
- package/data/docs/routes/home-getting-started-release-process.json +294 -0
- package/data/docs/routes/home-getting-started-testing-setup.json +296 -0
- package/data/docs/routes/home-playground-markdown.json +638 -0
- package/data/docs/routes/home-playground-toc.json +169 -0
- package/data/docs/routes/home-playground.json +34 -0
- package/data/docs/routes/home-style-props-background.json +236 -0
- package/data/docs/routes/home-style-props-border.json +310 -0
- package/data/docs/routes/home-style-props-display.json +120 -0
- package/data/docs/routes/home-style-props-effects.json +116 -0
- package/data/docs/routes/home-style-props-filters.json +396 -0
- package/data/docs/routes/home-style-props-flex-and-grid.json +496 -0
- package/data/docs/routes/home-style-props-interactivity.json +356 -0
- package/data/docs/routes/home-style-props-layout.json +422 -0
- package/data/docs/routes/home-style-props-list.json +116 -0
- package/data/docs/routes/home-style-props-sizing.json +244 -0
- package/data/docs/routes/home-style-props-spacing.json +228 -0
- package/data/docs/routes/home-style-props-svg.json +96 -0
- package/data/docs/routes/home-style-props-tables.json +116 -0
- package/data/docs/routes/home-style-props-transforms.json +216 -0
- package/data/docs/routes/home-style-props-transitions.json +216 -0
- package/data/docs/routes/home-style-props-typography.json +536 -0
- package/data/docs/routes/home-style-props.json +33 -0
- package/data/docs/routes/home.json +32 -0
- package/data/docs/routes/hooks-usecopytoclipboard.json +76 -0
- package/data/docs/routes/hooks-usehotkeys.json +117 -0
- package/data/docs/routes/hooks.json +33 -0
- package/data/docs/routes/icons.json +32 -0
- package/data/docs/routes/patterns-fields-date-range-picker-field.json +393 -0
- package/data/docs/routes/patterns-fields-money-input-field.json +415 -0
- package/data/docs/routes/patterns-fields-multiline-text-input-field.json +404 -0
- package/data/docs/routes/patterns-fields-number-input-field.json +470 -0
- package/data/docs/routes/patterns-fields-password-input-field.json +319 -0
- package/data/docs/routes/patterns-fields-search-input-field.json +382 -0
- package/data/docs/routes/patterns-fields-text-input-field.json +404 -0
- package/data/docs/routes/patterns-fields.json +78 -0
- package/data/docs/routes/patterns.json +34 -0
- package/data/docs/search-index.json +1 -0
- package/data/docs/types/Accordion.json +12 -0
- package/data/docs/types/AccordionContent.json +286 -0
- package/data/docs/types/AccordionHeader.json +891 -0
- package/data/docs/types/AccordionHeaderRightContent.json +27 -0
- package/data/docs/types/AccordionItem.json +242 -0
- package/data/docs/types/AccordionRoot.json +162 -0
- package/data/docs/types/Alert.json +12 -0
- package/data/docs/types/AlertActions.json +11 -0
- package/data/docs/types/AlertDescription.json +118 -0
- package/data/docs/types/AlertDismissButton.json +937 -0
- package/data/docs/types/AlertRoot.json +42 -0
- package/data/docs/types/AlertTitle.json +118 -0
- package/data/docs/types/Avatar.json +125 -0
- package/data/docs/types/Badge.json +64 -0
- package/data/docs/types/Body.json +67 -0
- package/data/docs/types/Box.json +85 -0
- package/data/docs/types/Button.json +1015 -0
- package/data/docs/types/Calendar.json +565 -0
- package/data/docs/types/Caption.json +67 -0
- package/data/docs/types/Card.json +12 -0
- package/data/docs/types/CardContent.json +27 -0
- package/data/docs/types/CardHeader.json +27 -0
- package/data/docs/types/CardRoot.json +106 -0
- package/data/docs/types/Cell.json +227 -0
- package/data/docs/types/Checkbox.json +897 -0
- package/data/docs/types/Code.json +112 -0
- package/data/docs/types/CollapsibleMotionContent.json +35 -0
- package/data/docs/types/CollapsibleMotionRoot.json +99 -0
- package/data/docs/types/CollapsibleMotionTrigger.json +71 -0
- package/data/docs/types/Column.json +101 -0
- package/data/docs/types/ColumnGroup.json +101 -0
- package/data/docs/types/ColumnHeader.json +193 -0
- package/data/docs/types/ComboBoxListBox.json +751 -0
- package/data/docs/types/ComboBoxOption.json +672 -0
- package/data/docs/types/ComboBoxPopover.json +786 -0
- package/data/docs/types/ComboBoxRoot.json +747 -0
- package/data/docs/types/ComboBoxSection.json +277 -0
- package/data/docs/types/ComboBoxTrigger.json +70 -0
- package/data/docs/types/Content.json +33 -0
- package/data/docs/types/DataTable.json +596 -0
- package/data/docs/types/DataTableBody.json +223 -0
- package/data/docs/types/DataTableFooter.json +27 -0
- package/data/docs/types/DataTableHeader.json +269 -0
- package/data/docs/types/DataTableManager.json +11 -0
- package/data/docs/types/DataTableRoot.json +590 -0
- package/data/docs/types/DataTableTable.json +271 -0
- package/data/docs/types/DateInput.json +792 -0
- package/data/docs/types/DatePicker.json +700 -0
- package/data/docs/types/DateRangePicker.json +936 -0
- package/data/docs/types/DateRangePickerField.json +1047 -0
- package/data/docs/types/DefaultPage.json +12 -0
- package/data/docs/types/DefaultPageActions.json +27 -0
- package/data/docs/types/DefaultPageBackLink.json +213 -0
- package/data/docs/types/DefaultPageContent.json +27 -0
- package/data/docs/types/DefaultPageFooter.json +27 -0
- package/data/docs/types/DefaultPageHeader.json +27 -0
- package/data/docs/types/DefaultPageRoot.json +106 -0
- package/data/docs/types/DefaultPageSubtitle.json +27 -0
- package/data/docs/types/DefaultPageTabNav.json +28 -0
- package/data/docs/types/DefaultPageTitle.json +27 -0
- package/data/docs/types/DialogBody.json +27 -0
- package/data/docs/types/DialogCloseTrigger.json +939 -0
- package/data/docs/types/DialogContent.json +27 -0
- package/data/docs/types/DialogFooter.json +27 -0
- package/data/docs/types/DialogHeader.json +27 -0
- package/data/docs/types/DialogRoot.json +138 -0
- package/data/docs/types/DialogTitle.json +27 -0
- package/data/docs/types/DialogTrigger.json +80 -0
- package/data/docs/types/DraggableList.json +12 -0
- package/data/docs/types/DraggableListField.json +894 -0
- package/data/docs/types/DraggableListItem.json +574 -0
- package/data/docs/types/DraggableListRoot.json +745 -0
- package/data/docs/types/Drawer.json +12 -0
- package/data/docs/types/DrawerBody.json +27 -0
- package/data/docs/types/DrawerCloseTrigger.json +939 -0
- package/data/docs/types/DrawerContent.json +27 -0
- package/data/docs/types/DrawerFooter.json +27 -0
- package/data/docs/types/DrawerHeader.json +27 -0
- package/data/docs/types/DrawerRoot.json +142 -0
- package/data/docs/types/DrawerTitle.json +27 -0
- package/data/docs/types/DrawerTrigger.json +80 -0
- package/data/docs/types/FieldErrors.getBuiltInMessage.json +11 -0
- package/data/docs/types/FieldErrors.getCustomMessage.json +9 -0
- package/data/docs/types/FieldErrors.json +109 -0
- package/data/docs/types/Flex.json +238 -0
- package/data/docs/types/Footer.json +67 -0
- package/data/docs/types/FormFieldDescription.json +11 -0
- package/data/docs/types/FormFieldError.json +11 -0
- package/data/docs/types/FormFieldInfoBox.json +27 -0
- package/data/docs/types/FormFieldInput.json +11 -0
- package/data/docs/types/FormFieldLabel.json +11 -0
- package/data/docs/types/FormFieldRoot.json +148 -0
- package/data/docs/types/Grid.json +253 -0
- package/data/docs/types/GridProps.json +11 -0
- package/data/docs/types/Group.json +143 -0
- package/data/docs/types/Header.json +67 -0
- package/data/docs/types/Heading.json +109 -0
- package/data/docs/types/Icon.json +112 -0
- package/data/docs/types/IconButton.json +1019 -0
- package/data/docs/types/IconToggleButton.json +787 -0
- package/data/docs/types/Image.json +373 -0
- package/data/docs/types/Indicator.json +67 -0
- package/data/docs/types/InlineSvg.json +98 -0
- package/data/docs/types/Item.json +67 -0
- package/data/docs/types/Kbd.json +118 -0
- package/data/docs/types/Link.json +380 -0
- package/data/docs/types/List.json +12 -0
- package/data/docs/types/ListIndicator.json +70 -0
- package/data/docs/types/ListItem.json +70 -0
- package/data/docs/types/ListRoot.json +124 -0
- package/data/docs/types/LoadingSpinner.json +87 -0
- package/data/docs/types/LocalizedField.json +460 -0
- package/data/docs/types/LocalizedStringFormatter.json +9 -0
- package/data/docs/types/MakeElementFocusable.json +196 -0
- package/data/docs/types/MenuContent.json +111 -0
- package/data/docs/types/MenuItem.json +671 -0
- package/data/docs/types/MenuRoot.json +670 -0
- package/data/docs/types/MenuSection.json +364 -0
- package/data/docs/types/MenuSubmenu.json +111 -0
- package/data/docs/types/MenuSubmenuTrigger.json +67 -0
- package/data/docs/types/MenuTrigger.json +906 -0
- package/data/docs/types/ModalPage.json +12 -0
- package/data/docs/types/ModalPageActions.json +27 -0
- package/data/docs/types/ModalPageContent.json +27 -0
- package/data/docs/types/ModalPageFooter.json +27 -0
- package/data/docs/types/ModalPageHeader.json +27 -0
- package/data/docs/types/ModalPageRoot.json +87 -0
- package/data/docs/types/ModalPageSubtitle.json +27 -0
- package/data/docs/types/ModalPageTabNav.json +28 -0
- package/data/docs/types/ModalPageTitle.json +27 -0
- package/data/docs/types/ModalPageTopBar.json +57 -0
- package/data/docs/types/MoneyInput.isEmpty.json +40 -0
- package/data/docs/types/MoneyInput.json +282 -0
- package/data/docs/types/MoneyInputField.json +379 -0
- package/data/docs/types/MoneyInputFieldProps.json +9 -0
- package/data/docs/types/MultilineTextInput.json +1194 -0
- package/data/docs/types/MultilineTextInputField.json +1269 -0
- package/data/docs/types/MultilineTextInputFieldProps.json +9 -0
- package/data/docs/types/NimbusI18nProvider.json +42 -0
- package/data/docs/types/NimbusI18nProviderProps.json +9 -0
- package/data/docs/types/NimbusProvider.json +270 -0
- package/data/docs/types/NumberInput.json +952 -0
- package/data/docs/types/NumberInputField.json +1004 -0
- package/data/docs/types/NumberInputFieldProps.json +9 -0
- package/data/docs/types/PageContent.json +11 -0
- package/data/docs/types/PageContentColumn.json +99 -0
- package/data/docs/types/PageContentRoot.json +114 -0
- package/data/docs/types/Pagination.json +159 -0
- package/data/docs/types/PasswordInput.json +1120 -0
- package/data/docs/types/PasswordInputField.json +1216 -0
- package/data/docs/types/PasswordInputFieldProps.json +9 -0
- package/data/docs/types/ProgressBar.json +280 -0
- package/data/docs/types/RadioInputOption.json +550 -0
- package/data/docs/types/RadioInputRoot.json +514 -0
- package/data/docs/types/RangeCalendar.json +618 -0
- package/data/docs/types/RichTextInput.json +134 -0
- package/data/docs/types/Root.json +122 -0
- package/data/docs/types/Row.json +67 -0
- package/data/docs/types/ScopedSearchInput.isEmpty.json +40 -0
- package/data/docs/types/ScopedSearchInput.json +253 -0
- package/data/docs/types/ScrollArea.json +82 -0
- package/data/docs/types/SearchInput.json +1165 -0
- package/data/docs/types/SearchInputField.json +1240 -0
- package/data/docs/types/Select.json +12 -0
- package/data/docs/types/SelectOption.json +572 -0
- package/data/docs/types/SelectOptionGroup.json +215 -0
- package/data/docs/types/SelectOptions.json +693 -0
- package/data/docs/types/SelectRoot.json +926 -0
- package/data/docs/types/Separator.json +65 -0
- package/data/docs/types/SimpleGrid.json +291 -0
- package/data/docs/types/Spacer.json +27 -0
- package/data/docs/types/SpacerProps.json +9 -0
- package/data/docs/types/SplitButton.json +203 -0
- package/data/docs/types/Stack.json +144 -0
- package/data/docs/types/Steps.json +12 -0
- package/data/docs/types/StepsChangeDetails.json +9 -0
- package/data/docs/types/StepsCompletedContent.json +28 -0
- package/data/docs/types/StepsCompletedContentProps.json +9 -0
- package/data/docs/types/StepsContent.json +43 -0
- package/data/docs/types/StepsContentProps.json +9 -0
- package/data/docs/types/StepsDescription.json +28 -0
- package/data/docs/types/StepsDescriptionProps.json +9 -0
- package/data/docs/types/StepsIndicator.json +28 -0
- package/data/docs/types/StepsIndicatorProps.json +9 -0
- package/data/docs/types/StepsItem.json +43 -0
- package/data/docs/types/StepsItemProps.json +9 -0
- package/data/docs/types/StepsList.json +28 -0
- package/data/docs/types/StepsListProps.json +9 -0
- package/data/docs/types/StepsNextTrigger.json +62 -0
- package/data/docs/types/StepsNextTriggerProps.json +9 -0
- package/data/docs/types/StepsNumber.json +28 -0
- package/data/docs/types/StepsNumberProps.json +9 -0
- package/data/docs/types/StepsPrevTrigger.json +62 -0
- package/data/docs/types/StepsPrevTriggerProps.json +9 -0
- package/data/docs/types/StepsRoot.json +183 -0
- package/data/docs/types/StepsRootProps.json +11 -0
- package/data/docs/types/StepsSeparator.json +28 -0
- package/data/docs/types/StepsSeparatorProps.json +9 -0
- package/data/docs/types/StepsStatus.json +57 -0
- package/data/docs/types/StepsStatusProps.json +9 -0
- package/data/docs/types/StepsTitle.json +28 -0
- package/data/docs/types/StepsTitleProps.json +9 -0
- package/data/docs/types/StepsTrigger.json +47 -0
- package/data/docs/types/StepsTriggerProps.json +9 -0
- package/data/docs/types/Switch.json +371 -0
- package/data/docs/types/TabListProps.json +9 -0
- package/data/docs/types/TabNav.json +12 -0
- package/data/docs/types/TabNavItem.json +300 -0
- package/data/docs/types/TabNavItemProps.json +9 -0
- package/data/docs/types/TabNavProps.json +9 -0
- package/data/docs/types/TabNavRoot.json +80 -0
- package/data/docs/types/TabPanelProps.json +9 -0
- package/data/docs/types/TabPanelsProps.json +9 -0
- package/data/docs/types/TabProps.json +9 -0
- package/data/docs/types/Table.json +9 -0
- package/data/docs/types/TableBody.json +67 -0
- package/data/docs/types/TableBodyProps.json +9 -0
- package/data/docs/types/TableCaption.json +67 -0
- package/data/docs/types/TableCaptionProps.json +9 -0
- package/data/docs/types/TableCell.json +227 -0
- package/data/docs/types/TableCellProps.json +9 -0
- package/data/docs/types/TableColumn.json +101 -0
- package/data/docs/types/TableColumnGroup.json +101 -0
- package/data/docs/types/TableColumnGroupProps.json +9 -0
- package/data/docs/types/TableColumnHeader.json +193 -0
- package/data/docs/types/TableColumnHeaderProps.json +9 -0
- package/data/docs/types/TableColumnProps.json +9 -0
- package/data/docs/types/TableFooter.json +67 -0
- package/data/docs/types/TableFooterProps.json +9 -0
- package/data/docs/types/TableHeader.json +67 -0
- package/data/docs/types/TableHeaderProps.json +9 -0
- package/data/docs/types/TableRoot.json +365 -0
- package/data/docs/types/TableRootProps.json +12 -0
- package/data/docs/types/TableRow.json +67 -0
- package/data/docs/types/TableRowProps.json +9 -0
- package/data/docs/types/TableScrollArea.json +82 -0
- package/data/docs/types/TableScrollAreaProps.json +9 -0
- package/data/docs/types/Tabs.json +12 -0
- package/data/docs/types/TabsList.json +110 -0
- package/data/docs/types/TabsPanel.json +112 -0
- package/data/docs/types/TabsPanels.json +108 -0
- package/data/docs/types/TabsRoot.json +211 -0
- package/data/docs/types/TabsTab.json +174 -0
- package/data/docs/types/TagGroup.json +12 -0
- package/data/docs/types/TagGroupRoot.json +306 -0
- package/data/docs/types/TagGroupTag.json +595 -0
- package/data/docs/types/TagGroupTagList.json +166 -0
- package/data/docs/types/Text.json +119 -0
- package/data/docs/types/TextInput.json +1156 -0
- package/data/docs/types/TextInputField.json +1263 -0
- package/data/docs/types/TimeInput.json +752 -0
- package/data/docs/types/ToastAction.json +9 -0
- package/data/docs/types/ToastManagerApi.json +9 -0
- package/data/docs/types/ToastOptions.json +9 -0
- package/data/docs/types/ToastOutlet.json +12 -0
- package/data/docs/types/ToastPlacement.json +9 -0
- package/data/docs/types/ToastPromiseOptions.json +9 -0
- package/data/docs/types/ToastType.json +9 -0
- package/data/docs/types/ToastVariant.json +9 -0
- package/data/docs/types/ToggleButton.json +789 -0
- package/data/docs/types/ToggleButtonGroup.json +9 -0
- package/data/docs/types/ToggleButtonGroupButton.json +331 -0
- package/data/docs/types/ToggleButtonGroupRoot.json +269 -0
- package/data/docs/types/Toolbar.json +176 -0
- package/data/docs/types/Tooltip.json +12 -0
- package/data/docs/types/TooltipContent.json +372 -0
- package/data/docs/types/TooltipRoot.json +179 -0
- package/data/docs/types/Trigger.json +69 -0
- package/data/docs/types/VisuallyHidden.json +93 -0
- package/data/docs/types/__object.json +12 -0
- package/data/docs/types/filters.json +11 -0
- package/data/docs/types/manifest.json +278 -0
- package/data/docs/types/toast.json +234 -0
- package/data/docs/types/useColorMode.json +13 -0
- package/data/docs/types/useColorModeValue.json +13 -0
- package/data/docs/types/useColorScheme.json +12 -0
- package/data/docs/types/useLocalizedStringFormatter.json +14 -0
- package/data/icons.json +21940 -0
- package/data/tokens.json +40061 -0
- package/dist/index.js +2516 -17
- package/package.json +25 -6
- package/dist/data-loader.d.ts +0 -102
- package/dist/data-loader.js +0 -104
- package/dist/index.d.ts +0 -13
- package/dist/server.d.ts +0 -9
- package/dist/server.js +0 -22
- package/dist/server.spec.d.ts +0 -1
- package/dist/server.spec.js +0 -69
- package/dist/tools/list-components.d.ts +0 -9
- package/dist/tools/list-components.js +0 -42
- package/dist/types.d.ts +0 -28
- package/dist/types.js +0 -4
- package/src/data-loader.ts +0 -226
- package/src/index.ts +0 -29
- package/src/server.spec.ts +0 -86
- package/src/server.ts +0 -28
- package/src/tools/list-components.ts +0 -49
- package/src/types.ts +0 -31
- package/tsconfig.json +0 -14
- package/vitest.config.ts +0 -9
|
@@ -0,0 +1,643 @@
|
|
|
1
|
+
{
|
|
2
|
+
"meta": {
|
|
3
|
+
"id": "Components-Accordion",
|
|
4
|
+
"title": "Accordion",
|
|
5
|
+
"exportName": "Accordion",
|
|
6
|
+
"description": "A collapsable component lets users show and hide sections of related content on a page.",
|
|
7
|
+
"lifecycleState": "Stable",
|
|
8
|
+
"order": 999,
|
|
9
|
+
"repoPath": "packages/nimbus/src/components/accordion/accordion.mdx",
|
|
10
|
+
"menu": [
|
|
11
|
+
"Components",
|
|
12
|
+
"Navigation",
|
|
13
|
+
"Accordion"
|
|
14
|
+
],
|
|
15
|
+
"route": "components/navigation/accordion",
|
|
16
|
+
"tags": [
|
|
17
|
+
"component",
|
|
18
|
+
"accordion",
|
|
19
|
+
"expandable",
|
|
20
|
+
"disclosure",
|
|
21
|
+
"panels"
|
|
22
|
+
],
|
|
23
|
+
"toc": [
|
|
24
|
+
{
|
|
25
|
+
"value": "Overview",
|
|
26
|
+
"href": "#overview",
|
|
27
|
+
"depth": 2,
|
|
28
|
+
"numbering": [
|
|
29
|
+
1,
|
|
30
|
+
1
|
|
31
|
+
],
|
|
32
|
+
"parent": "root"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"value": "Resources",
|
|
36
|
+
"href": "#resources",
|
|
37
|
+
"depth": 3,
|
|
38
|
+
"numbering": [
|
|
39
|
+
1,
|
|
40
|
+
1,
|
|
41
|
+
1
|
|
42
|
+
],
|
|
43
|
+
"parent": "root"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"value": "Variables",
|
|
47
|
+
"href": "#variables",
|
|
48
|
+
"depth": 2,
|
|
49
|
+
"numbering": [
|
|
50
|
+
1,
|
|
51
|
+
2
|
|
52
|
+
],
|
|
53
|
+
"parent": "root"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"value": "Size",
|
|
57
|
+
"href": "#size",
|
|
58
|
+
"depth": 3,
|
|
59
|
+
"numbering": [
|
|
60
|
+
1,
|
|
61
|
+
2,
|
|
62
|
+
1
|
|
63
|
+
],
|
|
64
|
+
"parent": "root"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"value": "Medium",
|
|
68
|
+
"href": "#medium",
|
|
69
|
+
"depth": 4,
|
|
70
|
+
"numbering": [
|
|
71
|
+
1,
|
|
72
|
+
2,
|
|
73
|
+
1,
|
|
74
|
+
1
|
|
75
|
+
],
|
|
76
|
+
"parent": "root"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"value": "Small",
|
|
80
|
+
"href": "#small",
|
|
81
|
+
"depth": 4,
|
|
82
|
+
"numbering": [
|
|
83
|
+
1,
|
|
84
|
+
2,
|
|
85
|
+
1,
|
|
86
|
+
2
|
|
87
|
+
],
|
|
88
|
+
"parent": "root"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"value": "Content",
|
|
92
|
+
"href": "#content",
|
|
93
|
+
"depth": 3,
|
|
94
|
+
"numbering": [
|
|
95
|
+
1,
|
|
96
|
+
2,
|
|
97
|
+
2
|
|
98
|
+
],
|
|
99
|
+
"parent": "root"
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"figmaLink": "https://www.figma.com/design/AvtPX6g7OGGCRvNlatGOIY/NIMBUS-design-system?node-id=2702-5711&t=kxCRBAio5yKpfcU0-4",
|
|
103
|
+
"layout": "app-frame",
|
|
104
|
+
"tabs": [
|
|
105
|
+
{
|
|
106
|
+
"key": "overview",
|
|
107
|
+
"title": "Overview",
|
|
108
|
+
"order": 0
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"key": "guidelines",
|
|
112
|
+
"title": "Guidelines",
|
|
113
|
+
"order": 2
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"key": "dev",
|
|
117
|
+
"title": "Implementation",
|
|
118
|
+
"order": 3
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"key": "a11y",
|
|
122
|
+
"title": "Accessibility",
|
|
123
|
+
"order": 4
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
},
|
|
127
|
+
"mdx": "\n## Overview\n\nThe primary difference between accordion types lies in whether they use\nadditional controls for accessing information or offer a simple click-to-expand\ninteraction.\n\n### Resources\n\nDeep dive into implementation details and access the Nimbus design library.\n\n[React ARIA](https://react-spectrum.adobe.com/react-aria/useDisclosure.html)\n[ARIA Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/)\n[Figma library](https://www.figma.com/design/AvtPX6g7OGGCRvNlatGOIY/NIMBUS-design-system?node-id=2702-5711&t=kxCRBAio5yKpfcU0-4)\n\n## Variables\n\nGet familiar with the features.\n\n### Size\n\n#### Medium\n\nThe default size for forms.\n\n```jsx live\nconst App = () => (\n <Accordion.Root>\n <Accordion.Item>\n <Accordion.Header>\n Headline\n <Accordion.HeaderRightContent>\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.Edit />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.PushPin />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.FileCopy />\n </IconButton>\n <IconButton colorPalette=\"critical\" variant=\"ghost\">\n <Icons.Delete />\n </IconButton>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>Content goes here</Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n\n#### Small\n\nUse for small condensed areas, or if there is a user preference for more\ncondensed forms.\n\n```jsx live\nconst App = () => (\n <Accordion.Root size=\"sm\">\n <Accordion.Item>\n <Accordion.Header>\n Headline\n <Accordion.HeaderRightContent >\n <Stack direction=\"horizontal\" alignItems=\"center\">\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.Edit />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.PushPin />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.FileCopy />\n </IconButton>\n <IconButton colorPalette=\"critical\" variant=\"ghost\" size=\"sm\">\n <Icons.Delete />\n </IconButton>\n </Stack>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>Content goes here</Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n\n### Content\n\nThe main use for accordions is for forms and filters. Custom content can be\ncreated for the body of the accordion.\n\n```jsx live\nconst App = () => (\n <Accordion.Root size=\"sm\">\n <Accordion.Item>\n <Accordion.Header>\n Details\n <Accordion.HeaderRightContent>\n <Stack direction=\"horizontal\" alignItems=\"center\">\n <Button colorPalette=\"primary\" size=\"xs\" variant=\"outline\">\n <Icons.Undo />\n Revert\n </Button>\n <Button colorPalette=\"primary\" size=\"xs\" variant=\"solid\">\n Save changes\n </Button>\n </Stack>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Stack direction=\"vertical\" gap=\"200\">\n <FormField.Root>\n <FormField.Label>First name</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"john\" w=\"100%\"/>\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Last name</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"doe\" w=\"100%\"/>\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Birthday</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"10.05.1982\" w=\"100%\"/>\n </FormField.Input>\n </FormField.Root>\n </Stack>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n",
|
|
128
|
+
"views": {
|
|
129
|
+
"overview": {
|
|
130
|
+
"mdx": "\n## Overview\n\nThe primary difference between accordion types lies in whether they use\nadditional controls for accessing information or offer a simple click-to-expand\ninteraction.\n\n### Resources\n\nDeep dive into implementation details and access the Nimbus design library.\n\n[React ARIA](https://react-spectrum.adobe.com/react-aria/useDisclosure.html)\n[ARIA Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/)\n[Figma library](https://www.figma.com/design/AvtPX6g7OGGCRvNlatGOIY/NIMBUS-design-system?node-id=2702-5711&t=kxCRBAio5yKpfcU0-4)\n\n## Variables\n\nGet familiar with the features.\n\n### Size\n\n#### Medium\n\nThe default size for forms.\n\n```jsx live\nconst App = () => (\n <Accordion.Root>\n <Accordion.Item>\n <Accordion.Header>\n Headline\n <Accordion.HeaderRightContent>\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.Edit />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.PushPin />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.FileCopy />\n </IconButton>\n <IconButton colorPalette=\"critical\" variant=\"ghost\">\n <Icons.Delete />\n </IconButton>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>Content goes here</Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n\n#### Small\n\nUse for small condensed areas, or if there is a user preference for more\ncondensed forms.\n\n```jsx live\nconst App = () => (\n <Accordion.Root size=\"sm\">\n <Accordion.Item>\n <Accordion.Header>\n Headline\n <Accordion.HeaderRightContent >\n <Stack direction=\"horizontal\" alignItems=\"center\">\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.Edit />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.PushPin />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.FileCopy />\n </IconButton>\n <IconButton colorPalette=\"critical\" variant=\"ghost\" size=\"sm\">\n <Icons.Delete />\n </IconButton>\n </Stack>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>Content goes here</Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n\n### Content\n\nThe main use for accordions is for forms and filters. Custom content can be\ncreated for the body of the accordion.\n\n```jsx live\nconst App = () => (\n <Accordion.Root size=\"sm\">\n <Accordion.Item>\n <Accordion.Header>\n Details\n <Accordion.HeaderRightContent>\n <Stack direction=\"horizontal\" alignItems=\"center\">\n <Button colorPalette=\"primary\" size=\"xs\" variant=\"outline\">\n <Icons.Undo />\n Revert\n </Button>\n <Button colorPalette=\"primary\" size=\"xs\" variant=\"solid\">\n Save changes\n </Button>\n </Stack>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Stack direction=\"vertical\" gap=\"200\">\n <FormField.Root>\n <FormField.Label>First name</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"john\" w=\"100%\"/>\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Last name</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"doe\" w=\"100%\"/>\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Birthday</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"10.05.1982\" w=\"100%\"/>\n </FormField.Input>\n </FormField.Root>\n </Stack>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n",
|
|
131
|
+
"toc": [
|
|
132
|
+
{
|
|
133
|
+
"value": "Overview",
|
|
134
|
+
"href": "#overview",
|
|
135
|
+
"depth": 2,
|
|
136
|
+
"numbering": [
|
|
137
|
+
1,
|
|
138
|
+
1
|
|
139
|
+
],
|
|
140
|
+
"parent": "root"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"value": "Resources",
|
|
144
|
+
"href": "#resources",
|
|
145
|
+
"depth": 3,
|
|
146
|
+
"numbering": [
|
|
147
|
+
1,
|
|
148
|
+
1,
|
|
149
|
+
1
|
|
150
|
+
],
|
|
151
|
+
"parent": "root"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"value": "Variables",
|
|
155
|
+
"href": "#variables",
|
|
156
|
+
"depth": 2,
|
|
157
|
+
"numbering": [
|
|
158
|
+
1,
|
|
159
|
+
2
|
|
160
|
+
],
|
|
161
|
+
"parent": "root"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"value": "Size",
|
|
165
|
+
"href": "#size",
|
|
166
|
+
"depth": 3,
|
|
167
|
+
"numbering": [
|
|
168
|
+
1,
|
|
169
|
+
2,
|
|
170
|
+
1
|
|
171
|
+
],
|
|
172
|
+
"parent": "root"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"value": "Medium",
|
|
176
|
+
"href": "#medium",
|
|
177
|
+
"depth": 4,
|
|
178
|
+
"numbering": [
|
|
179
|
+
1,
|
|
180
|
+
2,
|
|
181
|
+
1,
|
|
182
|
+
1
|
|
183
|
+
],
|
|
184
|
+
"parent": "root"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"value": "Small",
|
|
188
|
+
"href": "#small",
|
|
189
|
+
"depth": 4,
|
|
190
|
+
"numbering": [
|
|
191
|
+
1,
|
|
192
|
+
2,
|
|
193
|
+
1,
|
|
194
|
+
2
|
|
195
|
+
],
|
|
196
|
+
"parent": "root"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"value": "Content",
|
|
200
|
+
"href": "#content",
|
|
201
|
+
"depth": 3,
|
|
202
|
+
"numbering": [
|
|
203
|
+
1,
|
|
204
|
+
2,
|
|
205
|
+
2
|
|
206
|
+
],
|
|
207
|
+
"parent": "root"
|
|
208
|
+
}
|
|
209
|
+
]
|
|
210
|
+
},
|
|
211
|
+
"a11y": {
|
|
212
|
+
"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 <Accordion.Root>\n <Accordion.Item>\n <Accordion.Header>\n Headline\n <Accordion.HeaderRightContent>\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.Edit />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.PushPin />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.FileCopy />\n </IconButton>\n <IconButton colorPalette=\"critical\" variant=\"ghost\">\n <Icons.Delete />\n </IconButton>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>Content goes here</Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n\n### Accessibility standards\n\n- **Use appropriate HTML elements:** Use `<button>` for headers controlling\n panels. Employ separate elements for content panels. Establish clear\n relationships between triggers and content programmatically.\n- **Headings:** Utilize heading elements (`<h3>`, `<h2>`, etc.) for accordion\n headers. Provide semantic structure for navigation by assistive technologies.\n- **ARIA Roles:** Apply `role=\"region\"` to content panels for landmark\n identification.\n- **aria-expanded:** Dynamically update on the `<button>` controlling the panel.\n `aria-expanded=\"true\"` for visible panels. `aria-expanded=\"false\"` for hidden\n panels.\n- **aria-controls:** Set on the `<button>` to reference the id of its controlled\n content panel. Explicitly link the button to the content.\n- **aria-labelledby:** Apply to the content panel (with `role=\"region\"`).\n Reference the id of the accordion's header button.\n- **Keyboard navigation:** Ensure full keyboard operability. Allow focus to\n reach each accordion header (`<button>`) using Tab. Enable toggling panel\n visibility using Space or Enter on focused headers. Consider arrow key\n navigation between headers (enhancement).\n- **Focus visible:** Provide a clear visual focus indicator for focused\n accordion headers (`<button>`). Assist keyboard users in identifying the\n selected element.\n- **Content visibility for assistive technologies:** Ensure content of collapsed\n panels is not focusable via keyboard and hidden from screen readers (e.g.,\n `aria-hidden=\"true\"`, `display: none`).\n- **Color contrast:** Maintain sufficient color contrast for text within headers\n and content panels. Ensure readability against background colors.\n- **Clear indicators:** Provide visual cues for expanded/collapsed states (e.g.,\n arrows, +/-). Hide decorative indicators from screen readers\n (`aria-hidden=\"true\"`).\n- **Avoid less accessible methods:** Avoid relying solely on `<details>` and\n `<summary>` for complex accordions. ARIA attributes offer more reliable and\n controllable accessibility.\n",
|
|
213
|
+
"toc": [
|
|
214
|
+
{
|
|
215
|
+
"value": "Accessibility",
|
|
216
|
+
"href": "#accessibility",
|
|
217
|
+
"depth": 2,
|
|
218
|
+
"numbering": [
|
|
219
|
+
1,
|
|
220
|
+
1
|
|
221
|
+
],
|
|
222
|
+
"parent": "root"
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"value": "Accessibility standards",
|
|
226
|
+
"href": "#accessibility-standards",
|
|
227
|
+
"depth": 3,
|
|
228
|
+
"numbering": [
|
|
229
|
+
1,
|
|
230
|
+
1,
|
|
231
|
+
1
|
|
232
|
+
],
|
|
233
|
+
"parent": "root"
|
|
234
|
+
}
|
|
235
|
+
]
|
|
236
|
+
},
|
|
237
|
+
"dev": {
|
|
238
|
+
"mdx": "\n## Getting started\n\n### Import\n\nImport the Accordion compound component and its TypeScript types:\n\n```tsx\nimport { Accordion, type AccordionRootProps } from \"@commercetools/nimbus\";\n```\n\n### Basic usage\n\nThe Accordion is a compound component with multiple parts that work together. At\nminimum, you need `Accordion.Root`, `Accordion.Item`, `Accordion.Header`, and\n`Accordion.Content`:\n\n```jsx live-dev\nconst App = () => {\n return (\n <Accordion.Root>\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>First Section</Accordion.Header>\n <Accordion.Content>\n <Text>\n This is the content for the first section. Click the header to\n expand or collapse this content area.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"item-2\">\n <Accordion.Header>Second Section</Accordion.Header>\n <Accordion.Content>\n <Text>\n This is the content for the second section. Only one section can\n be open at a time by default.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"item-3\">\n <Accordion.Header>Third Section</Accordion.Header>\n <Accordion.Content>\n <Text>\n This is the content for the third section. Each item needs a\n unique value for proper identification.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n );\n};\n```\n\n## Usage examples\n\n### Size variants\n\nThe Accordion component supports two size variants: `sm` (small) and `md`\n(medium, default). The size affects the font size, icon size, and padding:\n\n```jsx live-dev\nconst App = () => {\n return (\n <Stack direction=\"column\" gap=\"600\">\n <Stack direction=\"column\" gap=\"400\">\n <Text fontWeight=\"600\">Small Size</Text>\n <Accordion.Root size=\"sm\">\n <Accordion.Item value=\"sm-1\">\n <Accordion.Header>Compact Header</Accordion.Header>\n <Accordion.Content>\n <Text>Smaller padding and font size for dense layouts.</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"sm-2\">\n <Accordion.Header>Another Item</Accordion.Header>\n <Accordion.Content>\n <Text>Perfect for sidebars or constrained spaces.</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </Stack>\n\n <Stack direction=\"column\" gap=\"400\">\n <Text fontWeight=\"600\">Medium Size (Default)</Text>\n <Accordion.Root size=\"md\">\n <Accordion.Item value=\"md-1\">\n <Accordion.Header>Standard Header</Accordion.Header>\n <Accordion.Content>\n <Text>Default size with comfortable spacing for most use cases.</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"md-2\">\n <Accordion.Header>Another Item</Accordion.Header>\n <Accordion.Content>\n <Text>Provides good balance between readability and space efficiency.</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </Stack>\n </Stack>\n );\n};\n```\n\n### Multiple item expansion\n\nBy default, only one accordion item can be expanded at a time. Use the\n`allowsMultipleExpanded` prop to allow multiple items to be open simultaneously:\n\n```jsx live-dev\nconst App = () => {\n return (\n <Stack direction=\"column\" gap=\"600\">\n <Stack direction=\"column\" gap=\"400\">\n <Text fontWeight=\"600\">Single Expansion (Default)</Text>\n <Accordion.Root>\n <Accordion.Item value=\"single-1\">\n <Accordion.Header>First Section</Accordion.Header>\n <Accordion.Content>\n <Text>Opening this closes other sections automatically.</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"single-2\">\n <Accordion.Header>Second Section</Accordion.Header>\n <Accordion.Content>\n <Text>Only one section can be open at a time.</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"single-3\">\n <Accordion.Header>Third Section</Accordion.Header>\n <Accordion.Content>\n <Text>This is the default behavior for accordions.</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </Stack>\n\n <Stack direction=\"column\" gap=\"400\">\n <Text fontWeight=\"600\">Multiple Expansion</Text>\n <Accordion.Root allowsMultipleExpanded>\n <Accordion.Item value=\"multi-1\">\n <Accordion.Header>First Section</Accordion.Header>\n <Accordion.Content>\n <Text>Multiple sections can be open at the same time.</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"multi-2\">\n <Accordion.Header>Second Section</Accordion.Header>\n <Accordion.Content>\n <Text>This is useful for comparison or reference scenarios.</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"multi-3\">\n <Accordion.Header>Third Section</Accordion.Header>\n <Accordion.Content>\n <Text>Users can expand as many sections as they need.</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </Stack>\n </Stack>\n );\n};\n```\n\n### Disabled state\n\nDisable the entire accordion or individual items to prevent user interaction:\n\n```jsx live-dev\nconst App = () => {\n return (\n <Stack direction=\"column\" gap=\"600\">\n <Stack direction=\"column\" gap=\"400\">\n <Text fontWeight=\"600\">Fully Disabled Accordion</Text>\n <Accordion.Root isDisabled>\n <Accordion.Item value=\"disabled-1\">\n <Accordion.Header>Disabled Header</Accordion.Header>\n <Accordion.Content>\n <Text>This content cannot be accessed.</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"disabled-2\">\n <Accordion.Header>Another Disabled Item</Accordion.Header>\n <Accordion.Content>\n <Text>All items are disabled when the root is disabled.</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </Stack>\n\n <Stack direction=\"column\" gap=\"400\">\n <Text fontWeight=\"600\">Partially Disabled Accordion</Text>\n <Accordion.Root>\n <Accordion.Item value=\"enabled-1\">\n <Accordion.Header>Active Item</Accordion.Header>\n <Accordion.Content>\n <Text>This item is enabled and can be interacted with.</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"disabled-item\" isDisabled>\n <Accordion.Header>Disabled Item</Accordion.Header>\n <Accordion.Content>\n <Text>This content is disabled.</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"enabled-2\">\n <Accordion.Header>Another Active Item</Accordion.Header>\n <Accordion.Content>\n <Text>Individual items can be disabled while others remain active.</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </Stack>\n </Stack>\n );\n};\n```\n\n### Uncontrolled mode\n\nUse `defaultExpandedKeys` to set which items are initially expanded without\nmanaging state yourself:\n\n```jsx live-dev\nconst App = () => {\n return (\n <Accordion.Root\n allowsMultipleExpanded\n defaultExpandedKeys={[\"features\", \"accessibility\"]}\n >\n <Accordion.Item value=\"features\">\n <Accordion.Header>Key Features</Accordion.Header>\n <Accordion.Content>\n <Text>\n This section is expanded by default. The accordion manages its own state\n internally, making it simple to use when you don't need external control.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"accessibility\">\n <Accordion.Header>Accessibility</Accordion.Header>\n <Accordion.Content>\n <Text>\n Also expanded by default. Users can expand/collapse items, and the component\n tracks the state automatically.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"usage\">\n <Accordion.Header>Usage Guidelines</Accordion.Header>\n <Accordion.Content>\n <Text>\n This section starts collapsed. Uncontrolled mode is ideal for simple\n accordions where you don't need to track the expanded state externally.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n );\n};\n```\n\n### Controlled mode\n\nFor full control over the expanded state, use the `expandedKeys` and\n`onExpandedChange` props. This is useful when you need to:\n\n- Synchronize accordion state with URL parameters\n- Track analytics when sections are expanded\n- Implement custom expand/collapse logic\n- Integrate with external state management\n\n```jsx live-dev\nconst App = () => {\n const [expandedKeys, setExpandedKeys] = React.useState(new Set([\"section-1\"]));\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <Text fontWeight=\"600\">\n Expanded sections: {expandedKeys.size}\n </Text>\n <Text fontSize=\"350\" color=\"neutral.11\">\n Current: {Array.from(expandedKeys).join(\", \") || \"none\"}\n </Text>\n\n <Accordion.Root\n allowsMultipleExpanded\n expandedKeys={expandedKeys}\n onExpandedChange={setExpandedKeys}\n >\n <Accordion.Item value=\"section-1\">\n <Accordion.Header>First Section</Accordion.Header>\n <Accordion.Content>\n <Text>\n The parent component has full control over which sections are expanded.\n You can track state changes, persist to localStorage, or sync with URLs.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"section-2\">\n <Accordion.Header>Second Section</Accordion.Header>\n <Accordion.Content>\n <Text>\n Controlled mode gives you complete flexibility to implement custom\n behavior around the accordion's expanded state.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"section-3\">\n <Accordion.Header>Third Section</Accordion.Header>\n <Accordion.Content>\n <Text>\n Use this pattern when you need to integrate the accordion with\n application-level state management or routing.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n\n <Button\n size=\"md\"\n variant=\"outline\"\n onClick={() => setExpandedKeys(new Set([\"section-1\", \"section-2\", \"section-3\"]))}\n >\n Expand All\n </Button>\n <Button\n size=\"md\"\n variant=\"outline\"\n onClick={() => setExpandedKeys(new Set())}\n >\n Collapse All\n </Button>\n </Stack>\n );\n};\n```\n\n### Header with right-aligned content\n\nAdd buttons, badges, or other elements to the right side of accordion headers\nusing `Accordion.HeaderRightContent`:\n\n```jsx live-dev\nconst App = () => {\n const [counts, setCounts] = React.useState({ item1: 0, item2: 0, item3: 0 });\n\n const handleIncrement = (item: keyof typeof counts, event: React.MouseEvent) => {\n event.stopPropagation(); // Prevent accordion from toggling\n setCounts(prev => ({ ...prev, [item]: prev[item] + 1 }));\n };\n\n return (\n <Accordion.Root>\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>\n Settings\n <Accordion.HeaderRightContent>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={(e) => handleIncrement('item1', e)}\n >\n Edit ({counts.item1})\n </Button>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Text>\n Configure your account settings. The edit button in the header doesn't\n trigger the accordion toggle, allowing independent actions.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n\n <Accordion.Item value=\"item-2\">\n <Accordion.Header>\n Notifications\n <Accordion.HeaderRightContent>\n <Badge colorPalette=\"warning\" size=\"xs\">\n 3 new\n </Badge>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={(e) => handleIncrement('item2', e)}\n marginLeft=\"200\"\n >\n Clear ({counts.item2})\n </Button>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Text>\n View your recent notifications. You can add multiple elements to the\n right side of the header, like badges and action buttons.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n\n <Accordion.Item value=\"item-3\">\n <Accordion.Header>\n Privacy\n <Accordion.HeaderRightContent>\n <Icons.Lock fontSize=\"500\" color=\"neutral.11\" />\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Text>\n Manage your privacy preferences. Icons can also be added to provide\n visual context or status indicators.\n </Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n );\n};\n```\n\n## Component requirements\n\n## Accessibility\n\nThe Accordion component is built with React Aria and follows the WAI-ARIA\nAccordion pattern. It provides:\n\n**Role:**\n\n- Each accordion item has `role=\"group\"`\n- Headers are implemented as `button` elements\n\n**Labeling:**\n\n- Headers use `aria-expanded` to indicate their state (true/false)\n- Content panels are properly associated with their headers\n- Each item should have a unique `value` prop for proper identification\n\n**Keyboard navigation:**\n\n- `Space` or `Enter` - Toggle the focused accordion item\n- `Tab` - Move focus to the next focusable element\n- `Shift + Tab` - Move focus to the previous focusable element\n- Arrow keys - Navigate between accordion headers (when focus is on a header)\n\nIf your use case requires tracking and analytics for this component, it is good\npractice to add a **persistent**, **unique** id to the component:\n\n```tsx\nconst PERSISTENT_ID = \"user-settings-accordion\";\n\nexport const SettingsAccordion = () => (\n <Accordion.Root id={PERSISTENT_ID}>\n <Accordion.Item value=\"profile\">\n <Accordion.Header>Profile Settings</Accordion.Header>\n <Accordion.Content>\n <Text>Edit your profile information</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n\n## API reference\n\n<PropsTable id=\"Accordion\" />\n\n## Testing your implementation\n\nThese examples demonstrate how to test your implementation when using Accordion\nwithin your application. As the component's internal functionality is already\ntested by Nimbus, these patterns help you verify your integration and\napplication-specific logic.\n\n### Test Setup\n\nConfigure your testing environment for Accordion components\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 { Accordion, NimbusProvider, Text } from \"@commercetools/nimbus\";\n\ndescribe(\"Accordion - Test Setup\", () => {\n it(\"renders accordion with basic structure\", () => {\n render(\n <NimbusProvider>\n <Accordion.Root>\n <Accordion.Item value=\"test-item\">\n <Accordion.Header>Test Header</Accordion.Header>\n <Accordion.Content>\n <Text>Test Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n expect(\n screen.getByRole(\"button\", { name: \"Test Header\" })\n ).toBeInTheDocument();\n expect(screen.getByRole(\"group\", { hidden: true })).toBeInTheDocument();\n });\n\n it(\"renders multiple accordion items\", () => {\n render(\n <NimbusProvider>\n <Accordion.Root>\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>First Item</Accordion.Header>\n <Accordion.Content>\n <Text>First Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"item-2\">\n <Accordion.Header>Second Item</Accordion.Header>\n <Accordion.Content>\n <Text>Second Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n expect(\n screen.getByRole(\"button\", { name: \"First Item\" })\n ).toBeInTheDocument();\n expect(\n screen.getByRole(\"button\", { name: \"Second Item\" })\n ).toBeInTheDocument();\n });\n});\n```\n\n### User Interactions\n\nTest user interactions with accordion items\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 { Accordion, NimbusProvider, Text } from \"@commercetools/nimbus\";\n\ndescribe(\"Accordion - User Interactions\", () => {\n it(\"expands and collapses items when clicked\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <Accordion.Root>\n <Accordion.Item value=\"test-item\">\n <Accordion.Header>Clickable Header</Accordion.Header>\n <Accordion.Content>\n <Text>Hidden Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n const header = screen.getByRole(\"button\", { name: \"Clickable Header\" });\n const content = screen.getByRole(\"group\", { hidden: true });\n\n // Initially collapsed\n expect(content).not.toBeVisible();\n expect(header).toHaveAttribute(\"aria-expanded\", \"false\");\n\n // Click to expand\n await user.click(header);\n expect(content).toBeVisible();\n expect(header).toHaveAttribute(\"aria-expanded\", \"true\");\n\n // Click to collapse\n await user.click(header);\n expect(content).not.toBeVisible();\n expect(header).toHaveAttribute(\"aria-expanded\", \"false\");\n });\n\n it(\"handles keyboard navigation with Space and Enter\", async () => {\n const user = userEvent.setup();\n render(\n <NimbusProvider>\n <Accordion.Root>\n <Accordion.Item value=\"keyboard-item\">\n <Accordion.Header>Keyboard Test</Accordion.Header>\n <Accordion.Content>\n <Text>Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n const header = screen.getByRole(\"button\", { name: \"Keyboard Test\" });\n const content = screen.getByRole(\"group\", { hidden: true });\n\n // Focus the header using tab navigation\n await user.tab();\n await waitFor(() => {\n expect(header).toHaveFocus();\n });\n\n // Expand with Enter key\n await user.keyboard(\"{Enter}\");\n await waitFor(() => {\n expect(content).toBeVisible();\n });\n\n // Collapse with Space key\n await user.keyboard(\" \");\n await waitFor(() => {\n expect(content).not.toBeVisible();\n });\n });\n});\n```\n\n### Multiple Item Expansion\n\nTest accordion behavior with multiple expanded items\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 { Accordion, NimbusProvider, Text } from \"@commercetools/nimbus\";\n\ndescribe(\"Accordion - Multiple Expansion\", () => {\n it(\"allows only one item expanded by default\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <Accordion.Root>\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>First Item</Accordion.Header>\n <Accordion.Content>\n <Text>First Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"item-2\">\n <Accordion.Header>Second Item</Accordion.Header>\n <Accordion.Content>\n <Text>Second Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n const firstHeader = screen.getByRole(\"button\", { name: \"First Item\" });\n const secondHeader = screen.getByRole(\"button\", { name: \"Second Item\" });\n const panels = screen.getAllByRole(\"group\", { hidden: true });\n\n // Expand first item\n await user.click(firstHeader);\n expect(panels[0]).toBeVisible();\n expect(panels[1]).not.toBeVisible();\n\n // Expand second item - first should close\n await user.click(secondHeader);\n expect(panels[0]).not.toBeVisible();\n expect(panels[1]).toBeVisible();\n });\n\n it(\"allows multiple items expanded when allowsMultipleExpanded is true\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <Accordion.Root allowsMultipleExpanded>\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>First Item</Accordion.Header>\n <Accordion.Content>\n <Text>First Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"item-2\">\n <Accordion.Header>Second Item</Accordion.Header>\n <Accordion.Content>\n <Text>Second Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n const firstHeader = screen.getByRole(\"button\", { name: \"First Item\" });\n const secondHeader = screen.getByRole(\"button\", { name: \"Second Item\" });\n const panels = screen.getAllByRole(\"group\", { hidden: true });\n\n // Expand first item\n await user.click(firstHeader);\n expect(panels[0]).toBeVisible();\n\n // Expand second item - first should remain open\n await user.click(secondHeader);\n expect(panels[0]).toBeVisible();\n expect(panels[1]).toBeVisible();\n });\n});\n```\n\n### Controlled Mode\n\nTest controlled accordion state management\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 { Accordion, NimbusProvider, Text } from \"@commercetools/nimbus\";\n\ndescribe(\"Accordion - Controlled Mode\", () => {\n it(\"respects controlled expandedKeys prop\", () => {\n render(\n <NimbusProvider>\n <Accordion.Root expandedKeys={[\"item-1\"]}>\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>First Item</Accordion.Header>\n <Accordion.Content>\n <Text>First Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"item-2\">\n <Accordion.Header>Second Item</Accordion.Header>\n <Accordion.Content>\n <Text>Second Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n const panels = screen.getAllByRole(\"group\", { hidden: true });\n\n // First item should be expanded, second collapsed\n expect(panels[0]).toBeVisible();\n expect(panels[1]).not.toBeVisible();\n });\n\n it(\"calls onExpandedChange when items are toggled\", async () => {\n const user = userEvent.setup();\n const handleExpandedChange = vi.fn();\n\n render(\n <NimbusProvider>\n <Accordion.Root\n expandedKeys={[]}\n onExpandedChange={handleExpandedChange}\n >\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>Test Item</Accordion.Header>\n <Accordion.Content>\n <Text>Test Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n const header = screen.getByRole(\"button\", { name: \"Test Item\" });\n\n await user.click(header);\n\n // React Aria returns a Set for expandedKeys\n expect(handleExpandedChange).toHaveBeenCalledWith(new Set([\"item-1\"]));\n });\n\n it(\"supports uncontrolled mode with defaultExpandedKeys\", () => {\n render(\n <NimbusProvider>\n <Accordion.Root\n allowsMultipleExpanded\n defaultExpandedKeys={[\"item-1\", \"item-3\"]}\n >\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>First Item</Accordion.Header>\n <Accordion.Content>\n <Text>First Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"item-2\">\n <Accordion.Header>Second Item</Accordion.Header>\n <Accordion.Content>\n <Text>Second Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"item-3\">\n <Accordion.Header>Third Item</Accordion.Header>\n <Accordion.Content>\n <Text>Third Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n const panels = screen.getAllByRole(\"group\", { hidden: true });\n\n // First and third items should be expanded by default\n expect(panels[0]).toBeVisible();\n expect(panels[1]).not.toBeVisible();\n expect(panels[2]).toBeVisible();\n });\n});\n```\n\n### Disabled State\n\nTest accordion disabled 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 { Accordion, NimbusProvider, Text } from \"@commercetools/nimbus\";\n\ndescribe(\"Accordion - Disabled State\", () => {\n it(\"disables all items when root is disabled\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <Accordion.Root isDisabled>\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>Disabled Item</Accordion.Header>\n <Accordion.Content>\n <Text>Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n const header = screen.getByRole(\"button\", { name: \"Disabled Item\" });\n const content = screen.getByRole(\"group\", { hidden: true });\n\n expect(header).toBeDisabled();\n\n // Clicking should not expand\n await user.click(header);\n expect(content).not.toBeVisible();\n });\n\n it(\"disables individual items\", async () => {\n const user = userEvent.setup();\n\n render(\n <NimbusProvider>\n <Accordion.Root>\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>Enabled Item</Accordion.Header>\n <Accordion.Content>\n <Text>Enabled Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n <Accordion.Item value=\"item-2\" isDisabled>\n <Accordion.Header>Disabled Item</Accordion.Header>\n <Accordion.Content>\n <Text>Disabled Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n const enabledHeader = screen.getByRole(\"button\", { name: \"Enabled Item\" });\n const disabledHeader = screen.getByRole(\"button\", {\n name: \"Disabled Item\",\n });\n const panels = screen.getAllByRole(\"group\", { hidden: true });\n\n // Enabled item should work\n await user.click(enabledHeader);\n expect(panels[0]).toBeVisible();\n\n // Disabled item should not work\n expect(disabledHeader).toBeDisabled();\n await user.click(disabledHeader);\n expect(panels[1]).not.toBeVisible();\n });\n});\n```\n\n### Header Right Content\n\nTest accordion header with right-aligned content\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 { Accordion, NimbusProvider, Text } from \"@commercetools/nimbus\";\n\ndescribe(\"Accordion - Header Right Content\", () => {\n it(\"renders right-aligned content in header\", () => {\n render(\n <NimbusProvider>\n <Accordion.Root>\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>\n Item Title\n <Accordion.HeaderRightContent>\n <Text>Extra Info</Text>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Text>Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Item Title\")).toBeInTheDocument();\n expect(screen.getByText(\"Extra Info\")).toBeInTheDocument();\n });\n\n it(\"allows interactions with header right content without toggling accordion\", async () => {\n const user = userEvent.setup();\n const handleButtonClick = vi.fn((e: React.MouseEvent) => {\n e.stopPropagation();\n });\n\n render(\n <NimbusProvider>\n <Accordion.Root>\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>\n Item Title\n <Accordion.HeaderRightContent>\n <button onClick={handleButtonClick}>Action</button>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Text>Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n const actionButton = screen.getByRole(\"button\", { name: \"Action\" });\n const content = screen.getByRole(\"group\", { hidden: true });\n\n // Click action button\n await user.click(actionButton);\n\n // Action should be called\n expect(handleButtonClick).toHaveBeenCalled();\n\n // Accordion should remain collapsed\n expect(content).not.toBeVisible();\n });\n});\n```\n\n### Size Variants\n\nTest accordion size variant rendering\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 { Accordion, NimbusProvider, Text } from \"@commercetools/nimbus\";\n\ndescribe(\"Accordion - Size Variants\", () => {\n it(\"renders small size variant\", () => {\n render(\n <NimbusProvider>\n <Accordion.Root size=\"sm\">\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>Small Item</Accordion.Header>\n <Accordion.Content>\n <Text>Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n // Verify the component renders with the size variant\n expect(\n screen.getByRole(\"button\", { name: \"Small Item\" })\n ).toBeInTheDocument();\n expect(screen.getByRole(\"group\", { hidden: true })).toBeInTheDocument();\n });\n\n it(\"renders medium size variant (default)\", () => {\n render(\n <NimbusProvider>\n <Accordion.Root size=\"md\">\n <Accordion.Item value=\"item-1\">\n <Accordion.Header>Medium Item</Accordion.Header>\n <Accordion.Content>\n <Text>Content</Text>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </NimbusProvider>\n );\n\n // Verify the component renders with the size variant\n expect(\n screen.getByRole(\"button\", { name: \"Medium Item\" })\n ).toBeInTheDocument();\n expect(screen.getByRole(\"group\", { hidden: true })).toBeInTheDocument();\n });\n});\n```\n\n\n## Resources\n\n- [Accordion Storybook](https://nimbus-storybook.vercel.app/?path=/docs/components-accordion--docs)\n- [React Aria DisclosureGroup Documentation](https://react-spectrum.adobe.com/react-aria/DisclosureGroup.html)\n- [WAI-ARIA Accordion Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/accordion/)\n",
|
|
239
|
+
"toc": [
|
|
240
|
+
{
|
|
241
|
+
"value": "Getting started",
|
|
242
|
+
"href": "#getting-started",
|
|
243
|
+
"depth": 2,
|
|
244
|
+
"numbering": [
|
|
245
|
+
1,
|
|
246
|
+
1
|
|
247
|
+
],
|
|
248
|
+
"parent": "root"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"value": "Import",
|
|
252
|
+
"href": "#import",
|
|
253
|
+
"depth": 3,
|
|
254
|
+
"numbering": [
|
|
255
|
+
1,
|
|
256
|
+
1,
|
|
257
|
+
1
|
|
258
|
+
],
|
|
259
|
+
"parent": "root"
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"value": "Basic usage",
|
|
263
|
+
"href": "#basic-usage",
|
|
264
|
+
"depth": 3,
|
|
265
|
+
"numbering": [
|
|
266
|
+
1,
|
|
267
|
+
1,
|
|
268
|
+
2
|
|
269
|
+
],
|
|
270
|
+
"parent": "root"
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
"value": "Usage examples",
|
|
274
|
+
"href": "#usage-examples",
|
|
275
|
+
"depth": 2,
|
|
276
|
+
"numbering": [
|
|
277
|
+
1,
|
|
278
|
+
2
|
|
279
|
+
],
|
|
280
|
+
"parent": "root"
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
"value": "Size variants",
|
|
284
|
+
"href": "#size-variants",
|
|
285
|
+
"depth": 3,
|
|
286
|
+
"numbering": [
|
|
287
|
+
1,
|
|
288
|
+
2,
|
|
289
|
+
1
|
|
290
|
+
],
|
|
291
|
+
"parent": "root"
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"value": "Multiple item expansion",
|
|
295
|
+
"href": "#multiple-item-expansion",
|
|
296
|
+
"depth": 3,
|
|
297
|
+
"numbering": [
|
|
298
|
+
1,
|
|
299
|
+
2,
|
|
300
|
+
2
|
|
301
|
+
],
|
|
302
|
+
"parent": "root"
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"value": "Disabled state",
|
|
306
|
+
"href": "#disabled-state",
|
|
307
|
+
"depth": 3,
|
|
308
|
+
"numbering": [
|
|
309
|
+
1,
|
|
310
|
+
2,
|
|
311
|
+
3
|
|
312
|
+
],
|
|
313
|
+
"parent": "root"
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"value": "Uncontrolled mode",
|
|
317
|
+
"href": "#uncontrolled-mode",
|
|
318
|
+
"depth": 3,
|
|
319
|
+
"numbering": [
|
|
320
|
+
1,
|
|
321
|
+
2,
|
|
322
|
+
4
|
|
323
|
+
],
|
|
324
|
+
"parent": "root"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"value": "Controlled mode",
|
|
328
|
+
"href": "#controlled-mode",
|
|
329
|
+
"depth": 3,
|
|
330
|
+
"numbering": [
|
|
331
|
+
1,
|
|
332
|
+
2,
|
|
333
|
+
5
|
|
334
|
+
],
|
|
335
|
+
"parent": "root"
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
"value": "Header with right-aligned content",
|
|
339
|
+
"href": "#header-with-right-aligned-content",
|
|
340
|
+
"depth": 3,
|
|
341
|
+
"numbering": [
|
|
342
|
+
1,
|
|
343
|
+
2,
|
|
344
|
+
6
|
|
345
|
+
],
|
|
346
|
+
"parent": "root"
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
"value": "Component requirements",
|
|
350
|
+
"href": "#component-requirements",
|
|
351
|
+
"depth": 2,
|
|
352
|
+
"numbering": [
|
|
353
|
+
1,
|
|
354
|
+
3
|
|
355
|
+
],
|
|
356
|
+
"parent": "root"
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"value": "Accessibility",
|
|
360
|
+
"href": "#accessibility",
|
|
361
|
+
"depth": 2,
|
|
362
|
+
"numbering": [
|
|
363
|
+
1,
|
|
364
|
+
4
|
|
365
|
+
],
|
|
366
|
+
"parent": "root"
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
"value": "API reference",
|
|
370
|
+
"href": "#api-reference",
|
|
371
|
+
"depth": 2,
|
|
372
|
+
"numbering": [
|
|
373
|
+
1,
|
|
374
|
+
5
|
|
375
|
+
],
|
|
376
|
+
"parent": "root"
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
"value": "Testing your implementation",
|
|
380
|
+
"href": "#testing-your-implementation",
|
|
381
|
+
"depth": 2,
|
|
382
|
+
"numbering": [
|
|
383
|
+
1,
|
|
384
|
+
6
|
|
385
|
+
],
|
|
386
|
+
"parent": "root"
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"value": "Test Setup",
|
|
390
|
+
"href": "#test-setup",
|
|
391
|
+
"depth": 3,
|
|
392
|
+
"numbering": [
|
|
393
|
+
1,
|
|
394
|
+
6,
|
|
395
|
+
1
|
|
396
|
+
],
|
|
397
|
+
"parent": "root"
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"value": "User Interactions",
|
|
401
|
+
"href": "#user-interactions",
|
|
402
|
+
"depth": 3,
|
|
403
|
+
"numbering": [
|
|
404
|
+
1,
|
|
405
|
+
6,
|
|
406
|
+
2
|
|
407
|
+
],
|
|
408
|
+
"parent": "root"
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"value": "Multiple Item Expansion",
|
|
412
|
+
"href": "#multiple-item-expansion-1",
|
|
413
|
+
"depth": 3,
|
|
414
|
+
"numbering": [
|
|
415
|
+
1,
|
|
416
|
+
6,
|
|
417
|
+
3
|
|
418
|
+
],
|
|
419
|
+
"parent": "root"
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
"value": "Controlled Mode",
|
|
423
|
+
"href": "#controlled-mode-1",
|
|
424
|
+
"depth": 3,
|
|
425
|
+
"numbering": [
|
|
426
|
+
1,
|
|
427
|
+
6,
|
|
428
|
+
4
|
|
429
|
+
],
|
|
430
|
+
"parent": "root"
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
"value": "Disabled State",
|
|
434
|
+
"href": "#disabled-state-1",
|
|
435
|
+
"depth": 3,
|
|
436
|
+
"numbering": [
|
|
437
|
+
1,
|
|
438
|
+
6,
|
|
439
|
+
5
|
|
440
|
+
],
|
|
441
|
+
"parent": "root"
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
"value": "Header Right Content",
|
|
445
|
+
"href": "#header-right-content",
|
|
446
|
+
"depth": 3,
|
|
447
|
+
"numbering": [
|
|
448
|
+
1,
|
|
449
|
+
6,
|
|
450
|
+
6
|
|
451
|
+
],
|
|
452
|
+
"parent": "root"
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
"value": "Size Variants",
|
|
456
|
+
"href": "#size-variants-1",
|
|
457
|
+
"depth": 3,
|
|
458
|
+
"numbering": [
|
|
459
|
+
1,
|
|
460
|
+
6,
|
|
461
|
+
7
|
|
462
|
+
],
|
|
463
|
+
"parent": "root"
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
"value": "Resources",
|
|
467
|
+
"href": "#resources",
|
|
468
|
+
"depth": 2,
|
|
469
|
+
"numbering": [
|
|
470
|
+
1,
|
|
471
|
+
7
|
|
472
|
+
],
|
|
473
|
+
"parent": "root"
|
|
474
|
+
}
|
|
475
|
+
]
|
|
476
|
+
},
|
|
477
|
+
"guidelines": {
|
|
478
|
+
"mdx": "\n## Guidelines\n\nAccordion guidelines offer a set of standardized rules and recommendations that\nensure consistency, usability, and accessibility across all design elements and\ninteractions.\n\n### Best practices\n\n- **Label clarity:** Headers must be clear and descriptive so users understand\n what information is contained within each section.\n- **Visual cues:** Use clear visual cues to indicate that a section can be\n expanded and its current state. If other icons and controls are present,\n ensure that their use is clear and explained.\n- **Accessibility:** Ensure accordions are accessible to users with\n disabilities, including keyboard navigation and screen reader compatibility.\n- **Avoid nesting too deeply:** Overly nested accordions can become confusing\n and difficult to navigate.\n\n### Common accordion controls\n\nThese are some common patterns for accordions controls. These are included in\nthe figma library components to make designing common shared uses easier.\n\n#### Revert and save\n\nThis action allows users to discard any unsaved changes they've made to the\ncontrols since the last successful save or the default settings were loaded.\n\n```jsx live\nconst App = () => (\n <Stack direction=\"horizontal\" alignItems=\"center\">\n <Button colorPalette=\"primary\" size=\"xs\" variant=\"outline\">\n <Icons.Undo />\n Revert\n </Button>\n <Button colorPalette=\"primary\" size=\"xs\" variant=\"solid\">\n Save changes\n </Button>\n </Stack>\n);\n```\n\n#### Cancel and save\n\nSimilar to revert and save, there is a difference in persistence and scope.\n\"Revert\" often implies going back to a saved state, affecting changes made over\na longer period, while \"Cancel\" typically discards unsaved changes from the\ncurrent interaction.\n\n```jsx live\nconst App = () => (\n <Stack direction=\"horizontal\" alignItems=\"center\">\n <Button colorPalette=\"primary\" size=\"xs\" variant=\"outline\">\n Cancel\n </Button>\n <Button colorPalette=\"primary\" size=\"xs\" variant=\"solid\">\n Save\n </Button>\n </Stack>\n);\n```\n\n#### Four icon buttons\n\nUse up to four icons to allow your user to control the information within the\nassociated accordion.\n\n```jsx live\nconst App = () => (\n <Stack direction=\"horizontal\" alignItems=\"center\">\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.Edit />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.PushPin />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\">\n <Icons.FileCopy />\n </IconButton>\n <IconButton colorPalette=\"critical\" variant=\"ghost\">\n <Icons.Delete />\n </IconButton>\n </Stack>\n);\n```\n\n#### Delete\n\nSingle icon button, this is a common used control, used to delete the entire\naccordion and content.\n\n```jsx live\nconst App = () => (\n <IconButton colorPalette=\"critical\" variant=\"ghost\">\n <Icons.Delete />\n </IconButton>\n);\n```\n\n#### Switch\n\nThe use of switch often signals the effect of the settings being applied, or\nactivating the content within to be edited by the user.\n\n```jsx live\nconst App = () => <Switch size=\"md\">Inactive</Switch>;\n```\n\n#### Select input\n\nAllowing the users to select from a list. This control often controls the type\nof form that will be shown for user completion.\n\n```jsx live\nconst App = () => (\n <Select.Root\n aria-label=\"Select an option\"\n data-testid=\"select\"\n selectedKey=\"1\"\n >\n <Select.Options>\n <Select.Option id=\"1\">Input value</Select.Option>\n </Select.Options>\n </Select.Root>\n);\n```\n\n#### Custom controls\n\nIf these more typical controls do not suit the needs of your feature, create\ncontrols that best suit your needs.\n\n### Usage\n\nAccordions are a versatile component that can effectively manage and present\ninformation in a concise and organized way, improving usability and saving\nscreen space.\n\n> [!TIP]\\\n> When to use\n\n- **Lengthy content:** Use an accordion when you have a significant amount of\n content to display.\n- **Logically grouped content:** Use an accordion when the content can be\n logically grouped under headings.\n- **Limited vertical space:** Use an accordion when vertical space is limited.\n- **Non-essential information:** Use an accordion when users don't need to see\n all the information at once.\n- **Simplifying complex forms/settings:** Use an accordion when you want to\n simplify complex forms or settings.\n\n> [!CAUTION]\\\n> When not to use\n\n- **Brief content:** Do not use an accordion when content is brief and easily\n fits on the screen. Hiding small amounts of information behind clicks is\n unnecessary.\n- **Deeply nested content:** Do not use an accordion if the content is deeply\n nested. Multiple layers of accordions can become confusing and difficult to\n navigate.\n- **Outgrowing component:** Do not use an accordion when controls and content\n are outgrowing the component. If the content becomes too complex, consider an\n alternative UI component.\n\n### Accordion nesting\n\nAvoid nesting accordions because they hide information and make it hard for\nusers to predict the content of deeper nested components. Instead, create\nsimple, well-organized pages that use accordions to hold information in\nmeaningful ways for the user.\n\n> [!TIP]\\\n> **Do**\n>\n> - Do organize the right information within accordions, if all closed, users\n> should be able to navigate information easily.\n\n```jsx live\nconst App = () => (\n <Accordion.Root size=\"sm\">\n <Accordion.Item>\n <Accordion.Header>General information</Accordion.Header>\n <Accordion.Content>\n <Stack gap=\"400\">\n <FormField.Root>\n <FormField.Label>Product name</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"Cozy coffee mug\" w=\"100%\" />\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Product description</FormField.Label>\n <FormField.Input>\n <TextInput\n size=\"sm\"\n value=\"A 15oz hand-thrown mug made by artisans.\"\n w=\"100%\"\n />\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Product key</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"Cozy-coffee-mug\" w=\"100%\" />\n </FormField.Input>\n </FormField.Root>\n </Stack>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Do not nest accordions excessively.\n> - Do not use accordion controls when nested to reduce complexity.\n\n```jsx live\nconst App = () => (\n <Accordion.Root size=\"sm\">\n <Accordion.Item>\n <Accordion.Header>\n Product Details\n <Accordion.HeaderRightContent>\n <Stack direction=\"horizontal\" alignItems=\"center\">\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.Edit />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.PushPin />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.FileCopy />\n </IconButton>\n <IconButton colorPalette=\"critical\" variant=\"ghost\" size=\"sm\">\n <Icons.Delete />\n </IconButton>\n </Stack>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Accordion.Root size=\"sm\">\n <Accordion.Item>\n <Accordion.Header>\n Variants\n <Accordion.HeaderRightContent>\n <Switch size=\"sm\">Inactive</Switch>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Accordion.Root size=\"sm\">\n <Accordion.Item>\n <Accordion.Header>\n Attributes\n <Accordion.HeaderRightContent>\n <IconButton\n colorPalette=\"critical\"\n variant=\"ghost\"\n size=\"sm\"\n >\n <Icons.Delete />\n </IconButton>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n An accordion in an accordion... Inception.\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n\n### Accordion controls\n\nMake it easy for users to understand what the attached controls do, and how to\ninteract with them when needed.\n\n> [!TIP]\\\n> **Do**\n>\n> - Use tools that the user expects to use in the area to complete their tasks.\n> There should be no confusion on what the tools are for and what their\n> effects should be.\n> - Include tooltips to describe icon buttons when used.\n\n```jsx live\nconst App = () => (\n <Accordion.Root size=\"sm\">\n <Accordion.Item>\n <Accordion.Header>\n General information\n <Accordion.HeaderRightContent>\n <Stack direction=\"horizontal\" alignItems=\"center\">\n <Tooltip.Root>\n <Button colorPalette=\"primary\" size=\"xs\" variant=\"outline\">\n Cancel\n </Button>\n <Tooltip.Content>Cancel information changes</Tooltip.Content>\n </Tooltip.Root>\n <Tooltip.Root>\n <Button colorPalette=\"primary\" size=\"xs\" variant=\"solid\">\n Save\n </Button>\n <Tooltip.Content>\n Save general information changes\n </Tooltip.Content>\n </Tooltip.Root>\n </Stack>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Stack gap=\"400\">\n <FormField.Root>\n <FormField.Label>Product name</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"Cozy coffee mug\" w=\"100%\" />\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Product description</FormField.Label>\n <FormField.Input>\n <TextInput\n size=\"sm\"\n value=\"A 15oz hand-thrown mug made by artisans.\"\n w=\"100%\"\n />\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Product key</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"Cozy-coffee-mug\" w=\"100%\" />\n </FormField.Input>\n </FormField.Root>\n </Stack>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Do not add controls that have seemingly no reason to be there for the\n> majority of the users. If certain controls require permissions, consider\n> hiding them from certain users to simplify workspaces.\n\n```jsx live\nconst App = () => (\n <Accordion.Root size=\"sm\">\n <Accordion.Item>\n <Accordion.Header>\n General information\n <Accordion.HeaderRightContent>\n <Stack direction=\"horizontal\" alignItems=\"center\">\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.Edit />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.PushPin />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.FileCopy />\n </IconButton>\n <IconButton colorPalette=\"critical\" variant=\"ghost\" size=\"sm\">\n <Icons.Delete />\n </IconButton>\n </Stack>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Stack gap=\"400\">\n <FormField.Root>\n <FormField.Label>Product name</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"Cozy coffee mug\" w=\"100%\" />\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Product description</FormField.Label>\n <FormField.Input>\n <TextInput\n size=\"sm\"\n value=\"A 15oz hand-thrown mug made by artisans.\"\n w=\"100%\"\n />\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Product key</FormField.Label>\n <FormField.Input>\n <TextInput size=\"sm\" value=\"Cozy-coffee-mug\" w=\"100%\" />\n </FormField.Input>\n </FormField.Root>\n </Stack>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n\n### Content\n\nWhether content is custom or using typical forms, think of basic hierarchy to\nkeep content usable and easy to understand.\n\n> [!TIP]\\\n> **Do**\n>\n> - Use left alignment and consistent styling for any content within accordions.\n> - Combine like topics and content together well to help the user understand\n> what is expected within each accordion.\n\n```jsx live\nconst App = () => (\n <Accordion.Root size=\"sm\" w=\"3/4\">\n <Accordion.Item>\n <Accordion.Header>Review the B2C sample data feature</Accordion.Header>\n <Accordion.Content>\n <Stack gap=\"400\">\n <Image\n src=\"/images/accordion/sample-data.png\"\n alt=\"B2C sample data\"\n width=\"100%\"\n />\n <Text fontWeight=\"700\">Sample data imported</Text>\n <Text>\n Great to have you here! We’ve imported sample data, including\n currency, tax information, shipping methods, products, and\n customers.\n </Text>\n <Button colorPalette=\"primary\" size=\"sm\" variant=\"solid\" w=\"1/2\">\n <Icons.RemoveRedEye />\n Let's get started\n </Button>\n </Stack>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Do not use anything other than left alignment of text and forms when\n> possible.\n> - Do not overstuff accordions with unrelated information or odds and ends.\n> Accordions are not junk drawers.\n> - Do not use controls that are undefined and confusing to use.\n\n```jsx live\nconst App = () => (\n <Accordion.Root size=\"sm\" w=\"3/4\">\n <Accordion.Item>\n <Accordion.Header>\n Internal managed inventory\n <Accordion.HeaderRightContent>\n <Stack direction=\"vertical\" alignItems=\"center\">\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.ReceiptLong />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.Bedtime />\n </IconButton>\n <IconButton colorPalette=\"primary\" variant=\"ghost\" size=\"sm\">\n <Icons.Sell />\n </IconButton>\n <IconButton colorPalette=\"critical\" variant=\"ghost\" size=\"sm\">\n <Icons.Delete />\n </IconButton>\n </Stack>\n </Accordion.HeaderRightContent>\n </Accordion.Header>\n <Accordion.Content>\n <Stack gap=\"400\">\n <Badge colorPalette=\"positive\" w=\"1/2\">\n <Icons.Check /> Updated and published\n </Badge>\n <Tabs.Root size=\"md\">\n <Tabs.List>\n <Tabs.Tab id=\"packaging\">Packaging</Tabs.Tab>\n <Tabs.Tab id=\"moodboards\">Moodboards</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panels pt=\"400\">\n <Tabs.Panel id=\"packaging\">\n <Stack gap=\"400\" alignItems=\"center\">\n <FormField.Root>\n <FormField.Label>How did it get here?</FormField.Label>\n <FormField.Input>\n <RadioInput.Root\n orientation=\"vertical\"\n name=\"default-example\"\n >\n <RadioInput.Option value=\"option1\">\n Fedex Ground\n </RadioInput.Option>\n <RadioInput.Option value=\"option2\">\n Lime green\n </RadioInput.Option>\n <RadioInput.Option value=\"option3\">\n USPS Premium\n </RadioInput.Option>\n <RadioInput.Option value=\"option4\">\n Yellow\n </RadioInput.Option>\n <RadioInput.Option value=\"option5\">\n UPS Ground\n </RadioInput.Option>\n <RadioInput.Option value=\"option6\">\n Fedex Domestic\n </RadioInput.Option>\n <RadioInput.Option value=\"option7\">\n Carrier pigeon\n </RadioInput.Option>\n <RadioInput.Option value=\"option8\">\n Pick up from business\n </RadioInput.Option>\n </RadioInput.Root>\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Packaging</FormField.Label>\n <FormField.Input>\n <TextInput\n size=\"sm\"\n value=\"Blurple with yellow stars\"\n w=\"100%\"\n />\n </FormField.Input>\n <FormField.Description>\n What is the color of the tissue paper used?\n </FormField.Description>\n </FormField.Root>\n </Stack>\n </Tabs.Panel>\n <Tabs.Panel id=\"moodboards\">\n <Stack gap=\"300\" alignItems=\"start\">\n <Stack direction=\"horizontal\" gap=\"200\" wrap=\"wrap\">\n <Button size=\"xs\" colorPalette=\"neutral\" variant=\"outline\">\n Ocean vibes\n </Button>\n <Button size=\"xs\" colorPalette=\"primary\" variant=\"solid\">\n Upload\n </Button>\n <Button size=\"xs\" colorPalette=\"neutral\" variant=\"ghost\">\n #FF5733\n </Button>\n <TextInput size=\"sm\" placeholder=\"Search inspiration...\" />\n <IconButton size=\"xs\" variant=\"ghost\">\n <Icons.Star />\n </IconButton>\n </Stack>\n <Text fontSize=\"xs\" color=\"neutral.600\">\n Last updated: Never\n </Text>\n <Stack direction=\"horizontal\" gap=\"200\" wrap=\"wrap\">\n <Badge colorPalette=\"primary\">Vintage</Badge>\n <Badge colorPalette=\"neutral\">Modern</Badge>\n <Badge colorPalette=\"critical\">Urgent</Badge>\n <Badge colorPalette=\"positive\">Approved</Badge>\n </Stack>\n <FormField.Root>\n <FormField.Input>\n <RadioInput.Root orientation=\"horizontal\">\n <RadioInput.Option value=\"grid\">\n Grid view\n </RadioInput.Option>\n <RadioInput.Option value=\"list\">\n Slide deck\n </RadioInput.Option>\n </RadioInput.Root>\n </FormField.Input>\n </FormField.Root>\n </Stack>\n </Tabs.Panel>\n </Tabs.Panels>\n </Tabs.Root>\n </Stack>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n);\n```\n",
|
|
479
|
+
"toc": [
|
|
480
|
+
{
|
|
481
|
+
"value": "Guidelines",
|
|
482
|
+
"href": "#guidelines",
|
|
483
|
+
"depth": 2,
|
|
484
|
+
"numbering": [
|
|
485
|
+
1,
|
|
486
|
+
1
|
|
487
|
+
],
|
|
488
|
+
"parent": "root"
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
"value": "Best practices",
|
|
492
|
+
"href": "#best-practices",
|
|
493
|
+
"depth": 3,
|
|
494
|
+
"numbering": [
|
|
495
|
+
1,
|
|
496
|
+
1,
|
|
497
|
+
1
|
|
498
|
+
],
|
|
499
|
+
"parent": "root"
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
"value": "Common accordion controls",
|
|
503
|
+
"href": "#common-accordion-controls",
|
|
504
|
+
"depth": 3,
|
|
505
|
+
"numbering": [
|
|
506
|
+
1,
|
|
507
|
+
1,
|
|
508
|
+
2
|
|
509
|
+
],
|
|
510
|
+
"parent": "root"
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
"value": "Revert and save",
|
|
514
|
+
"href": "#revert-and-save",
|
|
515
|
+
"depth": 4,
|
|
516
|
+
"numbering": [
|
|
517
|
+
1,
|
|
518
|
+
1,
|
|
519
|
+
2,
|
|
520
|
+
1
|
|
521
|
+
],
|
|
522
|
+
"parent": "root"
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
"value": "Cancel and save",
|
|
526
|
+
"href": "#cancel-and-save",
|
|
527
|
+
"depth": 4,
|
|
528
|
+
"numbering": [
|
|
529
|
+
1,
|
|
530
|
+
1,
|
|
531
|
+
2,
|
|
532
|
+
2
|
|
533
|
+
],
|
|
534
|
+
"parent": "root"
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
"value": "Four icon buttons",
|
|
538
|
+
"href": "#four-icon-buttons",
|
|
539
|
+
"depth": 4,
|
|
540
|
+
"numbering": [
|
|
541
|
+
1,
|
|
542
|
+
1,
|
|
543
|
+
2,
|
|
544
|
+
3
|
|
545
|
+
],
|
|
546
|
+
"parent": "root"
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
"value": "Delete",
|
|
550
|
+
"href": "#delete",
|
|
551
|
+
"depth": 4,
|
|
552
|
+
"numbering": [
|
|
553
|
+
1,
|
|
554
|
+
1,
|
|
555
|
+
2,
|
|
556
|
+
4
|
|
557
|
+
],
|
|
558
|
+
"parent": "root"
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
"value": "Switch",
|
|
562
|
+
"href": "#switch",
|
|
563
|
+
"depth": 4,
|
|
564
|
+
"numbering": [
|
|
565
|
+
1,
|
|
566
|
+
1,
|
|
567
|
+
2,
|
|
568
|
+
5
|
|
569
|
+
],
|
|
570
|
+
"parent": "root"
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
"value": "Select input",
|
|
574
|
+
"href": "#select-input",
|
|
575
|
+
"depth": 4,
|
|
576
|
+
"numbering": [
|
|
577
|
+
1,
|
|
578
|
+
1,
|
|
579
|
+
2,
|
|
580
|
+
6
|
|
581
|
+
],
|
|
582
|
+
"parent": "root"
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
"value": "Custom controls",
|
|
586
|
+
"href": "#custom-controls",
|
|
587
|
+
"depth": 4,
|
|
588
|
+
"numbering": [
|
|
589
|
+
1,
|
|
590
|
+
1,
|
|
591
|
+
2,
|
|
592
|
+
7
|
|
593
|
+
],
|
|
594
|
+
"parent": "root"
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"value": "Usage",
|
|
598
|
+
"href": "#usage",
|
|
599
|
+
"depth": 3,
|
|
600
|
+
"numbering": [
|
|
601
|
+
1,
|
|
602
|
+
1,
|
|
603
|
+
3
|
|
604
|
+
],
|
|
605
|
+
"parent": "root"
|
|
606
|
+
},
|
|
607
|
+
{
|
|
608
|
+
"value": "Accordion nesting",
|
|
609
|
+
"href": "#accordion-nesting",
|
|
610
|
+
"depth": 3,
|
|
611
|
+
"numbering": [
|
|
612
|
+
1,
|
|
613
|
+
1,
|
|
614
|
+
4
|
|
615
|
+
],
|
|
616
|
+
"parent": "root"
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
"value": "Accordion controls",
|
|
620
|
+
"href": "#accordion-controls",
|
|
621
|
+
"depth": 3,
|
|
622
|
+
"numbering": [
|
|
623
|
+
1,
|
|
624
|
+
1,
|
|
625
|
+
5
|
|
626
|
+
],
|
|
627
|
+
"parent": "root"
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
"value": "Content",
|
|
631
|
+
"href": "#content",
|
|
632
|
+
"depth": 3,
|
|
633
|
+
"numbering": [
|
|
634
|
+
1,
|
|
635
|
+
1,
|
|
636
|
+
6
|
|
637
|
+
],
|
|
638
|
+
"parent": "root"
|
|
639
|
+
}
|
|
640
|
+
]
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|