@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,815 @@
|
|
|
1
|
+
# Carousel Component
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
The Carousel component is a versatile data display component that presents content in a rotating, sequential manner. It supports various visual styles, animations, and interactive features for engaging content presentation.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import { Carousel } from '@/components/data-display/Carousel';
|
|
11
|
+
|
|
12
|
+
<Carousel
|
|
13
|
+
items={[
|
|
14
|
+
{ id: '1', content: 'Slide 1', image: '/image1.jpg', title: 'First Slide' },
|
|
15
|
+
{ id: '2', content: 'Slide 2', image: '/image2.jpg', title: 'Second Slide' },
|
|
16
|
+
]}
|
|
17
|
+
variant="glass"
|
|
18
|
+
autoPlay={true}
|
|
19
|
+
showIndicators={true}
|
|
20
|
+
/>;
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
### items
|
|
26
|
+
|
|
27
|
+
- **Type**: `CarouselItem[]`
|
|
28
|
+
- **Required**: Yes
|
|
29
|
+
- **Description**: Array of carousel items with content, images, titles, and descriptions
|
|
30
|
+
|
|
31
|
+
### variant
|
|
32
|
+
|
|
33
|
+
- **Type**: `'default' | 'glass' | 'gradient' | 'elevated' | 'minimal' | 'cards'`
|
|
34
|
+
- **Default**: `'default'`
|
|
35
|
+
- **Description**: Visual style variant of the carousel
|
|
36
|
+
|
|
37
|
+
### size
|
|
38
|
+
|
|
39
|
+
- **Type**: `'xs' | 'sm' | 'md' | 'lg' | 'xl'`
|
|
40
|
+
- **Default**: `'md'`
|
|
41
|
+
- **Description**: Size of the carousel
|
|
42
|
+
|
|
43
|
+
### color
|
|
44
|
+
|
|
45
|
+
- **Type**: `'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info'`
|
|
46
|
+
- **Default**: `'primary'`
|
|
47
|
+
- **Description**: Color theme for controls and visual effects
|
|
48
|
+
|
|
49
|
+
### autoPlay
|
|
50
|
+
|
|
51
|
+
- **Type**: `boolean`
|
|
52
|
+
- **Default**: `false`
|
|
53
|
+
- **Description**: Enable automatic slide progression
|
|
54
|
+
|
|
55
|
+
### autoPlayInterval
|
|
56
|
+
|
|
57
|
+
- **Type**: `number`
|
|
58
|
+
- **Default**: `3000`
|
|
59
|
+
- **Description**: Interval between auto-play slides in milliseconds
|
|
60
|
+
|
|
61
|
+
### loop
|
|
62
|
+
|
|
63
|
+
- **Type**: `boolean`
|
|
64
|
+
- **Default**: `true`
|
|
65
|
+
- **Description**: Enable looping when reaching first/last slide
|
|
66
|
+
|
|
67
|
+
### showIndicators
|
|
68
|
+
|
|
69
|
+
- **Type**: `boolean`
|
|
70
|
+
- **Default**: `true`
|
|
71
|
+
- **Description**: Show dot indicators for navigation
|
|
72
|
+
|
|
73
|
+
### showArrows
|
|
74
|
+
|
|
75
|
+
- **Type**: `boolean`
|
|
76
|
+
- **Default**: `true`
|
|
77
|
+
- **Description**: Show navigation arrows
|
|
78
|
+
|
|
79
|
+
### showThumbnails
|
|
80
|
+
|
|
81
|
+
- **Type**: `boolean`
|
|
82
|
+
- **Default**: `false`
|
|
83
|
+
- **Description**: Show thumbnail navigation
|
|
84
|
+
|
|
85
|
+
### pauseOnHover
|
|
86
|
+
|
|
87
|
+
- **Type**: `boolean`
|
|
88
|
+
- **Default**: `true`
|
|
89
|
+
- **Description**: Pause autoplay when hovering over the carousel
|
|
90
|
+
|
|
91
|
+
### animation
|
|
92
|
+
|
|
93
|
+
- **Type**: `'slide' | 'fade' | 'zoom' | 'flip'`
|
|
94
|
+
- **Default**: `'slide'`
|
|
95
|
+
- **Description**: Slide transition animation type
|
|
96
|
+
|
|
97
|
+
### height
|
|
98
|
+
|
|
99
|
+
- **Type**: `number | string`
|
|
100
|
+
- **Default**: `400`
|
|
101
|
+
- **Description**: Height of the carousel
|
|
102
|
+
|
|
103
|
+
### width
|
|
104
|
+
|
|
105
|
+
- **Type**: `number | string`
|
|
106
|
+
- **Default**: `'100%'`
|
|
107
|
+
- **Description**: Width of the carousel
|
|
108
|
+
|
|
109
|
+
### indicatorPosition
|
|
110
|
+
|
|
111
|
+
- **Type**: `'top' | 'bottom' | 'left' | 'right'`
|
|
112
|
+
- **Default**: `'bottom'`
|
|
113
|
+
- **Description**: Position of the indicator dots
|
|
114
|
+
|
|
115
|
+
### arrowPosition
|
|
116
|
+
|
|
117
|
+
- **Type**: `'overlay' | 'outside' | 'inside'`
|
|
118
|
+
- **Default**: `'overlay'`
|
|
119
|
+
- **Description**: Position of navigation arrows
|
|
120
|
+
|
|
121
|
+
### glow
|
|
122
|
+
|
|
123
|
+
- **Type**: `boolean`
|
|
124
|
+
- **Default**: `false`
|
|
125
|
+
- **Description**: Enable glow effect
|
|
126
|
+
|
|
127
|
+
### pulse
|
|
128
|
+
|
|
129
|
+
- **Type**: `boolean`
|
|
130
|
+
- **Default**: `false`
|
|
131
|
+
- **Description**: Enable pulsing animation
|
|
132
|
+
|
|
133
|
+
### glass
|
|
134
|
+
|
|
135
|
+
- **Type**: `boolean`
|
|
136
|
+
- **Default**: `false`
|
|
137
|
+
- **Description**: Enable glass morphism effect
|
|
138
|
+
|
|
139
|
+
### gradient
|
|
140
|
+
|
|
141
|
+
- **Type**: `boolean`
|
|
142
|
+
- **Default**: `false`
|
|
143
|
+
- **Description**: Enable gradient backgrounds
|
|
144
|
+
|
|
145
|
+
### loading
|
|
146
|
+
|
|
147
|
+
- **Type**: `boolean`
|
|
148
|
+
- **Default**: `false`
|
|
149
|
+
- **Description**: Show loading state
|
|
150
|
+
|
|
151
|
+
### disabled
|
|
152
|
+
|
|
153
|
+
- **Type**: `boolean`
|
|
154
|
+
- **Default**: `false`
|
|
155
|
+
- **Description**: Disable all carousel interactions
|
|
156
|
+
|
|
157
|
+
### onClick
|
|
158
|
+
|
|
159
|
+
- **Type**: `(item: CarouselItem, index: number) => void`
|
|
160
|
+
- **Description**: Callback when a carousel item is clicked
|
|
161
|
+
|
|
162
|
+
### onChange
|
|
163
|
+
|
|
164
|
+
- **Type**: `(index: number) => void`
|
|
165
|
+
- **Description**: Callback when the active slide changes
|
|
166
|
+
|
|
167
|
+
### onFocus
|
|
168
|
+
|
|
169
|
+
- **Type**: `FocusEventHandler<HTMLDivElement>`
|
|
170
|
+
- **Description**: Focus event handler
|
|
171
|
+
|
|
172
|
+
### onBlur
|
|
173
|
+
|
|
174
|
+
- **Type**: `FocusEventHandler<HTMLDivElement>`
|
|
175
|
+
- **Description**: Blur event handler
|
|
176
|
+
|
|
177
|
+
## Examples
|
|
178
|
+
|
|
179
|
+
### Basic Carousel
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
<Carousel
|
|
183
|
+
items={[
|
|
184
|
+
{ id: '1', content: 'Slide 1' },
|
|
185
|
+
{ id: '2', content: 'Slide 2' },
|
|
186
|
+
]}
|
|
187
|
+
/>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Autoplay with Thumbnails
|
|
191
|
+
|
|
192
|
+
```tsx
|
|
193
|
+
<Carousel
|
|
194
|
+
items={items}
|
|
195
|
+
autoPlay={true}
|
|
196
|
+
autoPlayInterval={5000}
|
|
197
|
+
showThumbnails={true}
|
|
198
|
+
pauseOnHover={true}
|
|
199
|
+
/>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Glass Effect with Gradient
|
|
203
|
+
|
|
204
|
+
```tsx
|
|
205
|
+
<Carousel items={items} variant="glass" gradient={true} glow={true} animation="fade" />
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Cards Layout
|
|
209
|
+
|
|
210
|
+
```tsx
|
|
211
|
+
<Carousel items={items} variant="cards" showArrows={true} arrowPosition="outside" size="lg" />
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Accessibility
|
|
215
|
+
|
|
216
|
+
- **Keyboard Navigation**: Supports arrow keys for navigation (Left/Right arrows)
|
|
217
|
+
- **ARIA Attributes**: Includes proper ARIA labels and roles for screen readers
|
|
218
|
+
- **Focus Management**: Maintains proper focus states and tab order
|
|
219
|
+
- **Screen Reader Support**: Announces slide changes and current position
|
|
220
|
+
- **Alt Text**: Supports alt text for images
|
|
221
|
+
- **Pause Controls**: Can be paused/resumed with keyboard
|
|
222
|
+
|
|
223
|
+
## Best Practices
|
|
224
|
+
|
|
225
|
+
1. **Content Structure**: Ensure carousel items have consistent structure for better user experience
|
|
226
|
+
2. **Image Optimization**: Use optimized images to improve performance
|
|
227
|
+
3. **Autoplay Consideration**: Consider user preference for motion when using autoplay
|
|
228
|
+
4. **Mobile Experience**: Test swipe gestures on touch devices
|
|
229
|
+
5. **Fallback Content**: Provide meaningful content when images fail to load
|
|
230
|
+
6. **Indicator Clarity**: Ensure indicators are visible against carousel content
|
|
231
|
+
7. **Performance**: Limit the number of items for better performance
|
|
232
|
+
|
|
233
|
+
## Related Components
|
|
234
|
+
|
|
235
|
+
- `Gallery`: For displaying image collections
|
|
236
|
+
- `Slider`: For numeric range selection
|
|
237
|
+
- `Tabs`: For switchable content panels
|
|
238
|
+
- `Timeline`: For chronological content display
|
|
239
|
+
|
|
240
|
+
## Testing
|
|
241
|
+
|
|
242
|
+
### Test IDs
|
|
243
|
+
|
|
244
|
+
#### Container Elements
|
|
245
|
+
|
|
246
|
+
##### `carousel-container`
|
|
247
|
+
- **Element:** Main Carousel container
|
|
248
|
+
- **Location:** Root Box element that wraps the entire carousel
|
|
249
|
+
- **Usage:** Query the main container to verify Carousel is rendered
|
|
250
|
+
```typescript
|
|
251
|
+
const container = await canvas.findByTestId('carousel-container');
|
|
252
|
+
expect(container).toBeInTheDocument();
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
##### `carousel-track`
|
|
256
|
+
- **Element:** Carousel slides container/track
|
|
257
|
+
- **Location:** Inner Box that contains all slides
|
|
258
|
+
- **Usage:** Query the track to verify it's rendered and check layout
|
|
259
|
+
```typescript
|
|
260
|
+
const track = await canvas.findByTestId('carousel-track');
|
|
261
|
+
expect(track).toBeInTheDocument();
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
#### Slide Elements
|
|
265
|
+
|
|
266
|
+
##### `carousel-slide-${index}`
|
|
267
|
+
- **Element:** Individual carousel slide
|
|
268
|
+
- **Location:** Each slide's container Box (one per carousel item, indexed from 0)
|
|
269
|
+
- **Usage:** Query specific slides by index
|
|
270
|
+
```typescript
|
|
271
|
+
// Get first slide
|
|
272
|
+
const firstSlide = await canvas.findByTestId('carousel-slide-0');
|
|
273
|
+
expect(firstSlide).toBeInTheDocument();
|
|
274
|
+
|
|
275
|
+
// Get all slides
|
|
276
|
+
const slides = await canvas.findAllByTestId(/carousel-slide-/);
|
|
277
|
+
expect(slides).toHaveLength(expectedCount);
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
##### `data-active` attribute
|
|
281
|
+
- **Element:** Added to active slide
|
|
282
|
+
- **Location:** On the currently visible slide's container
|
|
283
|
+
- **Usage:** Query to find which slide is currently active
|
|
284
|
+
```typescript
|
|
285
|
+
const activeSlide = canvasElement.querySelector('[data-testid^="carousel-slide-"][data-active="true"]');
|
|
286
|
+
expect(activeSlide).toHaveAttribute('data-testid', 'carousel-slide-0');
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
#### Navigation Elements
|
|
290
|
+
|
|
291
|
+
##### `carousel-navigation`
|
|
292
|
+
- **Element:** Navigation buttons container
|
|
293
|
+
- **Location:** Wrapper Box containing prev/next buttons
|
|
294
|
+
- **Usage:** Query navigation container to verify it's rendered
|
|
295
|
+
```typescript
|
|
296
|
+
const navigation = await canvas.findByTestId('carousel-navigation');
|
|
297
|
+
expect(navigation).toBeInTheDocument();
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
##### `carousel-prev-button`
|
|
301
|
+
- **Element:** Previous slide button
|
|
302
|
+
- **Location:** IconButton for navigating to previous slide
|
|
303
|
+
- **Usage:** Click to navigate backwards
|
|
304
|
+
```typescript
|
|
305
|
+
const prevButton = await canvas.findByTestId('carousel-prev-button');
|
|
306
|
+
await userEvent.click(prevButton);
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
##### `carousel-next-button`
|
|
310
|
+
- **Element:** Next slide button
|
|
311
|
+
- **Location:** IconButton for navigating to next slide
|
|
312
|
+
- **Usage:** Click to navigate forwards
|
|
313
|
+
```typescript
|
|
314
|
+
const nextButton = await canvas.findByTestId('carousel-next-button');
|
|
315
|
+
await userEvent.click(nextButton);
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
#### Indicator Elements
|
|
319
|
+
|
|
320
|
+
##### `carousel-indicators`
|
|
321
|
+
- **Element:** Indicators/dots container
|
|
322
|
+
- **Location:** Box containing all indicator dots/lines/numbers
|
|
323
|
+
- **Usage:** Query indicators container to verify it's rendered
|
|
324
|
+
```typescript
|
|
325
|
+
const indicators = await canvas.findByTestId('carousel-indicators');
|
|
326
|
+
expect(indicators).toBeInTheDocument();
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
##### `carousel-indicator-${index}`
|
|
330
|
+
- **Element:** Individual indicator (dot/line/number)
|
|
331
|
+
- **Location:** Each indicator element (one per slide, indexed from 0)
|
|
332
|
+
- **Usage:** Click to navigate to specific slide
|
|
333
|
+
```typescript
|
|
334
|
+
// Click third indicator
|
|
335
|
+
const thirdIndicator = await canvas.findByTestId('carousel-indicator-2');
|
|
336
|
+
await userEvent.click(thirdIndicator);
|
|
337
|
+
|
|
338
|
+
// Get all indicators
|
|
339
|
+
const indicators = await canvas.findAllByTestId(/carousel-indicator-/);
|
|
340
|
+
expect(indicators).toHaveLength(expectedCount);
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
##### `data-active` attribute on indicators
|
|
344
|
+
- **Element:** Added to active indicator
|
|
345
|
+
- **Location:** On the indicator for the currently visible slide
|
|
346
|
+
- **Usage:** Query to find which indicator is active
|
|
347
|
+
```typescript
|
|
348
|
+
const activeIndicator = canvasElement.querySelector('[data-testid^="carousel-indicator-"][data-active="true"]');
|
|
349
|
+
expect(activeIndicator).toHaveAttribute('data-testid', 'carousel-indicator-0');
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
#### Thumbnail Elements
|
|
353
|
+
|
|
354
|
+
##### `carousel-thumbnails`
|
|
355
|
+
- **Element:** Thumbnails container
|
|
356
|
+
- **Location:** Box containing all thumbnail images
|
|
357
|
+
- **Usage:** Query thumbnails container to verify it's rendered (only visible when `showThumbnails=true`)
|
|
358
|
+
```typescript
|
|
359
|
+
const thumbnails = await canvas.findByTestId('carousel-thumbnails');
|
|
360
|
+
expect(thumbnails).toBeInTheDocument();
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
##### `carousel-thumbnail-${index}`
|
|
364
|
+
- **Element:** Individual thumbnail
|
|
365
|
+
- **Location:** Each thumbnail Box (one per slide, indexed from 0)
|
|
366
|
+
- **Usage:** Click to navigate to specific slide
|
|
367
|
+
```typescript
|
|
368
|
+
// Click second thumbnail
|
|
369
|
+
const secondThumbnail = await canvas.findByTestId('carousel-thumbnail-1');
|
|
370
|
+
await userEvent.click(secondThumbnail);
|
|
371
|
+
|
|
372
|
+
// Get all thumbnails
|
|
373
|
+
const thumbnails = await canvas.findAllByTestId(/carousel-thumbnail-/);
|
|
374
|
+
expect(thumbnails).toHaveLength(expectedCount);
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
##### `data-active` attribute on thumbnails
|
|
378
|
+
- **Element:** Added to active thumbnail
|
|
379
|
+
- **Location:** On the thumbnail for the currently visible slide
|
|
380
|
+
- **Usage:** Query to find which thumbnail is active
|
|
381
|
+
```typescript
|
|
382
|
+
const activeThumbnail = canvasElement.querySelector('[data-testid^="carousel-thumbnail-"][data-active="true"]');
|
|
383
|
+
expect(activeThumbnail).toHaveAttribute('data-testid', 'carousel-thumbnail-0');
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Test Patterns
|
|
387
|
+
|
|
388
|
+
#### Wait for Carousel to Render
|
|
389
|
+
```typescript
|
|
390
|
+
import { waitFor, within } from 'storybook/test';
|
|
391
|
+
|
|
392
|
+
// Wait for container
|
|
393
|
+
const container = await canvas.findByTestId('carousel-container');
|
|
394
|
+
|
|
395
|
+
// Wait for track to render
|
|
396
|
+
await waitFor(async () => {
|
|
397
|
+
const track = await canvas.findByTestId('carousel-track');
|
|
398
|
+
expect(track).toBeInTheDocument();
|
|
399
|
+
}, { timeout: 3000 });
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
#### Verify Slide Navigation
|
|
403
|
+
```typescript
|
|
404
|
+
// Get initial active slide
|
|
405
|
+
const firstSlide = await canvas.findByTestId('carousel-slide-0');
|
|
406
|
+
expect(firstSlide).toHaveAttribute('data-active', 'true');
|
|
407
|
+
|
|
408
|
+
// Click next button
|
|
409
|
+
const nextButton = await canvas.findByTestId('carousel-next-button');
|
|
410
|
+
await userEvent.click(nextButton);
|
|
411
|
+
|
|
412
|
+
// Wait for slide transition
|
|
413
|
+
await waitFor(() => {
|
|
414
|
+
const secondSlide = canvas.getByTestId('carousel-slide-1');
|
|
415
|
+
expect(secondSlide).toHaveAttribute('data-active', 'true');
|
|
416
|
+
}, { timeout: 1000 });
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
#### Verify Indicator Navigation
|
|
420
|
+
```typescript
|
|
421
|
+
// Get all indicators
|
|
422
|
+
const indicators = await canvas.findAllByTestId(/carousel-indicator-/);
|
|
423
|
+
expect(indicators).toHaveLength(items.length);
|
|
424
|
+
|
|
425
|
+
// Click third indicator
|
|
426
|
+
await userEvent.click(indicators[2]);
|
|
427
|
+
|
|
428
|
+
// Verify third slide is active
|
|
429
|
+
await waitFor(() => {
|
|
430
|
+
const thirdSlide = canvas.getByTestId('carousel-slide-2');
|
|
431
|
+
expect(thirdSlide).toHaveAttribute('data-active', 'true');
|
|
432
|
+
}, { timeout: 1000 });
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
#### Test Autoplay Functionality
|
|
436
|
+
```typescript
|
|
437
|
+
// Wait for initial render
|
|
438
|
+
const container = await canvas.findByTestId('carousel-container');
|
|
439
|
+
|
|
440
|
+
// First slide should be active
|
|
441
|
+
let activeSlide = canvasElement.querySelector('[data-active="true"]');
|
|
442
|
+
expect(activeSlide).toHaveAttribute('data-testid', 'carousel-slide-0');
|
|
443
|
+
|
|
444
|
+
// Wait for autoplay to advance
|
|
445
|
+
await waitFor(() => {
|
|
446
|
+
activeSlide = canvasElement.querySelector('[data-testid^="carousel-slide-"][data-active="true"]');
|
|
447
|
+
expect(activeSlide).toHaveAttribute('data-testid', 'carousel-slide-1');
|
|
448
|
+
}, { timeout: 5000 });
|
|
449
|
+
|
|
450
|
+
// Test pause on hover
|
|
451
|
+
await userEvent.hover(container);
|
|
452
|
+
|
|
453
|
+
// Wait to ensure it doesn't advance
|
|
454
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
455
|
+
|
|
456
|
+
// Should still be on second slide
|
|
457
|
+
activeSlide = canvasElement.querySelector('[data-active="true"]');
|
|
458
|
+
expect(activeSlide).toHaveAttribute('data-testid', 'carousel-slide-1');
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
#### Verify Thumbnails
|
|
462
|
+
```typescript
|
|
463
|
+
// Check if thumbnails are visible
|
|
464
|
+
const thumbnailsContainer = await canvas.findByTestId('carousel-thumbnails');
|
|
465
|
+
expect(thumbnailsContainer).toBeInTheDocument();
|
|
466
|
+
|
|
467
|
+
// Get all thumbnails
|
|
468
|
+
const thumbnails = await canvas.findAllByTestId(/carousel-thumbnail-/);
|
|
469
|
+
expect(thumbnails).toHaveLength(items.length);
|
|
470
|
+
|
|
471
|
+
// Click fourth thumbnail
|
|
472
|
+
await userEvent.click(thumbnails[3]);
|
|
473
|
+
|
|
474
|
+
// Verify fourth slide is active
|
|
475
|
+
await waitFor(() => {
|
|
476
|
+
const fourthSlide = canvas.getByTestId('carousel-slide-3');
|
|
477
|
+
expect(fourthSlide).toHaveAttribute('data-active', 'true');
|
|
478
|
+
}, { timeout: 1000 });
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
#### Check Navigation Button States
|
|
482
|
+
```typescript
|
|
483
|
+
// When loop=false and at first slide, prev should be disabled
|
|
484
|
+
const prevButton = await canvas.findByTestId('carousel-prev-button');
|
|
485
|
+
expect(prevButton).toBeDisabled();
|
|
486
|
+
|
|
487
|
+
// Navigate to last slide
|
|
488
|
+
const indicators = await canvas.findAllByTestId(/carousel-indicator-/);
|
|
489
|
+
await userEvent.click(indicators[indicators.length - 1]);
|
|
490
|
+
|
|
491
|
+
await waitFor(() => {
|
|
492
|
+
const lastSlide = canvas.getByTestId(`carousel-slide-${items.length - 1}`);
|
|
493
|
+
expect(lastSlide).toHaveAttribute('data-active', 'true');
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
// Next button should be disabled at last slide
|
|
497
|
+
const nextButton = await canvas.findByTestId('carousel-next-button');
|
|
498
|
+
expect(nextButton).toBeDisabled();
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
#### Test Multiple Navigation Methods
|
|
502
|
+
```typescript
|
|
503
|
+
// Navigate using next button
|
|
504
|
+
const nextButton = await canvas.findByTestId('carousel-next-button');
|
|
505
|
+
await userEvent.click(nextButton);
|
|
506
|
+
|
|
507
|
+
await waitFor(() => {
|
|
508
|
+
expect(canvas.getByTestId('carousel-slide-1')).toHaveAttribute('data-active', 'true');
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
// Navigate using indicator
|
|
512
|
+
const thirdIndicator = await canvas.findByTestId('carousel-indicator-2');
|
|
513
|
+
await userEvent.click(thirdIndicator);
|
|
514
|
+
|
|
515
|
+
await waitFor(() => {
|
|
516
|
+
expect(canvas.getByTestId('carousel-slide-2')).toHaveAttribute('data-active', 'true');
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
// Navigate using thumbnail
|
|
520
|
+
const firstThumbnail = await canvas.findByTestId('carousel-thumbnail-0');
|
|
521
|
+
await userEvent.click(firstThumbnail);
|
|
522
|
+
|
|
523
|
+
await waitFor(() => {
|
|
524
|
+
expect(canvas.getByTestId('carousel-slide-0')).toHaveAttribute('data-active', 'true');
|
|
525
|
+
});
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
### Props That Affect Test Behavior
|
|
529
|
+
|
|
530
|
+
#### `variant`
|
|
531
|
+
- **Values:** `'default' | 'glass' | 'gradient' | 'elevated' | 'minimal' | 'cards'`
|
|
532
|
+
- **Impact:** Changes visual styling but not testId structure
|
|
533
|
+
- **Test Tip:** Use same testIds regardless of variant
|
|
534
|
+
|
|
535
|
+
#### `showArrows`
|
|
536
|
+
- **Values:** `boolean` (default: `true`)
|
|
537
|
+
- **Impact:** When `false`, navigation buttons are not rendered
|
|
538
|
+
- **Test Tip:** Use `queryByTestId` to check for absence
|
|
539
|
+
|
|
540
|
+
#### `showIndicators`
|
|
541
|
+
- **Values:** `boolean` (default: `true`)
|
|
542
|
+
- **Impact:** When `false`, indicators are not rendered
|
|
543
|
+
- **Test Tip:** Use `queryByTestId` to check for absence
|
|
544
|
+
|
|
545
|
+
#### `showThumbnails`
|
|
546
|
+
- **Values:** `boolean` (default: `false`)
|
|
547
|
+
- **Impact:** When `true`, thumbnails container is rendered
|
|
548
|
+
- **Test Tip:** Thumbnails only visible when explicitly enabled
|
|
549
|
+
|
|
550
|
+
#### `autoPlay`
|
|
551
|
+
- **Values:** `boolean` (default: `false`)
|
|
552
|
+
- **Impact:** Automatically advances slides at `autoPlayInterval`
|
|
553
|
+
- **Test Tip:** Use `waitFor` with appropriate timeout
|
|
554
|
+
|
|
555
|
+
#### `autoPlayInterval`
|
|
556
|
+
- **Values:** `number` (milliseconds, default: `3000`)
|
|
557
|
+
- **Impact:** Time between automatic slide transitions
|
|
558
|
+
- **Test Tip:** Adjust `waitFor` timeout based on interval
|
|
559
|
+
|
|
560
|
+
#### `pauseOnHover`
|
|
561
|
+
- **Values:** `boolean` (default: `true`)
|
|
562
|
+
- **Impact:** Pauses autoplay when hovering over carousel
|
|
563
|
+
- **Test Tip:** Test with `userEvent.hover()` and `userEvent.unhover()`
|
|
564
|
+
|
|
565
|
+
#### `loop`
|
|
566
|
+
- **Values:** `boolean` (default: `true`)
|
|
567
|
+
- **Impact:**
|
|
568
|
+
- When `false`: Navigation buttons disabled at boundaries
|
|
569
|
+
- When `true`: Carousel loops from last to first slide
|
|
570
|
+
- **Test Tip:** Test button disabled states at first/last slides
|
|
571
|
+
|
|
572
|
+
#### `animation`
|
|
573
|
+
- **Values:** `'slide' | 'fade' | 'zoom' | 'flip'` (default: `'slide'`)
|
|
574
|
+
- **Impact:** Changes transition animation
|
|
575
|
+
- **Test Tip:** Use `waitFor` to account for animation duration
|
|
576
|
+
|
|
577
|
+
#### `disabled`
|
|
578
|
+
- **Values:** `boolean` (default: `false`)
|
|
579
|
+
- **Impact:** Disables all navigation when `true`
|
|
580
|
+
- **Test Tip:** Verify all buttons are disabled
|
|
581
|
+
|
|
582
|
+
#### `loading`
|
|
583
|
+
- **Values:** `boolean` (default: `false`)
|
|
584
|
+
- **Impact:** Shows CircularProgress instead of slides
|
|
585
|
+
- **Test Tip:** Carousel content not rendered when loading
|
|
586
|
+
|
|
587
|
+
### Common Test Scenarios
|
|
588
|
+
|
|
589
|
+
#### 1. Basic Rendering Test
|
|
590
|
+
```typescript
|
|
591
|
+
play: async ({ canvasElement }) => {
|
|
592
|
+
const canvas = within(canvasElement);
|
|
593
|
+
|
|
594
|
+
// Wait for carousel to render
|
|
595
|
+
const container = await canvas.findByTestId('carousel-container');
|
|
596
|
+
expect(container).toBeInTheDocument();
|
|
597
|
+
|
|
598
|
+
// Verify track is rendered
|
|
599
|
+
const track = await canvas.findByTestId('carousel-track');
|
|
600
|
+
expect(track).toBeInTheDocument();
|
|
601
|
+
|
|
602
|
+
// Verify correct number of slides
|
|
603
|
+
const slides = await canvas.findAllByTestId(/carousel-slide-/);
|
|
604
|
+
expect(slides).toHaveLength(expectedCount);
|
|
605
|
+
}
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
#### 2. Navigation Test
|
|
609
|
+
```typescript
|
|
610
|
+
play: async ({ canvasElement }) => {
|
|
611
|
+
const canvas = within(canvasElement);
|
|
612
|
+
|
|
613
|
+
// Wait for render
|
|
614
|
+
await canvas.findByTestId('carousel-container');
|
|
615
|
+
|
|
616
|
+
// Test next button
|
|
617
|
+
const nextButton = await canvas.findByTestId('carousel-next-button');
|
|
618
|
+
await userEvent.click(nextButton);
|
|
619
|
+
|
|
620
|
+
await waitFor(() => {
|
|
621
|
+
const secondSlide = canvas.getByTestId('carousel-slide-1');
|
|
622
|
+
expect(secondSlide).toHaveAttribute('data-active', 'true');
|
|
623
|
+
}, { timeout: 1000 });
|
|
624
|
+
|
|
625
|
+
// Test previous button
|
|
626
|
+
const prevButton = await canvas.findByTestId('carousel-prev-button');
|
|
627
|
+
await userEvent.click(prevButton);
|
|
628
|
+
|
|
629
|
+
await waitFor(() => {
|
|
630
|
+
const firstSlide = canvas.getByTestId('carousel-slide-0');
|
|
631
|
+
expect(firstSlide).toHaveAttribute('data-active', 'true');
|
|
632
|
+
}, { timeout: 1000 });
|
|
633
|
+
}
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
#### 3. Indicator Navigation Test
|
|
637
|
+
```typescript
|
|
638
|
+
play: async ({ canvasElement }) => {
|
|
639
|
+
const canvas = within(canvasElement);
|
|
640
|
+
|
|
641
|
+
await canvas.findByTestId('carousel-container');
|
|
642
|
+
|
|
643
|
+
// Get all indicators
|
|
644
|
+
const indicators = await canvas.findAllByTestId(/carousel-indicator-/);
|
|
645
|
+
expect(indicators).toHaveLength(expectedCount);
|
|
646
|
+
|
|
647
|
+
// Click third indicator
|
|
648
|
+
await userEvent.click(indicators[2]);
|
|
649
|
+
|
|
650
|
+
// Verify third slide is active
|
|
651
|
+
await waitFor(() => {
|
|
652
|
+
const thirdSlide = canvas.getByTestId('carousel-slide-2');
|
|
653
|
+
expect(thirdSlide).toHaveAttribute('data-active', 'true');
|
|
654
|
+
}, { timeout: 1000 });
|
|
655
|
+
|
|
656
|
+
// Verify third indicator is active
|
|
657
|
+
expect(indicators[2]).toHaveAttribute('data-active', 'true');
|
|
658
|
+
}
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
#### 4. Thumbnail Navigation Test
|
|
662
|
+
```typescript
|
|
663
|
+
play: async ({ canvasElement }) => {
|
|
664
|
+
const canvas = within(canvasElement);
|
|
665
|
+
|
|
666
|
+
await canvas.findByTestId('carousel-container');
|
|
667
|
+
|
|
668
|
+
// Verify thumbnails are rendered
|
|
669
|
+
const thumbnailsContainer = await canvas.findByTestId('carousel-thumbnails');
|
|
670
|
+
expect(thumbnailsContainer).toBeInTheDocument();
|
|
671
|
+
|
|
672
|
+
// Get all thumbnails
|
|
673
|
+
const thumbnails = await canvas.findAllByTestId(/carousel-thumbnail-/);
|
|
674
|
+
expect(thumbnails).toHaveLength(expectedCount);
|
|
675
|
+
|
|
676
|
+
// Click second thumbnail
|
|
677
|
+
await userEvent.click(thumbnails[1]);
|
|
678
|
+
|
|
679
|
+
// Verify second slide is active
|
|
680
|
+
await waitFor(() => {
|
|
681
|
+
const secondSlide = canvas.getByTestId('carousel-slide-1');
|
|
682
|
+
expect(secondSlide).toHaveAttribute('data-active', 'true');
|
|
683
|
+
}, { timeout: 1000 });
|
|
684
|
+
}
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
#### 5. Autoplay Test
|
|
688
|
+
```typescript
|
|
689
|
+
play: async ({ canvasElement }) => {
|
|
690
|
+
const canvas = within(canvasElement);
|
|
691
|
+
|
|
692
|
+
const container = await canvas.findByTestId('carousel-container');
|
|
693
|
+
|
|
694
|
+
// First slide should be active
|
|
695
|
+
expect(canvas.getByTestId('carousel-slide-0')).toHaveAttribute('data-active', 'true');
|
|
696
|
+
|
|
697
|
+
// Wait for autoplay to advance (assuming 2000ms interval)
|
|
698
|
+
await waitFor(() => {
|
|
699
|
+
expect(canvas.getByTestId('carousel-slide-1')).toHaveAttribute('data-active', 'true');
|
|
700
|
+
}, { timeout: 3000 });
|
|
701
|
+
|
|
702
|
+
// Test pause on hover
|
|
703
|
+
await userEvent.hover(container);
|
|
704
|
+
|
|
705
|
+
// Wait to ensure it doesn't advance
|
|
706
|
+
await new Promise((resolve) => setTimeout(resolve, 2500));
|
|
707
|
+
|
|
708
|
+
// Should still be on second slide
|
|
709
|
+
expect(canvas.getByTestId('carousel-slide-1')).toHaveAttribute('data-active', 'true');
|
|
710
|
+
}
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
#### 6. Accessibility Test
|
|
714
|
+
```typescript
|
|
715
|
+
play: async ({ canvasElement }) => {
|
|
716
|
+
const canvas = within(canvasElement);
|
|
717
|
+
|
|
718
|
+
await canvas.findByTestId('carousel-container');
|
|
719
|
+
|
|
720
|
+
// Check navigation buttons have labels
|
|
721
|
+
const prevButton = await canvas.findByTestId('carousel-prev-button');
|
|
722
|
+
expect(prevButton).toHaveAttribute('aria-label', 'Previous slide');
|
|
723
|
+
|
|
724
|
+
const nextButton = await canvas.findByTestId('carousel-next-button');
|
|
725
|
+
expect(nextButton).toHaveAttribute('aria-label', 'Next slide');
|
|
726
|
+
|
|
727
|
+
// Check indicators have labels
|
|
728
|
+
const firstIndicator = await canvas.findByTestId('carousel-indicator-0');
|
|
729
|
+
expect(firstIndicator).toHaveAttribute('aria-label', 'Go to slide 1');
|
|
730
|
+
}
|
|
731
|
+
```
|
|
732
|
+
|
|
733
|
+
### Troubleshooting
|
|
734
|
+
|
|
735
|
+
#### Issue: "Unable to find element with testId X"
|
|
736
|
+
|
|
737
|
+
**Solution:** Always use `await` with `findByTestId`:
|
|
738
|
+
```typescript
|
|
739
|
+
// Wrong - synchronous
|
|
740
|
+
const element = canvas.getByTestId('carousel-container');
|
|
741
|
+
|
|
742
|
+
// Correct - asynchronous
|
|
743
|
+
const element = await canvas.findByTestId('carousel-container');
|
|
744
|
+
```
|
|
745
|
+
|
|
746
|
+
#### Issue: Test fails intermittently with slide transitions
|
|
747
|
+
|
|
748
|
+
**Solution:** Use `waitFor` with proper timeout for animations:
|
|
749
|
+
```typescript
|
|
750
|
+
await waitFor(() => {
|
|
751
|
+
const slide = canvas.getByTestId('carousel-slide-1');
|
|
752
|
+
expect(slide).toHaveAttribute('data-active', 'true');
|
|
753
|
+
}, { timeout: 1000 }); // Adjust based on transition duration
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
#### Issue: Can't find active slide
|
|
757
|
+
|
|
758
|
+
**Solution:** Use `data-active` attribute or query by visibility:
|
|
759
|
+
```typescript
|
|
760
|
+
// Option 1: Query by data-active attribute
|
|
761
|
+
const activeSlide = canvasElement.querySelector('[data-testid^="carousel-slide-"][data-active="true"]');
|
|
762
|
+
|
|
763
|
+
// Option 2: Check all slides and find the active one
|
|
764
|
+
const slides = await canvas.findAllByTestId(/carousel-slide-/);
|
|
765
|
+
const activeSlide = slides.find(slide => slide.getAttribute('data-active') === 'true');
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
#### Issue: Navigation buttons not found
|
|
769
|
+
|
|
770
|
+
**Solution:** Check if `showArrows` prop is true. Use `queryByTestId` to check for absence:
|
|
771
|
+
```typescript
|
|
772
|
+
// When showArrows=false
|
|
773
|
+
const nextButton = canvas.queryByTestId('carousel-next-button');
|
|
774
|
+
expect(nextButton).not.toBeInTheDocument();
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
#### Issue: Indicators not rendering
|
|
778
|
+
|
|
779
|
+
**Solution:** Check if `showIndicators` prop is true:
|
|
780
|
+
```typescript
|
|
781
|
+
// When showIndicators=true
|
|
782
|
+
const indicators = await canvas.findByTestId('carousel-indicators');
|
|
783
|
+
expect(indicators).toBeInTheDocument();
|
|
784
|
+
|
|
785
|
+
// When showIndicators=false
|
|
786
|
+
const indicators = canvas.queryByTestId('carousel-indicators');
|
|
787
|
+
expect(indicators).not.toBeInTheDocument();
|
|
788
|
+
```
|
|
789
|
+
|
|
790
|
+
#### Issue: Autoplay doesn't advance
|
|
791
|
+
|
|
792
|
+
**Solution:** Check `autoPlay` prop and `pauseOnHover` behavior:
|
|
793
|
+
```typescript
|
|
794
|
+
// Ensure not hovering if pauseOnHover=true
|
|
795
|
+
const container = await canvas.findByTestId('carousel-container');
|
|
796
|
+
await userEvent.unhover(container);
|
|
797
|
+
|
|
798
|
+
// Wait with appropriate timeout based on autoPlayInterval
|
|
799
|
+
await waitFor(() => {
|
|
800
|
+
expect(canvas.getByTestId('carousel-slide-1')).toHaveAttribute('data-active', 'true');
|
|
801
|
+
}, { timeout: autoPlayInterval + 1000 });
|
|
802
|
+
```
|
|
803
|
+
|
|
804
|
+
### Best Practices
|
|
805
|
+
|
|
806
|
+
1. **Always use async/await** with testId queries in Storybook tests
|
|
807
|
+
2. **Use `waitFor`** when testing components with animations or transitions
|
|
808
|
+
3. **Scope queries** with `within()` when looking inside specific containers
|
|
809
|
+
4. **Use regex patterns** for dynamic testIds: `/carousel-slide-/`, `/carousel-indicator-/`
|
|
810
|
+
5. **Add timeouts** for animated transitions: `{ timeout: 1000 }`
|
|
811
|
+
6. **Check `data-active` attribute** to verify active state instead of relying on CSS
|
|
812
|
+
7. **Use `queryByTestId`** when checking for elements that may not exist
|
|
813
|
+
8. **Test all navigation methods** (arrows, indicators, thumbnails) independently
|
|
814
|
+
9. **Account for autoplay intervals** in timeout values
|
|
815
|
+
10. **Unhover elements** before testing autoplay to avoid pause-on-hover
|