@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
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { SIDE_MENU } from '../../../lib/constants/components';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Default options for SideMenu component
|
|
5
|
+
*/
|
|
6
|
+
const DEFAULTS = {
|
|
7
|
+
collapsible: true,
|
|
8
|
+
open: false,
|
|
9
|
+
title: '',
|
|
10
|
+
toggleIcon: '▶',
|
|
11
|
+
keyboard: true,
|
|
12
|
+
autoOpen: true, // Auto-open on desktop
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* SideMenu component class for vanilla JavaScript implementation
|
|
17
|
+
* Provides collapsible side navigation functionality with responsive behavior
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```js
|
|
21
|
+
* // Initialize a side menu
|
|
22
|
+
* const sideMenu = new SideMenu('.c-side-menu', {
|
|
23
|
+
* collapsible: true,
|
|
24
|
+
* autoOpen: true
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // Control programmatically
|
|
28
|
+
* sideMenu.open();
|
|
29
|
+
* sideMenu.close();
|
|
30
|
+
* sideMenu.toggle();
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export default class SideMenu {
|
|
34
|
+
private element: HTMLElement;
|
|
35
|
+
private options: any;
|
|
36
|
+
private toggler: HTMLElement | null = null;
|
|
37
|
+
private wrapper: HTMLElement | null = null;
|
|
38
|
+
private inner: HTMLElement | null = null;
|
|
39
|
+
private togglerIcon: HTMLElement | null = null;
|
|
40
|
+
private isOpen: boolean = false;
|
|
41
|
+
private resizeHandler: () => void;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Create a new SideMenu instance
|
|
45
|
+
* @param element - The side menu element or selector
|
|
46
|
+
* @param options - Configuration options
|
|
47
|
+
*/
|
|
48
|
+
constructor(element: string | HTMLElement, options: any = {}) {
|
|
49
|
+
this.element =
|
|
50
|
+
typeof element === 'string' ? (document.querySelector(element) as HTMLElement) : element;
|
|
51
|
+
|
|
52
|
+
if (!this.element) {
|
|
53
|
+
throw new Error('SideMenu element not found');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
this.options = { ...DEFAULTS, ...options };
|
|
57
|
+
this.resizeHandler = this._handleResize.bind(this);
|
|
58
|
+
this._init();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Initialize the side menu component
|
|
63
|
+
* @private
|
|
64
|
+
*/
|
|
65
|
+
private _init(): void {
|
|
66
|
+
this._findElements();
|
|
67
|
+
this._bindEvents();
|
|
68
|
+
this._setInitialState();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Find required DOM elements
|
|
73
|
+
* @private
|
|
74
|
+
*/
|
|
75
|
+
private _findElements(): void {
|
|
76
|
+
this.toggler = this.element.querySelector(SIDE_MENU.SELECTORS.TOGGLER);
|
|
77
|
+
this.wrapper = this.element.querySelector(SIDE_MENU.SELECTORS.WRAPPER);
|
|
78
|
+
this.inner = this.element.querySelector(SIDE_MENU.SELECTORS.INNER);
|
|
79
|
+
this.togglerIcon = this.element.querySelector(SIDE_MENU.SELECTORS.TOGGLER_ICON);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Bind event listeners
|
|
84
|
+
* @private
|
|
85
|
+
*/
|
|
86
|
+
private _bindEvents(): void {
|
|
87
|
+
if (this.toggler) {
|
|
88
|
+
this.toggler.addEventListener('click', this._handleToggleClick.bind(this));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (this.options.keyboard && this.toggler) {
|
|
92
|
+
this.toggler.addEventListener('keydown', this._handleKeydown.bind(this));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Handle window resize for responsive behavior
|
|
96
|
+
window.addEventListener('resize', this.resizeHandler);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Set initial component state
|
|
101
|
+
* @private
|
|
102
|
+
*/
|
|
103
|
+
private _setInitialState(): void {
|
|
104
|
+
this.isOpen = this.options.open || false;
|
|
105
|
+
this._handleResize(); // Set initial responsive state
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Handle toggle button click
|
|
110
|
+
* @private
|
|
111
|
+
*/
|
|
112
|
+
private _handleToggleClick(event: Event): void {
|
|
113
|
+
event.preventDefault();
|
|
114
|
+
this.toggle();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Handle keyboard events
|
|
119
|
+
* @private
|
|
120
|
+
*/
|
|
121
|
+
private _handleKeydown(event: KeyboardEvent): void {
|
|
122
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
123
|
+
event.preventDefault();
|
|
124
|
+
this.toggle();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Handle window resize for responsive behavior
|
|
130
|
+
* @private
|
|
131
|
+
*/
|
|
132
|
+
private _handleResize(): void {
|
|
133
|
+
const isMobile = window.innerWidth < 768; // MD breakpoint
|
|
134
|
+
|
|
135
|
+
if (!this.options.collapsible) {
|
|
136
|
+
// Always open if not collapsible
|
|
137
|
+
this._updateOpenState(true, false);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (!isMobile && this.options.autoOpen) {
|
|
142
|
+
// Auto-open on desktop
|
|
143
|
+
this._updateOpenState(true, false);
|
|
144
|
+
|
|
145
|
+
// Reset wrapper height on desktop
|
|
146
|
+
if (this.wrapper) {
|
|
147
|
+
this.wrapper.style.height = 'auto';
|
|
148
|
+
}
|
|
149
|
+
} else if (isMobile) {
|
|
150
|
+
// Set proper height for mobile animation
|
|
151
|
+
this._updateWrapperHeight();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Update wrapper height for mobile animation
|
|
157
|
+
* @private
|
|
158
|
+
*/
|
|
159
|
+
private _updateWrapperHeight(): void {
|
|
160
|
+
if (!this.wrapper || !this.inner) return;
|
|
161
|
+
|
|
162
|
+
const isMobile = window.innerWidth < 768;
|
|
163
|
+
|
|
164
|
+
if (isMobile && this.options.collapsible) {
|
|
165
|
+
if (this.isOpen) {
|
|
166
|
+
this.wrapper.style.height = `${this.inner.scrollHeight}px`;
|
|
167
|
+
} else {
|
|
168
|
+
this.wrapper.style.height = '0px';
|
|
169
|
+
}
|
|
170
|
+
} else {
|
|
171
|
+
this.wrapper.style.height = 'auto';
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Update the open state and DOM
|
|
177
|
+
* @private
|
|
178
|
+
*/
|
|
179
|
+
private _updateOpenState(newState: boolean, animate: boolean = true): void {
|
|
180
|
+
this.isOpen = newState;
|
|
181
|
+
|
|
182
|
+
// Update toggler aria-expanded
|
|
183
|
+
if (this.toggler) {
|
|
184
|
+
this.toggler.setAttribute('aria-expanded', this.isOpen.toString());
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Update wrapper aria-hidden
|
|
188
|
+
if (this.wrapper) {
|
|
189
|
+
this.wrapper.setAttribute('aria-hidden', (!this.isOpen).toString());
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Update CSS classes
|
|
193
|
+
if (this.isOpen) {
|
|
194
|
+
this.element.classList.add(SIDE_MENU.CLASSES.IS_OPEN);
|
|
195
|
+
} else {
|
|
196
|
+
this.element.classList.remove(SIDE_MENU.CLASSES.IS_OPEN);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Update wrapper height for mobile
|
|
200
|
+
if (animate) {
|
|
201
|
+
this._updateWrapperHeight();
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Dispatch custom event
|
|
205
|
+
const eventType = this.isOpen ? 'sidemenu:opened' : 'sidemenu:closed';
|
|
206
|
+
const customEvent = new CustomEvent(eventType, {
|
|
207
|
+
detail: { sideMenu: this, open: this.isOpen },
|
|
208
|
+
});
|
|
209
|
+
this.element.dispatchEvent(customEvent);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Open the side menu
|
|
214
|
+
*/
|
|
215
|
+
public open(): void {
|
|
216
|
+
if (this.isOpen) return;
|
|
217
|
+
this._updateOpenState(true);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Close the side menu
|
|
222
|
+
*/
|
|
223
|
+
public close(): void {
|
|
224
|
+
if (!this.isOpen) return;
|
|
225
|
+
this._updateOpenState(false);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Toggle the side menu open state
|
|
230
|
+
*/
|
|
231
|
+
public toggle(): void {
|
|
232
|
+
if (this.isOpen) {
|
|
233
|
+
this.close();
|
|
234
|
+
} else {
|
|
235
|
+
this.open();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Get the current open state
|
|
241
|
+
* @returns Whether the side menu is open
|
|
242
|
+
*/
|
|
243
|
+
public isOpened(): boolean {
|
|
244
|
+
return this.isOpen;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Update side menu options
|
|
249
|
+
* @param newOptions - New options to merge
|
|
250
|
+
*/
|
|
251
|
+
public updateOptions(newOptions: Partial<typeof DEFAULTS>): void {
|
|
252
|
+
this.options = { ...this.options, ...newOptions };
|
|
253
|
+
|
|
254
|
+
// Re-apply responsive behavior if autoOpen changed
|
|
255
|
+
if ('autoOpen' in newOptions) {
|
|
256
|
+
this._handleResize();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Set active menu item
|
|
262
|
+
* @param selector - Selector for the menu item to activate
|
|
263
|
+
*/
|
|
264
|
+
public setActiveItem(selector: string): void {
|
|
265
|
+
// Remove active class from all items
|
|
266
|
+
const allItems = this.element.querySelectorAll(SIDE_MENU.SELECTORS.LINK);
|
|
267
|
+
allItems.forEach(item => {
|
|
268
|
+
item.classList.remove(SIDE_MENU.CLASSES.ACTIVE);
|
|
269
|
+
item.removeAttribute('aria-current');
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
// Add active class to selected item
|
|
273
|
+
const activeItem = this.element.querySelector(selector);
|
|
274
|
+
if (activeItem) {
|
|
275
|
+
activeItem.classList.add(SIDE_MENU.CLASSES.ACTIVE);
|
|
276
|
+
activeItem.setAttribute('aria-current', 'page');
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Get all menu items
|
|
282
|
+
* @returns Array of menu item elements
|
|
283
|
+
*/
|
|
284
|
+
public getMenuItems(): HTMLElement[] {
|
|
285
|
+
return Array.from(this.element.querySelectorAll(SIDE_MENU.SELECTORS.LINK));
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Destroy the side menu instance and clean up
|
|
290
|
+
*/
|
|
291
|
+
public destroy(): void {
|
|
292
|
+
// Remove event listeners
|
|
293
|
+
if (this.toggler) {
|
|
294
|
+
this.toggler.removeEventListener('click', this._handleToggleClick);
|
|
295
|
+
this.toggler.removeEventListener('keydown', this._handleKeydown);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
window.removeEventListener('resize', this.resizeHandler);
|
|
299
|
+
|
|
300
|
+
// Reset DOM state
|
|
301
|
+
this.element.classList.remove(SIDE_MENU.CLASSES.IS_OPEN);
|
|
302
|
+
|
|
303
|
+
if (this.wrapper) {
|
|
304
|
+
this.wrapper.style.height = '';
|
|
305
|
+
this.wrapper.removeAttribute('aria-hidden');
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (this.toggler) {
|
|
309
|
+
this.toggler.removeAttribute('aria-expanded');
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Clear references
|
|
313
|
+
this.element = null as any;
|
|
314
|
+
this.toggler = null;
|
|
315
|
+
this.wrapper = null;
|
|
316
|
+
this.inner = null;
|
|
317
|
+
this.togglerIcon = null;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import SideMenu from './SideMenu';
|
|
2
|
+
import {
|
|
3
|
+
initFromDataAttributes,
|
|
4
|
+
getInstance,
|
|
5
|
+
create,
|
|
6
|
+
disposeAll,
|
|
7
|
+
openAll,
|
|
8
|
+
closeAll,
|
|
9
|
+
toggleAll,
|
|
10
|
+
getAllInstances,
|
|
11
|
+
setActiveByHref,
|
|
12
|
+
setActiveByText,
|
|
13
|
+
setupGlobalEventDelegation,
|
|
14
|
+
autoSetActiveFromURL,
|
|
15
|
+
} from './SideMenuInteractions';
|
|
16
|
+
|
|
17
|
+
// Global registration for browser environments
|
|
18
|
+
if (typeof window !== 'undefined') {
|
|
19
|
+
// Initialize the Atomix global object if it doesn't exist
|
|
20
|
+
(window as any).Atomix = (window as any).Atomix || {};
|
|
21
|
+
|
|
22
|
+
// Add SideMenu to the global Atomix object
|
|
23
|
+
(window as any).Atomix.SideMenu = {
|
|
24
|
+
create: create,
|
|
25
|
+
init: initFromDataAttributes,
|
|
26
|
+
get: getInstance,
|
|
27
|
+
disposeAll: disposeAll,
|
|
28
|
+
openAll: openAll,
|
|
29
|
+
closeAll: closeAll,
|
|
30
|
+
toggleAll: toggleAll,
|
|
31
|
+
getAllInstances: getAllInstances,
|
|
32
|
+
setActiveByHref: setActiveByHref,
|
|
33
|
+
setActiveByText: setActiveByText,
|
|
34
|
+
setupGlobalEventDelegation: setupGlobalEventDelegation,
|
|
35
|
+
autoSetActiveFromURL: autoSetActiveFromURL,
|
|
36
|
+
// Direct class access
|
|
37
|
+
SideMenu: SideMenu,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// Auto-initialize side menus when DOM is ready
|
|
41
|
+
if (document.readyState === 'loading') {
|
|
42
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
43
|
+
initFromDataAttributes();
|
|
44
|
+
setupGlobalEventDelegation();
|
|
45
|
+
autoSetActiveFromURL();
|
|
46
|
+
});
|
|
47
|
+
} else {
|
|
48
|
+
initFromDataAttributes();
|
|
49
|
+
setupGlobalEventDelegation();
|
|
50
|
+
autoSetActiveFromURL();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Export everything for module bundling
|
|
55
|
+
export {
|
|
56
|
+
SideMenu as default,
|
|
57
|
+
initFromDataAttributes,
|
|
58
|
+
getInstance,
|
|
59
|
+
create,
|
|
60
|
+
disposeAll,
|
|
61
|
+
openAll,
|
|
62
|
+
closeAll,
|
|
63
|
+
toggleAll,
|
|
64
|
+
getAllInstances,
|
|
65
|
+
setActiveByHref,
|
|
66
|
+
setActiveByText,
|
|
67
|
+
setupGlobalEventDelegation,
|
|
68
|
+
autoSetActiveFromURL,
|
|
69
|
+
};
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import SideMenu from './SideMenu';
|
|
2
|
+
import { SIDE_MENU } from '../../../lib/constants/components';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Parse data attributes from an element to create side menu options
|
|
6
|
+
* @param element - The side menu element
|
|
7
|
+
* @returns Parsed options object
|
|
8
|
+
*/
|
|
9
|
+
function parseDataAttributes(element: HTMLElement): any {
|
|
10
|
+
const dataset = element.dataset;
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
collapsible: dataset.collapsible !== 'false',
|
|
14
|
+
open: dataset.open === 'true',
|
|
15
|
+
title: dataset.title || '',
|
|
16
|
+
keyboard: dataset.keyboard !== 'false',
|
|
17
|
+
autoOpen: dataset.autoOpen !== 'false',
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Initialize side menu components from data attributes
|
|
23
|
+
* Finds all elements with [data-side-menu] and creates SideMenu instances
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```html
|
|
27
|
+
* <div class="c-side-menu" data-side-menu data-collapsible="true" data-auto-open="true">
|
|
28
|
+
* <div class="c-side-menu__toggler">
|
|
29
|
+
* <span class="c-side-menu__title">Navigation</span>
|
|
30
|
+
* <span class="c-side-menu__toggler-icon">▶</span>
|
|
31
|
+
* </div>
|
|
32
|
+
* <div class="c-side-menu__wrapper">
|
|
33
|
+
* <div class="c-side-menu__inner">
|
|
34
|
+
* <!-- menu content -->
|
|
35
|
+
* </div>
|
|
36
|
+
* </div>
|
|
37
|
+
* </div>
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @returns Array of created SideMenu instances
|
|
41
|
+
*/
|
|
42
|
+
export function initFromDataAttributes(): SideMenu[] {
|
|
43
|
+
const instances: SideMenu[] = [];
|
|
44
|
+
|
|
45
|
+
document.querySelectorAll('[data-side-menu]').forEach(element => {
|
|
46
|
+
const options = parseDataAttributes(element as HTMLElement);
|
|
47
|
+
const instance = new SideMenu(element as HTMLElement, options);
|
|
48
|
+
instances.push(instance);
|
|
49
|
+
|
|
50
|
+
// Store instance reference on the element for later retrieval
|
|
51
|
+
(element as any)._sideMenuInstance = instance;
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
return instances;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get a side menu instance from an element
|
|
59
|
+
* @param element - The side menu element or selector
|
|
60
|
+
* @returns The SideMenu instance or null if not found
|
|
61
|
+
*/
|
|
62
|
+
export function getInstance(element: string | HTMLElement): SideMenu | null {
|
|
63
|
+
const el =
|
|
64
|
+
typeof element === 'string' ? (document.querySelector(element) as HTMLElement) : element;
|
|
65
|
+
|
|
66
|
+
if (!el) return null;
|
|
67
|
+
|
|
68
|
+
return (el as any)._sideMenuInstance || null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Create a new side menu instance programmatically
|
|
73
|
+
* @param element - The side menu element or selector
|
|
74
|
+
* @param options - Configuration options
|
|
75
|
+
* @returns New SideMenu instance
|
|
76
|
+
*/
|
|
77
|
+
export function create(element: string | HTMLElement, options: any = {}): SideMenu {
|
|
78
|
+
const instance = new SideMenu(element, options);
|
|
79
|
+
|
|
80
|
+
// Store instance reference
|
|
81
|
+
const el =
|
|
82
|
+
typeof element === 'string' ? (document.querySelector(element) as HTMLElement) : element;
|
|
83
|
+
|
|
84
|
+
if (el) {
|
|
85
|
+
(el as any)._sideMenuInstance = instance;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return instance;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Dispose all side menu instances
|
|
93
|
+
* Destroys all side menu instances and cleans up references
|
|
94
|
+
*/
|
|
95
|
+
export function disposeAll(): void {
|
|
96
|
+
document.querySelectorAll(SIDE_MENU.SELECTORS.SIDE_MENU).forEach(element => {
|
|
97
|
+
const instance = (element as any)._sideMenuInstance;
|
|
98
|
+
if (instance && typeof instance.destroy === 'function') {
|
|
99
|
+
instance.destroy();
|
|
100
|
+
delete (element as any)._sideMenuInstance;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Open all side menu instances
|
|
107
|
+
*/
|
|
108
|
+
export function openAll(): void {
|
|
109
|
+
document.querySelectorAll(SIDE_MENU.SELECTORS.SIDE_MENU).forEach(element => {
|
|
110
|
+
const instance = (element as any)._sideMenuInstance;
|
|
111
|
+
if (instance && typeof instance.open === 'function') {
|
|
112
|
+
instance.open();
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Close all side menu instances
|
|
119
|
+
*/
|
|
120
|
+
export function closeAll(): void {
|
|
121
|
+
document.querySelectorAll(SIDE_MENU.SELECTORS.SIDE_MENU).forEach(element => {
|
|
122
|
+
const instance = (element as any)._sideMenuInstance;
|
|
123
|
+
if (instance && typeof instance.close === 'function') {
|
|
124
|
+
instance.close();
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Toggle all side menu instances
|
|
131
|
+
*/
|
|
132
|
+
export function toggleAll(): void {
|
|
133
|
+
document.querySelectorAll(SIDE_MENU.SELECTORS.SIDE_MENU).forEach(element => {
|
|
134
|
+
const instance = (element as any)._sideMenuInstance;
|
|
135
|
+
if (instance && typeof instance.toggle === 'function') {
|
|
136
|
+
instance.toggle();
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Get all side menu instances
|
|
143
|
+
* @returns Array of all SideMenu instances
|
|
144
|
+
*/
|
|
145
|
+
export function getAllInstances(): SideMenu[] {
|
|
146
|
+
const instances: SideMenu[] = [];
|
|
147
|
+
|
|
148
|
+
document.querySelectorAll(SIDE_MENU.SELECTORS.SIDE_MENU).forEach(element => {
|
|
149
|
+
const instance = (element as any)._sideMenuInstance;
|
|
150
|
+
if (instance) {
|
|
151
|
+
instances.push(instance);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
return instances;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Set active menu item across all side menus
|
|
160
|
+
* @param href - The href to match for setting active state
|
|
161
|
+
*/
|
|
162
|
+
export function setActiveByHref(href: string): void {
|
|
163
|
+
document.querySelectorAll(SIDE_MENU.SELECTORS.SIDE_MENU).forEach(element => {
|
|
164
|
+
const instance = (element as any)._sideMenuInstance;
|
|
165
|
+
if (instance && typeof instance.setActiveItem === 'function') {
|
|
166
|
+
instance.setActiveItem(`[href="${href}"]`);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Set active menu item by text content
|
|
173
|
+
* @param text - The text content to match for setting active state
|
|
174
|
+
*/
|
|
175
|
+
export function setActiveByText(text: string): void {
|
|
176
|
+
document.querySelectorAll(SIDE_MENU.SELECTORS.SIDE_MENU).forEach(element => {
|
|
177
|
+
const links = element.querySelectorAll(SIDE_MENU.SELECTORS.LINK);
|
|
178
|
+
|
|
179
|
+
// Remove active from all links
|
|
180
|
+
links.forEach(link => {
|
|
181
|
+
link.classList.remove(SIDE_MENU.CLASSES.ACTIVE);
|
|
182
|
+
link.removeAttribute('aria-current');
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// Find and activate matching link
|
|
186
|
+
links.forEach(link => {
|
|
187
|
+
if (link.textContent?.trim() === text) {
|
|
188
|
+
link.classList.add(SIDE_MENU.CLASSES.ACTIVE);
|
|
189
|
+
link.setAttribute('aria-current', 'page');
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Event delegation helper for side menu togglers
|
|
197
|
+
* Handles clicks on side menu togglers throughout the document
|
|
198
|
+
*/
|
|
199
|
+
export function setupGlobalEventDelegation(): void {
|
|
200
|
+
document.addEventListener('click', event => {
|
|
201
|
+
const target = event.target as HTMLElement;
|
|
202
|
+
const toggler = target.closest(SIDE_MENU.SELECTORS.TOGGLER);
|
|
203
|
+
|
|
204
|
+
if (toggler) {
|
|
205
|
+
const sideMenu = toggler.closest(SIDE_MENU.SELECTORS.SIDE_MENU);
|
|
206
|
+
if (sideMenu) {
|
|
207
|
+
const instance = getInstance(sideMenu as HTMLElement);
|
|
208
|
+
if (instance) {
|
|
209
|
+
event.preventDefault();
|
|
210
|
+
instance.toggle();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
// Handle keyboard events for togglers
|
|
217
|
+
document.addEventListener('keydown', event => {
|
|
218
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
219
|
+
const target = event.target as HTMLElement;
|
|
220
|
+
const toggler = target.closest(SIDE_MENU.SELECTORS.TOGGLER);
|
|
221
|
+
|
|
222
|
+
if (toggler) {
|
|
223
|
+
const sideMenu = toggler.closest(SIDE_MENU.SELECTORS.SIDE_MENU);
|
|
224
|
+
if (sideMenu) {
|
|
225
|
+
const instance = getInstance(sideMenu as HTMLElement);
|
|
226
|
+
if (instance) {
|
|
227
|
+
event.preventDefault();
|
|
228
|
+
instance.toggle();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Auto-set active menu items based on current URL
|
|
238
|
+
*/
|
|
239
|
+
export function autoSetActiveFromURL(): void {
|
|
240
|
+
const currentPath = window.location.pathname;
|
|
241
|
+
const currentHref = window.location.href;
|
|
242
|
+
|
|
243
|
+
// Try to match by full href first, then by pathname
|
|
244
|
+
setActiveByHref(currentHref);
|
|
245
|
+
|
|
246
|
+
// If no match found, try pathname
|
|
247
|
+
if (!document.querySelector(`${SIDE_MENU.SELECTORS.LINK}.${SIDE_MENU.CLASSES.ACTIVE}`)) {
|
|
248
|
+
setActiveByHref(currentPath);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import Navbar from './index';
|
|
2
|
+
import {
|
|
3
|
+
initFromDataAttributes,
|
|
4
|
+
getInstance,
|
|
5
|
+
create,
|
|
6
|
+
disposeAll,
|
|
7
|
+
expandAll,
|
|
8
|
+
collapseAll,
|
|
9
|
+
toggleAll,
|
|
10
|
+
getAllInstances,
|
|
11
|
+
setupGlobalEventDelegation,
|
|
12
|
+
} from './NavbarInteractions';
|
|
13
|
+
|
|
14
|
+
// Global registration for browser environments
|
|
15
|
+
if (typeof window !== 'undefined') {
|
|
16
|
+
// Initialize the Atomix global object if it doesn't exist
|
|
17
|
+
(window as any).Atomix = (window as any).Atomix || {};
|
|
18
|
+
|
|
19
|
+
// Add Navbar to the global Atomix object
|
|
20
|
+
(window as any).Atomix.Navbar = {
|
|
21
|
+
create: create,
|
|
22
|
+
init: initFromDataAttributes,
|
|
23
|
+
get: getInstance,
|
|
24
|
+
disposeAll: disposeAll,
|
|
25
|
+
expandAll: expandAll,
|
|
26
|
+
collapseAll: collapseAll,
|
|
27
|
+
toggleAll: toggleAll,
|
|
28
|
+
getAllInstances: getAllInstances,
|
|
29
|
+
setupGlobalEventDelegation: setupGlobalEventDelegation,
|
|
30
|
+
// Direct class access
|
|
31
|
+
Navbar: Navbar,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Auto-initialize navbars when DOM is ready
|
|
35
|
+
if (document.readyState === 'loading') {
|
|
36
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
37
|
+
initFromDataAttributes();
|
|
38
|
+
setupGlobalEventDelegation();
|
|
39
|
+
});
|
|
40
|
+
} else {
|
|
41
|
+
initFromDataAttributes();
|
|
42
|
+
setupGlobalEventDelegation();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Export everything for module bundling
|
|
47
|
+
export {
|
|
48
|
+
Navbar as default,
|
|
49
|
+
initFromDataAttributes,
|
|
50
|
+
getInstance,
|
|
51
|
+
create,
|
|
52
|
+
disposeAll,
|
|
53
|
+
expandAll,
|
|
54
|
+
collapseAll,
|
|
55
|
+
toggleAll,
|
|
56
|
+
getAllInstances,
|
|
57
|
+
setupGlobalEventDelegation,
|
|
58
|
+
};
|