@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,132 @@
|
|
|
1
|
+
import type { PaperProps } from '@mui/material';
|
|
2
|
+
import { alpha, keyframes,Paper, Popover as MuiPopover } from '@mui/material';
|
|
3
|
+
import { styled } from '@mui/material/styles';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
|
|
6
|
+
import type { PopoverProps } from './Popover.types';
|
|
7
|
+
|
|
8
|
+
// Define pulse animation
|
|
9
|
+
const pulseAnimation = keyframes`
|
|
10
|
+
0% {
|
|
11
|
+
box-shadow: 0 0 0 0 currentColor;
|
|
12
|
+
opacity: 1;
|
|
13
|
+
}
|
|
14
|
+
70% {
|
|
15
|
+
box-shadow: 0 0 0 10px currentColor;
|
|
16
|
+
opacity: 0;
|
|
17
|
+
}
|
|
18
|
+
100% {
|
|
19
|
+
box-shadow: 0 0 0 0 currentColor;
|
|
20
|
+
opacity: 0;
|
|
21
|
+
}
|
|
22
|
+
`;
|
|
23
|
+
|
|
24
|
+
const StyledPaper = styled(Paper, {
|
|
25
|
+
shouldForwardProp: (prop) =>
|
|
26
|
+
!['customVariant', 'glow', 'pulse'].includes(prop as string),
|
|
27
|
+
})<{
|
|
28
|
+
customVariant?: string;
|
|
29
|
+
glow?: boolean;
|
|
30
|
+
pulse?: boolean;
|
|
31
|
+
}>(({ theme, customVariant, glow, pulse }) => ({
|
|
32
|
+
borderRadius: theme.spacing(1.5),
|
|
33
|
+
transition: 'all 0.3s ease',
|
|
34
|
+
position: 'relative',
|
|
35
|
+
overflow: 'hidden',
|
|
36
|
+
|
|
37
|
+
// Variant styles
|
|
38
|
+
...(customVariant === 'default' && {
|
|
39
|
+
backgroundColor: theme.palette.background.paper,
|
|
40
|
+
border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,
|
|
41
|
+
boxShadow: theme.shadows[8],
|
|
42
|
+
}),
|
|
43
|
+
|
|
44
|
+
...(customVariant === 'glass' && {
|
|
45
|
+
backgroundColor: alpha(theme.palette.background.paper, 0.1),
|
|
46
|
+
backdropFilter: 'blur(20px)',
|
|
47
|
+
border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,
|
|
48
|
+
boxShadow: `0 8px 32px ${alpha(theme.palette.common.black, 0.1)}`,
|
|
49
|
+
}),
|
|
50
|
+
|
|
51
|
+
...(customVariant === 'arrow' && {
|
|
52
|
+
backgroundColor: theme.palette.background.paper,
|
|
53
|
+
border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,
|
|
54
|
+
boxShadow: theme.shadows[12],
|
|
55
|
+
}),
|
|
56
|
+
|
|
57
|
+
// Glow effect
|
|
58
|
+
...(glow && !pulse && {
|
|
59
|
+
boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,
|
|
60
|
+
filter: 'brightness(1.05)',
|
|
61
|
+
}),
|
|
62
|
+
|
|
63
|
+
// Pulse animation
|
|
64
|
+
...(pulse && !glow && {
|
|
65
|
+
position: 'relative',
|
|
66
|
+
'&::after': {
|
|
67
|
+
content: '""',
|
|
68
|
+
position: 'absolute',
|
|
69
|
+
top: 0,
|
|
70
|
+
left: 0,
|
|
71
|
+
right: 0,
|
|
72
|
+
bottom: 0,
|
|
73
|
+
borderRadius: 'inherit',
|
|
74
|
+
backgroundColor: theme.palette.primary.main,
|
|
75
|
+
opacity: 0.1,
|
|
76
|
+
animation: `${pulseAnimation} 2s infinite`,
|
|
77
|
+
pointerEvents: 'none',
|
|
78
|
+
zIndex: -1,
|
|
79
|
+
},
|
|
80
|
+
}),
|
|
81
|
+
|
|
82
|
+
// Both glow and pulse
|
|
83
|
+
...(glow && pulse && {
|
|
84
|
+
position: 'relative',
|
|
85
|
+
boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,
|
|
86
|
+
filter: 'brightness(1.05)',
|
|
87
|
+
'&::after': {
|
|
88
|
+
content: '""',
|
|
89
|
+
position: 'absolute',
|
|
90
|
+
top: 0,
|
|
91
|
+
left: 0,
|
|
92
|
+
right: 0,
|
|
93
|
+
bottom: 0,
|
|
94
|
+
borderRadius: 'inherit',
|
|
95
|
+
backgroundColor: theme.palette.primary.main,
|
|
96
|
+
opacity: 0.1,
|
|
97
|
+
animation: `${pulseAnimation} 2s infinite`,
|
|
98
|
+
pointerEvents: 'none',
|
|
99
|
+
zIndex: -1,
|
|
100
|
+
},
|
|
101
|
+
}),
|
|
102
|
+
}));
|
|
103
|
+
|
|
104
|
+
export const Popover = React.forwardRef<HTMLDivElement, PopoverProps>(
|
|
105
|
+
({
|
|
106
|
+
variant = 'default',
|
|
107
|
+
glow = false,
|
|
108
|
+
pulse = false,
|
|
109
|
+
maxWidth = 400,
|
|
110
|
+
dataTestId,
|
|
111
|
+
children,
|
|
112
|
+
...props
|
|
113
|
+
}, ref) => (
|
|
114
|
+
<MuiPopover
|
|
115
|
+
ref={ref}
|
|
116
|
+
data-testid={dataTestId || 'popover-content'}
|
|
117
|
+
PaperProps={{
|
|
118
|
+
component: StyledPaper as React.ComponentType<PaperProps>,
|
|
119
|
+
customVariant: variant,
|
|
120
|
+
glow,
|
|
121
|
+
pulse,
|
|
122
|
+
sx: { maxWidth },
|
|
123
|
+
...props.PaperProps,
|
|
124
|
+
} as PaperProps & { customVariant?: string; glow?: boolean; pulse?: boolean }}
|
|
125
|
+
{...props}
|
|
126
|
+
>
|
|
127
|
+
{children}
|
|
128
|
+
</MuiPopover>
|
|
129
|
+
)
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
Popover.displayName = 'Popover';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { PopoverProps as MuiPopoverProps } from '@mui/material';
|
|
2
|
+
|
|
3
|
+
export interface PopoverProps extends Omit<MuiPopoverProps, 'variant'> {
|
|
4
|
+
/**
|
|
5
|
+
* The variant of the popover
|
|
6
|
+
*/
|
|
7
|
+
variant?: 'default' | 'glass' | 'arrow';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Whether the popover should have a glow effect
|
|
11
|
+
*/
|
|
12
|
+
glow?: boolean;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Whether the popover should have a pulse animation
|
|
16
|
+
*/
|
|
17
|
+
pulse?: boolean;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Whether to show an arrow pointing to the anchor
|
|
21
|
+
*/
|
|
22
|
+
arrow?: boolean;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Maximum width of the popover
|
|
26
|
+
*/
|
|
27
|
+
maxWidth?: number;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Test ID for testing purposes
|
|
31
|
+
*/
|
|
32
|
+
dataTestId?: string;
|
|
33
|
+
}
|
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
# Progress Component
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The Progress component provides a versatile way to display the progress of tasks and operations to users. It supports multiple visual variants including linear, circular, segmented, and gradient styles with customizable animations and effects.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Multiple Variants**: Linear, circular, segmented, and gradient progress indicators
|
|
10
|
+
- **Visual Effects**: Glow and pulse animations for enhanced feedback
|
|
11
|
+
- **Accessibility**: Full ARIA support with proper role and value attributes
|
|
12
|
+
- **Customization**: Size, color, and label options
|
|
13
|
+
- **Real-time Updates**: Supports dynamic value changes and indeterminate states
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
### Basic Usage
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { Progress } from '@procurement/ui';
|
|
21
|
+
|
|
22
|
+
// Basic linear progress
|
|
23
|
+
<Progress value={75} />
|
|
24
|
+
|
|
25
|
+
// With label
|
|
26
|
+
<Progress value={60} showLabel />
|
|
27
|
+
|
|
28
|
+
// Circular progress
|
|
29
|
+
<Progress variant="circular" value={80} showLabel />
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Variants
|
|
33
|
+
|
|
34
|
+
#### Linear Progress
|
|
35
|
+
|
|
36
|
+
The default linear progress bar for typical loading scenarios:
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
<Progress variant="linear" value={65} showLabel />
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
#### Circular Progress
|
|
43
|
+
|
|
44
|
+
Circular progress indicator for compact spaces:
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
<Progress variant="circular" value={75} size="lg" showLabel />
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
#### Segmented Progress
|
|
51
|
+
|
|
52
|
+
Segmented progress for step-based processes:
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
<Progress variant="segmented" value={60} segments={5} showLabel />
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
#### Gradient Progress
|
|
59
|
+
|
|
60
|
+
Enhanced progress with gradient fill:
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
<Progress variant="gradient" value={80} glow showLabel />
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Effects and Animations
|
|
67
|
+
|
|
68
|
+
#### Glow Effect
|
|
69
|
+
|
|
70
|
+
Adds a subtle glow around the progress indicator:
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
<Progress value={70} glow />
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
#### Pulse Animation
|
|
77
|
+
|
|
78
|
+
Creates a pulsing animation for active progress:
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
<Progress value={45} pulse />
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
#### Combined Effects
|
|
85
|
+
|
|
86
|
+
Both effects can be used together:
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
<Progress variant="circular" value={90} glow pulse showLabel />
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Indeterminate State
|
|
93
|
+
|
|
94
|
+
Show loading without specific progress value:
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
<Progress variant="linear" />
|
|
98
|
+
<Progress variant="circular" />
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Props
|
|
102
|
+
|
|
103
|
+
| Prop | Type | Default | Description |
|
|
104
|
+
| -------------- | ---------------------------------------------------------------------------- | ----------- | -------------------------------------- |
|
|
105
|
+
| `value` | `number` | - | Progress value (0-100) |
|
|
106
|
+
| `variant` | `'linear' \| 'circular' \| 'segmented' \| 'gradient' \| 'glass'` | `'linear'` | Visual style variant |
|
|
107
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Component size |
|
|
108
|
+
| `color` | `'primary' \| 'secondary' \| 'success' \| 'warning' \| 'error' \| 'neutral'` | `'primary'` | Progress color theme |
|
|
109
|
+
| `glow` | `boolean` | `false` | Enable glow effect |
|
|
110
|
+
| `pulse` | `boolean` | `false` | Enable pulse animation |
|
|
111
|
+
| `showLabel` | `boolean` | `false` | Display progress percentage |
|
|
112
|
+
| `label` | `string` | - | Custom label text |
|
|
113
|
+
| `segments` | `number` | `8` | Number of segments (segmented variant) |
|
|
114
|
+
| `thickness` | `number` | - | Circle thickness (circular variant) |
|
|
115
|
+
| `circularSize` | `number` | - | Circle size (circular variant) |
|
|
116
|
+
|
|
117
|
+
## Accessibility
|
|
118
|
+
|
|
119
|
+
The Progress component includes comprehensive accessibility support:
|
|
120
|
+
|
|
121
|
+
- **ARIA Role**: Uses `progressbar` role for screen readers
|
|
122
|
+
- **ARIA Values**: Provides `aria-valuenow`, `aria-valuemin`, and `aria-valuemax` attributes
|
|
123
|
+
- **ARIA Label**: Supports `aria-label` for custom descriptions
|
|
124
|
+
- **Screen Reader**: Announces progress changes and completion states
|
|
125
|
+
- **Keyboard**: No keyboard interaction required for progress indicators
|
|
126
|
+
|
|
127
|
+
### Screen Reader Support
|
|
128
|
+
|
|
129
|
+
```tsx
|
|
130
|
+
<Progress value={75} showLabel aria-label="File upload progress: 75% complete" />
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Examples
|
|
134
|
+
|
|
135
|
+
### File Upload Progress
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
const [progress, setProgress] = useState(0);
|
|
139
|
+
|
|
140
|
+
return (
|
|
141
|
+
<Progress variant="gradient" value={progress} showLabel glow aria-label="File upload progress" />
|
|
142
|
+
);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Skill Level Indicator
|
|
146
|
+
|
|
147
|
+
```tsx
|
|
148
|
+
<Progress variant="segmented" segments={5} value={80} color="success" label="Advanced" />
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### System Dashboard
|
|
152
|
+
|
|
153
|
+
```tsx
|
|
154
|
+
<Progress
|
|
155
|
+
variant="circular"
|
|
156
|
+
value={72}
|
|
157
|
+
showLabel
|
|
158
|
+
color="warning"
|
|
159
|
+
size="lg"
|
|
160
|
+
glow
|
|
161
|
+
aria-label="CPU usage at 72%"
|
|
162
|
+
/>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Best Practices
|
|
166
|
+
|
|
167
|
+
1. **Use appropriate variants**: Linear for general progress, circular for compact spaces, segmented for step-based processes
|
|
168
|
+
2. **Include labels**: Always use `showLabel` or custom `label` for clarity
|
|
169
|
+
3. **Choose meaningful colors**: Use semantic colors (success for completion, warning for high usage, error for problems)
|
|
170
|
+
4. **Provide ARIA labels**: Include descriptive `aria-label` attributes for screen readers
|
|
171
|
+
5. **Consider effects**: Use glow and pulse effects sparingly for critical progress indicators
|
|
172
|
+
6. **Update regularly**: For real-time progress, update values frequently enough to appear smooth
|
|
173
|
+
7. **Handle completion**: Provide clear visual or textual feedback when progress reaches 100%
|
|
174
|
+
|
|
175
|
+
## Testing
|
|
176
|
+
|
|
177
|
+
The Progress component includes comprehensive test IDs for automated testing:
|
|
178
|
+
|
|
179
|
+
### Test IDs
|
|
180
|
+
|
|
181
|
+
The component uses a hierarchical test ID structure:
|
|
182
|
+
|
|
183
|
+
| Element | Test ID | Description |
|
|
184
|
+
| --- | --- | --- |
|
|
185
|
+
| Container | `{dataTestId}` | Main progress container (default: `progress`) |
|
|
186
|
+
| Linear Progress | `{dataTestId}-linear` | Linear progress bar element |
|
|
187
|
+
| Circular Progress | `{dataTestId}-circular` | Circular progress indicator |
|
|
188
|
+
| Segments Container | `{dataTestId}-segments-container` | Container for segmented progress |
|
|
189
|
+
| Individual Segment | `{dataTestId}-segment-{index}` | Each segment in segmented variant (0-indexed) |
|
|
190
|
+
| Label | `{dataTestId}-label` | Progress label/percentage text |
|
|
191
|
+
|
|
192
|
+
### Testing Examples
|
|
193
|
+
|
|
194
|
+
#### Unit Testing with Testing Library
|
|
195
|
+
|
|
196
|
+
```tsx
|
|
197
|
+
import { render, screen } from '@testing-library/react';
|
|
198
|
+
import { Progress } from '@procurement/ui';
|
|
199
|
+
|
|
200
|
+
describe('Progress Component', () => {
|
|
201
|
+
it('should render linear progress with correct value', () => {
|
|
202
|
+
render(<Progress value={75} dataTestId="upload-progress" />);
|
|
203
|
+
|
|
204
|
+
const progress = screen.getByTestId('upload-progress');
|
|
205
|
+
const linearBar = screen.getByTestId('upload-progress-linear');
|
|
206
|
+
|
|
207
|
+
expect(progress).toBeInTheDocument();
|
|
208
|
+
expect(linearBar).toHaveAttribute('aria-valuenow', '75');
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it('should display label when showLabel is true', () => {
|
|
212
|
+
render(<Progress value={60} showLabel dataTestId="file-progress" />);
|
|
213
|
+
|
|
214
|
+
const label = screen.getByTestId('file-progress-label');
|
|
215
|
+
expect(label).toHaveTextContent('60%');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('should render custom label text', () => {
|
|
219
|
+
render(<Progress value={80} showLabel label="Almost done" dataTestId="custom-progress" />);
|
|
220
|
+
|
|
221
|
+
const label = screen.getByTestId('custom-progress-label');
|
|
222
|
+
expect(label).toHaveTextContent('Almost done');
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('should render circular variant', () => {
|
|
226
|
+
render(<Progress variant="circular" value={90} dataTestId="circular-progress" />);
|
|
227
|
+
|
|
228
|
+
const circular = screen.getByTestId('circular-progress-circular');
|
|
229
|
+
expect(circular).toBeInTheDocument();
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('should render segmented variant with correct number of segments', () => {
|
|
233
|
+
render(<Progress variant="segmented" value={50} segments={5} dataTestId="step-progress" />);
|
|
234
|
+
|
|
235
|
+
const container = screen.getByTestId('step-progress-segments-container');
|
|
236
|
+
const segments = [
|
|
237
|
+
screen.getByTestId('step-progress-segment-0'),
|
|
238
|
+
screen.getByTestId('step-progress-segment-1'),
|
|
239
|
+
screen.getByTestId('step-progress-segment-2'),
|
|
240
|
+
screen.getByTestId('step-progress-segment-3'),
|
|
241
|
+
screen.getByTestId('step-progress-segment-4'),
|
|
242
|
+
];
|
|
243
|
+
|
|
244
|
+
expect(container).toBeInTheDocument();
|
|
245
|
+
expect(segments).toHaveLength(5);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
it('should render indeterminate progress when value is not provided', () => {
|
|
249
|
+
render(<Progress dataTestId="loading-progress" />);
|
|
250
|
+
|
|
251
|
+
const linear = screen.getByTestId('loading-progress-linear');
|
|
252
|
+
expect(linear).not.toHaveAttribute('aria-valuenow');
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it('should apply correct color', () => {
|
|
256
|
+
render(<Progress value={85} color="success" dataTestId="success-progress" />);
|
|
257
|
+
|
|
258
|
+
const progress = screen.getByTestId('success-progress');
|
|
259
|
+
expect(progress).toBeInTheDocument();
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
#### E2E Testing with Playwright
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
import { test, expect } from '@playwright/test';
|
|
268
|
+
|
|
269
|
+
test.describe('Progress Component', () => {
|
|
270
|
+
test('should display progress and update value', async ({ page }) => {
|
|
271
|
+
await page.goto('/progress-demo');
|
|
272
|
+
|
|
273
|
+
const progress = page.getByTestId('upload-progress');
|
|
274
|
+
await expect(progress).toBeVisible();
|
|
275
|
+
|
|
276
|
+
const label = page.getByTestId('upload-progress-label');
|
|
277
|
+
await expect(label).toHaveText('0%');
|
|
278
|
+
|
|
279
|
+
// Simulate progress update
|
|
280
|
+
await page.click('[data-testid="start-upload"]');
|
|
281
|
+
|
|
282
|
+
// Wait for progress to update
|
|
283
|
+
await expect(label).toHaveText('100%', { timeout: 5000 });
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test('should render segmented progress with filled segments', async ({ page }) => {
|
|
287
|
+
await page.goto('/segmented-progress');
|
|
288
|
+
|
|
289
|
+
const segment0 = page.getByTestId('step-progress-segment-0');
|
|
290
|
+
const segment4 = page.getByTestId('step-progress-segment-4');
|
|
291
|
+
|
|
292
|
+
await expect(segment0).toBeVisible();
|
|
293
|
+
await expect(segment4).toBeVisible();
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
test('should have correct ARIA attributes', async ({ page }) => {
|
|
297
|
+
await page.goto('/progress-demo');
|
|
298
|
+
|
|
299
|
+
const progress = page.getByTestId('file-progress-linear');
|
|
300
|
+
|
|
301
|
+
await expect(progress).toHaveAttribute('role', 'progressbar');
|
|
302
|
+
await expect(progress).toHaveAttribute('aria-valuemin', '0');
|
|
303
|
+
await expect(progress).toHaveAttribute('aria-valuemax', '100');
|
|
304
|
+
await expect(progress).toHaveAttribute('aria-valuenow', '75');
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
test('should display glow and pulse effects', async ({ page }) => {
|
|
308
|
+
await page.goto('/progress-effects');
|
|
309
|
+
|
|
310
|
+
const progress = page.getByTestId('effect-progress-linear');
|
|
311
|
+
|
|
312
|
+
// Check for glow effect (via computed styles)
|
|
313
|
+
const boxShadow = await progress.evaluate((el) => {
|
|
314
|
+
return window.getComputedStyle(el.querySelector('.MuiLinearProgress-bar')).boxShadow;
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
expect(boxShadow).not.toBe('none');
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
#### Integration Testing
|
|
323
|
+
|
|
324
|
+
```tsx
|
|
325
|
+
import { render, screen, waitFor } from '@testing-library/react';
|
|
326
|
+
import { Progress } from '@procurement/ui';
|
|
327
|
+
|
|
328
|
+
describe('Progress Integration', () => {
|
|
329
|
+
it('should update progress value dynamically', async () => {
|
|
330
|
+
const { rerender } = render(
|
|
331
|
+
<Progress value={0} showLabel dataTestId="dynamic-progress" />
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
let label = screen.getByTestId('dynamic-progress-label');
|
|
335
|
+
expect(label).toHaveTextContent('0%');
|
|
336
|
+
|
|
337
|
+
// Simulate progress updates
|
|
338
|
+
for (let i = 25; i <= 100; i += 25) {
|
|
339
|
+
rerender(<Progress value={i} showLabel dataTestId="dynamic-progress" />);
|
|
340
|
+
|
|
341
|
+
await waitFor(() => {
|
|
342
|
+
label = screen.getByTestId('dynamic-progress-label');
|
|
343
|
+
expect(label).toHaveTextContent(`${i}%`);
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
it('should switch between variants', () => {
|
|
349
|
+
const { rerender } = render(
|
|
350
|
+
<Progress variant="linear" value={50} dataTestId="variant-progress" />
|
|
351
|
+
);
|
|
352
|
+
|
|
353
|
+
expect(screen.getByTestId('variant-progress-linear')).toBeInTheDocument();
|
|
354
|
+
|
|
355
|
+
rerender(<Progress variant="circular" value={50} dataTestId="variant-progress" />);
|
|
356
|
+
|
|
357
|
+
expect(screen.getByTestId('variant-progress-circular')).toBeInTheDocument();
|
|
358
|
+
expect(screen.queryByTestId('variant-progress-linear')).not.toBeInTheDocument();
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
it('should handle segmented progress filled state', () => {
|
|
362
|
+
const segments = 10;
|
|
363
|
+
const value = 55; // Should fill ~5.5 segments
|
|
364
|
+
|
|
365
|
+
render(
|
|
366
|
+
<Progress
|
|
367
|
+
variant="segmented"
|
|
368
|
+
segments={segments}
|
|
369
|
+
value={value}
|
|
370
|
+
dataTestId="segment-test"
|
|
371
|
+
/>
|
|
372
|
+
);
|
|
373
|
+
|
|
374
|
+
const container = screen.getByTestId('segment-test-segments-container');
|
|
375
|
+
expect(container.children).toHaveLength(segments);
|
|
376
|
+
|
|
377
|
+
// Verify individual segments are rendered
|
|
378
|
+
for (let i = 0; i < segments; i++) {
|
|
379
|
+
const segment = screen.getByTestId(`segment-test-segment-${i}`);
|
|
380
|
+
expect(segment).toBeInTheDocument();
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Accessibility Testing
|
|
387
|
+
|
|
388
|
+
```tsx
|
|
389
|
+
import { render } from '@testing-library/react';
|
|
390
|
+
import { axe, toHaveNoViolations } from 'jest-axe';
|
|
391
|
+
import { Progress } from '@procurement/ui';
|
|
392
|
+
|
|
393
|
+
expect.extend(toHaveNoViolations);
|
|
394
|
+
|
|
395
|
+
describe('Progress Accessibility', () => {
|
|
396
|
+
it('should have no accessibility violations', async () => {
|
|
397
|
+
const { container } = render(
|
|
398
|
+
<Progress
|
|
399
|
+
value={75}
|
|
400
|
+
showLabel
|
|
401
|
+
aria-label="File upload progress"
|
|
402
|
+
dataTestId="accessible-progress"
|
|
403
|
+
/>
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
const results = await axe(container);
|
|
407
|
+
expect(results).toHaveNoViolations();
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
it('should provide proper ARIA attributes for screen readers', () => {
|
|
411
|
+
render(
|
|
412
|
+
<Progress
|
|
413
|
+
value={60}
|
|
414
|
+
showLabel
|
|
415
|
+
aria-label="Download progress: 60%"
|
|
416
|
+
dataTestId="aria-progress"
|
|
417
|
+
/>
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
const progress = screen.getByTestId('aria-progress-linear');
|
|
421
|
+
|
|
422
|
+
expect(progress).toHaveAttribute('role', 'progressbar');
|
|
423
|
+
expect(progress).toHaveAttribute('aria-valuenow', '60');
|
|
424
|
+
expect(progress).toHaveAttribute('aria-valuemin', '0');
|
|
425
|
+
expect(progress).toHaveAttribute('aria-valuemax', '100');
|
|
426
|
+
expect(progress).toHaveAttribute('aria-label', 'Download progress: 60%');
|
|
427
|
+
});
|
|
428
|
+
});
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Best Practices for Testing
|
|
432
|
+
|
|
433
|
+
1. **Use descriptive test IDs**: Always provide a meaningful `dataTestId` prop for better test readability
|
|
434
|
+
2. **Test all variants**: Ensure tests cover linear, circular, segmented, gradient, and glass variants
|
|
435
|
+
3. **Verify ARIA attributes**: Check that accessibility attributes are correctly applied
|
|
436
|
+
4. **Test dynamic updates**: Validate that progress updates correctly when value changes
|
|
437
|
+
5. **Test label rendering**: Verify both default percentage labels and custom labels
|
|
438
|
+
6. **Test edge cases**: Include tests for 0%, 100%, and indeterminate states
|
|
439
|
+
7. **Verify visual effects**: Test that glow and pulse effects are applied when enabled
|
|
440
|
+
8. **Test segment calculations**: For segmented variant, verify correct number of filled segments
|
|
441
|
+
|
|
442
|
+
## Theme Integration
|
|
443
|
+
|
|
444
|
+
The Progress component integrates with the MUI theme system and supports:
|
|
445
|
+
|
|
446
|
+
- Custom color palettes
|
|
447
|
+
- Consistent spacing and sizing
|
|
448
|
+
- Dark/light theme variants
|
|
449
|
+
- Responsive design tokens
|
|
450
|
+
- Glass morphism effects (when using glass variant)
|