@react-md/core 1.0.0-next.16 → 1.0.0-next.17
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/dist/_box-shadows.scss +76 -0
- package/dist/_colors.scss +279 -277
- package/dist/_core.scss +107 -16
- package/dist/_object-fit.scss +86 -0
- package/dist/_utils.scss +246 -72
- package/dist/app-bar/AppBar.d.ts +1 -90
- package/dist/app-bar/AppBar.js +1 -40
- package/dist/app-bar/AppBar.js.map +1 -1
- package/dist/app-bar/AppBarTitle.d.ts +1 -27
- package/dist/app-bar/AppBarTitle.js +1 -15
- package/dist/app-bar/AppBarTitle.js.map +1 -1
- package/dist/app-bar/_app-bar.scss +156 -25
- package/dist/app-bar/styles.d.ts +117 -0
- package/dist/app-bar/styles.js +55 -0
- package/dist/app-bar/styles.js.map +1 -0
- package/dist/autocomplete/Autocomplete.d.ts +8 -79
- package/dist/autocomplete/Autocomplete.js +112 -83
- package/dist/autocomplete/Autocomplete.js.map +1 -1
- package/dist/autocomplete/AutocompleteChip.d.ts +8 -0
- package/dist/autocomplete/AutocompleteChip.js +34 -0
- package/dist/autocomplete/AutocompleteChip.js.map +1 -0
- package/dist/autocomplete/AutocompleteCircularProgress.d.ts +5 -11
- package/dist/autocomplete/AutocompleteCircularProgress.js +4 -0
- package/dist/autocomplete/AutocompleteCircularProgress.js.map +1 -1
- package/dist/autocomplete/AutocompleteClearButton.d.ts +9 -0
- package/dist/autocomplete/AutocompleteClearButton.js +29 -0
- package/dist/autocomplete/AutocompleteClearButton.js.map +1 -0
- package/dist/autocomplete/AutocompleteDropdownButton.d.ts +4 -26
- package/dist/autocomplete/AutocompleteDropdownButton.js +5 -1
- package/dist/autocomplete/AutocompleteDropdownButton.js.map +1 -1
- package/dist/autocomplete/AutocompleteListboxChildren.d.ts +22 -0
- package/dist/autocomplete/AutocompleteListboxChildren.js +37 -0
- package/dist/autocomplete/AutocompleteListboxChildren.js.map +1 -0
- package/dist/autocomplete/_autocomplete.scss +362 -34
- package/dist/autocomplete/autocompleteStyles.d.ts +22 -0
- package/dist/autocomplete/autocompleteStyles.js +17 -8
- package/dist/autocomplete/autocompleteStyles.js.map +1 -1
- package/dist/autocomplete/defaults.d.ts +9 -9
- package/dist/autocomplete/defaults.js +13 -13
- package/dist/autocomplete/defaults.js.map +1 -1
- package/dist/autocomplete/types.d.ts +554 -56
- package/dist/autocomplete/types.js.map +1 -1
- package/dist/autocomplete/useAutocomplete.d.ts +22 -0
- package/dist/autocomplete/useAutocomplete.js +281 -0
- package/dist/autocomplete/useAutocomplete.js.map +1 -0
- package/dist/autocomplete/utils.d.ts +81 -0
- package/dist/autocomplete/utils.js +108 -0
- package/dist/autocomplete/utils.js.map +1 -0
- package/dist/avatar/_avatar.scss +93 -2
- package/dist/badge/Badge.d.ts +1 -20
- package/dist/badge/Badge.js +1 -14
- package/dist/badge/Badge.js.map +1 -1
- package/dist/badge/_badge.scss +90 -3
- package/dist/badge/styles.d.ts +26 -0
- package/dist/badge/styles.js +18 -0
- package/dist/badge/styles.js.map +1 -0
- package/dist/box/Box.js +2 -1
- package/dist/box/Box.js.map +1 -1
- package/dist/box/_box.scss +130 -17
- package/dist/box/styles.d.ts +6 -0
- package/dist/box/styles.js +2 -1
- package/dist/box/styles.js.map +1 -1
- package/dist/button/AsyncButton.d.ts +1 -1
- package/dist/button/AsyncButton.js.map +1 -1
- package/dist/button/Button.d.ts +2 -1
- package/dist/button/Button.js +2 -1
- package/dist/button/Button.js.map +1 -1
- package/dist/button/_button.scss +157 -25
- package/dist/card/Card.d.ts +16 -0
- package/dist/card/Card.js +11 -3
- package/dist/card/Card.js.map +1 -1
- package/dist/card/ClickableCard.d.ts +2 -1
- package/dist/card/ClickableCard.js +5 -2
- package/dist/card/ClickableCard.js.map +1 -1
- package/dist/card/_card.scss +90 -19
- package/dist/card/styles.d.ts +0 -7
- package/dist/card/styles.js +2 -3
- package/dist/card/styles.js.map +1 -1
- package/dist/chip/Chip.d.ts +2 -1
- package/dist/chip/Chip.js +2 -1
- package/dist/chip/Chip.js.map +1 -1
- package/dist/chip/_chip.scss +42 -20
- package/dist/chip/styles.d.ts +12 -10
- package/dist/chip/styles.js.map +1 -1
- package/dist/cssUtils.js.map +1 -1
- package/dist/delegateEvent.d.ts +2 -2
- package/dist/delegateEvent.js.map +1 -1
- package/dist/dialog/Dialog.d.ts +8 -21
- package/dist/dialog/Dialog.js +27 -27
- package/dist/dialog/Dialog.js.map +1 -1
- package/dist/dialog/FixedDialog.d.ts +1 -3
- package/dist/dialog/FixedDialog.js +0 -8
- package/dist/dialog/FixedDialog.js.map +1 -1
- package/dist/dialog/_dialog.scss +67 -13
- package/dist/dialog/styles.d.ts +56 -0
- package/dist/dialog/styles.js +29 -2
- package/dist/dialog/styles.js.map +1 -1
- package/dist/divider/Divider.d.ts +0 -11
- package/dist/divider/Divider.js.map +1 -1
- package/dist/divider/_divider.scss +7 -1
- package/dist/divider/styles.d.ts +11 -0
- package/dist/divider/styles.js.map +1 -1
- package/dist/draggable/useDraggable.d.ts +6 -6
- package/dist/draggable/useDraggable.js.map +1 -1
- package/dist/draggable/utils.d.ts +3 -3
- package/dist/draggable/utils.js.map +1 -1
- package/dist/expansion-panel/ExpansionPanel.d.ts +1 -1
- package/dist/expansion-panel/ExpansionPanel.js.map +1 -1
- package/dist/expansion-panel/_expansion-panel.scss +5 -1
- package/dist/expansion-panel/useExpansionPanels.js +12 -24
- package/dist/expansion-panel/useExpansionPanels.js.map +1 -1
- package/dist/{form → files}/FileInput.d.ts +3 -6
- package/dist/{form → files}/FileInput.js +3 -6
- package/dist/files/FileInput.js.map +1 -0
- package/dist/files/_files.scss +22 -0
- package/dist/files/styles.d.ts +5 -0
- package/dist/files/styles.js +7 -0
- package/dist/files/styles.js.map +1 -0
- package/dist/{form → files}/useFileUpload.d.ts +7 -9
- package/dist/{form → files}/useFileUpload.js +5 -7
- package/dist/files/useFileUpload.js.map +1 -0
- package/dist/files/utils.d.ts +169 -0
- package/dist/files/utils.js +114 -0
- package/dist/files/utils.js.map +1 -0
- package/dist/{form/fileUtils.d.ts → files/validation.d.ts} +9 -174
- package/dist/{form/fileUtils.js → files/validation.js} +9 -134
- package/dist/files/validation.js.map +1 -0
- package/dist/focus/useFocusContainer.d.ts +2 -2
- package/dist/focus/useFocusContainer.js.map +1 -1
- package/dist/focus/utils.js.map +1 -1
- package/dist/form/FormMessage.js.map +1 -1
- package/dist/form/FormMessageContainer.js +4 -2
- package/dist/form/FormMessageContainer.js.map +1 -1
- package/dist/form/InputToggle.d.ts +2 -1
- package/dist/form/InputToggle.js +2 -1
- package/dist/form/InputToggle.js.map +1 -1
- package/dist/form/InputToggleIcon.js.map +1 -1
- package/dist/form/Label.js +2 -2
- package/dist/form/Label.js.map +1 -1
- package/dist/form/Listbox.d.ts +24 -0
- package/dist/form/Listbox.js +46 -0
- package/dist/form/Listbox.js.map +1 -0
- package/dist/form/ListboxProvider.d.ts +21 -0
- package/dist/form/{useListboxProvider.js → ListboxProvider.js} +1 -1
- package/dist/form/ListboxProvider.js.map +1 -0
- package/dist/form/MenuItemTextField.js +1 -2
- package/dist/form/MenuItemTextField.js.map +1 -1
- package/dist/form/NativeSelect.js +7 -4
- package/dist/form/NativeSelect.js.map +1 -1
- package/dist/form/Option.d.ts +49 -10
- package/dist/form/Option.js +11 -9
- package/dist/form/Option.js.map +1 -1
- package/dist/form/Password.js.map +1 -1
- package/dist/form/Select.d.ts +2 -2
- package/dist/form/Select.js +81 -85
- package/dist/form/Select.js.map +1 -1
- package/dist/form/Slider.d.ts +4 -4
- package/dist/form/Slider.js +6 -2
- package/dist/form/Slider.js.map +1 -1
- package/dist/form/SliderThumb.d.ts +3 -3
- package/dist/form/SliderThumb.js.map +1 -1
- package/dist/form/SliderValueMarks.d.ts +2 -2
- package/dist/form/SliderValueMarks.js.map +1 -1
- package/dist/form/SliderValueTooltip.js.map +1 -1
- package/dist/form/TextArea.js +1 -2
- package/dist/form/TextArea.js.map +1 -1
- package/dist/form/TextField.js +1 -2
- package/dist/form/TextField.js.map +1 -1
- package/dist/form/TextFieldContainer.js +1 -2
- package/dist/form/TextFieldContainer.js.map +1 -1
- package/dist/form/_form.scss +186 -121
- package/dist/form/formMessageContainerStyles.d.ts +10 -0
- package/dist/form/formMessageContainerStyles.js +11 -0
- package/dist/form/formMessageContainerStyles.js.map +1 -0
- package/dist/form/inputToggleStyles.js.map +1 -1
- package/dist/form/optionStyles.d.ts +1 -0
- package/dist/form/optionStyles.js +2 -2
- package/dist/form/optionStyles.js.map +1 -1
- package/dist/form/selectUtils.js.map +1 -1
- package/dist/form/sliderUtils.d.ts +1 -1
- package/dist/form/sliderUtils.js.map +1 -1
- package/dist/form/textFieldContainerStyles.d.ts +0 -2
- package/dist/form/textFieldContainerStyles.js +1 -2
- package/dist/form/textFieldContainerStyles.js.map +1 -1
- package/dist/form/types.d.ts +3 -10
- package/dist/form/types.js.map +1 -1
- package/dist/form/useCheckboxGroup.d.ts +17 -17
- package/dist/form/useCheckboxGroup.js +9 -17
- package/dist/form/useCheckboxGroup.js.map +1 -1
- package/dist/form/useCombobox.d.ts +56 -21
- package/dist/form/useCombobox.js +19 -4
- package/dist/form/useCombobox.js.map +1 -1
- package/dist/form/useEditableCombobox.d.ts +24 -4
- package/dist/form/useEditableCombobox.js +5 -0
- package/dist/form/useEditableCombobox.js.map +1 -1
- package/dist/form/useNumberField.js.map +1 -1
- package/dist/form/useRadioGroup.d.ts +6 -6
- package/dist/form/useRadioGroup.js.map +1 -1
- package/dist/form/useResizingTextArea.js.map +1 -1
- package/dist/form/useSelectCombobox.d.ts +3 -4
- package/dist/form/useSelectCombobox.js.map +1 -1
- package/dist/form/useTextField.d.ts +1 -1
- package/dist/form/useTextField.js.map +1 -1
- package/dist/form/useTextFieldContainerAddons.js.map +1 -1
- package/dist/hoverMode/useHoverMode.d.ts +3 -3
- package/dist/hoverMode/useHoverMode.js.map +1 -1
- package/dist/hoverMode/useHoverModeProvider.d.ts +4 -4
- package/dist/hoverMode/useHoverModeProvider.js.map +1 -1
- package/dist/icon/_icon.scss +151 -2
- package/dist/icon/iconConfig.d.ts +10 -0
- package/dist/icon/iconConfig.js +7 -0
- package/dist/icon/iconConfig.js.map +1 -1
- package/dist/icon/materialConfig.js.map +1 -1
- package/dist/icon/styles.js.map +1 -1
- package/dist/interaction/UserInteractionModeProvider.d.ts +5 -5
- package/dist/interaction/UserInteractionModeProvider.js +12 -8
- package/dist/interaction/UserInteractionModeProvider.js.map +1 -1
- package/dist/interaction/types.d.ts +20 -2
- package/dist/interaction/types.js.map +1 -1
- package/dist/interaction/useElementInteraction.d.ts +7 -1
- package/dist/interaction/useElementInteraction.js +1 -2
- package/dist/interaction/useElementInteraction.js.map +1 -1
- package/dist/interaction/utils.d.ts +2 -2
- package/dist/interaction/utils.js +2 -2
- package/dist/interaction/utils.js.map +1 -1
- package/dist/layout/LayoutWindowSplitter.js.map +1 -1
- package/dist/layout/_layout.scss +23 -10
- package/dist/layout/useExpandableLayout.d.ts +3 -3
- package/dist/layout/useExpandableLayout.js.map +1 -1
- package/dist/layout/useLayoutAppBarHeight.d.ts +2 -3
- package/dist/layout/useLayoutAppBarHeight.js.map +1 -1
- package/dist/layout/useTemporaryLayout.d.ts +2 -2
- package/dist/layout/useTemporaryLayout.js.map +1 -1
- package/dist/link/SkipToMainContent.js.map +1 -1
- package/dist/list/ListItem.d.ts +2 -1
- package/dist/list/ListItem.js +2 -1
- package/dist/list/ListItem.js.map +1 -1
- package/dist/list/ListItemChildren.js.map +1 -1
- package/dist/list/ListItemLink.d.ts +2 -1
- package/dist/list/ListItemLink.js +2 -1
- package/dist/list/ListItemLink.js.map +1 -1
- package/dist/list/_list.scss +6 -5
- package/dist/media-queries/_media-queries.scss +12 -0
- package/dist/media-queries/appSize.js.map +1 -1
- package/dist/media-queries/useMediaQuery.js +3 -1
- package/dist/media-queries/useMediaQuery.js.map +1 -1
- package/dist/menu/DropdownMenu.js.map +1 -1
- package/dist/menu/Menu.d.ts +8 -3
- package/dist/menu/Menu.js +2 -1
- package/dist/menu/Menu.js.map +1 -1
- package/dist/menu/MenuItemButton.js +6 -2
- package/dist/menu/MenuItemButton.js.map +1 -1
- package/dist/menu/useContextMenu.d.ts +3 -3
- package/dist/menu/useContextMenu.js.map +1 -1
- package/dist/movement/types.d.ts +5 -5
- package/dist/movement/types.js.map +1 -1
- package/dist/navigation/CollapsibleNavGroup.d.ts +5 -3
- package/dist/navigation/CollapsibleNavGroup.js +3 -4
- package/dist/navigation/CollapsibleNavGroup.js.map +1 -1
- package/dist/navigation/DefaultNavigationRenderer.d.ts +1 -2
- package/dist/navigation/DefaultNavigationRenderer.js +6 -2
- package/dist/navigation/DefaultNavigationRenderer.js.map +1 -1
- package/dist/navigation/NavItemButton.d.ts +1 -1
- package/dist/navigation/NavItemButton.js +1 -0
- package/dist/navigation/NavItemButton.js.map +1 -1
- package/dist/navigation/NavItemLink.d.ts +3 -2
- package/dist/navigation/NavItemLink.js +6 -2
- package/dist/navigation/NavItemLink.js.map +1 -1
- package/dist/navigation/NavSubheader.d.ts +2 -3
- package/dist/navigation/NavSubheader.js.map +1 -1
- package/dist/navigation/Navigation.d.ts +1 -1
- package/dist/navigation/Navigation.js.map +1 -1
- package/dist/navigation/_navigation.scss +6 -5
- package/dist/navigation/types.d.ts +54 -6
- package/dist/navigation/types.js.map +1 -1
- package/dist/navigation/useActiveHeadingId.d.ts +1 -1
- package/dist/navigation/useActiveHeadingId.js.map +1 -1
- package/dist/navigation/useNavigationExpansion.d.ts +104 -0
- package/dist/navigation/useNavigationExpansion.js +77 -0
- package/dist/navigation/useNavigationExpansion.js.map +1 -0
- package/dist/navigation/utils.d.ts +13 -0
- package/dist/navigation/utils.js +36 -0
- package/dist/navigation/utils.js.map +1 -0
- package/dist/objectFit.d.ts +69 -0
- package/dist/objectFit.js +52 -0
- package/dist/objectFit.js.map +1 -0
- package/dist/overlay/_overlay.scss +2 -1
- package/dist/positioning/useFixedPositioning.d.ts +17 -4
- package/dist/positioning/useFixedPositioning.js +10 -5
- package/dist/positioning/useFixedPositioning.js.map +1 -1
- package/dist/positioning/utils.js.map +1 -1
- package/dist/progress/LinearProgress.js.map +1 -1
- package/dist/progress/_progress.scss +20 -14
- package/dist/responsive-item/ResponsiveItem.d.ts +64 -0
- package/dist/responsive-item/ResponsiveItem.js +68 -0
- package/dist/responsive-item/ResponsiveItem.js.map +1 -0
- package/dist/responsive-item/ResponsiveItemOverlay.d.ts +1 -19
- package/dist/responsive-item/ResponsiveItemOverlay.js +1 -12
- package/dist/responsive-item/ResponsiveItemOverlay.js.map +1 -1
- package/dist/responsive-item/_responsive-item.scss +110 -133
- package/dist/responsive-item/responsiveItemOverlayStyles.d.ts +19 -0
- package/dist/responsive-item/responsiveItemOverlayStyles.js +14 -0
- package/dist/responsive-item/responsiveItemOverlayStyles.js.map +1 -0
- package/dist/responsive-item/responsiveItemStyles.d.ts +52 -0
- package/dist/responsive-item/responsiveItemStyles.js +15 -0
- package/dist/responsive-item/responsiveItemStyles.js.map +1 -0
- package/dist/scroll/useScrollLock.d.ts +5 -0
- package/dist/scroll/useScrollLock.js.map +1 -1
- package/dist/searching/utils.d.ts +2 -2
- package/dist/searching/utils.js.map +1 -1
- package/dist/segmented-button/SegmentedButton.d.ts +2 -1
- package/dist/segmented-button/SegmentedButton.js +2 -1
- package/dist/segmented-button/SegmentedButton.js.map +1 -1
- package/dist/segmented-button/_segmented-button.scss +6 -6
- package/dist/sheet/_sheet.scss +18 -6
- package/dist/snackbar/ToastManager.js +15 -5
- package/dist/snackbar/ToastManager.js.map +1 -1
- package/dist/snackbar/_snackbar.scss +30 -17
- package/dist/snackbar/useCurrentToastActions.d.ts +5 -5
- package/dist/snackbar/useCurrentToastActions.js.map +1 -1
- package/dist/table/_table.scss +15 -3
- package/dist/table/tableCellStyles.d.ts +7 -3
- package/dist/table/tableCellStyles.js +2 -2
- package/dist/table/tableCellStyles.js.map +1 -1
- package/dist/tabs/Tab.d.ts +2 -1
- package/dist/tabs/Tab.js +2 -1
- package/dist/tabs/Tab.js.map +1 -1
- package/dist/tabs/TabList.d.ts +2 -2
- package/dist/tabs/TabList.js.map +1 -1
- package/dist/tabs/TabListScrollButton.d.ts +1 -1
- package/dist/tabs/TabListScrollButton.js +1 -1
- package/dist/tabs/TabListScrollButton.js.map +1 -1
- package/dist/tabs/_tabs.scss +30 -9
- package/dist/tabs/getTabListScrollToOptions.d.ts +18 -0
- package/dist/tabs/getTabListScrollToOptions.js +19 -0
- package/dist/tabs/getTabListScrollToOptions.js.map +1 -0
- package/dist/tabs/tabStyles.d.ts +3 -0
- package/dist/tabs/tabStyles.js.map +1 -1
- package/dist/tabs/useTabList.d.ts +1 -8
- package/dist/tabs/useTabList.js +1 -0
- package/dist/tabs/useTabList.js.map +1 -1
- package/dist/tabs/useTabs.d.ts +6 -6
- package/dist/tabs/useTabs.js.map +1 -1
- package/dist/tabs/utils.d.ts +0 -18
- package/dist/tabs/utils.js +0 -15
- package/dist/tabs/utils.js.map +1 -1
- package/dist/test-utils/matchMedia.d.ts +1 -1
- package/dist/test-utils/matchMedia.js +4 -4
- package/dist/test-utils/matchMedia.js.map +1 -1
- package/dist/test-utils/polyfills/TextDecoder.js +0 -1
- package/dist/test-utils/polyfills/TextDecoder.js.map +1 -1
- package/dist/test-utils/timers.d.ts +9 -5
- package/dist/test-utils/timers.js +5 -5
- package/dist/test-utils/timers.js.map +1 -1
- package/dist/theme/LocalStorageColorSchemeProvider.d.ts +1 -1
- package/dist/theme/LocalStorageColorSchemeProvider.js +2 -1
- package/dist/theme/LocalStorageColorSchemeProvider.js.map +1 -1
- package/dist/theme/ThemeProvider.js +3 -1
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/_a11y.scss +77 -13
- package/dist/theme/_colors.scss +279 -277
- package/dist/theme/_theme.scss +308 -37
- package/dist/theme/isColorScheme.d.ts +16 -0
- package/dist/theme/isColorScheme.js +19 -0
- package/dist/theme/isColorScheme.js.map +1 -0
- package/dist/theme/types.d.ts +53 -1
- package/dist/theme/types.js +1 -23
- package/dist/theme/types.js.map +1 -1
- package/dist/theme/useCSSVariables.d.ts +2 -19
- package/dist/theme/useCSSVariables.js.map +1 -1
- package/dist/theme/useColorScheme.d.ts +1 -35
- package/dist/theme/useColorScheme.js.map +1 -1
- package/dist/theme/useColorSchemeMetaTag.d.ts +1 -1
- package/dist/theme/useColorSchemeMetaTag.js.map +1 -1
- package/dist/theme/useColorSchemeProvider.d.ts +1 -1
- package/dist/theme/useColorSchemeProvider.js +1 -1
- package/dist/theme/useColorSchemeProvider.js.map +1 -1
- package/dist/theme/{usePrefersColorScheme.js → usePrefersDarkScheme.js} +1 -1
- package/dist/theme/usePrefersDarkScheme.js.map +1 -0
- package/dist/theme/utils.js.map +1 -1
- package/dist/tooltip/useTooltip.d.ts +14 -9
- package/dist/tooltip/useTooltip.js +2 -1
- package/dist/tooltip/useTooltip.js.map +1 -1
- package/dist/transition/_transition.scss +16 -9
- package/dist/transition/skeletonPlaceholderUtils.js.map +1 -1
- package/dist/transition/types.d.ts +1 -1
- package/dist/transition/types.js.map +1 -1
- package/dist/transition/useCarousel.d.ts +3 -3
- package/dist/transition/useCarousel.js.map +1 -1
- package/dist/transition/useCollapseTransition.js.map +1 -1
- package/dist/transition/useTransition.js +1 -0
- package/dist/transition/useTransition.js.map +1 -1
- package/dist/transition/utils.js.map +1 -1
- package/dist/tree/TreeItem.d.ts +2 -1
- package/dist/tree/TreeItem.js +4 -3
- package/dist/tree/TreeItem.js.map +1 -1
- package/dist/tree/TreeItemExpander.js.map +1 -1
- package/dist/tree/_tree.scss +8 -6
- package/dist/tree/useTreeExpansion.d.ts +1 -1
- package/dist/tree/useTreeExpansion.js +6 -18
- package/dist/tree/useTreeExpansion.js.map +1 -1
- package/dist/tree/useTreeSelection.d.ts +1 -1
- package/dist/tree/useTreeSelection.js +7 -25
- package/dist/tree/useTreeSelection.js.map +1 -1
- package/dist/tree/utils.d.ts +1 -1
- package/dist/tree/utils.js.map +1 -1
- package/dist/types.d.ts +12 -4
- package/dist/types.js.map +1 -1
- package/dist/typography/WritingDirectionProvider.d.ts +1 -1
- package/dist/typography/WritingDirectionProvider.js.map +1 -1
- package/dist/typography/_typography.scss +94 -37
- package/dist/typography/typographyStyles.js.map +1 -1
- package/dist/useDebouncedFunction.d.ts +1 -5
- package/dist/useDebouncedFunction.js +3 -1
- package/dist/useDebouncedFunction.js.map +1 -1
- package/dist/useDropzone.d.ts +4 -4
- package/dist/useDropzone.js.map +1 -1
- package/dist/useEnsuredId.js.map +1 -1
- package/dist/useIntersectionObserver.d.ts +5 -5
- package/dist/useIntersectionObserver.js.map +1 -1
- package/dist/useLocalStorage.d.ts +3 -3
- package/dist/useLocalStorage.js +1 -1
- package/dist/useLocalStorage.js.map +1 -1
- package/dist/useMutationObserver.d.ts +1 -1
- package/dist/useMutationObserver.js.map +1 -1
- package/dist/useOrientation.js +3 -1
- package/dist/useOrientation.js.map +1 -1
- package/dist/usePageInactive.d.ts +2 -2
- package/dist/usePageInactive.js.map +1 -1
- package/dist/useReadonlySet.d.ts +76 -0
- package/dist/useReadonlySet.js +72 -0
- package/dist/useReadonlySet.js.map +1 -0
- package/dist/useResizeListener.d.ts +1 -1
- package/dist/useResizeListener.js.map +1 -1
- package/dist/useThrottledFunction.d.ts +1 -5
- package/dist/useThrottledFunction.js +3 -1
- package/dist/useThrottledFunction.js.map +1 -1
- package/dist/useToggle.d.ts +3 -3
- package/dist/useToggle.js.map +1 -1
- package/dist/utils/RenderRecursively.d.ts +1 -1
- package/dist/utils/RenderRecursively.js.map +1 -1
- package/dist/utils/alphaNumericSort.d.ts +1 -1
- package/dist/utils/alphaNumericSort.js.map +1 -1
- package/dist/utils/bem.js.map +1 -1
- package/dist/utils/debounce.d.ts +5 -0
- package/dist/utils/debounce.js +17 -0
- package/dist/utils/debounce.js.map +1 -0
- package/dist/utils/nearest.js.map +1 -1
- package/dist/utils/parseCssLengthUnit.js.map +1 -1
- package/dist/utils/throttle.d.ts +5 -0
- package/dist/utils/throttle.js +30 -0
- package/dist/utils/throttle.js.map +1 -0
- package/dist/utils/wait.js +3 -1
- package/dist/utils/wait.js.map +1 -1
- package/dist/window-splitter/WindowSplitter.d.ts +37 -15
- package/dist/window-splitter/WindowSplitter.js +38 -17
- package/dist/window-splitter/WindowSplitter.js.map +1 -1
- package/dist/window-splitter/_window-splitter.scss +32 -14
- package/dist/window-splitter/styles.d.ts +14 -0
- package/dist/window-splitter/styles.js +18 -0
- package/dist/window-splitter/styles.js.map +1 -0
- package/package.json +24 -23
- package/src/app-bar/AppBar.tsx +1 -170
- package/src/app-bar/AppBarTitle.tsx +1 -44
- package/src/app-bar/styles.ts +206 -0
- package/src/autocomplete/Autocomplete.tsx +194 -211
- package/src/autocomplete/AutocompleteChip.tsx +48 -0
- package/src/autocomplete/AutocompleteCircularProgress.tsx +6 -17
- package/src/autocomplete/AutocompleteClearButton.tsx +44 -0
- package/src/autocomplete/AutocompleteDropdownButton.tsx +16 -37
- package/src/autocomplete/AutocompleteListboxChildren.tsx +68 -0
- package/src/autocomplete/autocompleteStyles.ts +48 -9
- package/src/autocomplete/defaults.ts +26 -17
- package/src/autocomplete/types.ts +744 -61
- package/src/autocomplete/useAutocomplete.ts +428 -0
- package/src/autocomplete/utils.ts +211 -0
- package/src/badge/Badge.tsx +1 -39
- package/src/badge/styles.ts +45 -0
- package/src/box/Box.tsx +11 -9
- package/src/box/styles.ts +14 -5
- package/src/button/AsyncButton.tsx +1 -1
- package/src/button/Button.tsx +5 -1
- package/src/card/Card.tsx +35 -4
- package/src/card/ClickableCard.tsx +9 -2
- package/src/card/styles.ts +1 -10
- package/src/chip/Chip.tsx +6 -1
- package/src/chip/styles.ts +12 -10
- package/src/delegateEvent.ts +5 -5
- package/src/dialog/Dialog.tsx +48 -61
- package/src/dialog/FixedDialog.tsx +1 -11
- package/src/dialog/styles.ts +97 -0
- package/src/divider/Divider.tsx +0 -12
- package/src/divider/styles.ts +12 -0
- package/src/draggable/useDraggable.ts +17 -10
- package/src/draggable/utils.ts +3 -3
- package/src/expansion-panel/ExpansionPanel.tsx +1 -1
- package/src/expansion-panel/useExpansionPanels.ts +18 -27
- package/src/{form → files}/FileInput.tsx +7 -15
- package/src/files/styles.ts +10 -0
- package/src/{form → files}/useFileUpload.ts +30 -34
- package/src/files/utils.ts +234 -0
- package/src/{form/fileUtils.ts → files/validation.ts} +13 -242
- package/src/focus/useFocusContainer.ts +16 -8
- package/src/form/FormMessageContainer.tsx +2 -2
- package/src/form/InputToggle.tsx +5 -1
- package/src/form/Label.tsx +18 -18
- package/src/form/Listbox.tsx +87 -0
- package/src/form/ListboxProvider.ts +37 -0
- package/src/form/MenuItemTextField.tsx +1 -2
- package/src/form/NativeSelect.tsx +14 -10
- package/src/form/Option.tsx +74 -22
- package/src/form/Select.tsx +89 -85
- package/src/form/Slider.tsx +14 -11
- package/src/form/SliderThumb.tsx +4 -4
- package/src/form/SliderValueMarks.tsx +4 -4
- package/src/form/TextArea.tsx +6 -8
- package/src/form/TextField.tsx +0 -2
- package/src/form/TextFieldContainer.tsx +9 -11
- package/src/form/formMessageContainerStyles.ts +22 -0
- package/src/form/optionStyles.ts +7 -2
- package/src/form/sliderUtils.ts +1 -1
- package/src/form/textFieldContainerStyles.ts +9 -14
- package/src/form/types.ts +3 -11
- package/src/form/useCheckboxGroup.ts +28 -36
- package/src/form/useCombobox.ts +86 -38
- package/src/form/useEditableCombobox.ts +43 -8
- package/src/form/useRadioGroup.ts +6 -6
- package/src/form/useSelectCombobox.ts +4 -4
- package/src/form/useTextField.ts +1 -1
- package/src/hoverMode/useHoverMode.ts +3 -3
- package/src/hoverMode/useHoverModeProvider.ts +4 -4
- package/src/icon/iconConfig.tsx +12 -0
- package/src/interaction/UserInteractionModeProvider.tsx +12 -8
- package/src/interaction/types.ts +21 -2
- package/src/interaction/useElementInteraction.tsx +9 -2
- package/src/interaction/utils.ts +7 -7
- package/src/layout/useExpandableLayout.ts +3 -3
- package/src/layout/useLayoutAppBarHeight.ts +3 -4
- package/src/layout/useTemporaryLayout.ts +2 -2
- package/src/list/ListItem.tsx +5 -1
- package/src/list/ListItemLink.tsx +5 -1
- package/src/media-queries/useMediaQuery.ts +2 -1
- package/src/menu/Menu.tsx +11 -3
- package/src/menu/MenuItemButton.tsx +7 -1
- package/src/menu/useContextMenu.ts +3 -3
- package/src/movement/types.ts +5 -5
- package/src/navigation/CollapsibleNavGroup.tsx +16 -8
- package/src/navigation/DefaultNavigationRenderer.tsx +8 -6
- package/src/navigation/NavItemButton.tsx +2 -1
- package/src/navigation/NavItemLink.tsx +11 -3
- package/src/navigation/NavSubheader.tsx +1 -1
- package/src/navigation/Navigation.tsx +1 -1
- package/src/navigation/types.ts +60 -10
- package/src/navigation/useActiveHeadingId.ts +1 -1
- package/src/navigation/useNavigationExpansion.ts +170 -0
- package/src/navigation/utils.ts +47 -0
- package/src/objectFit.ts +88 -0
- package/src/positioning/useFixedPositioning.ts +34 -11
- package/src/responsive-item/ResponsiveItem.tsx +96 -0
- package/src/responsive-item/ResponsiveItemOverlay.tsx +6 -46
- package/src/responsive-item/responsiveItemOverlayStyles.ts +46 -0
- package/src/responsive-item/responsiveItemStyles.ts +81 -0
- package/src/scroll/useScrollLock.ts +6 -0
- package/src/searching/utils.ts +3 -3
- package/src/segmented-button/SegmentedButton.tsx +5 -1
- package/src/snackbar/ToastManager.tsx +16 -5
- package/src/snackbar/useCurrentToastActions.ts +5 -5
- package/src/table/tableCellStyles.ts +10 -6
- package/src/tabs/Tab.tsx +4 -1
- package/src/tabs/TabList.tsx +2 -2
- package/src/tabs/TabListScrollButton.tsx +4 -4
- package/src/tabs/getTabListScrollToOptions.ts +37 -0
- package/src/tabs/tabStyles.ts +4 -0
- package/src/tabs/useTabList.ts +2 -9
- package/src/tabs/useTabs.ts +6 -6
- package/src/tabs/utils.ts +0 -38
- package/src/test-utils/matchMedia.ts +5 -5
- package/src/test-utils/polyfills/TextDecoder.ts +0 -1
- package/src/test-utils/timers.ts +10 -7
- package/src/theme/LocalStorageColorSchemeProvider.tsx +4 -4
- package/src/theme/ThemeProvider.tsx +3 -3
- package/src/theme/isColorScheme.ts +22 -0
- package/src/theme/types.ts +67 -1
- package/src/theme/useCSSVariables.ts +7 -30
- package/src/theme/useColorScheme.ts +1 -40
- package/src/theme/useColorSchemeMetaTag.ts +1 -1
- package/src/theme/useColorSchemeProvider.ts +2 -2
- package/src/tooltip/useTooltip.ts +17 -9
- package/src/transition/types.ts +1 -1
- package/src/transition/useCarousel.ts +3 -3
- package/src/transition/useTransition.ts +1 -0
- package/src/tree/TreeItem.tsx +7 -1
- package/src/tree/TreeItemExpander.tsx +1 -1
- package/src/tree/useTreeExpansion.ts +7 -25
- package/src/tree/useTreeSelection.ts +8 -32
- package/src/tree/utils.ts +6 -2
- package/src/types.ts +20 -4
- package/src/typography/WritingDirectionProvider.tsx +1 -1
- package/src/useDebouncedFunction.ts +4 -9
- package/src/useDropzone.ts +4 -4
- package/src/useIntersectionObserver.ts +5 -5
- package/src/useLocalStorage.ts +6 -6
- package/src/useMutationObserver.ts +1 -1
- package/src/useOrientation.ts +3 -1
- package/src/usePageInactive.ts +2 -2
- package/src/useReadonlySet.ts +122 -0
- package/src/useResizeListener.ts +1 -1
- package/src/useThrottledFunction.ts +6 -9
- package/src/useToggle.ts +3 -3
- package/src/utils/RenderRecursively.tsx +1 -1
- package/src/utils/alphaNumericSort.ts +1 -1
- package/src/utils/debounce.ts +22 -0
- package/src/utils/throttle.ts +38 -0
- package/src/utils/wait.ts +5 -1
- package/src/window-splitter/WindowSplitter.tsx +38 -43
- package/src/window-splitter/styles.ts +42 -0
- package/dist/autocomplete/FilterAutocompleteOptions.d.ts +0 -8
- package/dist/autocomplete/FilterAutocompleteOptions.js +0 -57
- package/dist/autocomplete/FilterAutocompleteOptions.js.map +0 -1
- package/dist/dialog/DialogContainer.d.ts +0 -14
- package/dist/dialog/DialogContainer.js +0 -20
- package/dist/dialog/DialogContainer.js.map +0 -1
- package/dist/form/FileInput.js.map +0 -1
- package/dist/form/fileUtils.js.map +0 -1
- package/dist/form/useFileUpload.js.map +0 -1
- package/dist/form/useListboxProvider.d.ts +0 -31
- package/dist/form/useListboxProvider.js.map +0 -1
- package/dist/navigation/getHrefFromParents.d.ts +0 -5
- package/dist/navigation/getHrefFromParents.js +0 -13
- package/dist/navigation/getHrefFromParents.js.map +0 -1
- package/dist/responsive-item/ResponsiveItemContainer.d.ts +0 -115
- package/dist/responsive-item/ResponsiveItemContainer.js +0 -80
- package/dist/responsive-item/ResponsiveItemContainer.js.map +0 -1
- package/dist/responsive-item/styles.d.ts +0 -34
- package/dist/responsive-item/styles.js +0 -17
- package/dist/responsive-item/styles.js.map +0 -1
- package/dist/theme/usePrefersColorScheme.js.map +0 -1
- package/src/autocomplete/FilterAutocompleteOptions.tsx +0 -86
- package/src/dialog/DialogContainer.tsx +0 -28
- package/src/form/useListboxProvider.ts +0 -45
- package/src/navigation/getHrefFromParents.ts +0 -15
- package/src/responsive-item/ResponsiveItemContainer.tsx +0 -174
- package/src/responsive-item/styles.ts +0 -58
- /package/dist/theme/{usePrefersColorScheme.d.ts → usePrefersDarkScheme.d.ts} +0 -0
- /package/src/theme/{usePrefersColorScheme.ts → usePrefersDarkScheme.ts} +0 -0
|
@@ -13,9 +13,10 @@ import { navItemLink } from "./navItemStyles.js";
|
|
|
13
13
|
*
|
|
14
14
|
* @since 6.0.0
|
|
15
15
|
*/ export const NavItemLink = /*#__PURE__*/ forwardRef(function NavItemLink(props, propRef) {
|
|
16
|
-
const { as: Component = "a", href, active, activeClassName, beforeAddon, afterAddon, className, children, liProps, spanProps, disabled = !href, onClick, onBlur, onDragStart, onKeyDown, onKeyUp, onMouseDown, onMouseLeave, onMouseUp, onTouchMove, onTouchEnd, onTouchStart, tooltipOptions, disableScrollIntoView, ...remaining } = props;
|
|
16
|
+
const { as: Component = "a", href, active, activeClassName, beforeAddon, afterAddon, className, children, liProps, spanProps, disabled = !href, onClick, onBlur, onDragStart, onKeyDown, onKeyUp, onMouseDown, onMouseLeave, onMouseUp, onTouchMove, onTouchEnd, onTouchStart, tooltipOptions, disableRipple, disableScrollIntoView, ...remaining } = props;
|
|
17
17
|
const [linkRef, linkRefCallback] = useEnsuredRef(propRef);
|
|
18
18
|
const { handlers, ripples } = useElementInteraction({
|
|
19
|
+
mode: disableRipple ? "none" : undefined,
|
|
19
20
|
disabled,
|
|
20
21
|
onClick,
|
|
21
22
|
onBlur,
|
|
@@ -37,7 +38,9 @@ import { navItemLink } from "./navItemStyles.js";
|
|
|
37
38
|
});
|
|
38
39
|
useEffect(()=>{
|
|
39
40
|
const link = linkRef.current;
|
|
40
|
-
if (!active || !link || disableScrollIntoView || document.activeElement === link
|
|
41
|
+
if (!active || !link || disableScrollIntoView || document.activeElement === link || // do not scroll into view if the collapse transition is occurring since
|
|
42
|
+
// it makes it animate weirdly
|
|
43
|
+
link.closest(".rmd-collapse--enter")) {
|
|
41
44
|
return;
|
|
42
45
|
}
|
|
43
46
|
link.scrollIntoView({
|
|
@@ -52,6 +55,7 @@ import { navItemLink } from "./navItemStyles.js";
|
|
|
52
55
|
...liProps,
|
|
53
56
|
children: [
|
|
54
57
|
/*#__PURE__*/ _jsxs(Component, {
|
|
58
|
+
"aria-current": active ? "page" : undefined,
|
|
55
59
|
...remaining,
|
|
56
60
|
...handlers,
|
|
57
61
|
...elementProps,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/navigation/NavItemLink.tsx"],"sourcesContent":["\"use client\";\nimport {\n forwardRef,\n useEffect,\n type AnchorHTMLAttributes,\n type LiHTMLAttributes,\n} from \"react\";\nimport { cssUtils } from \"../cssUtils.js\";\nimport { useElementInteraction } from \"../interaction/useElementInteraction.js\";\nimport { Tooltip } from \"../tooltip/Tooltip.js\";\nimport { useTooltip } from \"../tooltip/useTooltip.js\";\nimport { type PropsWithRef } from \"../types.js\";\nimport { useEnsuredRef } from \"../useEnsuredRef.js\";\nimport { NavItem } from \"./NavItem.js\";\nimport { navItemLink } from \"./navItemStyles.js\";\nimport {\n type NavItemContentProps,\n type NavigationLinkComponent,\n} from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface NavItemLinkProps\n extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"children\">,\n NavItemContentProps {\n /** @defaultValue `\"a\"` */\n as?: NavigationLinkComponent;\n href: string;\n\n /**\n * Any additional props to provide the wrapping `<li>` element such as\n * `style`, `className`, and `ref`.\n */\n liProps?: PropsWithRef<LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>;\n\n /**\n * Set this to `true` if the link matches the current `pathname`. This will\n * enable `aria-current=\"true\"` and apply active styling.\n */\n active: boolean;\n\n /** @defaultValue `cssUtils({ fontWeight: \"bold\" })` */\n activeClassName?: string;\n\n /** @defaultValue `!to && !href` */\n disabled?: boolean;\n\n /**\n * Set this to `true` to prevent this item from scrolling into view when it\n * becomes active. It is generally recommended to keep this `
|
|
1
|
+
{"version":3,"sources":["../../src/navigation/NavItemLink.tsx"],"sourcesContent":["\"use client\";\nimport {\n forwardRef,\n useEffect,\n type AnchorHTMLAttributes,\n type LiHTMLAttributes,\n} from \"react\";\nimport { cssUtils } from \"../cssUtils.js\";\nimport { type ComponentWithRippleProps } from \"../interaction/types.js\";\nimport { useElementInteraction } from \"../interaction/useElementInteraction.js\";\nimport { Tooltip } from \"../tooltip/Tooltip.js\";\nimport { useTooltip } from \"../tooltip/useTooltip.js\";\nimport { type PropsWithRef } from \"../types.js\";\nimport { useEnsuredRef } from \"../useEnsuredRef.js\";\nimport { NavItem } from \"./NavItem.js\";\nimport { navItemLink } from \"./navItemStyles.js\";\nimport {\n type NavItemContentProps,\n type NavigationLinkComponent,\n} from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface NavItemLinkProps\n extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"children\">,\n NavItemContentProps,\n ComponentWithRippleProps {\n /** @defaultValue `\"a\"` */\n as?: NavigationLinkComponent;\n href: string;\n\n /**\n * Any additional props to provide the wrapping `<li>` element such as\n * `style`, `className`, and `ref`.\n */\n liProps?: PropsWithRef<LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>;\n\n /**\n * Set this to `true` if the link matches the current `pathname`. This will\n * enable `aria-current=\"true\"` and apply active styling.\n */\n active: boolean;\n\n /** @defaultValue `cssUtils({ fontWeight: \"bold\" })` */\n activeClassName?: string;\n\n /** @defaultValue `!to && !href` */\n disabled?: boolean;\n\n /**\n * Set this to `true` to prevent this item from scrolling into view when it\n * becomes active. It is generally recommended to keep this `false` unless a\n * custom implementation has been added so that when the temporary navigation\n * will show the active route.\n *\n * @defaultValue `false`\n */\n disableScrollIntoView?: boolean;\n}\n\n/**\n * **Client Component**\n *\n * @since 6.0.0\n */\nexport const NavItemLink = forwardRef<HTMLAnchorElement, NavItemLinkProps>(\n function NavItemLink(props, propRef) {\n const {\n as: Component = \"a\",\n href,\n active,\n activeClassName,\n beforeAddon,\n afterAddon,\n className,\n children,\n liProps,\n spanProps,\n disabled = !href,\n onClick,\n onBlur,\n onDragStart,\n onKeyDown,\n onKeyUp,\n onMouseDown,\n onMouseLeave,\n onMouseUp,\n onTouchMove,\n onTouchEnd,\n onTouchStart,\n tooltipOptions,\n disableRipple,\n disableScrollIntoView,\n ...remaining\n } = props;\n\n const [linkRef, linkRefCallback] = useEnsuredRef(propRef);\n const { handlers, ripples } = useElementInteraction({\n mode: disableRipple ? \"none\" : undefined,\n disabled,\n onClick,\n onBlur,\n onDragStart,\n onKeyDown,\n onKeyUp,\n onMouseDown,\n onMouseLeave,\n onMouseUp,\n onTouchMove,\n onTouchEnd,\n onTouchStart,\n });\n\n const { elementProps, tooltipProps, overflowRef } = useTooltip({\n overflowOnly: true,\n defaultPosition: \"right\",\n ...tooltipOptions,\n ...handlers,\n });\n useEffect(() => {\n const link = linkRef.current;\n if (\n !active ||\n !link ||\n disableScrollIntoView ||\n document.activeElement === link ||\n // do not scroll into view if the collapse transition is occurring since\n // it makes it animate weirdly\n link.closest(\".rmd-collapse--enter\")\n ) {\n return;\n }\n\n link.scrollIntoView({ block: \"center\" });\n }, [active, disableScrollIntoView, linkRef]);\n\n return (\n <NavItem {...liProps}>\n <Component\n aria-current={active ? \"page\" : undefined}\n {...remaining}\n {...handlers}\n {...elementProps}\n ref={linkRefCallback}\n href={href}\n className={navItemLink({\n active,\n activeClassName,\n className,\n })}\n >\n {beforeAddon}\n <span\n {...spanProps}\n ref={overflowRef}\n className={cssUtils({\n className: spanProps?.className,\n textOverflow: \"ellipsis\",\n })}\n >\n {children}\n </span>\n {afterAddon}\n {ripples}\n </Component>\n <Tooltip {...tooltipProps}>{children}</Tooltip>\n </NavItem>\n );\n }\n);\n"],"names":["forwardRef","useEffect","cssUtils","useElementInteraction","Tooltip","useTooltip","useEnsuredRef","NavItem","navItemLink","NavItemLink","props","propRef","as","Component","href","active","activeClassName","beforeAddon","afterAddon","className","children","liProps","spanProps","disabled","onClick","onBlur","onDragStart","onKeyDown","onKeyUp","onMouseDown","onMouseLeave","onMouseUp","onTouchMove","onTouchEnd","onTouchStart","tooltipOptions","disableRipple","disableScrollIntoView","remaining","linkRef","linkRefCallback","handlers","ripples","mode","undefined","elementProps","tooltipProps","overflowRef","overflowOnly","defaultPosition","link","current","document","activeElement","closest","scrollIntoView","block","aria-current","ref","span","textOverflow"],"mappings":"AAAA;;AACA,SACEA,UAAU,EACVC,SAAS,QAGJ,QAAQ;AACf,SAASC,QAAQ,QAAQ,iBAAiB;AAE1C,SAASC,qBAAqB,QAAQ,0CAA0C;AAChF,SAASC,OAAO,QAAQ,wBAAwB;AAChD,SAASC,UAAU,QAAQ,2BAA2B;AAEtD,SAASC,aAAa,QAAQ,sBAAsB;AACpD,SAASC,OAAO,QAAQ,eAAe;AACvC,SAASC,WAAW,QAAQ,qBAAqB;AA8CjD;;;;CAIC,GACD,OAAO,MAAMC,4BAAcT,WACzB,SAASS,YAAYC,KAAK,EAAEC,OAAO;IACjC,MAAM,EACJC,IAAIC,YAAY,GAAG,EACnBC,IAAI,EACJC,MAAM,EACNC,eAAe,EACfC,WAAW,EACXC,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,OAAO,EACPC,SAAS,EACTC,WAAW,CAACT,IAAI,EAChBU,OAAO,EACPC,MAAM,EACNC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,WAAW,EACXC,YAAY,EACZC,SAAS,EACTC,WAAW,EACXC,UAAU,EACVC,YAAY,EACZC,cAAc,EACdC,aAAa,EACbC,qBAAqB,EACrB,GAAGC,WACJ,GAAG5B;IAEJ,MAAM,CAAC6B,SAASC,gBAAgB,GAAGlC,cAAcK;IACjD,MAAM,EAAE8B,QAAQ,EAAEC,OAAO,EAAE,GAAGvC,sBAAsB;QAClDwC,MAAMP,gBAAgB,SAASQ;QAC/BrB;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;IACF;IAEA,MAAM,EAAEW,YAAY,EAAEC,YAAY,EAAEC,WAAW,EAAE,GAAG1C,WAAW;QAC7D2C,cAAc;QACdC,iBAAiB;QACjB,GAAGd,cAAc;QACjB,GAAGM,QAAQ;IACb;IACAxC,UAAU;QACR,MAAMiD,OAAOX,QAAQY,OAAO;QAC5B,IACE,CAACpC,UACD,CAACmC,QACDb,yBACAe,SAASC,aAAa,KAAKH,QAC3B,wEAAwE;QACxE,8BAA8B;QAC9BA,KAAKI,OAAO,CAAC,yBACb;YACA;QACF;QAEAJ,KAAKK,cAAc,CAAC;YAAEC,OAAO;QAAS;IACxC,GAAG;QAACzC;QAAQsB;QAAuBE;KAAQ;IAE3C,qBACE,MAAChC;QAAS,GAAGc,OAAO;;0BAClB,MAACR;gBACC4C,gBAAc1C,SAAS,SAAS6B;gBAC/B,GAAGN,SAAS;gBACZ,GAAGG,QAAQ;gBACX,GAAGI,YAAY;gBAChBa,KAAKlB;gBACL1B,MAAMA;gBACNK,WAAWX,YAAY;oBACrBO;oBACAC;oBACAG;gBACF;;oBAECF;kCACD,KAAC0C;wBACE,GAAGrC,SAAS;wBACboC,KAAKX;wBACL5B,WAAWjB,SAAS;4BAClBiB,WAAWG,WAAWH;4BACtByC,cAAc;wBAChB;kCAECxC;;oBAEFF;oBACAwB;;;0BAEH,KAACtC;gBAAS,GAAG0C,YAAY;0BAAG1B;;;;AAGlC,GACA"}
|
|
@@ -2,12 +2,11 @@ import { type ListSubheaderProps } from "../list/ListSubheader.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* @since 6.0.0
|
|
4
4
|
*/
|
|
5
|
-
export
|
|
6
|
-
}
|
|
5
|
+
export type NavSubheaderProps = ListSubheaderProps;
|
|
7
6
|
/**
|
|
8
7
|
* A simple wrapper around the {@Link ListSubheader} that updates the padding
|
|
9
8
|
* based on the current navigation item depth to match the other items.
|
|
10
9
|
*
|
|
11
10
|
* @since 6.0.0
|
|
12
11
|
*/
|
|
13
|
-
export declare const NavSubheader: import("react").ForwardRefExoticComponent<
|
|
12
|
+
export declare const NavSubheader: import("react").ForwardRefExoticComponent<ListSubheaderProps & import("react").RefAttributes<HTMLLIElement>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/navigation/NavSubheader.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport {\n ListSubheader,\n type ListSubheaderProps,\n} from \"../list/ListSubheader.js\";\nimport { navItem } from \"./navItemStyles.js\";\n\n/**\n * @since 6.0.0\n */\nexport
|
|
1
|
+
{"version":3,"sources":["../../src/navigation/NavSubheader.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport {\n ListSubheader,\n type ListSubheaderProps,\n} from \"../list/ListSubheader.js\";\nimport { navItem } from \"./navItemStyles.js\";\n\n/**\n * @since 6.0.0\n */\nexport type NavSubheaderProps = ListSubheaderProps;\n\n/**\n * A simple wrapper around the {@Link ListSubheader} that updates the padding\n * based on the current navigation item depth to match the other items.\n *\n * @since 6.0.0\n */\nexport const NavSubheader = forwardRef<HTMLLIElement, NavSubheaderProps>(\n function NavSubheader(props, ref) {\n const { textProps, ...remaining } = props;\n\n return (\n <ListSubheader\n {...remaining}\n ref={ref}\n textProps={{\n ...textProps,\n className: navItem({ className: textProps?.className }),\n }}\n />\n );\n }\n);\n"],"names":["forwardRef","ListSubheader","navItem","NavSubheader","props","ref","textProps","remaining","className"],"mappings":";AAAA,SAASA,UAAU,QAAQ,QAAQ;AACnC,SACEC,aAAa,QAER,2BAA2B;AAClC,SAASC,OAAO,QAAQ,qBAAqB;AAO7C;;;;;CAKC,GACD,OAAO,MAAMC,6BAAeH,WAC1B,SAASG,aAAaC,KAAK,EAAEC,GAAG;IAC9B,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAW,GAAGH;IAEpC,qBACE,KAACH;QACE,GAAGM,SAAS;QACbF,KAAKA;QACLC,WAAW;YACT,GAAGA,SAAS;YACZE,WAAWN,QAAQ;gBAAEM,WAAWF,WAAWE;YAAU;QACvD;;AAGN,GACA"}
|
|
@@ -21,7 +21,7 @@ export interface NavigationProps<Item extends NavigationItem = NavigationItem, D
|
|
|
21
21
|
/** @see {@link DefaultNavigationRenderer} */
|
|
22
22
|
render?: ComponentType<RenderRecursiveItemsProps<Item, Data>>;
|
|
23
23
|
/** @see {@link getRecursiveNavItemKey} */
|
|
24
|
-
getItemKey
|
|
24
|
+
getItemKey?: (options: RecursiveItemKeyOptions<Item>) => string;
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
27
|
* **Client Component**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/navigation/Navigation.tsx"],"sourcesContent":["import { type ComponentType, type ReactElement } from \"react\";\nimport { type ListProps } from \"../list/List.js\";\nimport {\n RenderRecursively,\n getRecursiveItemKey,\n type RecursiveItem,\n type RecursiveItemKeyOptions,\n type RenderRecursiveItemsProps,\n} from \"../utils/RenderRecursively.js\";\nimport { DefaultNavigationRenderer } from \"./DefaultNavigationRenderer.js\";\nimport { NavGroup } from \"./NavGroup.js\";\nimport { type NavigationItem, type NavigationRenderData } from \"./types.js\";\n\n/**\n * The default implementation for the nav item keys. It will attempt to set the\n * key in the following order:\n * - `href` if it exists and has length\n * - `children` if it's a string and has length\n * - default {@link getRecursiveItemKey} behavior of `${depth}-${index}`\n *\n * @since 6.0.0\n */\nexport function getRecursiveNavItemKey<\n Item extends NavigationItem = NavigationItem,\n>(options: RecursiveItemKeyOptions<Item>): string {\n const { item } = options;\n // if it's a route, try setting the key to the href since they are generally\n // unique\n if (\"href\" in item && item.href) {\n return item.href;\n }\n\n // if children exist in the item (group, route, subheader), try to set that as\n // the key since they are usually unique\n if (\n \"children\" in item &&\n typeof item.children === \"string\" &&\n item.children\n ) {\n return item.children;\n }\n\n // use the default key behavior if all else fails\n return getRecursiveItemKey(options);\n}\n\n/**\n * @since 6.0.0\n */\nexport interface NavigationProps<\n Item extends NavigationItem = NavigationItem,\n Data extends NavigationRenderData = NavigationRenderData,\n> extends Omit<ListProps, \"children\"> {\n data: Data;\n items: readonly RecursiveItem<Item>[];\n\n /** @see {@link DefaultNavigationRenderer} */\n render?: ComponentType<RenderRecursiveItemsProps<Item, Data>>;\n\n /** @see {@link getRecursiveNavItemKey} */\n getItemKey
|
|
1
|
+
{"version":3,"sources":["../../src/navigation/Navigation.tsx"],"sourcesContent":["import { type ComponentType, type ReactElement } from \"react\";\nimport { type ListProps } from \"../list/List.js\";\nimport {\n RenderRecursively,\n getRecursiveItemKey,\n type RecursiveItem,\n type RecursiveItemKeyOptions,\n type RenderRecursiveItemsProps,\n} from \"../utils/RenderRecursively.js\";\nimport { DefaultNavigationRenderer } from \"./DefaultNavigationRenderer.js\";\nimport { NavGroup } from \"./NavGroup.js\";\nimport { type NavigationItem, type NavigationRenderData } from \"./types.js\";\n\n/**\n * The default implementation for the nav item keys. It will attempt to set the\n * key in the following order:\n * - `href` if it exists and has length\n * - `children` if it's a string and has length\n * - default {@link getRecursiveItemKey} behavior of `${depth}-${index}`\n *\n * @since 6.0.0\n */\nexport function getRecursiveNavItemKey<\n Item extends NavigationItem = NavigationItem,\n>(options: RecursiveItemKeyOptions<Item>): string {\n const { item } = options;\n // if it's a route, try setting the key to the href since they are generally\n // unique\n if (\"href\" in item && item.href) {\n return item.href;\n }\n\n // if children exist in the item (group, route, subheader), try to set that as\n // the key since they are usually unique\n if (\n \"children\" in item &&\n typeof item.children === \"string\" &&\n item.children\n ) {\n return item.children;\n }\n\n // use the default key behavior if all else fails\n return getRecursiveItemKey(options);\n}\n\n/**\n * @since 6.0.0\n */\nexport interface NavigationProps<\n Item extends NavigationItem = NavigationItem,\n Data extends NavigationRenderData = NavigationRenderData,\n> extends Omit<ListProps, \"children\"> {\n data: Data;\n items: readonly RecursiveItem<Item>[];\n\n /** @see {@link DefaultNavigationRenderer} */\n render?: ComponentType<RenderRecursiveItemsProps<Item, Data>>;\n\n /** @see {@link getRecursiveNavItemKey} */\n getItemKey?: (options: RecursiveItemKeyOptions<Item>) => string;\n}\n\n/**\n * **Client Component**\n *\n * @since 6.0.0\n */\nexport function Navigation<\n Item extends NavigationItem,\n Data extends NavigationRenderData,\n>(props: NavigationProps<Item, Data>): ReactElement {\n const {\n data,\n items,\n render = DefaultNavigationRenderer,\n getItemKey = getRecursiveNavItemKey,\n ...remaining\n } = props;\n\n return (\n <NavGroup depth={0} {...remaining}>\n <RenderRecursively\n data={data}\n items={items}\n render={render}\n getItemKey={getItemKey}\n />\n </NavGroup>\n );\n}\n"],"names":["RenderRecursively","getRecursiveItemKey","DefaultNavigationRenderer","NavGroup","getRecursiveNavItemKey","options","item","href","children","Navigation","props","data","items","render","getItemKey","remaining","depth"],"mappings":";AAEA,SACEA,iBAAiB,EACjBC,mBAAmB,QAId,gCAAgC;AACvC,SAASC,yBAAyB,QAAQ,iCAAiC;AAC3E,SAASC,QAAQ,QAAQ,gBAAgB;AAGzC;;;;;;;;CAQC,GACD,OAAO,SAASC,uBAEdC,OAAsC;IACtC,MAAM,EAAEC,IAAI,EAAE,GAAGD;IACjB,4EAA4E;IAC5E,SAAS;IACT,IAAI,UAAUC,QAAQA,KAAKC,IAAI,EAAE;QAC/B,OAAOD,KAAKC,IAAI;IAClB;IAEA,8EAA8E;IAC9E,wCAAwC;IACxC,IACE,cAAcD,QACd,OAAOA,KAAKE,QAAQ,KAAK,YACzBF,KAAKE,QAAQ,EACb;QACA,OAAOF,KAAKE,QAAQ;IACtB;IAEA,iDAAiD;IACjD,OAAOP,oBAAoBI;AAC7B;AAmBA;;;;CAIC,GACD,OAAO,SAASI,WAGdC,KAAkC;IAClC,MAAM,EACJC,IAAI,EACJC,KAAK,EACLC,SAASX,yBAAyB,EAClCY,aAAaV,sBAAsB,EACnC,GAAGW,WACJ,GAAGL;IAEJ,qBACE,KAACP;QAASa,OAAO;QAAI,GAAGD,SAAS;kBAC/B,cAAA,KAACf;YACCW,MAAMA;YACNC,OAAOA;YACPC,QAAQA;YACRC,YAAYA;;;AAIpB"}
|
|
@@ -55,11 +55,6 @@ $variables: (border-radius, horizontal-padding, padding-incrementor);
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
.rmd-nav-item {
|
|
58
|
-
@include utils.rtl {
|
|
59
|
-
@include use-var(padding-left, horizontal-padding);
|
|
60
|
-
|
|
61
|
-
padding-right: $increasing-padding;
|
|
62
|
-
}
|
|
63
58
|
@include use-var(padding-right, horizontal-padding);
|
|
64
59
|
|
|
65
60
|
padding-left: $increasing-padding;
|
|
@@ -93,6 +88,12 @@ $variables: (border-radius, horizontal-padding, padding-incrementor);
|
|
|
93
88
|
opacity: 1;
|
|
94
89
|
}
|
|
95
90
|
}
|
|
91
|
+
|
|
92
|
+
@include utils.rtl {
|
|
93
|
+
@include use-var(padding-left, horizontal-padding);
|
|
94
|
+
|
|
95
|
+
padding-right: $increasing-padding;
|
|
96
|
+
}
|
|
96
97
|
}
|
|
97
98
|
}
|
|
98
99
|
}
|
|
@@ -36,13 +36,15 @@ export interface NavigationItemSubheader extends ListSubheaderProps {
|
|
|
36
36
|
* @example Route Group Output
|
|
37
37
|
* ```tsx
|
|
38
38
|
* const nextParents = [item, ...parents];
|
|
39
|
+
* const id = getNavigationGroupId(item, nextParents);
|
|
39
40
|
* return (
|
|
40
41
|
* <CollapsibleNavGroup
|
|
41
|
-
* depth={nextParents.length}
|
|
42
|
-
*
|
|
43
|
-
* !data.pathname.includes(getHrefFromParents(nextParents))
|
|
44
|
-
* }
|
|
42
|
+
* depth={nextParents.length}
|
|
43
|
+
* collapsed={!data?.expandedItems.has(id)}
|
|
45
44
|
* buttonChildren={item.children}
|
|
45
|
+
* toggleCollapsed={() => {
|
|
46
|
+
* data?.toggleExpandedItem(id);
|
|
47
|
+
* }}
|
|
46
48
|
* >
|
|
47
49
|
* {children}
|
|
48
50
|
* </CollapsibleNavGroup>
|
|
@@ -55,6 +57,41 @@ export interface NavigationItemSubheader extends ListSubheaderProps {
|
|
|
55
57
|
*/
|
|
56
58
|
export interface NavigationItemGroup {
|
|
57
59
|
type: "group";
|
|
60
|
+
/**
|
|
61
|
+
* An optional unique id to identify the group used for handling the expanded
|
|
62
|
+
* state when the `href` can't be used.
|
|
63
|
+
*/
|
|
64
|
+
id?: string;
|
|
65
|
+
/**
|
|
66
|
+
* An optional href to prefix all child routes with and can be used instead of
|
|
67
|
+
* the {@link id} for handling the expanded state.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```ts
|
|
71
|
+
* {
|
|
72
|
+
* type: "group",
|
|
73
|
+
* href: "/some-path",
|
|
74
|
+
* children: "Some Name",
|
|
75
|
+
* items: [
|
|
76
|
+
* {
|
|
77
|
+
* type: "route",
|
|
78
|
+
* href: "/page-1",
|
|
79
|
+
* children: "Page 1",
|
|
80
|
+
* },
|
|
81
|
+
* {
|
|
82
|
+
* type: "route",
|
|
83
|
+
* href: "/page-2",
|
|
84
|
+
* children: "Page 2",
|
|
85
|
+
* },
|
|
86
|
+
* ],
|
|
87
|
+
* }
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* Would result in:
|
|
91
|
+
*
|
|
92
|
+
* - Page 1 - `/some-path/page-1`
|
|
93
|
+
* - Page 2 - `/some-path/page-2`
|
|
94
|
+
*/
|
|
58
95
|
href?: string;
|
|
59
96
|
children: ReactNode;
|
|
60
97
|
items: readonly NavigationItem[];
|
|
@@ -77,13 +114,24 @@ export type NavigationItem = NavigationItemDivider | NavigationItemSubheader | N
|
|
|
77
114
|
/**
|
|
78
115
|
* @since 6.0.0
|
|
79
116
|
*/
|
|
80
|
-
export type
|
|
117
|
+
export type CustomNavigationLinkComponent = ForwardRefExoticComponent<AnchorHTMLAttributes<HTMLAnchorElement> & {
|
|
81
118
|
href: string;
|
|
82
119
|
}>;
|
|
83
120
|
/**
|
|
84
121
|
* @since 6.0.0
|
|
85
122
|
*/
|
|
86
|
-
export
|
|
123
|
+
export type NavigationLinkComponent = "a" | CustomNavigationLinkComponent;
|
|
124
|
+
/**
|
|
125
|
+
* @since 6.0.0
|
|
126
|
+
*/
|
|
127
|
+
export interface NavigationExpansion {
|
|
128
|
+
expandedItems: ReadonlySet<string>;
|
|
129
|
+
toggleExpandedItem: (id: string) => void;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* @since 6.0.0
|
|
133
|
+
*/
|
|
134
|
+
export interface NavigationRenderData extends NavigationExpansion {
|
|
87
135
|
/**
|
|
88
136
|
* This is used to set the `active` state on a `NavItemLink`
|
|
89
137
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/navigation/types.ts"],"sourcesContent":["import {\n type AnchorHTMLAttributes,\n type ForwardRefExoticComponent,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { type DividerProps } from \"../divider/Divider.js\";\nimport { type ListSubheaderProps } from \"../list/ListSubheader.js\";\nimport {\n type TooltipOptions,\n type TooltippedElementEventHandlers,\n} from \"../tooltip/useTooltip.js\";\n\n/**\n * Used to add a `Divider` to the navigation list.\n * @example Output\n * ```tsx\n * const { type, ...props } = item;\n * return <Divider {...props} />;\n * ```\n *\n * @since 6.0.0\n */\nexport interface NavigationItemDivider extends DividerProps {\n type: \"divider\";\n}\n\n/**\n * Used to add a `ListSubheader` to the navigation list.\n * @example Output\n * ```tsx\n * const { type, ...props } = item;\n * return <ListSubheader {...props} />;\n * ```\n *\n * @since 6.0.0\n */\nexport interface NavigationItemSubheader extends ListSubheaderProps {\n type: \"subheader\";\n children: ReactNode;\n}\n\n/**\n * This is used to either create a route group which update all child routes to\n * be prefixed with the optional `href`.\n *\n * @example Route Group Output\n * ```tsx\n * const nextParents = [item, ...parents];\n * return (\n * <CollapsibleNavGroup\n * depth={nextParents.length}
|
|
1
|
+
{"version":3,"sources":["../../src/navigation/types.ts"],"sourcesContent":["import {\n type AnchorHTMLAttributes,\n type ForwardRefExoticComponent,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { type DividerProps } from \"../divider/Divider.js\";\nimport { type ListSubheaderProps } from \"../list/ListSubheader.js\";\nimport {\n type TooltipOptions,\n type TooltippedElementEventHandlers,\n} from \"../tooltip/useTooltip.js\";\n\n/**\n * Used to add a `Divider` to the navigation list.\n * @example Output\n * ```tsx\n * const { type, ...props } = item;\n * return <Divider {...props} />;\n * ```\n *\n * @since 6.0.0\n */\nexport interface NavigationItemDivider extends DividerProps {\n type: \"divider\";\n}\n\n/**\n * Used to add a `ListSubheader` to the navigation list.\n * @example Output\n * ```tsx\n * const { type, ...props } = item;\n * return <ListSubheader {...props} />;\n * ```\n *\n * @since 6.0.0\n */\nexport interface NavigationItemSubheader extends ListSubheaderProps {\n type: \"subheader\";\n children: ReactNode;\n}\n\n/**\n * This is used to either create a route group which update all child routes to\n * be prefixed with the optional `href`.\n *\n * @example Route Group Output\n * ```tsx\n * const nextParents = [item, ...parents];\n * const id = getNavigationGroupId(item, nextParents);\n * return (\n * <CollapsibleNavGroup\n * depth={nextParents.length}\n * collapsed={!data?.expandedItems.has(id)}\n * buttonChildren={item.children}\n * toggleCollapsed={() => {\n * data?.toggleExpandedItem(id);\n * }}\n * >\n * {children}\n * </CollapsibleNavGroup>\n * );\n * ```\n *\n * Note: `children` are any child `items` that have been rendered.\n *\n * @since 6.0.0\n */\nexport interface NavigationItemGroup {\n type: \"group\";\n\n /**\n * An optional unique id to identify the group used for handling the expanded\n * state when the `href` can't be used.\n */\n id?: string;\n\n /**\n * An optional href to prefix all child routes with and can be used instead of\n * the {@link id} for handling the expanded state.\n *\n * @example\n * ```ts\n * {\n * type: \"group\",\n * href: \"/some-path\",\n * children: \"Some Name\",\n * items: [\n * {\n * type: \"route\",\n * href: \"/page-1\",\n * children: \"Page 1\",\n * },\n * {\n * type: \"route\",\n * href: \"/page-2\",\n * children: \"Page 2\",\n * },\n * ],\n * }\n * ```\n *\n * Would result in:\n *\n * - Page 1 - `/some-path/page-1`\n * - Page 2 - `/some-path/page-2`\n */\n href?: string;\n children: ReactNode;\n items: readonly NavigationItem[];\n}\n\n/**\n * @since 6.0.0\n */\nexport interface NavigationItemRoute {\n type: \"route\";\n href: string;\n children: ReactNode;\n active?: boolean;\n beforeAddon?: ReactNode;\n afterAddon?: ReactNode;\n}\n\n/**\n * @since 6.0.0\n */\nexport type NavigationItem =\n | NavigationItemDivider\n | NavigationItemSubheader\n | NavigationItemGroup\n | NavigationItemRoute;\n\n/**\n * @since 6.0.0\n */\nexport type CustomNavigationLinkComponent = ForwardRefExoticComponent<\n AnchorHTMLAttributes<HTMLAnchorElement> & { href: string }\n>;\n\n/**\n * @since 6.0.0\n */\nexport type NavigationLinkComponent = \"a\" | CustomNavigationLinkComponent;\n\n/**\n * @since 6.0.0\n */\nexport interface NavigationExpansion {\n expandedItems: ReadonlySet<string>;\n toggleExpandedItem: (id: string) => void;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface NavigationRenderData extends NavigationExpansion {\n /**\n * This is used to set the `active` state on a `NavItemLink`\n */\n pathname: string;\n linkComponent: NavigationLinkComponent;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface NavItemContentProps {\n /**\n * Any additional props to provide the `<span>` element that wraps the\n * children such as `style`, `className`, and `ref`.\n */\n spanProps?: HTMLAttributes<HTMLSpanElement>;\n\n /**\n * An optional addon to render before the `children` and will not be wrapped\n * in the `span` that adds ellipsis overflow.\n */\n beforeAddon?: ReactNode;\n\n /**\n * An optional addon to render after the `children` and will not be wrapped\n * in the `span` that adds ellipsis overflow.\n */\n afterAddon?: ReactNode;\n\n /**\n * This should contain accessible text for the page that this will link to and\n * will automatically be truncated with ellipsis if it is too large. A tooltip\n * will also appear only when it has been truncated.\n */\n children: ReactNode;\n\n /**\n * This most likely will never need to be used, but it's a way to override any\n * tooltip options. The default behavior will position the tooltip to the\n * right and only appear if the `children` are overflown.\n *\n * @example Customize\n * ```tsx\n * <NavItemLink\n * {...props}\n * tooltipOptions={{\n * overflowOnly: false,\n * defaultPosition: \"above\",\n * vhMargin: \"1rem\",\n * vwMargin: \"1rem\",\n * }}\n * >\n * ```\n */\n tooltipOptions?: Omit<\n TooltipOptions<HTMLAnchorElement>,\n keyof TooltippedElementEventHandlers<HTMLAnchorElement>\n >;\n}\n"],"names":[],"mappings":"AAoKA;;CAEC,GACD,WAgDC"}
|
|
@@ -39,7 +39,7 @@ export interface ActiveHeadingIdOptions {
|
|
|
39
39
|
/** @see {@link DEFAULT_ACTIVE_HEADING_THRESHOLD} */
|
|
40
40
|
threshold?: IntersectionObserverThreshold;
|
|
41
41
|
/** @see {@link DEFAULT_ACTIVE_HEADING_GET_ROOT_MARGIN} */
|
|
42
|
-
getRootMargin
|
|
42
|
+
getRootMargin?: () => IntersectionObserverRootMargin;
|
|
43
43
|
/** @defaultValue `headings[0]?.id ?? ""` */
|
|
44
44
|
defaultActiveId?: UseStateInitializer<string>;
|
|
45
45
|
/** @defaultValue `0.8` */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/navigation/useActiveHeadingId.ts"],"sourcesContent":["\"use client\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { type UseStateInitializer } from \"../types.js\";\nimport {\n useIntersectionObserver,\n type IntersectionObserverRootMargin,\n type IntersectionObserverThreshold,\n} from \"../useIntersectionObserver.js\";\nimport { parseCssLengthUnit } from \"../utils/parseCssLengthUnit.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface HeadingReference {\n id: string;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface HeadingReferenceWithChildren extends HeadingReference {\n children?: readonly HeadingReferenceWithChildren[];\n}\n\n/**\n * @defaultValue `[0.0, 1.0]`\n * @since 6.0.0\n */\nexport const DEFAULT_ACTIVE_HEADING_THRESHOLD: IntersectionObserverThreshold = [\n 0.0, 1.0,\n];\n\n/**\n * ```tsx\n * const headerHeightVar = window\n * .getComputedStyle(document.documentElement)\n * .getPropertyValue(\"--rmd-layout-header-height\");\n * const headerHeight = parseCssLengthUnit({\n * value: headerHeightVar || \"3.5rem\",\n * });\n\n * return `-${headerHeight}px 0px 0px 0px`;\n * ```\n * @since 6.0.0\n */\nexport const DEFAULT_ACTIVE_HEADING_GET_ROOT_MARGIN = (): string => {\n const headerHeightVar = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue(\"--rmd-layout-header-height\");\n const headerHeight = parseCssLengthUnit({\n value: headerHeightVar || \"3.5rem\",\n });\n\n return `-${headerHeight}px 0px 0px 0px`;\n};\n\n/**\n * @internal\n * @since 6.0.0\n */\nfunction getHeadingElements(\n items: readonly HeadingReferenceWithChildren[]\n): HTMLElement[] {\n const headings: HTMLElement[] = [];\n items.forEach((item) => {\n const heading = document.getElementById(item.id);\n if (heading) {\n headings.push(heading);\n }\n\n if (item.children) {\n headings.push(...getHeadingElements(item.children));\n }\n });\n\n return headings;\n}\n\n/**\n * @internal\n * @since 6.0.0\n */\nfunction getLastHeadingId(\n items: readonly HeadingReferenceWithChildren[]\n): string {\n const last = items.at(-1);\n if (!last) {\n return \"\";\n }\n\n if (last.children) {\n return getLastHeadingId(last.children);\n }\n\n return last.id;\n}\n\n/**\n * @internal\n * @since 6.0.0\n */\nconst isScrolledNearPageBottom = (threshold: number): boolean =>\n window.scrollY >= document.documentElement.scrollHeight * threshold;\n\n/**\n * @since 6.0.0\n */\nexport interface ActiveHeadingIdOptions {\n headings: readonly HeadingReferenceWithChildren[];\n\n /** @see {@link DEFAULT_ACTIVE_HEADING_THRESHOLD} */\n threshold?: IntersectionObserverThreshold;\n\n /** @see {@link DEFAULT_ACTIVE_HEADING_GET_ROOT_MARGIN} */\n getRootMargin
|
|
1
|
+
{"version":3,"sources":["../../src/navigation/useActiveHeadingId.ts"],"sourcesContent":["\"use client\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { type UseStateInitializer } from \"../types.js\";\nimport {\n useIntersectionObserver,\n type IntersectionObserverRootMargin,\n type IntersectionObserverThreshold,\n} from \"../useIntersectionObserver.js\";\nimport { parseCssLengthUnit } from \"../utils/parseCssLengthUnit.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface HeadingReference {\n id: string;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface HeadingReferenceWithChildren extends HeadingReference {\n children?: readonly HeadingReferenceWithChildren[];\n}\n\n/**\n * @defaultValue `[0.0, 1.0]`\n * @since 6.0.0\n */\nexport const DEFAULT_ACTIVE_HEADING_THRESHOLD: IntersectionObserverThreshold = [\n 0.0, 1.0,\n];\n\n/**\n * ```tsx\n * const headerHeightVar = window\n * .getComputedStyle(document.documentElement)\n * .getPropertyValue(\"--rmd-layout-header-height\");\n * const headerHeight = parseCssLengthUnit({\n * value: headerHeightVar || \"3.5rem\",\n * });\n\n * return `-${headerHeight}px 0px 0px 0px`;\n * ```\n * @since 6.0.0\n */\nexport const DEFAULT_ACTIVE_HEADING_GET_ROOT_MARGIN = (): string => {\n const headerHeightVar = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue(\"--rmd-layout-header-height\");\n const headerHeight = parseCssLengthUnit({\n value: headerHeightVar || \"3.5rem\",\n });\n\n return `-${headerHeight}px 0px 0px 0px`;\n};\n\n/**\n * @internal\n * @since 6.0.0\n */\nfunction getHeadingElements(\n items: readonly HeadingReferenceWithChildren[]\n): HTMLElement[] {\n const headings: HTMLElement[] = [];\n items.forEach((item) => {\n const heading = document.getElementById(item.id);\n if (heading) {\n headings.push(heading);\n }\n\n if (item.children) {\n headings.push(...getHeadingElements(item.children));\n }\n });\n\n return headings;\n}\n\n/**\n * @internal\n * @since 6.0.0\n */\nfunction getLastHeadingId(\n items: readonly HeadingReferenceWithChildren[]\n): string {\n const last = items.at(-1);\n if (!last) {\n return \"\";\n }\n\n if (last.children) {\n return getLastHeadingId(last.children);\n }\n\n return last.id;\n}\n\n/**\n * @internal\n * @since 6.0.0\n */\nconst isScrolledNearPageBottom = (threshold: number): boolean =>\n window.scrollY >= document.documentElement.scrollHeight * threshold;\n\n/**\n * @since 6.0.0\n */\nexport interface ActiveHeadingIdOptions {\n headings: readonly HeadingReferenceWithChildren[];\n\n /** @see {@link DEFAULT_ACTIVE_HEADING_THRESHOLD} */\n threshold?: IntersectionObserverThreshold;\n\n /** @see {@link DEFAULT_ACTIVE_HEADING_GET_ROOT_MARGIN} */\n getRootMargin?: () => IntersectionObserverRootMargin;\n\n /** @defaultValue `headings[0]?.id ?? \"\"` */\n defaultActiveId?: UseStateInitializer<string>;\n\n /** @defaultValue `0.8` */\n scrollBottomThreshold?: number;\n}\n\n/**\n * This is heavily inspired by:\n * @see https://github.com/mdn/yari/blob/231d6aab8f1c8efe159d268c261446c5b7ae12d9/client/src/document/hooks.ts#L171\n *\n * @since 6.0.0\n */\nexport function useActiveHeadingId(options: ActiveHeadingIdOptions): string {\n const {\n headings,\n threshold = DEFAULT_ACTIVE_HEADING_THRESHOLD,\n getRootMargin = DEFAULT_ACTIVE_HEADING_GET_ROOT_MARGIN,\n defaultActiveId = headings[0]?.id ?? \"\",\n scrollBottomThreshold = 0.8,\n } = options;\n const elements = useRef<Map<string, boolean>>();\n const isFirstRender = useRef(true);\n const [activeHeadingId, setActiveHeadingId] = useState(defaultActiveId);\n useIntersectionObserver({\n threshold,\n getRootMargin,\n getTargets: useCallback(() => {\n const headingElements = getHeadingElements(headings);\n const lookup = new Map<string, boolean>();\n headingElements.forEach((heading) => {\n lookup.set(heading.id, false);\n });\n elements.current = lookup;\n\n return headingElements;\n }, [headings]),\n onUpdate: useCallback(\n (entries) => {\n const lookup = elements.current;\n if (!lookup) {\n return;\n }\n\n entries.forEach((entry) => {\n lookup.set(entry.target.id, entry.isIntersecting);\n });\n\n // get the first visible/intersecting item and set it\n let foundId = [...lookup.entries()].find(\n ([_id, isIntersecting]) => isIntersecting\n )?.[0];\n if (\n !foundId &&\n isFirstRender.current &&\n isScrolledNearPageBottom(scrollBottomThreshold)\n ) {\n foundId = getLastHeadingId(headings);\n }\n\n isFirstRender.current = false;\n\n // if there isn't a found id, it might be a really large section where\n // another heading isn't visible, so maintain the previous one\n if (foundId) {\n setActiveHeadingId(foundId);\n }\n },\n [headings, scrollBottomThreshold]\n ),\n });\n\n return activeHeadingId;\n}\n"],"names":["useCallback","useRef","useState","useIntersectionObserver","parseCssLengthUnit","DEFAULT_ACTIVE_HEADING_THRESHOLD","DEFAULT_ACTIVE_HEADING_GET_ROOT_MARGIN","headerHeightVar","window","getComputedStyle","document","documentElement","getPropertyValue","headerHeight","value","getHeadingElements","items","headings","forEach","item","heading","getElementById","id","push","children","getLastHeadingId","last","at","isScrolledNearPageBottom","threshold","scrollY","scrollHeight","useActiveHeadingId","options","getRootMargin","defaultActiveId","scrollBottomThreshold","elements","isFirstRender","activeHeadingId","setActiveHeadingId","getTargets","headingElements","lookup","Map","set","current","onUpdate","entries","entry","target","isIntersecting","foundId","find","_id"],"mappings":"AAAA;AACA,SAASA,WAAW,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAQ;AAEtD,SACEC,uBAAuB,QAGlB,gCAAgC;AACvC,SAASC,kBAAkB,QAAQ,iCAAiC;AAgBpE;;;CAGC,GACD,OAAO,MAAMC,mCAAkE;IAC7E;IAAK;CACN,CAAC;AAEF;;;;;;;;;;;;CAYC,GACD,OAAO,MAAMC,yCAAyC;IACpD,MAAMC,kBAAkBC,OACrBC,gBAAgB,CAACC,SAASC,eAAe,EACzCC,gBAAgB,CAAC;IACpB,MAAMC,eAAeT,mBAAmB;QACtCU,OAAOP,mBAAmB;IAC5B;IAEA,OAAO,CAAC,CAAC,EAAEM,aAAa,cAAc,CAAC;AACzC,EAAE;AAEF;;;CAGC,GACD,SAASE,mBACPC,KAA8C;IAE9C,MAAMC,WAA0B,EAAE;IAClCD,MAAME,OAAO,CAAC,CAACC;QACb,MAAMC,UAAUV,SAASW,cAAc,CAACF,KAAKG,EAAE;QAC/C,IAAIF,SAAS;YACXH,SAASM,IAAI,CAACH;QAChB;QAEA,IAAID,KAAKK,QAAQ,EAAE;YACjBP,SAASM,IAAI,IAAIR,mBAAmBI,KAAKK,QAAQ;QACnD;IACF;IAEA,OAAOP;AACT;AAEA;;;CAGC,GACD,SAASQ,iBACPT,KAA8C;IAE9C,MAAMU,OAAOV,MAAMW,EAAE,CAAC,CAAC;IACvB,IAAI,CAACD,MAAM;QACT,OAAO;IACT;IAEA,IAAIA,KAAKF,QAAQ,EAAE;QACjB,OAAOC,iBAAiBC,KAAKF,QAAQ;IACvC;IAEA,OAAOE,KAAKJ,EAAE;AAChB;AAEA;;;CAGC,GACD,MAAMM,2BAA2B,CAACC,YAChCrB,OAAOsB,OAAO,IAAIpB,SAASC,eAAe,CAACoB,YAAY,GAAGF;AAqB5D;;;;;CAKC,GACD,OAAO,SAASG,mBAAmBC,OAA+B;IAChE,MAAM,EACJhB,QAAQ,EACRY,YAAYxB,gCAAgC,EAC5C6B,gBAAgB5B,sCAAsC,EACtD6B,kBAAkBlB,QAAQ,CAAC,EAAE,EAAEK,MAAM,EAAE,EACvCc,wBAAwB,GAAG,EAC5B,GAAGH;IACJ,MAAMI,WAAWpC;IACjB,MAAMqC,gBAAgBrC,OAAO;IAC7B,MAAM,CAACsC,iBAAiBC,mBAAmB,GAAGtC,SAASiC;IACvDhC,wBAAwB;QACtB0B;QACAK;QACAO,YAAYzC,YAAY;YACtB,MAAM0C,kBAAkB3B,mBAAmBE;YAC3C,MAAM0B,SAAS,IAAIC;YACnBF,gBAAgBxB,OAAO,CAAC,CAACE;gBACvBuB,OAAOE,GAAG,CAACzB,QAAQE,EAAE,EAAE;YACzB;YACAe,SAASS,OAAO,GAAGH;YAEnB,OAAOD;QACT,GAAG;YAACzB;SAAS;QACb8B,UAAU/C,YACR,CAACgD;YACC,MAAML,SAASN,SAASS,OAAO;YAC/B,IAAI,CAACH,QAAQ;gBACX;YACF;YAEAK,QAAQ9B,OAAO,CAAC,CAAC+B;gBACfN,OAAOE,GAAG,CAACI,MAAMC,MAAM,CAAC5B,EAAE,EAAE2B,MAAME,cAAc;YAClD;YAEA,qDAAqD;YACrD,IAAIC,UAAU;mBAAIT,OAAOK,OAAO;aAAG,CAACK,IAAI,CACtC,CAAC,CAACC,KAAKH,eAAe,GAAKA,iBAC1B,CAAC,EAAE;YACN,IACE,CAACC,WACDd,cAAcQ,OAAO,IACrBlB,yBAAyBQ,wBACzB;gBACAgB,UAAU3B,iBAAiBR;YAC7B;YAEAqB,cAAcQ,OAAO,GAAG;YAExB,sEAAsE;YACtE,8DAA8D;YAC9D,IAAIM,SAAS;gBACXZ,mBAAmBY;YACrB;QACF,GACA;YAACnC;YAAUmB;SAAsB;IAErC;IAEA,OAAOG;AACT"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { type UseStateInitializer, type UseStateSetter } from "../types.js";
|
|
2
|
+
import { type NavigationExpansion, type NavigationLinkComponent, type NavigationRenderData } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* @since 6.0.0
|
|
5
|
+
*/
|
|
6
|
+
export interface NavigationExpansionOptions {
|
|
7
|
+
pathname: string;
|
|
8
|
+
linkComponent: NavigationLinkComponent;
|
|
9
|
+
/**
|
|
10
|
+
* An optional list or set of items that should be expanded before the user
|
|
11
|
+
* interacts with the navigation items.
|
|
12
|
+
*
|
|
13
|
+
* The default implementation works well with the `DefaultNavigationRenderer`
|
|
14
|
+
* by allowing all "folders" (or groups) of items to be expanded by the
|
|
15
|
+
* `pathname`.
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* const navItems: readonly NavigationItem[] = [
|
|
19
|
+
* {
|
|
20
|
+
* type: "route",
|
|
21
|
+
* href: "/",
|
|
22
|
+
* children: "Home",
|
|
23
|
+
* },
|
|
24
|
+
* {
|
|
25
|
+
* type: "group",
|
|
26
|
+
* href: "/group-1",
|
|
27
|
+
* children: "Group 1",
|
|
28
|
+
* items: [
|
|
29
|
+
* {
|
|
30
|
+
* type: "group",
|
|
31
|
+
* href: "/subgroup-1",
|
|
32
|
+
* children: "Subgroup 1",
|
|
33
|
+
* items: [
|
|
34
|
+
* {
|
|
35
|
+
* type: "route",
|
|
36
|
+
* href: "/route",
|
|
37
|
+
* children: "Group 1 > Subgroup 1 > Route"
|
|
38
|
+
* },
|
|
39
|
+
* ],
|
|
40
|
+
* },
|
|
41
|
+
* {
|
|
42
|
+
* type: "route",
|
|
43
|
+
* href: "/route",
|
|
44
|
+
* children: "Group 1 > Route",
|
|
45
|
+
* },
|
|
46
|
+
* ],
|
|
47
|
+
* },
|
|
48
|
+
* ];
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* - `pathname === "/"` - No groups expanded
|
|
52
|
+
* - Resolves as `new Set(["/"])`
|
|
53
|
+
* - `pathname === "/group-1/subgroup-1/route"` - "Group 1" and "Subgroup 1"
|
|
54
|
+
* are expanded
|
|
55
|
+
* - Resolves as `new Set(["/", "/group-1", "/group-1/route"])`
|
|
56
|
+
*/
|
|
57
|
+
defaultExpandedItems?: UseStateInitializer<ReadonlySet<string> | readonly string[]>;
|
|
58
|
+
/**
|
|
59
|
+
* The default behavior is to update the `expandedItems` set as the `pathname`
|
|
60
|
+
* updates to capture anytime the user might navigate to outer routes outside
|
|
61
|
+
* of the `Navigation` component. i.e. Click a link within the page.
|
|
62
|
+
*
|
|
63
|
+
* Set this to `true` to disable this behavior.
|
|
64
|
+
*
|
|
65
|
+
* @defaultValue `false`
|
|
66
|
+
*/
|
|
67
|
+
disableFollowingPathname?: boolean;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* @since 6.0.0
|
|
71
|
+
*/
|
|
72
|
+
export interface NavigationExpansionImplementation extends NavigationExpansion {
|
|
73
|
+
data: NavigationRenderData;
|
|
74
|
+
setExpandedItems: UseStateSetter<ReadonlySet<string>>;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Used to create the `data` prop for the `Navigation` component and handling
|
|
78
|
+
* the expansion of items.
|
|
79
|
+
*
|
|
80
|
+
* @example Main Usage
|
|
81
|
+
* ```tsx
|
|
82
|
+
* "use client";
|
|
83
|
+
* import { Navigation } from "@react-md/core/navigation/Navigation";
|
|
84
|
+
* import { useNavigationExpansion } from "@react-md/core/navigation/useNavigationExpansion";
|
|
85
|
+
* import Link from "next/link";
|
|
86
|
+
* import { usePathname } from "next/navigation.js";
|
|
87
|
+
* import { type ReactElement } from "react";
|
|
88
|
+
*
|
|
89
|
+
* import { navItems } from "./navItems.js";
|
|
90
|
+
*
|
|
91
|
+
* export function Example(): ReactElement {
|
|
92
|
+
* const pathname = usePathname();
|
|
93
|
+
* const { data } = useNavigationExpansion({
|
|
94
|
+
* pathname,
|
|
95
|
+
* linkComponent: Link,
|
|
96
|
+
* });
|
|
97
|
+
*
|
|
98
|
+
* return <Navigation data={data} items={navItems} />;
|
|
99
|
+
* }
|
|
100
|
+
* ```
|
|
101
|
+
*
|
|
102
|
+
* @since 6.0.0
|
|
103
|
+
*/
|
|
104
|
+
export declare function useNavigationExpansion(options: NavigationExpansionOptions): NavigationExpansionImplementation;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useMemo, useRef } from "react";
|
|
3
|
+
import { useReadonlySet } from "../useReadonlySet.js";
|
|
4
|
+
import { getPartsFromPathname } from "./utils.js";
|
|
5
|
+
/**
|
|
6
|
+
* Used to create the `data` prop for the `Navigation` component and handling
|
|
7
|
+
* the expansion of items.
|
|
8
|
+
*
|
|
9
|
+
* @example Main Usage
|
|
10
|
+
* ```tsx
|
|
11
|
+
* "use client";
|
|
12
|
+
* import { Navigation } from "@react-md/core/navigation/Navigation";
|
|
13
|
+
* import { useNavigationExpansion } from "@react-md/core/navigation/useNavigationExpansion";
|
|
14
|
+
* import Link from "next/link";
|
|
15
|
+
* import { usePathname } from "next/navigation.js";
|
|
16
|
+
* import { type ReactElement } from "react";
|
|
17
|
+
*
|
|
18
|
+
* import { navItems } from "./navItems.js";
|
|
19
|
+
*
|
|
20
|
+
* export function Example(): ReactElement {
|
|
21
|
+
* const pathname = usePathname();
|
|
22
|
+
* const { data } = useNavigationExpansion({
|
|
23
|
+
* pathname,
|
|
24
|
+
* linkComponent: Link,
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* return <Navigation data={data} items={navItems} />;
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @since 6.0.0
|
|
32
|
+
*/ export function useNavigationExpansion(options) {
|
|
33
|
+
const { pathname, linkComponent, defaultExpandedItems, disableFollowingPathname } = options;
|
|
34
|
+
const { value: expandedItems, setValue: setExpandedItems, toggleValue: toggleExpandedItem } = useReadonlySet({
|
|
35
|
+
defaultValue: defaultExpandedItems ?? (()=>new Set(getPartsFromPathname(pathname)))
|
|
36
|
+
});
|
|
37
|
+
const prevPathname = useRef(pathname);
|
|
38
|
+
useEffect(()=>{
|
|
39
|
+
if (disableFollowingPathname || pathname === prevPathname.current) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
prevPathname.current = pathname;
|
|
43
|
+
setExpandedItems((prev)=>{
|
|
44
|
+
const next = new Set([
|
|
45
|
+
...prev,
|
|
46
|
+
...getPartsFromPathname(pathname)
|
|
47
|
+
]);
|
|
48
|
+
if (next.size === prev.size) {
|
|
49
|
+
return prev;
|
|
50
|
+
}
|
|
51
|
+
return next;
|
|
52
|
+
});
|
|
53
|
+
}, [
|
|
54
|
+
disableFollowingPathname,
|
|
55
|
+
pathname,
|
|
56
|
+
setExpandedItems
|
|
57
|
+
]);
|
|
58
|
+
const data = useMemo(()=>({
|
|
59
|
+
pathname,
|
|
60
|
+
linkComponent,
|
|
61
|
+
expandedItems,
|
|
62
|
+
toggleExpandedItem
|
|
63
|
+
}), [
|
|
64
|
+
expandedItems,
|
|
65
|
+
linkComponent,
|
|
66
|
+
pathname,
|
|
67
|
+
toggleExpandedItem
|
|
68
|
+
]);
|
|
69
|
+
return {
|
|
70
|
+
data,
|
|
71
|
+
expandedItems,
|
|
72
|
+
setExpandedItems,
|
|
73
|
+
toggleExpandedItem
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=useNavigationExpansion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/navigation/useNavigationExpansion.ts"],"sourcesContent":["\"use client\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport { type UseStateInitializer, type UseStateSetter } from \"../types.js\";\nimport { useReadonlySet } from \"../useReadonlySet.js\";\nimport {\n type NavigationExpansion,\n type NavigationLinkComponent,\n type NavigationRenderData,\n} from \"./types.js\";\nimport { getPartsFromPathname } from \"./utils.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface NavigationExpansionOptions {\n pathname: string;\n linkComponent: NavigationLinkComponent;\n\n /**\n * An optional list or set of items that should be expanded before the user\n * interacts with the navigation items.\n *\n * The default implementation works well with the `DefaultNavigationRenderer`\n * by allowing all \"folders\" (or groups) of items to be expanded by the\n * `pathname`.\n *\n * ```ts\n * const navItems: readonly NavigationItem[] = [\n * {\n * type: \"route\",\n * href: \"/\",\n * children: \"Home\",\n * },\n * {\n * type: \"group\",\n * href: \"/group-1\",\n * children: \"Group 1\",\n * items: [\n * {\n * type: \"group\",\n * href: \"/subgroup-1\",\n * children: \"Subgroup 1\",\n * items: [\n * {\n * type: \"route\",\n * href: \"/route\",\n * children: \"Group 1 > Subgroup 1 > Route\"\n * },\n * ],\n * },\n * {\n * type: \"route\",\n * href: \"/route\",\n * children: \"Group 1 > Route\",\n * },\n * ],\n * },\n * ];\n * ```\n *\n * - `pathname === \"/\"` - No groups expanded\n * - Resolves as `new Set([\"/\"])`\n * - `pathname === \"/group-1/subgroup-1/route\"` - \"Group 1\" and \"Subgroup 1\"\n * are expanded\n * - Resolves as `new Set([\"/\", \"/group-1\", \"/group-1/route\"])`\n */\n defaultExpandedItems?: UseStateInitializer<\n ReadonlySet<string> | readonly string[]\n >;\n\n /**\n * The default behavior is to update the `expandedItems` set as the `pathname`\n * updates to capture anytime the user might navigate to outer routes outside\n * of the `Navigation` component. i.e. Click a link within the page.\n *\n * Set this to `true` to disable this behavior.\n *\n * @defaultValue `false`\n */\n disableFollowingPathname?: boolean;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface NavigationExpansionImplementation extends NavigationExpansion {\n data: NavigationRenderData;\n setExpandedItems: UseStateSetter<ReadonlySet<string>>;\n}\n\n/**\n * Used to create the `data` prop for the `Navigation` component and handling\n * the expansion of items.\n *\n * @example Main Usage\n * ```tsx\n * \"use client\";\n * import { Navigation } from \"@react-md/core/navigation/Navigation\";\n * import { useNavigationExpansion } from \"@react-md/core/navigation/useNavigationExpansion\";\n * import Link from \"next/link\";\n * import { usePathname } from \"next/navigation.js\";\n * import { type ReactElement } from \"react\";\n *\n * import { navItems } from \"./navItems.js\";\n *\n * export function Example(): ReactElement {\n * const pathname = usePathname();\n * const { data } = useNavigationExpansion({\n * pathname,\n * linkComponent: Link,\n * });\n *\n * return <Navigation data={data} items={navItems} />;\n * }\n * ```\n *\n * @since 6.0.0\n */\nexport function useNavigationExpansion(\n options: NavigationExpansionOptions\n): NavigationExpansionImplementation {\n const {\n pathname,\n linkComponent,\n defaultExpandedItems,\n disableFollowingPathname,\n } = options;\n const {\n value: expandedItems,\n setValue: setExpandedItems,\n toggleValue: toggleExpandedItem,\n } = useReadonlySet({\n defaultValue:\n defaultExpandedItems ?? (() => new Set(getPartsFromPathname(pathname))),\n });\n\n const prevPathname = useRef(pathname);\n useEffect(() => {\n if (disableFollowingPathname || pathname === prevPathname.current) {\n return;\n }\n\n prevPathname.current = pathname;\n setExpandedItems((prev) => {\n const next = new Set([...prev, ...getPartsFromPathname(pathname)]);\n if (next.size === prev.size) {\n return prev;\n }\n\n return next;\n });\n }, [disableFollowingPathname, pathname, setExpandedItems]);\n\n const data = useMemo<NavigationRenderData>(\n () => ({\n pathname,\n linkComponent,\n expandedItems,\n toggleExpandedItem,\n }),\n [expandedItems, linkComponent, pathname, toggleExpandedItem]\n );\n\n return {\n data,\n expandedItems,\n setExpandedItems,\n toggleExpandedItem,\n };\n}\n"],"names":["useEffect","useMemo","useRef","useReadonlySet","getPartsFromPathname","useNavigationExpansion","options","pathname","linkComponent","defaultExpandedItems","disableFollowingPathname","value","expandedItems","setValue","setExpandedItems","toggleValue","toggleExpandedItem","defaultValue","Set","prevPathname","current","prev","next","size","data"],"mappings":"AAAA;AACA,SAASA,SAAS,EAAEC,OAAO,EAAEC,MAAM,QAAQ,QAAQ;AAEnD,SAASC,cAAc,QAAQ,uBAAuB;AAMtD,SAASC,oBAAoB,QAAQ,aAAa;AAiFlD;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,SAASC,uBACdC,OAAmC;IAEnC,MAAM,EACJC,QAAQ,EACRC,aAAa,EACbC,oBAAoB,EACpBC,wBAAwB,EACzB,GAAGJ;IACJ,MAAM,EACJK,OAAOC,aAAa,EACpBC,UAAUC,gBAAgB,EAC1BC,aAAaC,kBAAkB,EAChC,GAAGb,eAAe;QACjBc,cACER,wBAAyB,CAAA,IAAM,IAAIS,IAAId,qBAAqBG,UAAS;IACzE;IAEA,MAAMY,eAAejB,OAAOK;IAC5BP,UAAU;QACR,IAAIU,4BAA4BH,aAAaY,aAAaC,OAAO,EAAE;YACjE;QACF;QAEAD,aAAaC,OAAO,GAAGb;QACvBO,iBAAiB,CAACO;YAChB,MAAMC,OAAO,IAAIJ,IAAI;mBAAIG;mBAASjB,qBAAqBG;aAAU;YACjE,IAAIe,KAAKC,IAAI,KAAKF,KAAKE,IAAI,EAAE;gBAC3B,OAAOF;YACT;YAEA,OAAOC;QACT;IACF,GAAG;QAACZ;QAA0BH;QAAUO;KAAiB;IAEzD,MAAMU,OAAOvB,QACX,IAAO,CAAA;YACLM;YACAC;YACAI;YACAI;QACF,CAAA,GACA;QAACJ;QAAeJ;QAAeD;QAAUS;KAAmB;IAG9D,OAAO;QACLQ;QACAZ;QACAE;QACAE;IACF;AACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type NavigationItem } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* @since 6.0.0
|
|
4
|
+
*/
|
|
5
|
+
export declare function getHrefFromParents(parents: readonly NavigationItem[]): string;
|
|
6
|
+
/**
|
|
7
|
+
* @since 6.0.0
|
|
8
|
+
*/
|
|
9
|
+
export declare function getNavigationGroupId(group: NavigationItem, parents: readonly NavigationItem[]): string;
|
|
10
|
+
/**
|
|
11
|
+
* @since 6.0.0
|
|
12
|
+
*/
|
|
13
|
+
export declare function getPartsFromPathname(pathname: string): ReadonlySet<string>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 6.0.0
|
|
3
|
+
*/ export function getHrefFromParents(parents) {
|
|
4
|
+
return parents.reduce((result, parent)=>{
|
|
5
|
+
if ("href" in parent && parent.href) {
|
|
6
|
+
const { href } = parent;
|
|
7
|
+
return result + href;
|
|
8
|
+
}
|
|
9
|
+
return result;
|
|
10
|
+
}, "");
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* @since 6.0.0
|
|
14
|
+
*/ export function getNavigationGroupId(group, parents) {
|
|
15
|
+
if ("id" in group && typeof group.id === "string" && group.id) {
|
|
16
|
+
return group.id;
|
|
17
|
+
}
|
|
18
|
+
return getHrefFromParents(parents);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @since 6.0.0
|
|
22
|
+
*/ export function getPartsFromPathname(pathname) {
|
|
23
|
+
// remove trailing slashes just in case there aren't rewrites in place
|
|
24
|
+
const href = pathname.replace(/\/{2,}/g, "/").replace(/\/+$/, "");
|
|
25
|
+
const parts = href.split("/");
|
|
26
|
+
const set = new Set();
|
|
27
|
+
let prefix = "";
|
|
28
|
+
for (const part of parts){
|
|
29
|
+
const slashed = `/${part}`;
|
|
30
|
+
prefix = prefix === "/" ? slashed : prefix + slashed;
|
|
31
|
+
set.add(prefix);
|
|
32
|
+
}
|
|
33
|
+
return set;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/navigation/utils.ts"],"sourcesContent":["import { type NavigationItem } from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport function getHrefFromParents(parents: readonly NavigationItem[]): string {\n return parents.reduce<string>((result, parent) => {\n if (\"href\" in parent && parent.href) {\n const { href } = parent;\n return result + href;\n }\n\n return result;\n }, \"\");\n}\n\n/**\n * @since 6.0.0\n */\nexport function getNavigationGroupId(\n group: NavigationItem,\n parents: readonly NavigationItem[]\n): string {\n if (\"id\" in group && typeof group.id === \"string\" && group.id) {\n return group.id;\n }\n\n return getHrefFromParents(parents);\n}\n\n/**\n * @since 6.0.0\n */\nexport function getPartsFromPathname(pathname: string): ReadonlySet<string> {\n // remove trailing slashes just in case there aren't rewrites in place\n const href = pathname.replace(/\\/{2,}/g, \"/\").replace(/\\/+$/, \"\");\n const parts = href.split(\"/\");\n const set = new Set<string>();\n let prefix = \"\";\n for (const part of parts) {\n const slashed = `/${part}`;\n prefix = prefix === \"/\" ? slashed : prefix + slashed;\n set.add(prefix);\n }\n\n return set;\n}\n"],"names":["getHrefFromParents","parents","reduce","result","parent","href","getNavigationGroupId","group","id","getPartsFromPathname","pathname","replace","parts","split","set","Set","prefix","part","slashed","add"],"mappings":"AAEA;;CAEC,GACD,OAAO,SAASA,mBAAmBC,OAAkC;IACnE,OAAOA,QAAQC,MAAM,CAAS,CAACC,QAAQC;QACrC,IAAI,UAAUA,UAAUA,OAAOC,IAAI,EAAE;YACnC,MAAM,EAAEA,IAAI,EAAE,GAAGD;YACjB,OAAOD,SAASE;QAClB;QAEA,OAAOF;IACT,GAAG;AACL;AAEA;;CAEC,GACD,OAAO,SAASG,qBACdC,KAAqB,EACrBN,OAAkC;IAElC,IAAI,QAAQM,SAAS,OAAOA,MAAMC,EAAE,KAAK,YAAYD,MAAMC,EAAE,EAAE;QAC7D,OAAOD,MAAMC,EAAE;IACjB;IAEA,OAAOR,mBAAmBC;AAC5B;AAEA;;CAEC,GACD,OAAO,SAASQ,qBAAqBC,QAAgB;IACnD,sEAAsE;IACtE,MAAML,OAAOK,SAASC,OAAO,CAAC,WAAW,KAAKA,OAAO,CAAC,QAAQ;IAC9D,MAAMC,QAAQP,KAAKQ,KAAK,CAAC;IACzB,MAAMC,MAAM,IAAIC;IAChB,IAAIC,SAAS;IACb,KAAK,MAAMC,QAAQL,MAAO;QACxB,MAAMM,UAAU,CAAC,CAAC,EAAED,MAAM;QAC1BD,SAASA,WAAW,MAAME,UAAUF,SAASE;QAC7CJ,IAAIK,GAAG,CAACH;IACV;IAEA,OAAOF;AACT"}
|