@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,633 @@
|
|
|
1
|
+
# AddressAutocomplete Component
|
|
2
|
+
|
|
3
|
+
A sophisticated address input component with Google Maps integration for autocomplete functionality. Provides structured address data with coordinates and supports different visual variants.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Google Maps Integration**: Real-time address suggestions via Google Places API
|
|
8
|
+
- **Glass Morphism Effect**: Beautiful glass variant with blur and transparency
|
|
9
|
+
- **Current Location Support**: Optional button to use device's current location
|
|
10
|
+
- **Geographic Restrictions**: Limit results to specific countries or place types
|
|
11
|
+
- **Structured Data**: Returns complete address details including coordinates
|
|
12
|
+
- **Accessible**: Full keyboard navigation and screen reader support
|
|
13
|
+
- **Responsive**: Adapts to different screen sizes
|
|
14
|
+
- **Multiple Variants**: Glass, outlined, and filled styles
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { AddressAutocomplete } from '@procurement/ui';
|
|
20
|
+
|
|
21
|
+
function AddressForm() {
|
|
22
|
+
const handleAddressSelect = (address: AddressDetails) => {
|
|
23
|
+
console.log('Selected:', address);
|
|
24
|
+
// address contains: formatted, street, city, state, country, postalCode, coordinates
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<AddressAutocomplete
|
|
29
|
+
variant="outlined"
|
|
30
|
+
label="Delivery Address"
|
|
31
|
+
placeholder="Enter your address..."
|
|
32
|
+
googleMapsApiKey="your-api-key"
|
|
33
|
+
onSelect={handleAddressSelect}
|
|
34
|
+
getCurrentLocation
|
|
35
|
+
helperText="We'll deliver to this address"
|
|
36
|
+
/>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Props
|
|
42
|
+
|
|
43
|
+
| Prop | Type | Default | Description |
|
|
44
|
+
| ------------------- | ------------------------------------------- | ------------ | ----------------------------------------------------- |
|
|
45
|
+
| `variant` | `'glass' \| 'outlined' \| 'filled'` | `'outlined'` | Visual style variant |
|
|
46
|
+
| `label` | `string` | - | Input field label |
|
|
47
|
+
| `placeholder` | `string` | - | Placeholder text |
|
|
48
|
+
| `icon` | `ReactNode` | - | Custom icon for the input |
|
|
49
|
+
| `onSelect` | `(address: AddressDetails) => void` | **Required** | Callback when address is selected |
|
|
50
|
+
| `googleMapsApiKey` | `string` | **Required** | Google Maps API key |
|
|
51
|
+
| `floating` | `boolean` | `false` | Use floating label style |
|
|
52
|
+
| `restrictions` | `{ country?: string[], types?: string[] }` | - | Geographic/type restrictions |
|
|
53
|
+
| `error` | `boolean` | `false` | Show error state |
|
|
54
|
+
| `helperText` | `string` | - | Helper text below input |
|
|
55
|
+
| `disabled` | `boolean` | `false` | Disable the input |
|
|
56
|
+
| `required` | `boolean` | `false` | Mark as required field |
|
|
57
|
+
| `fullWidth` | `boolean` | `false` | Take full container width |
|
|
58
|
+
| `defaultValue` | `string` | - | Initial input value |
|
|
59
|
+
| `getCurrentLocation`| `boolean` | `false` | Show current location button |
|
|
60
|
+
|
|
61
|
+
## AddressDetails Type
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
interface AddressDetails {
|
|
65
|
+
formatted: string; // Full formatted address
|
|
66
|
+
street: string; // Street name and number
|
|
67
|
+
city: string; // City name
|
|
68
|
+
state: string; // State/Province
|
|
69
|
+
country: string; // Country name
|
|
70
|
+
postalCode: string; // ZIP/Postal code
|
|
71
|
+
coordinates: {
|
|
72
|
+
lat: number; // Latitude
|
|
73
|
+
lng: number; // Longitude
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Examples
|
|
79
|
+
|
|
80
|
+
### Basic Usage
|
|
81
|
+
|
|
82
|
+
```tsx
|
|
83
|
+
<AddressAutocomplete
|
|
84
|
+
label="Address"
|
|
85
|
+
placeholder="Enter address..."
|
|
86
|
+
googleMapsApiKey="your-key"
|
|
87
|
+
onSelect={(address) => console.log(address)}
|
|
88
|
+
/>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Glass Variant with Current Location
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
<AddressAutocomplete
|
|
95
|
+
variant="glass"
|
|
96
|
+
label="Location"
|
|
97
|
+
getCurrentLocation
|
|
98
|
+
googleMapsApiKey="your-key"
|
|
99
|
+
onSelect={handleSelect}
|
|
100
|
+
/>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Restricted to US Addresses
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
<AddressAutocomplete
|
|
107
|
+
label="US Address"
|
|
108
|
+
restrictions={{ country: ['us'] }}
|
|
109
|
+
googleMapsApiKey="your-key"
|
|
110
|
+
onSelect={handleSelect}
|
|
111
|
+
helperText="Only US addresses allowed"
|
|
112
|
+
/>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Business Locations Only
|
|
116
|
+
|
|
117
|
+
```tsx
|
|
118
|
+
<AddressAutocomplete
|
|
119
|
+
label="Business Location"
|
|
120
|
+
icon={<BusinessIcon />}
|
|
121
|
+
restrictions={{ types: ['establishment'] }}
|
|
122
|
+
googleMapsApiKey="your-key"
|
|
123
|
+
onSelect={handleSelect}
|
|
124
|
+
/>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### With Form Validation
|
|
128
|
+
|
|
129
|
+
```tsx
|
|
130
|
+
<AddressAutocomplete
|
|
131
|
+
label="Required Address"
|
|
132
|
+
required
|
|
133
|
+
error={hasError}
|
|
134
|
+
helperText={errorMessage}
|
|
135
|
+
googleMapsApiKey="your-key"
|
|
136
|
+
onSelect={handleSelect}
|
|
137
|
+
/>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Accessibility
|
|
141
|
+
|
|
142
|
+
- Full keyboard navigation support
|
|
143
|
+
- Proper ARIA labels and roles
|
|
144
|
+
- Screen reader announcements for suggestions
|
|
145
|
+
- Focus management for dropdown
|
|
146
|
+
- Support for Tab, Arrow keys, Enter, and Escape
|
|
147
|
+
|
|
148
|
+
## Best Practices
|
|
149
|
+
|
|
150
|
+
1. **API Key Security**: Store Google Maps API key in environment variables
|
|
151
|
+
2. **Error Handling**: Implement proper error handling for API failures
|
|
152
|
+
3. **Loading States**: Show loading indicator while fetching suggestions
|
|
153
|
+
4. **Validation**: Validate selected address before form submission
|
|
154
|
+
5. **Restrictions**: Use geographic restrictions to improve relevance
|
|
155
|
+
6. **Debouncing**: Component internally debounces API calls
|
|
156
|
+
|
|
157
|
+
## Notes
|
|
158
|
+
|
|
159
|
+
- Requires valid Google Maps API key with Places API enabled
|
|
160
|
+
- Component handles API rate limiting internally
|
|
161
|
+
- Suggestions are debounced to minimize API calls
|
|
162
|
+
- Supports both residential and commercial addresses
|
|
163
|
+
- Coordinates are provided for mapping integrations
|
|
164
|
+
|
|
165
|
+
## Testing
|
|
166
|
+
|
|
167
|
+
This section describes all `data-testid` attributes available in the AddressAutocomplete component for testing purposes.
|
|
168
|
+
|
|
169
|
+
### Test IDs
|
|
170
|
+
|
|
171
|
+
#### Container Elements
|
|
172
|
+
|
|
173
|
+
##### `address-autocomplete-container`
|
|
174
|
+
- **Element:** Main AddressAutocomplete container
|
|
175
|
+
- **Location:** Root Box element that wraps the entire component
|
|
176
|
+
- **Usage:** Query the main container to verify AddressAutocomplete is rendered
|
|
177
|
+
```typescript
|
|
178
|
+
const container = await canvas.findByTestId('address-autocomplete-container');
|
|
179
|
+
expect(container).toBeInTheDocument();
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
##### `address-suggestions-dropdown`
|
|
183
|
+
- **Element:** Dropdown/popover containing address suggestions
|
|
184
|
+
- **Location:** Paper component that wraps all suggestion items
|
|
185
|
+
- **Usage:** Query the suggestions dropdown to verify it's visible when searching
|
|
186
|
+
```typescript
|
|
187
|
+
const dropdown = await canvas.findByTestId('address-suggestions-dropdown');
|
|
188
|
+
expect(dropdown).toBeInTheDocument();
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
#### Input Elements
|
|
192
|
+
|
|
193
|
+
##### `address-input`
|
|
194
|
+
- **Element:** Main text input field for address entry
|
|
195
|
+
- **Location:** Input element within the TextField/Autocomplete
|
|
196
|
+
- **Usage:** Query input to type addresses and trigger suggestions
|
|
197
|
+
```typescript
|
|
198
|
+
const input = await canvas.findByTestId('address-input');
|
|
199
|
+
await userEvent.type(input, '123 Main Street');
|
|
200
|
+
expect(input).toHaveValue('123 Main Street');
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
#### Suggestion Elements
|
|
204
|
+
|
|
205
|
+
##### `address-suggestion-${index}`
|
|
206
|
+
- **Element:** Individual suggestion item in dropdown
|
|
207
|
+
- **Location:** Each `<li>` element in the suggestions list
|
|
208
|
+
- **Usage:** Query specific suggestion by index to interact with it
|
|
209
|
+
```typescript
|
|
210
|
+
// Get first suggestion
|
|
211
|
+
const firstSuggestion = await canvas.findByTestId('address-suggestion-0');
|
|
212
|
+
await userEvent.click(firstSuggestion);
|
|
213
|
+
|
|
214
|
+
// Get all suggestions
|
|
215
|
+
const suggestions = await canvas.findAllByTestId(/address-suggestion-/);
|
|
216
|
+
expect(suggestions).toHaveLength(5);
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
##### `address-selected`
|
|
220
|
+
- **Element:** Selected/displayed address text container
|
|
221
|
+
- **Location:** AddressText component within each suggestion item
|
|
222
|
+
- **Usage:** Query to verify address formatting and content
|
|
223
|
+
```typescript
|
|
224
|
+
const addressText = await canvas.findByTestId('address-selected');
|
|
225
|
+
expect(addressText).toBeInTheDocument();
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
#### Loading & Action Elements
|
|
229
|
+
|
|
230
|
+
##### `address-loading`
|
|
231
|
+
- **Element:** Loading spinner indicator
|
|
232
|
+
- **Location:** CircularProgress component shown during API requests
|
|
233
|
+
- **Usage:** Query to verify loading state during address search
|
|
234
|
+
```typescript
|
|
235
|
+
// Check if loading indicator appears
|
|
236
|
+
const loading = canvas.queryByTestId('address-loading');
|
|
237
|
+
if (loading) {
|
|
238
|
+
expect(loading).toBeInTheDocument();
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
##### `address-current-location-button`
|
|
243
|
+
- **Element:** Current location button (when enabled)
|
|
244
|
+
- **Location:** IconButton in the input's end adornment
|
|
245
|
+
- **Usage:** Query and click to trigger geolocation functionality
|
|
246
|
+
```typescript
|
|
247
|
+
const locationButton = await canvas.findByTestId('address-current-location-button');
|
|
248
|
+
await userEvent.click(locationButton);
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Test Patterns
|
|
252
|
+
|
|
253
|
+
#### Wait for Component to Render
|
|
254
|
+
```typescript
|
|
255
|
+
import { waitFor, within } from 'storybook/test';
|
|
256
|
+
|
|
257
|
+
// Wait for container
|
|
258
|
+
const container = await canvas.findByTestId('address-autocomplete-container');
|
|
259
|
+
|
|
260
|
+
// Wait for input to be ready
|
|
261
|
+
const input = await canvas.findByTestId('address-input');
|
|
262
|
+
expect(input).toBeEnabled();
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
#### Type and Trigger Suggestions
|
|
266
|
+
```typescript
|
|
267
|
+
const input = await canvas.findByTestId('address-input');
|
|
268
|
+
|
|
269
|
+
// Type to trigger autocomplete (minimum 3 characters)
|
|
270
|
+
await userEvent.type(input, '123 main');
|
|
271
|
+
|
|
272
|
+
// Wait for suggestions to appear
|
|
273
|
+
await waitFor(async () => {
|
|
274
|
+
const dropdown = await canvas.findByTestId('address-suggestions-dropdown');
|
|
275
|
+
expect(dropdown).toBeInTheDocument();
|
|
276
|
+
}, { timeout: 2000 });
|
|
277
|
+
|
|
278
|
+
// Get all suggestions
|
|
279
|
+
const suggestions = await canvas.findAllByTestId(/address-suggestion-/);
|
|
280
|
+
expect(suggestions.length).toBeGreaterThan(0);
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
#### Select an Address
|
|
284
|
+
```typescript
|
|
285
|
+
const input = await canvas.findByTestId('address-input');
|
|
286
|
+
await userEvent.type(input, 'main street');
|
|
287
|
+
|
|
288
|
+
// Wait for suggestions
|
|
289
|
+
await waitFor(async () => {
|
|
290
|
+
const suggestions = await canvas.findAllByTestId(/address-suggestion-/);
|
|
291
|
+
expect(suggestions.length).toBeGreaterThan(0);
|
|
292
|
+
}, { timeout: 2000 });
|
|
293
|
+
|
|
294
|
+
// Click first suggestion
|
|
295
|
+
const firstSuggestion = await canvas.findByTestId('address-suggestion-0');
|
|
296
|
+
await userEvent.click(firstSuggestion);
|
|
297
|
+
|
|
298
|
+
// Verify callback was called
|
|
299
|
+
expect(args.onSelect).toHaveBeenCalledWith(
|
|
300
|
+
expect.objectContaining({
|
|
301
|
+
formatted: expect.any(String),
|
|
302
|
+
street: expect.any(String),
|
|
303
|
+
coordinates: expect.objectContaining({
|
|
304
|
+
lat: expect.any(Number),
|
|
305
|
+
lng: expect.any(Number),
|
|
306
|
+
}),
|
|
307
|
+
})
|
|
308
|
+
);
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
#### Test Loading State
|
|
312
|
+
```typescript
|
|
313
|
+
const input = await canvas.findByTestId('address-input');
|
|
314
|
+
await userEvent.type(input, '123');
|
|
315
|
+
|
|
316
|
+
// Check for loading indicator
|
|
317
|
+
await waitFor(() => {
|
|
318
|
+
const loading = canvas.queryByTestId('address-loading');
|
|
319
|
+
expect(loading).toBeInTheDocument();
|
|
320
|
+
}, { timeout: 1000 });
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
#### Use Current Location Feature
|
|
324
|
+
```typescript
|
|
325
|
+
// Verify button is present when getCurrentLocation=true
|
|
326
|
+
const locationButton = await canvas.findByTestId('address-current-location-button');
|
|
327
|
+
expect(locationButton).toBeInTheDocument();
|
|
328
|
+
|
|
329
|
+
// Click to trigger geolocation
|
|
330
|
+
await userEvent.click(locationButton);
|
|
331
|
+
|
|
332
|
+
// Wait for location to be retrieved and address populated
|
|
333
|
+
await waitFor(() => {
|
|
334
|
+
const input = canvas.getByTestId('address-input');
|
|
335
|
+
expect(input.value).not.toBe('');
|
|
336
|
+
}, { timeout: 3000 });
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Props That Affect Test Behavior
|
|
340
|
+
|
|
341
|
+
#### `googleMapsApiKey`
|
|
342
|
+
- **Values:** `string` (use `'demo-key'` or `'test-key'` for mock data)
|
|
343
|
+
- **Impact:**
|
|
344
|
+
- Real API key: Uses Google Places API
|
|
345
|
+
- `'demo-key'` or `'test-key'`: Uses mock address data
|
|
346
|
+
- **Test Tip:** Always use demo/test keys in Storybook tests
|
|
347
|
+
|
|
348
|
+
#### `getCurrentLocation`
|
|
349
|
+
- **Values:** `boolean`
|
|
350
|
+
- **Impact:** Shows/hides current location button
|
|
351
|
+
- **Test Tip:** Use `findByTestId('address-current-location-button')` when true
|
|
352
|
+
|
|
353
|
+
#### `loading`
|
|
354
|
+
- **Values:** `boolean` (internal state)
|
|
355
|
+
- **Impact:** Shows loading spinner during API requests
|
|
356
|
+
- **Test Tip:** Mock delays may cause intermittent loading states
|
|
357
|
+
|
|
358
|
+
#### `disabled`
|
|
359
|
+
- **Values:** `boolean`
|
|
360
|
+
- **Impact:** Disables input and all interactions
|
|
361
|
+
- **Test Tip:** Check `input.disabled` property
|
|
362
|
+
|
|
363
|
+
#### `error`
|
|
364
|
+
- **Values:** `boolean`
|
|
365
|
+
- **Impact:** Shows error state styling on input
|
|
366
|
+
- **Test Tip:** Verify visual error state
|
|
367
|
+
|
|
368
|
+
#### `variant`
|
|
369
|
+
- **Values:** `'outlined' | 'filled' | 'standard' | 'glass'`
|
|
370
|
+
- **Impact:** Changes TextField styling
|
|
371
|
+
- **Test Tip:** `'glass'` variant applies special backdrop blur effects
|
|
372
|
+
|
|
373
|
+
### Common Test Scenarios
|
|
374
|
+
|
|
375
|
+
#### 1. Basic Rendering Test
|
|
376
|
+
```typescript
|
|
377
|
+
play: async ({ canvasElement }) => {
|
|
378
|
+
const canvas = within(canvasElement);
|
|
379
|
+
|
|
380
|
+
// Wait for component to render
|
|
381
|
+
const container = await canvas.findByTestId('address-autocomplete-container');
|
|
382
|
+
expect(container).toBeInTheDocument();
|
|
383
|
+
|
|
384
|
+
// Verify input is present
|
|
385
|
+
const input = await canvas.findByTestId('address-input');
|
|
386
|
+
expect(input).toBeInTheDocument();
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
#### 2. Autocomplete Suggestions Test
|
|
391
|
+
```typescript
|
|
392
|
+
play: async ({ canvasElement }) => {
|
|
393
|
+
const canvas = within(canvasElement);
|
|
394
|
+
|
|
395
|
+
const input = await canvas.findByTestId('address-input');
|
|
396
|
+
|
|
397
|
+
// Type to trigger suggestions
|
|
398
|
+
await userEvent.type(input, '123 main');
|
|
399
|
+
|
|
400
|
+
// Wait for suggestions dropdown
|
|
401
|
+
await waitFor(async () => {
|
|
402
|
+
const dropdown = await canvas.findByTestId('address-suggestions-dropdown');
|
|
403
|
+
expect(dropdown).toBeInTheDocument();
|
|
404
|
+
}, { timeout: 2000 });
|
|
405
|
+
|
|
406
|
+
// Verify suggestions are present
|
|
407
|
+
const suggestions = await canvas.findAllByTestId(/address-suggestion-/);
|
|
408
|
+
expect(suggestions.length).toBeGreaterThan(0);
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
#### 3. Address Selection Test
|
|
413
|
+
```typescript
|
|
414
|
+
play: async ({ canvasElement, args }) => {
|
|
415
|
+
const canvas = within(canvasElement);
|
|
416
|
+
|
|
417
|
+
const input = await canvas.findByTestId('address-input');
|
|
418
|
+
await userEvent.type(input, 'pine');
|
|
419
|
+
|
|
420
|
+
// Wait for suggestions
|
|
421
|
+
await waitFor(async () => {
|
|
422
|
+
const suggestions = await canvas.findAllByTestId(/address-suggestion-/);
|
|
423
|
+
expect(suggestions.length).toBeGreaterThan(0);
|
|
424
|
+
}, { timeout: 2000 });
|
|
425
|
+
|
|
426
|
+
// Click first suggestion
|
|
427
|
+
const firstSuggestion = await canvas.findByTestId('address-suggestion-0');
|
|
428
|
+
await userEvent.click(firstSuggestion);
|
|
429
|
+
|
|
430
|
+
// Verify onSelect callback
|
|
431
|
+
await waitFor(() => {
|
|
432
|
+
expect(args.onSelect).toHaveBeenCalledWith(
|
|
433
|
+
expect.objectContaining({
|
|
434
|
+
formatted: expect.stringContaining('Pine'),
|
|
435
|
+
coordinates: expect.any(Object),
|
|
436
|
+
})
|
|
437
|
+
);
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
#### 4. Loading State Test
|
|
443
|
+
```typescript
|
|
444
|
+
play: async ({ canvasElement }) => {
|
|
445
|
+
const canvas = within(canvasElement);
|
|
446
|
+
|
|
447
|
+
const input = await canvas.findByTestId('address-input');
|
|
448
|
+
await userEvent.type(input, '123');
|
|
449
|
+
|
|
450
|
+
// Verify loading indicator appears
|
|
451
|
+
await waitFor(() => {
|
|
452
|
+
const loading = canvas.queryByTestId('address-loading');
|
|
453
|
+
expect(loading).toBeInTheDocument();
|
|
454
|
+
}, { timeout: 1000 });
|
|
455
|
+
}
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
#### 5. Current Location Test
|
|
459
|
+
```typescript
|
|
460
|
+
play: async ({ canvasElement, args }) => {
|
|
461
|
+
const canvas = within(canvasElement);
|
|
462
|
+
|
|
463
|
+
// Find and click current location button
|
|
464
|
+
const locationButton = await canvas.findByTestId('address-current-location-button');
|
|
465
|
+
await userEvent.click(locationButton);
|
|
466
|
+
|
|
467
|
+
// Wait for location to be retrieved (mock)
|
|
468
|
+
await waitFor(() => {
|
|
469
|
+
expect(args.onSelect).toHaveBeenCalledWith(
|
|
470
|
+
expect.objectContaining({
|
|
471
|
+
formatted: expect.any(String),
|
|
472
|
+
coordinates: expect.objectContaining({
|
|
473
|
+
lat: expect.any(Number),
|
|
474
|
+
lng: expect.any(Number),
|
|
475
|
+
}),
|
|
476
|
+
})
|
|
477
|
+
);
|
|
478
|
+
}, { timeout: 2000 });
|
|
479
|
+
|
|
480
|
+
// Verify input was populated
|
|
481
|
+
const input = await canvas.findByTestId('address-input');
|
|
482
|
+
expect(input.value).not.toBe('');
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
#### 6. Keyboard Navigation Test
|
|
487
|
+
```typescript
|
|
488
|
+
play: async ({ canvasElement }) => {
|
|
489
|
+
const canvas = within(canvasElement);
|
|
490
|
+
|
|
491
|
+
const input = await canvas.findByTestId('address-input');
|
|
492
|
+
input.focus();
|
|
493
|
+
|
|
494
|
+
await userEvent.type(input, 'main');
|
|
495
|
+
|
|
496
|
+
// Wait for suggestions
|
|
497
|
+
await waitFor(async () => {
|
|
498
|
+
const suggestions = await canvas.findAllByTestId(/address-suggestion-/);
|
|
499
|
+
expect(suggestions.length).toBeGreaterThan(0);
|
|
500
|
+
}, { timeout: 2000 });
|
|
501
|
+
|
|
502
|
+
// Navigate with arrow keys
|
|
503
|
+
await userEvent.keyboard('{ArrowDown}');
|
|
504
|
+
await userEvent.keyboard('{ArrowDown}');
|
|
505
|
+
await userEvent.keyboard('{Enter}');
|
|
506
|
+
|
|
507
|
+
// Verify selection
|
|
508
|
+
await waitFor(() => {
|
|
509
|
+
expect(input.value).not.toBe('main');
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
#### 7. Edge Cases Test
|
|
515
|
+
```typescript
|
|
516
|
+
play: async ({ canvasElement }) => {
|
|
517
|
+
const canvas = within(canvasElement);
|
|
518
|
+
|
|
519
|
+
const input = await canvas.findByTestId('address-input');
|
|
520
|
+
|
|
521
|
+
// Test minimum characters (should not trigger suggestions)
|
|
522
|
+
await userEvent.type(input, 'ab');
|
|
523
|
+
|
|
524
|
+
// Wait briefly
|
|
525
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
526
|
+
|
|
527
|
+
// Suggestions should not appear
|
|
528
|
+
const dropdown = canvas.queryByTestId('address-suggestions-dropdown');
|
|
529
|
+
expect(dropdown).not.toBeInTheDocument();
|
|
530
|
+
|
|
531
|
+
// Test with enough characters
|
|
532
|
+
await userEvent.clear(input);
|
|
533
|
+
await userEvent.type(input, 'main street');
|
|
534
|
+
|
|
535
|
+
// Now suggestions should appear
|
|
536
|
+
await waitFor(async () => {
|
|
537
|
+
const suggestions = await canvas.findAllByTestId(/address-suggestion-/);
|
|
538
|
+
expect(suggestions.length).toBeGreaterThan(0);
|
|
539
|
+
}, { timeout: 2000 });
|
|
540
|
+
}
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
### Troubleshooting
|
|
544
|
+
|
|
545
|
+
#### Issue: "Unable to find element with testId address-input"
|
|
546
|
+
|
|
547
|
+
**Solution:** Always use `await` with `findByTestId`:
|
|
548
|
+
```typescript
|
|
549
|
+
// Wrong - synchronous
|
|
550
|
+
const input = canvas.getByTestId('address-input');
|
|
551
|
+
|
|
552
|
+
// Correct - asynchronous
|
|
553
|
+
const input = await canvas.findByTestId('address-input');
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
#### Issue: Suggestions dropdown not appearing
|
|
557
|
+
|
|
558
|
+
**Solution:** Ensure you type at least 3 characters and wait for debounce:
|
|
559
|
+
```typescript
|
|
560
|
+
const input = await canvas.findByTestId('address-input');
|
|
561
|
+
await userEvent.type(input, '123 main'); // At least 3 chars
|
|
562
|
+
|
|
563
|
+
// Wait with timeout for suggestions
|
|
564
|
+
await waitFor(async () => {
|
|
565
|
+
const dropdown = await canvas.findByTestId('address-suggestions-dropdown');
|
|
566
|
+
expect(dropdown).toBeInTheDocument();
|
|
567
|
+
}, { timeout: 2000 });
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
#### Issue: Test fails intermittently with loading state
|
|
571
|
+
|
|
572
|
+
**Solution:** Account for async nature of suggestions:
|
|
573
|
+
```typescript
|
|
574
|
+
// Use waitFor with proper timeout
|
|
575
|
+
await waitFor(async () => {
|
|
576
|
+
const suggestions = await canvas.findAllByTestId(/address-suggestion-/);
|
|
577
|
+
expect(suggestions.length).toBeGreaterThan(0);
|
|
578
|
+
}, { timeout: 3000 });
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
#### Issue: Can't find current location button
|
|
582
|
+
|
|
583
|
+
**Solution:** Button only appears when `getCurrentLocation=true`:
|
|
584
|
+
```typescript
|
|
585
|
+
// Check if prop is enabled
|
|
586
|
+
if (args.getCurrentLocation) {
|
|
587
|
+
const locationButton = await canvas.findByTestId('address-current-location-button');
|
|
588
|
+
expect(locationButton).toBeInTheDocument();
|
|
589
|
+
} else {
|
|
590
|
+
const locationButton = canvas.queryByTestId('address-current-location-button');
|
|
591
|
+
expect(locationButton).not.toBeInTheDocument();
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
#### Issue: Suggestion click not registering
|
|
596
|
+
|
|
597
|
+
**Solution:** Ensure suggestions are fully loaded before clicking:
|
|
598
|
+
```typescript
|
|
599
|
+
await userEvent.type(input, 'main');
|
|
600
|
+
|
|
601
|
+
// Wait for specific suggestion to appear
|
|
602
|
+
const firstSuggestion = await canvas.findByTestId('address-suggestion-0');
|
|
603
|
+
expect(firstSuggestion).toBeInTheDocument();
|
|
604
|
+
|
|
605
|
+
// Then click
|
|
606
|
+
await userEvent.click(firstSuggestion);
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
### Best Practices
|
|
610
|
+
|
|
611
|
+
1. **Always use async/await** with testId queries in Storybook tests
|
|
612
|
+
2. **Use `waitFor`** when waiting for suggestions to appear (debounced)
|
|
613
|
+
3. **Type at least 3 characters** to trigger autocomplete suggestions
|
|
614
|
+
4. **Use regex patterns** for dynamic testIds: `/address-suggestion-/`
|
|
615
|
+
5. **Add timeouts** for async operations: `{ timeout: 2000 }`
|
|
616
|
+
6. **Use mock data** in tests by passing `googleMapsApiKey='demo-key'`
|
|
617
|
+
7. **Check conditional elements** like current location button based on props
|
|
618
|
+
|
|
619
|
+
### Mock Data Behavior
|
|
620
|
+
|
|
621
|
+
When using `googleMapsApiKey='demo-key'` or `'test-key'`, the component uses mock data:
|
|
622
|
+
- Mock addresses include common US cities (San Francisco, New York, Los Angeles, Chicago, Austin)
|
|
623
|
+
- Search is performed against mock dataset
|
|
624
|
+
- Simulates realistic API delays (150-350ms)
|
|
625
|
+
- Returns full address details with coordinates
|
|
626
|
+
- Current location returns first mock address
|
|
627
|
+
|
|
628
|
+
### Related Components
|
|
629
|
+
|
|
630
|
+
- **Autocomplete (MUI):** Base autocomplete functionality
|
|
631
|
+
- **TextField:** Input field rendering
|
|
632
|
+
- **Paper:** Dropdown container for suggestions
|
|
633
|
+
- **IconButton:** Current location button
|