@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,684 @@
|
|
|
1
|
+
# Transition Component
|
|
2
|
+
|
|
3
|
+
A flexible and comprehensive transition wrapper component that provides smooth animations for UI elements using Material-UI's transition components.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The Transition component wraps content and applies various animation effects when elements enter or leave the DOM. It supports multiple transition variants including fade, slide, scale, collapse, grow, and zoom, with customizable timing, easing, and directional options.
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- **Multiple Transition Variants**: Choose from fade, slide, scale, collapse, grow, or zoom animations
|
|
12
|
+
- **Directional Control**: Slide transitions support up, down, left, and right directions
|
|
13
|
+
- **Customizable Timing**: Configure duration and delay for precise control
|
|
14
|
+
- **Theme Integration**: Automatically uses Material-UI theme values for consistent animations
|
|
15
|
+
- **Intelligent Defaults**: Each variant has optimized default timing and easing values
|
|
16
|
+
- **Flexible Configuration**: Supports both simple number values and complex enter/exit objects
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
### Basic Usage
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { Transition } from '@procurement/ui';
|
|
24
|
+
|
|
25
|
+
// Simple fade transition
|
|
26
|
+
<Transition variant="fade" in={show}>
|
|
27
|
+
<Card>Your content here</Card>
|
|
28
|
+
</Transition>;
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### With Direction (Slide)
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
<Transition variant="slide" direction="up" in={show}>
|
|
35
|
+
<Card>Slides up from bottom</Card>
|
|
36
|
+
</Transition>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Custom Timing
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
<Transition
|
|
43
|
+
variant="fade"
|
|
44
|
+
in={show}
|
|
45
|
+
duration={500} // 500ms duration
|
|
46
|
+
delay={200} // 200ms delay before starting
|
|
47
|
+
>
|
|
48
|
+
<Card>Custom timing</Card>
|
|
49
|
+
</Transition>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Complex Duration/Easing
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
<Transition
|
|
56
|
+
variant="scale"
|
|
57
|
+
in={show}
|
|
58
|
+
duration={{ enter: 300, exit: 200 }}
|
|
59
|
+
easing={{ enter: 'ease-out', exit: 'ease-in' }}
|
|
60
|
+
>
|
|
61
|
+
<Card>Different enter/exit timing</Card>
|
|
62
|
+
</Transition>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Props
|
|
66
|
+
|
|
67
|
+
| Prop | Type | Default | Description |
|
|
68
|
+
| ----------- | ---------------------------------------------------------------- | ------------- | ---------------------------------- |
|
|
69
|
+
| `children` | `ReactNode` | - | Content to animate |
|
|
70
|
+
| `variant` | `'fade' \| 'slide' \| 'scale' \| 'collapse' \| 'grow' \| 'zoom'` | `'fade'` | Type of transition animation |
|
|
71
|
+
| `in` | `boolean` | - | Controls whether content is shown |
|
|
72
|
+
| `direction` | `'up' \| 'down' \| 'left' \| 'right'` | `'up'` | Direction for slide transitions |
|
|
73
|
+
| `duration` | `number \| { enter: number, exit: number }` | Theme default | Animation duration in milliseconds |
|
|
74
|
+
| `delay` | `number` | `0` | Delay before animation starts |
|
|
75
|
+
| `easing` | `string \| { enter: string, exit: string }` | Theme default | CSS easing function |
|
|
76
|
+
|
|
77
|
+
## Transition Variants
|
|
78
|
+
|
|
79
|
+
### Fade
|
|
80
|
+
|
|
81
|
+
Smoothly transitions opacity from 0 to 1. Best for subtle entrances and exits.
|
|
82
|
+
|
|
83
|
+
### Slide
|
|
84
|
+
|
|
85
|
+
Slides content in from a specified direction. Perfect for panels, drawers, and directional reveals.
|
|
86
|
+
|
|
87
|
+
### Scale/Grow
|
|
88
|
+
|
|
89
|
+
Scales content from 0 to full size from the center point. Great for popups and emphasis.
|
|
90
|
+
|
|
91
|
+
### Collapse
|
|
92
|
+
|
|
93
|
+
Animates height from 0 to auto. Ideal for expandable sections and accordions.
|
|
94
|
+
|
|
95
|
+
### Zoom
|
|
96
|
+
|
|
97
|
+
Sharp zoom effect with scaling transform. Good for dramatic entrances.
|
|
98
|
+
|
|
99
|
+
## Accessibility
|
|
100
|
+
|
|
101
|
+
- Respects user's motion preferences via `prefers-reduced-motion`
|
|
102
|
+
- Properly manages focus during transitions
|
|
103
|
+
- Maintains ARIA attributes on wrapped content
|
|
104
|
+
- Supports keyboard navigation through transitioned elements
|
|
105
|
+
|
|
106
|
+
## Best Practices
|
|
107
|
+
|
|
108
|
+
1. **Choose Appropriate Variants**: Use fade for subtle changes, slide for directional movement, and scale/zoom for emphasis
|
|
109
|
+
2. **Consistent Timing**: Use theme-based durations for consistency across your app
|
|
110
|
+
3. **Performance**: Avoid transitioning too many elements simultaneously
|
|
111
|
+
4. **Mobile Considerations**: Test transitions on lower-powered devices
|
|
112
|
+
5. **Accessibility**: Provide options to disable animations for users who prefer reduced motion
|
|
113
|
+
|
|
114
|
+
## Examples
|
|
115
|
+
|
|
116
|
+
### Notification Banner
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
<Transition variant="slide" direction="down" in={showNotification}>
|
|
120
|
+
<Alert severity="info">New message received!</Alert>
|
|
121
|
+
</Transition>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Modal Overlay
|
|
125
|
+
|
|
126
|
+
```tsx
|
|
127
|
+
<Transition variant="fade" in={modalOpen} duration={300}>
|
|
128
|
+
<Backdrop />
|
|
129
|
+
</Transition>
|
|
130
|
+
<Transition variant="scale" in={modalOpen} delay={100}>
|
|
131
|
+
<Modal>Content</Modal>
|
|
132
|
+
</Transition>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Collapsible FAQ
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
<Transition variant="collapse" in={expanded}>
|
|
139
|
+
<Box>
|
|
140
|
+
<Typography>Answer content that expands/collapses</Typography>
|
|
141
|
+
</Box>
|
|
142
|
+
</Transition>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Related Components
|
|
146
|
+
|
|
147
|
+
- [Portal](../Portal) - For rendering content outside the DOM hierarchy
|
|
148
|
+
- [Modal](../../feedback/Modal) - Uses transitions for overlay effects
|
|
149
|
+
- [Drawer](../../layout/Drawer) - Implements slide transitions
|
|
150
|
+
- [Accordion](../../layout/Accordion) - Uses collapse transitions
|
|
151
|
+
|
|
152
|
+
## Testing
|
|
153
|
+
|
|
154
|
+
This section describes all `data-testid` attributes available in the Transition component for testing purposes. The Transition component wraps Material-UI transition components (Fade, Slide, Grow, Collapse, Zoom) with consistent test IDs.
|
|
155
|
+
|
|
156
|
+
### Test IDs
|
|
157
|
+
|
|
158
|
+
#### Container Elements
|
|
159
|
+
|
|
160
|
+
##### `transition-wrapper`
|
|
161
|
+
- **Element:** MUI Transition component wrapper (Fade, Slide, Grow, Collapse, or Zoom)
|
|
162
|
+
- **Location:** Root transition component that handles animation
|
|
163
|
+
- **Usage:** Query the main transition wrapper to verify component is rendered and check transition state
|
|
164
|
+
```typescript
|
|
165
|
+
const wrapper = await canvas.findByTestId('transition-wrapper');
|
|
166
|
+
expect(wrapper).toBeInTheDocument();
|
|
167
|
+
|
|
168
|
+
// Check if transition is active (in prop)
|
|
169
|
+
const style = window.getComputedStyle(wrapper);
|
|
170
|
+
expect(style.visibility).toBe('visible'); // When in=true
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
##### `transition-element`
|
|
174
|
+
- **Element:** Inner div that receives the transition effects
|
|
175
|
+
- **Location:** Direct child of the transition wrapper, contains the content
|
|
176
|
+
- **Usage:** Query the element being transitioned to check animation properties
|
|
177
|
+
```typescript
|
|
178
|
+
const element = await canvas.findByTestId('transition-element');
|
|
179
|
+
expect(element).toBeInTheDocument();
|
|
180
|
+
|
|
181
|
+
// Check opacity during fade transition
|
|
182
|
+
const style = window.getComputedStyle(element);
|
|
183
|
+
expect(parseFloat(style.opacity)).toBeGreaterThan(0);
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
##### `transition-content`
|
|
187
|
+
- **Element:** Content container div
|
|
188
|
+
- **Location:** Innermost div that wraps the actual children content
|
|
189
|
+
- **Usage:** Query the content container to access child elements
|
|
190
|
+
```typescript
|
|
191
|
+
const content = await canvas.findByTestId('transition-content');
|
|
192
|
+
const childText = within(content).getByText('Expected content');
|
|
193
|
+
expect(childText).toBeInTheDocument();
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Test Patterns
|
|
197
|
+
|
|
198
|
+
#### Wait for Transition to Complete
|
|
199
|
+
|
|
200
|
+
##### Fade Transition
|
|
201
|
+
```typescript
|
|
202
|
+
import { waitFor, within } from 'storybook/test';
|
|
203
|
+
|
|
204
|
+
// Wait for element to fade in
|
|
205
|
+
const element = await canvas.findByTestId('transition-element');
|
|
206
|
+
|
|
207
|
+
await waitFor(() => {
|
|
208
|
+
const style = window.getComputedStyle(element);
|
|
209
|
+
expect(parseFloat(style.opacity)).toBe(1);
|
|
210
|
+
}, { timeout: 3000 });
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
##### Slide Transition
|
|
214
|
+
```typescript
|
|
215
|
+
// Wait for slide transition to complete
|
|
216
|
+
const element = await canvas.findByTestId('transition-element');
|
|
217
|
+
|
|
218
|
+
await waitFor(() => {
|
|
219
|
+
const style = window.getComputedStyle(element);
|
|
220
|
+
const transform = style.transform;
|
|
221
|
+
// Check that transform is identity matrix (no translation)
|
|
222
|
+
expect(transform).toBe('none') || expect(transform).toContain('matrix(1, 0, 0, 1, 0, 0)');
|
|
223
|
+
}, { timeout: 3000 });
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
##### Grow/Scale Transition
|
|
227
|
+
```typescript
|
|
228
|
+
// Wait for scale transition to complete
|
|
229
|
+
const element = await canvas.findByTestId('transition-element');
|
|
230
|
+
|
|
231
|
+
await waitFor(() => {
|
|
232
|
+
const style = window.getComputedStyle(element);
|
|
233
|
+
const transform = style.transform;
|
|
234
|
+
// Check that scale is 1 (fully grown)
|
|
235
|
+
expect(transform).toContain('scale(1)') || expect(transform).toBe('none');
|
|
236
|
+
}, { timeout: 3000 });
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
##### Collapse Transition
|
|
240
|
+
```typescript
|
|
241
|
+
// Wait for collapse/expand transition to complete
|
|
242
|
+
const element = await canvas.findByTestId('transition-element');
|
|
243
|
+
|
|
244
|
+
await waitFor(() => {
|
|
245
|
+
const style = window.getComputedStyle(element);
|
|
246
|
+
// When expanded, height should be auto or specific value
|
|
247
|
+
expect(parseInt(style.height)).toBeGreaterThan(0);
|
|
248
|
+
}, { timeout: 3000 });
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
##### Zoom Transition
|
|
252
|
+
```typescript
|
|
253
|
+
// Wait for zoom transition to complete
|
|
254
|
+
const element = await canvas.findByTestId('transition-element');
|
|
255
|
+
|
|
256
|
+
await waitFor(() => {
|
|
257
|
+
const style = window.getComputedStyle(element);
|
|
258
|
+
expect(parseFloat(style.opacity)).toBe(1);
|
|
259
|
+
const transform = style.transform;
|
|
260
|
+
expect(transform).toBe('none') || expect(transform).toContain('scale(1)');
|
|
261
|
+
}, { timeout: 3000 });
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
#### Testing Animation States
|
|
265
|
+
|
|
266
|
+
##### Check if Transition is Entering
|
|
267
|
+
```typescript
|
|
268
|
+
// Immediately after triggering in=true
|
|
269
|
+
const wrapper = await canvas.findByTestId('transition-wrapper');
|
|
270
|
+
|
|
271
|
+
// Element should be visible but possibly not fully transitioned
|
|
272
|
+
expect(wrapper).toBeVisible();
|
|
273
|
+
|
|
274
|
+
// Check intermediate state (opacity between 0 and 1 for fade)
|
|
275
|
+
const element = await canvas.findByTestId('transition-element');
|
|
276
|
+
const style = window.getComputedStyle(element);
|
|
277
|
+
const opacity = parseFloat(style.opacity);
|
|
278
|
+
expect(opacity).toBeGreaterThanOrEqual(0);
|
|
279
|
+
expect(opacity).toBeLessThanOrEqual(1);
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
##### Check if Transition is Exiting
|
|
283
|
+
```typescript
|
|
284
|
+
// After setting in=false
|
|
285
|
+
const element = await canvas.findByTestId('transition-element');
|
|
286
|
+
|
|
287
|
+
// For fade: opacity should be decreasing
|
|
288
|
+
await waitFor(() => {
|
|
289
|
+
const style = window.getComputedStyle(element);
|
|
290
|
+
expect(parseFloat(style.opacity)).toBeLessThan(1);
|
|
291
|
+
}, { timeout: 1000 });
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
##### Check if Transition is Fully Entered
|
|
295
|
+
```typescript
|
|
296
|
+
// Wait for transition to complete
|
|
297
|
+
const element = await canvas.findByTestId('transition-element');
|
|
298
|
+
|
|
299
|
+
await waitFor(() => {
|
|
300
|
+
const style = window.getComputedStyle(element);
|
|
301
|
+
// For fade: opacity should be 1
|
|
302
|
+
expect(parseFloat(style.opacity)).toBe(1);
|
|
303
|
+
// Element should be fully visible
|
|
304
|
+
expect(element).toBeVisible();
|
|
305
|
+
}, { timeout: 3000 });
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
#### Testing CSS Properties During Transitions
|
|
309
|
+
|
|
310
|
+
##### Opacity (Fade/Zoom)
|
|
311
|
+
```typescript
|
|
312
|
+
const element = await canvas.findByTestId('transition-element');
|
|
313
|
+
const style = window.getComputedStyle(element);
|
|
314
|
+
const opacity = parseFloat(style.opacity);
|
|
315
|
+
|
|
316
|
+
// During enter: 0 -> 1
|
|
317
|
+
expect(opacity).toBeGreaterThanOrEqual(0);
|
|
318
|
+
expect(opacity).toBeLessThanOrEqual(1);
|
|
319
|
+
|
|
320
|
+
// After enter complete
|
|
321
|
+
await waitFor(() => {
|
|
322
|
+
const currentStyle = window.getComputedStyle(element);
|
|
323
|
+
expect(parseFloat(currentStyle.opacity)).toBe(1);
|
|
324
|
+
}, { timeout: 3000 });
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
##### Transform (Slide/Grow/Zoom)
|
|
328
|
+
```typescript
|
|
329
|
+
const element = await canvas.findByTestId('transition-element');
|
|
330
|
+
const style = window.getComputedStyle(element);
|
|
331
|
+
const transform = style.transform;
|
|
332
|
+
|
|
333
|
+
// Check transform property exists during transition
|
|
334
|
+
expect(transform).not.toBe('none');
|
|
335
|
+
|
|
336
|
+
// Wait for transform to complete (identity matrix)
|
|
337
|
+
await waitFor(() => {
|
|
338
|
+
const currentStyle = window.getComputedStyle(element);
|
|
339
|
+
const currentTransform = currentStyle.transform;
|
|
340
|
+
expect(currentTransform === 'none' ||
|
|
341
|
+
currentTransform.includes('matrix(1, 0, 0, 1, 0, 0)')).toBe(true);
|
|
342
|
+
}, { timeout: 3000 });
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
##### Height (Collapse)
|
|
346
|
+
```typescript
|
|
347
|
+
const element = await canvas.findByTestId('transition-element');
|
|
348
|
+
|
|
349
|
+
// When collapsed
|
|
350
|
+
let style = window.getComputedStyle(element);
|
|
351
|
+
expect(parseInt(style.height)).toBe(0);
|
|
352
|
+
|
|
353
|
+
// Wait for expansion
|
|
354
|
+
await waitFor(() => {
|
|
355
|
+
const currentStyle = window.getComputedStyle(element);
|
|
356
|
+
expect(parseInt(currentStyle.height)).toBeGreaterThan(0);
|
|
357
|
+
}, { timeout: 3000 });
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
##### Visibility
|
|
361
|
+
```typescript
|
|
362
|
+
const wrapper = await canvas.findByTestId('transition-wrapper');
|
|
363
|
+
const style = window.getComputedStyle(wrapper);
|
|
364
|
+
|
|
365
|
+
// When in=true
|
|
366
|
+
expect(style.visibility).toBe('visible');
|
|
367
|
+
|
|
368
|
+
// When in=false (after exit complete)
|
|
369
|
+
expect(style.visibility).toBe('hidden');
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
##### Transition Duration
|
|
373
|
+
```typescript
|
|
374
|
+
const element = await canvas.findByTestId('transition-element');
|
|
375
|
+
const style = window.getComputedStyle(element);
|
|
376
|
+
|
|
377
|
+
// Check transition duration is set
|
|
378
|
+
const transitionDuration = style.transitionDuration;
|
|
379
|
+
expect(transitionDuration).not.toBe('0s');
|
|
380
|
+
|
|
381
|
+
// Check transition delay (if delay prop is set)
|
|
382
|
+
const transitionDelay = style.transitionDelay;
|
|
383
|
+
if (delay > 0) {
|
|
384
|
+
expect(transitionDelay).toBe(`${delay}ms`);
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### Props That Affect Test Behavior
|
|
389
|
+
|
|
390
|
+
#### `variant`
|
|
391
|
+
- **Values:** `'fade' | 'slide' | 'scale' | 'grow' | 'zoom' | 'collapse'`
|
|
392
|
+
- **Impact:** Determines which MUI transition component is used
|
|
393
|
+
- `fade`: Opacity transition
|
|
394
|
+
- `slide`: Translate/position transition
|
|
395
|
+
- `scale`/`grow`: Transform scale transition
|
|
396
|
+
- `zoom`: Combined opacity and scale
|
|
397
|
+
- `collapse`: Height transition
|
|
398
|
+
- **Test Tip:** Different variants require different CSS property checks
|
|
399
|
+
|
|
400
|
+
#### `in`
|
|
401
|
+
- **Values:** `boolean`
|
|
402
|
+
- **Impact:** Controls transition state (entering vs exiting)
|
|
403
|
+
- **Test Tip:** Toggle this prop to test enter/exit transitions
|
|
404
|
+
|
|
405
|
+
#### `direction`
|
|
406
|
+
- **Values:** `'up' | 'down' | 'left' | 'right'`
|
|
407
|
+
- **Impact:** Direction of slide transition
|
|
408
|
+
- **Test Tip:** Only affects `slide` variant
|
|
409
|
+
|
|
410
|
+
#### `duration`
|
|
411
|
+
- **Values:** `number | { enter: number, exit: number }`
|
|
412
|
+
- **Impact:** Transition duration in milliseconds
|
|
413
|
+
- **Test Tip:** Adjust `waitFor` timeout based on duration
|
|
414
|
+
|
|
415
|
+
#### `delay`
|
|
416
|
+
- **Values:** `number` (milliseconds)
|
|
417
|
+
- **Impact:** Adds `transitionDelay` style
|
|
418
|
+
- **Test Tip:** Account for delay when testing transition start
|
|
419
|
+
|
|
420
|
+
#### `easing`
|
|
421
|
+
- **Values:** `string | { enter: string, exit: string }`
|
|
422
|
+
- **Impact:** CSS easing function for transition
|
|
423
|
+
- **Test Tip:** Check `transitionTimingFunction` style property
|
|
424
|
+
|
|
425
|
+
### Common Test Scenarios
|
|
426
|
+
|
|
427
|
+
#### 1. Basic Rendering Test
|
|
428
|
+
```typescript
|
|
429
|
+
play: async ({ canvasElement }) => {
|
|
430
|
+
const canvas = within(canvasElement);
|
|
431
|
+
|
|
432
|
+
// Wait for transition wrapper
|
|
433
|
+
const wrapper = await canvas.findByTestId('transition-wrapper');
|
|
434
|
+
expect(wrapper).toBeInTheDocument();
|
|
435
|
+
|
|
436
|
+
// Verify nested structure
|
|
437
|
+
const element = await canvas.findByTestId('transition-element');
|
|
438
|
+
expect(element).toBeInTheDocument();
|
|
439
|
+
|
|
440
|
+
const content = await canvas.findByTestId('transition-content');
|
|
441
|
+
expect(content).toBeInTheDocument();
|
|
442
|
+
}
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
#### 2. Enter Transition Test
|
|
446
|
+
```typescript
|
|
447
|
+
play: async ({ canvasElement, args }) => {
|
|
448
|
+
const canvas = within(canvasElement);
|
|
449
|
+
|
|
450
|
+
// Initial state (in=false)
|
|
451
|
+
const wrapper = await canvas.findByTestId('transition-wrapper');
|
|
452
|
+
|
|
453
|
+
// Trigger transition (in=true)
|
|
454
|
+
args.in = true;
|
|
455
|
+
|
|
456
|
+
// Wait for transition to complete
|
|
457
|
+
const element = await canvas.findByTestId('transition-element');
|
|
458
|
+
await waitFor(() => {
|
|
459
|
+
const style = window.getComputedStyle(element);
|
|
460
|
+
expect(parseFloat(style.opacity)).toBe(1);
|
|
461
|
+
}, { timeout: 3000 });
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
#### 3. Exit Transition Test
|
|
466
|
+
```typescript
|
|
467
|
+
play: async ({ canvasElement, args }) => {
|
|
468
|
+
const canvas = within(canvasElement);
|
|
469
|
+
|
|
470
|
+
// Start with in=true
|
|
471
|
+
expect(args.in).toBe(true);
|
|
472
|
+
|
|
473
|
+
const element = await canvas.findByTestId('transition-element');
|
|
474
|
+
|
|
475
|
+
// Verify element is visible
|
|
476
|
+
await waitFor(() => {
|
|
477
|
+
expect(element).toBeVisible();
|
|
478
|
+
}, { timeout: 2000 });
|
|
479
|
+
|
|
480
|
+
// Trigger exit (in=false)
|
|
481
|
+
args.in = false;
|
|
482
|
+
|
|
483
|
+
// Wait for exit transition
|
|
484
|
+
await waitFor(() => {
|
|
485
|
+
const style = window.getComputedStyle(element);
|
|
486
|
+
expect(parseFloat(style.opacity)).toBeLessThan(1);
|
|
487
|
+
}, { timeout: 3000 });
|
|
488
|
+
}
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
#### 4. Content Access Test
|
|
492
|
+
```typescript
|
|
493
|
+
play: async ({ canvasElement }) => {
|
|
494
|
+
const canvas = within(canvasElement);
|
|
495
|
+
|
|
496
|
+
// Access content through transition layers
|
|
497
|
+
const content = await canvas.findByTestId('transition-content');
|
|
498
|
+
|
|
499
|
+
// Query child elements
|
|
500
|
+
const childElement = within(content).getByText('Expected Text');
|
|
501
|
+
expect(childElement).toBeInTheDocument();
|
|
502
|
+
}
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
#### 5. Variant-Specific Test (Slide)
|
|
506
|
+
```typescript
|
|
507
|
+
play: async ({ canvasElement, args }) => {
|
|
508
|
+
const canvas = within(canvasElement);
|
|
509
|
+
|
|
510
|
+
expect(args.variant).toBe('slide');
|
|
511
|
+
expect(args.direction).toBe('up');
|
|
512
|
+
|
|
513
|
+
const element = await canvas.findByTestId('transition-element');
|
|
514
|
+
|
|
515
|
+
// Wait for slide to complete
|
|
516
|
+
await waitFor(() => {
|
|
517
|
+
const style = window.getComputedStyle(element);
|
|
518
|
+
const transform = style.transform;
|
|
519
|
+
// No vertical translation (translateY = 0)
|
|
520
|
+
expect(transform === 'none' || !transform.includes('translateY')).toBe(true);
|
|
521
|
+
}, { timeout: 3000 });
|
|
522
|
+
}
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
#### 6. Duration and Delay Test
|
|
526
|
+
```typescript
|
|
527
|
+
play: async ({ canvasElement, args }) => {
|
|
528
|
+
const canvas = within(canvasElement);
|
|
529
|
+
|
|
530
|
+
const duration = 500;
|
|
531
|
+
const delay = 200;
|
|
532
|
+
|
|
533
|
+
expect(args.duration).toBe(duration);
|
|
534
|
+
expect(args.delay).toBe(delay);
|
|
535
|
+
|
|
536
|
+
const element = await canvas.findByTestId('transition-element');
|
|
537
|
+
const style = window.getComputedStyle(element);
|
|
538
|
+
|
|
539
|
+
// Verify delay is applied
|
|
540
|
+
expect(style.transitionDelay).toBe(`${delay}ms`);
|
|
541
|
+
|
|
542
|
+
// Total time = duration + delay
|
|
543
|
+
await waitFor(() => {
|
|
544
|
+
const currentStyle = window.getComputedStyle(element);
|
|
545
|
+
expect(parseFloat(currentStyle.opacity)).toBe(1);
|
|
546
|
+
}, { timeout: duration + delay + 500 }); // Add buffer
|
|
547
|
+
}
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
#### 7. Multiple Transitions Test
|
|
551
|
+
```typescript
|
|
552
|
+
play: async ({ canvasElement }) => {
|
|
553
|
+
const canvas = within(canvasElement);
|
|
554
|
+
|
|
555
|
+
// Test multiple transition instances
|
|
556
|
+
const wrappers = await canvas.findAllByTestId('transition-wrapper');
|
|
557
|
+
expect(wrappers.length).toBeGreaterThan(1);
|
|
558
|
+
|
|
559
|
+
// Each should have complete structure
|
|
560
|
+
for (const wrapper of wrappers) {
|
|
561
|
+
const element = within(wrapper).getByTestId('transition-element');
|
|
562
|
+
const content = within(element).getByTestId('transition-content');
|
|
563
|
+
|
|
564
|
+
expect(element).toBeInTheDocument();
|
|
565
|
+
expect(content).toBeInTheDocument();
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
### Troubleshooting
|
|
571
|
+
|
|
572
|
+
#### Issue: "Unable to find element with testId transition-wrapper"
|
|
573
|
+
|
|
574
|
+
**Solution:** Always use `await` with `findByTestId` and ensure `in` prop is true:
|
|
575
|
+
```typescript
|
|
576
|
+
// ❌ Wrong - synchronous query
|
|
577
|
+
const wrapper = canvas.getByTestId('transition-wrapper');
|
|
578
|
+
|
|
579
|
+
// ✅ Correct - asynchronous query
|
|
580
|
+
const wrapper = await canvas.findByTestId('transition-wrapper');
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
#### Issue: Test fails intermittently during transitions
|
|
584
|
+
|
|
585
|
+
**Solution:** Use `waitFor` with appropriate timeout based on duration + delay:
|
|
586
|
+
```typescript
|
|
587
|
+
const duration = args.duration || 300;
|
|
588
|
+
const delay = args.delay || 0;
|
|
589
|
+
const totalTime = duration + delay;
|
|
590
|
+
|
|
591
|
+
await waitFor(async () => {
|
|
592
|
+
const element = await canvas.findByTestId('transition-element');
|
|
593
|
+
const style = window.getComputedStyle(element);
|
|
594
|
+
expect(parseFloat(style.opacity)).toBe(1);
|
|
595
|
+
}, { timeout: totalTime + 1000 }); // Add 1s buffer
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
#### Issue: CSS properties show unexpected values
|
|
599
|
+
|
|
600
|
+
**Solution:** Remember that MUI transitions apply styles to different elements:
|
|
601
|
+
```typescript
|
|
602
|
+
// ❌ Wrong - checking wrapper for opacity
|
|
603
|
+
const wrapper = await canvas.findByTestId('transition-wrapper');
|
|
604
|
+
const style = window.getComputedStyle(wrapper);
|
|
605
|
+
expect(style.opacity).toBe('1'); // May not work
|
|
606
|
+
|
|
607
|
+
// ✅ Correct - check transition-element for most properties
|
|
608
|
+
const element = await canvas.findByTestId('transition-element');
|
|
609
|
+
const style = window.getComputedStyle(element);
|
|
610
|
+
expect(parseFloat(style.opacity)).toBe(1);
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
#### Issue: Transform matrix is hard to interpret
|
|
614
|
+
|
|
615
|
+
**Solution:** Use helper functions or check for 'none':
|
|
616
|
+
```typescript
|
|
617
|
+
const element = await canvas.findByTestId('transition-element');
|
|
618
|
+
const style = window.getComputedStyle(element);
|
|
619
|
+
const transform = style.transform;
|
|
620
|
+
|
|
621
|
+
// Simple check: either 'none' or identity matrix
|
|
622
|
+
const isComplete = transform === 'none' ||
|
|
623
|
+
transform.includes('matrix(1, 0, 0, 1, 0, 0)');
|
|
624
|
+
expect(isComplete).toBe(true);
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
#### Issue: Collapse height is 'auto' instead of pixel value
|
|
628
|
+
|
|
629
|
+
**Solution:** Check for non-zero height instead of specific value:
|
|
630
|
+
```typescript
|
|
631
|
+
const element = await canvas.findByTestId('transition-element');
|
|
632
|
+
const style = window.getComputedStyle(element);
|
|
633
|
+
const height = style.height;
|
|
634
|
+
|
|
635
|
+
// Accept 'auto' or any positive pixel value
|
|
636
|
+
expect(height === 'auto' || parseInt(height) > 0).toBe(true);
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
#### Issue: Content not accessible through testId
|
|
640
|
+
|
|
641
|
+
**Solution:** Use `within` to scope queries:
|
|
642
|
+
```typescript
|
|
643
|
+
// ❌ Wrong - direct query may fail if multiple transitions exist
|
|
644
|
+
const content = await canvas.findByTestId('transition-content');
|
|
645
|
+
|
|
646
|
+
// ✅ Correct - scope to specific wrapper
|
|
647
|
+
const wrapper = await canvas.findByTestId('transition-wrapper');
|
|
648
|
+
const content = await within(wrapper).findByTestId('transition-content');
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
### Best Practices
|
|
652
|
+
|
|
653
|
+
1. **Always use async/await** with testId queries in Storybook tests
|
|
654
|
+
2. **Use `waitFor`** when testing transitions - they take time to complete
|
|
655
|
+
3. **Account for duration + delay** in timeout values
|
|
656
|
+
4. **Scope queries with `within()`** when testing multiple transition instances
|
|
657
|
+
5. **Check computed styles** for transition properties (opacity, transform, etc.)
|
|
658
|
+
6. **Parse numeric values** from CSS strings: `parseFloat(style.opacity)`
|
|
659
|
+
7. **Test both enter and exit** transitions for complete coverage
|
|
660
|
+
8. **Use variant-specific assertions** for different transition types
|
|
661
|
+
9. **Add buffer time** to timeouts (e.g., duration + 500ms)
|
|
662
|
+
10. **Test visibility states** to ensure proper show/hide behavior
|
|
663
|
+
|
|
664
|
+
### Variant-Specific CSS Properties
|
|
665
|
+
|
|
666
|
+
#### Fade
|
|
667
|
+
- **Primary:** `opacity` (0 → 1)
|
|
668
|
+
- **Check:** `parseFloat(style.opacity) === 1`
|
|
669
|
+
|
|
670
|
+
#### Slide
|
|
671
|
+
- **Primary:** `transform: translateX/Y`
|
|
672
|
+
- **Check:** `transform === 'none'` or identity matrix
|
|
673
|
+
|
|
674
|
+
#### Grow/Scale
|
|
675
|
+
- **Primary:** `transform: scale`
|
|
676
|
+
- **Check:** `transform.includes('scale(1)')`
|
|
677
|
+
|
|
678
|
+
#### Zoom
|
|
679
|
+
- **Primary:** `opacity` + `transform: scale`
|
|
680
|
+
- **Check:** Both opacity and scale
|
|
681
|
+
|
|
682
|
+
#### Collapse
|
|
683
|
+
- **Primary:** `height` (0 → auto/pixels)
|
|
684
|
+
- **Check:** `parseInt(style.height) > 0`
|