@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,578 @@
|
|
|
1
|
+
# PhoneInput Component
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
An international phone number input component with country selection, automatic formatting, and validation using libphonenumber-js. Features a dropdown country selector with flags, dial codes, and real-time phone number validation with glass morphism styling options.
|
|
6
|
+
|
|
7
|
+
## Props
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Default | Description |
|
|
10
|
+
| ------------ | --------------------------------- | -------------------- | ----------------------------------------------- |
|
|
11
|
+
| variant | 'glass' \| 'outlined' \| 'filled' | 'outlined' | Input styling variant |
|
|
12
|
+
| label | string | 'Phone Number' | Input field label |
|
|
13
|
+
| placeholder | string | 'Enter phone number' | Placeholder text |
|
|
14
|
+
| icon | React.ReactNode | PhoneIcon | Custom end adornment icon |
|
|
15
|
+
| defaultValue | string | '' | Initial phone number value |
|
|
16
|
+
| countryCode | CountryCode | 'US' | Default selected country |
|
|
17
|
+
| floating | boolean | false | Floating label style |
|
|
18
|
+
| onChange | function | undefined | Callback with value, validity, and country code |
|
|
19
|
+
| helper | string | undefined | Helper text below input |
|
|
20
|
+
| error | boolean | false | Error state |
|
|
21
|
+
| errorMessage | string | undefined | Custom error message |
|
|
22
|
+
| disabled | boolean | false | Disabled state |
|
|
23
|
+
| required | boolean | false | Required field indicator |
|
|
24
|
+
| fullWidth | boolean | true | Full width styling |
|
|
25
|
+
|
|
26
|
+
## Usage Examples
|
|
27
|
+
|
|
28
|
+
### Basic Usage
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
import { PhoneInput } from '@ui/components/enhanced';
|
|
32
|
+
|
|
33
|
+
<PhoneInput label="Phone Number" placeholder="Enter your phone number" />;
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Glass Variant
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
<PhoneInput variant="glass" label="Phone Number" countryCode="BR" />
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### With Validation
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
<PhoneInput
|
|
46
|
+
label="Phone Number"
|
|
47
|
+
onChange={(value, isValid, countryCode) => {
|
|
48
|
+
console.log('Phone:', value, 'Valid:', isValid, 'Country:', countryCode);
|
|
49
|
+
}}
|
|
50
|
+
/>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### With Error Handling
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
<PhoneInput label="Phone Number" error={true} errorMessage="Please enter a valid phone number" />
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Features
|
|
60
|
+
|
|
61
|
+
- **International Support**: Supports 15 major countries with flags and dial codes
|
|
62
|
+
- **Real-time Validation**: Uses libphonenumber-js for accurate validation
|
|
63
|
+
- **Automatic Formatting**: Formats phone numbers according to international standards
|
|
64
|
+
- **Glass Morphism**: Optional glass effect styling with backdrop blur
|
|
65
|
+
- **Accessibility**: Full keyboard navigation and screen reader support
|
|
66
|
+
- **Country Selection**: Dropdown with flag icons and country names
|
|
67
|
+
|
|
68
|
+
## Accessibility
|
|
69
|
+
|
|
70
|
+
- Full keyboard navigation support
|
|
71
|
+
- Screen reader compatible with proper ARIA labels
|
|
72
|
+
- Focus management between country selector and input field
|
|
73
|
+
- Proper error state announcements
|
|
74
|
+
|
|
75
|
+
## Best Practices
|
|
76
|
+
|
|
77
|
+
1. Always provide a meaningful label
|
|
78
|
+
2. Use appropriate error messages for validation
|
|
79
|
+
3. Consider the user's likely country when setting defaultCountryCode
|
|
80
|
+
4. Test with various phone number formats
|
|
81
|
+
5. Provide helper text when needed to guide users
|
|
82
|
+
|
|
83
|
+
## Testing
|
|
84
|
+
|
|
85
|
+
### Overview
|
|
86
|
+
This section describes all `data-testid` attributes available in the PhoneInput component for testing purposes.
|
|
87
|
+
|
|
88
|
+
### Test IDs
|
|
89
|
+
|
|
90
|
+
#### Container Elements
|
|
91
|
+
|
|
92
|
+
##### `phone-input-container`
|
|
93
|
+
- **Element:** Root wrapper Box
|
|
94
|
+
- **Location:** Main container that wraps the TextField and CountryMenu
|
|
95
|
+
- **Usage:** Query the root container to verify component is rendered
|
|
96
|
+
```typescript
|
|
97
|
+
const container = await canvas.findByTestId('phone-input-container');
|
|
98
|
+
expect(container).toBeInTheDocument();
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
#### Input Elements
|
|
102
|
+
|
|
103
|
+
##### `phone-input-field`
|
|
104
|
+
- **Element:** TextField input element (GlassTextField or standard TextField)
|
|
105
|
+
- **Location:** The main text input field for phone number entry
|
|
106
|
+
- **Type:** `tel` input
|
|
107
|
+
- **Usage:** Query the input to type phone numbers and verify values
|
|
108
|
+
```typescript
|
|
109
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
110
|
+
await userEvent.type(input, '5551234567');
|
|
111
|
+
|
|
112
|
+
// Verify formatted value
|
|
113
|
+
await waitFor(async () => {
|
|
114
|
+
const field = await canvas.findByTestId('phone-input-field');
|
|
115
|
+
expect(field).toHaveValue(/\+1.*555.*123.*4567/);
|
|
116
|
+
}, { timeout: 1000 });
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
#### Country Selector Elements
|
|
120
|
+
|
|
121
|
+
##### `country-selector`
|
|
122
|
+
- **Element:** Country selector button
|
|
123
|
+
- **Location:** Box inside InputAdornment (start position) that displays flag and dial code
|
|
124
|
+
- **Role:** `button`
|
|
125
|
+
- **ARIA:** `aria-label="Select country"`
|
|
126
|
+
- **Usage:** Click to open country selection menu
|
|
127
|
+
```typescript
|
|
128
|
+
const selector = await canvas.findByTestId('country-selector');
|
|
129
|
+
await userEvent.click(selector);
|
|
130
|
+
|
|
131
|
+
// Wait for menu to open
|
|
132
|
+
const menu = await canvas.findByTestId('country-menu');
|
|
133
|
+
expect(menu).toBeVisible();
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
##### `country-menu`
|
|
137
|
+
- **Element:** Country selection dropdown menu
|
|
138
|
+
- **Location:** CountryMenu (styled MUI Menu) component
|
|
139
|
+
- **Conditional:** Only visible when `anchorEl` is set (menu is open)
|
|
140
|
+
- **Usage:** Query to verify menu is open and contains country options
|
|
141
|
+
```typescript
|
|
142
|
+
// Click selector to open menu
|
|
143
|
+
const selector = await canvas.findByTestId('country-selector');
|
|
144
|
+
await userEvent.click(selector);
|
|
145
|
+
|
|
146
|
+
// Verify menu appears
|
|
147
|
+
const menu = await canvas.findByTestId('country-menu');
|
|
148
|
+
expect(menu).toBeInTheDocument();
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
##### `country-option-${countryCode}`
|
|
152
|
+
- **Element:** Individual country menu item
|
|
153
|
+
- **Location:** MenuItem inside CountryMenu
|
|
154
|
+
- **Country Code:** Two-letter ISO country code (e.g., `US`, `GB`, `CA`)
|
|
155
|
+
- **Usage:** Query specific country option to select it
|
|
156
|
+
```typescript
|
|
157
|
+
// Open menu
|
|
158
|
+
await userEvent.click(await canvas.findByTestId('country-selector'));
|
|
159
|
+
|
|
160
|
+
// Select United Kingdom
|
|
161
|
+
const ukOption = await canvas.findByTestId('country-option-GB');
|
|
162
|
+
await userEvent.click(ukOption);
|
|
163
|
+
|
|
164
|
+
// Verify country changed (dial code should update)
|
|
165
|
+
const selector = await canvas.findByTestId('country-selector');
|
|
166
|
+
expect(selector).toHaveTextContent('+44');
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Test Patterns
|
|
170
|
+
|
|
171
|
+
#### Basic Input Test
|
|
172
|
+
```typescript
|
|
173
|
+
play: async ({ canvasElement, args }) => {
|
|
174
|
+
const canvas = within(canvasElement);
|
|
175
|
+
|
|
176
|
+
// Get input field
|
|
177
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
178
|
+
|
|
179
|
+
// Type phone number
|
|
180
|
+
await userEvent.type(input, '5551234567');
|
|
181
|
+
|
|
182
|
+
// Verify onChange was called
|
|
183
|
+
expect(args.onChange).toHaveBeenCalled();
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
#### Country Selection Test
|
|
188
|
+
```typescript
|
|
189
|
+
play: async ({ canvasElement }) => {
|
|
190
|
+
const canvas = within(canvasElement);
|
|
191
|
+
|
|
192
|
+
// Click country selector
|
|
193
|
+
const selector = await canvas.findByTestId('country-selector');
|
|
194
|
+
await userEvent.click(selector);
|
|
195
|
+
|
|
196
|
+
// Wait for menu
|
|
197
|
+
const menu = await canvas.findByTestId('country-menu');
|
|
198
|
+
expect(menu).toBeVisible();
|
|
199
|
+
|
|
200
|
+
// Select country
|
|
201
|
+
const countryOption = await canvas.findByTestId('country-option-GB');
|
|
202
|
+
await userEvent.click(countryOption);
|
|
203
|
+
|
|
204
|
+
// Verify selector shows new country
|
|
205
|
+
await waitFor(async () => {
|
|
206
|
+
const updatedSelector = await canvas.findByTestId('country-selector');
|
|
207
|
+
expect(updatedSelector).toHaveTextContent('+44');
|
|
208
|
+
}, { timeout: 500 });
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
#### Phone Number Formatting Test
|
|
213
|
+
```typescript
|
|
214
|
+
play: async ({ canvasElement }) => {
|
|
215
|
+
const canvas = within(canvasElement);
|
|
216
|
+
|
|
217
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
218
|
+
|
|
219
|
+
// Type unformatted number
|
|
220
|
+
await userEvent.type(input, '5551234567');
|
|
221
|
+
|
|
222
|
+
// Blur to trigger formatting
|
|
223
|
+
await userEvent.tab();
|
|
224
|
+
|
|
225
|
+
// Verify formatted with country code
|
|
226
|
+
await waitFor(async () => {
|
|
227
|
+
const field = await canvas.findByTestId('phone-input-field');
|
|
228
|
+
const value = field.getAttribute('value') || '';
|
|
229
|
+
expect(value).toMatch(/\+1.*555.*123.*4567/);
|
|
230
|
+
}, { timeout: 1000 });
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
#### Validation Test
|
|
235
|
+
```typescript
|
|
236
|
+
play: async ({ canvasElement }) => {
|
|
237
|
+
const canvas = within(canvasElement);
|
|
238
|
+
|
|
239
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
240
|
+
|
|
241
|
+
// Type invalid number
|
|
242
|
+
await userEvent.type(input, '123');
|
|
243
|
+
|
|
244
|
+
// Blur to trigger validation
|
|
245
|
+
await userEvent.tab();
|
|
246
|
+
|
|
247
|
+
// Wait for error message
|
|
248
|
+
await waitFor(() => {
|
|
249
|
+
const error = canvas.getByText(/Invalid phone number/i);
|
|
250
|
+
expect(error).toBeVisible();
|
|
251
|
+
}, { timeout: 500 });
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
#### Auto-Detect Country Test
|
|
256
|
+
```typescript
|
|
257
|
+
play: async ({ canvasElement }) => {
|
|
258
|
+
const canvas = within(canvasElement);
|
|
259
|
+
|
|
260
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
261
|
+
|
|
262
|
+
// Type international format with +44 (UK)
|
|
263
|
+
await userEvent.type(input, '+447911123456');
|
|
264
|
+
|
|
265
|
+
// Verify country auto-detected
|
|
266
|
+
await waitFor(async () => {
|
|
267
|
+
const selector = await canvas.findByTestId('country-selector');
|
|
268
|
+
expect(selector).toHaveTextContent('🇬🇧'); // UK flag
|
|
269
|
+
expect(selector).toHaveTextContent('+44');
|
|
270
|
+
}, { timeout: 500 });
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
#### Keyboard Navigation Test
|
|
275
|
+
```typescript
|
|
276
|
+
play: async ({ canvasElement }) => {
|
|
277
|
+
const canvas = within(canvasElement);
|
|
278
|
+
|
|
279
|
+
const selector = await canvas.findByTestId('country-selector');
|
|
280
|
+
|
|
281
|
+
// Focus selector
|
|
282
|
+
selector.focus();
|
|
283
|
+
|
|
284
|
+
// Press Enter to open menu
|
|
285
|
+
await userEvent.keyboard('{Enter}');
|
|
286
|
+
|
|
287
|
+
// Verify menu opens
|
|
288
|
+
const menu = await canvas.findByTestId('country-menu');
|
|
289
|
+
expect(menu).toBeVisible();
|
|
290
|
+
|
|
291
|
+
// Can also use Space key
|
|
292
|
+
await userEvent.keyboard('{Escape}'); // Close first
|
|
293
|
+
await waitFor(() => {
|
|
294
|
+
expect(canvas.queryByTestId('country-menu')).not.toBeInTheDocument();
|
|
295
|
+
}, { timeout: 500 });
|
|
296
|
+
|
|
297
|
+
selector.focus();
|
|
298
|
+
await userEvent.keyboard(' '); // Space
|
|
299
|
+
|
|
300
|
+
const menuReopened = await canvas.findByTestId('country-menu');
|
|
301
|
+
expect(menuReopened).toBeVisible();
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
#### Disabled State Test
|
|
306
|
+
```typescript
|
|
307
|
+
play: async ({ canvasElement }) => {
|
|
308
|
+
const canvas = within(canvasElement);
|
|
309
|
+
|
|
310
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
311
|
+
|
|
312
|
+
// Verify input is disabled
|
|
313
|
+
expect(input).toBeDisabled();
|
|
314
|
+
|
|
315
|
+
// Country selector should still work (by design) or be disabled
|
|
316
|
+
const selector = canvas.queryByTestId('country-selector');
|
|
317
|
+
if (selector) {
|
|
318
|
+
// If selector exists, it can still be clicked
|
|
319
|
+
// This allows changing country even when input is disabled
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
#### Glass Variant Test
|
|
325
|
+
```typescript
|
|
326
|
+
play: async ({ canvasElement }) => {
|
|
327
|
+
const canvas = within(canvasElement);
|
|
328
|
+
|
|
329
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
330
|
+
|
|
331
|
+
// Verify glass effect styling
|
|
332
|
+
const inputRoot = input.closest('.MuiOutlinedInput-root');
|
|
333
|
+
if (inputRoot) {
|
|
334
|
+
const style = window.getComputedStyle(inputRoot);
|
|
335
|
+
expect(style.backdropFilter).toContain('blur');
|
|
336
|
+
expect(style.background).toContain('gradient');
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### Props That Affect Test Behavior
|
|
342
|
+
|
|
343
|
+
#### `variant`
|
|
344
|
+
- **Type:** `'outlined' | 'filled' | 'standard' | 'glass'`
|
|
345
|
+
- **Default:** `'outlined'`
|
|
346
|
+
- **Impact:**
|
|
347
|
+
- `glass`: Uses GlassTextField with blur effect
|
|
348
|
+
- Others: Uses standard MUI TextField
|
|
349
|
+
|
|
350
|
+
#### `countryCode`
|
|
351
|
+
- **Type:** `CountryCode` (e.g., `'US'`, `'GB'`)
|
|
352
|
+
- **Default:** `'US'`
|
|
353
|
+
- **Impact:** Initial country selection
|
|
354
|
+
|
|
355
|
+
#### `defaultValue`
|
|
356
|
+
- **Type:** `string`
|
|
357
|
+
- **Default:** `''`
|
|
358
|
+
- **Impact:** Pre-fills input field
|
|
359
|
+
|
|
360
|
+
#### `disabled`
|
|
361
|
+
- **Type:** `boolean`
|
|
362
|
+
- **Default:** `false`
|
|
363
|
+
- **Impact:** Disables input field
|
|
364
|
+
|
|
365
|
+
#### `error` / `errorMessage`
|
|
366
|
+
- **Type:** `boolean` / `string`
|
|
367
|
+
- **Impact:** Shows error state and custom message
|
|
368
|
+
|
|
369
|
+
#### `onChange`
|
|
370
|
+
- **Type:** `(value: string, valid: boolean, country: CountryCode) => void`
|
|
371
|
+
- **Impact:** Called on input change with validation result
|
|
372
|
+
|
|
373
|
+
### Available Countries
|
|
374
|
+
|
|
375
|
+
The component supports 46 countries. Common country codes for testing:
|
|
376
|
+
|
|
377
|
+
- `US` - United States (+1)
|
|
378
|
+
- `GB` - United Kingdom (+44)
|
|
379
|
+
- `CA` - Canada (+1)
|
|
380
|
+
- `AU` - Australia (+61)
|
|
381
|
+
- `DE` - Germany (+49)
|
|
382
|
+
- `FR` - France (+33)
|
|
383
|
+
- `JP` - Japan (+81)
|
|
384
|
+
- `CN` - China (+86)
|
|
385
|
+
|
|
386
|
+
Full list available in component source.
|
|
387
|
+
|
|
388
|
+
### Common Test Scenarios
|
|
389
|
+
|
|
390
|
+
#### 1. Basic Rendering
|
|
391
|
+
```typescript
|
|
392
|
+
const container = await canvas.findByTestId('phone-input-container');
|
|
393
|
+
expect(container).toBeInTheDocument();
|
|
394
|
+
|
|
395
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
396
|
+
expect(input).toHaveAttribute('type', 'tel');
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
#### 2. Typing a Phone Number
|
|
400
|
+
```typescript
|
|
401
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
402
|
+
await userEvent.type(input, '5551234567');
|
|
403
|
+
expect(input).toHaveValue('5551234567'); // Before blur
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
#### 3. Changing Country
|
|
407
|
+
```typescript
|
|
408
|
+
await userEvent.click(await canvas.findByTestId('country-selector'));
|
|
409
|
+
await userEvent.click(await canvas.findByTestId('country-option-FR'));
|
|
410
|
+
|
|
411
|
+
// Verify country changed
|
|
412
|
+
const selector = await canvas.findByTestId('country-selector');
|
|
413
|
+
expect(selector).toHaveTextContent('🇫🇷');
|
|
414
|
+
expect(selector).toHaveTextContent('+33');
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
#### 4. Validating Phone Number
|
|
418
|
+
```typescript
|
|
419
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
420
|
+
await userEvent.type(input, '5551234567');
|
|
421
|
+
await userEvent.tab(); // Blur to trigger validation
|
|
422
|
+
|
|
423
|
+
// Check for validation feedback (icon color changes, or error message)
|
|
424
|
+
await waitFor(() => {
|
|
425
|
+
// Validation runs on blur - check onChange callback or error message
|
|
426
|
+
expect(args.onChange).toHaveBeenCalledWith(
|
|
427
|
+
expect.anything(),
|
|
428
|
+
true, // valid = true
|
|
429
|
+
'US'
|
|
430
|
+
);
|
|
431
|
+
}, { timeout: 500 });
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
#### 5. International Format Detection
|
|
435
|
+
```typescript
|
|
436
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
437
|
+
await userEvent.type(input, '+447911123456');
|
|
438
|
+
|
|
439
|
+
// Country should auto-switch to GB
|
|
440
|
+
await waitFor(async () => {
|
|
441
|
+
const selector = await canvas.findByTestId('country-selector');
|
|
442
|
+
expect(selector).toHaveTextContent('+44');
|
|
443
|
+
}, { timeout: 500 });
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
### Troubleshooting
|
|
447
|
+
|
|
448
|
+
#### Issue: "Cannot find phone-input-field"
|
|
449
|
+
|
|
450
|
+
**Reason:** Using synchronous query
|
|
451
|
+
|
|
452
|
+
**Solution:** Always use `await` with `findByTestId`:
|
|
453
|
+
```typescript
|
|
454
|
+
// ❌ Wrong
|
|
455
|
+
const input = canvas.getByTestId('phone-input-field');
|
|
456
|
+
|
|
457
|
+
// ✅ Correct
|
|
458
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
#### Issue: "country-menu not found"
|
|
462
|
+
|
|
463
|
+
**Reason:** Menu only renders when open
|
|
464
|
+
|
|
465
|
+
**Solution:** Click country selector first:
|
|
466
|
+
```typescript
|
|
467
|
+
const selector = await canvas.findByTestId('country-selector');
|
|
468
|
+
await userEvent.click(selector);
|
|
469
|
+
|
|
470
|
+
// Now menu will be available
|
|
471
|
+
const menu = await canvas.findByTestId('country-menu');
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
#### Issue: "Formatted value doesn't match expected pattern"
|
|
475
|
+
|
|
476
|
+
**Reason:** Formatting happens on blur, not immediately after typing
|
|
477
|
+
|
|
478
|
+
**Solution:** Trigger blur event:
|
|
479
|
+
```typescript
|
|
480
|
+
const input = await canvas.findByTestId('phone-input-field');
|
|
481
|
+
await userEvent.type(input, '5551234567');
|
|
482
|
+
|
|
483
|
+
// Trigger blur
|
|
484
|
+
await userEvent.tab();
|
|
485
|
+
|
|
486
|
+
// Now check formatted value
|
|
487
|
+
await waitFor(async () => {
|
|
488
|
+
const field = await canvas.findByTestId('phone-input-field');
|
|
489
|
+
expect(field).toHaveValue(/\+1/);
|
|
490
|
+
}, { timeout: 1000 });
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
#### Issue: "Country option testId not working"
|
|
494
|
+
|
|
495
|
+
**Reason:** Menu must be open before querying options
|
|
496
|
+
|
|
497
|
+
**Solution:**
|
|
498
|
+
```typescript
|
|
499
|
+
// Open menu first
|
|
500
|
+
await userEvent.click(await canvas.findByTestId('country-selector'));
|
|
501
|
+
|
|
502
|
+
// Wait for menu to fully render
|
|
503
|
+
const menu = await canvas.findByTestId('country-menu');
|
|
504
|
+
|
|
505
|
+
// Now query options within menu
|
|
506
|
+
const option = await within(menu).findByTestId('country-option-GB');
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
#### Issue: "onChange not called with expected arguments"
|
|
510
|
+
|
|
511
|
+
**Reason:** onChange signature includes 3 parameters
|
|
512
|
+
|
|
513
|
+
**Solution:** Check all 3 parameters:
|
|
514
|
+
```typescript
|
|
515
|
+
expect(args.onChange).toHaveBeenCalledWith(
|
|
516
|
+
'5551234567', // value
|
|
517
|
+
true, // isValid
|
|
518
|
+
'US' // countryCode
|
|
519
|
+
);
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
### Known Issues
|
|
523
|
+
|
|
524
|
+
#### Issue: Country Code Not in Formatted Output
|
|
525
|
+
|
|
526
|
+
**Status:** BUG - All 11 PhoneInput tests failing
|
|
527
|
+
**Description:** The `formatPhoneNumber` function returns formatted number but doesn't always include country code prefix
|
|
528
|
+
|
|
529
|
+
**Expected:**
|
|
530
|
+
```typescript
|
|
531
|
+
formatPhoneNumber('5551234567', 'US') // Should return: '+1 555 123 4567'
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
**Actual:**
|
|
535
|
+
```typescript
|
|
536
|
+
formatPhoneNumber('5551234567', 'US') // Returns: '555-123-4567' or '5551234567'
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
**Workaround for Tests:**
|
|
540
|
+
Until fixed, adjust test expectations or add explicit country code check:
|
|
541
|
+
```typescript
|
|
542
|
+
// Instead of expecting formatted with country code
|
|
543
|
+
expect(input).toHaveValue(/\+1.*555.*123.*4567/);
|
|
544
|
+
|
|
545
|
+
// Temporarily check without country code requirement
|
|
546
|
+
expect(input).toHaveValue(/555.*123.*4567/);
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
**Fix Required:**
|
|
550
|
+
Update `formatPhoneNumber` function to ensure `phoneNumber.formatInternational()` properly includes country code.
|
|
551
|
+
|
|
552
|
+
### Testing Best Practices
|
|
553
|
+
|
|
554
|
+
1. **Always use `await`** with testId queries
|
|
555
|
+
2. **Trigger blur** after typing to test formatting/validation
|
|
556
|
+
3. **Open menu before querying options** using country-selector
|
|
557
|
+
4. **Use waitFor** for async state changes (formatting, validation)
|
|
558
|
+
5. **Test with multiple countries** to ensure international support
|
|
559
|
+
6. **Verify both value and validation** in onChange callback
|
|
560
|
+
7. **Check visual feedback** (icon color, error messages) for validation state
|
|
561
|
+
|
|
562
|
+
### Related Elements Without TestIds
|
|
563
|
+
|
|
564
|
+
#### Input Field (Alternative Query)
|
|
565
|
+
- **Query Method:** `canvas.getByRole('textbox')` or `canvas.getByLabelText('Phone Number')`
|
|
566
|
+
- **Type Attribute:** `type="tel"`
|
|
567
|
+
|
|
568
|
+
#### Country Flag/Dial Display
|
|
569
|
+
- **No testId** - Query via parent country-selector
|
|
570
|
+
- **Contains:** Flag emoji and dial code text
|
|
571
|
+
|
|
572
|
+
#### Validation Icon
|
|
573
|
+
- **No testId** - Located in endAdornment
|
|
574
|
+
- **Query Method:** Look for PhoneIcon within InputAdornment
|
|
575
|
+
|
|
576
|
+
#### Helper Text / Error Message
|
|
577
|
+
- **No testId** - Query by text content
|
|
578
|
+
- **Query Method:** `canvas.getByText(/Invalid phone number/i)`
|