@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,136 @@
|
|
|
1
|
+
import { Box, Stack, styled } from '@mui/material';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
import type {
|
|
5
|
+
FormControlProps,
|
|
6
|
+
FormFieldProps,
|
|
7
|
+
FormLabelProps,
|
|
8
|
+
FormMessageProps,
|
|
9
|
+
FormProps,
|
|
10
|
+
} from './Form.types';
|
|
11
|
+
|
|
12
|
+
const StyledForm = styled('form', {
|
|
13
|
+
shouldForwardProp: (prop) => prop !== 'variant',
|
|
14
|
+
})<{ variant?: FormProps['variant'] }>(({ theme, variant }) => ({
|
|
15
|
+
width: '100%',
|
|
16
|
+
...(variant === 'inline' && {
|
|
17
|
+
display: 'flex',
|
|
18
|
+
gap: theme.spacing(2),
|
|
19
|
+
alignItems: 'flex-start',
|
|
20
|
+
}),
|
|
21
|
+
}));
|
|
22
|
+
|
|
23
|
+
const spacingMap = {
|
|
24
|
+
xs: 1,
|
|
25
|
+
sm: 2,
|
|
26
|
+
md: 3,
|
|
27
|
+
lg: 4,
|
|
28
|
+
xl: 5,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const maxWidthMap = {
|
|
32
|
+
sm: '600px',
|
|
33
|
+
md: '900px',
|
|
34
|
+
lg: '1200px',
|
|
35
|
+
xl: '1536px',
|
|
36
|
+
full: '100%',
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const Form = React.forwardRef<HTMLFormElement, FormProps>(
|
|
40
|
+
({ variant = 'vertical', maxWidth = 'full', spacing = 'md', children, dataTestId, ...props }, ref) => (
|
|
41
|
+
<StyledForm ref={ref} variant={variant} role="form" data-testid={dataTestId} {...props}>
|
|
42
|
+
<Box sx={{ maxWidth: maxWidthMap[maxWidth], width: '100%' }}>
|
|
43
|
+
{variant === 'inline' ? (
|
|
44
|
+
children
|
|
45
|
+
) : (
|
|
46
|
+
<Stack spacing={spacingMap[spacing]}>{children}</Stack>
|
|
47
|
+
)}
|
|
48
|
+
</Box>
|
|
49
|
+
</StyledForm>
|
|
50
|
+
),
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
Form.displayName = 'Form';
|
|
54
|
+
|
|
55
|
+
const StyledFormField = styled(Box, {
|
|
56
|
+
shouldForwardProp: (prop) => prop !== 'variant',
|
|
57
|
+
})<{ variant?: 'vertical' | 'horizontal' }>(
|
|
58
|
+
({ theme, variant }) => ({
|
|
59
|
+
display: variant === 'horizontal' ? 'grid' : 'flex',
|
|
60
|
+
flexDirection: variant === 'horizontal' ? undefined : 'column',
|
|
61
|
+
gridTemplateColumns: variant === 'horizontal' ? '200px 1fr' : undefined,
|
|
62
|
+
gap: theme.spacing(1),
|
|
63
|
+
alignItems: variant === 'horizontal' ? 'center' : undefined,
|
|
64
|
+
}),
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
export const FormField: React.FC<FormFieldProps> = ({
|
|
68
|
+
name,
|
|
69
|
+
label,
|
|
70
|
+
required,
|
|
71
|
+
error,
|
|
72
|
+
helperText,
|
|
73
|
+
children,
|
|
74
|
+
dataTestId,
|
|
75
|
+
}) => (
|
|
76
|
+
<StyledFormField data-testid={dataTestId}>
|
|
77
|
+
{label && (
|
|
78
|
+
<FormLabel required={required} error={!!error} htmlFor={name} dataTestId={dataTestId ? `${dataTestId}-label` : undefined}>
|
|
79
|
+
{label}
|
|
80
|
+
</FormLabel>
|
|
81
|
+
)}
|
|
82
|
+
<FormControl fullWidth dataTestId={dataTestId ? `${dataTestId}-control` : undefined}>
|
|
83
|
+
{children}
|
|
84
|
+
{(error || helperText) && <FormMessage error={!!error} dataTestId={dataTestId ? `${dataTestId}-message` : undefined}>{error || helperText}</FormMessage>}
|
|
85
|
+
</FormControl>
|
|
86
|
+
</StyledFormField>
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
const StyledFormLabel = styled('label', {
|
|
90
|
+
shouldForwardProp: (prop) => prop !== 'error',
|
|
91
|
+
})<{ error?: boolean }>(({ theme, error }) => ({
|
|
92
|
+
fontSize: '0.875rem',
|
|
93
|
+
fontWeight: 500,
|
|
94
|
+
color: error ? theme.palette.error.main : theme.palette.text.primary,
|
|
95
|
+
marginBottom: theme.spacing(0.5),
|
|
96
|
+
display: 'block',
|
|
97
|
+
'&::after': {
|
|
98
|
+
content: '" *"',
|
|
99
|
+
color: theme.palette.error.main,
|
|
100
|
+
display: 'var(--required-display, none)',
|
|
101
|
+
},
|
|
102
|
+
}));
|
|
103
|
+
|
|
104
|
+
export const FormLabel: React.FC<FormLabelProps> = ({ required, error, children, htmlFor, dataTestId }) => (
|
|
105
|
+
<StyledFormLabel
|
|
106
|
+
error={error}
|
|
107
|
+
htmlFor={htmlFor}
|
|
108
|
+
data-testid={dataTestId}
|
|
109
|
+
style={{ '--required-display': required ? 'inline' : 'none' } as React.CSSProperties}
|
|
110
|
+
>
|
|
111
|
+
{children}
|
|
112
|
+
</StyledFormLabel>
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const StyledFormControl = styled(Box, {
|
|
116
|
+
shouldForwardProp: (prop) => prop !== 'fullWidth',
|
|
117
|
+
})<{ fullWidth?: boolean }>(({ fullWidth }) => ({
|
|
118
|
+
width: fullWidth ? '100%' : 'auto',
|
|
119
|
+
position: 'relative',
|
|
120
|
+
}));
|
|
121
|
+
|
|
122
|
+
export const FormControl: React.FC<FormControlProps> = ({ fullWidth = true, children, dataTestId }) =>
|
|
123
|
+
// Don't pass error prop to the DOM element
|
|
124
|
+
<StyledFormControl fullWidth={fullWidth} data-testid={dataTestId}>{children}</StyledFormControl>
|
|
125
|
+
;
|
|
126
|
+
|
|
127
|
+
const StyledFormMessage = styled('span', {
|
|
128
|
+
shouldForwardProp: (prop) => prop !== 'error',
|
|
129
|
+
})<{ error?: boolean }>(({ theme, error }) => ({
|
|
130
|
+
fontSize: '0.75rem',
|
|
131
|
+
marginTop: theme.spacing(0.5),
|
|
132
|
+
color: error ? theme.palette.error.main : theme.palette.text.secondary,
|
|
133
|
+
display: 'block',
|
|
134
|
+
}));
|
|
135
|
+
|
|
136
|
+
export const FormMessage: React.FC<FormMessageProps> = ({ error, children, dataTestId }) => <StyledFormMessage error={error} data-testid={dataTestId}>{children}</StyledFormMessage>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { FormHTMLAttributes } from 'react';
|
|
2
|
+
|
|
3
|
+
export type FormVariant = 'vertical' | 'horizontal' | 'inline' | 'stepped';
|
|
4
|
+
|
|
5
|
+
export interface FormProps extends FormHTMLAttributes<HTMLFormElement> {
|
|
6
|
+
variant?: FormVariant;
|
|
7
|
+
maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
8
|
+
spacing?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
dataTestId?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface FormFieldProps {
|
|
14
|
+
name: string;
|
|
15
|
+
label?: string;
|
|
16
|
+
required?: boolean;
|
|
17
|
+
error?: string;
|
|
18
|
+
helperText?: string;
|
|
19
|
+
children: React.ReactNode;
|
|
20
|
+
dataTestId?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface FormLabelProps {
|
|
24
|
+
required?: boolean;
|
|
25
|
+
error?: boolean;
|
|
26
|
+
children: React.ReactNode;
|
|
27
|
+
htmlFor?: string;
|
|
28
|
+
dataTestId?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface FormControlProps {
|
|
32
|
+
error?: boolean;
|
|
33
|
+
fullWidth?: boolean;
|
|
34
|
+
children: React.ReactNode;
|
|
35
|
+
dataTestId?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface FormMessageProps {
|
|
39
|
+
error?: boolean;
|
|
40
|
+
children: React.ReactNode;
|
|
41
|
+
dataTestId?: string;
|
|
42
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# Input Component
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
The Input component provides a flexible text input field with comprehensive validation, styling options, and accessibility features. It supports various input types, states, and integration with form libraries.
|
|
5
|
+
|
|
6
|
+
## Features
|
|
7
|
+
- Multiple visual variants (outlined, filled, glass, underline, gradient)
|
|
8
|
+
- Three size options (sm, md, lg)
|
|
9
|
+
- Support for different input types (text, email, password, number, tel, url)
|
|
10
|
+
- Loading states with spinner indicator
|
|
11
|
+
- Error states with helper text
|
|
12
|
+
- Floating label animations
|
|
13
|
+
- Visual effects (glow, pulse)
|
|
14
|
+
- Start and end adornments for icons
|
|
15
|
+
- Full keyboard navigation support
|
|
16
|
+
- Screen reader compatibility
|
|
17
|
+
- Responsive design
|
|
18
|
+
|
|
19
|
+
## Props Documentation
|
|
20
|
+
|
|
21
|
+
### Core Props
|
|
22
|
+
- `variant`: Visual variant of the input ('outlined' | 'filled' | 'glass' | 'underline' | 'gradient')
|
|
23
|
+
- `size`: Size of the input ('sm' | 'md' | 'lg')
|
|
24
|
+
- `label`: Label text for the input
|
|
25
|
+
- `placeholder`: Placeholder text
|
|
26
|
+
- `value`: Controlled input value
|
|
27
|
+
- `defaultValue`: Uncontrolled default value
|
|
28
|
+
- `onChange`: Change event handler
|
|
29
|
+
|
|
30
|
+
### State Props
|
|
31
|
+
- `disabled`: Disables the input
|
|
32
|
+
- `readOnly`: Makes input read-only
|
|
33
|
+
- `required`: Marks input as required
|
|
34
|
+
- `error`: Error state flag
|
|
35
|
+
- `helperText`: Helper or error text displayed below input
|
|
36
|
+
- `loading`: Shows loading spinner and disables input
|
|
37
|
+
|
|
38
|
+
### Visual Props
|
|
39
|
+
- `fullWidth`: Makes input take full container width (default: true)
|
|
40
|
+
- `floating`: Enables floating label animation
|
|
41
|
+
- `glow`: Adds glow effect on focus
|
|
42
|
+
- `pulse`: Adds pulse animation
|
|
43
|
+
|
|
44
|
+
### Adornment Props
|
|
45
|
+
- `startAdornment`: Content to display at the start of the input
|
|
46
|
+
- `endAdornment`: Content to display at the end of the input
|
|
47
|
+
|
|
48
|
+
## Usage Examples
|
|
49
|
+
|
|
50
|
+
### Basic Input
|
|
51
|
+
```tsx
|
|
52
|
+
<Input
|
|
53
|
+
label="Name"
|
|
54
|
+
placeholder="Enter your name"
|
|
55
|
+
onChange={(e) => console.log(e.target.value)}
|
|
56
|
+
/>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### With Validation
|
|
60
|
+
```tsx
|
|
61
|
+
<Input
|
|
62
|
+
label="Email"
|
|
63
|
+
type="email"
|
|
64
|
+
error={!isValidEmail}
|
|
65
|
+
helperText={!isValidEmail ? "Please enter a valid email" : ""}
|
|
66
|
+
required
|
|
67
|
+
/>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### With Icons
|
|
71
|
+
```tsx
|
|
72
|
+
<Input
|
|
73
|
+
label="Search"
|
|
74
|
+
placeholder="Search..."
|
|
75
|
+
startAdornment={<SearchIcon />}
|
|
76
|
+
endAdornment={
|
|
77
|
+
<IconButton onClick={handleClear}>
|
|
78
|
+
<ClearIcon />
|
|
79
|
+
</IconButton>
|
|
80
|
+
}
|
|
81
|
+
/>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Password Input with Toggle
|
|
85
|
+
```tsx
|
|
86
|
+
<Input
|
|
87
|
+
label="Password"
|
|
88
|
+
type={showPassword ? 'text' : 'password'}
|
|
89
|
+
startAdornment={<LockIcon />}
|
|
90
|
+
endAdornment={
|
|
91
|
+
<IconButton onClick={() => setShowPassword(!showPassword)}>
|
|
92
|
+
{showPassword ? <VisibilityOff /> : <Visibility />}
|
|
93
|
+
</IconButton>
|
|
94
|
+
}
|
|
95
|
+
/>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Glass Morphism Style
|
|
99
|
+
```tsx
|
|
100
|
+
<Input
|
|
101
|
+
variant="glass"
|
|
102
|
+
label="Glass Input"
|
|
103
|
+
glow
|
|
104
|
+
floating
|
|
105
|
+
placeholder="Modern glass effect"
|
|
106
|
+
/>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Loading State
|
|
110
|
+
```tsx
|
|
111
|
+
<Input
|
|
112
|
+
label="Processing"
|
|
113
|
+
loading
|
|
114
|
+
placeholder="Please wait..."
|
|
115
|
+
/>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Accessibility
|
|
119
|
+
|
|
120
|
+
### ARIA Attributes
|
|
121
|
+
- Proper label association with `aria-label` or `aria-labelledby`
|
|
122
|
+
- `aria-invalid` for error states
|
|
123
|
+
- `aria-required` for required fields
|
|
124
|
+
- `aria-describedby` for helper text association
|
|
125
|
+
|
|
126
|
+
### Keyboard Navigation
|
|
127
|
+
- Tab/Shift+Tab for focus navigation
|
|
128
|
+
- Standard text editing keyboard shortcuts
|
|
129
|
+
- Enter key support for form submission
|
|
130
|
+
|
|
131
|
+
### Screen Reader Support
|
|
132
|
+
- Clear label announcements
|
|
133
|
+
- Error state announcements
|
|
134
|
+
- Helper text announcements
|
|
135
|
+
- Loading state announcements
|
|
136
|
+
|
|
137
|
+
## Best Practices
|
|
138
|
+
|
|
139
|
+
1. **Always provide labels**: Use the `label` prop for accessibility
|
|
140
|
+
2. **Error handling**: Provide clear error messages in `helperText`
|
|
141
|
+
3. **Loading states**: Use `loading` prop during async operations
|
|
142
|
+
4. **Icon usage**: Use meaningful icons that enhance UX
|
|
143
|
+
5. **Validation**: Validate on blur rather than on every keystroke
|
|
144
|
+
6. **Required fields**: Mark required fields clearly
|
|
145
|
+
7. **Placeholder text**: Use placeholders as hints, not labels
|
|
146
|
+
8. **Size consistency**: Use consistent sizes across forms
|
|
147
|
+
|
|
148
|
+
## Performance Considerations
|
|
149
|
+
|
|
150
|
+
- The component uses React.forwardRef for proper ref forwarding
|
|
151
|
+
- Styled components are memoized to prevent unnecessary re-renders
|
|
152
|
+
- Event handlers are optimized to prevent excessive updates
|
|
153
|
+
- Loading state properly disables interactions
|
|
154
|
+
|
|
155
|
+
## Browser Support
|
|
156
|
+
- All modern browsers (Chrome, Firefox, Safari, Edge)
|
|
157
|
+
- Mobile browsers (iOS Safari, Chrome Mobile)
|
|
158
|
+
- Responsive design for all screen sizes
|
|
159
|
+
- Touch-friendly interaction areas
|
|
160
|
+
|
|
161
|
+
## Testing
|
|
162
|
+
|
|
163
|
+
### Test IDs
|
|
164
|
+
|
|
165
|
+
The Input component includes `data-testid` attributes for reliable testing:
|
|
166
|
+
|
|
167
|
+
| Test ID | Element | Description |
|
|
168
|
+
|---------|---------|-------------|
|
|
169
|
+
| `{dataTestId}` | Input field | The actual input element (passed via inputProps) |
|
|
170
|
+
|
|
171
|
+
**Note:** The `data-testid` is applied to the `<input>` element itself, not the TextField wrapper. When querying, use `findByTestId` to target the input element directly.
|
|
172
|
+
|
|
173
|
+
### Testing Best Practices
|
|
174
|
+
|
|
175
|
+
**Wait for Input to Render:**
|
|
176
|
+
```typescript
|
|
177
|
+
const input = await canvas.findByTestId('email-input');
|
|
178
|
+
expect(input).toBeInTheDocument();
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Test User Input:**
|
|
182
|
+
```typescript
|
|
183
|
+
const input = await canvas.findByTestId('name-input');
|
|
184
|
+
await userEvent.type(input, 'John Doe');
|
|
185
|
+
expect(input).toHaveValue('John Doe');
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Test Disabled State:**
|
|
189
|
+
```typescript
|
|
190
|
+
const input = await canvas.findByTestId('disabled-input');
|
|
191
|
+
expect(input).toBeDisabled();
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**Test Loading State:**
|
|
195
|
+
```typescript
|
|
196
|
+
// Input is disabled when loading
|
|
197
|
+
const loadingInput = await canvas.findByTestId('loading-input');
|
|
198
|
+
expect(loadingInput).toBeDisabled();
|
|
199
|
+
|
|
200
|
+
// Loading spinner appears
|
|
201
|
+
const spinner = canvasElement.querySelector('.MuiCircularProgress-root');
|
|
202
|
+
expect(spinner).toBeInTheDocument();
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Test Error State:**
|
|
206
|
+
```typescript
|
|
207
|
+
const input = await canvas.findByTestId('error-input');
|
|
208
|
+
const container = input.closest('.MuiFormControl-root');
|
|
209
|
+
|
|
210
|
+
// Check error styling
|
|
211
|
+
expect(container?.querySelector('.Mui-error')).toBeInTheDocument();
|
|
212
|
+
|
|
213
|
+
// Verify helper text
|
|
214
|
+
const helperText = container?.querySelector('.MuiFormHelperText-root');
|
|
215
|
+
expect(helperText).toHaveTextContent('Error message');
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Test with Adornments:**
|
|
219
|
+
```typescript
|
|
220
|
+
// Input with start/end adornments
|
|
221
|
+
const input = await canvas.findByTestId('search-input');
|
|
222
|
+
const container = input.closest('.MuiFormControl-root');
|
|
223
|
+
|
|
224
|
+
const startAdornment = container?.querySelector('.MuiInputAdornment-positionStart');
|
|
225
|
+
const endAdornment = container?.querySelector('.MuiInputAdornment-positionEnd');
|
|
226
|
+
|
|
227
|
+
expect(startAdornment).toBeInTheDocument();
|
|
228
|
+
expect(endAdornment).toBeInTheDocument();
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Test Form Integration:**
|
|
232
|
+
```typescript
|
|
233
|
+
const input = await canvas.findByTestId('form-input');
|
|
234
|
+
await userEvent.type(input, 'test@example.com');
|
|
235
|
+
await userEvent.keyboard('{Enter}');
|
|
236
|
+
expect(onSubmit).toHaveBeenCalled();
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Common Test Scenarios
|
|
240
|
+
|
|
241
|
+
1. **Basic Rendering** - Verify input renders with label and placeholder
|
|
242
|
+
2. **User Input** - Test typing and value changes
|
|
243
|
+
3. **Variants** - Test outlined, filled, glass, underline, gradient styles
|
|
244
|
+
4. **Sizes** - Test sm, md, lg sizing
|
|
245
|
+
5. **States** - Test disabled, error, loading, readonly states
|
|
246
|
+
6. **Adornments** - Test start/end icons and buttons
|
|
247
|
+
7. **Validation** - Test error states and helper text
|
|
248
|
+
8. **Floating Labels** - Test label animation on focus/blur
|
|
249
|
+
9. **Visual Effects** - Test glow and pulse animations
|
|
250
|
+
10. **Keyboard Navigation** - Test Tab navigation and Enter key
|
|
251
|
+
11. **Accessibility** - Verify ARIA attributes and screen reader support
|
|
252
|
+
12. **Form Integration** - Test with form libraries like React Hook Form
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { Email, Lock, Search, Visibility, VisibilityOff } from '@mui/icons-material';
|
|
2
|
+
import { IconButton } from '@mui/material';
|
|
3
|
+
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
|
|
6
|
+
import { Input } from './Input';
|
|
7
|
+
|
|
8
|
+
const meta: Meta<typeof Input> = {
|
|
9
|
+
title: 'Form/Input',
|
|
10
|
+
component: Input,
|
|
11
|
+
parameters: {
|
|
12
|
+
layout: 'centered',
|
|
13
|
+
},
|
|
14
|
+
tags: ['autodocs', 'component:Input'],
|
|
15
|
+
argTypes: {
|
|
16
|
+
variant: {
|
|
17
|
+
control: { type: 'select' },
|
|
18
|
+
options: ['outlined', 'filled', 'glass', 'underline', 'gradient'],
|
|
19
|
+
},
|
|
20
|
+
size: {
|
|
21
|
+
control: { type: 'select' },
|
|
22
|
+
options: ['sm', 'md', 'lg'],
|
|
23
|
+
},
|
|
24
|
+
type: {
|
|
25
|
+
control: { type: 'select' },
|
|
26
|
+
options: ['text', 'email', 'password', 'number', 'tel', 'url'],
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default meta;
|
|
32
|
+
type Story = StoryObj<typeof meta>;
|
|
33
|
+
|
|
34
|
+
export const Default: Story = {
|
|
35
|
+
args: {
|
|
36
|
+
placeholder: 'Enter text...',
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export const WithLabel: Story = {
|
|
41
|
+
args: {
|
|
42
|
+
label: 'Full Name',
|
|
43
|
+
placeholder: 'John Doe',
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// Required story export: AllVariants
|
|
48
|
+
export const AllVariants: Story = {
|
|
49
|
+
render: () => (
|
|
50
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
|
|
51
|
+
<Input variant="outlined" label="Outlined" placeholder="Outlined input" />
|
|
52
|
+
<Input variant="filled" label="Filled" placeholder="Filled input" />
|
|
53
|
+
<Input variant="glass" label="Glass" placeholder="Glass morphism input" />
|
|
54
|
+
<Input variant="underline" label="Underline" placeholder="Underline input" />
|
|
55
|
+
<Input variant="gradient" label="Gradient" placeholder="Gradient border input" />
|
|
56
|
+
</div>
|
|
57
|
+
),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// Backward compatibility alias
|
|
61
|
+
export const Variants = AllVariants;
|
|
62
|
+
|
|
63
|
+
// Required story export: AllSizes
|
|
64
|
+
export const AllSizes: Story = {
|
|
65
|
+
render: () => (
|
|
66
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
|
|
67
|
+
<Input size="sm" label="Small" placeholder="Small input" />
|
|
68
|
+
<Input size="md" label="Medium" placeholder="Medium input" />
|
|
69
|
+
<Input size="lg" label="Large" placeholder="Large input" />
|
|
70
|
+
</div>
|
|
71
|
+
),
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// Backward compatibility alias
|
|
75
|
+
export const Sizes = AllSizes;
|
|
76
|
+
|
|
77
|
+
export const WithAdornments: Story = {
|
|
78
|
+
render: () => (
|
|
79
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
|
|
80
|
+
<Input label="Search" placeholder="Search..." startAdornment={<Search />} />
|
|
81
|
+
<Input label="Email" type="email" placeholder="john@example.com" startAdornment={<Email />} />
|
|
82
|
+
<PasswordInput />
|
|
83
|
+
</div>
|
|
84
|
+
),
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// Password input with visibility toggle
|
|
88
|
+
function PasswordInput() {
|
|
89
|
+
const [showPassword, setShowPassword] = useState(false);
|
|
90
|
+
|
|
91
|
+
return (
|
|
92
|
+
<Input
|
|
93
|
+
label="Password"
|
|
94
|
+
type={showPassword ? 'text' : 'password'}
|
|
95
|
+
placeholder="Enter password"
|
|
96
|
+
startAdornment={<Lock />}
|
|
97
|
+
endAdornment={
|
|
98
|
+
<IconButton onClick={() => setShowPassword(!showPassword)} edge="end">
|
|
99
|
+
{showPassword ? <VisibilityOff /> : <Visibility />}
|
|
100
|
+
</IconButton>
|
|
101
|
+
}
|
|
102
|
+
/>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export const FloatingLabels: Story = {
|
|
107
|
+
render: () => (
|
|
108
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
|
|
109
|
+
<Input floating label="Floating Label" placeholder="Type here..." />
|
|
110
|
+
<Input floating variant="glass" label="Glass with Float" />
|
|
111
|
+
<Input floating variant="filled" label="Filled with Float" />
|
|
112
|
+
</div>
|
|
113
|
+
),
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export const ErrorStates: Story = {
|
|
117
|
+
render: () => (
|
|
118
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
|
|
119
|
+
<Input
|
|
120
|
+
label="Email"
|
|
121
|
+
error
|
|
122
|
+
helperText="Please enter a valid email address"
|
|
123
|
+
defaultValue="invalid-email"
|
|
124
|
+
/>
|
|
125
|
+
<Input variant="glass" label="Required Field" error helperText="This field is required" />
|
|
126
|
+
</div>
|
|
127
|
+
),
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// Enhanced Visual Effects Stories
|
|
131
|
+
export const VisualEffects: Story = {
|
|
132
|
+
render: () => (
|
|
133
|
+
<div
|
|
134
|
+
style={{
|
|
135
|
+
display: 'flex',
|
|
136
|
+
flexDirection: 'column',
|
|
137
|
+
gap: '24px',
|
|
138
|
+
width: '300px',
|
|
139
|
+
backgroundColor: '#f5f5f5',
|
|
140
|
+
padding: '24px',
|
|
141
|
+
borderRadius: '8px',
|
|
142
|
+
}}
|
|
143
|
+
>
|
|
144
|
+
<Input variant="glass" label="Glow Effect" placeholder="Focus me!" glow />
|
|
145
|
+
<Input variant="outlined" label="Pulse Animation" placeholder="Watch me pulse" pulse />
|
|
146
|
+
<Input variant="gradient" label="Loading State" placeholder="Processing..." loading />
|
|
147
|
+
<Input variant="glass" label="Combined Effects" placeholder="Glow + Float" glow floating />
|
|
148
|
+
</div>
|
|
149
|
+
),
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// Required story export: AllStates
|
|
153
|
+
export const AllStates: Story = {
|
|
154
|
+
render: () => (
|
|
155
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
|
|
156
|
+
<Input label="Default State" placeholder="Type here..." />
|
|
157
|
+
<Input label="Focused State" placeholder="Focus me" autoFocus />
|
|
158
|
+
<Input label="Hover State" placeholder="Hover over me" />
|
|
159
|
+
<Input label="Disabled State" placeholder="Cannot type" disabled />
|
|
160
|
+
<Input label="Readonly State" placeholder="Read only" value="Cannot change this" readOnly />
|
|
161
|
+
<Input
|
|
162
|
+
label="Error State"
|
|
163
|
+
placeholder="Has error"
|
|
164
|
+
error
|
|
165
|
+
helperText="This field has an error"
|
|
166
|
+
/>
|
|
167
|
+
<Input label="Required Field" placeholder="This is required" required />
|
|
168
|
+
<Input label="Loading State" placeholder="Loading..." loading />
|
|
169
|
+
</div>
|
|
170
|
+
),
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
// Backward compatibility alias
|
|
174
|
+
export const InteractiveStates = AllStates;
|
|
175
|
+
|
|
176
|
+
// Different Input Types
|
|
177
|
+
export const InputTypes: Story = {
|
|
178
|
+
render: () => (
|
|
179
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
|
|
180
|
+
<Input type="text" label="Text Input" placeholder="Enter text" />
|
|
181
|
+
<Input type="email" label="Email Input" placeholder="email@example.com" />
|
|
182
|
+
<Input type="password" label="Password Input" placeholder="Enter password" />
|
|
183
|
+
<Input type="number" label="Number Input" placeholder="123" />
|
|
184
|
+
<Input type="tel" label="Phone Input" placeholder="+1 (555) 123-4567" />
|
|
185
|
+
<Input type="url" label="URL Input" placeholder="https://example.com" />
|
|
186
|
+
</div>
|
|
187
|
+
),
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// Edge Cases
|
|
191
|
+
export const EdgeCases: Story = {
|
|
192
|
+
render: () => (
|
|
193
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px', width: '300px' }}>
|
|
194
|
+
<Input
|
|
195
|
+
label="Long Text Overflow"
|
|
196
|
+
defaultValue="This is a very long text that should show how the input handles overflow and long content gracefully"
|
|
197
|
+
/>
|
|
198
|
+
<Input label="Empty with Floating" floating placeholder="Floating label behavior" />
|
|
199
|
+
<Input label="No Full Width" fullWidth={false} placeholder="Not full width" />
|
|
200
|
+
<Input
|
|
201
|
+
variant="glass"
|
|
202
|
+
label="Glass + All Props"
|
|
203
|
+
placeholder="Kitchen sink example"
|
|
204
|
+
glow
|
|
205
|
+
pulse
|
|
206
|
+
floating
|
|
207
|
+
helperText="This has all visual effects enabled"
|
|
208
|
+
/>
|
|
209
|
+
</div>
|
|
210
|
+
),
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
// Required story export: Responsive
|
|
214
|
+
export const Responsive: Story = {
|
|
215
|
+
render: () => (
|
|
216
|
+
<div
|
|
217
|
+
style={{
|
|
218
|
+
display: 'grid',
|
|
219
|
+
gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))',
|
|
220
|
+
gap: '16px',
|
|
221
|
+
}}
|
|
222
|
+
>
|
|
223
|
+
<Input variant="outlined" label="Responsive 1" placeholder="Resize window" />
|
|
224
|
+
<Input variant="glass" label="Responsive 2" placeholder="Watch layout" />
|
|
225
|
+
<Input variant="gradient" label="Responsive 3" placeholder="Adapt to screen" />
|
|
226
|
+
</div>
|
|
227
|
+
),
|
|
228
|
+
parameters: {
|
|
229
|
+
viewport: {
|
|
230
|
+
viewports: {
|
|
231
|
+
mobile: { name: 'Mobile', styles: { width: '375px', height: '667px' } },
|
|
232
|
+
tablet: { name: 'Tablet', styles: { width: '768px', height: '1024px' } },
|
|
233
|
+
desktop: { name: 'Desktop', styles: { width: '1200px', height: '800px' } },
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
// Backward compatibility alias
|
|
240
|
+
export const ResponsiveDemo = Responsive;
|
|
241
|
+
|
|
242
|
+
export const Playground: Story = {
|
|
243
|
+
args: {
|
|
244
|
+
variant: 'outlined',
|
|
245
|
+
size: 'md',
|
|
246
|
+
label: 'Playground Input',
|
|
247
|
+
placeholder: 'Type something...',
|
|
248
|
+
fullWidth: true,
|
|
249
|
+
floating: false,
|
|
250
|
+
glow: false,
|
|
251
|
+
pulse: false,
|
|
252
|
+
loading: false,
|
|
253
|
+
error: false,
|
|
254
|
+
helperText: 'This is helper text',
|
|
255
|
+
},
|
|
256
|
+
};
|