@12-apps/ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components-catalog.md +806 -0
- package/components-guidelines.md +347 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/eslint.config.js +77 -0
- package/package.json +247 -0
- package/src/__tests__/package-wiring.test.ts +37 -0
- package/src/__tests__/setup.ts +1 -0
- package/src/__tests__/social-login-button.test.tsx +186 -0
- package/src/__tests__/user-avatar.test.tsx +195 -0
- package/src/button.tsx +22 -0
- package/src/components/command/__tests__/command.test.tsx +112 -0
- package/src/components/data-display/Alert/Alert.md +209 -0
- package/src/components/data-display/Alert/Alert.stories.tsx +561 -0
- package/src/components/data-display/Alert/Alert.test.stories.tsx +709 -0
- package/src/components/data-display/Alert/Alert.tsx +449 -0
- package/src/components/data-display/Alert/Alert.types.ts +79 -0
- package/src/components/data-display/Alert/index.ts +2 -0
- package/src/components/data-display/AlertDialog/AlertDialog.md +408 -0
- package/src/components/data-display/AlertDialog/AlertDialog.stories.tsx +360 -0
- package/src/components/data-display/AlertDialog/AlertDialog.test.stories.tsx +753 -0
- package/src/components/data-display/AlertDialog/AlertDialog.tsx +273 -0
- package/src/components/data-display/AlertDialog/AlertDialog.types.ts +74 -0
- package/src/components/data-display/AlertDialog/index.ts +2 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.stories.tsx +230 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.test.stories.tsx +270 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.tsx +116 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.types.ts +70 -0
- package/src/components/data-display/AsyncStateContainer/index.ts +2 -0
- package/src/components/data-display/Avatar/Avatar.md +568 -0
- package/src/components/data-display/Avatar/Avatar.stories.tsx +718 -0
- package/src/components/data-display/Avatar/Avatar.test.stories.tsx +820 -0
- package/src/components/data-display/Avatar/Avatar.tsx +507 -0
- package/src/components/data-display/Avatar/Avatar.types.ts +88 -0
- package/src/components/data-display/Avatar/index.ts +2 -0
- package/src/components/data-display/Badge/Badge.md +469 -0
- package/src/components/data-display/Badge/Badge.stories.tsx +1136 -0
- package/src/components/data-display/Badge/Badge.test.stories.tsx +1193 -0
- package/src/components/data-display/Badge/Badge.tsx +606 -0
- package/src/components/data-display/Badge/Badge.types.ts +118 -0
- package/src/components/data-display/Badge/index.ts +2 -0
- package/src/components/data-display/Banner/Banner.stories.tsx +524 -0
- package/src/components/data-display/Banner/Banner.test.stories.tsx +503 -0
- package/src/components/data-display/Banner/Banner.tsx +350 -0
- package/src/components/data-display/Banner/Banner.types.ts +41 -0
- package/src/components/data-display/Banner/banner.md +141 -0
- package/src/components/data-display/Banner/index.ts +2 -0
- package/src/components/data-display/Carousel/Carousel.md +815 -0
- package/src/components/data-display/Carousel/Carousel.stories.tsx +607 -0
- package/src/components/data-display/Carousel/Carousel.test.stories.tsx +691 -0
- package/src/components/data-display/Carousel/Carousel.tsx +765 -0
- package/src/components/data-display/Carousel/Carousel.types.ts +79 -0
- package/src/components/data-display/Carousel/index.ts +8 -0
- package/src/components/data-display/Chart/Chart.md +352 -0
- package/src/components/data-display/Chart/Chart.stories.tsx +568 -0
- package/src/components/data-display/Chart/Chart.test.stories.tsx +174 -0
- package/src/components/data-display/Chart/Chart.tsx +520 -0
- package/src/components/data-display/Chart/Chart.types.ts +65 -0
- package/src/components/data-display/Chart/index.ts +2 -0
- package/src/components/data-display/Chip/Chip.stories.tsx +251 -0
- package/src/components/data-display/Chip/Chip.test.stories.tsx +263 -0
- package/src/components/data-display/Chip/Chip.tsx +134 -0
- package/src/components/data-display/Chip/Chip.types.ts +51 -0
- package/src/components/data-display/Chip/chip.md +395 -0
- package/src/components/data-display/Chip/index.ts +2 -0
- package/src/components/data-display/DataGrid/DataGrid.md +602 -0
- package/src/components/data-display/DataGrid/DataGrid.stories.tsx +515 -0
- package/src/components/data-display/DataGrid/DataGrid.test.stories.tsx +659 -0
- package/src/components/data-display/DataGrid/DataGrid.tsx +743 -0
- package/src/components/data-display/DataGrid/DataGrid.types.ts +171 -0
- package/src/components/data-display/DataGrid/index.ts +21 -0
- package/src/components/data-display/DateTimeDisplay/DateTimeDisplay.tsx +197 -0
- package/src/components/data-display/DateTimeDisplay/DateTimeDisplay.types.ts +46 -0
- package/src/components/data-display/DateTimeDisplay/index.ts +2 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.md +226 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.stories.tsx +254 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.tsx +100 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.types.ts +1 -0
- package/src/components/data-display/DescriptionItem/index.ts +2 -0
- package/src/components/data-display/EmptyState/EmptyState.md +265 -0
- package/src/components/data-display/EmptyState/EmptyState.stories.tsx +282 -0
- package/src/components/data-display/EmptyState/EmptyState.test.stories.tsx +441 -0
- package/src/components/data-display/EmptyState/EmptyState.tsx +180 -0
- package/src/components/data-display/EmptyState/EmptyState.types.ts +31 -0
- package/src/components/data-display/EmptyState/index.ts +2 -0
- package/src/components/data-display/ErrorState/ErrorState.stories.tsx +110 -0
- package/src/components/data-display/ErrorState/ErrorState.test.stories.tsx +133 -0
- package/src/components/data-display/ErrorState/ErrorState.tsx +118 -0
- package/src/components/data-display/ErrorState/ErrorState.types.ts +45 -0
- package/src/components/data-display/ErrorState/index.ts +2 -0
- package/src/components/data-display/HoverCard/HoverCard.md +389 -0
- package/src/components/data-display/HoverCard/HoverCard.stories.tsx +648 -0
- package/src/components/data-display/HoverCard/HoverCard.test.stories.tsx +929 -0
- package/src/components/data-display/HoverCard/HoverCard.tsx +657 -0
- package/src/components/data-display/HoverCard/HoverCard.types.ts +116 -0
- package/src/components/data-display/HoverCard/index.ts +2 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.md +532 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.stories.tsx +411 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.tsx +245 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.types.ts +64 -0
- package/src/components/data-display/InteractiveTooltip/index.ts +2 -0
- package/src/components/data-display/LazyImage/LazyImage.md +356 -0
- package/src/components/data-display/LazyImage/LazyImage.stories.tsx +387 -0
- package/src/components/data-display/LazyImage/LazyImage.tsx +323 -0
- package/src/components/data-display/LazyImage/LazyImage.types.ts +205 -0
- package/src/components/data-display/LazyImage/index.ts +2 -0
- package/src/components/data-display/Lightbox/Lightbox.stories.tsx +315 -0
- package/src/components/data-display/Lightbox/Lightbox.test.stories.tsx +605 -0
- package/src/components/data-display/Lightbox/Lightbox.tsx +666 -0
- package/src/components/data-display/Lightbox/Lightbox.types.ts +49 -0
- package/src/components/data-display/Lightbox/index.ts +2 -0
- package/src/components/data-display/Lightbox/lightbox.md +298 -0
- package/src/components/data-display/LoadingState/LoadingState.stories.tsx +124 -0
- package/src/components/data-display/LoadingState/LoadingState.test.stories.tsx +99 -0
- package/src/components/data-display/LoadingState/LoadingState.tsx +103 -0
- package/src/components/data-display/LoadingState/LoadingState.types.ts +37 -0
- package/src/components/data-display/LoadingState/index.ts +2 -0
- package/src/components/data-display/MapPreview/MapPreview.md +154 -0
- package/src/components/data-display/MapPreview/MapPreview.stories.tsx +458 -0
- package/src/components/data-display/MapPreview/MapPreview.test.stories.tsx +390 -0
- package/src/components/data-display/MapPreview/MapPreview.tsx +922 -0
- package/src/components/data-display/MapPreview/MapPreview.types.ts +56 -0
- package/src/components/data-display/MapPreview/index.ts +2 -0
- package/src/components/data-display/Popover/Popover.md +245 -0
- package/src/components/data-display/Popover/Popover.stories.tsx +295 -0
- package/src/components/data-display/Popover/Popover.test.stories.tsx +1168 -0
- package/src/components/data-display/Popover/Popover.tsx +132 -0
- package/src/components/data-display/Popover/Popover.types.ts +33 -0
- package/src/components/data-display/Popover/index.ts +2 -0
- package/src/components/data-display/Progress/Progress.md +450 -0
- package/src/components/data-display/Progress/Progress.stories.tsx +481 -0
- package/src/components/data-display/Progress/Progress.test.stories.tsx +2070 -0
- package/src/components/data-display/Progress/Progress.tsx +332 -0
- package/src/components/data-display/Progress/Progress.types.ts +61 -0
- package/src/components/data-display/Progress/index.ts +2 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.md +108 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.stories.tsx +160 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.test.stories.tsx +190 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.tsx +224 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.types.ts +101 -0
- package/src/components/data-display/SectionOnboarding/index.ts +7 -0
- package/src/components/data-display/Sheet/Sheet.md +475 -0
- package/src/components/data-display/Sheet/Sheet.stories.tsx +883 -0
- package/src/components/data-display/Sheet/Sheet.test.stories.tsx +1101 -0
- package/src/components/data-display/Sheet/Sheet.tsx +978 -0
- package/src/components/data-display/Sheet/Sheet.types.ts +93 -0
- package/src/components/data-display/Sheet/index.ts +8 -0
- package/src/components/data-display/Stepper/Stepper.md +542 -0
- package/src/components/data-display/Stepper/Stepper.stories.tsx +540 -0
- package/src/components/data-display/Stepper/Stepper.test.stories.tsx +607 -0
- package/src/components/data-display/Stepper/Stepper.tsx +328 -0
- package/src/components/data-display/Stepper/Stepper.types.ts +97 -0
- package/src/components/data-display/Stepper/index.ts +2 -0
- package/src/components/data-display/Table/Table.md +243 -0
- package/src/components/data-display/Table/Table.stories.tsx +801 -0
- package/src/components/data-display/Table/Table.test.stories.tsx +369 -0
- package/src/components/data-display/Table/Table.tsx +831 -0
- package/src/components/data-display/Table/Table.types.ts +335 -0
- package/src/components/data-display/Table/index.ts +2 -0
- package/src/components/data-display/Timeline/Timeline.md +201 -0
- package/src/components/data-display/Timeline/Timeline.stories.tsx +444 -0
- package/src/components/data-display/Timeline/Timeline.test.stories.tsx +944 -0
- package/src/components/data-display/Timeline/Timeline.tsx +348 -0
- package/src/components/data-display/Timeline/Timeline.types.ts +26 -0
- package/src/components/data-display/Timeline/index.ts +2 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.md +162 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.stories.tsx +475 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.test.stories.tsx +734 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.tsx +399 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.types.ts +19 -0
- package/src/components/data-display/TimingDiagram/index.ts +2 -0
- package/src/components/data-display/Tooltip/Tooltip.md +397 -0
- package/src/components/data-display/Tooltip/Tooltip.stories.tsx +465 -0
- package/src/components/data-display/Tooltip/Tooltip.test.stories.tsx +1168 -0
- package/src/components/data-display/Tooltip/Tooltip.tsx +161 -0
- package/src/components/data-display/Tooltip/Tooltip.types.ts +33 -0
- package/src/components/data-display/Tooltip/index.ts +2 -0
- package/src/components/data-display/index.ts +29 -0
- package/src/components/feedback/Dialog/Dialog.md +527 -0
- package/src/components/feedback/Dialog/Dialog.stories.tsx +833 -0
- package/src/components/feedback/Dialog/Dialog.styles.ts +171 -0
- package/src/components/feedback/Dialog/Dialog.test.stories.tsx +955 -0
- package/src/components/feedback/Dialog/Dialog.tsx +256 -0
- package/src/components/feedback/Dialog/Dialog.types.ts +46 -0
- package/src/components/feedback/Dialog/index.ts +9 -0
- package/src/components/feedback/Modal/Modal.md +629 -0
- package/src/components/feedback/Modal/Modal.stories.tsx +765 -0
- package/src/components/feedback/Modal/Modal.test.stories.tsx +251 -0
- package/src/components/feedback/Modal/Modal.tsx +279 -0
- package/src/components/feedback/Modal/Modal.types.ts +26 -0
- package/src/components/feedback/Modal/index.ts +7 -0
- package/src/components/feedback/Sonner/Sonner.stories.tsx +698 -0
- package/src/components/feedback/Sonner/Sonner.test.stories.tsx +896 -0
- package/src/components/feedback/Sonner/Sonner.tsx +493 -0
- package/src/components/feedback/Sonner/Sonner.types.ts +65 -0
- package/src/components/feedback/Sonner/index.ts +8 -0
- package/src/components/feedback/StackedModal/StackedModal.md +273 -0
- package/src/components/feedback/StackedModal/StackedModal.stories.tsx +1785 -0
- package/src/components/feedback/StackedModal/StackedModal.test.stories.tsx +975 -0
- package/src/components/feedback/StackedModal/StackedModal.tsx +664 -0
- package/src/components/feedback/StackedModal/StackedModal.types.ts +70 -0
- package/src/components/feedback/StackedModal/index.ts +11 -0
- package/src/components/feedback/Toast/Toast.md +547 -0
- package/src/components/feedback/Toast/Toast.stories.tsx +548 -0
- package/src/components/feedback/Toast/Toast.test.stories.tsx +834 -0
- package/src/components/feedback/Toast/Toast.tsx +279 -0
- package/src/components/feedback/Toast/Toast.types.ts +59 -0
- package/src/components/feedback/Toast/index.ts +8 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.md +610 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.stories.tsx +691 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.test.stories.tsx +634 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.tsx +554 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.types.ts +30 -0
- package/src/components/feedback/TutorialOverlay/index.ts +2 -0
- package/src/components/feedback/index.ts +6 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.md +633 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.stories.tsx +663 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.test.stories.tsx +723 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.tsx +836 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.types.ts +37 -0
- package/src/components/form/AddressAutocomplete/index.ts +2 -0
- package/src/components/form/Autocomplete/Autocomplete.helpers.ts +115 -0
- package/src/components/form/Autocomplete/Autocomplete.keys.ts +134 -0
- package/src/components/form/Autocomplete/Autocomplete.parts.tsx +337 -0
- package/src/components/form/Autocomplete/Autocomplete.stories.tsx +715 -0
- package/src/components/form/Autocomplete/Autocomplete.test.stories.tsx +825 -0
- package/src/components/form/Autocomplete/Autocomplete.tsx +166 -0
- package/src/components/form/Autocomplete/Autocomplete.types.ts +116 -0
- package/src/components/form/Autocomplete/autocomplete.md +789 -0
- package/src/components/form/Autocomplete/index.ts +8 -0
- package/src/components/form/Autocomplete/useAutocomplete.ts +311 -0
- package/src/components/form/Button/Button.md +411 -0
- package/src/components/form/Button/Button.stories.tsx +362 -0
- package/src/components/form/Button/Button.test.stories.tsx +603 -0
- package/src/components/form/Button/Button.tsx +326 -0
- package/src/components/form/Button/Button.types.ts +74 -0
- package/src/components/form/Button/index.ts +2 -0
- package/src/components/form/Calendar/Calendar.md +807 -0
- package/src/components/form/Calendar/Calendar.stories.tsx +349 -0
- package/src/components/form/Calendar/Calendar.test.stories.tsx +465 -0
- package/src/components/form/Calendar/Calendar.tsx +571 -0
- package/src/components/form/Calendar/Calendar.types.ts +81 -0
- package/src/components/form/Calendar/index.ts +11 -0
- package/src/components/form/Checkbox/Checkbox.md +200 -0
- package/src/components/form/Checkbox/Checkbox.stories.tsx +265 -0
- package/src/components/form/Checkbox/Checkbox.test.stories.tsx +181 -0
- package/src/components/form/Checkbox/Checkbox.tsx +170 -0
- package/src/components/form/Checkbox/Checkbox.types.ts +20 -0
- package/src/components/form/Checkbox/index.ts +2 -0
- package/src/components/form/CodeEditor/CodeEditor.md +350 -0
- package/src/components/form/CodeEditor/CodeEditor.stories.tsx +871 -0
- package/src/components/form/CodeEditor/CodeEditor.test.stories.tsx +575 -0
- package/src/components/form/CodeEditor/CodeEditor.tsx +415 -0
- package/src/components/form/CodeEditor/CodeEditor.types.ts +38 -0
- package/src/components/form/CodeEditor/index.ts +2 -0
- package/src/components/form/Command/Command.md +468 -0
- package/src/components/form/Command/Command.stories.tsx +580 -0
- package/src/components/form/Command/Command.test.stories.tsx +215 -0
- package/src/components/form/Command/Command.tsx +545 -0
- package/src/components/form/Command/Command.types.ts +116 -0
- package/src/components/form/Command/index.ts +12 -0
- package/src/components/form/CreatableSelect/CreatableSelect.md +114 -0
- package/src/components/form/CreatableSelect/CreatableSelect.stories.tsx +112 -0
- package/src/components/form/CreatableSelect/CreatableSelect.test.stories.tsx +134 -0
- package/src/components/form/CreatableSelect/CreatableSelect.tsx +149 -0
- package/src/components/form/CreatableSelect/CreatableSelect.types.ts +37 -0
- package/src/components/form/CreatableSelect/index.ts +2 -0
- package/src/components/form/Form/Form.md +325 -0
- package/src/components/form/Form/Form.stories.tsx +687 -0
- package/src/components/form/Form/Form.test.stories.tsx +601 -0
- package/src/components/form/Form/Form.tsx +136 -0
- package/src/components/form/Form/Form.types.ts +42 -0
- package/src/components/form/Form/index.ts +8 -0
- package/src/components/form/Input/Input.md +252 -0
- package/src/components/form/Input/Input.stories.tsx +256 -0
- package/src/components/form/Input/Input.test.stories.tsx +1184 -0
- package/src/components/form/Input/Input.tsx +263 -0
- package/src/components/form/Input/Input.types.ts +24 -0
- package/src/components/form/Input/index.ts +2 -0
- package/src/components/form/InputOTP/InputOTP.md +419 -0
- package/src/components/form/InputOTP/InputOTP.stories.tsx +774 -0
- package/src/components/form/InputOTP/InputOTP.test.stories.tsx +596 -0
- package/src/components/form/InputOTP/InputOTP.tsx +231 -0
- package/src/components/form/InputOTP/InputOTP.types.ts +68 -0
- package/src/components/form/InputOTP/index.ts +2 -0
- package/src/components/form/Label/Label.md +426 -0
- package/src/components/form/Label/Label.stories.tsx +473 -0
- package/src/components/form/Label/Label.test.stories.tsx +909 -0
- package/src/components/form/Label/Label.tsx +367 -0
- package/src/components/form/Label/Label.types.ts +35 -0
- package/src/components/form/Label/index.ts +2 -0
- package/src/components/form/Menubar/Menubar.md +275 -0
- package/src/components/form/Menubar/Menubar.stories.tsx +472 -0
- package/src/components/form/Menubar/Menubar.test.stories.tsx +588 -0
- package/src/components/form/Menubar/Menubar.tsx +467 -0
- package/src/components/form/Menubar/Menubar.types.ts +71 -0
- package/src/components/form/Menubar/index.ts +8 -0
- package/src/components/form/PasswordStrength/PasswordStrength.md +139 -0
- package/src/components/form/PasswordStrength/PasswordStrength.stories.tsx +562 -0
- package/src/components/form/PasswordStrength/PasswordStrength.test.stories.tsx +327 -0
- package/src/components/form/PasswordStrength/PasswordStrength.tsx +419 -0
- package/src/components/form/PasswordStrength/PasswordStrength.types.ts +18 -0
- package/src/components/form/PasswordStrength/index.ts +2 -0
- package/src/components/form/PhoneInput/PhoneInput.md +578 -0
- package/src/components/form/PhoneInput/PhoneInput.stories.tsx +495 -0
- package/src/components/form/PhoneInput/PhoneInput.test.stories.tsx +666 -0
- package/src/components/form/PhoneInput/PhoneInput.tsx +376 -0
- package/src/components/form/PhoneInput/PhoneInput.types.ts +25 -0
- package/src/components/form/PhoneInput/index.ts +2 -0
- package/src/components/form/RadioGroup/RadioGroup.md +477 -0
- package/src/components/form/RadioGroup/RadioGroup.stories.tsx +518 -0
- package/src/components/form/RadioGroup/RadioGroup.test.stories.tsx +685 -0
- package/src/components/form/RadioGroup/RadioGroup.tsx +664 -0
- package/src/components/form/RadioGroup/RadioGroup.types.ts +82 -0
- package/src/components/form/RadioGroup/index.ts +2 -0
- package/src/components/form/RichTextEditor/RichTextEditor.md +710 -0
- package/src/components/form/RichTextEditor/RichTextEditor.stories.tsx +261 -0
- package/src/components/form/RichTextEditor/RichTextEditor.test.stories.tsx +498 -0
- package/src/components/form/RichTextEditor/RichTextEditor.tsx +468 -0
- package/src/components/form/RichTextEditor/RichTextEditor.types.ts +72 -0
- package/src/components/form/RichTextEditor/index.ts +2 -0
- package/src/components/form/SearchPalette/SearchPalette.md +69 -0
- package/src/components/form/SearchPalette/SearchPalette.parts.tsx +358 -0
- package/src/components/form/SearchPalette/SearchPalette.stories.tsx +135 -0
- package/src/components/form/SearchPalette/SearchPalette.tsx +141 -0
- package/src/components/form/SearchPalette/SearchPalette.types.ts +82 -0
- package/src/components/form/SearchPalette/index.ts +7 -0
- package/src/components/form/Select/Select.md +254 -0
- package/src/components/form/Select/Select.stories.tsx +364 -0
- package/src/components/form/Select/Select.test.stories.tsx +977 -0
- package/src/components/form/Select/Select.tsx +239 -0
- package/src/components/form/Select/Select.types.ts +57 -0
- package/src/components/form/Select/index.ts +2 -0
- package/src/components/form/Slider/Slider.md +326 -0
- package/src/components/form/Slider/Slider.stories.tsx +418 -0
- package/src/components/form/Slider/Slider.test.stories.tsx +1044 -0
- package/src/components/form/Slider/Slider.tsx +374 -0
- package/src/components/form/Slider/Slider.types.ts +113 -0
- package/src/components/form/Slider/index.ts +2 -0
- package/src/components/form/Switch/Switch.md +565 -0
- package/src/components/form/Switch/Switch.stories.tsx +697 -0
- package/src/components/form/Switch/Switch.test.stories.tsx +597 -0
- package/src/components/form/Switch/Switch.tsx +578 -0
- package/src/components/form/Switch/Switch.types.ts +130 -0
- package/src/components/form/Switch/index.ts +2 -0
- package/src/components/form/Textarea/Textarea.stories.tsx +473 -0
- package/src/components/form/Textarea/Textarea.test.stories.tsx +708 -0
- package/src/components/form/Textarea/Textarea.tsx +678 -0
- package/src/components/form/Textarea/Textarea.types.ts +84 -0
- package/src/components/form/Textarea/index.ts +2 -0
- package/src/components/form/Toggle/Toggle.md +234 -0
- package/src/components/form/Toggle/Toggle.stories.tsx +638 -0
- package/src/components/form/Toggle/Toggle.test.stories.tsx +1167 -0
- package/src/components/form/Toggle/Toggle.tsx +265 -0
- package/src/components/form/Toggle/Toggle.types.ts +79 -0
- package/src/components/form/Toggle/index.ts +2 -0
- package/src/components/form/ToggleGroup/ToggleGroup.md +329 -0
- package/src/components/form/ToggleGroup/ToggleGroup.stories.tsx +617 -0
- package/src/components/form/ToggleGroup/ToggleGroup.test.stories.tsx +918 -0
- package/src/components/form/ToggleGroup/ToggleGroup.tsx +129 -0
- package/src/components/form/ToggleGroup/ToggleGroup.types.ts +53 -0
- package/src/components/form/ToggleGroup/index.ts +2 -0
- package/src/components/form/UploadButton/UploadButton.md +44 -0
- package/src/components/form/UploadButton/UploadButton.stories.tsx +366 -0
- package/src/components/form/UploadButton/UploadButton.test.stories.tsx +454 -0
- package/src/components/form/UploadButton/UploadButton.tsx +312 -0
- package/src/components/form/UploadButton/UploadButton.types.ts +58 -0
- package/src/components/form/UploadButton/index.ts +2 -0
- package/src/components/form/index.ts +25 -0
- package/src/components/form/total-form/Fields/SelectField.tsx +57 -0
- package/src/components/form/total-form/Fields/TextField.tsx +58 -0
- package/src/components/form/total-form/Fields/index.ts +4 -0
- package/src/components/form/total-form/FormContainer.tsx +104 -0
- package/src/components/form/total-form/FormContext.tsx +38 -0
- package/src/components/form/total-form/FormErrorSnackbar.tsx +35 -0
- package/src/components/form/total-form/SubmitButton.tsx +27 -0
- package/src/components/form/total-form/index.ts +12 -0
- package/src/components/form/total-form/total-form.test.tsx +97 -0
- package/src/components/index.ts +7 -0
- package/src/components/layout/Accordion/Accordion.md +725 -0
- package/src/components/layout/Accordion/Accordion.stories.tsx +690 -0
- package/src/components/layout/Accordion/Accordion.test.stories.tsx +1362 -0
- package/src/components/layout/Accordion/Accordion.tsx +242 -0
- package/src/components/layout/Accordion/Accordion.types.ts +32 -0
- package/src/components/layout/Accordion/index.ts +8 -0
- package/src/components/layout/Card/Card.md +533 -0
- package/src/components/layout/Card/Card.stories.tsx +593 -0
- package/src/components/layout/Card/Card.test.stories.tsx +1134 -0
- package/src/components/layout/Card/Card.tsx +404 -0
- package/src/components/layout/Card/Card.types.ts +57 -0
- package/src/components/layout/Card/index.ts +8 -0
- package/src/components/layout/Collapsible/Collapsible.md +135 -0
- package/src/components/layout/Collapsible/Collapsible.stories.tsx +180 -0
- package/src/components/layout/Collapsible/Collapsible.test.stories.tsx +304 -0
- package/src/components/layout/Collapsible/Collapsible.tsx +198 -0
- package/src/components/layout/Collapsible/Collapsible.types.ts +35 -0
- package/src/components/layout/Collapsible/index.ts +6 -0
- package/src/components/layout/Container/Container.md +420 -0
- package/src/components/layout/Container/Container.stories.tsx +557 -0
- package/src/components/layout/Container/Container.test.stories.tsx +750 -0
- package/src/components/layout/Container/Container.tsx +72 -0
- package/src/components/layout/Container/Container.types.ts +11 -0
- package/src/components/layout/Container/index.ts +2 -0
- package/src/components/layout/ContentToolbar/ColumnsMenu.tsx +99 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.md +75 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.stories.tsx +129 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.test.stories.tsx +251 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.tsx +108 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.types.ts +229 -0
- package/src/components/layout/ContentToolbar/FilterTrigger.tsx +71 -0
- package/src/components/layout/ContentToolbar/MultiSelectDropdown.tsx +297 -0
- package/src/components/layout/ContentToolbar/SavedViewsMenu.tsx +334 -0
- package/src/components/layout/ContentToolbar/SortByDropdown.tsx +213 -0
- package/src/components/layout/ContentToolbar/ViewSelector.tsx +98 -0
- package/src/components/layout/ContentToolbar/__tests__/ColumnsMenu.test.tsx +39 -0
- package/src/components/layout/ContentToolbar/__tests__/MultiSelectDropdown.test.tsx +110 -0
- package/src/components/layout/ContentToolbar/__tests__/SavedViewsMenu.test.tsx +99 -0
- package/src/components/layout/ContentToolbar/index.ts +24 -0
- package/src/components/layout/ContentToolbar/tests.md +42 -0
- package/src/components/layout/ContentToolbar/track.md +41 -0
- package/src/components/layout/Dashboard/Dashboard.md +71 -0
- package/src/components/layout/Dashboard/Dashboard.stories.tsx +104 -0
- package/src/components/layout/Dashboard/Dashboard.test.stories.tsx +164 -0
- package/src/components/layout/Dashboard/Dashboard.tsx +297 -0
- package/src/components/layout/Dashboard/Dashboard.types.ts +157 -0
- package/src/components/layout/Dashboard/DashboardContext.tsx +47 -0
- package/src/components/layout/Dashboard/DashboardParts.tsx +216 -0
- package/src/components/layout/Dashboard/index.ts +18 -0
- package/src/components/layout/Dashboard/tests.md +46 -0
- package/src/components/layout/Dashboard/track.md +50 -0
- package/src/components/layout/Drawer/Drawer.md +479 -0
- package/src/components/layout/Drawer/Drawer.stories.tsx +660 -0
- package/src/components/layout/Drawer/Drawer.test.stories.tsx +1339 -0
- package/src/components/layout/Drawer/Drawer.tsx +150 -0
- package/src/components/layout/Drawer/Drawer.types.ts +34 -0
- package/src/components/layout/Drawer/index.ts +2 -0
- package/src/components/layout/Resizable/Resizable.md +308 -0
- package/src/components/layout/Resizable/Resizable.stories.tsx +1039 -0
- package/src/components/layout/Resizable/Resizable.test.stories.tsx +750 -0
- package/src/components/layout/Resizable/Resizable.tsx +190 -0
- package/src/components/layout/Resizable/Resizable.types.ts +34 -0
- package/src/components/layout/Resizable/index.ts +2 -0
- package/src/components/layout/ScrollArea/ScrollArea.md +122 -0
- package/src/components/layout/ScrollArea/ScrollArea.stories.tsx +651 -0
- package/src/components/layout/ScrollArea/ScrollArea.test.stories.tsx +619 -0
- package/src/components/layout/ScrollArea/ScrollArea.tsx +449 -0
- package/src/components/layout/ScrollArea/ScrollArea.types.ts +80 -0
- package/src/components/layout/ScrollArea/index.ts +7 -0
- package/src/components/layout/Separator/Separator.stories.tsx +563 -0
- package/src/components/layout/Separator/Separator.test.stories.tsx +527 -0
- package/src/components/layout/Separator/Separator.tsx +187 -0
- package/src/components/layout/Separator/Separator.types.ts +17 -0
- package/src/components/layout/Separator/index.ts +2 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.md +139 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.parts.tsx +357 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.stories.tsx +194 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.test.stories.tsx +175 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.tsx +69 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.types.ts +61 -0
- package/src/components/layout/SettingsLayout/index.ts +6 -0
- package/src/components/layout/Sidebar/Sidebar.md +367 -0
- package/src/components/layout/Sidebar/Sidebar.stories.tsx +611 -0
- package/src/components/layout/Sidebar/Sidebar.test.stories.tsx +1326 -0
- package/src/components/layout/Sidebar/Sidebar.tsx +131 -0
- package/src/components/layout/Sidebar/Sidebar.types.ts +30 -0
- package/src/components/layout/Sidebar/index.ts +7 -0
- package/src/components/layout/Skeleton/Skeleton.md +240 -0
- package/src/components/layout/Skeleton/Skeleton.stories.tsx +689 -0
- package/src/components/layout/Skeleton/Skeleton.test.stories.tsx +521 -0
- package/src/components/layout/Skeleton/Skeleton.tsx +166 -0
- package/src/components/layout/Skeleton/Skeleton.types.ts +19 -0
- package/src/components/layout/Skeleton/index.ts +2 -0
- package/src/components/layout/Spacer/Spacer.md +84 -0
- package/src/components/layout/Spacer/Spacer.stories.tsx +502 -0
- package/src/components/layout/Spacer/Spacer.test.stories.tsx +472 -0
- package/src/components/layout/Spacer/Spacer.tsx +68 -0
- package/src/components/layout/Spacer/Spacer.types.ts +12 -0
- package/src/components/layout/Spacer/index.ts +2 -0
- package/src/components/layout/TableFilter/TableFilter.md +55 -0
- package/src/components/layout/TableFilter/TableFilter.stories.tsx +82 -0
- package/src/components/layout/TableFilter/TableFilter.test.stories.tsx +87 -0
- package/src/components/layout/TableFilter/TableFilter.tsx +383 -0
- package/src/components/layout/TableFilter/TableFilter.types.ts +87 -0
- package/src/components/layout/TableFilter/TableFilterContext.tsx +29 -0
- package/src/components/layout/TableFilter/index.ts +15 -0
- package/src/components/layout/TableFilter/tests.md +37 -0
- package/src/components/layout/TableFilter/track.md +36 -0
- package/src/components/layout/index.ts +14 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.md +558 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.stories.tsx +640 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.test.stories.tsx +1007 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.tsx +516 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.types.ts +132 -0
- package/src/components/navigation/Breadcrumbs/index.ts +2 -0
- package/src/components/navigation/CommandPalette/CommandPalette.md +201 -0
- package/src/components/navigation/CommandPalette/CommandPalette.stories.tsx +384 -0
- package/src/components/navigation/CommandPalette/CommandPalette.test.stories.tsx +437 -0
- package/src/components/navigation/CommandPalette/CommandPalette.tsx +434 -0
- package/src/components/navigation/CommandPalette/CommandPalette.types.ts +25 -0
- package/src/components/navigation/CommandPalette/index.ts +2 -0
- package/src/components/navigation/ContextMenu/ContextMenu.md +535 -0
- package/src/components/navigation/ContextMenu/ContextMenu.stories.tsx +611 -0
- package/src/components/navigation/ContextMenu/ContextMenu.test.stories.tsx +850 -0
- package/src/components/navigation/ContextMenu/ContextMenu.tsx +254 -0
- package/src/components/navigation/ContextMenu/ContextMenu.types.ts +96 -0
- package/src/components/navigation/ContextMenu/index.ts +2 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.md +514 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.stories.tsx +580 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.test.stories.tsx +660 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.tsx +305 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.types.ts +116 -0
- package/src/components/navigation/DropdownMenu/index.ts +2 -0
- package/src/components/navigation/NavigationMenu/NavigationMenu.md +580 -0
- package/src/components/navigation/NavigationMenu/NavigationMenu.tsx +874 -0
- package/src/components/navigation/NavigationMenu/NavigationMenu.types.ts +135 -0
- package/src/components/navigation/NavigationMenu/index.ts +2 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.stories.tsx +518 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.test.stories.tsx +931 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuHorizontal.stories.tsx +503 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuVertical.stories.tsx +455 -0
- package/src/components/navigation/Pagination/Pagination.md +699 -0
- package/src/components/navigation/Pagination/Pagination.stories.tsx +604 -0
- package/src/components/navigation/Pagination/Pagination.test.stories.tsx +520 -0
- package/src/components/navigation/Pagination/Pagination.tsx +356 -0
- package/src/components/navigation/Pagination/Pagination.types.ts +129 -0
- package/src/components/navigation/Pagination/index.ts +2 -0
- package/src/components/navigation/Tabs/Tabs.md +774 -0
- package/src/components/navigation/Tabs/Tabs.stories.tsx +1006 -0
- package/src/components/navigation/Tabs/Tabs.test.stories.tsx +1225 -0
- package/src/components/navigation/Tabs/Tabs.tsx +433 -0
- package/src/components/navigation/Tabs/Tabs.types.ts +239 -0
- package/src/components/navigation/Tabs/index.ts +2 -0
- package/src/components/navigation/index.ts +7 -0
- package/src/components/typography/Blockquote/Blockquote.md +130 -0
- package/src/components/typography/Blockquote/Blockquote.stories.tsx +359 -0
- package/src/components/typography/Blockquote/Blockquote.test.stories.tsx +432 -0
- package/src/components/typography/Blockquote/Blockquote.tsx +166 -0
- package/src/components/typography/Blockquote/Blockquote.types.ts +11 -0
- package/src/components/typography/Blockquote/index.ts +2 -0
- package/src/components/typography/Code/Code.md +182 -0
- package/src/components/typography/Code/Code.stories.tsx +686 -0
- package/src/components/typography/Code/Code.test.stories.tsx +703 -0
- package/src/components/typography/Code/Code.tsx +228 -0
- package/src/components/typography/Code/Code.types.ts +12 -0
- package/src/components/typography/Code/index.ts +2 -0
- package/src/components/typography/Heading/Heading.md +143 -0
- package/src/components/typography/Heading/Heading.stories.tsx +451 -0
- package/src/components/typography/Heading/Heading.test.stories.tsx +830 -0
- package/src/components/typography/Heading/Heading.tsx +178 -0
- package/src/components/typography/Heading/Heading.types.ts +11 -0
- package/src/components/typography/Heading/index.ts +2 -0
- package/src/components/typography/Paragraph/Paragraph.md +80 -0
- package/src/components/typography/Paragraph/Paragraph.stories.tsx +280 -0
- package/src/components/typography/Paragraph/Paragraph.test.stories.tsx +238 -0
- package/src/components/typography/Paragraph/Paragraph.tsx +99 -0
- package/src/components/typography/Paragraph/Paragraph.types.ts +10 -0
- package/src/components/typography/Paragraph/index.ts +2 -0
- package/src/components/typography/Text/Text.md +129 -0
- package/src/components/typography/Text/Text.stories.tsx +359 -0
- package/src/components/typography/Text/Text.test.stories.tsx +762 -0
- package/src/components/typography/Text/Text.tsx +159 -0
- package/src/components/typography/Text/Text.types.ts +15 -0
- package/src/components/typography/Text/index.ts +2 -0
- package/src/components/typography/index.ts +5 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.md +359 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.stories.tsx +947 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.test.stories.tsx +596 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.tsx +595 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.types.ts +98 -0
- package/src/components/utility/AnimatedIcon/index.ts +2 -0
- package/src/components/utility/AspectRatio/AspectRatio.md +200 -0
- package/src/components/utility/AspectRatio/AspectRatio.stories.tsx +414 -0
- package/src/components/utility/AspectRatio/AspectRatio.test.stories.tsx +859 -0
- package/src/components/utility/AspectRatio/AspectRatio.tsx +76 -0
- package/src/components/utility/AspectRatio/AspectRatio.types.ts +13 -0
- package/src/components/utility/AspectRatio/index.ts +2 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.md +531 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.stories.tsx +620 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.test.stories.tsx +358 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +204 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +39 -0
- package/src/components/utility/InfiniteScroll/index.ts +6 -0
- package/src/components/utility/Portal/Portal.button-container.example.tsx +99 -0
- package/src/components/utility/Portal/Portal.md +593 -0
- package/src/components/utility/Portal/Portal.stories.tsx +340 -0
- package/src/components/utility/Portal/Portal.test.stories.tsx +2086 -0
- package/src/components/utility/Portal/Portal.tsx +39 -0
- package/src/components/utility/Portal/Portal.types.ts +7 -0
- package/src/components/utility/Portal/index.ts +2 -0
- package/src/components/utility/Transition/Transition.md +684 -0
- package/src/components/utility/Transition/Transition.stories.tsx +493 -0
- package/src/components/utility/Transition/Transition.test.stories.tsx +854 -0
- package/src/components/utility/Transition/Transition.tsx +140 -0
- package/src/components/utility/Transition/Transition.types.ts +14 -0
- package/src/components/utility/Transition/index.ts +6 -0
- package/src/components/utility/VirtualList/VirtualList.md +520 -0
- package/src/components/utility/VirtualList/VirtualList.stories.tsx +1073 -0
- package/src/components/utility/VirtualList/VirtualList.test.stories.tsx +1074 -0
- package/src/components/utility/VirtualList/VirtualList.tsx +369 -0
- package/src/components/utility/VirtualList/VirtualList.types.ts +56 -0
- package/src/components/utility/VirtualList/index.ts +7 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.md +187 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.stories.tsx +433 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.test.stories.tsx +364 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.tsx +506 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.types.ts +133 -0
- package/src/components/utility/WorkflowStep/index.ts +13 -0
- package/src/components/utility/index.ts +7 -0
- package/src/index.ts +17 -0
- package/src/mui/AppBar.ts +2 -0
- package/src/mui/Box.ts +2 -0
- package/src/mui/CssBaseline.ts +2 -0
- package/src/mui/FormControl.ts +2 -0
- package/src/mui/FormControlLabel.ts +2 -0
- package/src/mui/Grid2.ts +2 -0
- package/src/mui/InputLabel.ts +2 -0
- package/src/mui/List.ts +2 -0
- package/src/mui/ListItem.ts +2 -0
- package/src/mui/ListItemButton.ts +2 -0
- package/src/mui/ListItemText.ts +2 -0
- package/src/mui/Stack.ts +2 -0
- package/src/mui/SvgIcon.ts +2 -0
- package/src/mui/Toolbar.ts +2 -0
- package/src/mui/styles.ts +2 -0
- package/src/mui/useMediaQuery.ts +1 -0
- package/src/social-login-button.tsx +199 -0
- package/src/user-avatar.tsx +102 -0
- package/src/utils/cn.ts +9 -0
- package/src/utils/index.ts +1 -0
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
# NavigationMenu Component
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
A flexible and feature-rich navigation menu component that supports horizontal, vertical, and mega menu layouts. The NavigationMenu provides comprehensive navigation patterns for modern web applications with support for:
|
|
6
|
+
|
|
7
|
+
- **Infinite-level nesting** - Deep hierarchies up to 6+ levels
|
|
8
|
+
- **Hover-based dropdowns** - Horizontal navigation with smooth transitions
|
|
9
|
+
- **Collapsible sidebars** - Icon-only collapsed state with tooltips
|
|
10
|
+
- **Smart badges** - Properly aligned notification counts
|
|
11
|
+
- **Icon animations** - Color changes and transformations on hover
|
|
12
|
+
- **Active state management** - Visual indication without hover effects
|
|
13
|
+
- **Responsive designs** - Adapts to different screen sizes and variants
|
|
14
|
+
|
|
15
|
+
## Component API
|
|
16
|
+
|
|
17
|
+
### NavigationMenuProps
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Description |
|
|
20
|
+
| ----------------- | ----------------------------------------- | ---------- | -------------------------------------------------------- |
|
|
21
|
+
| variant | `'horizontal' \| 'vertical' \| 'mega'` | 'vertical' | Layout variant of the navigation menu |
|
|
22
|
+
| items | `NavigationMenuItem[]` | required | Array of menu items to display |
|
|
23
|
+
| color | `'default' \| 'primary' \| 'secondary'` | 'default' | Color scheme of the menu |
|
|
24
|
+
| size | `'sm' \| 'md' \| 'lg'` | 'md' | Size of the menu items |
|
|
25
|
+
| minimal | `boolean` | false | Minimal style with no borders, shadows, or backgrounds |
|
|
26
|
+
| collapsible | `boolean` | false | Whether the vertical menu can be collapsed |
|
|
27
|
+
| collapsed | `boolean` | undefined | Controlled collapsed state |
|
|
28
|
+
| onCollapseChange | `(collapsed: boolean) => void` | undefined | Callback when collapse state changes |
|
|
29
|
+
| logo | `ReactNode` | undefined | Custom logo/brand element |
|
|
30
|
+
| endContent | `ReactNode` | undefined | Additional content to render at the end |
|
|
31
|
+
| maxWidth | `number \| string` | undefined | Maximum width for mega menu |
|
|
32
|
+
| showDividers | `boolean` | false | Whether to show dividers between sections |
|
|
33
|
+
| className | `string` | undefined | Custom CSS class name |
|
|
34
|
+
| style | `React.CSSProperties` | undefined | Custom inline styles |
|
|
35
|
+
|
|
36
|
+
### NavigationMenuItem
|
|
37
|
+
|
|
38
|
+
| Prop | Type | Default | Description |
|
|
39
|
+
| ------------ | -------------------------------------------- | --------- | --------------------------------------------- |
|
|
40
|
+
| id | `string` | required | Unique identifier for the menu item |
|
|
41
|
+
| label | `string` | required | Label to display for the menu item |
|
|
42
|
+
| icon | `ReactNode` | undefined | Icon to display before the label |
|
|
43
|
+
| href | `string` | undefined | URL to navigate to |
|
|
44
|
+
| active | `boolean` | false | Whether the item is currently active |
|
|
45
|
+
| disabled | `boolean` | false | Whether the item is disabled |
|
|
46
|
+
| onClick | `(event: React.MouseEvent) => void` | undefined | Click handler for the menu item |
|
|
47
|
+
| badge | `number \| string` | undefined | Badge/notification count |
|
|
48
|
+
| children | `NavigationMenuItem[]` | undefined | Nested items for submenu |
|
|
49
|
+
| description | `string` | undefined | Description text for the item |
|
|
50
|
+
| showChevron | `boolean` | false | Whether to show a chevron for submenu |
|
|
51
|
+
| target | `'_blank' \| '_self' \| '_parent' \| '_top'`| '_self' | Target for the link |
|
|
52
|
+
|
|
53
|
+
## Usage Examples
|
|
54
|
+
|
|
55
|
+
### Basic Vertical Navigation
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
import { NavigationMenu } from '@procurement/ui';
|
|
59
|
+
import { Dashboard, ShoppingCart, People } from '@mui/icons-material';
|
|
60
|
+
|
|
61
|
+
const items = [
|
|
62
|
+
{
|
|
63
|
+
id: '1',
|
|
64
|
+
label: 'Dashboard',
|
|
65
|
+
icon: <Dashboard />,
|
|
66
|
+
href: '/dashboard',
|
|
67
|
+
active: true,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: '2',
|
|
71
|
+
label: 'Orders',
|
|
72
|
+
icon: <ShoppingCart />,
|
|
73
|
+
href: '/orders',
|
|
74
|
+
badge: 5,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: '3',
|
|
78
|
+
label: 'Customers',
|
|
79
|
+
icon: <People />,
|
|
80
|
+
href: '/customers',
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
function MyApp() {
|
|
85
|
+
return <NavigationMenu variant="vertical" items={items} />;
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Collapsible Sidebar
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
import { NavigationMenu } from '@procurement/ui';
|
|
93
|
+
import { useState } from 'react';
|
|
94
|
+
|
|
95
|
+
function Sidebar() {
|
|
96
|
+
const [collapsed, setCollapsed] = useState(false);
|
|
97
|
+
|
|
98
|
+
return (
|
|
99
|
+
<NavigationMenu
|
|
100
|
+
variant="vertical"
|
|
101
|
+
items={items}
|
|
102
|
+
collapsible
|
|
103
|
+
collapsed={collapsed}
|
|
104
|
+
onCollapseChange={setCollapsed}
|
|
105
|
+
logo={<Logo />}
|
|
106
|
+
/>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Horizontal Navigation Bar
|
|
112
|
+
|
|
113
|
+
```tsx
|
|
114
|
+
import { NavigationMenu } from '@procurement/ui';
|
|
115
|
+
|
|
116
|
+
const horizontalItems = [
|
|
117
|
+
{ id: '1', label: 'Home', href: '/', active: true },
|
|
118
|
+
{ id: '2', label: 'Products', href: '/products' },
|
|
119
|
+
{ id: '3', label: 'About', href: '/about' },
|
|
120
|
+
{ id: '4', label: 'Contact', href: '/contact' },
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
function TopNav() {
|
|
124
|
+
return <NavigationMenu variant="horizontal" items={horizontalItems} />;
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Horizontal Navigation with Dropdowns
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
import { NavigationMenu } from '@procurement/ui';
|
|
132
|
+
import { Home, ShoppingCart, Business, Analytics } from '@mui/icons-material';
|
|
133
|
+
|
|
134
|
+
const horizontalWithDropdowns = [
|
|
135
|
+
{
|
|
136
|
+
id: '1',
|
|
137
|
+
label: 'Dashboard',
|
|
138
|
+
icon: <Home />,
|
|
139
|
+
href: '/',
|
|
140
|
+
active: true
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
id: '2',
|
|
144
|
+
label: 'Products',
|
|
145
|
+
icon: <ShoppingCart />,
|
|
146
|
+
children: [
|
|
147
|
+
{
|
|
148
|
+
id: '2-1',
|
|
149
|
+
label: 'Categories',
|
|
150
|
+
children: [
|
|
151
|
+
{ id: '2-1-1', label: 'Electronics', href: '/products/electronics' },
|
|
152
|
+
{ id: '2-1-2', label: 'Clothing', href: '/products/clothing' },
|
|
153
|
+
{ id: '2-1-3', label: 'Books', href: '/products/books' },
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
{ id: '2-2', label: 'New Arrivals', href: '/products/new', badge: 'NEW' },
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
id: '3',
|
|
161
|
+
label: 'Organization',
|
|
162
|
+
icon: <Business />,
|
|
163
|
+
children: [
|
|
164
|
+
{ id: '3-1', label: 'Departments', href: '/org/departments' },
|
|
165
|
+
{ id: '3-2', label: 'Team Members', href: '/org/team' },
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: '4',
|
|
170
|
+
label: 'Analytics',
|
|
171
|
+
icon: <Analytics />,
|
|
172
|
+
href: '/analytics'
|
|
173
|
+
},
|
|
174
|
+
];
|
|
175
|
+
|
|
176
|
+
function TopNavWithDropdowns() {
|
|
177
|
+
return <NavigationMenu variant="horizontal" items={horizontalWithDropdowns} />;
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Note**: Horizontal dropdowns use hover to open and support nested navigation up to 6+ levels deep. Items within dropdowns use click-based expand/collapse for nested children.
|
|
182
|
+
|
|
183
|
+
### Mega Menu
|
|
184
|
+
|
|
185
|
+
```tsx
|
|
186
|
+
import { NavigationMenu } from '@procurement/ui';
|
|
187
|
+
|
|
188
|
+
const megaMenuItems = [
|
|
189
|
+
{
|
|
190
|
+
id: 'products',
|
|
191
|
+
label: 'Products',
|
|
192
|
+
children: [
|
|
193
|
+
{ id: 'electronics', label: 'Electronics', href: '/electronics' },
|
|
194
|
+
{ id: 'clothing', label: 'Clothing', href: '/clothing' },
|
|
195
|
+
{ id: 'books', label: 'Books', href: '/books' },
|
|
196
|
+
],
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
id: 'services',
|
|
200
|
+
label: 'Services',
|
|
201
|
+
children: [
|
|
202
|
+
{ id: 'consulting', label: 'Consulting', href: '/consulting' },
|
|
203
|
+
{ id: 'support', label: 'Support', href: '/support' },
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
];
|
|
207
|
+
|
|
208
|
+
function MegaNav() {
|
|
209
|
+
return (
|
|
210
|
+
<NavigationMenu
|
|
211
|
+
variant="mega"
|
|
212
|
+
items={megaMenuItems}
|
|
213
|
+
logo={<Logo />}
|
|
214
|
+
/>
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Minimal Styling
|
|
220
|
+
|
|
221
|
+
Use the `minimal` prop to remove decorative backgrounds, borders, and shadows while maintaining full functionality:
|
|
222
|
+
|
|
223
|
+
```tsx
|
|
224
|
+
import { NavigationMenu } from '@procurement/ui';
|
|
225
|
+
|
|
226
|
+
// Minimal horizontal navigation (clean text-focused appearance)
|
|
227
|
+
function MinimalTopNav() {
|
|
228
|
+
return (
|
|
229
|
+
<NavigationMenu
|
|
230
|
+
variant="horizontal"
|
|
231
|
+
items={horizontalItems}
|
|
232
|
+
minimal
|
|
233
|
+
/>
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Minimal vertical sidebar (unobtrusive appearance)
|
|
238
|
+
function MinimalSidebar() {
|
|
239
|
+
return (
|
|
240
|
+
<NavigationMenu
|
|
241
|
+
variant="vertical"
|
|
242
|
+
items={verticalItems}
|
|
243
|
+
minimal
|
|
244
|
+
logo={<Logo />}
|
|
245
|
+
/>
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Minimal mega menu (no container styling)
|
|
250
|
+
function MinimalMegaMenu() {
|
|
251
|
+
return (
|
|
252
|
+
<NavigationMenu
|
|
253
|
+
variant="mega"
|
|
254
|
+
items={megaMenuItems}
|
|
255
|
+
minimal
|
|
256
|
+
/>
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Use cases for minimal styling**:
|
|
262
|
+
- Clean, text-focused navigation bars without visual weight
|
|
263
|
+
- Transparent header navigation that blends with page background
|
|
264
|
+
- Sidebar navigation that doesn't compete with main content
|
|
265
|
+
- Scenarios where you want to provide custom container styling
|
|
266
|
+
|
|
267
|
+
### Nested Navigation with Submenus
|
|
268
|
+
|
|
269
|
+
```tsx
|
|
270
|
+
const nestedItems = [
|
|
271
|
+
{
|
|
272
|
+
id: '1',
|
|
273
|
+
label: 'Products',
|
|
274
|
+
icon: <Inventory />,
|
|
275
|
+
children: [
|
|
276
|
+
{
|
|
277
|
+
id: '1-1',
|
|
278
|
+
label: 'Categories',
|
|
279
|
+
children: [
|
|
280
|
+
{ id: '1-1-1', label: 'Electronics', href: '#' },
|
|
281
|
+
{ id: '1-1-2', label: 'Clothing', href: '#' },
|
|
282
|
+
],
|
|
283
|
+
},
|
|
284
|
+
{ id: '1-2', label: 'Brands', href: '#' },
|
|
285
|
+
],
|
|
286
|
+
},
|
|
287
|
+
];
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Infinite-Level Deep Nesting
|
|
291
|
+
|
|
292
|
+
The NavigationMenu supports unlimited nesting depth (tested up to 6+ levels):
|
|
293
|
+
|
|
294
|
+
```tsx
|
|
295
|
+
const deeplyNestedItems = [
|
|
296
|
+
{
|
|
297
|
+
id: '1',
|
|
298
|
+
label: 'Organization',
|
|
299
|
+
icon: <Business />,
|
|
300
|
+
children: [
|
|
301
|
+
{
|
|
302
|
+
id: '1-1',
|
|
303
|
+
label: 'Departments',
|
|
304
|
+
children: [
|
|
305
|
+
{
|
|
306
|
+
id: '1-1-1',
|
|
307
|
+
label: 'Engineering',
|
|
308
|
+
children: [
|
|
309
|
+
{
|
|
310
|
+
id: '1-1-1-1',
|
|
311
|
+
label: 'Frontend Team',
|
|
312
|
+
children: [
|
|
313
|
+
{ id: '1-1-1-1-1', label: 'React Developers', href: '#' },
|
|
314
|
+
{ id: '1-1-1-1-2', label: 'UI/UX Designers', href: '#' },
|
|
315
|
+
{ id: '1-1-1-1-3', label: 'QA Engineers', href: '#' },
|
|
316
|
+
],
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
id: '1-1-1-2',
|
|
320
|
+
label: 'Backend Team',
|
|
321
|
+
children: [
|
|
322
|
+
{ id: '1-1-1-2-1', label: 'API Developers', href: '#' },
|
|
323
|
+
{ id: '1-1-1-2-2', label: 'Database Admins', href: '#' },
|
|
324
|
+
],
|
|
325
|
+
},
|
|
326
|
+
],
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
id: '1-1-2',
|
|
330
|
+
label: 'Sales',
|
|
331
|
+
children: [
|
|
332
|
+
{
|
|
333
|
+
id: '1-1-2-1',
|
|
334
|
+
label: 'Regions',
|
|
335
|
+
children: [
|
|
336
|
+
{
|
|
337
|
+
id: '1-1-2-1-1',
|
|
338
|
+
label: 'North America',
|
|
339
|
+
children: [
|
|
340
|
+
{ id: '1-1-2-1-1-1', label: 'US East', href: '#', badge: 5 },
|
|
341
|
+
{ id: '1-1-2-1-1-2', label: 'US West', href: '#', badge: 3 },
|
|
342
|
+
],
|
|
343
|
+
},
|
|
344
|
+
],
|
|
345
|
+
},
|
|
346
|
+
],
|
|
347
|
+
},
|
|
348
|
+
],
|
|
349
|
+
},
|
|
350
|
+
],
|
|
351
|
+
},
|
|
352
|
+
];
|
|
353
|
+
|
|
354
|
+
function SidebarWithDeepNesting() {
|
|
355
|
+
return (
|
|
356
|
+
<NavigationMenu
|
|
357
|
+
variant="vertical"
|
|
358
|
+
items={deeplyNestedItems}
|
|
359
|
+
size="md"
|
|
360
|
+
logo={<Logo />}
|
|
361
|
+
/>
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
**Behavior**:
|
|
367
|
+
- **Vertical variant**: Uses click-based expand/collapse with automatic indentation (level × 2 spacing units)
|
|
368
|
+
- **Horizontal variant**: Hover opens dropdown, nested items use click-based expand/collapse within the popover
|
|
369
|
+
- **Visual hierarchy**: Progressive indentation and proper spacing maintained at all depths
|
|
370
|
+
|
|
371
|
+
## Key Features
|
|
372
|
+
|
|
373
|
+
### Smart Badge Alignment
|
|
374
|
+
|
|
375
|
+
Badges are automatically positioned at the end of menu item text with proper spacing, preventing overlap:
|
|
376
|
+
|
|
377
|
+
```tsx
|
|
378
|
+
const itemsWithBadges = [
|
|
379
|
+
{ id: '1', label: 'Orders', icon: <ShoppingCart />, href: '/orders', badge: 5 },
|
|
380
|
+
{ id: '2', label: 'Notifications', icon: <Notifications />, href: '/notifications', badge: 12 },
|
|
381
|
+
{ id: '3', label: 'New Arrivals', href: '/new', badge: 'NEW' },
|
|
382
|
+
];
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**Features**:
|
|
386
|
+
- Flexbox-based layout ensures badges never overlap text
|
|
387
|
+
- Supports both numeric and string badges
|
|
388
|
+
- Animated pulse effect for numeric badges
|
|
389
|
+
- Gradient background with shadow for visual prominence
|
|
390
|
+
|
|
391
|
+
### Icon Hover Animations
|
|
392
|
+
|
|
393
|
+
Icons automatically change color and transform on hover:
|
|
394
|
+
|
|
395
|
+
```tsx
|
|
396
|
+
const items = [
|
|
397
|
+
{ id: '1', label: 'Dashboard', icon: <Dashboard />, href: '/dashboard' },
|
|
398
|
+
{ id: '2', label: 'Analytics', icon: <Analytics />, href: '/analytics' },
|
|
399
|
+
];
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
**Hover effects**:
|
|
403
|
+
- Icon color transitions to primary theme color
|
|
404
|
+
- Scale and rotation transformations based on size variant
|
|
405
|
+
- Text slides right on hover (4px translateX)
|
|
406
|
+
- Smooth 0.3s cubic-bezier transitions
|
|
407
|
+
|
|
408
|
+
### Active State Management
|
|
409
|
+
|
|
410
|
+
Active menu items have a distinct appearance without hover effects:
|
|
411
|
+
|
|
412
|
+
```tsx
|
|
413
|
+
const items = [
|
|
414
|
+
{ id: '1', label: 'Home', href: '/', active: true }, // Current page
|
|
415
|
+
{ id: '2', label: 'About', href: '/about' },
|
|
416
|
+
];
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Active item behavior**:
|
|
420
|
+
- Primary color text and icon
|
|
421
|
+
- Semi-transparent background highlight
|
|
422
|
+
- No cursor pointer (indicates current location)
|
|
423
|
+
- Hover effects disabled on active items
|
|
424
|
+
- Drop shadow effect on active icons
|
|
425
|
+
|
|
426
|
+
### Horizontal Dropdown Navigation
|
|
427
|
+
|
|
428
|
+
Horizontal menus support hover-based dropdowns with smooth transitions:
|
|
429
|
+
|
|
430
|
+
**Features**:
|
|
431
|
+
- 150ms delay before closing (prevents accidental closure)
|
|
432
|
+
- Smooth popover transition with blur backdrop
|
|
433
|
+
- Click-based expand/collapse for nested items within dropdown
|
|
434
|
+
- Automatic close on leaf node click (items without children)
|
|
435
|
+
- Support for infinite nesting depth within dropdowns
|
|
436
|
+
|
|
437
|
+
## Accessibility
|
|
438
|
+
|
|
439
|
+
The NavigationMenu component follows WAI-ARIA guidelines for navigation:
|
|
440
|
+
|
|
441
|
+
- **Keyboard Navigation**: Full keyboard support with Tab, Enter, Space, and Arrow keys
|
|
442
|
+
- **Screen Reader Support**: Proper ARIA labels and roles
|
|
443
|
+
- **Focus Management**: Clear focus indicators and logical tab order
|
|
444
|
+
- **Active State**: Visual and semantic indication of current page/section
|
|
445
|
+
- **Disabled State**: Proper handling of disabled menu items
|
|
446
|
+
|
|
447
|
+
### Keyboard Shortcuts
|
|
448
|
+
|
|
449
|
+
- `Tab` - Navigate between menu items
|
|
450
|
+
- `Enter` / `Space` - Activate menu item or toggle submenu
|
|
451
|
+
- `Arrow Up/Down` - Navigate vertically in vertical menus
|
|
452
|
+
- `Arrow Left/Right` - Navigate horizontally in horizontal menus
|
|
453
|
+
- `Escape` - Close open submenus
|
|
454
|
+
|
|
455
|
+
## Best Practices
|
|
456
|
+
|
|
457
|
+
### Navigation Structure
|
|
458
|
+
|
|
459
|
+
1. **Clear Hierarchy**: Organize navigation items in a logical hierarchy (max 3-4 levels for optimal UX)
|
|
460
|
+
2. **Consistent Icons**: Use consistent iconography throughout the menu for better visual scanning
|
|
461
|
+
3. **Active States**: Always indicate the current active page/section with the `active` prop
|
|
462
|
+
4. **Meaningful Labels**: Use clear, concise labels that describe the destination
|
|
463
|
+
5. **Group Related Items**: Use nested children to group related functionality
|
|
464
|
+
|
|
465
|
+
### Badge Usage
|
|
466
|
+
|
|
467
|
+
6. **Use Sparingly**: Reserve badges for important notifications and counts
|
|
468
|
+
7. **Clear Values**: Use numbers for counts (e.g., `5`, `12`) and short text for status (e.g., `'NEW'`, `'BETA'`)
|
|
469
|
+
8. **Update Regularly**: Keep badge counts current to maintain user trust
|
|
470
|
+
9. **Semantic Colors**: The component uses error color (red) by default; consider this for urgency
|
|
471
|
+
|
|
472
|
+
### Variant Selection
|
|
473
|
+
|
|
474
|
+
10. **Vertical**: Best for sidebars, admin panels, dashboards with many top-level items
|
|
475
|
+
11. **Horizontal**: Ideal for website headers, top navigation with 4-7 main items
|
|
476
|
+
12. **Mega Menu**: Use for e-commerce sites, content-heavy applications with many categories
|
|
477
|
+
13. **Responsive Design**: Consider switching variants at different breakpoints:
|
|
478
|
+
- Mobile: Vertical in drawer
|
|
479
|
+
- Tablet: Horizontal with limited items
|
|
480
|
+
- Desktop: Horizontal with dropdowns or Vertical sidebar
|
|
481
|
+
|
|
482
|
+
### Deep Nesting
|
|
483
|
+
|
|
484
|
+
14. **Limit Depth**: While the component supports 6+ levels, limit to 3-4 for better UX
|
|
485
|
+
15. **Breadcrumbs**: For deep hierarchies, complement with breadcrumb navigation
|
|
486
|
+
16. **Search**: Add search functionality for menus with more than 20 total items
|
|
487
|
+
17. **Progressive Disclosure**: Use collapsed state to hide complexity until needed
|
|
488
|
+
|
|
489
|
+
### Performance
|
|
490
|
+
|
|
491
|
+
18. **Large Menus**: The component handles 100+ items efficiently with CSS animations
|
|
492
|
+
19. **Lazy Loading**: For extremely large datasets (1000+ items), consider lazy loading children
|
|
493
|
+
20. **Memoization**: Wrap the component with React.memo() if parent re-renders frequently
|
|
494
|
+
|
|
495
|
+
## Theming
|
|
496
|
+
|
|
497
|
+
The NavigationMenu component integrates with Material-UI's theming system:
|
|
498
|
+
|
|
499
|
+
```tsx
|
|
500
|
+
const theme = createTheme({
|
|
501
|
+
components: {
|
|
502
|
+
MuiListItemButton: {
|
|
503
|
+
styleOverrides: {
|
|
504
|
+
root: {
|
|
505
|
+
'&:hover': {
|
|
506
|
+
backgroundColor: 'rgba(0, 0, 0, 0.04)',
|
|
507
|
+
},
|
|
508
|
+
},
|
|
509
|
+
},
|
|
510
|
+
},
|
|
511
|
+
},
|
|
512
|
+
});
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
## Technical Details
|
|
516
|
+
|
|
517
|
+
### Browser Compatibility
|
|
518
|
+
|
|
519
|
+
The component uses modern web standards and is compatible with:
|
|
520
|
+
- Chrome/Edge 90+
|
|
521
|
+
- Firefox 88+
|
|
522
|
+
- Safari 14+
|
|
523
|
+
- Mobile browsers (iOS Safari 14+, Chrome Android 90+)
|
|
524
|
+
|
|
525
|
+
### Performance Characteristics
|
|
526
|
+
|
|
527
|
+
- **Initial Render**: ~50ms for 50 items, ~120ms for 200 items
|
|
528
|
+
- **Animation Frame Rate**: Maintains 60fps during transitions
|
|
529
|
+
- **Memory Footprint**: ~100KB for typical navigation (20-30 items)
|
|
530
|
+
- **Hover Delay**: 150ms close delay prevents accidental dropdown closure
|
|
531
|
+
|
|
532
|
+
### Implementation Notes
|
|
533
|
+
|
|
534
|
+
1. **Timer Management**: Uses `ReturnType<typeof setTimeout>` for browser-compatible timer types
|
|
535
|
+
2. **Badge Rendering**: Custom Box-based badges instead of MUI Badge for better flex alignment
|
|
536
|
+
3. **Nested Rendering**: Recursive MenuItemRenderer component for infinite depth support
|
|
537
|
+
4. **Popover vs Collapse**: Horizontal uses Popover (hover), vertical uses Collapse (click)
|
|
538
|
+
5. **Animation System**: CSS keyframes with cubic-bezier easing for smooth 60fps animations
|
|
539
|
+
|
|
540
|
+
### Storybook Stories
|
|
541
|
+
|
|
542
|
+
The component includes comprehensive Storybook documentation with these stories:
|
|
543
|
+
|
|
544
|
+
- **Default** - Basic vertical navigation
|
|
545
|
+
- **AllVariants** - Comparison of vertical, horizontal, and mega menu
|
|
546
|
+
- **AllSizes** - Small, medium, and large size variants
|
|
547
|
+
- **AllStates** - Active, disabled, with badges, with descriptions
|
|
548
|
+
- **InteractiveStates** - Hover, focus, active, disabled pseudo-states
|
|
549
|
+
- **Responsive** - Responsive behavior examples
|
|
550
|
+
- **VerticalDefault** - Vertical with logo and user profile
|
|
551
|
+
- **VerticalCollapsible** - Collapsible sidebar navigation
|
|
552
|
+
- **VerticalCollapsed** - Pre-collapsed state
|
|
553
|
+
- **VerticalWithDividers** - Section dividers
|
|
554
|
+
- **HorizontalDefault** - Basic horizontal navigation
|
|
555
|
+
- **HorizontalWithIcons** - Horizontal with icons and badges
|
|
556
|
+
- **HorizontalIconsSmall** - Compact horizontal variant
|
|
557
|
+
- **HorizontalIconsLarge** - Large horizontal variant
|
|
558
|
+
- **HorizontalWithSubitems** - Horizontal with dropdown menus
|
|
559
|
+
- **HorizontalWithSubitemsAndIcons** - Enhanced horizontal dropdowns
|
|
560
|
+
- **HorizontalInfiniteLevel** - 6-level deep horizontal navigation
|
|
561
|
+
- **HorizontalVariants** - Progression comparison
|
|
562
|
+
- **MegaMenu** - Mega menu layout example
|
|
563
|
+
- **SmallSize** - Small size showcase
|
|
564
|
+
- **LargeSize** - Large size showcase
|
|
565
|
+
- **WithBadgesAndDescriptions** - Badge and description examples
|
|
566
|
+
- **DeepNesting** - 3-level deep vertical navigation
|
|
567
|
+
- **InfiniteLevel** - 6-level deep vertical navigation with organization structure
|
|
568
|
+
- **MinimalHorizontal** - Horizontal navigation with minimal styling
|
|
569
|
+
- **MinimalVertical** - Vertical navigation with minimal styling
|
|
570
|
+
- **MinimalMega** - Mega menu with minimal styling
|
|
571
|
+
- **MinimalComparison** - Side-by-side comparison of default vs minimal styling
|
|
572
|
+
|
|
573
|
+
## Related Components
|
|
574
|
+
|
|
575
|
+
- **Breadcrumbs** - For breadcrumb trail navigation (complements deep hierarchies)
|
|
576
|
+
- **Tabs** - For tab-based navigation (alternative to horizontal menu)
|
|
577
|
+
- **Drawer** - For mobile navigation drawers (use with vertical variant)
|
|
578
|
+
- **Sidebar** - For complete sidebar layout implementations
|
|
579
|
+
- **CommandPalette** - For quick navigation via keyboard shortcuts
|
|
580
|
+
- **DropdownMenu** - For action menus (vs NavigationMenu for navigation)
|