@12-apps/ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components-catalog.md +806 -0
- package/components-guidelines.md +347 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/eslint.config.js +77 -0
- package/package.json +247 -0
- package/src/__tests__/package-wiring.test.ts +37 -0
- package/src/__tests__/setup.ts +1 -0
- package/src/__tests__/social-login-button.test.tsx +186 -0
- package/src/__tests__/user-avatar.test.tsx +195 -0
- package/src/button.tsx +22 -0
- package/src/components/command/__tests__/command.test.tsx +112 -0
- package/src/components/data-display/Alert/Alert.md +209 -0
- package/src/components/data-display/Alert/Alert.stories.tsx +561 -0
- package/src/components/data-display/Alert/Alert.test.stories.tsx +709 -0
- package/src/components/data-display/Alert/Alert.tsx +449 -0
- package/src/components/data-display/Alert/Alert.types.ts +79 -0
- package/src/components/data-display/Alert/index.ts +2 -0
- package/src/components/data-display/AlertDialog/AlertDialog.md +408 -0
- package/src/components/data-display/AlertDialog/AlertDialog.stories.tsx +360 -0
- package/src/components/data-display/AlertDialog/AlertDialog.test.stories.tsx +753 -0
- package/src/components/data-display/AlertDialog/AlertDialog.tsx +273 -0
- package/src/components/data-display/AlertDialog/AlertDialog.types.ts +74 -0
- package/src/components/data-display/AlertDialog/index.ts +2 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.stories.tsx +230 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.test.stories.tsx +270 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.tsx +116 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.types.ts +70 -0
- package/src/components/data-display/AsyncStateContainer/index.ts +2 -0
- package/src/components/data-display/Avatar/Avatar.md +568 -0
- package/src/components/data-display/Avatar/Avatar.stories.tsx +718 -0
- package/src/components/data-display/Avatar/Avatar.test.stories.tsx +820 -0
- package/src/components/data-display/Avatar/Avatar.tsx +507 -0
- package/src/components/data-display/Avatar/Avatar.types.ts +88 -0
- package/src/components/data-display/Avatar/index.ts +2 -0
- package/src/components/data-display/Badge/Badge.md +469 -0
- package/src/components/data-display/Badge/Badge.stories.tsx +1136 -0
- package/src/components/data-display/Badge/Badge.test.stories.tsx +1193 -0
- package/src/components/data-display/Badge/Badge.tsx +606 -0
- package/src/components/data-display/Badge/Badge.types.ts +118 -0
- package/src/components/data-display/Badge/index.ts +2 -0
- package/src/components/data-display/Banner/Banner.stories.tsx +524 -0
- package/src/components/data-display/Banner/Banner.test.stories.tsx +503 -0
- package/src/components/data-display/Banner/Banner.tsx +350 -0
- package/src/components/data-display/Banner/Banner.types.ts +41 -0
- package/src/components/data-display/Banner/banner.md +141 -0
- package/src/components/data-display/Banner/index.ts +2 -0
- package/src/components/data-display/Carousel/Carousel.md +815 -0
- package/src/components/data-display/Carousel/Carousel.stories.tsx +607 -0
- package/src/components/data-display/Carousel/Carousel.test.stories.tsx +691 -0
- package/src/components/data-display/Carousel/Carousel.tsx +765 -0
- package/src/components/data-display/Carousel/Carousel.types.ts +79 -0
- package/src/components/data-display/Carousel/index.ts +8 -0
- package/src/components/data-display/Chart/Chart.md +352 -0
- package/src/components/data-display/Chart/Chart.stories.tsx +568 -0
- package/src/components/data-display/Chart/Chart.test.stories.tsx +174 -0
- package/src/components/data-display/Chart/Chart.tsx +520 -0
- package/src/components/data-display/Chart/Chart.types.ts +65 -0
- package/src/components/data-display/Chart/index.ts +2 -0
- package/src/components/data-display/Chip/Chip.stories.tsx +251 -0
- package/src/components/data-display/Chip/Chip.test.stories.tsx +263 -0
- package/src/components/data-display/Chip/Chip.tsx +134 -0
- package/src/components/data-display/Chip/Chip.types.ts +51 -0
- package/src/components/data-display/Chip/chip.md +395 -0
- package/src/components/data-display/Chip/index.ts +2 -0
- package/src/components/data-display/DataGrid/DataGrid.md +602 -0
- package/src/components/data-display/DataGrid/DataGrid.stories.tsx +515 -0
- package/src/components/data-display/DataGrid/DataGrid.test.stories.tsx +659 -0
- package/src/components/data-display/DataGrid/DataGrid.tsx +743 -0
- package/src/components/data-display/DataGrid/DataGrid.types.ts +171 -0
- package/src/components/data-display/DataGrid/index.ts +21 -0
- package/src/components/data-display/DateTimeDisplay/DateTimeDisplay.tsx +197 -0
- package/src/components/data-display/DateTimeDisplay/DateTimeDisplay.types.ts +46 -0
- package/src/components/data-display/DateTimeDisplay/index.ts +2 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.md +226 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.stories.tsx +254 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.tsx +100 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.types.ts +1 -0
- package/src/components/data-display/DescriptionItem/index.ts +2 -0
- package/src/components/data-display/EmptyState/EmptyState.md +265 -0
- package/src/components/data-display/EmptyState/EmptyState.stories.tsx +282 -0
- package/src/components/data-display/EmptyState/EmptyState.test.stories.tsx +441 -0
- package/src/components/data-display/EmptyState/EmptyState.tsx +180 -0
- package/src/components/data-display/EmptyState/EmptyState.types.ts +31 -0
- package/src/components/data-display/EmptyState/index.ts +2 -0
- package/src/components/data-display/ErrorState/ErrorState.stories.tsx +110 -0
- package/src/components/data-display/ErrorState/ErrorState.test.stories.tsx +133 -0
- package/src/components/data-display/ErrorState/ErrorState.tsx +118 -0
- package/src/components/data-display/ErrorState/ErrorState.types.ts +45 -0
- package/src/components/data-display/ErrorState/index.ts +2 -0
- package/src/components/data-display/HoverCard/HoverCard.md +389 -0
- package/src/components/data-display/HoverCard/HoverCard.stories.tsx +648 -0
- package/src/components/data-display/HoverCard/HoverCard.test.stories.tsx +929 -0
- package/src/components/data-display/HoverCard/HoverCard.tsx +657 -0
- package/src/components/data-display/HoverCard/HoverCard.types.ts +116 -0
- package/src/components/data-display/HoverCard/index.ts +2 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.md +532 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.stories.tsx +411 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.tsx +245 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.types.ts +64 -0
- package/src/components/data-display/InteractiveTooltip/index.ts +2 -0
- package/src/components/data-display/LazyImage/LazyImage.md +356 -0
- package/src/components/data-display/LazyImage/LazyImage.stories.tsx +387 -0
- package/src/components/data-display/LazyImage/LazyImage.tsx +323 -0
- package/src/components/data-display/LazyImage/LazyImage.types.ts +205 -0
- package/src/components/data-display/LazyImage/index.ts +2 -0
- package/src/components/data-display/Lightbox/Lightbox.stories.tsx +315 -0
- package/src/components/data-display/Lightbox/Lightbox.test.stories.tsx +605 -0
- package/src/components/data-display/Lightbox/Lightbox.tsx +666 -0
- package/src/components/data-display/Lightbox/Lightbox.types.ts +49 -0
- package/src/components/data-display/Lightbox/index.ts +2 -0
- package/src/components/data-display/Lightbox/lightbox.md +298 -0
- package/src/components/data-display/LoadingState/LoadingState.stories.tsx +124 -0
- package/src/components/data-display/LoadingState/LoadingState.test.stories.tsx +99 -0
- package/src/components/data-display/LoadingState/LoadingState.tsx +103 -0
- package/src/components/data-display/LoadingState/LoadingState.types.ts +37 -0
- package/src/components/data-display/LoadingState/index.ts +2 -0
- package/src/components/data-display/MapPreview/MapPreview.md +154 -0
- package/src/components/data-display/MapPreview/MapPreview.stories.tsx +458 -0
- package/src/components/data-display/MapPreview/MapPreview.test.stories.tsx +390 -0
- package/src/components/data-display/MapPreview/MapPreview.tsx +922 -0
- package/src/components/data-display/MapPreview/MapPreview.types.ts +56 -0
- package/src/components/data-display/MapPreview/index.ts +2 -0
- package/src/components/data-display/Popover/Popover.md +245 -0
- package/src/components/data-display/Popover/Popover.stories.tsx +295 -0
- package/src/components/data-display/Popover/Popover.test.stories.tsx +1168 -0
- package/src/components/data-display/Popover/Popover.tsx +132 -0
- package/src/components/data-display/Popover/Popover.types.ts +33 -0
- package/src/components/data-display/Popover/index.ts +2 -0
- package/src/components/data-display/Progress/Progress.md +450 -0
- package/src/components/data-display/Progress/Progress.stories.tsx +481 -0
- package/src/components/data-display/Progress/Progress.test.stories.tsx +2070 -0
- package/src/components/data-display/Progress/Progress.tsx +332 -0
- package/src/components/data-display/Progress/Progress.types.ts +61 -0
- package/src/components/data-display/Progress/index.ts +2 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.md +108 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.stories.tsx +160 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.test.stories.tsx +190 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.tsx +224 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.types.ts +101 -0
- package/src/components/data-display/SectionOnboarding/index.ts +7 -0
- package/src/components/data-display/Sheet/Sheet.md +475 -0
- package/src/components/data-display/Sheet/Sheet.stories.tsx +883 -0
- package/src/components/data-display/Sheet/Sheet.test.stories.tsx +1101 -0
- package/src/components/data-display/Sheet/Sheet.tsx +978 -0
- package/src/components/data-display/Sheet/Sheet.types.ts +93 -0
- package/src/components/data-display/Sheet/index.ts +8 -0
- package/src/components/data-display/Stepper/Stepper.md +542 -0
- package/src/components/data-display/Stepper/Stepper.stories.tsx +540 -0
- package/src/components/data-display/Stepper/Stepper.test.stories.tsx +607 -0
- package/src/components/data-display/Stepper/Stepper.tsx +328 -0
- package/src/components/data-display/Stepper/Stepper.types.ts +97 -0
- package/src/components/data-display/Stepper/index.ts +2 -0
- package/src/components/data-display/Table/Table.md +243 -0
- package/src/components/data-display/Table/Table.stories.tsx +801 -0
- package/src/components/data-display/Table/Table.test.stories.tsx +369 -0
- package/src/components/data-display/Table/Table.tsx +831 -0
- package/src/components/data-display/Table/Table.types.ts +335 -0
- package/src/components/data-display/Table/index.ts +2 -0
- package/src/components/data-display/Timeline/Timeline.md +201 -0
- package/src/components/data-display/Timeline/Timeline.stories.tsx +444 -0
- package/src/components/data-display/Timeline/Timeline.test.stories.tsx +944 -0
- package/src/components/data-display/Timeline/Timeline.tsx +348 -0
- package/src/components/data-display/Timeline/Timeline.types.ts +26 -0
- package/src/components/data-display/Timeline/index.ts +2 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.md +162 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.stories.tsx +475 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.test.stories.tsx +734 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.tsx +399 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.types.ts +19 -0
- package/src/components/data-display/TimingDiagram/index.ts +2 -0
- package/src/components/data-display/Tooltip/Tooltip.md +397 -0
- package/src/components/data-display/Tooltip/Tooltip.stories.tsx +465 -0
- package/src/components/data-display/Tooltip/Tooltip.test.stories.tsx +1168 -0
- package/src/components/data-display/Tooltip/Tooltip.tsx +161 -0
- package/src/components/data-display/Tooltip/Tooltip.types.ts +33 -0
- package/src/components/data-display/Tooltip/index.ts +2 -0
- package/src/components/data-display/index.ts +29 -0
- package/src/components/feedback/Dialog/Dialog.md +527 -0
- package/src/components/feedback/Dialog/Dialog.stories.tsx +833 -0
- package/src/components/feedback/Dialog/Dialog.styles.ts +171 -0
- package/src/components/feedback/Dialog/Dialog.test.stories.tsx +955 -0
- package/src/components/feedback/Dialog/Dialog.tsx +256 -0
- package/src/components/feedback/Dialog/Dialog.types.ts +46 -0
- package/src/components/feedback/Dialog/index.ts +9 -0
- package/src/components/feedback/Modal/Modal.md +629 -0
- package/src/components/feedback/Modal/Modal.stories.tsx +765 -0
- package/src/components/feedback/Modal/Modal.test.stories.tsx +251 -0
- package/src/components/feedback/Modal/Modal.tsx +279 -0
- package/src/components/feedback/Modal/Modal.types.ts +26 -0
- package/src/components/feedback/Modal/index.ts +7 -0
- package/src/components/feedback/Sonner/Sonner.stories.tsx +698 -0
- package/src/components/feedback/Sonner/Sonner.test.stories.tsx +896 -0
- package/src/components/feedback/Sonner/Sonner.tsx +493 -0
- package/src/components/feedback/Sonner/Sonner.types.ts +65 -0
- package/src/components/feedback/Sonner/index.ts +8 -0
- package/src/components/feedback/StackedModal/StackedModal.md +273 -0
- package/src/components/feedback/StackedModal/StackedModal.stories.tsx +1785 -0
- package/src/components/feedback/StackedModal/StackedModal.test.stories.tsx +975 -0
- package/src/components/feedback/StackedModal/StackedModal.tsx +664 -0
- package/src/components/feedback/StackedModal/StackedModal.types.ts +70 -0
- package/src/components/feedback/StackedModal/index.ts +11 -0
- package/src/components/feedback/Toast/Toast.md +547 -0
- package/src/components/feedback/Toast/Toast.stories.tsx +548 -0
- package/src/components/feedback/Toast/Toast.test.stories.tsx +834 -0
- package/src/components/feedback/Toast/Toast.tsx +279 -0
- package/src/components/feedback/Toast/Toast.types.ts +59 -0
- package/src/components/feedback/Toast/index.ts +8 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.md +610 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.stories.tsx +691 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.test.stories.tsx +634 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.tsx +554 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.types.ts +30 -0
- package/src/components/feedback/TutorialOverlay/index.ts +2 -0
- package/src/components/feedback/index.ts +6 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.md +633 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.stories.tsx +663 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.test.stories.tsx +723 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.tsx +836 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.types.ts +37 -0
- package/src/components/form/AddressAutocomplete/index.ts +2 -0
- package/src/components/form/Autocomplete/Autocomplete.helpers.ts +115 -0
- package/src/components/form/Autocomplete/Autocomplete.keys.ts +134 -0
- package/src/components/form/Autocomplete/Autocomplete.parts.tsx +337 -0
- package/src/components/form/Autocomplete/Autocomplete.stories.tsx +715 -0
- package/src/components/form/Autocomplete/Autocomplete.test.stories.tsx +825 -0
- package/src/components/form/Autocomplete/Autocomplete.tsx +166 -0
- package/src/components/form/Autocomplete/Autocomplete.types.ts +116 -0
- package/src/components/form/Autocomplete/autocomplete.md +789 -0
- package/src/components/form/Autocomplete/index.ts +8 -0
- package/src/components/form/Autocomplete/useAutocomplete.ts +311 -0
- package/src/components/form/Button/Button.md +411 -0
- package/src/components/form/Button/Button.stories.tsx +362 -0
- package/src/components/form/Button/Button.test.stories.tsx +603 -0
- package/src/components/form/Button/Button.tsx +326 -0
- package/src/components/form/Button/Button.types.ts +74 -0
- package/src/components/form/Button/index.ts +2 -0
- package/src/components/form/Calendar/Calendar.md +807 -0
- package/src/components/form/Calendar/Calendar.stories.tsx +349 -0
- package/src/components/form/Calendar/Calendar.test.stories.tsx +465 -0
- package/src/components/form/Calendar/Calendar.tsx +571 -0
- package/src/components/form/Calendar/Calendar.types.ts +81 -0
- package/src/components/form/Calendar/index.ts +11 -0
- package/src/components/form/Checkbox/Checkbox.md +200 -0
- package/src/components/form/Checkbox/Checkbox.stories.tsx +265 -0
- package/src/components/form/Checkbox/Checkbox.test.stories.tsx +181 -0
- package/src/components/form/Checkbox/Checkbox.tsx +170 -0
- package/src/components/form/Checkbox/Checkbox.types.ts +20 -0
- package/src/components/form/Checkbox/index.ts +2 -0
- package/src/components/form/CodeEditor/CodeEditor.md +350 -0
- package/src/components/form/CodeEditor/CodeEditor.stories.tsx +871 -0
- package/src/components/form/CodeEditor/CodeEditor.test.stories.tsx +575 -0
- package/src/components/form/CodeEditor/CodeEditor.tsx +415 -0
- package/src/components/form/CodeEditor/CodeEditor.types.ts +38 -0
- package/src/components/form/CodeEditor/index.ts +2 -0
- package/src/components/form/Command/Command.md +468 -0
- package/src/components/form/Command/Command.stories.tsx +580 -0
- package/src/components/form/Command/Command.test.stories.tsx +215 -0
- package/src/components/form/Command/Command.tsx +545 -0
- package/src/components/form/Command/Command.types.ts +116 -0
- package/src/components/form/Command/index.ts +12 -0
- package/src/components/form/CreatableSelect/CreatableSelect.md +114 -0
- package/src/components/form/CreatableSelect/CreatableSelect.stories.tsx +112 -0
- package/src/components/form/CreatableSelect/CreatableSelect.test.stories.tsx +134 -0
- package/src/components/form/CreatableSelect/CreatableSelect.tsx +149 -0
- package/src/components/form/CreatableSelect/CreatableSelect.types.ts +37 -0
- package/src/components/form/CreatableSelect/index.ts +2 -0
- package/src/components/form/Form/Form.md +325 -0
- package/src/components/form/Form/Form.stories.tsx +687 -0
- package/src/components/form/Form/Form.test.stories.tsx +601 -0
- package/src/components/form/Form/Form.tsx +136 -0
- package/src/components/form/Form/Form.types.ts +42 -0
- package/src/components/form/Form/index.ts +8 -0
- package/src/components/form/Input/Input.md +252 -0
- package/src/components/form/Input/Input.stories.tsx +256 -0
- package/src/components/form/Input/Input.test.stories.tsx +1184 -0
- package/src/components/form/Input/Input.tsx +263 -0
- package/src/components/form/Input/Input.types.ts +24 -0
- package/src/components/form/Input/index.ts +2 -0
- package/src/components/form/InputOTP/InputOTP.md +419 -0
- package/src/components/form/InputOTP/InputOTP.stories.tsx +774 -0
- package/src/components/form/InputOTP/InputOTP.test.stories.tsx +596 -0
- package/src/components/form/InputOTP/InputOTP.tsx +231 -0
- package/src/components/form/InputOTP/InputOTP.types.ts +68 -0
- package/src/components/form/InputOTP/index.ts +2 -0
- package/src/components/form/Label/Label.md +426 -0
- package/src/components/form/Label/Label.stories.tsx +473 -0
- package/src/components/form/Label/Label.test.stories.tsx +909 -0
- package/src/components/form/Label/Label.tsx +367 -0
- package/src/components/form/Label/Label.types.ts +35 -0
- package/src/components/form/Label/index.ts +2 -0
- package/src/components/form/Menubar/Menubar.md +275 -0
- package/src/components/form/Menubar/Menubar.stories.tsx +472 -0
- package/src/components/form/Menubar/Menubar.test.stories.tsx +588 -0
- package/src/components/form/Menubar/Menubar.tsx +467 -0
- package/src/components/form/Menubar/Menubar.types.ts +71 -0
- package/src/components/form/Menubar/index.ts +8 -0
- package/src/components/form/PasswordStrength/PasswordStrength.md +139 -0
- package/src/components/form/PasswordStrength/PasswordStrength.stories.tsx +562 -0
- package/src/components/form/PasswordStrength/PasswordStrength.test.stories.tsx +327 -0
- package/src/components/form/PasswordStrength/PasswordStrength.tsx +419 -0
- package/src/components/form/PasswordStrength/PasswordStrength.types.ts +18 -0
- package/src/components/form/PasswordStrength/index.ts +2 -0
- package/src/components/form/PhoneInput/PhoneInput.md +578 -0
- package/src/components/form/PhoneInput/PhoneInput.stories.tsx +495 -0
- package/src/components/form/PhoneInput/PhoneInput.test.stories.tsx +666 -0
- package/src/components/form/PhoneInput/PhoneInput.tsx +376 -0
- package/src/components/form/PhoneInput/PhoneInput.types.ts +25 -0
- package/src/components/form/PhoneInput/index.ts +2 -0
- package/src/components/form/RadioGroup/RadioGroup.md +477 -0
- package/src/components/form/RadioGroup/RadioGroup.stories.tsx +518 -0
- package/src/components/form/RadioGroup/RadioGroup.test.stories.tsx +685 -0
- package/src/components/form/RadioGroup/RadioGroup.tsx +664 -0
- package/src/components/form/RadioGroup/RadioGroup.types.ts +82 -0
- package/src/components/form/RadioGroup/index.ts +2 -0
- package/src/components/form/RichTextEditor/RichTextEditor.md +710 -0
- package/src/components/form/RichTextEditor/RichTextEditor.stories.tsx +261 -0
- package/src/components/form/RichTextEditor/RichTextEditor.test.stories.tsx +498 -0
- package/src/components/form/RichTextEditor/RichTextEditor.tsx +468 -0
- package/src/components/form/RichTextEditor/RichTextEditor.types.ts +72 -0
- package/src/components/form/RichTextEditor/index.ts +2 -0
- package/src/components/form/SearchPalette/SearchPalette.md +69 -0
- package/src/components/form/SearchPalette/SearchPalette.parts.tsx +358 -0
- package/src/components/form/SearchPalette/SearchPalette.stories.tsx +135 -0
- package/src/components/form/SearchPalette/SearchPalette.tsx +141 -0
- package/src/components/form/SearchPalette/SearchPalette.types.ts +82 -0
- package/src/components/form/SearchPalette/index.ts +7 -0
- package/src/components/form/Select/Select.md +254 -0
- package/src/components/form/Select/Select.stories.tsx +364 -0
- package/src/components/form/Select/Select.test.stories.tsx +977 -0
- package/src/components/form/Select/Select.tsx +239 -0
- package/src/components/form/Select/Select.types.ts +57 -0
- package/src/components/form/Select/index.ts +2 -0
- package/src/components/form/Slider/Slider.md +326 -0
- package/src/components/form/Slider/Slider.stories.tsx +418 -0
- package/src/components/form/Slider/Slider.test.stories.tsx +1044 -0
- package/src/components/form/Slider/Slider.tsx +374 -0
- package/src/components/form/Slider/Slider.types.ts +113 -0
- package/src/components/form/Slider/index.ts +2 -0
- package/src/components/form/Switch/Switch.md +565 -0
- package/src/components/form/Switch/Switch.stories.tsx +697 -0
- package/src/components/form/Switch/Switch.test.stories.tsx +597 -0
- package/src/components/form/Switch/Switch.tsx +578 -0
- package/src/components/form/Switch/Switch.types.ts +130 -0
- package/src/components/form/Switch/index.ts +2 -0
- package/src/components/form/Textarea/Textarea.stories.tsx +473 -0
- package/src/components/form/Textarea/Textarea.test.stories.tsx +708 -0
- package/src/components/form/Textarea/Textarea.tsx +678 -0
- package/src/components/form/Textarea/Textarea.types.ts +84 -0
- package/src/components/form/Textarea/index.ts +2 -0
- package/src/components/form/Toggle/Toggle.md +234 -0
- package/src/components/form/Toggle/Toggle.stories.tsx +638 -0
- package/src/components/form/Toggle/Toggle.test.stories.tsx +1167 -0
- package/src/components/form/Toggle/Toggle.tsx +265 -0
- package/src/components/form/Toggle/Toggle.types.ts +79 -0
- package/src/components/form/Toggle/index.ts +2 -0
- package/src/components/form/ToggleGroup/ToggleGroup.md +329 -0
- package/src/components/form/ToggleGroup/ToggleGroup.stories.tsx +617 -0
- package/src/components/form/ToggleGroup/ToggleGroup.test.stories.tsx +918 -0
- package/src/components/form/ToggleGroup/ToggleGroup.tsx +129 -0
- package/src/components/form/ToggleGroup/ToggleGroup.types.ts +53 -0
- package/src/components/form/ToggleGroup/index.ts +2 -0
- package/src/components/form/UploadButton/UploadButton.md +44 -0
- package/src/components/form/UploadButton/UploadButton.stories.tsx +366 -0
- package/src/components/form/UploadButton/UploadButton.test.stories.tsx +454 -0
- package/src/components/form/UploadButton/UploadButton.tsx +312 -0
- package/src/components/form/UploadButton/UploadButton.types.ts +58 -0
- package/src/components/form/UploadButton/index.ts +2 -0
- package/src/components/form/index.ts +25 -0
- package/src/components/form/total-form/Fields/SelectField.tsx +57 -0
- package/src/components/form/total-form/Fields/TextField.tsx +58 -0
- package/src/components/form/total-form/Fields/index.ts +4 -0
- package/src/components/form/total-form/FormContainer.tsx +104 -0
- package/src/components/form/total-form/FormContext.tsx +38 -0
- package/src/components/form/total-form/FormErrorSnackbar.tsx +35 -0
- package/src/components/form/total-form/SubmitButton.tsx +27 -0
- package/src/components/form/total-form/index.ts +12 -0
- package/src/components/form/total-form/total-form.test.tsx +97 -0
- package/src/components/index.ts +7 -0
- package/src/components/layout/Accordion/Accordion.md +725 -0
- package/src/components/layout/Accordion/Accordion.stories.tsx +690 -0
- package/src/components/layout/Accordion/Accordion.test.stories.tsx +1362 -0
- package/src/components/layout/Accordion/Accordion.tsx +242 -0
- package/src/components/layout/Accordion/Accordion.types.ts +32 -0
- package/src/components/layout/Accordion/index.ts +8 -0
- package/src/components/layout/Card/Card.md +533 -0
- package/src/components/layout/Card/Card.stories.tsx +593 -0
- package/src/components/layout/Card/Card.test.stories.tsx +1134 -0
- package/src/components/layout/Card/Card.tsx +404 -0
- package/src/components/layout/Card/Card.types.ts +57 -0
- package/src/components/layout/Card/index.ts +8 -0
- package/src/components/layout/Collapsible/Collapsible.md +135 -0
- package/src/components/layout/Collapsible/Collapsible.stories.tsx +180 -0
- package/src/components/layout/Collapsible/Collapsible.test.stories.tsx +304 -0
- package/src/components/layout/Collapsible/Collapsible.tsx +198 -0
- package/src/components/layout/Collapsible/Collapsible.types.ts +35 -0
- package/src/components/layout/Collapsible/index.ts +6 -0
- package/src/components/layout/Container/Container.md +420 -0
- package/src/components/layout/Container/Container.stories.tsx +557 -0
- package/src/components/layout/Container/Container.test.stories.tsx +750 -0
- package/src/components/layout/Container/Container.tsx +72 -0
- package/src/components/layout/Container/Container.types.ts +11 -0
- package/src/components/layout/Container/index.ts +2 -0
- package/src/components/layout/ContentToolbar/ColumnsMenu.tsx +99 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.md +75 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.stories.tsx +129 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.test.stories.tsx +251 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.tsx +108 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.types.ts +229 -0
- package/src/components/layout/ContentToolbar/FilterTrigger.tsx +71 -0
- package/src/components/layout/ContentToolbar/MultiSelectDropdown.tsx +297 -0
- package/src/components/layout/ContentToolbar/SavedViewsMenu.tsx +334 -0
- package/src/components/layout/ContentToolbar/SortByDropdown.tsx +213 -0
- package/src/components/layout/ContentToolbar/ViewSelector.tsx +98 -0
- package/src/components/layout/ContentToolbar/__tests__/ColumnsMenu.test.tsx +39 -0
- package/src/components/layout/ContentToolbar/__tests__/MultiSelectDropdown.test.tsx +110 -0
- package/src/components/layout/ContentToolbar/__tests__/SavedViewsMenu.test.tsx +99 -0
- package/src/components/layout/ContentToolbar/index.ts +24 -0
- package/src/components/layout/ContentToolbar/tests.md +42 -0
- package/src/components/layout/ContentToolbar/track.md +41 -0
- package/src/components/layout/Dashboard/Dashboard.md +71 -0
- package/src/components/layout/Dashboard/Dashboard.stories.tsx +104 -0
- package/src/components/layout/Dashboard/Dashboard.test.stories.tsx +164 -0
- package/src/components/layout/Dashboard/Dashboard.tsx +297 -0
- package/src/components/layout/Dashboard/Dashboard.types.ts +157 -0
- package/src/components/layout/Dashboard/DashboardContext.tsx +47 -0
- package/src/components/layout/Dashboard/DashboardParts.tsx +216 -0
- package/src/components/layout/Dashboard/index.ts +18 -0
- package/src/components/layout/Dashboard/tests.md +46 -0
- package/src/components/layout/Dashboard/track.md +50 -0
- package/src/components/layout/Drawer/Drawer.md +479 -0
- package/src/components/layout/Drawer/Drawer.stories.tsx +660 -0
- package/src/components/layout/Drawer/Drawer.test.stories.tsx +1339 -0
- package/src/components/layout/Drawer/Drawer.tsx +150 -0
- package/src/components/layout/Drawer/Drawer.types.ts +34 -0
- package/src/components/layout/Drawer/index.ts +2 -0
- package/src/components/layout/Resizable/Resizable.md +308 -0
- package/src/components/layout/Resizable/Resizable.stories.tsx +1039 -0
- package/src/components/layout/Resizable/Resizable.test.stories.tsx +750 -0
- package/src/components/layout/Resizable/Resizable.tsx +190 -0
- package/src/components/layout/Resizable/Resizable.types.ts +34 -0
- package/src/components/layout/Resizable/index.ts +2 -0
- package/src/components/layout/ScrollArea/ScrollArea.md +122 -0
- package/src/components/layout/ScrollArea/ScrollArea.stories.tsx +651 -0
- package/src/components/layout/ScrollArea/ScrollArea.test.stories.tsx +619 -0
- package/src/components/layout/ScrollArea/ScrollArea.tsx +449 -0
- package/src/components/layout/ScrollArea/ScrollArea.types.ts +80 -0
- package/src/components/layout/ScrollArea/index.ts +7 -0
- package/src/components/layout/Separator/Separator.stories.tsx +563 -0
- package/src/components/layout/Separator/Separator.test.stories.tsx +527 -0
- package/src/components/layout/Separator/Separator.tsx +187 -0
- package/src/components/layout/Separator/Separator.types.ts +17 -0
- package/src/components/layout/Separator/index.ts +2 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.md +139 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.parts.tsx +357 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.stories.tsx +194 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.test.stories.tsx +175 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.tsx +69 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.types.ts +61 -0
- package/src/components/layout/SettingsLayout/index.ts +6 -0
- package/src/components/layout/Sidebar/Sidebar.md +367 -0
- package/src/components/layout/Sidebar/Sidebar.stories.tsx +611 -0
- package/src/components/layout/Sidebar/Sidebar.test.stories.tsx +1326 -0
- package/src/components/layout/Sidebar/Sidebar.tsx +131 -0
- package/src/components/layout/Sidebar/Sidebar.types.ts +30 -0
- package/src/components/layout/Sidebar/index.ts +7 -0
- package/src/components/layout/Skeleton/Skeleton.md +240 -0
- package/src/components/layout/Skeleton/Skeleton.stories.tsx +689 -0
- package/src/components/layout/Skeleton/Skeleton.test.stories.tsx +521 -0
- package/src/components/layout/Skeleton/Skeleton.tsx +166 -0
- package/src/components/layout/Skeleton/Skeleton.types.ts +19 -0
- package/src/components/layout/Skeleton/index.ts +2 -0
- package/src/components/layout/Spacer/Spacer.md +84 -0
- package/src/components/layout/Spacer/Spacer.stories.tsx +502 -0
- package/src/components/layout/Spacer/Spacer.test.stories.tsx +472 -0
- package/src/components/layout/Spacer/Spacer.tsx +68 -0
- package/src/components/layout/Spacer/Spacer.types.ts +12 -0
- package/src/components/layout/Spacer/index.ts +2 -0
- package/src/components/layout/TableFilter/TableFilter.md +55 -0
- package/src/components/layout/TableFilter/TableFilter.stories.tsx +82 -0
- package/src/components/layout/TableFilter/TableFilter.test.stories.tsx +87 -0
- package/src/components/layout/TableFilter/TableFilter.tsx +383 -0
- package/src/components/layout/TableFilter/TableFilter.types.ts +87 -0
- package/src/components/layout/TableFilter/TableFilterContext.tsx +29 -0
- package/src/components/layout/TableFilter/index.ts +15 -0
- package/src/components/layout/TableFilter/tests.md +37 -0
- package/src/components/layout/TableFilter/track.md +36 -0
- package/src/components/layout/index.ts +14 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.md +558 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.stories.tsx +640 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.test.stories.tsx +1007 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.tsx +516 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.types.ts +132 -0
- package/src/components/navigation/Breadcrumbs/index.ts +2 -0
- package/src/components/navigation/CommandPalette/CommandPalette.md +201 -0
- package/src/components/navigation/CommandPalette/CommandPalette.stories.tsx +384 -0
- package/src/components/navigation/CommandPalette/CommandPalette.test.stories.tsx +437 -0
- package/src/components/navigation/CommandPalette/CommandPalette.tsx +434 -0
- package/src/components/navigation/CommandPalette/CommandPalette.types.ts +25 -0
- package/src/components/navigation/CommandPalette/index.ts +2 -0
- package/src/components/navigation/ContextMenu/ContextMenu.md +535 -0
- package/src/components/navigation/ContextMenu/ContextMenu.stories.tsx +611 -0
- package/src/components/navigation/ContextMenu/ContextMenu.test.stories.tsx +850 -0
- package/src/components/navigation/ContextMenu/ContextMenu.tsx +254 -0
- package/src/components/navigation/ContextMenu/ContextMenu.types.ts +96 -0
- package/src/components/navigation/ContextMenu/index.ts +2 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.md +514 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.stories.tsx +580 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.test.stories.tsx +660 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.tsx +305 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.types.ts +116 -0
- package/src/components/navigation/DropdownMenu/index.ts +2 -0
- package/src/components/navigation/NavigationMenu/NavigationMenu.md +580 -0
- package/src/components/navigation/NavigationMenu/NavigationMenu.tsx +874 -0
- package/src/components/navigation/NavigationMenu/NavigationMenu.types.ts +135 -0
- package/src/components/navigation/NavigationMenu/index.ts +2 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.stories.tsx +518 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.test.stories.tsx +931 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuHorizontal.stories.tsx +503 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuVertical.stories.tsx +455 -0
- package/src/components/navigation/Pagination/Pagination.md +699 -0
- package/src/components/navigation/Pagination/Pagination.stories.tsx +604 -0
- package/src/components/navigation/Pagination/Pagination.test.stories.tsx +520 -0
- package/src/components/navigation/Pagination/Pagination.tsx +356 -0
- package/src/components/navigation/Pagination/Pagination.types.ts +129 -0
- package/src/components/navigation/Pagination/index.ts +2 -0
- package/src/components/navigation/Tabs/Tabs.md +774 -0
- package/src/components/navigation/Tabs/Tabs.stories.tsx +1006 -0
- package/src/components/navigation/Tabs/Tabs.test.stories.tsx +1225 -0
- package/src/components/navigation/Tabs/Tabs.tsx +433 -0
- package/src/components/navigation/Tabs/Tabs.types.ts +239 -0
- package/src/components/navigation/Tabs/index.ts +2 -0
- package/src/components/navigation/index.ts +7 -0
- package/src/components/typography/Blockquote/Blockquote.md +130 -0
- package/src/components/typography/Blockquote/Blockquote.stories.tsx +359 -0
- package/src/components/typography/Blockquote/Blockquote.test.stories.tsx +432 -0
- package/src/components/typography/Blockquote/Blockquote.tsx +166 -0
- package/src/components/typography/Blockquote/Blockquote.types.ts +11 -0
- package/src/components/typography/Blockquote/index.ts +2 -0
- package/src/components/typography/Code/Code.md +182 -0
- package/src/components/typography/Code/Code.stories.tsx +686 -0
- package/src/components/typography/Code/Code.test.stories.tsx +703 -0
- package/src/components/typography/Code/Code.tsx +228 -0
- package/src/components/typography/Code/Code.types.ts +12 -0
- package/src/components/typography/Code/index.ts +2 -0
- package/src/components/typography/Heading/Heading.md +143 -0
- package/src/components/typography/Heading/Heading.stories.tsx +451 -0
- package/src/components/typography/Heading/Heading.test.stories.tsx +830 -0
- package/src/components/typography/Heading/Heading.tsx +178 -0
- package/src/components/typography/Heading/Heading.types.ts +11 -0
- package/src/components/typography/Heading/index.ts +2 -0
- package/src/components/typography/Paragraph/Paragraph.md +80 -0
- package/src/components/typography/Paragraph/Paragraph.stories.tsx +280 -0
- package/src/components/typography/Paragraph/Paragraph.test.stories.tsx +238 -0
- package/src/components/typography/Paragraph/Paragraph.tsx +99 -0
- package/src/components/typography/Paragraph/Paragraph.types.ts +10 -0
- package/src/components/typography/Paragraph/index.ts +2 -0
- package/src/components/typography/Text/Text.md +129 -0
- package/src/components/typography/Text/Text.stories.tsx +359 -0
- package/src/components/typography/Text/Text.test.stories.tsx +762 -0
- package/src/components/typography/Text/Text.tsx +159 -0
- package/src/components/typography/Text/Text.types.ts +15 -0
- package/src/components/typography/Text/index.ts +2 -0
- package/src/components/typography/index.ts +5 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.md +359 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.stories.tsx +947 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.test.stories.tsx +596 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.tsx +595 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.types.ts +98 -0
- package/src/components/utility/AnimatedIcon/index.ts +2 -0
- package/src/components/utility/AspectRatio/AspectRatio.md +200 -0
- package/src/components/utility/AspectRatio/AspectRatio.stories.tsx +414 -0
- package/src/components/utility/AspectRatio/AspectRatio.test.stories.tsx +859 -0
- package/src/components/utility/AspectRatio/AspectRatio.tsx +76 -0
- package/src/components/utility/AspectRatio/AspectRatio.types.ts +13 -0
- package/src/components/utility/AspectRatio/index.ts +2 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.md +531 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.stories.tsx +620 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.test.stories.tsx +358 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +204 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +39 -0
- package/src/components/utility/InfiniteScroll/index.ts +6 -0
- package/src/components/utility/Portal/Portal.button-container.example.tsx +99 -0
- package/src/components/utility/Portal/Portal.md +593 -0
- package/src/components/utility/Portal/Portal.stories.tsx +340 -0
- package/src/components/utility/Portal/Portal.test.stories.tsx +2086 -0
- package/src/components/utility/Portal/Portal.tsx +39 -0
- package/src/components/utility/Portal/Portal.types.ts +7 -0
- package/src/components/utility/Portal/index.ts +2 -0
- package/src/components/utility/Transition/Transition.md +684 -0
- package/src/components/utility/Transition/Transition.stories.tsx +493 -0
- package/src/components/utility/Transition/Transition.test.stories.tsx +854 -0
- package/src/components/utility/Transition/Transition.tsx +140 -0
- package/src/components/utility/Transition/Transition.types.ts +14 -0
- package/src/components/utility/Transition/index.ts +6 -0
- package/src/components/utility/VirtualList/VirtualList.md +520 -0
- package/src/components/utility/VirtualList/VirtualList.stories.tsx +1073 -0
- package/src/components/utility/VirtualList/VirtualList.test.stories.tsx +1074 -0
- package/src/components/utility/VirtualList/VirtualList.tsx +369 -0
- package/src/components/utility/VirtualList/VirtualList.types.ts +56 -0
- package/src/components/utility/VirtualList/index.ts +7 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.md +187 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.stories.tsx +433 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.test.stories.tsx +364 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.tsx +506 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.types.ts +133 -0
- package/src/components/utility/WorkflowStep/index.ts +13 -0
- package/src/components/utility/index.ts +7 -0
- package/src/index.ts +17 -0
- package/src/mui/AppBar.ts +2 -0
- package/src/mui/Box.ts +2 -0
- package/src/mui/CssBaseline.ts +2 -0
- package/src/mui/FormControl.ts +2 -0
- package/src/mui/FormControlLabel.ts +2 -0
- package/src/mui/Grid2.ts +2 -0
- package/src/mui/InputLabel.ts +2 -0
- package/src/mui/List.ts +2 -0
- package/src/mui/ListItem.ts +2 -0
- package/src/mui/ListItemButton.ts +2 -0
- package/src/mui/ListItemText.ts +2 -0
- package/src/mui/Stack.ts +2 -0
- package/src/mui/SvgIcon.ts +2 -0
- package/src/mui/Toolbar.ts +2 -0
- package/src/mui/styles.ts +2 -0
- package/src/mui/useMediaQuery.ts +1 -0
- package/src/social-login-button.tsx +199 -0
- package/src/user-avatar.tsx +102 -0
- package/src/utils/cn.ts +9 -0
- package/src/utils/index.ts +1 -0
|
@@ -0,0 +1,725 @@
|
|
|
1
|
+
# Accordion Component
|
|
2
|
+
|
|
3
|
+
A customizable collapsible panel component for organizing and displaying content in a space-efficient manner.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The Accordion component provides expandable/collapsible content sections with smooth animations and flexible styling options. It supports single or multiple panel expansion, keyboard navigation, and comprehensive accessibility features.
|
|
8
|
+
|
|
9
|
+
## Props
|
|
10
|
+
|
|
11
|
+
### Accordion Props
|
|
12
|
+
|
|
13
|
+
| Prop | Type | Default | Description |
|
|
14
|
+
|------|------|---------|-------------|
|
|
15
|
+
| `children` | ReactNode | - | The content of the accordion (AccordionSummary and AccordionDetails) |
|
|
16
|
+
| `defaultExpanded` | boolean | false | If true, the accordion is expanded by default |
|
|
17
|
+
| `disabled` | boolean | false | If true, the accordion is disabled |
|
|
18
|
+
| `expanded` | boolean | - | If true, the accordion is expanded (controlled) |
|
|
19
|
+
| `onChange` | function | - | Callback fired when the accordion state changes |
|
|
20
|
+
| `variant` | 'default' \| 'glass' \| 'bordered' \| 'separated' | 'default' | Visual style variant |
|
|
21
|
+
| `TransitionComponent` | elementType | Collapse | The component used for the collapse transition |
|
|
22
|
+
| `TransitionProps` | object | - | Props applied to the transition element |
|
|
23
|
+
|
|
24
|
+
### AccordionSummary Props
|
|
25
|
+
|
|
26
|
+
| Prop | Type | Default | Description |
|
|
27
|
+
|------|------|---------|-------------|
|
|
28
|
+
| `children` | ReactNode | - | The content of the accordion summary |
|
|
29
|
+
| `expandIcon` | ReactNode | - | The icon to display as the expand indicator |
|
|
30
|
+
| `focusVisibleClassName` | string | - | Class applied when the summary is keyboard focused |
|
|
31
|
+
| `onClick` | function | - | Callback fired when the summary is clicked |
|
|
32
|
+
|
|
33
|
+
### AccordionDetails Props
|
|
34
|
+
|
|
35
|
+
| Prop | Type | Default | Description |
|
|
36
|
+
|------|------|---------|-------------|
|
|
37
|
+
| `children` | ReactNode | - | The content of the accordion details |
|
|
38
|
+
| `sx` | object | - | System sx prop for custom styling |
|
|
39
|
+
|
|
40
|
+
### AccordionActions Props
|
|
41
|
+
|
|
42
|
+
| Prop | Type | Default | Description |
|
|
43
|
+
|------|------|---------|-------------|
|
|
44
|
+
| `children` | ReactNode | - | Action buttons for the accordion |
|
|
45
|
+
| `disableSpacing` | boolean | false | If true, removes additional spacing between actions |
|
|
46
|
+
|
|
47
|
+
## Usage
|
|
48
|
+
|
|
49
|
+
### Basic Usage
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import { Accordion, AccordionSummary, AccordionDetails } from '@mui/material';
|
|
53
|
+
import { ExpandMore } from '@mui/icons-material';
|
|
54
|
+
|
|
55
|
+
function BasicAccordion() {
|
|
56
|
+
return (
|
|
57
|
+
<Accordion>
|
|
58
|
+
<AccordionSummary expandIcon={<ExpandMore />}>
|
|
59
|
+
<Typography>Accordion Title</Typography>
|
|
60
|
+
</AccordionSummary>
|
|
61
|
+
<AccordionDetails>
|
|
62
|
+
<Typography>
|
|
63
|
+
Accordion content goes here.
|
|
64
|
+
</Typography>
|
|
65
|
+
</AccordionDetails>
|
|
66
|
+
</Accordion>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Controlled Accordion
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
function ControlledAccordion() {
|
|
75
|
+
const [expanded, setExpanded] = useState(false);
|
|
76
|
+
|
|
77
|
+
const handleChange = (event, isExpanded) => {
|
|
78
|
+
setExpanded(isExpanded);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
return (
|
|
82
|
+
<Accordion expanded={expanded} onChange={handleChange}>
|
|
83
|
+
<AccordionSummary expandIcon={<ExpandMore />}>
|
|
84
|
+
<Typography>Controlled Accordion</Typography>
|
|
85
|
+
</AccordionSummary>
|
|
86
|
+
<AccordionDetails>
|
|
87
|
+
<Typography>This accordion's state is controlled.</Typography>
|
|
88
|
+
</AccordionDetails>
|
|
89
|
+
</Accordion>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Multiple Accordions with Exclusive Expansion
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
function ExclusiveAccordions() {
|
|
98
|
+
const [expanded, setExpanded] = useState(false);
|
|
99
|
+
|
|
100
|
+
const handleChange = (panel) => (event, isExpanded) => {
|
|
101
|
+
setExpanded(isExpanded ? panel : false);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<>
|
|
106
|
+
<Accordion expanded={expanded === 'panel1'} onChange={handleChange('panel1')}>
|
|
107
|
+
<AccordionSummary expandIcon={<ExpandMore />}>
|
|
108
|
+
<Typography>Panel 1</Typography>
|
|
109
|
+
</AccordionSummary>
|
|
110
|
+
<AccordionDetails>
|
|
111
|
+
<Typography>Content for panel 1</Typography>
|
|
112
|
+
</AccordionDetails>
|
|
113
|
+
</Accordion>
|
|
114
|
+
|
|
115
|
+
<Accordion expanded={expanded === 'panel2'} onChange={handleChange('panel2')}>
|
|
116
|
+
<AccordionSummary expandIcon={<ExpandMore />}>
|
|
117
|
+
<Typography>Panel 2</Typography>
|
|
118
|
+
</AccordionSummary>
|
|
119
|
+
<AccordionDetails>
|
|
120
|
+
<Typography>Content for panel 2</Typography>
|
|
121
|
+
</AccordionDetails>
|
|
122
|
+
</Accordion>
|
|
123
|
+
</>
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### With Actions
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
function AccordionWithActions() {
|
|
132
|
+
return (
|
|
133
|
+
<Accordion>
|
|
134
|
+
<AccordionSummary expandIcon={<ExpandMore />}>
|
|
135
|
+
<Typography>Settings</Typography>
|
|
136
|
+
</AccordionSummary>
|
|
137
|
+
<AccordionDetails>
|
|
138
|
+
<Typography>Configure your settings here.</Typography>
|
|
139
|
+
</AccordionDetails>
|
|
140
|
+
<AccordionActions>
|
|
141
|
+
<Button>Cancel</Button>
|
|
142
|
+
<Button variant="contained">Save</Button>
|
|
143
|
+
</AccordionActions>
|
|
144
|
+
</Accordion>
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Variants
|
|
150
|
+
|
|
151
|
+
### Default
|
|
152
|
+
Standard Material-UI accordion styling.
|
|
153
|
+
|
|
154
|
+
### Glass
|
|
155
|
+
Features a frosted glass effect with backdrop blur and transparency.
|
|
156
|
+
|
|
157
|
+
### Bordered
|
|
158
|
+
Clean borders with rounded corners.
|
|
159
|
+
|
|
160
|
+
### Separated
|
|
161
|
+
Elevated shadows with spacing between items.
|
|
162
|
+
|
|
163
|
+
## Accessibility
|
|
164
|
+
|
|
165
|
+
- **ARIA Attributes**: Proper `aria-expanded`, `aria-controls`, and `aria-labelledby` attributes
|
|
166
|
+
- **Keyboard Navigation**:
|
|
167
|
+
- `Tab` - Navigate between accordion headers
|
|
168
|
+
- `Enter` or `Space` - Expand/collapse focused accordion
|
|
169
|
+
- `Arrow Keys` - Navigate between accordion items when focused
|
|
170
|
+
- **Screen Reader Support**: Announces expansion state changes
|
|
171
|
+
- **Focus Management**: Maintains proper focus flow and visual focus indicators
|
|
172
|
+
|
|
173
|
+
## Best Practices
|
|
174
|
+
|
|
175
|
+
1. **Use clear, descriptive headers** that indicate the content within each section
|
|
176
|
+
2. **Keep content concise** to maintain a good user experience
|
|
177
|
+
3. **Consider default expanded state** for important content that users should see immediately
|
|
178
|
+
4. **Group related content** in the same accordion panel
|
|
179
|
+
5. **Provide visual feedback** for hover and focus states
|
|
180
|
+
6. **Test with keyboard navigation** to ensure accessibility
|
|
181
|
+
|
|
182
|
+
## Performance Considerations
|
|
183
|
+
|
|
184
|
+
- Use `React.memo` for expensive child components to prevent unnecessary re-renders
|
|
185
|
+
- Consider lazy loading content for accordions with heavy content
|
|
186
|
+
- Limit the number of accordions on a single page for better performance
|
|
187
|
+
- Use the `TransitionProps` to customize animation duration for better perceived performance
|
|
188
|
+
|
|
189
|
+
## Testing
|
|
190
|
+
|
|
191
|
+
### Test IDs
|
|
192
|
+
|
|
193
|
+
This document describes all `data-testid` attributes available in the Accordion component for testing purposes.
|
|
194
|
+
|
|
195
|
+
#### Container Elements
|
|
196
|
+
|
|
197
|
+
##### `accordion` (customizable)
|
|
198
|
+
- **Element:** Main Accordion container
|
|
199
|
+
- **Location:** Root MuiAccordion element
|
|
200
|
+
- **Usage:** Query the main accordion to verify it's rendered
|
|
201
|
+
- **Note:** This is the default value, but can be overridden via the `data-testid` prop
|
|
202
|
+
```typescript
|
|
203
|
+
const accordion = await canvas.findByTestId('accordion');
|
|
204
|
+
expect(accordion).toBeInTheDocument();
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
#### Header/Summary Elements
|
|
208
|
+
|
|
209
|
+
##### `accordion-summary` (customizable)
|
|
210
|
+
- **Element:** Accordion header/summary that users click to expand/collapse
|
|
211
|
+
- **Location:** AccordionSummary component
|
|
212
|
+
- **Usage:** Query the clickable header element
|
|
213
|
+
- **Note:** This is the default value, but can be overridden via the `data-testid` prop
|
|
214
|
+
```typescript
|
|
215
|
+
const summary = await canvas.findByTestId('accordion-summary');
|
|
216
|
+
await userEvent.click(summary);
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
##### `accordion-icon`
|
|
220
|
+
- **Element:** Expand/collapse icon (typically ExpandMore icon)
|
|
221
|
+
- **Location:** Icon element passed to AccordionSummary via `expandIcon` prop
|
|
222
|
+
- **Usage:** Query to verify the expand/collapse icon is rendered
|
|
223
|
+
- **Note:** Automatically added to any valid React element passed as `expandIcon`
|
|
224
|
+
```typescript
|
|
225
|
+
const icon = await canvas.findByTestId('accordion-icon');
|
|
226
|
+
expect(icon).toBeInTheDocument();
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
#### Content Elements
|
|
230
|
+
|
|
231
|
+
##### `accordion-details` (customizable)
|
|
232
|
+
- **Element:** Accordion content panel that expands/collapses
|
|
233
|
+
- **Location:** AccordionDetails component
|
|
234
|
+
- **Usage:** Query the content area of the accordion
|
|
235
|
+
- **Note:** This is the default value, but can be overridden via the `data-testid` prop
|
|
236
|
+
```typescript
|
|
237
|
+
const details = await canvas.findByTestId('accordion-details');
|
|
238
|
+
expect(details).toBeInTheDocument();
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
##### `accordion-actions` (customizable)
|
|
242
|
+
- **Element:** Optional actions footer (buttons, links, etc.)
|
|
243
|
+
- **Location:** AccordionActions component
|
|
244
|
+
- **Usage:** Query the actions area at the bottom of the accordion
|
|
245
|
+
- **Note:** This is the default value, but can be overridden via the `data-testid` prop
|
|
246
|
+
```typescript
|
|
247
|
+
const actions = await canvas.findByTestId('accordion-actions');
|
|
248
|
+
const buttons = within(actions).getAllByRole('button');
|
|
249
|
+
expect(buttons).toHaveLength(2);
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Test Patterns
|
|
253
|
+
|
|
254
|
+
#### Wait for Accordion to Render
|
|
255
|
+
```typescript
|
|
256
|
+
import { waitFor, within } from 'storybook/test';
|
|
257
|
+
|
|
258
|
+
// Wait for accordion
|
|
259
|
+
const accordion = await canvas.findByTestId('accordion');
|
|
260
|
+
|
|
261
|
+
// Wait for summary to be interactive
|
|
262
|
+
await waitFor(async () => {
|
|
263
|
+
const summary = await canvas.findByTestId('accordion-summary');
|
|
264
|
+
expect(summary).toBeEnabled();
|
|
265
|
+
}, { timeout: 3000 });
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
#### Test Expand/Collapse Interaction
|
|
269
|
+
```typescript
|
|
270
|
+
// Get summary element
|
|
271
|
+
const summary = await canvas.findByTestId('accordion-summary');
|
|
272
|
+
|
|
273
|
+
// Verify it's collapsed initially
|
|
274
|
+
const accordion = await canvas.findByTestId('accordion');
|
|
275
|
+
expect(accordion).not.toHaveClass('Mui-expanded');
|
|
276
|
+
|
|
277
|
+
// Click to expand
|
|
278
|
+
await userEvent.click(summary);
|
|
279
|
+
|
|
280
|
+
// Wait for expansion
|
|
281
|
+
await waitFor(() => {
|
|
282
|
+
expect(accordion).toHaveClass('Mui-expanded');
|
|
283
|
+
}, { timeout: 1000 });
|
|
284
|
+
|
|
285
|
+
// Verify content is visible
|
|
286
|
+
const details = await canvas.findByTestId('accordion-details');
|
|
287
|
+
expect(details).toBeVisible();
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
#### Test Icon Rotation
|
|
291
|
+
```typescript
|
|
292
|
+
const icon = await canvas.findByTestId('accordion-icon');
|
|
293
|
+
const summary = await canvas.findByTestId('accordion-summary');
|
|
294
|
+
|
|
295
|
+
// Get icon wrapper element
|
|
296
|
+
const iconWrapper = icon.closest('.MuiAccordionSummary-expandIconWrapper');
|
|
297
|
+
|
|
298
|
+
// Check initial state (not rotated)
|
|
299
|
+
expect(iconWrapper).not.toHaveClass('Mui-expanded');
|
|
300
|
+
|
|
301
|
+
// Expand accordion
|
|
302
|
+
await userEvent.click(summary);
|
|
303
|
+
|
|
304
|
+
// Verify icon rotated
|
|
305
|
+
await waitFor(() => {
|
|
306
|
+
expect(iconWrapper).toHaveClass('Mui-expanded');
|
|
307
|
+
});
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
#### Test Multiple Accordions
|
|
311
|
+
```typescript
|
|
312
|
+
// When using custom testIds in a list
|
|
313
|
+
const accordions = [
|
|
314
|
+
{ testId: 'accordion-settings', label: 'Settings' },
|
|
315
|
+
{ testId: 'accordion-security', label: 'Security' },
|
|
316
|
+
{ testId: 'accordion-notifications', label: 'Notifications' },
|
|
317
|
+
];
|
|
318
|
+
|
|
319
|
+
for (const { testId, label } of accordions) {
|
|
320
|
+
const accordion = await canvas.findByTestId(testId);
|
|
321
|
+
expect(accordion).toBeInTheDocument();
|
|
322
|
+
|
|
323
|
+
// Verify label is present
|
|
324
|
+
const text = await within(accordion).findByText(label);
|
|
325
|
+
expect(text).toBeInTheDocument();
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
#### Test Controlled Accordion Behavior
|
|
330
|
+
```typescript
|
|
331
|
+
// Expand first accordion
|
|
332
|
+
const summary1 = await canvas.findByTestId('accordion-1-summary');
|
|
333
|
+
await userEvent.click(summary1);
|
|
334
|
+
|
|
335
|
+
// Verify first is expanded
|
|
336
|
+
const accordion1 = await canvas.findByTestId('accordion-1');
|
|
337
|
+
expect(accordion1).toHaveClass('Mui-expanded');
|
|
338
|
+
|
|
339
|
+
// Expand second accordion (controlled - first should close)
|
|
340
|
+
const summary2 = await canvas.findByTestId('accordion-2-summary');
|
|
341
|
+
await userEvent.click(summary2);
|
|
342
|
+
|
|
343
|
+
// Wait for state change
|
|
344
|
+
await waitFor(() => {
|
|
345
|
+
expect(accordion1).not.toHaveClass('Mui-expanded');
|
|
346
|
+
const accordion2 = canvas.getByTestId('accordion-2');
|
|
347
|
+
expect(accordion2).toHaveClass('Mui-expanded');
|
|
348
|
+
});
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
#### Test Accordion Actions
|
|
352
|
+
```typescript
|
|
353
|
+
const actions = await canvas.findByTestId('accordion-actions');
|
|
354
|
+
|
|
355
|
+
// Find buttons within actions
|
|
356
|
+
const buttons = within(actions).getAllByRole('button');
|
|
357
|
+
expect(buttons).toHaveLength(2);
|
|
358
|
+
|
|
359
|
+
// Test button interactions
|
|
360
|
+
const saveButton = within(actions).getByText('Save');
|
|
361
|
+
await userEvent.click(saveButton);
|
|
362
|
+
|
|
363
|
+
// Verify callback was called
|
|
364
|
+
expect(args.onSave).toHaveBeenCalled();
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### Props That Affect Test Behavior
|
|
368
|
+
|
|
369
|
+
#### `variant`
|
|
370
|
+
- **Values:** `'default' | 'glass' | 'bordered' | 'separated'`
|
|
371
|
+
- **Impact:**
|
|
372
|
+
- `default`: Standard Material-UI styling
|
|
373
|
+
- `glass`: Frosted glass effect with backdrop blur
|
|
374
|
+
- `bordered`: Clean borders with rounded corners
|
|
375
|
+
- `separated`: Elevated shadows with spacing between items
|
|
376
|
+
|
|
377
|
+
#### `disabled`
|
|
378
|
+
- **Values:** `boolean`
|
|
379
|
+
- **Impact:** Disables interaction with the accordion
|
|
380
|
+
- **Test Tip:** Use `toBeDisabled()` matcher
|
|
381
|
+
```typescript
|
|
382
|
+
const accordion = await canvas.findByTestId('accordion');
|
|
383
|
+
expect(accordion).toBeDisabled();
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
#### `defaultExpanded`
|
|
387
|
+
- **Values:** `boolean`
|
|
388
|
+
- **Impact:** Sets initial expanded state (uncontrolled)
|
|
389
|
+
- **Test Tip:** Check for `Mui-expanded` class on mount
|
|
390
|
+
|
|
391
|
+
#### `expanded`
|
|
392
|
+
- **Values:** `boolean | undefined`
|
|
393
|
+
- **Impact:** Controls expanded state (controlled mode)
|
|
394
|
+
- **Test Tip:** Accordion only changes when this prop changes
|
|
395
|
+
|
|
396
|
+
#### `onChange`
|
|
397
|
+
- **Values:** `(event: React.SyntheticEvent, expanded: boolean) => void`
|
|
398
|
+
- **Impact:** Callback fired when accordion state changes
|
|
399
|
+
- **Test Tip:** Use to create controlled accordion behavior
|
|
400
|
+
|
|
401
|
+
### Common Test Scenarios
|
|
402
|
+
|
|
403
|
+
#### 1. Basic Rendering Test
|
|
404
|
+
```typescript
|
|
405
|
+
play: async ({ canvasElement }) => {
|
|
406
|
+
const canvas = within(canvasElement);
|
|
407
|
+
|
|
408
|
+
// Wait for accordion to render
|
|
409
|
+
const accordion = await canvas.findByTestId('accordion');
|
|
410
|
+
expect(accordion).toBeInTheDocument();
|
|
411
|
+
|
|
412
|
+
// Verify summary is present
|
|
413
|
+
const summary = await canvas.findByTestId('accordion-summary');
|
|
414
|
+
expect(summary).toBeInTheDocument();
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
#### 2. Expansion Test
|
|
419
|
+
```typescript
|
|
420
|
+
play: async ({ canvasElement }) => {
|
|
421
|
+
const canvas = within(canvasElement);
|
|
422
|
+
|
|
423
|
+
// Get elements
|
|
424
|
+
const summary = await canvas.findByTestId('accordion-summary');
|
|
425
|
+
const accordion = await canvas.findByTestId('accordion');
|
|
426
|
+
|
|
427
|
+
// Initially collapsed
|
|
428
|
+
expect(accordion).not.toHaveClass('Mui-expanded');
|
|
429
|
+
|
|
430
|
+
// Click to expand
|
|
431
|
+
await userEvent.click(summary);
|
|
432
|
+
|
|
433
|
+
// Wait for expansion
|
|
434
|
+
await waitFor(() => {
|
|
435
|
+
expect(accordion).toHaveClass('Mui-expanded');
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
// Content should be visible
|
|
439
|
+
const details = await canvas.findByTestId('accordion-details');
|
|
440
|
+
expect(details).toBeVisible();
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
#### 3. Icon Test
|
|
445
|
+
```typescript
|
|
446
|
+
play: async ({ canvasElement }) => {
|
|
447
|
+
const canvas = within(canvasElement);
|
|
448
|
+
|
|
449
|
+
// Verify icon is present
|
|
450
|
+
const icon = await canvas.findByTestId('accordion-icon');
|
|
451
|
+
expect(icon).toBeInTheDocument();
|
|
452
|
+
|
|
453
|
+
// Get icon wrapper
|
|
454
|
+
const wrapper = icon.closest('.MuiAccordionSummary-expandIconWrapper');
|
|
455
|
+
expect(wrapper).toBeInTheDocument();
|
|
456
|
+
}
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
#### 4. Actions Test
|
|
460
|
+
```typescript
|
|
461
|
+
play: async ({ canvasElement, args }) => {
|
|
462
|
+
const canvas = within(canvasElement);
|
|
463
|
+
|
|
464
|
+
// Expand accordion first
|
|
465
|
+
const summary = await canvas.findByTestId('accordion-summary');
|
|
466
|
+
await userEvent.click(summary);
|
|
467
|
+
|
|
468
|
+
// Wait for actions to be visible
|
|
469
|
+
const actions = await canvas.findByTestId('accordion-actions');
|
|
470
|
+
expect(actions).toBeVisible();
|
|
471
|
+
|
|
472
|
+
// Test action buttons
|
|
473
|
+
const saveButton = within(actions).getByText('Save');
|
|
474
|
+
await userEvent.click(saveButton);
|
|
475
|
+
}
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
#### 5. Disabled State Test
|
|
479
|
+
```typescript
|
|
480
|
+
play: async ({ canvasElement }) => {
|
|
481
|
+
const canvas = within(canvasElement);
|
|
482
|
+
|
|
483
|
+
// Get disabled accordion
|
|
484
|
+
const accordion = await canvas.findByTestId('accordion');
|
|
485
|
+
expect(accordion).toHaveClass('Mui-disabled');
|
|
486
|
+
|
|
487
|
+
// Summary should not be clickable
|
|
488
|
+
const summary = await canvas.findByTestId('accordion-summary');
|
|
489
|
+
|
|
490
|
+
// Attempt to click (should not expand)
|
|
491
|
+
await userEvent.click(summary);
|
|
492
|
+
|
|
493
|
+
// Verify still collapsed
|
|
494
|
+
expect(accordion).not.toHaveClass('Mui-expanded');
|
|
495
|
+
}
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
#### 6. Variant Styling Test
|
|
499
|
+
```typescript
|
|
500
|
+
play: async ({ canvasElement, args }) => {
|
|
501
|
+
const canvas = within(canvasElement);
|
|
502
|
+
|
|
503
|
+
const accordion = await canvas.findByTestId('accordion');
|
|
504
|
+
const style = window.getComputedStyle(accordion);
|
|
505
|
+
|
|
506
|
+
// Test based on variant
|
|
507
|
+
if (args.variant === 'glass') {
|
|
508
|
+
expect(style.backdropFilter).toContain('blur');
|
|
509
|
+
} else if (args.variant === 'bordered') {
|
|
510
|
+
expect(style.border).not.toBe('none');
|
|
511
|
+
} else if (args.variant === 'separated') {
|
|
512
|
+
expect(style.boxShadow).not.toBe('none');
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
#### 7. Keyboard Navigation Test
|
|
518
|
+
```typescript
|
|
519
|
+
play: async ({ canvasElement }) => {
|
|
520
|
+
const canvas = within(canvasElement);
|
|
521
|
+
|
|
522
|
+
const summary = await canvas.findByTestId('accordion-summary');
|
|
523
|
+
|
|
524
|
+
// Focus the summary
|
|
525
|
+
summary.focus();
|
|
526
|
+
expect(summary).toHaveFocus();
|
|
527
|
+
|
|
528
|
+
// Press Enter to expand
|
|
529
|
+
await userEvent.keyboard('{Enter}');
|
|
530
|
+
|
|
531
|
+
// Wait for expansion
|
|
532
|
+
const accordion = await canvas.findByTestId('accordion');
|
|
533
|
+
await waitFor(() => {
|
|
534
|
+
expect(accordion).toHaveClass('Mui-expanded');
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
// Press Space to collapse
|
|
538
|
+
await userEvent.keyboard(' ');
|
|
539
|
+
|
|
540
|
+
// Wait for collapse
|
|
541
|
+
await waitFor(() => {
|
|
542
|
+
expect(accordion).not.toHaveClass('Mui-expanded');
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
#### 8. Multiple Accordions Group Test
|
|
548
|
+
```typescript
|
|
549
|
+
play: async ({ canvasElement }) => {
|
|
550
|
+
const canvas = within(canvasElement);
|
|
551
|
+
|
|
552
|
+
// Define accordion identifiers
|
|
553
|
+
const accordionIds = ['settings', 'security', 'notifications'];
|
|
554
|
+
|
|
555
|
+
// Test each accordion
|
|
556
|
+
for (const id of accordionIds) {
|
|
557
|
+
const summary = await canvas.findByTestId(`accordion-${id}-summary`);
|
|
558
|
+
const accordion = await canvas.findByTestId(`accordion-${id}`);
|
|
559
|
+
|
|
560
|
+
// Expand
|
|
561
|
+
await userEvent.click(summary);
|
|
562
|
+
|
|
563
|
+
// Verify expanded
|
|
564
|
+
await waitFor(() => {
|
|
565
|
+
expect(accordion).toHaveClass('Mui-expanded');
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
// Collapse
|
|
569
|
+
await userEvent.click(summary);
|
|
570
|
+
|
|
571
|
+
// Verify collapsed
|
|
572
|
+
await waitFor(() => {
|
|
573
|
+
expect(accordion).not.toHaveClass('Mui-expanded');
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
### Customizing Test IDs
|
|
580
|
+
|
|
581
|
+
All testIds can be customized via props:
|
|
582
|
+
|
|
583
|
+
```typescript
|
|
584
|
+
<Accordion data-testid="custom-accordion">
|
|
585
|
+
<AccordionSummary
|
|
586
|
+
data-testid="custom-summary"
|
|
587
|
+
expandIcon={<ExpandMore />}
|
|
588
|
+
>
|
|
589
|
+
<Typography>Title</Typography>
|
|
590
|
+
</AccordionSummary>
|
|
591
|
+
<AccordionDetails data-testid="custom-details">
|
|
592
|
+
<Typography>Content</Typography>
|
|
593
|
+
</AccordionDetails>
|
|
594
|
+
<AccordionActions data-testid="custom-actions">
|
|
595
|
+
<Button>Save</Button>
|
|
596
|
+
</AccordionActions>
|
|
597
|
+
</Accordion>
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
#### Testing with Custom IDs
|
|
601
|
+
```typescript
|
|
602
|
+
const accordion = await canvas.findByTestId('custom-accordion');
|
|
603
|
+
const summary = await canvas.findByTestId('custom-summary');
|
|
604
|
+
const details = await canvas.findByTestId('custom-details');
|
|
605
|
+
const actions = await canvas.findByTestId('custom-actions');
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
#### Dynamic Test IDs for Lists
|
|
609
|
+
```typescript
|
|
610
|
+
// When rendering multiple accordions
|
|
611
|
+
{items.map((item, index) => (
|
|
612
|
+
<Accordion key={item.id} data-testid={`accordion-${index}`}>
|
|
613
|
+
<AccordionSummary data-testid={`accordion-summary-${index}`}>
|
|
614
|
+
<Typography>{item.title}</Typography>
|
|
615
|
+
</AccordionSummary>
|
|
616
|
+
<AccordionDetails data-testid={`accordion-details-${index}`}>
|
|
617
|
+
<Typography>{item.content}</Typography>
|
|
618
|
+
</AccordionDetails>
|
|
619
|
+
</Accordion>
|
|
620
|
+
))}
|
|
621
|
+
|
|
622
|
+
// Testing
|
|
623
|
+
const firstAccordion = await canvas.findByTestId('accordion-0');
|
|
624
|
+
const firstSummary = await canvas.findByTestId('accordion-summary-0');
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
### Troubleshooting
|
|
628
|
+
|
|
629
|
+
#### Issue: "Unable to find element with testId X"
|
|
630
|
+
|
|
631
|
+
**Solution:** Always use `await` with `findByTestId`:
|
|
632
|
+
```typescript
|
|
633
|
+
// Wrong - synchronous
|
|
634
|
+
const element = canvas.getByTestId('accordion');
|
|
635
|
+
|
|
636
|
+
// Correct - asynchronous
|
|
637
|
+
const element = await canvas.findByTestId('accordion');
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
#### Issue: Test fails when checking if accordion is expanded
|
|
641
|
+
|
|
642
|
+
**Solution:** Use `waitFor` to handle animation timing:
|
|
643
|
+
```typescript
|
|
644
|
+
await userEvent.click(summary);
|
|
645
|
+
|
|
646
|
+
// Wrong - may fail due to animation
|
|
647
|
+
expect(accordion).toHaveClass('Mui-expanded');
|
|
648
|
+
|
|
649
|
+
// Correct - waits for animation
|
|
650
|
+
await waitFor(() => {
|
|
651
|
+
expect(accordion).toHaveClass('Mui-expanded');
|
|
652
|
+
}, { timeout: 1000 });
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
#### Issue: Can't click accordion summary
|
|
656
|
+
|
|
657
|
+
**Solution:** Ensure accordion is not disabled and element is in viewport:
|
|
658
|
+
```typescript
|
|
659
|
+
const summary = await canvas.findByTestId('accordion-summary');
|
|
660
|
+
|
|
661
|
+
// Check if enabled
|
|
662
|
+
expect(summary).toBeEnabled();
|
|
663
|
+
|
|
664
|
+
// Scroll into view if needed
|
|
665
|
+
summary.scrollIntoView();
|
|
666
|
+
|
|
667
|
+
// Then click
|
|
668
|
+
await userEvent.click(summary);
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
#### Issue: Content not visible after expanding
|
|
672
|
+
|
|
673
|
+
**Solution:** Wait for the content to become visible:
|
|
674
|
+
```typescript
|
|
675
|
+
await userEvent.click(summary);
|
|
676
|
+
|
|
677
|
+
const details = await canvas.findByTestId('accordion-details');
|
|
678
|
+
|
|
679
|
+
await waitFor(() => {
|
|
680
|
+
expect(details).toBeVisible();
|
|
681
|
+
}, { timeout: 1000 });
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
#### Issue: Icon testId not found
|
|
685
|
+
|
|
686
|
+
**Solution:** The icon testId is only added if a valid React element is passed as `expandIcon`:
|
|
687
|
+
```typescript
|
|
688
|
+
// Will have testId
|
|
689
|
+
<AccordionSummary expandIcon={<ExpandMore />}>
|
|
690
|
+
|
|
691
|
+
// Won't have testId (null/undefined)
|
|
692
|
+
<AccordionSummary expandIcon={null}>
|
|
693
|
+
|
|
694
|
+
// Test with conditional check
|
|
695
|
+
const icon = canvas.queryByTestId('accordion-icon');
|
|
696
|
+
if (icon) {
|
|
697
|
+
expect(icon).toBeInTheDocument();
|
|
698
|
+
}
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
### Best Practices
|
|
702
|
+
|
|
703
|
+
1. **Always use async/await** with testId queries in Storybook tests
|
|
704
|
+
2. **Use `waitFor`** when testing expand/collapse animations
|
|
705
|
+
3. **Scope queries** with `within()` when looking inside specific components
|
|
706
|
+
4. **Use custom testIds** for multiple accordions to avoid conflicts
|
|
707
|
+
5. **Add timeouts** for animation-heavy tests: `{ timeout: 1000 }`
|
|
708
|
+
6. **Test keyboard navigation** in addition to mouse clicks
|
|
709
|
+
7. **Check both expanded and collapsed states** in tests
|
|
710
|
+
|
|
711
|
+
### Related Components
|
|
712
|
+
|
|
713
|
+
- **MuiAccordion:** The base Material-UI accordion component
|
|
714
|
+
- **MuiAccordionSummary:** Clickable header with expand icon
|
|
715
|
+
- **MuiAccordionDetails:** Expandable content area
|
|
716
|
+
- **MuiAccordionActions:** Optional footer with action buttons
|
|
717
|
+
|
|
718
|
+
### Change Log
|
|
719
|
+
|
|
720
|
+
- **2025-10-08:** Initial testId implementation
|
|
721
|
+
- Added `accordion` (customizable via prop, default: 'accordion')
|
|
722
|
+
- Added `accordion-summary` (customizable via prop, default: 'accordion-summary')
|
|
723
|
+
- Added `accordion-icon` (automatically added to expandIcon)
|
|
724
|
+
- Added `accordion-details` (customizable via prop, default: 'accordion-details')
|
|
725
|
+
- Added `accordion-actions` (customizable via prop, default: 'accordion-actions')
|