@brcarddev/frontend-commons 1.0.2
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/README.md +241 -0
- package/eslint.config.js +190 -0
- package/package.json +161 -0
- package/src/components/atoms/AudioPlayer/audio-player.stories.tsx +36 -0
- package/src/components/atoms/AudioPlayer/audio-player.test.tsx +20 -0
- package/src/components/atoms/AudioPlayer/audio-player.tsx +13 -0
- package/src/components/atoms/AudioPlayer/index.ts +1 -0
- package/src/components/atoms/Badge/badge.stories.tsx +80 -0
- package/src/components/atoms/Badge/badge.test.tsx +59 -0
- package/src/components/atoms/Badge/badge.tsx +47 -0
- package/src/components/atoms/Badge/index.ts +1 -0
- package/src/components/atoms/Box/box.stories.tsx +37 -0
- package/src/components/atoms/Box/box.test.tsx +47 -0
- package/src/components/atoms/Box/box.tsx +7 -0
- package/src/components/atoms/Box/index.ts +1 -0
- package/src/components/atoms/Button/button.stories.tsx +108 -0
- package/src/components/atoms/Button/button.test.tsx +54 -0
- package/src/components/atoms/Button/button.tsx +96 -0
- package/src/components/atoms/Button/index.ts +1 -0
- package/src/components/atoms/ButtonUpload/button-upload.stories.tsx +137 -0
- package/src/components/atoms/ButtonUpload/button-upload.tsx +304 -0
- package/src/components/atoms/ButtonUpload/index.ts +1 -0
- package/src/components/atoms/Calendar/calendar.stories.tsx +51 -0
- package/src/components/atoms/Calendar/calendar.test.tsx +41 -0
- package/src/components/atoms/Calendar/calendar.tsx +107 -0
- package/src/components/atoms/Calendar/index.ts +1 -0
- package/src/components/atoms/CheckIcon/check-icon.stories.tsx +38 -0
- package/src/components/atoms/CheckIcon/check-icon.test.tsx +270 -0
- package/src/components/atoms/CheckIcon/check-icon.tsx +141 -0
- package/src/components/atoms/CheckIcon/index.ts +1 -0
- package/src/components/atoms/Checkbox/checkbox.stories.tsx +133 -0
- package/src/components/atoms/Checkbox/checkbox.test.tsx +70 -0
- package/src/components/atoms/Checkbox/checkbox.tsx +31 -0
- package/src/components/atoms/Checkbox/index.ts +1 -0
- package/src/components/atoms/Flex/flex.stories.tsx +33 -0
- package/src/components/atoms/Flex/flex.test.tsx +47 -0
- package/src/components/atoms/Flex/flex.tsx +7 -0
- package/src/components/atoms/Flex/index.ts +1 -0
- package/src/components/atoms/Grid/grid.stories.tsx +33 -0
- package/src/components/atoms/Grid/grid.test.tsx +47 -0
- package/src/components/atoms/Grid/grid.tsx +7 -0
- package/src/components/atoms/Grid/index.ts +1 -0
- package/src/components/atoms/Icon/icon.stories.tsx +169 -0
- package/src/components/atoms/Icon/icon.test.tsx +272 -0
- package/src/components/atoms/Icon/icon.tsx +119 -0
- package/src/components/atoms/Icon/index.ts +1 -0
- package/src/components/atoms/Input/index.ts +1 -0
- package/src/components/atoms/Input/input.stories.tsx +704 -0
- package/src/components/atoms/Input/input.test.tsx +86 -0
- package/src/components/atoms/Input/input.tsx +161 -0
- package/src/components/atoms/InputMoney/index.ts +2 -0
- package/src/components/atoms/InputMoney/input-money.stories.tsx +240 -0
- package/src/components/atoms/InputMoney/input-money.test.tsx +98 -0
- package/src/components/atoms/InputMoney/input-money.tsx +254 -0
- package/src/components/atoms/InputPhone/index.ts +2 -0
- package/src/components/atoms/InputPhone/input-phone.stories.tsx +447 -0
- package/src/components/atoms/InputPhone/input-phone.test.tsx +148 -0
- package/src/components/atoms/InputPhone/input-phone.tsx +267 -0
- package/src/components/atoms/InputSearch/index.ts +2 -0
- package/src/components/atoms/InputSearch/input-search.stories.tsx +360 -0
- package/src/components/atoms/InputSearch/input-search.test.tsx +239 -0
- package/src/components/atoms/InputSearch/input-search.tsx +210 -0
- package/src/components/atoms/InputUpload/index.ts +1 -0
- package/src/components/atoms/InputUpload/input-upload.stories.tsx +229 -0
- package/src/components/atoms/InputUpload/input-upload.test.tsx +556 -0
- package/src/components/atoms/InputUpload/input-upload.tsx +434 -0
- package/src/components/atoms/InputWithButton/index.ts +2 -0
- package/src/components/atoms/InputWithButton/input-with-button.stories.tsx +503 -0
- package/src/components/atoms/InputWithButton/input-with-button.test.tsx +128 -0
- package/src/components/atoms/InputWithButton/input-with-button.tsx +170 -0
- package/src/components/atoms/Label/index.ts +1 -0
- package/src/components/atoms/Label/label.stories.tsx +90 -0
- package/src/components/atoms/Label/label.test.tsx +59 -0
- package/src/components/atoms/Label/label.tsx +43 -0
- package/src/components/atoms/Progress/index.ts +1 -0
- package/src/components/atoms/Progress/progress.stories.tsx +30 -0
- package/src/components/atoms/Progress/progress.test.tsx +63 -0
- package/src/components/atoms/Progress/progress.tsx +32 -0
- package/src/components/atoms/RenderCondition/index.ts +1 -0
- package/src/components/atoms/RenderCondition/render-condition.stories.tsx +28 -0
- package/src/components/atoms/RenderCondition/render-condition.test.tsx +27 -0
- package/src/components/atoms/RenderCondition/render-condition.tsx +9 -0
- package/src/components/atoms/RichTextEditor/index.ts +1 -0
- package/src/components/atoms/RichTextEditor/rich-text-editor.stories.tsx +214 -0
- package/src/components/atoms/RichTextEditor/rich-text-editor.test.tsx +442 -0
- package/src/components/atoms/RichTextEditor/rich-text-editor.tsx +202 -0
- package/src/components/atoms/Separator/index.ts +1 -0
- package/src/components/atoms/Separator/separator.stories.tsx +117 -0
- package/src/components/atoms/Separator/separator.test.tsx +50 -0
- package/src/components/atoms/Separator/separator.tsx +28 -0
- package/src/components/atoms/Skeleton/index.ts +1 -0
- package/src/components/atoms/Skeleton/skeleton.stories.tsx +84 -0
- package/src/components/atoms/Skeleton/skeleton.test.tsx +39 -0
- package/src/components/atoms/Skeleton/skeleton.tsx +14 -0
- package/src/components/atoms/Slider/index.ts +1 -0
- package/src/components/atoms/Slider/slider.stories.tsx +28 -0
- package/src/components/atoms/Slider/slider.test.tsx +90 -0
- package/src/components/atoms/Slider/slider.tsx +54 -0
- package/src/components/atoms/Sonner/index.ts +1 -0
- package/src/components/atoms/Sonner/sonner.css +39 -0
- package/src/components/atoms/Sonner/sonner.stories.tsx +261 -0
- package/src/components/atoms/Sonner/sonner.test.tsx +24 -0
- package/src/components/atoms/Sonner/sonner.tsx +13 -0
- package/src/components/atoms/Switch/index.ts +1 -0
- package/src/components/atoms/Switch/switch.stories.tsx +128 -0
- package/src/components/atoms/Switch/switch.test.tsx +70 -0
- package/src/components/atoms/Switch/switch.tsx +61 -0
- package/src/components/atoms/Textarea/index.ts +1 -0
- package/src/components/atoms/Textarea/textarea.stories.tsx +169 -0
- package/src/components/atoms/Textarea/textarea.test.tsx +56 -0
- package/src/components/atoms/Textarea/textarea.tsx +26 -0
- package/src/components/atoms/Toggle/index.ts +1 -0
- package/src/components/atoms/Toggle/toggle.stories.tsx +170 -0
- package/src/components/atoms/Toggle/toggle.test.tsx +62 -0
- package/src/components/atoms/Toggle/toggle.tsx +47 -0
- package/src/components/atoms/Typography/index.ts +1 -0
- package/src/components/atoms/Typography/typography.stories.tsx +95 -0
- package/src/components/atoms/Typography/typography.test.tsx +66 -0
- package/src/components/atoms/Typography/typography.tsx +63 -0
- package/src/components/atoms/UploadImageField/index.ts +1 -0
- package/src/components/atoms/UploadImageField/upload-image-field.stories.tsx +249 -0
- package/src/components/atoms/UploadImageField/upload-image-field.test.tsx +348 -0
- package/src/components/atoms/UploadImageField/upload-image-field.tsx +362 -0
- package/src/components/atoms/VideoPlayer/index.ts +1 -0
- package/src/components/atoms/VideoPlayer/video-player.stories.tsx +37 -0
- package/src/components/atoms/VideoPlayer/video-player.test.tsx +20 -0
- package/src/components/atoms/VideoPlayer/video-player.tsx +26 -0
- package/src/components/atoms/index.ts +31 -0
- package/src/components/icons/alert-circle.tsx +22 -0
- package/src/components/icons/align-center.tsx +22 -0
- package/src/components/icons/align-left.tsx +22 -0
- package/src/components/icons/annotation-dots.tsx +16 -0
- package/src/components/icons/annotation-question.tsx +15 -0
- package/src/components/icons/annotation.tsx +22 -0
- package/src/components/icons/announcement-01.tsx +15 -0
- package/src/components/icons/announcement-02.tsx +15 -0
- package/src/components/icons/apple-logo.tsx +9 -0
- package/src/components/icons/arrow-circle-broken-right.tsx +16 -0
- package/src/components/icons/arrow-down.tsx +9 -0
- package/src/components/icons/arrow-up.tsx +9 -0
- package/src/components/icons/at-sign.tsx +21 -0
- package/src/components/icons/award-01.tsx +15 -0
- package/src/components/icons/award-03.tsx +16 -0
- package/src/components/icons/bank-note-01.tsx +15 -0
- package/src/components/icons/bar-chart-square-02.tsx +9 -0
- package/src/components/icons/bell-01.tsx +9 -0
- package/src/components/icons/bell-04.tsx +16 -0
- package/src/components/icons/bold-01.tsx +22 -0
- package/src/components/icons/book-open-01.tsx +15 -0
- package/src/components/icons/brackets-ellipses.tsx +22 -0
- package/src/components/icons/briefcase-01.tsx +9 -0
- package/src/components/icons/brush-01.tsx +22 -0
- package/src/components/icons/building-02.tsx +9 -0
- package/src/components/icons/building-06.tsx +9 -0
- package/src/components/icons/calendar-minus-02.tsx +15 -0
- package/src/components/icons/calendar.tsx +9 -0
- package/src/components/icons/certificate-01.tsx +16 -0
- package/src/components/icons/chart-breakout-square.tsx +16 -0
- package/src/components/icons/check-circle-02.tsx +16 -0
- package/src/components/icons/check-circle.tsx +15 -0
- package/src/components/icons/check.tsx +21 -0
- package/src/components/icons/chevron-down-double.tsx +16 -0
- package/src/components/icons/chevron-down.tsx +9 -0
- package/src/components/icons/chevron-left-double.tsx +22 -0
- package/src/components/icons/chevron-left.tsx +16 -0
- package/src/components/icons/chevron-right-double.tsx +22 -0
- package/src/components/icons/chevron-right.tsx +16 -0
- package/src/components/icons/chevron-up-double.tsx +16 -0
- package/src/components/icons/clock-rewind.tsx +15 -0
- package/src/components/icons/clock-stopwatch.tsx +15 -0
- package/src/components/icons/coins-hand.tsx +15 -0
- package/src/components/icons/coins-stacked-01.tsx +15 -0
- package/src/components/icons/coins-stacked-02.tsx +15 -0
- package/src/components/icons/container.tsx +9 -0
- package/src/components/icons/copy-02.tsx +16 -0
- package/src/components/icons/copy-04.tsx +21 -0
- package/src/components/icons/corner-down-right.tsx +9 -0
- package/src/components/icons/countries/br.tsx +20 -0
- package/src/components/icons/countries/es.tsx +19 -0
- package/src/components/icons/countries/index.ts +3 -0
- package/src/components/icons/countries/us.tsx +21 -0
- package/src/components/icons/dataflow-03.tsx +15 -0
- package/src/components/icons/dotpoints-01.tsx +22 -0
- package/src/components/icons/dots-vertical.tsx +35 -0
- package/src/components/icons/download-03.tsx +16 -0
- package/src/components/icons/download-cloud-02.tsx +15 -0
- package/src/components/icons/drag.tsx +14 -0
- package/src/components/icons/dropper.tsx +21 -0
- package/src/components/icons/edit-01.tsx +15 -0
- package/src/components/icons/edit-02.tsx +9 -0
- package/src/components/icons/edit-03.tsx +23 -0
- package/src/components/icons/eye.tsx +22 -0
- package/src/components/icons/face-frown.tsx +15 -0
- package/src/components/icons/face-happy.tsx +15 -0
- package/src/components/icons/file-06.tsx +15 -0
- package/src/components/icons/file-attachment-04.tsx +15 -0
- package/src/components/icons/file-download-02.tsx +16 -0
- package/src/components/icons/file-plus-02.tsx +16 -0
- package/src/components/icons/file-search-01.tsx +22 -0
- package/src/components/icons/file-search-03.tsx +15 -0
- package/src/components/icons/filter-lines.tsx +21 -0
- package/src/components/icons/first-category.tsx +16 -0
- package/src/components/icons/first-stage.tsx +19 -0
- package/src/components/icons/folder.tsx +15 -0
- package/src/components/icons/google.tsx +12 -0
- package/src/components/icons/graduation-hat-02.tsx +15 -0
- package/src/components/icons/grid-01.tsx +36 -0
- package/src/components/icons/help-circle.tsx +16 -0
- package/src/components/icons/help-square.tsx +16 -0
- package/src/components/icons/home-line.tsx +21 -0
- package/src/components/icons/icons.stories.tsx +199 -0
- package/src/components/icons/index.ts +140 -0
- package/src/components/icons/info-circle.tsx +15 -0
- package/src/components/icons/italic-01.tsx +22 -0
- package/src/components/icons/last-category.tsx +11 -0
- package/src/components/icons/last-stage.tsx +19 -0
- package/src/components/icons/layout-alt-04.tsx +9 -0
- package/src/components/icons/lightbulb-02.tsx +16 -0
- package/src/components/icons/link-01.tsx +16 -0
- package/src/components/icons/link-broken-01.tsx +16 -0
- package/src/components/icons/linkedin-logo.tsx +17 -0
- package/src/components/icons/lock-01.tsx +21 -0
- package/src/components/icons/log-out-01.tsx +9 -0
- package/src/components/icons/mail-01.tsx +16 -0
- package/src/components/icons/marker-pin-02.tsx +10 -0
- package/src/components/icons/menu-01.tsx +9 -0
- package/src/components/icons/middle-category.tsx +10 -0
- package/src/components/icons/middle-stage.tsx +19 -0
- package/src/components/icons/ms-outlook.tsx +47 -0
- package/src/components/icons/paragraph-spacing.tsx +15 -0
- package/src/components/icons/phone-01.tsx +21 -0
- package/src/components/icons/pie-chart-02.tsx +22 -0
- package/src/components/icons/plus-circle.tsx +15 -0
- package/src/components/icons/portal-logo.tsx +76 -0
- package/src/components/icons/presentation-chart-02.tsx +14 -0
- package/src/components/icons/route.tsx +22 -0
- package/src/components/icons/save-01.tsx +15 -0
- package/src/components/icons/search-lg.tsx +15 -0
- package/src/components/icons/search-sm.tsx +9 -0
- package/src/components/icons/send-03.tsx +15 -0
- package/src/components/icons/settings-01.tsx +17 -0
- package/src/components/icons/settings-03.tsx +14 -0
- package/src/components/icons/share-05.tsx +15 -0
- package/src/components/icons/share-06.tsx +15 -0
- package/src/components/icons/slash-circle-01.tsx +9 -0
- package/src/components/icons/star-01.tsx +9 -0
- package/src/components/icons/step-icon-active.tsx +11 -0
- package/src/components/icons/step-icon-checked.tsx +10 -0
- package/src/components/icons/step-icon-default.tsx +11 -0
- package/src/components/icons/switch-horizontal-01.tsx +9 -0
- package/src/components/icons/table-01.tsx +15 -0
- package/src/components/icons/tag-01.tsx +15 -0
- package/src/components/icons/tag-03.tsx +15 -0
- package/src/components/icons/tool-02.tsx +14 -0
- package/src/components/icons/trash-01.tsx +15 -0
- package/src/components/icons/underline-01.tsx +22 -0
- package/src/components/icons/upload-cloud-02.tsx +15 -0
- package/src/components/icons/user-01.tsx +9 -0
- package/src/components/icons/user-03.tsx +9 -0
- package/src/components/icons/user-check-01.tsx +14 -0
- package/src/components/icons/user-circle.tsx +14 -0
- package/src/components/icons/user-edit.tsx +16 -0
- package/src/components/icons/user-minus-02.tsx +15 -0
- package/src/components/icons/user-plus-01.tsx +22 -0
- package/src/components/icons/user-plus-02.tsx +15 -0
- package/src/components/icons/user-square.tsx +16 -0
- package/src/components/icons/users-01.tsx +14 -0
- package/src/components/icons/users-plus-01.tsx +21 -0
- package/src/components/icons/users-plus.tsx +16 -0
- package/src/components/icons/vertical-drag.tsx +21 -0
- package/src/components/icons/x-circle.tsx +15 -0
- package/src/components/icons/x-close.tsx +9 -0
- package/src/components/icons/zap-fast.tsx +16 -0
- package/src/components/icons/zap.tsx +9 -0
- package/src/components/index.ts +4 -0
- package/src/components/molecules/Accordion/accordion.stories.tsx +81 -0
- package/src/components/molecules/Accordion/accordion.test.tsx +91 -0
- package/src/components/molecules/Accordion/accordion.tsx +65 -0
- package/src/components/molecules/Accordion/index.ts +1 -0
- package/src/components/molecules/Alert/alert.stories.tsx +75 -0
- package/src/components/molecules/Alert/alert.test.tsx +58 -0
- package/src/components/molecules/Alert/alert.tsx +67 -0
- package/src/components/molecules/Alert/index.ts +1 -0
- package/src/components/molecules/AlertDialog/alert-dialog.stories.tsx +55 -0
- package/src/components/molecules/AlertDialog/alert-dialog.test.tsx +34 -0
- package/src/components/molecules/AlertDialog/alert-dialog.tsx +172 -0
- package/src/components/molecules/AlertDialog/index.ts +1 -0
- package/src/components/molecules/Avatar/avatar.stories.tsx +98 -0
- package/src/components/molecules/Avatar/avatar.test.tsx +55 -0
- package/src/components/molecules/Avatar/avatar.tsx +55 -0
- package/src/components/molecules/Avatar/index.ts +1 -0
- package/src/components/molecules/Breadcrumb/breadcrumb.stories.tsx +125 -0
- package/src/components/molecules/Breadcrumb/breadcrumb.test.tsx +118 -0
- package/src/components/molecules/Breadcrumb/breadcrumb.tsx +120 -0
- package/src/components/molecules/Breadcrumb/index.ts +1 -0
- package/src/components/molecules/Card/card.stories.tsx +109 -0
- package/src/components/molecules/Card/card.test.tsx +103 -0
- package/src/components/molecules/Card/card.tsx +78 -0
- package/src/components/molecules/Card/index.ts +1 -0
- package/src/components/molecules/Collapsible/collapsible.stories.tsx +28 -0
- package/src/components/molecules/Collapsible/collapsible.test.tsx +36 -0
- package/src/components/molecules/Collapsible/collapsible.tsx +31 -0
- package/src/components/molecules/Collapsible/index.ts +1 -0
- package/src/components/molecules/ColorPicker/color-picker.stories.tsx +40 -0
- package/src/components/molecules/ColorPicker/color-picker.tsx +106 -0
- package/src/components/molecules/ColorPicker/index.ts +1 -0
- package/src/components/molecules/ColorScale/color-scale.stories.tsx +31 -0
- package/src/components/molecules/ColorScale/color-scale.tsx +74 -0
- package/src/components/molecules/ColorScale/index.ts +1 -0
- package/src/components/molecules/Command/command.stories.tsx +71 -0
- package/src/components/molecules/Command/command.test.tsx +50 -0
- package/src/components/molecules/Command/command.tsx +177 -0
- package/src/components/molecules/Command/index.ts +1 -0
- package/src/components/molecules/ContextMenu/context-menu.stories.tsx +69 -0
- package/src/components/molecules/ContextMenu/context-menu.test.tsx +25 -0
- package/src/components/molecules/ContextMenu/context-menu.tsx +259 -0
- package/src/components/molecules/ContextMenu/index.ts +1 -0
- package/src/components/molecules/DatePicker/date-picker.stories.tsx +204 -0
- package/src/components/molecules/DatePicker/date-picker.test.tsx +27 -0
- package/src/components/molecules/DatePicker/date-picker.tsx +486 -0
- package/src/components/molecules/DatePicker/index.ts +1 -0
- package/src/components/molecules/Dialog/dialog.stories.tsx +48 -0
- package/src/components/molecules/Dialog/dialog.test.tsx +51 -0
- package/src/components/molecules/Dialog/dialog.tsx +150 -0
- package/src/components/molecules/Dialog/index.ts +1 -0
- package/src/components/molecules/Drawer/drawer.stories.tsx +182 -0
- package/src/components/molecules/Drawer/drawer.test.tsx +100 -0
- package/src/components/molecules/Drawer/drawer.tsx +206 -0
- package/src/components/molecules/Drawer/index.ts +1 -0
- package/src/components/molecules/Dropdown/dropdown-async.stories.tsx +15 -0
- package/src/components/molecules/Dropdown/dropdown.stories.tsx +112 -0
- package/src/components/molecules/Dropdown/dropdown.test.tsx +128 -0
- package/src/components/molecules/Dropdown/dropdown.tsx +322 -0
- package/src/components/molecules/Dropdown/index.ts +1 -0
- package/src/components/molecules/DropdownMenu/dropdown-menu.stories.tsx +154 -0
- package/src/components/molecules/DropdownMenu/dropdown-menu.test.tsx +163 -0
- package/src/components/molecules/DropdownMenu/dropdown-menu.tsx +313 -0
- package/src/components/molecules/DropdownMenu/index.ts +1 -0
- package/src/components/molecules/HoverCard/hover-card.stories.tsx +48 -0
- package/src/components/molecules/HoverCard/hover-card.test.tsx +42 -0
- package/src/components/molecules/HoverCard/hover-card.tsx +44 -0
- package/src/components/molecules/HoverCard/index.ts +1 -0
- package/src/components/molecules/InputOTP/index.ts +1 -0
- package/src/components/molecules/InputOTP/input-otp.stories.tsx +52 -0
- package/src/components/molecules/InputOTP/input-otp.test.tsx +28 -0
- package/src/components/molecules/InputOTP/input-otp.tsx +76 -0
- package/src/components/molecules/Menubar/index.ts +1 -0
- package/src/components/molecules/Menubar/menubar.stories.tsx +113 -0
- package/src/components/molecules/Menubar/menubar.test.tsx +42 -0
- package/src/components/molecules/Menubar/menubar.tsx +314 -0
- package/src/components/molecules/NavigationMenu/index.ts +1 -0
- package/src/components/molecules/NavigationMenu/navigation-menu.stories.tsx +143 -0
- package/src/components/molecules/NavigationMenu/navigation-menu.test.tsx +69 -0
- package/src/components/molecules/NavigationMenu/navigation-menu.tsx +174 -0
- package/src/components/molecules/PDFViewer/index.ts +1 -0
- package/src/components/molecules/PDFViewer/pdf-viewer.stories.tsx +34 -0
- package/src/components/molecules/PDFViewer/pdf-viewer.test.tsx +26 -0
- package/src/components/molecules/PDFViewer/pdf-viewer.tsx +358 -0
- package/src/components/molecules/Pagination/index.ts +1 -0
- package/src/components/molecules/Pagination/pagination.stories.tsx +193 -0
- package/src/components/molecules/Pagination/pagination.test.tsx +448 -0
- package/src/components/molecules/Pagination/pagination.tsx +206 -0
- package/src/components/molecules/PaginationDotGroup/index.ts +1 -0
- package/src/components/molecules/PaginationDotGroup/pagination-dot-group.stories.tsx +211 -0
- package/src/components/molecules/PaginationDotGroup/pagination-dot-group.test.tsx +385 -0
- package/src/components/molecules/PaginationDotGroup/pagination-dot-group.tsx +119 -0
- package/src/components/molecules/Popover/index.ts +1 -0
- package/src/components/molecules/Popover/popover-menu.stories.tsx +27 -0
- package/src/components/molecules/Popover/popover.test.tsx +50 -0
- package/src/components/molecules/Popover/popover.tsx +38 -0
- package/src/components/molecules/ProgressSteps/index.ts +1 -0
- package/src/components/molecules/ProgressSteps/progress-steps.stories.tsx +36 -0
- package/src/components/molecules/ProgressSteps/progress-steps.test.tsx +470 -0
- package/src/components/molecules/ProgressSteps/progress-steps.tsx +140 -0
- package/src/components/molecules/RadioGroup/index.ts +1 -0
- package/src/components/molecules/RadioGroup/radio-group.stories.tsx +42 -0
- package/src/components/molecules/RadioGroup/radio-group.test.tsx +22 -0
- package/src/components/molecules/RadioGroup/radio-group.tsx +55 -0
- package/src/components/molecules/Resizable/index.ts +1 -0
- package/src/components/molecules/Resizable/resizable.stories.tsx +52 -0
- package/src/components/molecules/Resizable/resizable.test.tsx +22 -0
- package/src/components/molecules/Resizable/resizable.tsx +55 -0
- package/src/components/molecules/ScrollArea/index.ts +1 -0
- package/src/components/molecules/ScrollArea/scroll-area.stories.tsx +93 -0
- package/src/components/molecules/ScrollArea/scroll-area.test.tsx +28 -0
- package/src/components/molecules/ScrollArea/scroll-area.tsx +57 -0
- package/src/components/molecules/Select/index.ts +1 -0
- package/src/components/molecules/Select/select.stories.tsx +63 -0
- package/src/components/molecules/Select/select.test.tsx +80 -0
- package/src/components/molecules/Select/select.tsx +172 -0
- package/src/components/molecules/Sheet/index.ts +1 -0
- package/src/components/molecules/Sheet/sheet.stories.tsx +141 -0
- package/src/components/molecules/Sheet/sheet.test.tsx +70 -0
- package/src/components/molecules/Sheet/sheet.tsx +133 -0
- package/src/components/molecules/Tabs/index.ts +1 -0
- package/src/components/molecules/Tabs/tabs.stories.tsx +222 -0
- package/src/components/molecules/Tabs/tabs.test.tsx +113 -0
- package/src/components/molecules/Tabs/tabs.tsx +102 -0
- package/src/components/molecules/ToggleGroup/index.ts +1 -0
- package/src/components/molecules/ToggleGroup/toggle-group.stories.tsx +117 -0
- package/src/components/molecules/ToggleGroup/toggle-group.test.tsx +100 -0
- package/src/components/molecules/ToggleGroup/toggle-group.tsx +70 -0
- package/src/components/molecules/Tooltip/index.ts +1 -0
- package/src/components/molecules/Tooltip/tooltip.stories.tsx +133 -0
- package/src/components/molecules/Tooltip/tooltip.test.tsx +58 -0
- package/src/components/molecules/Tooltip/tooltip.tsx +58 -0
- package/src/components/molecules/index.ts +33 -0
- package/src/components/organisms/Carousel/carousel.stories.tsx +94 -0
- package/src/components/organisms/Carousel/carousel.test.tsx +24 -0
- package/src/components/organisms/Carousel/carousel.tsx +383 -0
- package/src/components/organisms/Carousel/index.ts +1 -0
- package/src/components/organisms/Chart/chart.stories.tsx +102 -0
- package/src/components/organisms/Chart/chart.test.tsx +105 -0
- package/src/components/organisms/Chart/chart.tsx +294 -0
- package/src/components/organisms/Chart/index.ts +1 -0
- package/src/components/organisms/FileUpload/FilePreview/file-preview.tsx +55 -0
- package/src/components/organisms/FileUpload/FilePreview/index.ts +1 -0
- package/src/components/organisms/FileUpload/file-upload.stories.tsx +20 -0
- package/src/components/organisms/FileUpload/file-upload.test.tsx +59 -0
- package/src/components/organisms/FileUpload/file-upload.tsx +175 -0
- package/src/components/organisms/FileUpload/file.d.ts +21 -0
- package/src/components/organisms/FileUpload/index.ts +1 -0
- package/src/components/organisms/Form/form.stories.tsx +155 -0
- package/src/components/organisms/Form/form.test.tsx +49 -0
- package/src/components/organisms/Form/form.tsx +133 -0
- package/src/components/organisms/Form/index.ts +1 -0
- package/src/components/organisms/Sidebar/index.ts +1 -0
- package/src/components/organisms/Sidebar/sidebar.stories.tsx +86 -0
- package/src/components/organisms/Sidebar/sidebar.test.tsx +101 -0
- package/src/components/organisms/Sidebar/sidebar.tsx +666 -0
- package/src/components/organisms/Table/index.ts +1 -0
- package/src/components/organisms/Table/table.stories.tsx +86 -0
- package/src/components/organisms/Table/table.test.tsx +42 -0
- package/src/components/organisms/Table/table.tsx +120 -0
- package/src/components/organisms/index.ts +6 -0
- package/src/constants/brazilian-states.ts +29 -0
- package/src/constants/index.ts +1 -0
- package/src/hooks/index.ts +10 -0
- package/src/hooks/useEditorActiveMarks.ts +63 -0
- package/src/hooks/useForm.ts +8 -0
- package/src/hooks/useFormContext.ts +7 -0
- package/src/hooks/useFormField.ts +41 -0
- package/src/hooks/useMobile.ts +61 -0
- package/src/hooks/useOnToggle.ts +28 -0
- package/src/hooks/usePDFNavigation.ts +41 -0
- package/src/hooks/usePDFZoom.ts +35 -0
- package/src/hooks/useSidebar.ts +23 -0
- package/src/hooks/useToast.tsx +63 -0
- package/src/index.css +73 -0
- package/src/main.ts +6 -0
- package/src/theme.css +388 -0
- package/src/utils/api/api.test.ts +64 -0
- package/src/utils/api/api.ts +34 -0
- package/src/utils/api/index.ts +1 -0
- package/src/utils/array/array.test.ts +160 -0
- package/src/utils/array/array.ts +43 -0
- package/src/utils/array/index.ts +1 -0
- package/src/utils/clipboard/clipboard.test.ts +218 -0
- package/src/utils/clipboard/clipboard.ts +40 -0
- package/src/utils/clipboard/index.ts +1 -0
- package/src/utils/cn/cn.test.ts +43 -0
- package/src/utils/cn/cn.ts +6 -0
- package/src/utils/cn/index.ts +1 -0
- package/src/utils/color-utils/color-utils.test.ts +46 -0
- package/src/utils/color-utils/color-utils.ts +97 -0
- package/src/utils/color-utils/index.ts +1 -0
- package/src/utils/countries/countries.ts +69 -0
- package/src/utils/countries/index.ts +1 -0
- package/src/utils/currency/currency.test.ts +114 -0
- package/src/utils/currency/currency.ts +134 -0
- package/src/utils/currency/index.ts +1 -0
- package/src/utils/date/date.test.ts +167 -0
- package/src/utils/date/date.ts +83 -0
- package/src/utils/date/index.ts +1 -0
- package/src/utils/file/file.ts +45 -0
- package/src/utils/file/index.ts +1 -0
- package/src/utils/get-initials/get-initials.test.ts +40 -0
- package/src/utils/get-initials/get-initials.ts +13 -0
- package/src/utils/get-initials/index.ts +1 -0
- package/src/utils/index.ts +14 -0
- package/src/utils/masks/index.ts +1 -0
- package/src/utils/masks/masks.ts +180 -0
- package/src/utils/render-highlighted-text/index.ts +1 -0
- package/src/utils/render-highlighted-text/render-highlighted-text.tsx +25 -0
- package/src/utils/string/index.ts +1 -0
- package/src/utils/string/string.test.ts +171 -0
- package/src/utils/string/string.ts +155 -0
- package/src/utils/video/index.ts +1 -0
- package/src/utils/video/video.ts +9 -0
- package/src/vite-env.d.ts +3 -0
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { InputSearch } from './input-search';
|
|
4
|
+
|
|
5
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
6
|
+
|
|
7
|
+
const meta: Meta<typeof InputSearch> = {
|
|
8
|
+
title: 'Components/Data Entry/InputSearch',
|
|
9
|
+
component: InputSearch,
|
|
10
|
+
tags: [ 'autodocs' ],
|
|
11
|
+
parameters: {
|
|
12
|
+
layout: 'centered',
|
|
13
|
+
docs: {
|
|
14
|
+
description: {
|
|
15
|
+
component: 'A search input component with a search icon on the left and an Enter button on the right. Supports keyboard navigation and click interactions for search functionality.',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
argTypes: {
|
|
20
|
+
size: {
|
|
21
|
+
control: { type: 'select' },
|
|
22
|
+
options: [ 'sm', 'md', 'lg' ],
|
|
23
|
+
description: 'Size of the input field',
|
|
24
|
+
},
|
|
25
|
+
rounded: {
|
|
26
|
+
control: { type: 'select' },
|
|
27
|
+
options: [ 'md', 'lg', '2xl' ],
|
|
28
|
+
description: 'Container rounded state styling',
|
|
29
|
+
},
|
|
30
|
+
error: {
|
|
31
|
+
control: { type: 'boolean' },
|
|
32
|
+
description: 'Error state styling',
|
|
33
|
+
},
|
|
34
|
+
success: {
|
|
35
|
+
control: { type: 'boolean' },
|
|
36
|
+
description: 'Success state styling',
|
|
37
|
+
},
|
|
38
|
+
disabled: {
|
|
39
|
+
control: { type: 'boolean' },
|
|
40
|
+
description: 'Disabled state',
|
|
41
|
+
},
|
|
42
|
+
placeholder: {
|
|
43
|
+
control: { type: 'text' },
|
|
44
|
+
description: 'Placeholder text',
|
|
45
|
+
},
|
|
46
|
+
enterButtonText: {
|
|
47
|
+
control: { type: 'text' },
|
|
48
|
+
description: 'Text for the Enter button',
|
|
49
|
+
},
|
|
50
|
+
showEnterButton: {
|
|
51
|
+
control: { type: 'boolean' },
|
|
52
|
+
description: 'Whether to show the Enter button',
|
|
53
|
+
},
|
|
54
|
+
onSearch: {
|
|
55
|
+
action: 'searched',
|
|
56
|
+
description: 'Callback triggered when search is performed',
|
|
57
|
+
},
|
|
58
|
+
onChange: {
|
|
59
|
+
action: 'changed',
|
|
60
|
+
description: 'Callback triggered when input value changes',
|
|
61
|
+
},
|
|
62
|
+
loading: {
|
|
63
|
+
control: { type: 'boolean' },
|
|
64
|
+
description: 'Loading state',
|
|
65
|
+
},
|
|
66
|
+
hasFocus: {
|
|
67
|
+
control: { type: 'boolean' },
|
|
68
|
+
description: 'Whether the input has focus',
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export default meta;
|
|
74
|
+
|
|
75
|
+
type Story = StoryObj<typeof meta>;
|
|
76
|
+
|
|
77
|
+
// Interactive example component
|
|
78
|
+
const InteractiveExample = () => {
|
|
79
|
+
const [ searchValue, setSearchValue ] = useState('');
|
|
80
|
+
const [ searchResults, setSearchResults ] = useState<string[]>([]);
|
|
81
|
+
const [ isSearching, setIsSearching ] = useState(false);
|
|
82
|
+
|
|
83
|
+
const handleSearch = (value: string) => {
|
|
84
|
+
setIsSearching(true);
|
|
85
|
+
|
|
86
|
+
// Simulate API call
|
|
87
|
+
setTimeout(() => {
|
|
88
|
+
const mockResults = [
|
|
89
|
+
`Result 1 for "${value}"`,
|
|
90
|
+
`Result 2 for "${value}"`,
|
|
91
|
+
`Result 3 for "${value}"`,
|
|
92
|
+
];
|
|
93
|
+
setSearchResults(mockResults);
|
|
94
|
+
setIsSearching(false);
|
|
95
|
+
}, 1000);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const handleChange = (value: string) => {
|
|
99
|
+
setSearchValue(value);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
return (
|
|
103
|
+
<div className="w-80 space-y-4">
|
|
104
|
+
<InputSearch
|
|
105
|
+
placeholder="Search for products..."
|
|
106
|
+
value={searchValue}
|
|
107
|
+
onChange={handleChange}
|
|
108
|
+
onSearch={handleSearch}
|
|
109
|
+
enterButtonText="Search"
|
|
110
|
+
disabled={isSearching}
|
|
111
|
+
/>
|
|
112
|
+
|
|
113
|
+
{isSearching && (
|
|
114
|
+
<div className="text-sm text-gray-500">Searching...</div>
|
|
115
|
+
)}
|
|
116
|
+
|
|
117
|
+
{searchResults.length > 0 && !isSearching && (
|
|
118
|
+
<div className="space-y-2">
|
|
119
|
+
<h4 className="text-sm font-medium text-gray-700">Search Results:</h4>
|
|
120
|
+
{searchResults.map((result, index) => (
|
|
121
|
+
<div key={index} className="p-2 bg-gray-50 rounded text-sm">
|
|
122
|
+
{result}
|
|
123
|
+
</div>
|
|
124
|
+
))}
|
|
125
|
+
</div>
|
|
126
|
+
)}
|
|
127
|
+
</div>
|
|
128
|
+
);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
// Form with validation example
|
|
132
|
+
const FormWithValidation = () => {
|
|
133
|
+
const [ searchValue, setSearchValue ] = useState('');
|
|
134
|
+
const [ hasError, setHasError ] = useState(false);
|
|
135
|
+
|
|
136
|
+
const handleSearch = (value: string) => {
|
|
137
|
+
if (value.length < 3) {
|
|
138
|
+
setHasError(true);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
setHasError(false);
|
|
143
|
+
alert(`Searching for: ${value}`);
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
const handleChange = (value: string) => {
|
|
147
|
+
setSearchValue(value);
|
|
148
|
+
|
|
149
|
+
if (hasError && value.length >= 3) {
|
|
150
|
+
setHasError(false);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
return (
|
|
155
|
+
<div className="w-80 space-y-4">
|
|
156
|
+
<InputSearch
|
|
157
|
+
placeholder="Search (minimum 3 characters)..."
|
|
158
|
+
value={searchValue}
|
|
159
|
+
onChange={handleChange}
|
|
160
|
+
onSearch={handleSearch}
|
|
161
|
+
error={hasError}
|
|
162
|
+
enterButtonText="Go"
|
|
163
|
+
/>
|
|
164
|
+
|
|
165
|
+
{hasError && (
|
|
166
|
+
<p className="text-sm text-red-600">Please enter at least 3 characters</p>
|
|
167
|
+
)}
|
|
168
|
+
</div>
|
|
169
|
+
);
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
export const AllSizesBasic: Story = {
|
|
173
|
+
name: 'All Sizes Showcase',
|
|
174
|
+
render: (args) => (
|
|
175
|
+
<div className="space-y-6">
|
|
176
|
+
<div>
|
|
177
|
+
<h4 className="text-sm font-medium text-gray-700 mb-2">Small</h4>
|
|
178
|
+
<InputSearch size="sm" placeholder="Small search input" {...args} />
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
<div>
|
|
182
|
+
<h4 className="text-sm font-medium text-gray-700 mb-2">Medium</h4>
|
|
183
|
+
<InputSearch size="md" placeholder="Medium search input" {...args} />
|
|
184
|
+
</div>
|
|
185
|
+
|
|
186
|
+
<div>
|
|
187
|
+
<h4 className="text-sm font-medium text-gray-700 mb-2">Large</h4>
|
|
188
|
+
<InputSearch size="lg" placeholder="Large search input" {...args} />
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
),
|
|
192
|
+
parameters: {
|
|
193
|
+
docs: {
|
|
194
|
+
description: {
|
|
195
|
+
story: 'Comparison of all available sizes for the search input.',
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
export const AllStatesBasic: Story = {
|
|
202
|
+
name: 'All States Showcase',
|
|
203
|
+
render: (args) => (
|
|
204
|
+
<div className="space-y-4">
|
|
205
|
+
<div>
|
|
206
|
+
<h4 className="text-sm font-medium text-gray-700 mb-2">Normal</h4>
|
|
207
|
+
<InputSearch placeholder="Normal state" defaultValue="Search term" {...args} />
|
|
208
|
+
</div>
|
|
209
|
+
|
|
210
|
+
<div>
|
|
211
|
+
<h4 className="text-sm font-medium text-gray-700 mb-2">Error</h4>
|
|
212
|
+
<InputSearch error placeholder="Error state" defaultValue="Invalid search" {...args} />
|
|
213
|
+
</div>
|
|
214
|
+
|
|
215
|
+
<div>
|
|
216
|
+
<h4 className="text-sm font-medium text-gray-700 mb-2">Success</h4>
|
|
217
|
+
<InputSearch success placeholder="Success state" defaultValue="Valid search" {...args} />
|
|
218
|
+
</div>
|
|
219
|
+
|
|
220
|
+
<div>
|
|
221
|
+
<h4 className="text-sm font-medium text-gray-700 mb-2">Disabled</h4>
|
|
222
|
+
<InputSearch disabled placeholder="Disabled state" defaultValue="Cannot search" {...args} />
|
|
223
|
+
</div>
|
|
224
|
+
</div>
|
|
225
|
+
),
|
|
226
|
+
parameters: {
|
|
227
|
+
docs: {
|
|
228
|
+
description: {
|
|
229
|
+
story: 'Showcase of all available states and their visual feedback.',
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
export const ButtonVariations: Story = {
|
|
236
|
+
name: 'Button Text Variations',
|
|
237
|
+
render: () => (
|
|
238
|
+
<div className="space-y-4 w-80">
|
|
239
|
+
<div>
|
|
240
|
+
<label className="block text-sm font-medium text-gray-700 mb-1">Default</label>
|
|
241
|
+
<InputSearch placeholder="Search..." />
|
|
242
|
+
</div>
|
|
243
|
+
|
|
244
|
+
<div>
|
|
245
|
+
<label className="block text-sm font-medium text-gray-700 mb-1">Custom Text</label>
|
|
246
|
+
<InputSearch placeholder="Search..." enterButtonText="Go" />
|
|
247
|
+
</div>
|
|
248
|
+
|
|
249
|
+
<div>
|
|
250
|
+
<label className="block text-sm font-medium text-gray-700 mb-1">Search Text</label>
|
|
251
|
+
<InputSearch placeholder="Search..." enterButtonText="Search" />
|
|
252
|
+
</div>
|
|
253
|
+
|
|
254
|
+
<div>
|
|
255
|
+
<label className="block text-sm font-medium text-gray-700 mb-1">No Button</label>
|
|
256
|
+
<InputSearch placeholder="Search..." showEnterButton={false} />
|
|
257
|
+
</div>
|
|
258
|
+
</div>
|
|
259
|
+
),
|
|
260
|
+
parameters: {
|
|
261
|
+
docs: {
|
|
262
|
+
description: {
|
|
263
|
+
story: 'Different button text variations and the option to hide the button entirely.',
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
export const Default: Story = {
|
|
270
|
+
args: {
|
|
271
|
+
placeholder: 'Search...',
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
export const Disabled: Story = {
|
|
276
|
+
args: {
|
|
277
|
+
disabled: true,
|
|
278
|
+
placeholder: 'Search disabled...',
|
|
279
|
+
defaultValue: 'Cannot search',
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
export const ErrorState: Story = {
|
|
284
|
+
name: 'Error State',
|
|
285
|
+
args: {
|
|
286
|
+
error: true,
|
|
287
|
+
placeholder: 'Invalid search...',
|
|
288
|
+
defaultValue: 'invalid search',
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
export const FormWithValidationStory: Story = {
|
|
293
|
+
name: 'Form with Validation',
|
|
294
|
+
render: () => <FormWithValidation />,
|
|
295
|
+
parameters: {
|
|
296
|
+
docs: {
|
|
297
|
+
description: {
|
|
298
|
+
story: 'A complete search form example with validation and error handling.',
|
|
299
|
+
},
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
export const Interactive: Story = {
|
|
305
|
+
name: 'Interactive Search Example',
|
|
306
|
+
render: () => <InteractiveExample />,
|
|
307
|
+
parameters: {
|
|
308
|
+
docs: {
|
|
309
|
+
description: {
|
|
310
|
+
story: 'A complete interactive search example showing real-time search functionality.',
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
export const Large: Story = {
|
|
317
|
+
args: {
|
|
318
|
+
size: 'lg',
|
|
319
|
+
placeholder: 'Large search input...',
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
export const Medium: Story = {
|
|
324
|
+
args: {
|
|
325
|
+
size: 'md',
|
|
326
|
+
placeholder: 'Medium search input...',
|
|
327
|
+
},
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
export const Small: Story = {
|
|
331
|
+
args: {
|
|
332
|
+
size: 'sm',
|
|
333
|
+
placeholder: 'Small search input...',
|
|
334
|
+
},
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
export const SuccessState: Story = {
|
|
338
|
+
name: 'Success State',
|
|
339
|
+
args: {
|
|
340
|
+
success: true,
|
|
341
|
+
placeholder: 'Valid search...',
|
|
342
|
+
defaultValue: 'valid search term',
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
export const WithCustomButtonText: Story = {
|
|
347
|
+
name: 'With Custom Button Text',
|
|
348
|
+
args: {
|
|
349
|
+
placeholder: 'Search products...',
|
|
350
|
+
enterButtonText: 'Find',
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
export const WithoutButton: Story = {
|
|
355
|
+
name: 'Without Enter Button',
|
|
356
|
+
args: {
|
|
357
|
+
placeholder: 'Search without button...',
|
|
358
|
+
showEnterButton: false,
|
|
359
|
+
},
|
|
360
|
+
};
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/react';
|
|
2
|
+
import userEvent from '@testing-library/user-event';
|
|
3
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
4
|
+
|
|
5
|
+
import { InputSearch } from './input-search';
|
|
6
|
+
|
|
7
|
+
describe('InputSearch', () => {
|
|
8
|
+
it('renders with default props', () => {
|
|
9
|
+
render(<InputSearch data-testid="search-input" />);
|
|
10
|
+
|
|
11
|
+
const input = screen.getByTestId('search-input');
|
|
12
|
+
expect(input).toBeInTheDocument();
|
|
13
|
+
expect(input).toHaveAttribute('type', 'text');
|
|
14
|
+
expect(input).toHaveAttribute('placeholder', 'Search...');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('renders with custom placeholder', () => {
|
|
18
|
+
render(<InputSearch placeholder="Search products..." data-testid="search-input" />);
|
|
19
|
+
|
|
20
|
+
const input = screen.getByTestId('search-input');
|
|
21
|
+
expect(input).toHaveAttribute('placeholder', 'Search products...');
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('shows search icon', () => {
|
|
25
|
+
render(<InputSearch data-testid="search-input" />);
|
|
26
|
+
|
|
27
|
+
const searchIcon = document.querySelector('svg');
|
|
28
|
+
expect(searchIcon).toBeInTheDocument();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('shows Enter button by default', () => {
|
|
32
|
+
render(<InputSearch data-testid="search-input" />);
|
|
33
|
+
|
|
34
|
+
const enterButton = screen.getByText('Enter');
|
|
35
|
+
expect(enterButton).toBeInTheDocument();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('hides Enter button when showEnterButton is false', () => {
|
|
39
|
+
render(<InputSearch showEnterButton={false} data-testid="search-input" />);
|
|
40
|
+
|
|
41
|
+
const enterButton = screen.queryByText('Enter');
|
|
42
|
+
expect(enterButton).not.toBeInTheDocument();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('shows custom Enter button text', () => {
|
|
46
|
+
render(<InputSearch enterButtonText="Search" data-testid="search-input" />);
|
|
47
|
+
|
|
48
|
+
const enterButton = screen.getByText('Search');
|
|
49
|
+
expect(enterButton).toBeInTheDocument();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('calls onSearch when Enter key is pressed', async () => {
|
|
53
|
+
const handleSearch = vi.fn();
|
|
54
|
+
const user = userEvent.setup();
|
|
55
|
+
|
|
56
|
+
render(
|
|
57
|
+
<InputSearch
|
|
58
|
+
onSearch={handleSearch}
|
|
59
|
+
data-testid="search-input"
|
|
60
|
+
/>
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
const input = screen.getByTestId('search-input');
|
|
64
|
+
await user.type(input, 'test search');
|
|
65
|
+
await user.keyboard('{Enter}');
|
|
66
|
+
|
|
67
|
+
expect(handleSearch).toHaveBeenCalledWith('test search');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('calls onSearch when Enter button is clicked', async () => {
|
|
71
|
+
const handleSearch = vi.fn();
|
|
72
|
+
const user = userEvent.setup();
|
|
73
|
+
|
|
74
|
+
render(
|
|
75
|
+
<InputSearch
|
|
76
|
+
onSearch={handleSearch}
|
|
77
|
+
data-testid="search-input"
|
|
78
|
+
defaultValue="test search"
|
|
79
|
+
/>
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
const enterButton = screen.getByText('Enter');
|
|
83
|
+
await user.click(enterButton);
|
|
84
|
+
|
|
85
|
+
expect(handleSearch).toHaveBeenCalledWith('test search');
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('calls onChange when input value changes', async () => {
|
|
89
|
+
const handleChange = vi.fn();
|
|
90
|
+
const user = userEvent.setup();
|
|
91
|
+
|
|
92
|
+
render(
|
|
93
|
+
<InputSearch
|
|
94
|
+
onChange={handleChange}
|
|
95
|
+
data-testid="search-input"
|
|
96
|
+
/>
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const input = screen.getByTestId('search-input');
|
|
100
|
+
await user.type(input, 'test');
|
|
101
|
+
|
|
102
|
+
expect(handleChange).toHaveBeenCalledWith('test');
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('applies error styling when error prop is true', () => {
|
|
106
|
+
render(<InputSearch error data-testid="search-input" />);
|
|
107
|
+
|
|
108
|
+
const container = screen.getByTestId('search-input').parentElement?.parentElement;
|
|
109
|
+
expect(container).toHaveClass('border-error-500');
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('applies success styling when success prop is true', () => {
|
|
113
|
+
render(<InputSearch success data-testid="search-input" />);
|
|
114
|
+
|
|
115
|
+
const container = screen.getByTestId('search-input').parentElement?.parentElement;
|
|
116
|
+
expect(container).toHaveClass('border-green-500');
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('is disabled when disabled prop is true', () => {
|
|
120
|
+
render(<InputSearch disabled data-testid="search-input" />);
|
|
121
|
+
|
|
122
|
+
const input = screen.getByTestId('search-input');
|
|
123
|
+
const enterButton = screen.getByText('Enter');
|
|
124
|
+
|
|
125
|
+
expect(input).toBeDisabled();
|
|
126
|
+
expect(enterButton).toHaveClass('opacity-50', 'cursor-not-allowed');
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('does not call onSearch when disabled and Enter is pressed', async () => {
|
|
130
|
+
const handleSearch = vi.fn();
|
|
131
|
+
const user = userEvent.setup();
|
|
132
|
+
|
|
133
|
+
render(
|
|
134
|
+
<InputSearch
|
|
135
|
+
disabled
|
|
136
|
+
onSearch={handleSearch}
|
|
137
|
+
data-testid="search-input"
|
|
138
|
+
/>
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
const input = screen.getByTestId('search-input');
|
|
142
|
+
await user.type(input, 'test');
|
|
143
|
+
await user.keyboard('{Enter}');
|
|
144
|
+
|
|
145
|
+
expect(handleSearch).not.toHaveBeenCalled();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('does not call onSearch when disabled and Enter button is clicked', async () => {
|
|
149
|
+
const handleSearch = vi.fn();
|
|
150
|
+
const user = userEvent.setup();
|
|
151
|
+
|
|
152
|
+
render(
|
|
153
|
+
<InputSearch
|
|
154
|
+
disabled
|
|
155
|
+
onSearch={handleSearch}
|
|
156
|
+
data-testid="search-input"
|
|
157
|
+
/>
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
const enterButton = screen.getByText('Enter');
|
|
161
|
+
await user.click(enterButton);
|
|
162
|
+
|
|
163
|
+
expect(handleSearch).not.toHaveBeenCalled();
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('applies different sizes correctly', () => {
|
|
167
|
+
const { rerender } = render(<InputSearch size="sm" data-testid="search-input" />);
|
|
168
|
+
|
|
169
|
+
let container = screen.getByTestId('search-input').parentElement?.parentElement;
|
|
170
|
+
expect(container).toHaveClass('px-3');
|
|
171
|
+
|
|
172
|
+
rerender(<InputSearch size="lg" data-testid="search-input" />);
|
|
173
|
+
|
|
174
|
+
container = screen.getByTestId('search-input').parentElement?.parentElement;
|
|
175
|
+
expect(container).toHaveClass('px-4');
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('applies correct icon sizes for different input sizes', () => {
|
|
179
|
+
const { rerender } = render(<InputSearch size="sm" data-testid="search-input" />);
|
|
180
|
+
|
|
181
|
+
let searchIcon = document.querySelector('svg');
|
|
182
|
+
expect(searchIcon).toHaveClass('size-5');
|
|
183
|
+
|
|
184
|
+
rerender(<InputSearch size="lg" data-testid="search-input" />);
|
|
185
|
+
|
|
186
|
+
searchIcon = document.querySelector('svg');
|
|
187
|
+
expect(searchIcon).toHaveClass('size-6');
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('has proper container structure', () => {
|
|
191
|
+
render(<InputSearch data-testid="search-input" />);
|
|
192
|
+
|
|
193
|
+
const input = screen.getByTestId('search-input');
|
|
194
|
+
const container = input.parentElement?.parentElement;
|
|
195
|
+
|
|
196
|
+
expect(container).toBeInTheDocument();
|
|
197
|
+
expect(container).toHaveClass('border', 'border-gray-300', 'flex', 'w-full', 'rounded-md');
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it('has proper focus styles', async () => {
|
|
201
|
+
const user = userEvent.setup();
|
|
202
|
+
render(<InputSearch data-testid="search-input" />);
|
|
203
|
+
|
|
204
|
+
const input = screen.getByTestId('search-input');
|
|
205
|
+
const container = input.parentElement?.parentElement;
|
|
206
|
+
|
|
207
|
+
await user.click(input);
|
|
208
|
+
expect(container).toHaveClass('focus-within-primary');
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it('supports controlled value', () => {
|
|
212
|
+
render(<InputSearch value="controlled value" data-testid="search-input" />);
|
|
213
|
+
|
|
214
|
+
const input = screen.getByTestId('search-input');
|
|
215
|
+
expect(input).toHaveValue('controlled value');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('supports defaultValue', () => {
|
|
219
|
+
render(<InputSearch defaultValue="default value" data-testid="search-input" />);
|
|
220
|
+
|
|
221
|
+
const input = screen.getByTestId('search-input');
|
|
222
|
+
expect(input).toHaveValue('default value');
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('has proper aria attributes', () => {
|
|
226
|
+
render(<InputSearch error data-testid="search-input" />);
|
|
227
|
+
|
|
228
|
+
const input = screen.getByTestId('search-input');
|
|
229
|
+
expect(input).toHaveAttribute('aria-invalid', 'true');
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('has proper data attributes', () => {
|
|
233
|
+
render(<InputSearch data-testid="search-input" />);
|
|
234
|
+
|
|
235
|
+
const input = screen.getByTestId('search-input');
|
|
236
|
+
expect(input).toHaveAttribute('data-slot', 'input');
|
|
237
|
+
expect(input).toHaveAttribute('data-testid', 'search-input');
|
|
238
|
+
});
|
|
239
|
+
});
|