@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,629 @@
|
|
|
1
|
+
# Modal Component
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The Modal component provides a flexible dialog overlay system for displaying content that requires user attention or interaction. Built on Material-UI's Modal component, it offers multiple positioning variants, size options, visual effects, and comprehensive accessibility features. The Modal is ideal for forms, confirmations, detailed views, or any content that needs to temporarily take focus from the main application.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Multiple Variants**: Center, top, bottom, and glass positioning options
|
|
10
|
+
- **Flexible Sizing**: Five size options from extra small to extra large
|
|
11
|
+
- **Visual Effects**: Glass morphism, gradient backgrounds, glow effects, and pulse animations
|
|
12
|
+
- **Backdrop Control**: Customizable backdrop with blur effects
|
|
13
|
+
- **Persistent Mode**: Prevent closing on backdrop click or escape key
|
|
14
|
+
- **Smooth Transitions**: Slide and fade animations based on variant
|
|
15
|
+
- **Responsive Design**: Adapts to viewport size with max-width constraints
|
|
16
|
+
- **Border Radius Control**: Customizable corner rounding from none to extra large
|
|
17
|
+
- **Accessibility**: Full ARIA support and keyboard navigation
|
|
18
|
+
- **Theme Integration**: Seamlessly integrates with Material-UI theme system
|
|
19
|
+
|
|
20
|
+
## Props
|
|
21
|
+
|
|
22
|
+
### Modal Component Props
|
|
23
|
+
|
|
24
|
+
| Prop | Type | Default | Description |
|
|
25
|
+
|------|------|---------|-------------|
|
|
26
|
+
| `open` | `boolean` | (required) | Controls the modal visibility |
|
|
27
|
+
| `onClose` | `() => void` | `undefined` | Callback fired when the modal should close |
|
|
28
|
+
| `children` | `ReactNode` | (required) | Content to display in the modal |
|
|
29
|
+
| `variant` | `'center' \| 'top' \| 'bottom' \| 'glass'` | `'center'` | Positioning and visual style variant |
|
|
30
|
+
| `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | Modal width (320px to 960px) |
|
|
31
|
+
| `backdrop` | `boolean` | `true` | Whether to show the backdrop overlay |
|
|
32
|
+
| `persistent` | `boolean` | `false` | If true, modal won't close on backdrop click or escape key |
|
|
33
|
+
| `glass` | `boolean` | `false` | Enables glass morphism effect with backdrop blur |
|
|
34
|
+
| `gradient` | `boolean` | `false` | Applies gradient background effect |
|
|
35
|
+
| `glow` | `boolean` | `false` | Adds glowing shadow effect around modal |
|
|
36
|
+
| `pulse` | `boolean` | `false` | Enables pulsing animation effect |
|
|
37
|
+
| `borderRadius` | `'none' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `'lg'` | Controls corner rounding |
|
|
38
|
+
| `dataTestId` | `string` | `undefined` | Custom test ID for testing (auto-generates child IDs) |
|
|
39
|
+
|
|
40
|
+
### ModalContent Component Props
|
|
41
|
+
|
|
42
|
+
| Prop | Type | Default | Description |
|
|
43
|
+
|------|------|---------|-------------|
|
|
44
|
+
| `children` | `ReactNode` | (required) | Content to display inside the modal content area |
|
|
45
|
+
| `padding` | `number \| string` | `3` | Padding value (theme spacing units) |
|
|
46
|
+
| `dataTestId` | `string` | `undefined` | Custom test ID for the content container |
|
|
47
|
+
|
|
48
|
+
## Usage
|
|
49
|
+
|
|
50
|
+
### Basic Modal
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
import { Modal, ModalContent } from '@procurement/ui';
|
|
54
|
+
import { useState } from 'react';
|
|
55
|
+
|
|
56
|
+
function BasicModalExample() {
|
|
57
|
+
const [open, setOpen] = useState(false);
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<>
|
|
61
|
+
<button onClick={() => setOpen(true)}>Open Modal</button>
|
|
62
|
+
<Modal open={open} onClose={() => setOpen(false)}>
|
|
63
|
+
<ModalContent>
|
|
64
|
+
<h2>Modal Title</h2>
|
|
65
|
+
<p>This is the modal content.</p>
|
|
66
|
+
</ModalContent>
|
|
67
|
+
</Modal>
|
|
68
|
+
</>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Sized Modals
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
// Extra Small Modal (320px)
|
|
77
|
+
<Modal open={open} onClose={handleClose} size="xs">
|
|
78
|
+
<ModalContent>
|
|
79
|
+
<p>Compact modal for quick actions</p>
|
|
80
|
+
</ModalContent>
|
|
81
|
+
</Modal>
|
|
82
|
+
|
|
83
|
+
// Large Modal (800px)
|
|
84
|
+
<Modal open={open} onClose={handleClose} size="lg">
|
|
85
|
+
<ModalContent>
|
|
86
|
+
<p>Spacious modal for detailed content</p>
|
|
87
|
+
</ModalContent>
|
|
88
|
+
</Modal>
|
|
89
|
+
|
|
90
|
+
// Extra Large Modal (960px)
|
|
91
|
+
<Modal open={open} onClose={handleClose} size="xl">
|
|
92
|
+
<ModalContent>
|
|
93
|
+
<p>Maximum width modal for complex forms or data</p>
|
|
94
|
+
</ModalContent>
|
|
95
|
+
</Modal>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Positioned Modals
|
|
99
|
+
|
|
100
|
+
```tsx
|
|
101
|
+
// Top-aligned Modal (slides down)
|
|
102
|
+
<Modal open={open} onClose={handleClose} variant="top">
|
|
103
|
+
<ModalContent>
|
|
104
|
+
<p>Notification-style modal at the top</p>
|
|
105
|
+
</ModalContent>
|
|
106
|
+
</Modal>
|
|
107
|
+
|
|
108
|
+
// Bottom-aligned Modal (slides up)
|
|
109
|
+
<Modal open={open} onClose={handleClose} variant="bottom">
|
|
110
|
+
<ModalContent>
|
|
111
|
+
<p>Mobile-friendly bottom sheet style</p>
|
|
112
|
+
</ModalContent>
|
|
113
|
+
</Modal>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Glass Morphism Effect
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
<Modal open={open} onClose={handleClose} variant="glass">
|
|
120
|
+
<ModalContent>
|
|
121
|
+
<h2>Beautiful Glass Design</h2>
|
|
122
|
+
<p>With frosted glass effect and subtle backdrop blur</p>
|
|
123
|
+
</ModalContent>
|
|
124
|
+
</Modal>
|
|
125
|
+
|
|
126
|
+
// Or with glass prop on any variant
|
|
127
|
+
<Modal open={open} onClose={handleClose} glass>
|
|
128
|
+
<ModalContent>
|
|
129
|
+
<p>Glass effect on center modal</p>
|
|
130
|
+
</ModalContent>
|
|
131
|
+
</Modal>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Gradient Background
|
|
135
|
+
|
|
136
|
+
```tsx
|
|
137
|
+
<Modal open={open} onClose={handleClose} gradient>
|
|
138
|
+
<ModalContent>
|
|
139
|
+
<h2>Gradient Modal</h2>
|
|
140
|
+
<p>Eye-catching gradient background from primary to secondary colors</p>
|
|
141
|
+
</ModalContent>
|
|
142
|
+
</Modal>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Visual Effects
|
|
146
|
+
|
|
147
|
+
```tsx
|
|
148
|
+
// Glowing Modal
|
|
149
|
+
<Modal open={open} onClose={handleClose} glow>
|
|
150
|
+
<ModalContent>
|
|
151
|
+
<p>Modal with a subtle glow effect</p>
|
|
152
|
+
</ModalContent>
|
|
153
|
+
</Modal>
|
|
154
|
+
|
|
155
|
+
// Pulsing Modal (for attention)
|
|
156
|
+
<Modal open={open} onClose={handleClose} pulse>
|
|
157
|
+
<ModalContent>
|
|
158
|
+
<p>Pulsing animation for important messages</p>
|
|
159
|
+
</ModalContent>
|
|
160
|
+
</Modal>
|
|
161
|
+
|
|
162
|
+
// Combined Effects
|
|
163
|
+
<Modal open={open} onClose={handleClose} glass glow pulse>
|
|
164
|
+
<ModalContent>
|
|
165
|
+
<p>Maximum visual impact with all effects</p>
|
|
166
|
+
</ModalContent>
|
|
167
|
+
</Modal>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Persistent Modal
|
|
171
|
+
|
|
172
|
+
```tsx
|
|
173
|
+
// Modal that can only be closed via explicit action
|
|
174
|
+
<Modal open={open} onClose={handleClose} persistent>
|
|
175
|
+
<ModalContent>
|
|
176
|
+
<h2>Important Action Required</h2>
|
|
177
|
+
<p>You must confirm or cancel to proceed.</p>
|
|
178
|
+
<Box sx={{ mt: 2, display: 'flex', gap: 2 }}>
|
|
179
|
+
<Button onClick={handleConfirm}>Confirm</Button>
|
|
180
|
+
<Button onClick={() => setOpen(false)}>Cancel</Button>
|
|
181
|
+
</Box>
|
|
182
|
+
</ModalContent>
|
|
183
|
+
</Modal>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### No Backdrop
|
|
187
|
+
|
|
188
|
+
```tsx
|
|
189
|
+
// Modal without backdrop overlay
|
|
190
|
+
<Modal open={open} onClose={handleClose} backdrop={false}>
|
|
191
|
+
<ModalContent>
|
|
192
|
+
<p>Modal without darkened background</p>
|
|
193
|
+
</ModalContent>
|
|
194
|
+
</Modal>
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Custom Border Radius
|
|
198
|
+
|
|
199
|
+
```tsx
|
|
200
|
+
// Sharp corners
|
|
201
|
+
<Modal open={open} onClose={handleClose} borderRadius="none">
|
|
202
|
+
<ModalContent>
|
|
203
|
+
<p>No rounded corners</p>
|
|
204
|
+
</ModalContent>
|
|
205
|
+
</Modal>
|
|
206
|
+
|
|
207
|
+
// Extra rounded
|
|
208
|
+
<Modal open={open} onClose={handleClose} borderRadius="xl">
|
|
209
|
+
<ModalContent>
|
|
210
|
+
<p>Very rounded corners for a softer look</p>
|
|
211
|
+
</ModalContent>
|
|
212
|
+
</Modal>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Complex Modal with Custom Content
|
|
216
|
+
|
|
217
|
+
```tsx
|
|
218
|
+
import { Box, Typography, Button, IconButton } from '@mui/material';
|
|
219
|
+
import { Close as CloseIcon } from '@mui/icons-material';
|
|
220
|
+
|
|
221
|
+
function ComplexModalExample() {
|
|
222
|
+
const [open, setOpen] = useState(false);
|
|
223
|
+
|
|
224
|
+
return (
|
|
225
|
+
<Modal
|
|
226
|
+
open={open}
|
|
227
|
+
onClose={() => setOpen(false)}
|
|
228
|
+
size="lg"
|
|
229
|
+
dataTestId="user-profile-modal"
|
|
230
|
+
>
|
|
231
|
+
<ModalContent dataTestId="user-profile-content">
|
|
232
|
+
{/* Header */}
|
|
233
|
+
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 2 }}>
|
|
234
|
+
<Typography variant="h5">User Profile</Typography>
|
|
235
|
+
<IconButton onClick={() => setOpen(false)} aria-label="close">
|
|
236
|
+
<CloseIcon />
|
|
237
|
+
</IconButton>
|
|
238
|
+
</Box>
|
|
239
|
+
|
|
240
|
+
{/* Body */}
|
|
241
|
+
<Box sx={{ mb: 3 }}>
|
|
242
|
+
<Typography variant="body1" paragraph>
|
|
243
|
+
Edit your profile information below.
|
|
244
|
+
</Typography>
|
|
245
|
+
{/* Form fields would go here */}
|
|
246
|
+
</Box>
|
|
247
|
+
|
|
248
|
+
{/* Footer */}
|
|
249
|
+
<Box sx={{ display: 'flex', justifyContent: 'flex-end', gap: 1 }}>
|
|
250
|
+
<Button variant="outlined" onClick={() => setOpen(false)}>
|
|
251
|
+
Cancel
|
|
252
|
+
</Button>
|
|
253
|
+
<Button variant="contained" onClick={handleSave}>
|
|
254
|
+
Save Changes
|
|
255
|
+
</Button>
|
|
256
|
+
</Box>
|
|
257
|
+
</ModalContent>
|
|
258
|
+
</Modal>
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Variants
|
|
264
|
+
|
|
265
|
+
### Center Modal (Default)
|
|
266
|
+
- Positions modal at the center of the viewport
|
|
267
|
+
- Fade transition animation
|
|
268
|
+
- Maximum height of 90vh with vertical scroll
|
|
269
|
+
- Best for general-purpose dialogs and forms
|
|
270
|
+
|
|
271
|
+
### Top Modal
|
|
272
|
+
- Positions modal 10% from the top
|
|
273
|
+
- Slide down transition animation
|
|
274
|
+
- Maximum height of 80vh with vertical scroll
|
|
275
|
+
- Ideal for notifications and alerts
|
|
276
|
+
|
|
277
|
+
### Bottom Modal
|
|
278
|
+
- Positions modal 10% from the bottom
|
|
279
|
+
- Slide up transition animation
|
|
280
|
+
- Maximum height of 80vh with vertical scroll
|
|
281
|
+
- Perfect for mobile-style bottom sheets and action panels
|
|
282
|
+
|
|
283
|
+
### Glass Modal
|
|
284
|
+
- Center positioned with glass morphism design
|
|
285
|
+
- Frosted glass effect with backdrop blur
|
|
286
|
+
- Semi-transparent background
|
|
287
|
+
- Subtle border and shadow
|
|
288
|
+
- Modern, elegant appearance
|
|
289
|
+
|
|
290
|
+
## Size Options
|
|
291
|
+
|
|
292
|
+
| Size | Width | Use Case |
|
|
293
|
+
|------|-------|----------|
|
|
294
|
+
| `xs` | 320px | Confirmations, simple alerts |
|
|
295
|
+
| `sm` | 480px | Short forms, quick actions |
|
|
296
|
+
| `md` | 640px | Standard dialogs, medium forms |
|
|
297
|
+
| `lg` | 800px | Detailed forms, content viewers |
|
|
298
|
+
| `xl` | 960px | Complex forms, data tables, rich content |
|
|
299
|
+
|
|
300
|
+
All sizes include `maxWidth: '90vw'` to ensure responsiveness on smaller screens.
|
|
301
|
+
|
|
302
|
+
## Accessibility
|
|
303
|
+
|
|
304
|
+
The Modal component implements comprehensive accessibility features:
|
|
305
|
+
|
|
306
|
+
### ARIA Support
|
|
307
|
+
- Modal container uses appropriate ARIA roles
|
|
308
|
+
- Focus is trapped within the modal when open
|
|
309
|
+
- Focus returns to trigger element on close
|
|
310
|
+
- Screen readers announce modal opening/closing
|
|
311
|
+
|
|
312
|
+
### Keyboard Navigation
|
|
313
|
+
- **Escape Key**: Closes the modal (unless `persistent` is true)
|
|
314
|
+
- **Tab Key**: Cycles through focusable elements within modal
|
|
315
|
+
- **Shift + Tab**: Reverse tab navigation
|
|
316
|
+
- First focusable element receives focus on open
|
|
317
|
+
|
|
318
|
+
### Focus Management
|
|
319
|
+
- Auto-focuses first interactive element
|
|
320
|
+
- Prevents focus from leaving modal
|
|
321
|
+
- Restores focus on close
|
|
322
|
+
- Handles nested focusable elements
|
|
323
|
+
|
|
324
|
+
### Screen Reader Support
|
|
325
|
+
- Proper role attributes for modal and backdrop
|
|
326
|
+
- Live regions for dynamic content updates
|
|
327
|
+
- Descriptive labels for interactive elements
|
|
328
|
+
- Content hierarchy with semantic HTML
|
|
329
|
+
|
|
330
|
+
## Styling
|
|
331
|
+
|
|
332
|
+
The Modal component leverages Material-UI theming:
|
|
333
|
+
|
|
334
|
+
### Theme Integration
|
|
335
|
+
- Respects theme palette for colors
|
|
336
|
+
- Uses theme spacing units for sizing
|
|
337
|
+
- Applies theme transitions for animations
|
|
338
|
+
- Follows theme shadows and elevations
|
|
339
|
+
|
|
340
|
+
### Responsive Design
|
|
341
|
+
- Max width constraints prevent overflow
|
|
342
|
+
- Vertical scrolling for tall content
|
|
343
|
+
- Adapts to small viewports
|
|
344
|
+
- Touch-friendly on mobile devices
|
|
345
|
+
|
|
346
|
+
### Visual Effects
|
|
347
|
+
- Backdrop blur for glass effects
|
|
348
|
+
- CSS animations for pulse effect
|
|
349
|
+
- Box shadows for glow and depth
|
|
350
|
+
- Gradient overlays when enabled
|
|
351
|
+
|
|
352
|
+
## Best Practices
|
|
353
|
+
|
|
354
|
+
1. **Use Appropriate Sizes**: Choose size based on content complexity
|
|
355
|
+
- xs/sm for simple confirmations
|
|
356
|
+
- md for standard forms
|
|
357
|
+
- lg/xl for complex data or multi-step flows
|
|
358
|
+
|
|
359
|
+
2. **Consider Mobile Experience**: Test modals on smaller screens
|
|
360
|
+
- Bottom variant works well on mobile
|
|
361
|
+
- Ensure touch targets are large enough
|
|
362
|
+
- Avoid excessive nested scrolling
|
|
363
|
+
|
|
364
|
+
3. **Manage Focus**:
|
|
365
|
+
- Always provide a way to close the modal
|
|
366
|
+
- Place primary action at logical focus point
|
|
367
|
+
- Don't trap users without clear exit
|
|
368
|
+
|
|
369
|
+
4. **Use Persistent Sparingly**: Only for critical actions
|
|
370
|
+
- Avoid overusing persistent modals
|
|
371
|
+
- Always provide explicit close actions
|
|
372
|
+
- Use for destructive or important confirmations
|
|
373
|
+
|
|
374
|
+
5. **Optimize Content**:
|
|
375
|
+
- Keep content concise and scannable
|
|
376
|
+
- Use clear headings and sections
|
|
377
|
+
- Avoid excessive scrolling
|
|
378
|
+
- Consider breaking complex flows into steps
|
|
379
|
+
|
|
380
|
+
6. **Effects and Styling**:
|
|
381
|
+
- Don't combine too many effects (glass + glow + pulse)
|
|
382
|
+
- Use glow/pulse for important messages only
|
|
383
|
+
- Ensure sufficient contrast for readability
|
|
384
|
+
- Test glass effects on various backgrounds
|
|
385
|
+
|
|
386
|
+
7. **Accessibility First**:
|
|
387
|
+
- Always provide close button with aria-label
|
|
388
|
+
- Use semantic HTML structure
|
|
389
|
+
- Test with keyboard navigation
|
|
390
|
+
- Verify screen reader announcements
|
|
391
|
+
|
|
392
|
+
## Testing
|
|
393
|
+
|
|
394
|
+
### Test IDs
|
|
395
|
+
|
|
396
|
+
The Modal component provides automatic test ID generation for easy testing:
|
|
397
|
+
|
|
398
|
+
| Test ID | Element | Description |
|
|
399
|
+
|---------|---------|-------------|
|
|
400
|
+
| `modal` | Modal container | Main modal content wrapper |
|
|
401
|
+
| `modal-backdrop` | Backdrop overlay | Semi-transparent overlay behind modal |
|
|
402
|
+
| `modal-content` | ModalContent | Content container with padding |
|
|
403
|
+
|
|
404
|
+
Custom test IDs can be provided via the `dataTestId` prop:
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
<Modal dataTestId="custom-modal" />
|
|
408
|
+
// Results in: custom-modal, custom-modal-backdrop
|
|
409
|
+
|
|
410
|
+
<ModalContent dataTestId="custom-content" />
|
|
411
|
+
// Results in: custom-content
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
### Testing Best Practices
|
|
415
|
+
|
|
416
|
+
**Wait for Modal to Open:**
|
|
417
|
+
```typescript
|
|
418
|
+
import { render, screen, waitFor } from '@testing-library/react';
|
|
419
|
+
import userEvent from '@testing-library/user-event';
|
|
420
|
+
|
|
421
|
+
test('modal opens when triggered', async () => {
|
|
422
|
+
render(<MyComponent />);
|
|
423
|
+
|
|
424
|
+
const openButton = screen.getByRole('button', { name: /open modal/i });
|
|
425
|
+
await userEvent.click(openButton);
|
|
426
|
+
|
|
427
|
+
const modal = await screen.findByTestId('modal');
|
|
428
|
+
expect(modal).toBeInTheDocument();
|
|
429
|
+
expect(modal).toBeVisible();
|
|
430
|
+
});
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
**Test Backdrop Click Behavior:**
|
|
434
|
+
```typescript
|
|
435
|
+
test('modal closes on backdrop click', async () => {
|
|
436
|
+
const onClose = jest.fn();
|
|
437
|
+
render(<Modal open={true} onClose={onClose}><div>Content</div></Modal>);
|
|
438
|
+
|
|
439
|
+
const backdrop = screen.getByTestId('modal-backdrop');
|
|
440
|
+
await userEvent.click(backdrop);
|
|
441
|
+
|
|
442
|
+
expect(onClose).toHaveBeenCalledTimes(1);
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
test('persistent modal does not close on backdrop click', async () => {
|
|
446
|
+
const onClose = jest.fn();
|
|
447
|
+
render(
|
|
448
|
+
<Modal open={true} onClose={onClose} persistent>
|
|
449
|
+
<div>Content</div>
|
|
450
|
+
</Modal>
|
|
451
|
+
);
|
|
452
|
+
|
|
453
|
+
const backdrop = screen.getByTestId('modal-backdrop');
|
|
454
|
+
await userEvent.click(backdrop);
|
|
455
|
+
|
|
456
|
+
expect(onClose).not.toHaveBeenCalled();
|
|
457
|
+
});
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
**Test Escape Key Behavior:**
|
|
461
|
+
```typescript
|
|
462
|
+
test('modal closes on escape key', async () => {
|
|
463
|
+
const onClose = jest.fn();
|
|
464
|
+
render(<Modal open={true} onClose={onClose}><div>Content</div></Modal>);
|
|
465
|
+
|
|
466
|
+
await userEvent.keyboard('{Escape}');
|
|
467
|
+
|
|
468
|
+
expect(onClose).toHaveBeenCalledTimes(1);
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
test('persistent modal does not close on escape key', async () => {
|
|
472
|
+
const onClose = jest.fn();
|
|
473
|
+
render(
|
|
474
|
+
<Modal open={true} onClose={onClose} persistent>
|
|
475
|
+
<div>Content</div>
|
|
476
|
+
</Modal>
|
|
477
|
+
);
|
|
478
|
+
|
|
479
|
+
await userEvent.keyboard('{Escape}');
|
|
480
|
+
|
|
481
|
+
expect(onClose).not.toHaveBeenCalled();
|
|
482
|
+
});
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
**Test Modal Content:**
|
|
486
|
+
```typescript
|
|
487
|
+
test('renders modal content correctly', async () => {
|
|
488
|
+
render(
|
|
489
|
+
<Modal open={true}>
|
|
490
|
+
<ModalContent dataTestId="test-content">
|
|
491
|
+
<h2>Modal Title</h2>
|
|
492
|
+
<p>Modal description</p>
|
|
493
|
+
</ModalContent>
|
|
494
|
+
</Modal>
|
|
495
|
+
);
|
|
496
|
+
|
|
497
|
+
const content = await screen.findByTestId('test-content');
|
|
498
|
+
expect(content).toHaveTextContent('Modal Title');
|
|
499
|
+
expect(content).toHaveTextContent('Modal description');
|
|
500
|
+
});
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
**Test Visual Variants:**
|
|
504
|
+
```typescript
|
|
505
|
+
test('applies glass effect styles', async () => {
|
|
506
|
+
render(
|
|
507
|
+
<Modal open={true} variant="glass" dataTestId="glass-modal">
|
|
508
|
+
<div>Content</div>
|
|
509
|
+
</Modal>
|
|
510
|
+
);
|
|
511
|
+
|
|
512
|
+
const modal = await screen.findByTestId('glass-modal');
|
|
513
|
+
const styles = window.getComputedStyle(modal);
|
|
514
|
+
|
|
515
|
+
expect(styles.backdropFilter).toContain('blur');
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
test('applies gradient background', async () => {
|
|
519
|
+
render(
|
|
520
|
+
<Modal open={true} gradient dataTestId="gradient-modal">
|
|
521
|
+
<div>Content</div>
|
|
522
|
+
</Modal>
|
|
523
|
+
);
|
|
524
|
+
|
|
525
|
+
const modal = await screen.findByTestId('gradient-modal');
|
|
526
|
+
const styles = window.getComputedStyle(modal);
|
|
527
|
+
|
|
528
|
+
expect(styles.background).toContain('linear-gradient');
|
|
529
|
+
});
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
**Test Sizing:**
|
|
533
|
+
```typescript
|
|
534
|
+
test.each([
|
|
535
|
+
['xs', 320],
|
|
536
|
+
['sm', 480],
|
|
537
|
+
['md', 640],
|
|
538
|
+
['lg', 800],
|
|
539
|
+
['xl', 960],
|
|
540
|
+
])('applies correct width for size %s', async (size, width) => {
|
|
541
|
+
render(
|
|
542
|
+
<Modal open={true} size={size as any} dataTestId={`modal-${size}`}>
|
|
543
|
+
<div>Content</div>
|
|
544
|
+
</Modal>
|
|
545
|
+
);
|
|
546
|
+
|
|
547
|
+
const modal = await screen.findByTestId(`modal-${size}`);
|
|
548
|
+
const styles = window.getComputedStyle(modal);
|
|
549
|
+
|
|
550
|
+
expect(styles.width).toBe(`${width}px`);
|
|
551
|
+
});
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### Common Test Scenarios
|
|
555
|
+
|
|
556
|
+
1. **Modal Opening/Closing**
|
|
557
|
+
- Verify modal opens when triggered
|
|
558
|
+
- Verify modal closes on close action
|
|
559
|
+
- Test open/close state transitions
|
|
560
|
+
|
|
561
|
+
2. **Backdrop Interaction**
|
|
562
|
+
- Test backdrop click closes modal
|
|
563
|
+
- Test persistent mode prevents backdrop close
|
|
564
|
+
- Verify backdrop visibility
|
|
565
|
+
|
|
566
|
+
3. **Keyboard Navigation**
|
|
567
|
+
- Test escape key closes modal
|
|
568
|
+
- Test tab navigation within modal
|
|
569
|
+
- Test focus trap behavior
|
|
570
|
+
|
|
571
|
+
4. **Content Rendering**
|
|
572
|
+
- Verify children render correctly
|
|
573
|
+
- Test ModalContent component
|
|
574
|
+
- Check content overflow and scrolling
|
|
575
|
+
|
|
576
|
+
5. **Variants and Sizes**
|
|
577
|
+
- Test all variant positions
|
|
578
|
+
- Verify size dimensions
|
|
579
|
+
- Check responsive behavior
|
|
580
|
+
|
|
581
|
+
6. **Visual Effects**
|
|
582
|
+
- Test glass effect application
|
|
583
|
+
- Verify gradient backgrounds
|
|
584
|
+
- Check glow and pulse animations
|
|
585
|
+
|
|
586
|
+
7. **Accessibility**
|
|
587
|
+
- Test focus management
|
|
588
|
+
- Verify ARIA attributes
|
|
589
|
+
- Check screen reader compatibility
|
|
590
|
+
|
|
591
|
+
### Storybook Testing
|
|
592
|
+
|
|
593
|
+
The Modal component includes comprehensive Storybook stories for visual testing:
|
|
594
|
+
|
|
595
|
+
```typescript
|
|
596
|
+
import { within, userEvent } from '@storybook/testing-library';
|
|
597
|
+
import { expect } from '@storybook/jest';
|
|
598
|
+
|
|
599
|
+
export const InteractiveModal = {
|
|
600
|
+
play: async ({ canvasElement }) => {
|
|
601
|
+
const canvas = within(canvasElement);
|
|
602
|
+
|
|
603
|
+
// Find and click open button
|
|
604
|
+
const openButton = canvas.getByRole('button', { name: /open modal/i });
|
|
605
|
+
await userEvent.click(openButton);
|
|
606
|
+
|
|
607
|
+
// Verify modal appears
|
|
608
|
+
const modal = await canvas.findByTestId('modal');
|
|
609
|
+
expect(modal).toBeInTheDocument();
|
|
610
|
+
|
|
611
|
+
// Find and click close button
|
|
612
|
+
const closeButton = canvas.getByRole('button', { name: /close/i });
|
|
613
|
+
await userEvent.click(closeButton);
|
|
614
|
+
|
|
615
|
+
// Verify modal closes
|
|
616
|
+
await waitFor(() => {
|
|
617
|
+
expect(canvas.queryByTestId('modal')).not.toBeInTheDocument();
|
|
618
|
+
});
|
|
619
|
+
},
|
|
620
|
+
};
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
## Related Components
|
|
624
|
+
|
|
625
|
+
- **Dialog** - Pre-structured modal with header, content, and actions
|
|
626
|
+
- **Drawer** - Side-sliding panel for navigation or supplementary content
|
|
627
|
+
- **Alert** - Inline notifications without overlay
|
|
628
|
+
- **Toast** - Non-intrusive temporary notifications
|
|
629
|
+
- **Popover** - Lightweight overlay for contextual information
|