@shohojdhara/atomix 0.1.16 → 0.1.18
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/CONTRIBUTING.md +151 -0
- package/NEXTJS_INTEGRATION.md +358 -0
- package/README.md +168 -119
- package/babel.config.js +58 -0
- package/css.d.ts +10 -0
- package/dist/css/atomix.css +1 -2
- package/dist/js/194.js +1 -2
- package/dist/js/244.js +1 -0
- package/dist/js/atomix.react.cjs.js +1 -0
- package/dist/js/atomix.react.esm.js +1 -2
- package/dist/js/atomix.react.umd.js +1 -2
- package/dist/js/chunks/cjs/202.9d3b1ef1eaa0d5c8a309.js +1 -0
- package/dist/js/chunks/cjs/308.6ea9685ea38ead4120d0.js +1 -0
- package/dist/js/chunks/cjs/54.73db6922594e421ba6b1.js +1 -0
- package/dist/js/chunks/cjs/619.51feecaadcab819780d4.js +1 -0
- package/dist/js/chunks/cjs/690.90f6d11164081cbcbc4d.js +1 -0
- package/dist/js/chunks/cjs/894.24877561df336a8dfd14.js +1 -0
- package/dist/js/chunks/cjs/897.6c2a71fae95338890de7.js +1 -0
- package/dist/js/chunks/esm/{202.ff48d27672233280e021.js → 202.82aa7b3244e53c9edb72.js} +1 -2
- package/dist/js/chunks/esm/{308.f873332126eba90e5c62.js → 308.27e1e4005705ae320432.js} +1 -2
- package/dist/js/chunks/esm/{54.4db919e5e4e5cc6d7c72.js → 54.ece1fd6964f98d4d994f.js} +1 -2
- package/dist/js/chunks/esm/{619.afc5a718eff77fa423b5.js → 619.ebeb0298432a066ac05c.js} +1 -2
- package/dist/js/chunks/esm/{690.a9e968c7497d61e56cdc.js → 690.c5f412cc979b55740359.js} +1 -2
- package/dist/js/chunks/esm/{894.f1091a4a8758c26d29e4.js → 894.3604ddc9367d75191198.js} +1 -2
- package/dist/js/chunks/esm/{897.561a50f7d043d42169da.js → 897.a4aab2fad9401693eb12.js} +1 -2
- package/dist/js/chunks/umd/{202.dac7605cc555b6bda542.js → 202.5017dd0403d696bf1644.js} +1 -2
- package/dist/js/chunks/umd/{308.6709979849dcbdb90c9b.js → 308.4bc14b9d7b16b6ee0ab8.js} +1 -2
- package/dist/js/chunks/umd/{54.403470e1f7d0ef4424a7.js → 54.7fdfb4a031989470a70d.js} +1 -2
- package/dist/js/chunks/umd/{619.fa05ea98c10270eb64c5.js → 619.84a0c35ecee695250085.js} +1 -2
- package/dist/js/chunks/umd/{690.aa7054d1c53e5402c2d6.js → 690.d7041094a34a4a434be2.js} +1 -2
- package/dist/js/chunks/umd/{894.3e1eaf0a2aadf4434390.js → 894.c127ee4e9513c22ee97d.js} +1 -2
- package/dist/js/chunks/umd/{897.554ea37be4453698c167.js → 897.26932ac837a39fc91907.js} +1 -2
- package/dist/types/components/Badge/index.d.ts +3 -3
- package/dist/types/components/{Navbar → Navigation/Menu}/MegaMenu.d.ts +1 -1
- package/dist/types/components/{Navbar → Navigation/Menu}/Menu.d.ts +1 -1
- package/dist/types/components/Navigation/Nav/Nav.d.ts +20 -0
- package/dist/types/components/{Navbar → Navigation/Nav}/NavDropdown.d.ts +1 -1
- package/dist/types/components/Navigation/Nav/NavItem.d.ts +33 -0
- package/dist/types/components/Navigation/Navbar/Navbar.d.ts +19 -0
- package/dist/types/components/Navigation/SideMenu/SideMenu.d.ts +20 -0
- package/dist/types/components/Navigation/SideMenu/SideMenuItem.d.ts +30 -0
- package/dist/types/components/Navigation/SideMenu/SideMenuList.d.ts +17 -0
- package/dist/types/components/Navigation/index.d.ts +10 -0
- package/dist/types/components/PhotoViewer/PhotoViewer.d.ts +2 -2
- package/dist/types/components/PhotoViewer/PhotoViewerHeader.d.ts +2 -2
- package/dist/types/components/Tab/index.d.ts +2 -2
- package/dist/types/components/Toggle/index.d.ts +2 -2
- package/dist/types/components/Tooltip/index.d.ts +3 -3
- package/dist/types/components/index.d.ts +1 -1
- package/dist/types/lib/composables/index.d.ts +1 -0
- package/dist/types/lib/composables/useDatePicker.d.ts +1 -1
- package/dist/types/lib/composables/useDropdown.d.ts +1 -1
- package/dist/types/lib/composables/useModal.d.ts +1 -1
- package/dist/types/lib/composables/usePhotoViewer.d.ts +1 -1
- package/dist/types/lib/composables/useRating.d.ts +1 -1
- package/dist/types/lib/composables/useSideMenu.d.ts +28 -0
- package/dist/types/lib/constants/components.d.ts +72 -0
- package/dist/types/lib/types/components.d.ts +103 -0
- package/examples/nextjs-example.tsx +271 -0
- package/implementation-guide.md +505 -0
- package/next.config.js +69 -0
- package/package.json +80 -42
- package/postcss.config.js +28 -0
- package/src/Introduction.mdx +3 -5
- package/src/assets/fonts/HelveticaNeue/stylesheet.css +140 -127
- package/src/components/Accordion/Accordion.stories.tsx +58 -45
- package/src/components/Accordion/Accordion.tsx +14 -4
- package/src/components/Accordion/scripts/accordionInteractions.ts +9 -9
- package/src/components/Accordion/scripts/bundle.ts +1 -1
- package/src/components/Accordion/scripts/index.ts +3 -3
- package/src/components/AtomixLogo.tsx +13 -19
- package/src/components/Avatar/Avatar.stories.tsx +24 -21
- package/src/components/Avatar/Avatar.tsx +5 -8
- package/src/components/Avatar/AvatarGroup.tsx +11 -11
- package/src/components/Avatar/index.ts +1 -1
- package/src/components/Avatar/scripts/index.ts +66 -71
- package/src/components/Badge/Badge.stories.tsx +51 -21
- package/src/components/Badge/Badge.tsx +14 -12
- package/src/components/Badge/index.ts +3 -3
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +40 -40
- package/src/components/Breadcrumb/Breadcrumb.tsx +19 -26
- package/src/components/Breadcrumb/index.ts +1 -1
- package/src/components/Breadcrumb/scripts/breadcrumb.ts +36 -34
- package/src/components/Breadcrumb/scripts/index.ts +1 -1
- package/src/components/Breadcrumb/scripts/types.ts +9 -9
- package/src/components/Button/Button.stories.tsx +36 -12
- package/src/components/Button/Button.tsx +52 -39
- package/src/components/Button/index.ts +1 -1
- package/src/components/Button/scripts/buttonInteractions.ts +9 -9
- package/src/components/Button/scripts/index.ts +1 -1
- package/src/components/Callout/Callout.stories.tsx +207 -114
- package/src/components/Callout/Callout.tsx +12 -12
- package/src/components/Callout/index.ts +1 -1
- package/src/components/Callout/scripts/CalloutInteractions.ts +58 -48
- package/src/components/Callout/scripts/bundle.ts +2 -2
- package/src/components/Callout/scripts/index.ts +19 -15
- package/src/components/Card/Card.stories.tsx +2 -2
- package/src/components/Card/Card.tsx +49 -72
- package/src/components/Card/ElevationCard.tsx +4 -8
- package/src/components/Card/index.ts +1 -1
- package/src/components/Card/scripts/bundle.ts +7 -7
- package/src/components/Card/scripts/cardInteractions.ts +24 -24
- package/src/components/Card/scripts/index.ts +25 -26
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +6 -3
- package/src/components/ColorModeToggle/ColorModeToggle.tsx +12 -15
- package/src/components/ColorModeToggle/index.ts +1 -1
- package/src/components/Countdown/Countdown.stories.tsx +6 -2
- package/src/components/Countdown/Countdown.tsx +56 -48
- package/src/components/Countdown/index.ts +1 -1
- package/src/components/Countdown/scripts/index.ts +33 -28
- package/src/components/DataTable/DataTable.stories.tsx +23 -18
- package/src/components/DataTable/DataTable.tsx +39 -39
- package/src/components/DataTable/index.ts +1 -1
- package/src/components/DataTable/scripts/bundle.ts +8 -3
- package/src/components/DataTable/scripts/index.ts +182 -164
- package/src/components/DatePicker/DatePicker.stories.tsx +136 -148
- package/src/components/DatePicker/DatePicker.tsx +461 -420
- package/src/components/DatePicker/scripts/bundle.ts +12 -7
- package/src/components/DatePicker/scripts/componentInteractions.ts +76 -46
- package/src/components/DatePicker/scripts/index.ts +176 -156
- package/src/components/DatePicker/types.ts +32 -32
- package/src/components/DatePicker/utils.ts +41 -30
- package/src/components/Dropdown/Dropdown.stories.tsx +85 -55
- package/src/components/Dropdown/Dropdown.tsx +97 -88
- package/src/components/Dropdown/index.ts +5 -10
- package/src/components/Dropdown/scripts/bundle.ts +10 -10
- package/src/components/Dropdown/scripts/componentInteractions.ts +10 -2
- package/src/components/Dropdown/scripts/index.ts +122 -117
- package/src/components/EdgePanel/EdgePanel.stories.tsx +142 -58
- package/src/components/EdgePanel/EdgePanel.tsx +7 -13
- package/src/components/EdgePanel/index.ts +1 -1
- package/src/components/EdgePanel/scripts/bundle.ts +5 -5
- package/src/components/EdgePanel/scripts/edgePanelInteractions.ts +26 -26
- package/src/components/EdgePanel/scripts/index.ts +53 -53
- package/src/components/Form/Checkbox.stories.tsx +2 -2
- package/src/components/Form/Checkbox.tsx +13 -7
- package/src/components/Form/Form.stories.tsx +144 -218
- package/src/components/Form/Form.tsx +6 -6
- package/src/components/Form/FormGroup.stories.tsx +21 -38
- package/src/components/Form/FormGroup.tsx +18 -20
- package/src/components/Form/Input.stories.tsx +1 -1
- package/src/components/Form/Input.tsx +18 -8
- package/src/components/Form/Radio.stories.tsx +12 -25
- package/src/components/Form/Radio.tsx +11 -6
- package/src/components/Form/Select.stories.tsx +6 -6
- package/src/components/Form/Select.tsx +31 -33
- package/src/components/Form/Textarea.stories.tsx +7 -2
- package/src/components/Form/Textarea.tsx +17 -8
- package/src/components/Form/index.ts +1 -1
- package/src/components/Hero/Hero.stories.tsx +44 -42
- package/src/components/Hero/Hero.tsx +28 -38
- package/src/components/Hero/index.ts +1 -1
- package/src/components/Hero/scripts/bundle.ts +6 -6
- package/src/components/Hero/scripts/heroInteractions.ts +24 -29
- package/src/components/Hero/scripts/index.ts +16 -17
- package/src/components/Icon/Icon.tsx +16 -18
- package/src/components/Icon/index.ts +1 -1
- package/src/components/List/List.stories.tsx +1 -3
- package/src/components/List/List.tsx +6 -10
- package/src/components/List/ListGroup.tsx +1 -1
- package/src/components/List/index.ts +1 -1
- package/src/components/Messages/Messages.stories.tsx +30 -29
- package/src/components/Messages/Messages.tsx +60 -55
- package/src/components/Messages/index.ts +1 -1
- package/src/components/Messages/scripts/bundle.ts +1 -6
- package/src/components/Messages/scripts/componentInteractions.ts +32 -37
- package/src/components/Messages/scripts/index.ts +61 -55
- package/src/components/Modal/Modal.stories.tsx +77 -53
- package/src/components/Modal/Modal.tsx +63 -62
- package/src/components/Modal/index.ts +1 -1
- package/src/components/Modal/scripts/bundle.ts +3 -3
- package/src/components/Modal/scripts/index.ts +96 -84
- package/src/components/Modal/scripts/modalInteractions.ts +16 -14
- package/src/components/{Navbar → Navigation/Menu}/MegaMenu.tsx +50 -59
- package/src/components/Navigation/Menu/Menu.stories.tsx +340 -0
- package/src/components/Navigation/Menu/Menu.tsx +110 -0
- package/src/components/Navigation/Nav/Nav.stories.tsx +458 -0
- package/src/components/Navigation/Nav/Nav.tsx +50 -0
- package/src/components/Navigation/Nav/NavDropdown.tsx +105 -0
- package/src/components/Navigation/Nav/NavItem.tsx +159 -0
- package/src/components/{Navbar → Navigation/Navbar}/Navbar.stories.tsx +198 -104
- package/src/components/Navigation/Navbar/Navbar.tsx +150 -0
- package/src/components/Navigation/README.md +314 -0
- package/src/components/Navigation/SideMenu/SideMenu.README.md +494 -0
- package/src/components/Navigation/SideMenu/SideMenu.stories.tsx +618 -0
- package/src/components/Navigation/SideMenu/SideMenu.tsx +101 -0
- package/src/components/Navigation/SideMenu/SideMenuItem.tsx +95 -0
- package/src/components/Navigation/SideMenu/SideMenuList.tsx +41 -0
- package/src/components/Navigation/index.ts +23 -0
- package/src/components/Navigation/scripts/NavbarInteractions.ts +171 -0
- package/src/components/Navigation/scripts/SideMenu.ts +319 -0
- package/src/components/Navigation/scripts/SideMenuBundle.ts +69 -0
- package/src/components/Navigation/scripts/SideMenuInteractions.ts +250 -0
- package/src/components/Navigation/scripts/bundle.ts +58 -0
- package/src/components/Navigation/scripts/index.ts +248 -0
- package/src/components/Pagination/Pagination.stories.tsx +34 -33
- package/src/components/Pagination/Pagination.tsx +25 -35
- package/src/components/Pagination/index.ts +1 -1
- package/src/components/Pagination/scripts/index.ts +42 -37
- package/src/components/PhotoViewer/PhotoViewer.stories.tsx +48 -48
- package/src/components/PhotoViewer/PhotoViewer.tsx +29 -46
- package/src/components/PhotoViewer/PhotoViewerHeader.tsx +20 -26
- package/src/components/PhotoViewer/PhotoViewerImage.tsx +19 -17
- package/src/components/PhotoViewer/PhotoViewerInfo.tsx +13 -5
- package/src/components/PhotoViewer/PhotoViewerNavigation.tsx +5 -5
- package/src/components/PhotoViewer/PhotoViewerThumbnails.tsx +31 -30
- package/src/components/PhotoViewer/examples/ImageGallery.tsx +27 -37
- package/src/components/PhotoViewer/examples/SimpleGallery.tsx +19 -13
- package/src/components/PhotoViewer/examples/index.ts +1 -1
- package/src/components/PhotoViewer/index.ts +1 -1
- package/src/components/PhotoViewer/scripts/PhotoViewerInteractions.ts +43 -33
- package/src/components/PhotoViewer/scripts/bundle.ts +14 -14
- package/src/components/PhotoViewer/scripts/index.ts +173 -129
- package/src/components/Popover/Popover.stories.tsx +11 -12
- package/src/components/Popover/Popover.tsx +36 -36
- package/src/components/Popover/index.ts +1 -1
- package/src/components/Popover/scripts/bundle.ts +1 -1
- package/src/components/Popover/scripts/componentInteractions.ts +34 -46
- package/src/components/Popover/scripts/index.ts +64 -53
- package/src/components/ProductReview/ProductReview.stories.tsx +10 -8
- package/src/components/ProductReview/ProductReview.tsx +28 -32
- package/src/components/ProductReview/scripts/componentInteractions.ts +20 -20
- package/src/components/Progress/Progress.tsx +36 -34
- package/src/components/Progress/scripts/bundle.ts +7 -2
- package/src/components/Progress/scripts/componentInteractions.ts +29 -23
- package/src/components/Progress/scripts/index.ts +45 -39
- package/src/components/Rating/Rating.stories.tsx +3 -16
- package/src/components/Rating/Rating.tsx +250 -231
- package/src/components/Rating/scripts/bundle.ts +11 -6
- package/src/components/Rating/scripts/index.ts +85 -80
- package/src/components/Rating/scripts/ratingInteractions.ts +27 -24
- package/src/components/River/River.stories.tsx +70 -24
- package/src/components/River/River.tsx +28 -38
- package/src/components/River/index.ts +1 -1
- package/src/components/River/scripts/index.ts +11 -12
- package/src/components/SectionIntro/SectionIntro.stories.tsx +12 -9
- package/src/components/SectionIntro/SectionIntro.tsx +25 -31
- package/src/components/SectionIntro/scripts/componentInteractions.ts +1 -1
- package/src/components/SectionIntro/scripts/index.ts +30 -16
- package/src/components/Spinner/Spinner.stories.tsx +5 -7
- package/src/components/Spinner/Spinner.tsx +11 -6
- package/src/components/Spinner/index.ts +2 -2
- package/src/components/Steps/Steps.stories.tsx +44 -48
- package/src/components/Steps/Steps.tsx +20 -20
- package/src/components/Steps/index.ts +1 -1
- package/src/components/Steps/scripts/index.ts +9 -9
- package/src/components/Tab/Tab.stories.tsx +14 -6
- package/src/components/Tab/Tab.tsx +16 -18
- package/src/components/Tab/index.ts +2 -2
- package/src/components/Tab/scripts/index.ts +13 -13
- package/src/components/Testimonial/Testimonial.stories.tsx +54 -51
- package/src/components/Testimonial/Testimonial.tsx +18 -19
- package/src/components/Testimonial/index.ts +1 -1
- package/src/components/Testimonial/scripts/index.ts +19 -8
- package/src/components/Todo/Todo.stories.tsx +7 -24
- package/src/components/Todo/Todo.tsx +35 -46
- package/src/components/Todo/index.ts +1 -1
- package/src/components/Todo/scripts/bundle.ts +1 -1
- package/src/components/Todo/scripts/index.ts +99 -81
- package/src/components/Todo/scripts/todoInteractions.ts +12 -12
- package/src/components/Todo/scripts/types.ts +3 -3
- package/src/components/Toggle/Toggle.stories.tsx +2 -2
- package/src/components/Toggle/Toggle.tsx +18 -18
- package/src/components/Toggle/index.ts +2 -2
- package/src/components/Toggle/scripts/bundle.ts +7 -2
- package/src/components/Toggle/scripts/index.ts +14 -10
- package/src/components/Toggle/scripts/toggleInteractions.ts +11 -14
- package/src/components/Tooltip/Tooltip.stories.tsx +13 -6
- package/src/components/Tooltip/Tooltip.tsx +25 -15
- package/src/components/Tooltip/index.ts +3 -3
- package/src/components/Tooltip/scripts/bundle.ts +0 -1
- package/src/components/Tooltip/scripts/index.ts +44 -41
- package/src/components/Tooltip/scripts/tooltipInteractions.ts +22 -22
- package/src/components/Upload/Upload.stories.tsx +28 -34
- package/src/components/Upload/Upload.tsx +86 -71
- package/src/components/Upload/index.ts +1 -1
- package/src/components/Upload/scripts/index.ts +58 -43
- package/src/components/index.ts +5 -6
- package/src/design-tokens/BoxShadow/BoxShadow.stories.tsx +13 -10
- package/src/design-tokens/Colors/colors.scss +10 -7
- package/src/design-tokens/Colors/colors.stories.tsx +46 -59
- package/src/design-tokens/Spacing/Spacing.scss +7 -5
- package/src/design-tokens/Spacing/Spacing.stories.tsx +19 -18
- package/src/design-tokens/Typography/Typography.scss +88 -25
- package/src/design-tokens/Typography/Typography.stories.tsx +22 -25
- package/src/docs/implementation-guide.mdx +2 -2
- package/src/htmlComponentsEntry.ts +23 -23
- package/src/index.ts +1 -1
- package/src/layouts/Grid/Container.tsx +6 -10
- package/src/layouts/Grid/Grid.stories.tsx +72 -34
- package/src/layouts/Grid/Grid.tsx +6 -13
- package/src/layouts/Grid/GridCol.tsx +29 -26
- package/src/layouts/Grid/Row.tsx +6 -13
- package/src/layouts/MasonryGrid/MasonryGrid.stories.tsx +79 -72
- package/src/layouts/MasonryGrid/MasonryGrid.tsx +23 -25
- package/src/layouts/MasonryGrid/MasonryGridItem.tsx +4 -12
- package/src/layouts/index.ts +3 -4
- package/src/lib/composables/index.ts +3 -3
- package/src/lib/composables/useAccordion.ts +15 -6
- package/src/lib/composables/useBadge.ts +3 -3
- package/src/lib/composables/useBreadcrumb.ts +6 -12
- package/src/lib/composables/useButton.ts +3 -3
- package/src/lib/composables/useCallout.ts +3 -3
- package/src/lib/composables/useCard.ts +50 -28
- package/src/lib/composables/useCheckbox.ts +7 -7
- package/src/lib/composables/useDataTable.ts +61 -57
- package/src/lib/composables/useDatePicker.ts +255 -231
- package/src/lib/composables/useDropdown.ts +90 -75
- package/src/lib/composables/useEdgePanel.ts +50 -47
- package/src/lib/composables/useForm.ts +4 -7
- package/src/lib/composables/useFormGroup.ts +11 -12
- package/src/lib/composables/useHero.ts +36 -38
- package/src/lib/composables/useInput.ts +9 -10
- package/src/lib/composables/useMessages.ts +12 -14
- package/src/lib/composables/useModal.ts +37 -34
- package/src/lib/composables/useNavbar.ts +33 -22
- package/src/lib/composables/usePagination.ts +3 -10
- package/src/lib/composables/usePhotoViewer.ts +625 -578
- package/src/lib/composables/usePopover.ts +68 -62
- package/src/lib/composables/useProgress.ts +9 -12
- package/src/lib/composables/useRadio.ts +4 -4
- package/src/lib/composables/useRating.ts +82 -70
- package/src/lib/composables/useRiver.ts +28 -31
- package/src/lib/composables/useSelect.ts +7 -8
- package/src/lib/composables/useSideMenu.ts +197 -0
- package/src/lib/composables/useSpinner.ts +3 -3
- package/src/lib/composables/useTextarea.ts +8 -9
- package/src/lib/composables/useTodo.ts +14 -18
- package/src/lib/constants/components.ts +191 -118
- package/src/lib/constants/index.ts +1 -1
- package/src/lib/types/components.ts +454 -324
- package/src/lib/utils/dom.ts +2 -6
- package/src/lib/utils/icons.ts +20 -12
- package/src/lib/utils/index.ts +2 -2
- package/src/lib/utils/useForkRef.ts +1 -2
- package/src/styles/01-settings/_index.scss +59 -59
- package/src/styles/01-settings/_settings.accordion.scss +21 -21
- package/src/styles/01-settings/_settings.animations.scss +2 -2
- package/src/styles/01-settings/_settings.avatar-group.scss +14 -14
- package/src/styles/01-settings/_settings.avatar.scss +31 -31
- package/src/styles/01-settings/_settings.badge.scss +11 -11
- package/src/styles/01-settings/_settings.border-radius.scss +10 -9
- package/src/styles/01-settings/_settings.border.scss +7 -7
- package/src/styles/01-settings/_settings.box-shadow.scss +24 -12
- package/src/styles/01-settings/_settings.breadcrumb.scss +18 -18
- package/src/styles/01-settings/_settings.btn-group.scss +1 -1
- package/src/styles/01-settings/_settings.button.scss +63 -49
- package/src/styles/01-settings/_settings.callout.scss +27 -7
- package/src/styles/01-settings/_settings.card.scss +27 -30
- package/src/styles/01-settings/_settings.checkbox-group.scss +2 -3
- package/src/styles/01-settings/_settings.checkbox.scss +17 -18
- package/src/styles/01-settings/_settings.color-mode.scss +1 -1
- package/src/styles/01-settings/_settings.colors.scss +197 -214
- package/src/styles/01-settings/_settings.config.scss +1 -3
- package/src/styles/01-settings/_settings.countdown.scss +14 -14
- package/src/styles/01-settings/_settings.data-table.scss +6 -6
- package/src/styles/01-settings/_settings.datepicker.scss +40 -42
- package/src/styles/01-settings/_settings.dropdown.scss +30 -30
- package/src/styles/01-settings/_settings.edge-panel.scss +16 -16
- package/src/styles/01-settings/_settings.fonts.scss +14 -12
- package/src/styles/01-settings/_settings.form-group.scss +10 -10
- package/src/styles/01-settings/_settings.form.scss +3 -3
- package/src/styles/01-settings/_settings.grid.scss +1 -1
- package/src/styles/01-settings/_settings.hero.scss +23 -23
- package/src/styles/01-settings/_settings.input.scss +32 -32
- package/src/styles/01-settings/_settings.link.scss +6 -6
- package/src/styles/01-settings/_settings.list-group.scss +12 -12
- package/src/styles/01-settings/_settings.list.scss +2 -2
- package/src/styles/01-settings/_settings.maps.scss +183 -188
- package/src/styles/01-settings/_settings.masonry-grid.scss +2 -2
- package/src/styles/01-settings/_settings.menu.scss +35 -38
- package/src/styles/01-settings/_settings.messages.scss +71 -77
- package/src/styles/01-settings/_settings.modal.scss +24 -24
- package/src/styles/01-settings/_settings.nav.scss +15 -15
- package/src/styles/01-settings/_settings.navbar.scss +39 -12
- package/src/styles/01-settings/_settings.pagination.scss +21 -21
- package/src/styles/01-settings/_settings.photoviewer.scss +1 -1
- package/src/styles/01-settings/_settings.popover.scss +3 -3
- package/src/styles/01-settings/_settings.position.scss +2 -2
- package/src/styles/01-settings/_settings.progress.scss +15 -18
- package/src/styles/01-settings/_settings.rating.scss +7 -7
- package/src/styles/01-settings/_settings.river.scss +25 -25
- package/src/styles/01-settings/_settings.sectionintro.scss +15 -16
- package/src/styles/01-settings/_settings.select.scss +31 -31
- package/src/styles/01-settings/_settings.side-menu.scss +64 -16
- package/src/styles/01-settings/_settings.skeleton.scss +12 -12
- package/src/styles/01-settings/_settings.spacing.scss +62 -33
- package/src/styles/01-settings/_settings.spinner.scss +10 -10
- package/src/styles/01-settings/_settings.steps.scss +22 -22
- package/src/styles/01-settings/_settings.tabs.scss +25 -25
- package/src/styles/01-settings/_settings.testimonials.scss +17 -19
- package/src/styles/01-settings/_settings.todo.scss +1 -1
- package/src/styles/01-settings/_settings.toggle.scss +26 -26
- package/src/styles/01-settings/_settings.tooltip.scss +15 -15
- package/src/styles/01-settings/_settings.typography.scss +65 -48
- package/src/styles/01-settings/_settings.upload.scss +70 -77
- package/src/styles/01-settings/_settings.z-layers.scss +1 -1
- package/src/styles/02-tools/_index.scss +19 -19
- package/src/styles/02-tools/_tools.animations.scss +4 -4
- package/src/styles/02-tools/_tools.border-radius.scss +4 -5
- package/src/styles/02-tools/_tools.breakpoints.scss +33 -34
- package/src/styles/02-tools/_tools.button.scss +49 -25
- package/src/styles/02-tools/_tools.color-mode.scss +11 -11
- package/src/styles/02-tools/_tools.event.scss +1 -1
- package/src/styles/02-tools/_tools.hidden-visually.scss +1 -1
- package/src/styles/02-tools/_tools.hidden.scss +1 -1
- package/src/styles/02-tools/_tools.map-loop.scss +9 -9
- package/src/styles/02-tools/_tools.media-queries.scss +5 -3
- package/src/styles/02-tools/_tools.object-fit.scss +3 -3
- package/src/styles/02-tools/_tools.placeholder.scss +0 -1
- package/src/styles/02-tools/_tools.rem.scss +1 -1
- package/src/styles/02-tools/_tools.spacing.scss +8 -34
- package/src/styles/02-tools/_tools.to-rgb.scss +3 -3
- package/src/styles/02-tools/_tools.transition.scss +1 -1
- package/src/styles/02-tools/_tools.utility-api.scss +29 -14
- package/src/styles/03-generic/_generic.fonts.scss +0 -1
- package/src/styles/03-generic/_generic.reset.scss +13 -8
- package/src/styles/03-generic/_generic.root.scss +5 -5
- package/src/styles/03-generic/_index.scss +4 -4
- package/src/styles/04-elements/_elements.all.scss +2 -2
- package/src/styles/04-elements/_elements.body.scss +1 -2
- package/src/styles/04-elements/_elements.heading.scss +37 -21
- package/src/styles/04-elements/_elements.links.scss +0 -1
- package/src/styles/04-elements/_index.scss +5 -5
- package/src/styles/05-objects/_index.scss +3 -3
- package/src/styles/05-objects/_objects.container.scss +5 -4
- package/src/styles/05-objects/_objects.grid.scss +12 -12
- package/src/styles/05-objects/_objects.masonry-grid.scss +80 -74
- package/src/styles/06-components/_components.accordion.scss +12 -6
- package/src/styles/06-components/_components.avatar-group.scss +9 -8
- package/src/styles/06-components/_components.avatar.scss +78 -77
- package/src/styles/06-components/_components.badge.scss +48 -48
- package/src/styles/06-components/_components.breadcrumb.scss +57 -58
- package/src/styles/06-components/_components.btn-group.scss +22 -22
- package/src/styles/06-components/_components.button.scss +118 -110
- package/src/styles/06-components/_components.callout.scss +21 -15
- package/src/styles/06-components/_components.card.scss +6 -10
- package/src/styles/06-components/_components.checkbox-group.scss +9 -10
- package/src/styles/06-components/_components.checkbox.scss +10 -17
- package/src/styles/06-components/_components.color-mode-toggle.scss +6 -6
- package/src/styles/06-components/_components.countdown.scss +53 -54
- package/src/styles/06-components/_components.data-table.scss +40 -36
- package/src/styles/06-components/_components.datepicker.scss +95 -73
- package/src/styles/06-components/_components.dropdown.scss +15 -9
- package/src/styles/06-components/_components.edge-panel.scss +87 -46
- package/src/styles/06-components/_components.form-group.scss +5 -4
- package/src/styles/06-components/_components.hero.scss +128 -132
- package/src/styles/06-components/_components.icon.scss +16 -16
- package/src/styles/06-components/_components.image-gallery.scss +9 -7
- package/src/styles/06-components/_components.input.scss +18 -16
- package/src/styles/06-components/_components.list-group.scss +52 -51
- package/src/styles/06-components/_components.list.scss +15 -15
- package/src/styles/06-components/_components.menu.scss +225 -220
- package/src/styles/06-components/_components.messages.scss +45 -32
- package/src/styles/06-components/_components.modal.scss +0 -1
- package/src/styles/06-components/_components.nav.scss +56 -11
- package/src/styles/06-components/_components.navbar.scss +278 -202
- package/src/styles/06-components/_components.pagination.scss +7 -6
- package/src/styles/06-components/_components.photoviewer.scss +121 -116
- package/src/styles/06-components/_components.popover.scss +10 -10
- package/src/styles/06-components/_components.product-review.scss +3 -3
- package/src/styles/06-components/_components.progress.scss +32 -35
- package/src/styles/06-components/_components.rating.scss +9 -8
- package/src/styles/06-components/_components.river.scss +4 -2
- package/src/styles/06-components/_components.sectionintro.scss +19 -26
- package/src/styles/06-components/_components.select.scss +7 -8
- package/src/styles/06-components/_components.side-menu.scss +154 -28
- package/src/styles/06-components/_components.skeleton.scss +0 -1
- package/src/styles/06-components/_components.spinner.scss +2 -4
- package/src/styles/06-components/_components.steps.scss +76 -77
- package/src/styles/06-components/_components.tabs.scss +17 -12
- package/src/styles/06-components/_components.testimonials.scss +49 -52
- package/src/styles/06-components/_components.todo.scss +26 -26
- package/src/styles/06-components/_components.tooltip.scss +114 -115
- package/src/styles/06-components/_components.upload.scss +8 -18
- package/src/styles/06-components/_index.scss +48 -48
- package/src/styles/99-utilities/_index.scss +18 -18
- package/src/styles/99-utilities/_utilities.background.scss +13 -13
- package/src/styles/99-utilities/_utilities.border.scss +30 -30
- package/src/styles/99-utilities/_utilities.clearfix.scss +1 -1
- package/src/styles/99-utilities/_utilities.display.scss +5 -4
- package/src/styles/99-utilities/_utilities.flex.scss +19 -19
- package/src/styles/99-utilities/_utilities.link.scss +52 -35
- package/src/styles/99-utilities/_utilities.object-fit.scss +3 -3
- package/src/styles/99-utilities/_utilities.opacity.scss +6 -6
- package/src/styles/99-utilities/_utilities.overflow.scss +4 -4
- package/src/styles/99-utilities/_utilities.position.scss +8 -8
- package/src/styles/99-utilities/_utilities.shadow.scss +13 -13
- package/src/styles/99-utilities/_utilities.sizes.scss +17 -17
- package/src/styles/99-utilities/_utilities.spacing.scss +72 -37
- package/src/styles/99-utilities/_utilities.text.scss +15 -15
- package/src/styles/99-utilities/_utilities.visibility.scss +8 -8
- package/src/styles/99-utilities/_utilities.visually-hidden.scss +1 -1
- package/src/styles/99-utilities/_utilities.z-index.scss +2 -2
- package/tsconfig.json +74 -0
- package/webpack.config.js +463 -0
- package/NPM_PUBLISHING.md +0 -221
- package/dist/css/atomix.css.map +0 -1
- package/dist/js/194.js.map +0 -1
- package/dist/js/atomix.react.esm.js.map +0 -1
- package/dist/js/atomix.react.umd.js.map +0 -1
- package/dist/js/chunks/esm/202.ff48d27672233280e021.js.map +0 -1
- package/dist/js/chunks/esm/308.f873332126eba90e5c62.js.map +0 -1
- package/dist/js/chunks/esm/54.4db919e5e4e5cc6d7c72.js.map +0 -1
- package/dist/js/chunks/esm/619.afc5a718eff77fa423b5.js.map +0 -1
- package/dist/js/chunks/esm/690.a9e968c7497d61e56cdc.js.map +0 -1
- package/dist/js/chunks/esm/894.f1091a4a8758c26d29e4.js.map +0 -1
- package/dist/js/chunks/esm/897.561a50f7d043d42169da.js.map +0 -1
- package/dist/js/chunks/umd/202.dac7605cc555b6bda542.js.map +0 -1
- package/dist/js/chunks/umd/308.6709979849dcbdb90c9b.js.map +0 -1
- package/dist/js/chunks/umd/54.403470e1f7d0ef4424a7.js.map +0 -1
- package/dist/js/chunks/umd/619.fa05ea98c10270eb64c5.js.map +0 -1
- package/dist/js/chunks/umd/690.aa7054d1c53e5402c2d6.js.map +0 -1
- package/dist/js/chunks/umd/894.3e1eaf0a2aadf4434390.js.map +0 -1
- package/dist/js/chunks/umd/897.554ea37be4453698c167.js.map +0 -1
- package/dist/types/components/Navbar/Nav.d.ts +0 -5
- package/dist/types/components/Navbar/NavItem.d.ts +0 -5
- package/dist/types/components/Navbar/Navbar.d.ts +0 -5
- package/dist/types/components/Navbar/index.d.ts +0 -6
- package/src/components/Navbar/Menu.tsx +0 -122
- package/src/components/Navbar/Nav.tsx +0 -35
- package/src/components/Navbar/NavDropdown.tsx +0 -108
- package/src/components/Navbar/NavItem.tsx +0 -128
- package/src/components/Navbar/Navbar.tsx +0 -124
- package/src/components/Navbar/index.ts +0 -6
|
@@ -14,21 +14,21 @@ export function calculateBestPosition(
|
|
|
14
14
|
preferredPosition: string = 'top'
|
|
15
15
|
): string {
|
|
16
16
|
if (!triggerElement || !tooltipElement) return preferredPosition;
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
// Get element dimensions and positions
|
|
19
19
|
const triggerRect = triggerElement.getBoundingClientRect();
|
|
20
20
|
const tooltipRect = tooltipElement.getBoundingClientRect();
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
// Get viewport dimensions
|
|
23
23
|
const viewportHeight = window.innerHeight;
|
|
24
24
|
const viewportWidth = window.innerWidth;
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
// Calculate available space in each direction
|
|
27
27
|
const spaceAbove = triggerRect.top;
|
|
28
28
|
const spaceBelow = viewportHeight - triggerRect.bottom;
|
|
29
29
|
const spaceLeft = triggerRect.left;
|
|
30
30
|
const spaceRight = viewportWidth - triggerRect.right;
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
// Check if preferred position has enough space
|
|
33
33
|
switch (preferredPosition) {
|
|
34
34
|
case 'top':
|
|
@@ -46,18 +46,18 @@ export function calculateBestPosition(
|
|
|
46
46
|
default:
|
|
47
47
|
break;
|
|
48
48
|
}
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
// Find the best alternative position
|
|
51
51
|
const spaces = [
|
|
52
52
|
{ position: 'top', space: spaceAbove },
|
|
53
53
|
{ position: 'bottom', space: spaceBelow },
|
|
54
54
|
{ position: 'left', space: spaceLeft },
|
|
55
|
-
{ position: 'right', space: spaceRight }
|
|
55
|
+
{ position: 'right', space: spaceRight },
|
|
56
56
|
];
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
// Sort by available space (descending)
|
|
59
59
|
spaces.sort((a, b) => b.space - a.space);
|
|
60
|
-
|
|
60
|
+
|
|
61
61
|
// Return the position with the most space
|
|
62
62
|
return spaces[0].position;
|
|
63
63
|
}
|
|
@@ -76,30 +76,30 @@ export function positionTooltip(
|
|
|
76
76
|
offset: number = 8
|
|
77
77
|
): void {
|
|
78
78
|
if (!tooltipElement || !triggerElement) return;
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
// Get element dimensions
|
|
81
81
|
const triggerRect = triggerElement.getBoundingClientRect();
|
|
82
82
|
const tooltipRect = tooltipElement.getBoundingClientRect();
|
|
83
|
-
|
|
83
|
+
|
|
84
84
|
// Calculate position based on the trigger and tooltip dimensions
|
|
85
85
|
let top = 0;
|
|
86
86
|
let left = 0;
|
|
87
|
-
|
|
87
|
+
|
|
88
88
|
switch (position) {
|
|
89
89
|
case 'top':
|
|
90
90
|
top = triggerRect.top - tooltipRect.height - offset;
|
|
91
|
-
left = triggerRect.left +
|
|
91
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
|
92
92
|
break;
|
|
93
93
|
case 'bottom':
|
|
94
94
|
top = triggerRect.bottom + offset;
|
|
95
|
-
left = triggerRect.left +
|
|
95
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
|
96
96
|
break;
|
|
97
97
|
case 'left':
|
|
98
|
-
top = triggerRect.top +
|
|
98
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
|
|
99
99
|
left = triggerRect.left - tooltipRect.width - offset;
|
|
100
100
|
break;
|
|
101
101
|
case 'right':
|
|
102
|
-
top = triggerRect.top +
|
|
102
|
+
top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
|
|
103
103
|
left = triggerRect.right + offset;
|
|
104
104
|
break;
|
|
105
105
|
case 'top-left':
|
|
@@ -121,9 +121,9 @@ export function positionTooltip(
|
|
|
121
121
|
default:
|
|
122
122
|
// Default to top
|
|
123
123
|
top = triggerRect.top - tooltipRect.height - offset;
|
|
124
|
-
left = triggerRect.left +
|
|
124
|
+
left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
|
125
125
|
}
|
|
126
|
-
|
|
126
|
+
|
|
127
127
|
// Apply position
|
|
128
128
|
tooltipElement.style.top = `${top}px`;
|
|
129
129
|
tooltipElement.style.left = `${left}px`;
|
|
@@ -139,12 +139,12 @@ export function initializeTooltipsWithCustomBehavior(
|
|
|
139
139
|
options = {}
|
|
140
140
|
): Tooltip[] {
|
|
141
141
|
const tooltips = Tooltip.initializeAll(selector, options);
|
|
142
|
-
|
|
142
|
+
|
|
143
143
|
// Apply smart positioning to each tooltip
|
|
144
144
|
tooltips.forEach((tooltip: Tooltip) => {
|
|
145
145
|
const triggerElement = tooltip.getTriggerElement();
|
|
146
146
|
const tooltipElement = tooltip.getElement();
|
|
147
|
-
|
|
147
|
+
|
|
148
148
|
if (triggerElement && tooltipElement) {
|
|
149
149
|
// Update position on window resize
|
|
150
150
|
window.addEventListener('resize', () => {
|
|
@@ -154,12 +154,12 @@ export function initializeTooltipsWithCustomBehavior(
|
|
|
154
154
|
tooltipElement,
|
|
155
155
|
tooltip.getPosition()
|
|
156
156
|
);
|
|
157
|
-
|
|
157
|
+
|
|
158
158
|
tooltip.setPosition(bestPosition);
|
|
159
159
|
}
|
|
160
160
|
});
|
|
161
161
|
}
|
|
162
162
|
});
|
|
163
|
-
|
|
163
|
+
|
|
164
164
|
return tooltips;
|
|
165
|
-
}
|
|
165
|
+
}
|
|
@@ -30,7 +30,7 @@ export default {
|
|
|
30
30
|
},
|
|
31
31
|
} as Meta<typeof Upload>;
|
|
32
32
|
|
|
33
|
-
const Template: StoryFn<typeof Upload> =
|
|
33
|
+
const Template: StoryFn<typeof Upload> = args => (
|
|
34
34
|
<div style={{ padding: '30px', maxWidth: '600px' }}>
|
|
35
35
|
<Upload {...args} />
|
|
36
36
|
</div>
|
|
@@ -54,66 +54,59 @@ Disabled.args = {
|
|
|
54
54
|
|
|
55
55
|
// Manual state controls
|
|
56
56
|
const WithStateControls: React.FC = () => {
|
|
57
|
-
const [currentState, setCurrentState] = useState<'default' | 'uploading' | 'success' | 'error'>(
|
|
57
|
+
const [currentState, setCurrentState] = useState<'default' | 'uploading' | 'success' | 'error'>(
|
|
58
|
+
'default'
|
|
59
|
+
);
|
|
58
60
|
const [progress, setProgress] = useState(75);
|
|
59
|
-
|
|
61
|
+
|
|
60
62
|
const resetState = () => {
|
|
61
63
|
setCurrentState('default');
|
|
62
64
|
};
|
|
63
|
-
|
|
65
|
+
|
|
64
66
|
const simulateUpload = () => {
|
|
65
67
|
setCurrentState('uploading');
|
|
66
68
|
setProgress(0);
|
|
67
|
-
|
|
69
|
+
|
|
68
70
|
let currentProgress = 0;
|
|
69
71
|
const interval = setInterval(() => {
|
|
70
72
|
currentProgress += 5;
|
|
71
73
|
setProgress(currentProgress);
|
|
72
|
-
|
|
74
|
+
|
|
73
75
|
if (currentProgress >= 100) {
|
|
74
76
|
clearInterval(interval);
|
|
75
77
|
setCurrentState('success');
|
|
76
78
|
}
|
|
77
79
|
}, 500);
|
|
78
80
|
};
|
|
79
|
-
|
|
81
|
+
|
|
80
82
|
const showError = () => {
|
|
81
83
|
setCurrentState('error');
|
|
82
84
|
};
|
|
83
|
-
|
|
85
|
+
|
|
84
86
|
return (
|
|
85
87
|
<div>
|
|
86
88
|
<div style={{ marginBottom: '20px' }}>
|
|
87
|
-
<button
|
|
88
|
-
style={{ marginRight: '10px', padding: '8px 16px' }}
|
|
89
|
-
onClick={resetState}
|
|
90
|
-
>
|
|
89
|
+
<button style={{ marginRight: '10px', padding: '8px 16px' }} onClick={resetState}>
|
|
91
90
|
Reset
|
|
92
91
|
</button>
|
|
93
|
-
<button
|
|
94
|
-
style={{ marginRight: '10px', padding: '8px 16px' }}
|
|
95
|
-
onClick={simulateUpload}
|
|
96
|
-
>
|
|
92
|
+
<button style={{ marginRight: '10px', padding: '8px 16px' }} onClick={simulateUpload}>
|
|
97
93
|
Simulate Upload
|
|
98
94
|
</button>
|
|
99
|
-
<button
|
|
100
|
-
style={{ padding: '8px 16px' }}
|
|
101
|
-
onClick={showError}
|
|
102
|
-
>
|
|
95
|
+
<button style={{ padding: '8px 16px' }} onClick={showError}>
|
|
103
96
|
Show Error
|
|
104
97
|
</button>
|
|
105
98
|
</div>
|
|
106
|
-
|
|
99
|
+
|
|
107
100
|
<div style={{ padding: '30px', maxWidth: '600px' }}>
|
|
108
101
|
{currentState === 'default' && (
|
|
109
102
|
<Upload
|
|
110
|
-
onFileSelect={
|
|
103
|
+
onFileSelect={files => {
|
|
111
104
|
console.log('Files selected:', files);
|
|
112
105
|
simulateUpload();
|
|
113
106
|
}}
|
|
114
107
|
/>
|
|
115
108
|
)}
|
|
116
|
-
|
|
109
|
+
|
|
117
110
|
{currentState === 'uploading' && (
|
|
118
111
|
<div className="c-upload">
|
|
119
112
|
<div className="c-upload__inner">
|
|
@@ -125,12 +118,17 @@ const WithStateControls: React.FC = () => {
|
|
|
125
118
|
<button className="c-upload__btn c-btn c-btn--primary">Choose File</button>
|
|
126
119
|
<p className="c-upload__helper-text">Maximum size: 5MB</p>
|
|
127
120
|
</div>
|
|
128
|
-
<div
|
|
121
|
+
<div
|
|
122
|
+
className="c-upload__loader"
|
|
123
|
+
style={{ '--upload-loader-percentage': progress } as React.CSSProperties}
|
|
124
|
+
>
|
|
129
125
|
<div className="c-upload__loader-status">
|
|
130
126
|
<h5 className="c-upload__loader-title">File name.pdf</h5>
|
|
131
127
|
<div className="c-upload__loader-progress">
|
|
132
128
|
<div className="c-upload__loader-par">{progress}%</div>
|
|
133
|
-
<div className="c-upload__loader-time">
|
|
129
|
+
<div className="c-upload__loader-time">
|
|
130
|
+
{Math.ceil((100 - progress) / 5)} seconds left
|
|
131
|
+
</div>
|
|
134
132
|
</div>
|
|
135
133
|
</div>
|
|
136
134
|
|
|
@@ -148,7 +146,7 @@ const WithStateControls: React.FC = () => {
|
|
|
148
146
|
</div>
|
|
149
147
|
</div>
|
|
150
148
|
)}
|
|
151
|
-
|
|
149
|
+
|
|
152
150
|
{currentState === 'success' && (
|
|
153
151
|
<div className="c-upload c-upload--success">
|
|
154
152
|
<div className="c-upload__inner">
|
|
@@ -163,9 +161,7 @@ const WithStateControls: React.FC = () => {
|
|
|
163
161
|
<div className="c-upload__loader">
|
|
164
162
|
<div className="c-upload__loader-status">
|
|
165
163
|
<h5 className="c-upload__loader-title">File name.pdf</h5>
|
|
166
|
-
<div className="c-upload__loader-progress">
|
|
167
|
-
Upload successful
|
|
168
|
-
</div>
|
|
164
|
+
<div className="c-upload__loader-progress">Upload successful</div>
|
|
169
165
|
</div>
|
|
170
166
|
|
|
171
167
|
<div className="c-upload__loader-control">
|
|
@@ -176,7 +172,7 @@ const WithStateControls: React.FC = () => {
|
|
|
176
172
|
</div>
|
|
177
173
|
</div>
|
|
178
174
|
)}
|
|
179
|
-
|
|
175
|
+
|
|
180
176
|
{currentState === 'error' && (
|
|
181
177
|
<div className="c-upload c-upload--error">
|
|
182
178
|
<div className="c-upload__inner">
|
|
@@ -191,9 +187,7 @@ const WithStateControls: React.FC = () => {
|
|
|
191
187
|
<div className="c-upload__loader">
|
|
192
188
|
<div className="c-upload__loader-status">
|
|
193
189
|
<h5 className="c-upload__loader-title">File name.pdf</h5>
|
|
194
|
-
<div className="c-upload__loader-progress">
|
|
195
|
-
Error message
|
|
196
|
-
</div>
|
|
190
|
+
<div className="c-upload__loader-progress">Error message</div>
|
|
197
191
|
</div>
|
|
198
192
|
|
|
199
193
|
<div className="c-upload__loader-control">
|
|
@@ -224,4 +218,4 @@ MultipleFiles.args = {
|
|
|
224
218
|
...Default.args,
|
|
225
219
|
multiple: true,
|
|
226
220
|
buttonText: 'Choose Files',
|
|
227
|
-
};
|
|
221
|
+
};
|
|
@@ -6,67 +6,67 @@ export interface UploadProps {
|
|
|
6
6
|
* Whether the upload component is disabled
|
|
7
7
|
*/
|
|
8
8
|
disabled?: boolean;
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
/**
|
|
11
11
|
* Maximum file size in MB
|
|
12
12
|
*/
|
|
13
13
|
maxSizeInMB?: number;
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
/**
|
|
16
16
|
* Accepted file types
|
|
17
17
|
*/
|
|
18
18
|
acceptedFileTypes?: string[];
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
/**
|
|
21
21
|
* Whether multiple files can be selected
|
|
22
22
|
*/
|
|
23
23
|
multiple?: boolean;
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
/**
|
|
26
26
|
* Text for the drag and drop section
|
|
27
27
|
*/
|
|
28
28
|
title?: string;
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
/**
|
|
31
31
|
* Text describing supported file types
|
|
32
32
|
*/
|
|
33
33
|
supportedFilesText?: string;
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
/**
|
|
36
36
|
* Text for the upload button
|
|
37
37
|
*/
|
|
38
38
|
buttonText?: string;
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
/**
|
|
41
41
|
* Helper text displayed below the button
|
|
42
42
|
*/
|
|
43
43
|
helperText?: string;
|
|
44
|
-
|
|
44
|
+
|
|
45
45
|
/**
|
|
46
46
|
* Icon component or class name
|
|
47
47
|
*/
|
|
48
48
|
icon?: React.ReactNode;
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
/**
|
|
51
51
|
* Called when files are selected
|
|
52
52
|
*/
|
|
53
53
|
onFileSelect?: (files: File[]) => void;
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
/**
|
|
56
56
|
* Called during file upload with progress
|
|
57
57
|
*/
|
|
58
58
|
onFileUpload?: (file: File, progress: number) => void;
|
|
59
|
-
|
|
59
|
+
|
|
60
60
|
/**
|
|
61
61
|
* Called when file upload is complete
|
|
62
62
|
*/
|
|
63
63
|
onFileUploadComplete?: (file: File) => void;
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
/**
|
|
66
66
|
* Called on file upload errors
|
|
67
67
|
*/
|
|
68
68
|
onFileUploadError?: (file: File, error: string) => void;
|
|
69
|
-
|
|
69
|
+
|
|
70
70
|
/**
|
|
71
71
|
* Additional CSS class
|
|
72
72
|
*/
|
|
@@ -84,7 +84,13 @@ type UploadStatus = 'idle' | 'loading' | 'success' | 'error';
|
|
|
84
84
|
export const Upload: React.FC<UploadProps> = ({
|
|
85
85
|
disabled = false,
|
|
86
86
|
maxSizeInMB = 5,
|
|
87
|
-
acceptedFileTypes = [
|
|
87
|
+
acceptedFileTypes = [
|
|
88
|
+
'application/pdf',
|
|
89
|
+
'application/vnd.ms-excel',
|
|
90
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
91
|
+
'image/jpeg',
|
|
92
|
+
'image/png',
|
|
93
|
+
],
|
|
88
94
|
multiple = false,
|
|
89
95
|
title = 'Drag and Drop files here',
|
|
90
96
|
supportedFilesText = 'Files supported: PDF, XSLS, JPEG, PNG, Scanner',
|
|
@@ -100,7 +106,7 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
100
106
|
const uploadRef = useRef<HTMLDivElement>(null);
|
|
101
107
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
102
108
|
const uploadInstance = useRef<any>(null);
|
|
103
|
-
|
|
109
|
+
|
|
104
110
|
const [status, setStatus] = useState<UploadStatus>('idle');
|
|
105
111
|
const [isDragging, setIsDragging] = useState(false);
|
|
106
112
|
const [currentFile, setCurrentFile] = useState<File | null>(null);
|
|
@@ -109,7 +115,7 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
109
115
|
const [errorMessage, setErrorMessage] = useState<string | null>(null);
|
|
110
116
|
const [successMessage, setSuccessMessage] = useState<string | null>(null);
|
|
111
117
|
const dragCounter = useRef(0);
|
|
112
|
-
|
|
118
|
+
|
|
113
119
|
useEffect(() => {
|
|
114
120
|
// Only run on client-side
|
|
115
121
|
if (typeof window === 'undefined' || !uploadRef.current) return undefined;
|
|
@@ -137,115 +143,124 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
137
143
|
setStatus('error');
|
|
138
144
|
setErrorMessage(error);
|
|
139
145
|
if (onFileUploadError) onFileUploadError(file, error);
|
|
140
|
-
}
|
|
146
|
+
},
|
|
141
147
|
});
|
|
142
148
|
}
|
|
143
149
|
});
|
|
144
|
-
|
|
150
|
+
|
|
145
151
|
// Cleanup on unmount
|
|
146
152
|
return () => {
|
|
147
153
|
if (uploadInstance.current) {
|
|
148
154
|
uploadInstance.current.destroy();
|
|
149
155
|
}
|
|
150
156
|
};
|
|
151
|
-
}, [
|
|
152
|
-
|
|
157
|
+
}, [
|
|
158
|
+
disabled,
|
|
159
|
+
maxSizeInMB,
|
|
160
|
+
acceptedFileTypes,
|
|
161
|
+
multiple,
|
|
162
|
+
onFileSelect,
|
|
163
|
+
onFileUpload,
|
|
164
|
+
onFileUploadComplete,
|
|
165
|
+
onFileUploadError,
|
|
166
|
+
]);
|
|
167
|
+
|
|
153
168
|
// Handle file input change
|
|
154
169
|
const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
155
170
|
if (!e.target.files?.length) return;
|
|
156
|
-
|
|
171
|
+
|
|
157
172
|
const files = Array.from(e.target.files);
|
|
158
173
|
handleFiles(files);
|
|
159
174
|
};
|
|
160
|
-
|
|
175
|
+
|
|
161
176
|
// Handle button click
|
|
162
177
|
const handleButtonClick = () => {
|
|
163
178
|
if (inputRef.current && !disabled) {
|
|
164
179
|
inputRef.current.click();
|
|
165
180
|
}
|
|
166
181
|
};
|
|
167
|
-
|
|
182
|
+
|
|
168
183
|
// Handle drag enter
|
|
169
184
|
const handleDragEnter = (e: React.DragEvent<HTMLDivElement>) => {
|
|
170
185
|
e.preventDefault();
|
|
171
186
|
e.stopPropagation();
|
|
172
187
|
if (disabled) return;
|
|
173
|
-
|
|
188
|
+
|
|
174
189
|
dragCounter.current++;
|
|
175
190
|
if (dragCounter.current === 1) {
|
|
176
191
|
setIsDragging(true);
|
|
177
192
|
}
|
|
178
193
|
};
|
|
179
|
-
|
|
194
|
+
|
|
180
195
|
// Handle drag leave
|
|
181
196
|
const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {
|
|
182
197
|
e.preventDefault();
|
|
183
198
|
e.stopPropagation();
|
|
184
199
|
if (disabled) return;
|
|
185
|
-
|
|
200
|
+
|
|
186
201
|
dragCounter.current--;
|
|
187
202
|
if (dragCounter.current === 0) {
|
|
188
203
|
setIsDragging(false);
|
|
189
204
|
}
|
|
190
205
|
};
|
|
191
|
-
|
|
206
|
+
|
|
192
207
|
// Handle drag over
|
|
193
208
|
const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {
|
|
194
209
|
e.preventDefault();
|
|
195
210
|
e.stopPropagation();
|
|
196
211
|
if (disabled) return;
|
|
197
212
|
};
|
|
198
|
-
|
|
213
|
+
|
|
199
214
|
// Handle drop
|
|
200
215
|
const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {
|
|
201
216
|
e.preventDefault();
|
|
202
217
|
e.stopPropagation();
|
|
203
218
|
if (disabled) return;
|
|
204
|
-
|
|
219
|
+
|
|
205
220
|
dragCounter.current = 0;
|
|
206
221
|
setIsDragging(false);
|
|
207
|
-
|
|
222
|
+
|
|
208
223
|
if (!e.dataTransfer.files?.length) return;
|
|
209
|
-
|
|
224
|
+
|
|
210
225
|
const files = Array.from(e.dataTransfer.files);
|
|
211
226
|
handleFiles(files);
|
|
212
227
|
};
|
|
213
|
-
|
|
228
|
+
|
|
214
229
|
// Process files
|
|
215
230
|
const handleFiles = (files: File[]) => {
|
|
216
231
|
if (!files.length) return;
|
|
217
|
-
|
|
232
|
+
|
|
218
233
|
// If multiple is not allowed, take only the first file
|
|
219
234
|
const filesToProcess = multiple ? files : [files[0]];
|
|
220
|
-
|
|
235
|
+
|
|
221
236
|
// Validate files
|
|
222
237
|
const validFiles = filesToProcess.filter(file => validateFile(file));
|
|
223
|
-
|
|
238
|
+
|
|
224
239
|
// Notify about file selection
|
|
225
240
|
if (validFiles.length && onFileSelect) {
|
|
226
241
|
onFileSelect(validFiles as File[]);
|
|
227
242
|
}
|
|
228
|
-
|
|
243
|
+
|
|
229
244
|
// Process the first valid file
|
|
230
245
|
if (validFiles.length) {
|
|
231
|
-
|
|
246
|
+
setCurrentFile(validFiles[0] || null);
|
|
232
247
|
if (validFiles[0]) {
|
|
233
248
|
simulateUpload(validFiles[0]);
|
|
234
249
|
}
|
|
235
250
|
}
|
|
236
251
|
};
|
|
237
|
-
|
|
252
|
+
|
|
238
253
|
// Validate file
|
|
239
254
|
const validateFile = (file: File): boolean => {
|
|
240
255
|
const maxSizeInBytes = maxSizeInMB * 1024 * 1024;
|
|
241
|
-
|
|
256
|
+
|
|
242
257
|
// Check file size
|
|
243
258
|
if (file.size > maxSizeInBytes) {
|
|
244
259
|
setStatus('error');
|
|
245
260
|
setErrorMessage(`File too large. Maximum size is ${maxSizeInMB}MB.`);
|
|
246
261
|
return false;
|
|
247
262
|
}
|
|
248
|
-
|
|
263
|
+
|
|
249
264
|
// Check file type if acceptedFileTypes is provided
|
|
250
265
|
if (acceptedFileTypes?.length) {
|
|
251
266
|
const isAcceptedType = acceptedFileTypes.some(type => {
|
|
@@ -256,31 +271,31 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
256
271
|
}
|
|
257
272
|
return file.type === type;
|
|
258
273
|
});
|
|
259
|
-
|
|
274
|
+
|
|
260
275
|
if (!isAcceptedType) {
|
|
261
276
|
setStatus('error');
|
|
262
277
|
setErrorMessage('File type not supported.');
|
|
263
278
|
return false;
|
|
264
279
|
}
|
|
265
280
|
}
|
|
266
|
-
|
|
281
|
+
|
|
267
282
|
return true;
|
|
268
283
|
};
|
|
269
|
-
|
|
284
|
+
|
|
270
285
|
// Simulate upload (in a real component, this would be an actual upload)
|
|
271
286
|
const simulateUpload = (file: File) => {
|
|
272
287
|
setStatus('loading');
|
|
273
288
|
setUploadProgress(0);
|
|
274
|
-
|
|
289
|
+
|
|
275
290
|
// Simulate progress updates
|
|
276
291
|
let progress = 0;
|
|
277
292
|
const interval = setInterval(() => {
|
|
278
293
|
progress += 5;
|
|
279
|
-
|
|
294
|
+
|
|
280
295
|
if (progress < 100) {
|
|
281
296
|
setUploadProgress(progress);
|
|
282
297
|
setTimeLeft(`${Math.ceil((100 - progress) / 5)} seconds left`);
|
|
283
|
-
|
|
298
|
+
|
|
284
299
|
if (onFileUpload) {
|
|
285
300
|
onFileUpload(file, progress);
|
|
286
301
|
}
|
|
@@ -288,14 +303,14 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
288
303
|
clearInterval(interval);
|
|
289
304
|
setStatus('success');
|
|
290
305
|
setSuccessMessage('Upload successful');
|
|
291
|
-
|
|
306
|
+
|
|
292
307
|
if (onFileUploadComplete) {
|
|
293
308
|
onFileUploadComplete(file);
|
|
294
309
|
}
|
|
295
310
|
}
|
|
296
311
|
}, 500);
|
|
297
312
|
};
|
|
298
|
-
|
|
313
|
+
|
|
299
314
|
// Handle close button click
|
|
300
315
|
const handleClose = () => {
|
|
301
316
|
setStatus('idle');
|
|
@@ -304,13 +319,13 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
304
319
|
setTimeLeft(null);
|
|
305
320
|
setErrorMessage(null);
|
|
306
321
|
setSuccessMessage(null);
|
|
307
|
-
|
|
322
|
+
|
|
308
323
|
// Reset input
|
|
309
324
|
if (inputRef.current) {
|
|
310
325
|
inputRef.current.value = '';
|
|
311
326
|
}
|
|
312
327
|
};
|
|
313
|
-
|
|
328
|
+
|
|
314
329
|
// Determine CSS classes
|
|
315
330
|
const uploadClasses = [
|
|
316
331
|
'c-upload',
|
|
@@ -319,17 +334,22 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
319
334
|
status === 'success' ? UPLOAD.CLASSES.SUCCESS : '',
|
|
320
335
|
status === 'error' ? UPLOAD.CLASSES.ERROR : '',
|
|
321
336
|
isDragging ? UPLOAD.CLASSES.DRAGGING : '',
|
|
322
|
-
className
|
|
323
|
-
]
|
|
324
|
-
|
|
337
|
+
className,
|
|
338
|
+
]
|
|
339
|
+
.filter(Boolean)
|
|
340
|
+
.join(' ');
|
|
341
|
+
|
|
325
342
|
// Update CSS variable for progress
|
|
326
|
-
const style =
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
343
|
+
const style =
|
|
344
|
+
uploadProgress > 0
|
|
345
|
+
? ({
|
|
346
|
+
[UPLOAD.ATTRIBUTES.PERCENTAGE]: uploadProgress,
|
|
347
|
+
} as React.CSSProperties)
|
|
348
|
+
: {};
|
|
349
|
+
|
|
330
350
|
return (
|
|
331
|
-
<div
|
|
332
|
-
className={uploadClasses}
|
|
351
|
+
<div
|
|
352
|
+
className={uploadClasses}
|
|
333
353
|
ref={uploadRef}
|
|
334
354
|
style={style}
|
|
335
355
|
onDragEnter={handleDragEnter}
|
|
@@ -338,13 +358,11 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
338
358
|
onDrop={handleDrop}
|
|
339
359
|
>
|
|
340
360
|
<div className="c-upload__inner">
|
|
341
|
-
<div className="c-upload__icon">
|
|
342
|
-
{icon}
|
|
343
|
-
</div>
|
|
361
|
+
<div className="c-upload__icon">{icon}</div>
|
|
344
362
|
<h3 className="c-upload__title">{title}</h3>
|
|
345
363
|
<p className="c-upload__text">{supportedFilesText}</p>
|
|
346
|
-
<button
|
|
347
|
-
className="c-upload__btn c-btn c-btn--primary"
|
|
364
|
+
<button
|
|
365
|
+
className="c-upload__btn c-btn c-btn--primary"
|
|
348
366
|
disabled={disabled}
|
|
349
367
|
onClick={handleButtonClick}
|
|
350
368
|
>
|
|
@@ -360,7 +378,7 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
360
378
|
onChange={handleFileChange}
|
|
361
379
|
/>
|
|
362
380
|
</div>
|
|
363
|
-
|
|
381
|
+
|
|
364
382
|
{(status === 'loading' || status === 'success' || status === 'error') && currentFile && (
|
|
365
383
|
<div className="c-upload__loader">
|
|
366
384
|
<div className="c-upload__loader-status">
|
|
@@ -376,7 +394,7 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
376
394
|
{status === 'error' && errorMessage}
|
|
377
395
|
</div>
|
|
378
396
|
</div>
|
|
379
|
-
|
|
397
|
+
|
|
380
398
|
<div className="c-upload__loader-control">
|
|
381
399
|
{status === 'loading' && uploadProgress < 100 && (
|
|
382
400
|
<div className="c-upload__loader-bar">
|
|
@@ -386,10 +404,7 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
386
404
|
</svg>
|
|
387
405
|
</div>
|
|
388
406
|
)}
|
|
389
|
-
<button
|
|
390
|
-
className="c-upload__loader-close c-btn c-btn--icon"
|
|
391
|
-
onClick={handleClose}
|
|
392
|
-
>
|
|
407
|
+
<button className="c-upload__loader-close c-btn c-btn--icon" onClick={handleClose}>
|
|
393
408
|
{status === 'success' ? (
|
|
394
409
|
<i className="icon-lux-check-circle-fill"></i>
|
|
395
410
|
) : (
|
|
@@ -404,4 +419,4 @@ export const Upload: React.FC<UploadProps> = ({
|
|
|
404
419
|
};
|
|
405
420
|
|
|
406
421
|
Upload.displayName = 'Upload';
|
|
407
|
-
export default Upload;
|
|
422
|
+
export default Upload;
|