@gravity-ui/navigation 5.0.0 → 6.0.0-beta.1
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/build/cjs/assets/icons/{divider-collapsed-compact.svg.js → control-menu-button.svg.js} +7 -7
- package/build/cjs/assets/icons/control-menu-button.svg.js.map +1 -0
- package/build/cjs/components/AsideHeader/AsideHeader.css +1 -1
- package/build/cjs/components/AsideHeader/AsideHeader.js +3 -3
- package/build/cjs/components/AsideHeader/AsideHeader.js.map +1 -1
- package/build/cjs/components/AsideHeader/AsideHeader.module.scss.js +1 -1
- package/build/cjs/components/AsideHeader/AsideHeaderContext.d.ts +4 -28
- package/build/cjs/components/AsideHeader/AsideHeaderContext.js +8 -9
- package/build/cjs/components/AsideHeader/AsideHeaderContext.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.css +1 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.d.ts +12 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js +44 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js.map +1 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.module.scss.js +8 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.module.scss.js.map +1 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/index.d.ts +1 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.css +1 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.js +45 -103
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.module.scss.js +1 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/constants.d.ts +0 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/constants.js +0 -2
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/constants.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js +1 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/index.d.ts +4 -4
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js +1 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/index.d.ts +1 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/useGroupedMenuItems.d.ts +4 -3
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/useGroupedMenuItems.js +15 -67
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/useGroupedMenuItems.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/useVisibleMenuItems.d.ts +2 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/useVisibleMenuItems.js +29 -0
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/useVisibleMenuItems.js.map +1 -0
- package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.css +1 -1
- package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.d.ts +1 -2
- package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.js +11 -16
- package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/CollapseButton/CollapseButton.module.scss.js +1 -1
- package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.css +1 -1
- package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.d.ts +10 -34
- package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.js +51 -75
- package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/CompositeBar/CompositeBar.module.scss.js +1 -1
- package/build/cjs/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.css +1 -1
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.css +1 -25
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.d.ts +1 -17
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.js +73 -60
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.module.scss.js +1 -1
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/Item.types.d.ts +20 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopup.d.ts +18 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js +45 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js.map +1 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopupNestContext.d.ts +5 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopupNestContext.js +8 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/ItemPopupNestContext.js.map +1 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.d.ts +3 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js +19 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js.map +1 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.css +1 -1
- package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.d.ts +4 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js +9 -12
- package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.module.scss.js +1 -1
- package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.d.ts +27 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js +171 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js.map +1 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/grouping.d.ts +11 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/grouping.js +68 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/grouping.js.map +1 -0
- package/build/cjs/components/AsideHeader/components/CompositeBar/utils.d.ts +21 -5
- package/build/cjs/components/AsideHeader/components/CompositeBar/utils.js +104 -55
- package/build/cjs/components/AsideHeader/components/CompositeBar/utils.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/FirstPanel.js +20 -45
- package/build/cjs/components/AsideHeader/components/FirstPanel.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.css +1 -1
- package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.d.ts +0 -2
- package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.js +1 -12
- package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/FooterItem/FooterItem.module.scss.js +1 -1
- package/build/cjs/components/AsideHeader/components/Header.js +4 -13
- package/build/cjs/components/AsideHeader/components/Header.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/PageLayout/AsideFallback.css +1 -1
- package/build/cjs/components/AsideHeader/components/PageLayout/AsideFallback.js +3 -3
- package/build/cjs/components/AsideHeader/components/PageLayout/AsideFallback.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.css +1 -1
- package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.d.ts +1 -4
- package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.js +6 -18
- package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.css +1 -1
- package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.d.ts +1 -1
- package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.js +2 -7
- package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.js.map +1 -1
- package/build/cjs/components/AsideHeader/components/Panels.d.ts +1 -1
- package/build/cjs/components/AsideHeader/components/Panels.js +3 -17
- package/build/cjs/components/AsideHeader/components/Panels.js.map +1 -1
- package/build/cjs/components/AsideHeader/i18n/en.json.js +1 -4
- package/build/cjs/components/AsideHeader/i18n/en.json.js.map +1 -1
- package/build/cjs/components/AsideHeader/i18n/index.d.ts +4 -4
- package/build/cjs/components/AsideHeader/i18n/ru.json.js +1 -4
- package/build/cjs/components/AsideHeader/i18n/ru.json.js.map +1 -1
- package/build/cjs/components/AsideHeader/index.d.ts +3 -3
- package/build/cjs/components/AsideHeader/types.d.ts +22 -39
- package/build/cjs/components/AsideHeader/types.js.map +1 -1
- package/build/cjs/components/AsideHeader/useAsideHeaderInnerContextValue.d.ts +1 -6
- package/build/cjs/components/AsideHeader/useAsideHeaderInnerContextValue.js +6 -41
- package/build/cjs/components/AsideHeader/useAsideHeaderInnerContextValue.js.map +1 -1
- package/build/cjs/components/Footer/desktop/Footer.js +1 -1
- package/build/cjs/components/Footer/desktop/Footer.js.map +1 -1
- package/build/cjs/components/Footer/mobile/Footer.js +1 -1
- package/build/cjs/components/Footer/mobile/Footer.js.map +1 -1
- package/build/cjs/components/HotkeysPanel/HotkeysPanel.d.ts +4 -2
- package/build/cjs/components/HotkeysPanel/HotkeysPanel.js +13 -2
- package/build/cjs/components/HotkeysPanel/HotkeysPanel.js.map +1 -1
- package/build/cjs/components/Logo/Logo.css +1 -1
- package/build/cjs/components/Logo/Logo.d.ts +3 -7
- package/build/cjs/components/Logo/Logo.js +6 -19
- package/build/cjs/components/Logo/Logo.js.map +1 -1
- package/build/cjs/components/Logo/Logo.module.scss.js +1 -1
- package/build/cjs/components/MobileHeader/BurgerMenu/BurgerCompositeBar/BurgerCompositeBar.css +1 -1
- package/build/cjs/components/MobileHeader/BurgerMenu/BurgerCompositeBar/BurgerCompositeBar.module.scss.js +1 -1
- package/build/cjs/components/MobileHeader/MobileHeader.d.ts +1 -1
- package/build/cjs/components/MobileHeader/MobileHeader.js +7 -7
- package/build/cjs/components/MobileHeader/MobileHeader.js.map +1 -1
- package/build/cjs/components/MobileHeader/types.d.ts +1 -1
- package/build/cjs/components/MobileLogo/MobileLogo.d.ts +1 -1
- package/build/cjs/components/MobileLogo/MobileLogo.js +2 -2
- package/build/cjs/components/MobileLogo/MobileLogo.js.map +1 -1
- package/build/cjs/components/constants.d.ts +5 -10
- package/build/cjs/components/constants.js +7 -17
- package/build/cjs/components/constants.js.map +1 -1
- package/build/cjs/components/types.d.ts +19 -15
- package/build/cjs/index.js +0 -4
- package/build/cjs/index.js.map +1 -1
- package/build/esm/assets/icons/{divider-collapsed-compact.svg.js → control-menu-button.svg.js} +7 -7
- package/build/esm/assets/icons/control-menu-button.svg.js.map +1 -0
- package/build/esm/components/AsideHeader/AsideHeader.css +1 -1
- package/build/esm/components/AsideHeader/AsideHeader.js +3 -3
- package/build/esm/components/AsideHeader/AsideHeader.js.map +1 -1
- package/build/esm/components/AsideHeader/AsideHeader.module.scss.js +1 -1
- package/build/esm/components/AsideHeader/AsideHeaderContext.d.ts +4 -28
- package/build/esm/components/AsideHeader/AsideHeaderContext.js +8 -9
- package/build/esm/components/AsideHeader/AsideHeaderContext.js.map +1 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.css +1 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.d.ts +12 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js +42 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.js.map +1 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.module.scss.js +4 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/AllPagesListItem.module.scss.js.map +1 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesListItem/index.d.ts +1 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.css +1 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.js +46 -104
- package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.js.map +1 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/AllPagesPanel.module.scss.js +1 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/constants.d.ts +0 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/constants.js +1 -2
- package/build/esm/components/AsideHeader/components/AllPagesPanel/constants.js.map +1 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js +1 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/en.json.js.map +1 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/index.d.ts +4 -4
- package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js +1 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/i18n/ru.json.js.map +1 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/index.d.ts +1 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/useGroupedMenuItems.d.ts +4 -3
- package/build/esm/components/AsideHeader/components/AllPagesPanel/useGroupedMenuItems.js +15 -67
- package/build/esm/components/AsideHeader/components/AllPagesPanel/useGroupedMenuItems.js.map +1 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/useVisibleMenuItems.d.ts +2 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/useVisibleMenuItems.js +27 -0
- package/build/esm/components/AsideHeader/components/AllPagesPanel/useVisibleMenuItems.js.map +1 -0
- package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.css +1 -1
- package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.d.ts +1 -2
- package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.js +13 -18
- package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.js.map +1 -1
- package/build/esm/components/AsideHeader/components/CollapseButton/CollapseButton.module.scss.js +1 -1
- package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.css +1 -1
- package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.d.ts +10 -34
- package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.js +55 -78
- package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.js.map +1 -1
- package/build/esm/components/AsideHeader/components/CompositeBar/CompositeBar.module.scss.js +1 -1
- package/build/esm/components/AsideHeader/components/CompositeBar/HighlightedItem/HighlightedItem.css +1 -1
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.css +1 -25
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.d.ts +1 -17
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.js +76 -63
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.js.map +1 -1
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.module.scss.js +1 -1
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/Item.types.d.ts +20 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopup.d.ts +18 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js +43 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopup.js.map +1 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopupNestContext.d.ts +5 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopupNestContext.js +6 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/ItemPopupNestContext.js.map +1 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.d.ts +3 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js +17 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/Item/renderItemTitle.js.map +1 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.css +1 -1
- package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.d.ts +4 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js +10 -13
- package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.js.map +1 -1
- package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.module.scss.js +1 -1
- package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.d.ts +27 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js +169 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.js.map +1 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/grouping.d.ts +11 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/grouping.js +65 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/grouping.js.map +1 -0
- package/build/esm/components/AsideHeader/components/CompositeBar/utils.d.ts +21 -5
- package/build/esm/components/AsideHeader/components/CompositeBar/utils.js +100 -55
- package/build/esm/components/AsideHeader/components/CompositeBar/utils.js.map +1 -1
- package/build/esm/components/AsideHeader/components/FirstPanel.js +21 -46
- package/build/esm/components/AsideHeader/components/FirstPanel.js.map +1 -1
- package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.css +1 -1
- package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.d.ts +0 -2
- package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.js +1 -12
- package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.js.map +1 -1
- package/build/esm/components/AsideHeader/components/FooterItem/FooterItem.module.scss.js +1 -1
- package/build/esm/components/AsideHeader/components/Header.js +5 -14
- package/build/esm/components/AsideHeader/components/Header.js.map +1 -1
- package/build/esm/components/AsideHeader/components/PageLayout/AsideFallback.css +1 -1
- package/build/esm/components/AsideHeader/components/PageLayout/AsideFallback.js +4 -4
- package/build/esm/components/AsideHeader/components/PageLayout/AsideFallback.js.map +1 -1
- package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.css +1 -1
- package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.d.ts +1 -4
- package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.js +7 -19
- package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.js.map +1 -1
- package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.css +1 -1
- package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.d.ts +1 -1
- package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.js +2 -7
- package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.js.map +1 -1
- package/build/esm/components/AsideHeader/components/Panels.d.ts +1 -1
- package/build/esm/components/AsideHeader/components/Panels.js +4 -18
- package/build/esm/components/AsideHeader/components/Panels.js.map +1 -1
- package/build/esm/components/AsideHeader/i18n/en.json.js +2 -4
- package/build/esm/components/AsideHeader/i18n/en.json.js.map +1 -1
- package/build/esm/components/AsideHeader/i18n/index.d.ts +4 -4
- package/build/esm/components/AsideHeader/i18n/ru.json.js +2 -4
- package/build/esm/components/AsideHeader/i18n/ru.json.js.map +1 -1
- package/build/esm/components/AsideHeader/index.d.ts +3 -3
- package/build/esm/components/AsideHeader/types.d.ts +22 -39
- package/build/esm/components/AsideHeader/types.js.map +1 -1
- package/build/esm/components/AsideHeader/useAsideHeaderInnerContextValue.d.ts +1 -6
- package/build/esm/components/AsideHeader/useAsideHeaderInnerContextValue.js +6 -41
- package/build/esm/components/AsideHeader/useAsideHeaderInnerContextValue.js.map +1 -1
- package/build/esm/components/Footer/desktop/Footer.js +1 -1
- package/build/esm/components/Footer/desktop/Footer.js.map +1 -1
- package/build/esm/components/Footer/mobile/Footer.js +1 -1
- package/build/esm/components/Footer/mobile/Footer.js.map +1 -1
- package/build/esm/components/HotkeysPanel/HotkeysPanel.d.ts +4 -2
- package/build/esm/components/HotkeysPanel/HotkeysPanel.js +13 -2
- package/build/esm/components/HotkeysPanel/HotkeysPanel.js.map +1 -1
- package/build/esm/components/Logo/Logo.css +1 -1
- package/build/esm/components/Logo/Logo.d.ts +3 -7
- package/build/esm/components/Logo/Logo.js +6 -19
- package/build/esm/components/Logo/Logo.js.map +1 -1
- package/build/esm/components/Logo/Logo.module.scss.js +1 -1
- package/build/esm/components/MobileHeader/BurgerMenu/BurgerCompositeBar/BurgerCompositeBar.css +1 -1
- package/build/esm/components/MobileHeader/BurgerMenu/BurgerCompositeBar/BurgerCompositeBar.module.scss.js +1 -1
- package/build/esm/components/MobileHeader/MobileHeader.d.ts +1 -1
- package/build/esm/components/MobileHeader/MobileHeader.js +8 -8
- package/build/esm/components/MobileHeader/MobileHeader.js.map +1 -1
- package/build/esm/components/MobileHeader/types.d.ts +1 -1
- package/build/esm/components/MobileLogo/MobileLogo.d.ts +1 -1
- package/build/esm/components/MobileLogo/MobileLogo.js +2 -2
- package/build/esm/components/MobileLogo/MobileLogo.js.map +1 -1
- package/build/esm/components/constants.d.ts +5 -10
- package/build/esm/components/constants.js +6 -11
- package/build/esm/components/constants.js.map +1 -1
- package/build/esm/components/types.d.ts +19 -15
- package/build/esm/index.js +1 -2
- package/build/esm/index.js.map +1 -1
- package/codemods/bin/cli.js +6 -19
- package/codemods/transforms/unifyInterfaces.ts +0 -1
- package/package.json +4 -3
- package/build/cjs/assets/icons/divider-collapsed-compact.svg.js.map +0 -1
- package/build/cjs/components/AsideHeader/FooterLayoutContext.d.ts +0 -7
- package/build/cjs/components/AsideHeader/FooterLayoutContext.js +0 -10
- package/build/cjs/components/AsideHeader/FooterLayoutContext.js.map +0 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/buildExpandedFromFlatList.d.ts +0 -3
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/buildExpandedFromFlatList.js +0 -17
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/buildExpandedFromFlatList.js.map +0 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/getExpandedIndexForSortableIndex.d.ts +0 -9
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/getExpandedIndexForSortableIndex.js +0 -27
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/getExpandedIndexForSortableIndex.js.map +0 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/getIsMenuItem.d.ts +0 -2
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/getIsMenuItem.js +0 -13
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/getIsMenuItem.js.map +0 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/getRealIndexInGroup.d.ts +0 -73
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/getRealIndexInGroup.js +0 -144
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/getRealIndexInGroup.js.map +0 -1
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/sortMenuItemsWithDividers.d.ts +0 -5
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/sortMenuItemsWithDividers.js +0 -45
- package/build/cjs/components/AsideHeader/components/AllPagesPanel/utils/sortMenuItemsWithDividers.js.map +0 -1
- package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollbar.d.ts +0 -21
- package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollbar.js +0 -146
- package/build/cjs/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollbar.js.map +0 -1
- package/build/cjs/components/AsideHeader/components/FooterBar/FooterBar.css +0 -1
- package/build/cjs/components/AsideHeader/components/FooterBar/FooterBar.d.ts +0 -19
- package/build/cjs/components/AsideHeader/components/FooterBar/FooterBar.js +0 -95
- package/build/cjs/components/AsideHeader/components/FooterBar/FooterBar.js.map +0 -1
- package/build/cjs/components/AsideHeader/components/FooterBar/FooterBar.module.scss.js +0 -8
- package/build/cjs/components/AsideHeader/components/FooterBar/FooterBar.module.scss.js.map +0 -1
- package/build/cjs/components/AsideHeader/components/FooterBar/constants.d.ts +0 -1
- package/build/cjs/components/AsideHeader/components/FooterBar/constants.js +0 -6
- package/build/cjs/components/AsideHeader/components/FooterBar/constants.js.map +0 -1
- package/build/cjs/components/AsideHeader/components/FooterBar/index.d.ts +0 -1
- package/build/cjs/components/AsideHeader/hooks/useDelayedToggle.d.ts +0 -6
- package/build/cjs/components/AsideHeader/hooks/useDelayedToggle.js +0 -57
- package/build/cjs/components/AsideHeader/hooks/useDelayedToggle.js.map +0 -1
- package/build/cjs/components/AsideHeader/hooks/useIsExpanded.d.ts +0 -9
- package/build/cjs/components/AsideHeader/hooks/useIsExpanded.js +0 -67
- package/build/cjs/components/AsideHeader/hooks/useIsExpanded.js.map +0 -1
- package/build/cjs/components/AsideHeader/utils/getGroupHeight.d.ts +0 -2
- package/build/cjs/components/AsideHeader/utils/getGroupHeight.js +0 -16
- package/build/cjs/components/AsideHeader/utils/getGroupHeight.js.map +0 -1
- package/build/cjs/components/utils/getCollapsedWidth.d.ts +0 -1
- package/build/cjs/components/utils/getCollapsedWidth.js +0 -10
- package/build/cjs/components/utils/getCollapsedWidth.js.map +0 -1
- package/build/esm/assets/icons/divider-collapsed-compact.svg.js.map +0 -1
- package/build/esm/components/AsideHeader/FooterLayoutContext.d.ts +0 -7
- package/build/esm/components/AsideHeader/FooterLayoutContext.js +0 -7
- package/build/esm/components/AsideHeader/FooterLayoutContext.js.map +0 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/buildExpandedFromFlatList.d.ts +0 -3
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/buildExpandedFromFlatList.js +0 -15
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/buildExpandedFromFlatList.js.map +0 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/getExpandedIndexForSortableIndex.d.ts +0 -9
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/getExpandedIndexForSortableIndex.js +0 -25
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/getExpandedIndexForSortableIndex.js.map +0 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/getIsMenuItem.d.ts +0 -2
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/getIsMenuItem.js +0 -11
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/getIsMenuItem.js.map +0 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/getRealIndexInGroup.d.ts +0 -73
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/getRealIndexInGroup.js +0 -136
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/getRealIndexInGroup.js.map +0 -1
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/sortMenuItemsWithDividers.d.ts +0 -5
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/sortMenuItemsWithDividers.js +0 -43
- package/build/esm/components/AsideHeader/components/AllPagesPanel/utils/sortMenuItemsWithDividers.js.map +0 -1
- package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollbar.d.ts +0 -21
- package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollbar.js +0 -144
- package/build/esm/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollbar.js.map +0 -1
- package/build/esm/components/AsideHeader/components/FooterBar/FooterBar.css +0 -1
- package/build/esm/components/AsideHeader/components/FooterBar/FooterBar.d.ts +0 -19
- package/build/esm/components/AsideHeader/components/FooterBar/FooterBar.js +0 -93
- package/build/esm/components/AsideHeader/components/FooterBar/FooterBar.js.map +0 -1
- package/build/esm/components/AsideHeader/components/FooterBar/FooterBar.module.scss.js +0 -4
- package/build/esm/components/AsideHeader/components/FooterBar/FooterBar.module.scss.js.map +0 -1
- package/build/esm/components/AsideHeader/components/FooterBar/constants.d.ts +0 -1
- package/build/esm/components/AsideHeader/components/FooterBar/constants.js +0 -4
- package/build/esm/components/AsideHeader/components/FooterBar/constants.js.map +0 -1
- package/build/esm/components/AsideHeader/components/FooterBar/index.d.ts +0 -1
- package/build/esm/components/AsideHeader/hooks/useDelayedToggle.d.ts +0 -6
- package/build/esm/components/AsideHeader/hooks/useDelayedToggle.js +0 -55
- package/build/esm/components/AsideHeader/hooks/useDelayedToggle.js.map +0 -1
- package/build/esm/components/AsideHeader/hooks/useIsExpanded.d.ts +0 -9
- package/build/esm/components/AsideHeader/hooks/useIsExpanded.js +0 -65
- package/build/esm/components/AsideHeader/hooks/useIsExpanded.js.map +0 -1
- package/build/esm/components/AsideHeader/utils/getGroupHeight.d.ts +0 -2
- package/build/esm/components/AsideHeader/utils/getGroupHeight.js +0 -14
- package/build/esm/components/AsideHeader/utils/getGroupHeight.js.map +0 -1
- package/build/esm/components/utils/getCollapsedWidth.d.ts +0 -1
- package/build/esm/components/utils/getCollapsedWidth.js +0 -8
- package/build/esm/components/utils/getCollapsedWidth.js.map +0 -1
- package/codemods/transforms/compactToIsExpanded.ts +0 -345
- package/codemods/transforms/compactToPinned.ts +0 -135
- package/codemods/transforms/v5.ts +0 -36
|
@@ -1,24 +1,21 @@
|
|
|
1
1
|
import './ScrollableWithScrollbar.css';
|
|
2
|
-
import React__default
|
|
2
|
+
import React__default from 'react';
|
|
3
3
|
import { createBlock } from '../../../../utils/cn.js';
|
|
4
|
-
import {
|
|
4
|
+
import { useScrollableScrollbarSync } from './useScrollableScrollbarSync.js';
|
|
5
5
|
import styles from './ScrollableWithScrollbar.module.scss.js';
|
|
6
6
|
|
|
7
7
|
const b = createBlock('scrollable-with-scrollbar', styles);
|
|
8
8
|
const EMPTY_DEPS = [];
|
|
9
|
+
// Hides the native scrollbar and renders a custom thumb synced with the
|
|
10
|
+
// underlying scroll position. The scroll itself stays native (wheel / touch /
|
|
11
|
+
// keyboard) — only the visual indicator and drag handling are custom, so the
|
|
12
|
+
// reserved gutter width is identical across OS / browser scrollbar settings.
|
|
9
13
|
const ScrollableWithScrollbar = ({ children, className, recalcDeps = EMPTY_DEPS, }) => {
|
|
10
|
-
const
|
|
11
|
-
const { scrollRef, scrollState, updateScrollState, showScrollbar, thumbHeight, thumbTop, handleThumbMouseDown, handleTrackClick, handleScrollbarKeyDown, } = useScrollbar({ recalcDeps });
|
|
12
|
-
const hasContentBelow = scrollState.scrollHeight > scrollState.clientHeight &&
|
|
13
|
-
scrollState.scrollTop + scrollState.clientHeight < scrollState.scrollHeight - 1;
|
|
14
|
+
const { scrollRef, trackRef, thumbRef, hasContentBelow, overflows, thumb, scheduleUpdate, handleThumbPointerDown, handleTrackPointerDown, } = useScrollableScrollbarSync(recalcDeps);
|
|
14
15
|
return (React__default.createElement("div", { className: b({ 'bottom-shadow': hasContentBelow }, className) },
|
|
15
|
-
React__default.createElement("div", {
|
|
16
|
-
|
|
17
|
-
React__default.createElement("div", { className: b('scrollbar-
|
|
18
|
-
React__default.createElement("div", { className: b('scrollbar-thumb'), style: {
|
|
19
|
-
height: thumbHeight,
|
|
20
|
-
transform: `translateY(${thumbTop}px)`,
|
|
21
|
-
}, onMouseDown: handleThumbMouseDown }))))));
|
|
16
|
+
React__default.createElement("div", { ref: scrollRef, className: b('scrollable-inner'), onScroll: scheduleUpdate }, children),
|
|
17
|
+
overflows ? (React__default.createElement("div", { ref: trackRef, className: b('scrollbar-track'), onPointerDown: handleTrackPointerDown, "aria-hidden": "true" },
|
|
18
|
+
React__default.createElement("div", { ref: thumbRef, className: b('scrollbar-thumb'), style: { transform: `translateY(${thumb.top}px)`, height: thumb.height }, onPointerDown: handleThumbPointerDown }))) : null));
|
|
22
19
|
};
|
|
23
20
|
|
|
24
21
|
export { ScrollableWithScrollbar };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollableWithScrollbar.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.tsx"],"sourcesContent":["import React, {FC, ReactNode
|
|
1
|
+
{"version":3,"file":"ScrollableWithScrollbar.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/ScrollableWithScrollbar.tsx"],"sourcesContent":["import React, {FC, ReactNode} from 'react';\n\nimport {createBlock} from '../../../../utils/cn';\n\nimport {useScrollableScrollbarSync} from './useScrollableScrollbarSync';\n\nimport styles from './ScrollableWithScrollbar.module.scss';\n\nconst b = createBlock('scrollable-with-scrollbar', styles);\n\nconst EMPTY_DEPS: React.DependencyList = [];\n\ntype ScrollableWithScrollbarProps = {\n children: ReactNode;\n className?: string;\n /**\n * Extra dependencies that should trigger a recalculation of the bottom\n * shadow and custom scrollbar thumb (e.g. when the rendered items change).\n */\n recalcDeps?: React.DependencyList;\n};\n\n// Hides the native scrollbar and renders a custom thumb synced with the\n// underlying scroll position. The scroll itself stays native (wheel / touch /\n// keyboard) — only the visual indicator and drag handling are custom, so the\n// reserved gutter width is identical across OS / browser scrollbar settings.\nexport const ScrollableWithScrollbar: FC<ScrollableWithScrollbarProps> = ({\n children,\n className,\n recalcDeps = EMPTY_DEPS,\n}) => {\n const {\n scrollRef,\n trackRef,\n thumbRef,\n hasContentBelow,\n overflows,\n thumb,\n scheduleUpdate,\n handleThumbPointerDown,\n handleTrackPointerDown,\n } = useScrollableScrollbarSync(recalcDeps);\n\n return (\n <div className={b({'bottom-shadow': hasContentBelow}, className)}>\n <div ref={scrollRef} className={b('scrollable-inner')} onScroll={scheduleUpdate}>\n {children}\n </div>\n\n {overflows ? (\n <div\n ref={trackRef}\n className={b('scrollbar-track')}\n onPointerDown={handleTrackPointerDown}\n aria-hidden=\"true\"\n >\n <div\n ref={thumbRef}\n className={b('scrollbar-thumb')}\n style={{transform: `translateY(${thumb.top}px)`, height: thumb.height}}\n onPointerDown={handleThumbPointerDown}\n />\n </div>\n ) : null}\n </div>\n );\n};\n"],"names":["React"],"mappings":";;;;;AAQA,MAAM,CAAC,GAAG,WAAW,CAAC,2BAA2B,EAAE,MAAM,CAAC;AAE1D,MAAM,UAAU,GAAyB,EAAE;AAY3C;AACA;AACA;AACA;AACO,MAAM,uBAAuB,GAAqC,CAAC,EACtE,QAAQ,EACR,SAAS,EACT,UAAU,GAAG,UAAU,GAC1B,KAAI;IACD,MAAM,EACF,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,SAAS,EACT,KAAK,EACL,cAAc,EACd,sBAAsB,EACtB,sBAAsB,GACzB,GAAG,0BAA0B,CAAC,UAAU,CAAC;AAE1C,IAAA,QACIA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAC,CAAC,EAAC,eAAe,EAAE,eAAe,EAAC,EAAE,SAAS,CAAC,EAAA;AAC5D,QAAAA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAA,EAC1E,QAAQ,CACP;QAEL,SAAS,IACNA,sCACI,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAC/B,aAAa,EAAE,sBAAsB,iBACzB,MAAM,EAAA;AAElB,YAAAA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EACI,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAC/B,KAAK,EAAE,EAAC,SAAS,EAAE,CAAA,WAAA,EAAc,KAAK,CAAC,GAAG,CAAK,GAAA,CAAA,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAC,EACtE,aAAa,EAAE,sBAAsB,EACvC,CAAA,CACA,IACN,IAAI,CACN;AAEd;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var styles = {"gn-scrollable-with-scrollbar":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS","gnScrollableWithScrollbar":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS","gn-scrollable-with-scrollbar_bottom-shadow":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_bottom-shadow___YoCCZ","gnScrollableWithScrollbarBottomShadow":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_bottom-shadow___YoCCZ","gn-scrollable-with-scrollbar__scrollable-inner":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza","gnScrollableWithScrollbarScrollableInner":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza","gn-scrollable-with-scrollbar__scrollbar
|
|
1
|
+
var styles = {"gn-scrollable-with-scrollbar":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS","gnScrollableWithScrollbar":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar___S-GKS","gn-scrollable-with-scrollbar_bottom-shadow":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_bottom-shadow___YoCCZ","gnScrollableWithScrollbarBottomShadow":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar_bottom-shadow___YoCCZ","gn-scrollable-with-scrollbar__scrollable-inner":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza","gnScrollableWithScrollbarScrollableInner":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollable-inner___yRIza","gn-scrollable-with-scrollbar__scrollbar-track":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-track___u6MVN","gnScrollableWithScrollbarScrollbarTrack":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-track___u6MVN","gn-scrollable-with-scrollbar__scrollbar-thumb":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-thumb___bLf6h","gnScrollableWithScrollbarScrollbarThumb":"ScrollableWithScrollbar-module__gn-scrollable-with-scrollbar__scrollbar-thumb___bLf6h"};
|
|
2
2
|
|
|
3
3
|
export { styles as default };
|
|
4
4
|
//# sourceMappingURL=ScrollableWithScrollbar.module.scss.js.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
type ThumbGeometry = {
|
|
3
|
+
top: number;
|
|
4
|
+
height: number;
|
|
5
|
+
};
|
|
6
|
+
type UseScrollableScrollbarSyncResult = {
|
|
7
|
+
scrollRef: React.RefObject<HTMLDivElement>;
|
|
8
|
+
trackRef: React.RefObject<HTMLDivElement>;
|
|
9
|
+
thumbRef: React.RefObject<HTMLDivElement>;
|
|
10
|
+
hasContentBelow: boolean;
|
|
11
|
+
overflows: boolean;
|
|
12
|
+
thumb: ThumbGeometry;
|
|
13
|
+
scheduleUpdate: () => void;
|
|
14
|
+
handleThumbPointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;
|
|
15
|
+
handleTrackPointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Keeps a custom scrollbar thumb and bottom shadow in sync with a native
|
|
19
|
+
* scroll layer. The scroll element handles touch/keyboard; wheel events on the
|
|
20
|
+
* overlay track are forwarded to it (the track sits above the scroller, so
|
|
21
|
+
* they would not scroll otherwise).
|
|
22
|
+
*
|
|
23
|
+
* @param recalcDeps - extra deps that should trigger thumb/shadow recalculation
|
|
24
|
+
* @returns refs, scroll state, thumb geometry, and pointer handlers for the UI
|
|
25
|
+
*/
|
|
26
|
+
export declare function useScrollableScrollbarSync(recalcDeps?: React.DependencyList): UseScrollableScrollbarSyncResult;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { useRef, useState, useCallback, useEffect, useLayoutEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
const EMPTY_DEPS = [];
|
|
4
|
+
const MIN_THUMB_HEIGHT = 24;
|
|
5
|
+
/**
|
|
6
|
+
* Keeps a custom scrollbar thumb and bottom shadow in sync with a native
|
|
7
|
+
* scroll layer. The scroll element handles touch/keyboard; wheel events on the
|
|
8
|
+
* overlay track are forwarded to it (the track sits above the scroller, so
|
|
9
|
+
* they would not scroll otherwise).
|
|
10
|
+
*
|
|
11
|
+
* @param recalcDeps - extra deps that should trigger thumb/shadow recalculation
|
|
12
|
+
* @returns refs, scroll state, thumb geometry, and pointer handlers for the UI
|
|
13
|
+
*/
|
|
14
|
+
function useScrollableScrollbarSync(recalcDeps = EMPTY_DEPS) {
|
|
15
|
+
const scrollRef = useRef(null);
|
|
16
|
+
const trackRef = useRef(null);
|
|
17
|
+
const thumbRef = useRef(null);
|
|
18
|
+
const [hasContentBelow, setHasContentBelow] = useState(false);
|
|
19
|
+
const [overflows, setOverflows] = useState(false);
|
|
20
|
+
const [thumb, setThumb] = useState({ top: 0, height: 0 });
|
|
21
|
+
const rafIdRef = useRef(null);
|
|
22
|
+
const scheduleUpdate = useCallback(() => {
|
|
23
|
+
if (rafIdRef.current !== null) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
rafIdRef.current = requestAnimationFrame(() => {
|
|
27
|
+
rafIdRef.current = null;
|
|
28
|
+
const el = scrollRef.current;
|
|
29
|
+
if (!el) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const { scrollTop, scrollHeight, clientHeight } = el;
|
|
33
|
+
const isOverflowing = scrollHeight > clientHeight;
|
|
34
|
+
// `-1` guards against subpixel rounding at the bottom.
|
|
35
|
+
const notAtBottom = scrollTop + clientHeight < scrollHeight - 1;
|
|
36
|
+
setOverflows(isOverflowing);
|
|
37
|
+
setHasContentBelow(isOverflowing && notAtBottom);
|
|
38
|
+
if (!isOverflowing) {
|
|
39
|
+
setThumb({ top: 0, height: 0 });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const ratio = clientHeight / scrollHeight;
|
|
43
|
+
const rawHeight = clientHeight * ratio;
|
|
44
|
+
const height = Math.max(rawHeight, MIN_THUMB_HEIGHT);
|
|
45
|
+
const maxTop = clientHeight - height;
|
|
46
|
+
const scrollRatio = scrollHeight - clientHeight > 0 ? scrollTop / (scrollHeight - clientHeight) : 0;
|
|
47
|
+
const top = maxTop * scrollRatio;
|
|
48
|
+
setThumb({ top, height });
|
|
49
|
+
});
|
|
50
|
+
}, []);
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
const el = scrollRef.current;
|
|
53
|
+
if (!el) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
scheduleUpdate();
|
|
57
|
+
if (typeof ResizeObserver === 'undefined') {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const observer = new ResizeObserver(scheduleUpdate);
|
|
61
|
+
observer.observe(el);
|
|
62
|
+
return () => observer.disconnect();
|
|
63
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
64
|
+
}, [scheduleUpdate, ...recalcDeps]);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
return () => {
|
|
67
|
+
if (rafIdRef.current !== null) {
|
|
68
|
+
cancelAnimationFrame(rafIdRef.current);
|
|
69
|
+
rafIdRef.current = null;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}, []);
|
|
73
|
+
// Wheel events do not reach the native scroll layer when the cursor is over
|
|
74
|
+
// the overlay track — forward them explicitly. `passive: false` is required
|
|
75
|
+
// so `preventDefault` works in all browsers.
|
|
76
|
+
useLayoutEffect(() => {
|
|
77
|
+
if (!overflows) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
const track = trackRef.current;
|
|
81
|
+
const scrollEl = scrollRef.current;
|
|
82
|
+
if (!track || !scrollEl) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
const onWheel = (e) => {
|
|
86
|
+
e.preventDefault();
|
|
87
|
+
scrollEl.scrollTop += e.deltaY;
|
|
88
|
+
};
|
|
89
|
+
track.addEventListener('wheel', onWheel, { passive: false });
|
|
90
|
+
return () => track.removeEventListener('wheel', onWheel);
|
|
91
|
+
}, [overflows]);
|
|
92
|
+
const cancelProgrammaticSmoothScroll = useCallback((scrollEl) => {
|
|
93
|
+
const top = scrollEl.scrollTop;
|
|
94
|
+
scrollEl.scrollTo({ top, behavior: 'auto' });
|
|
95
|
+
}, []);
|
|
96
|
+
const handleThumbPointerDown = useCallback((event) => {
|
|
97
|
+
const scrollEl = scrollRef.current;
|
|
98
|
+
const thumbEl = thumbRef.current;
|
|
99
|
+
if (!scrollEl || !thumbEl || event.button !== 0) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
event.stopPropagation();
|
|
104
|
+
cancelProgrammaticSmoothScroll(scrollEl);
|
|
105
|
+
const startY = event.clientY;
|
|
106
|
+
const startScrollTop = scrollEl.scrollTop;
|
|
107
|
+
const { scrollHeight, clientHeight } = scrollEl;
|
|
108
|
+
const thumbHeight = thumbEl.getBoundingClientRect().height;
|
|
109
|
+
const trackHeight = clientHeight;
|
|
110
|
+
const maxThumbTop = trackHeight - thumbHeight;
|
|
111
|
+
const maxScrollTop = scrollHeight - clientHeight;
|
|
112
|
+
if (maxThumbTop <= 0 || maxScrollTop <= 0) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const handlePointerMove = (moveEvent) => {
|
|
116
|
+
const deltaY = moveEvent.clientY - startY;
|
|
117
|
+
const deltaScroll = (deltaY / maxThumbTop) * maxScrollTop;
|
|
118
|
+
scrollEl.scrollTop = startScrollTop + deltaScroll;
|
|
119
|
+
};
|
|
120
|
+
const handlePointerUp = () => {
|
|
121
|
+
window.removeEventListener('pointermove', handlePointerMove);
|
|
122
|
+
window.removeEventListener('pointerup', handlePointerUp);
|
|
123
|
+
window.removeEventListener('pointercancel', handlePointerUp);
|
|
124
|
+
};
|
|
125
|
+
window.addEventListener('pointermove', handlePointerMove);
|
|
126
|
+
window.addEventListener('pointerup', handlePointerUp);
|
|
127
|
+
window.addEventListener('pointercancel', handlePointerUp);
|
|
128
|
+
}, [cancelProgrammaticSmoothScroll]);
|
|
129
|
+
const handleTrackPointerDown = useCallback((event) => {
|
|
130
|
+
const scrollEl = scrollRef.current;
|
|
131
|
+
const thumbEl = thumbRef.current;
|
|
132
|
+
if (!scrollEl ||
|
|
133
|
+
!thumbEl ||
|
|
134
|
+
event.button !== 0 ||
|
|
135
|
+
event.target !== event.currentTarget) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
cancelProgrammaticSmoothScroll(scrollEl);
|
|
139
|
+
const trackRect = event.currentTarget.getBoundingClientRect();
|
|
140
|
+
const thumbHeight = thumbEl.getBoundingClientRect().height;
|
|
141
|
+
const clickY = event.clientY - trackRect.top;
|
|
142
|
+
const targetThumbTop = Math.max(0, Math.min(clickY - thumbHeight / 2, trackRect.height - thumbHeight));
|
|
143
|
+
const maxThumbTop = trackRect.height - thumbHeight;
|
|
144
|
+
const maxScrollTop = scrollEl.scrollHeight - scrollEl.clientHeight;
|
|
145
|
+
if (maxThumbTop <= 0 || maxScrollTop <= 0) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// `auto` avoids racing with a subsequent thumb drag (smooth scroll would
|
|
149
|
+
// still animate while pointer handlers update `scrollTop`).
|
|
150
|
+
scrollEl.scrollTo({
|
|
151
|
+
top: (targetThumbTop / maxThumbTop) * maxScrollTop,
|
|
152
|
+
behavior: 'auto',
|
|
153
|
+
});
|
|
154
|
+
}, [cancelProgrammaticSmoothScroll]);
|
|
155
|
+
return {
|
|
156
|
+
scrollRef,
|
|
157
|
+
trackRef,
|
|
158
|
+
thumbRef,
|
|
159
|
+
hasContentBelow,
|
|
160
|
+
overflows,
|
|
161
|
+
thumb,
|
|
162
|
+
scheduleUpdate,
|
|
163
|
+
handleThumbPointerDown,
|
|
164
|
+
handleTrackPointerDown,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export { useScrollableScrollbarSync };
|
|
169
|
+
//# sourceMappingURL=useScrollableScrollbarSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScrollableScrollbarSync.js","sources":["../../../../../../../../src/components/AsideHeader/components/CompositeBar/ScrollableWithScrollbar/useScrollableScrollbarSync.ts"],"sourcesContent":["import React, {useCallback, useEffect, useLayoutEffect, useRef, useState} from 'react';\n\nconst EMPTY_DEPS: React.DependencyList = [];\n\nconst MIN_THUMB_HEIGHT = 24;\n\ntype ThumbGeometry = {\n top: number;\n height: number;\n};\n\ntype UseScrollableScrollbarSyncResult = {\n scrollRef: React.RefObject<HTMLDivElement>;\n trackRef: React.RefObject<HTMLDivElement>;\n thumbRef: React.RefObject<HTMLDivElement>;\n hasContentBelow: boolean;\n overflows: boolean;\n thumb: ThumbGeometry;\n scheduleUpdate: () => void;\n handleThumbPointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;\n handleTrackPointerDown: (event: React.PointerEvent<HTMLDivElement>) => void;\n};\n\n/**\n * Keeps a custom scrollbar thumb and bottom shadow in sync with a native\n * scroll layer. The scroll element handles touch/keyboard; wheel events on the\n * overlay track are forwarded to it (the track sits above the scroller, so\n * they would not scroll otherwise).\n *\n * @param recalcDeps - extra deps that should trigger thumb/shadow recalculation\n * @returns refs, scroll state, thumb geometry, and pointer handlers for the UI\n */\nexport function useScrollableScrollbarSync(\n recalcDeps: React.DependencyList = EMPTY_DEPS,\n): UseScrollableScrollbarSyncResult {\n const scrollRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n\n const [hasContentBelow, setHasContentBelow] = useState(false);\n const [overflows, setOverflows] = useState(false);\n const [thumb, setThumb] = useState<ThumbGeometry>({top: 0, height: 0});\n\n const rafIdRef = useRef<number | null>(null);\n const scheduleUpdate = useCallback(() => {\n if (rafIdRef.current !== null) {\n return;\n }\n\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = null;\n\n const el = scrollRef.current;\n\n if (!el) {\n return;\n }\n\n const {scrollTop, scrollHeight, clientHeight} = el;\n const isOverflowing = scrollHeight > clientHeight;\n // `-1` guards against subpixel rounding at the bottom.\n const notAtBottom = scrollTop + clientHeight < scrollHeight - 1;\n\n setOverflows(isOverflowing);\n setHasContentBelow(isOverflowing && notAtBottom);\n\n if (!isOverflowing) {\n setThumb({top: 0, height: 0});\n return;\n }\n\n const ratio = clientHeight / scrollHeight;\n const rawHeight = clientHeight * ratio;\n const height = Math.max(rawHeight, MIN_THUMB_HEIGHT);\n const maxTop = clientHeight - height;\n const scrollRatio =\n scrollHeight - clientHeight > 0 ? scrollTop / (scrollHeight - clientHeight) : 0;\n const top = maxTop * scrollRatio;\n\n setThumb({top, height});\n });\n }, []);\n\n useEffect(() => {\n const el = scrollRef.current;\n\n if (!el) {\n return undefined;\n }\n\n scheduleUpdate();\n\n if (typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n\n const observer = new ResizeObserver(scheduleUpdate);\n observer.observe(el);\n return () => observer.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scheduleUpdate, ...recalcDeps]);\n\n useEffect(() => {\n return () => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n };\n }, []);\n\n // Wheel events do not reach the native scroll layer when the cursor is over\n // the overlay track — forward them explicitly. `passive: false` is required\n // so `preventDefault` works in all browsers.\n useLayoutEffect(() => {\n if (!overflows) {\n return undefined;\n }\n\n const track = trackRef.current;\n const scrollEl = scrollRef.current;\n\n if (!track || !scrollEl) {\n return undefined;\n }\n\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n scrollEl.scrollTop += e.deltaY;\n };\n\n track.addEventListener('wheel', onWheel, {passive: false});\n return () => track.removeEventListener('wheel', onWheel);\n }, [overflows]);\n\n const cancelProgrammaticSmoothScroll = useCallback((scrollEl: HTMLDivElement) => {\n const top = scrollEl.scrollTop;\n scrollEl.scrollTo({top, behavior: 'auto'});\n }, []);\n\n const handleThumbPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const scrollEl = scrollRef.current;\n const thumbEl = thumbRef.current;\n\n if (!scrollEl || !thumbEl || event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n cancelProgrammaticSmoothScroll(scrollEl);\n\n const startY = event.clientY;\n const startScrollTop = scrollEl.scrollTop;\n const {scrollHeight, clientHeight} = scrollEl;\n const thumbHeight = thumbEl.getBoundingClientRect().height;\n const trackHeight = clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n const maxScrollTop = scrollHeight - clientHeight;\n\n if (maxThumbTop <= 0 || maxScrollTop <= 0) {\n return;\n }\n\n const handlePointerMove = (moveEvent: PointerEvent) => {\n const deltaY = moveEvent.clientY - startY;\n const deltaScroll = (deltaY / maxThumbTop) * maxScrollTop;\n scrollEl.scrollTop = startScrollTop + deltaScroll;\n };\n\n const handlePointerUp = () => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('pointercancel', handlePointerUp);\n };\n\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('pointercancel', handlePointerUp);\n },\n [cancelProgrammaticSmoothScroll],\n );\n\n const handleTrackPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const scrollEl = scrollRef.current;\n const thumbEl = thumbRef.current;\n\n if (\n !scrollEl ||\n !thumbEl ||\n event.button !== 0 ||\n event.target !== event.currentTarget\n ) {\n return;\n }\n\n cancelProgrammaticSmoothScroll(scrollEl);\n\n const trackRect = event.currentTarget.getBoundingClientRect();\n const thumbHeight = thumbEl.getBoundingClientRect().height;\n const clickY = event.clientY - trackRect.top;\n const targetThumbTop = Math.max(\n 0,\n Math.min(clickY - thumbHeight / 2, trackRect.height - thumbHeight),\n );\n const maxThumbTop = trackRect.height - thumbHeight;\n const maxScrollTop = scrollEl.scrollHeight - scrollEl.clientHeight;\n\n if (maxThumbTop <= 0 || maxScrollTop <= 0) {\n return;\n }\n\n // `auto` avoids racing with a subsequent thumb drag (smooth scroll would\n // still animate while pointer handlers update `scrollTop`).\n scrollEl.scrollTo({\n top: (targetThumbTop / maxThumbTop) * maxScrollTop,\n behavior: 'auto',\n });\n },\n [cancelProgrammaticSmoothScroll],\n );\n\n return {\n scrollRef,\n trackRef,\n thumbRef,\n hasContentBelow,\n overflows,\n thumb,\n scheduleUpdate,\n handleThumbPointerDown,\n handleTrackPointerDown,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MenuGroup } from '../../../types';
|
|
2
|
+
import { AsideHeaderItem } from '../../types';
|
|
3
|
+
interface GroupHeaderItem extends AsideHeaderItem {
|
|
4
|
+
isGroupHeader: true;
|
|
5
|
+
groupChildren: AsideHeaderItem[];
|
|
6
|
+
/** Optional title shown at the top of the compact popup listing group children. */
|
|
7
|
+
groupPopupTitle?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function isGroupHeaderItem(item: AsideHeaderItem | GroupHeaderItem): item is GroupHeaderItem;
|
|
10
|
+
export declare function getGroupedItems(items: AsideHeaderItem[], groups: MenuGroup[] | undefined): AsideHeaderItem[];
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const GROUP_HEADER_ITEM_PREFIX = '__gn-composite-bar__group-header__';
|
|
2
|
+
function isGroupHeaderItem(item) {
|
|
3
|
+
return 'isGroupHeader' in item && item.isGroupHeader;
|
|
4
|
+
}
|
|
5
|
+
function getGroupedItems(items, groups) {
|
|
6
|
+
if (!groups || groups.length === 0) {
|
|
7
|
+
return items;
|
|
8
|
+
}
|
|
9
|
+
const visibleGroups = groups.filter((g) => !g.hidden);
|
|
10
|
+
if (visibleGroups.length === 0) {
|
|
11
|
+
return items;
|
|
12
|
+
}
|
|
13
|
+
const groupMap = new Map();
|
|
14
|
+
for (const group of visibleGroups) {
|
|
15
|
+
groupMap.set(group.id, group);
|
|
16
|
+
}
|
|
17
|
+
const groupChildrenMap = new Map();
|
|
18
|
+
const ungroupedItems = [];
|
|
19
|
+
const groupFirstIndex = new Map();
|
|
20
|
+
for (let i = 0; i < items.length; i++) {
|
|
21
|
+
const item = items[i];
|
|
22
|
+
if (item.hidden) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const groupId = item.groupId;
|
|
26
|
+
if (groupId && groupMap.has(groupId)) {
|
|
27
|
+
let groupChildren = groupChildrenMap.get(groupId);
|
|
28
|
+
if (!groupChildren) {
|
|
29
|
+
groupChildren = [];
|
|
30
|
+
groupChildrenMap.set(groupId, groupChildren);
|
|
31
|
+
groupFirstIndex.set(groupId, i);
|
|
32
|
+
}
|
|
33
|
+
groupChildren.push(item);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
ungroupedItems.push({ index: i, item });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const result = [...ungroupedItems];
|
|
40
|
+
for (const [groupId, children] of groupChildrenMap.entries()) {
|
|
41
|
+
if (children.length === 0)
|
|
42
|
+
continue;
|
|
43
|
+
const group = groupMap.get(groupId);
|
|
44
|
+
const firstIndex = groupFirstIndex.get(groupId);
|
|
45
|
+
if (!group || firstIndex === undefined) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const hasCurrent = children.some((child) => child.current);
|
|
49
|
+
const groupHeaderItem = {
|
|
50
|
+
id: `${GROUP_HEADER_ITEM_PREFIX}${groupId}`,
|
|
51
|
+
title: group.title,
|
|
52
|
+
icon: group.icon,
|
|
53
|
+
current: hasCurrent,
|
|
54
|
+
isGroupHeader: true,
|
|
55
|
+
groupChildren: children,
|
|
56
|
+
groupPopupTitle: group.popupTitle,
|
|
57
|
+
};
|
|
58
|
+
result.push({ index: firstIndex, item: groupHeaderItem });
|
|
59
|
+
}
|
|
60
|
+
result.sort((a, b) => a.index - b.index);
|
|
61
|
+
return result.map((r) => r.item);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { getGroupedItems, isGroupHeaderItem };
|
|
65
|
+
//# sourceMappingURL=grouping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grouping.js","sources":["../../../../../../../src/components/AsideHeader/components/CompositeBar/grouping.ts"],"sourcesContent":["import {MenuGroup} from '../../../types';\nimport {AsideHeaderItem} from '../../types';\n\nconst GROUP_HEADER_ITEM_PREFIX = '__gn-composite-bar__group-header__';\n\ninterface GroupHeaderItem extends AsideHeaderItem {\n isGroupHeader: true;\n groupChildren: AsideHeaderItem[];\n /** Optional title shown at the top of the compact popup listing group children. */\n groupPopupTitle?: string;\n}\n\nexport function isGroupHeaderItem(\n item: AsideHeaderItem | GroupHeaderItem,\n): item is GroupHeaderItem {\n return 'isGroupHeader' in item && item.isGroupHeader;\n}\n\nexport function getGroupedItems(\n items: AsideHeaderItem[],\n groups: MenuGroup[] | undefined,\n): AsideHeaderItem[] {\n if (!groups || groups.length === 0) {\n return items;\n }\n\n const visibleGroups = groups.filter((g) => !g.hidden);\n if (visibleGroups.length === 0) {\n return items;\n }\n\n const groupMap = new Map<string, MenuGroup>();\n for (const group of visibleGroups) {\n groupMap.set(group.id, group);\n }\n\n const groupChildrenMap = new Map<string, AsideHeaderItem[]>();\n const ungroupedItems: Array<{index: number; item: AsideHeaderItem}> = [];\n const groupFirstIndex = new Map<string, number>();\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n if (item.hidden) {\n continue;\n }\n\n const groupId = item.groupId;\n\n if (groupId && groupMap.has(groupId)) {\n let groupChildren = groupChildrenMap.get(groupId);\n\n if (!groupChildren) {\n groupChildren = [];\n\n groupChildrenMap.set(groupId, groupChildren);\n groupFirstIndex.set(groupId, i);\n }\n\n groupChildren.push(item);\n } else {\n ungroupedItems.push({index: i, item});\n }\n }\n\n const result: Array<{index: number; item: AsideHeaderItem}> = [...ungroupedItems];\n\n for (const [groupId, children] of groupChildrenMap.entries()) {\n if (children.length === 0) continue;\n\n const group = groupMap.get(groupId);\n const firstIndex = groupFirstIndex.get(groupId);\n\n if (!group || firstIndex === undefined) {\n continue;\n }\n\n const hasCurrent = children.some((child) => child.current);\n\n const groupHeaderItem: GroupHeaderItem = {\n id: `${GROUP_HEADER_ITEM_PREFIX}${groupId}`,\n title: group.title,\n icon: group.icon,\n current: hasCurrent,\n isGroupHeader: true,\n groupChildren: children,\n groupPopupTitle: group.popupTitle,\n };\n\n result.push({index: firstIndex, item: groupHeaderItem});\n }\n\n result.sort((a, b) => a.index - b.index);\n return result.map((r) => r.item);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,22 @@
|
|
|
1
|
-
import { AsideHeaderItem
|
|
2
|
-
export declare function getItemHeight(compositeItem:
|
|
3
|
-
export declare function
|
|
1
|
+
import { AsideHeaderItem } from '../../types';
|
|
2
|
+
export declare function getItemHeight(compositeItem: AsideHeaderItem): 40 | 50 | 15;
|
|
3
|
+
export declare function getPopupItemHeight(compositeItem: AsideHeaderItem): 32 | 50 | 15;
|
|
4
|
+
export declare function getItemsHeight<T extends AsideHeaderItem>(items: T[]): number;
|
|
5
|
+
export declare function getPopupItemsHeight<T extends AsideHeaderItem>(items: T[]): number;
|
|
4
6
|
export declare function getSelectedItemIndex(compositeItems: AsideHeaderItem[]): number | undefined;
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
7
|
+
export declare function getItemsMinHeight(compositeItems: AsideHeaderItem[]): number;
|
|
8
|
+
export declare function getMoreButtonItem(menuMoreTitle?: string): AsideHeaderItem;
|
|
9
|
+
/**
|
|
10
|
+
* Reorders items so that entries flagged with `afterMoreButton` are pushed
|
|
11
|
+
* to the end. This keeps the DOM order consistent between `v1` (collapse
|
|
12
|
+
* into "More") and `v2` (scrollable) modes.
|
|
13
|
+
*
|
|
14
|
+
* @param compositeItems items to reorder
|
|
15
|
+
* @returns new array with `afterMoreButton` items moved to the end, or the
|
|
16
|
+
* same reference when no reordering is needed
|
|
17
|
+
*/
|
|
18
|
+
export declare function getReorderedItems(compositeItems: AsideHeaderItem[]): AsideHeaderItem[];
|
|
19
|
+
export declare function getAutosizeListItems(compositeItems: AsideHeaderItem[], height: number, collapseItem: AsideHeaderItem): {
|
|
20
|
+
listItems: AsideHeaderItem[];
|
|
21
|
+
collapseItems: AsideHeaderItem[];
|
|
22
|
+
};
|
|
@@ -1,79 +1,124 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Ellipsis } from '@gravity-ui/icons';
|
|
2
|
+
import { ITEM_HEIGHT, POPUP_REGULAR_ITEM_HEIGHT } from '../../../constants.js';
|
|
3
|
+
import { COLLAPSE_ITEM_ID } from './constants.js';
|
|
3
4
|
|
|
4
|
-
function
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
function getItemHeight(compositeItem) {
|
|
6
|
+
switch (compositeItem.type) {
|
|
7
|
+
case 'action':
|
|
8
|
+
return 50;
|
|
9
|
+
case 'divider':
|
|
10
|
+
return 15;
|
|
11
|
+
default:
|
|
12
|
+
return ITEM_HEIGHT;
|
|
12
13
|
}
|
|
14
|
+
}
|
|
15
|
+
function getPopupItemHeight(compositeItem) {
|
|
13
16
|
switch (compositeItem.type) {
|
|
14
17
|
case 'action':
|
|
15
18
|
return 50;
|
|
16
19
|
case 'divider':
|
|
17
20
|
return 15;
|
|
18
21
|
default:
|
|
19
|
-
return
|
|
22
|
+
return POPUP_REGULAR_ITEM_HEIGHT;
|
|
20
23
|
}
|
|
21
24
|
}
|
|
22
|
-
function getItemsHeight(items
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
function getItemsHeight(items) {
|
|
26
|
+
return items.reduce((sum, item) => sum + getItemHeight(item), 0);
|
|
27
|
+
}
|
|
28
|
+
function getPopupItemsHeight(items) {
|
|
29
|
+
return items.reduce((sum, item) => sum + getPopupItemHeight(item), 0);
|
|
25
30
|
}
|
|
26
31
|
function getSelectedItemIndex(compositeItems) {
|
|
27
32
|
const index = compositeItems.findIndex(({ current }) => Boolean(current));
|
|
28
33
|
return index === -1 ? undefined : index;
|
|
29
34
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
|
|
35
|
+
function getPinnedItems(compositeItems) {
|
|
36
|
+
const pinnedItems = [];
|
|
37
|
+
for (const compositeItem of compositeItems) {
|
|
38
|
+
if (compositeItem.pinned) {
|
|
39
|
+
pinnedItems.push(compositeItem);
|
|
40
|
+
}
|
|
41
|
+
else if (compositeItem.type === 'divider') {
|
|
42
|
+
if (pinnedItems.length > 0 && pinnedItems[pinnedItems.length - 1].type !== 'divider') {
|
|
43
|
+
pinnedItems.push(compositeItem);
|
|
44
|
+
}
|
|
35
45
|
}
|
|
36
|
-
const prev = items[index - 1];
|
|
37
|
-
return (prev === null || prev === undefined ? undefined : prev.type) !== 'divider';
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
/** Removes dividers from the start and end of the list. */
|
|
41
|
-
function filterLeadingAndTrailingDividers(items) {
|
|
42
|
-
const firstNonDividerIndex = items.findIndex((item) => item.type !== 'divider');
|
|
43
|
-
if (firstNonDividerIndex === -1) {
|
|
44
|
-
return [];
|
|
45
|
-
}
|
|
46
|
-
let lastNonDividerIndex = items.length - 1;
|
|
47
|
-
while (lastNonDividerIndex >= firstNonDividerIndex &&
|
|
48
|
-
items[lastNonDividerIndex].type === 'divider') {
|
|
49
|
-
lastNonDividerIndex--;
|
|
50
46
|
}
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
return pinnedItems;
|
|
48
|
+
}
|
|
49
|
+
function getItemsMinHeight(compositeItems) {
|
|
50
|
+
const pinnedItems = getPinnedItems(compositeItems);
|
|
51
|
+
const afterMoreButtonItems = compositeItems.filter(({ afterMoreButton }) => afterMoreButton);
|
|
52
|
+
return (getItemsHeight(pinnedItems) +
|
|
53
|
+
getItemsHeight(afterMoreButtonItems) +
|
|
54
|
+
(pinnedItems.length === compositeItems.length ? 0 : ITEM_HEIGHT));
|
|
55
|
+
}
|
|
56
|
+
function getMoreButtonItem(menuMoreTitle) {
|
|
57
|
+
return {
|
|
58
|
+
id: COLLAPSE_ITEM_ID,
|
|
59
|
+
title: menuMoreTitle,
|
|
60
|
+
icon: Ellipsis,
|
|
61
|
+
iconSize: 18,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Reorders items so that entries flagged with `afterMoreButton` are pushed
|
|
66
|
+
* to the end. This keeps the DOM order consistent between `v1` (collapse
|
|
67
|
+
* into "More") and `v2` (scrollable) modes.
|
|
68
|
+
*
|
|
69
|
+
* @param compositeItems items to reorder
|
|
70
|
+
* @returns new array with `afterMoreButton` items moved to the end, or the
|
|
71
|
+
* same reference when no reordering is needed
|
|
72
|
+
*/
|
|
73
|
+
function getReorderedItems(compositeItems) {
|
|
74
|
+
const afterMoreButtonItems = compositeItems.filter(({ afterMoreButton }) => afterMoreButton);
|
|
75
|
+
if (afterMoreButtonItems.length === 0) {
|
|
76
|
+
return compositeItems;
|
|
53
77
|
}
|
|
54
|
-
|
|
78
|
+
const regularItems = compositeItems.filter(({ afterMoreButton }) => !afterMoreButton);
|
|
79
|
+
return [...regularItems, ...afterMoreButtonItems];
|
|
55
80
|
}
|
|
56
|
-
function
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
81
|
+
function getAutosizeListItems(compositeItems, height, collapseItem) {
|
|
82
|
+
var _a, _b, _c;
|
|
83
|
+
const afterMoreButtonItems = compositeItems.filter(({ afterMoreButton }) => afterMoreButton);
|
|
84
|
+
const regularItems = compositeItems.filter(({ afterMoreButton }) => !afterMoreButton);
|
|
85
|
+
const listItems = [...regularItems, ...afterMoreButtonItems];
|
|
86
|
+
const allItemsHeight = getItemsHeight(listItems);
|
|
87
|
+
if (allItemsHeight <= height) {
|
|
88
|
+
return { listItems, collapseItems: [] };
|
|
89
|
+
}
|
|
90
|
+
const collapseItemHeight = getItemHeight(collapseItem);
|
|
91
|
+
listItems.splice(regularItems.length, 0, collapseItem);
|
|
92
|
+
const collapseItems = [];
|
|
93
|
+
let listHeight = allItemsHeight + collapseItemHeight;
|
|
94
|
+
let index = listItems.length;
|
|
95
|
+
while (listHeight > height) {
|
|
96
|
+
if (index === 0) {
|
|
97
|
+
break;
|
|
62
98
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
99
|
+
index--;
|
|
100
|
+
const compositeItem = listItems[index];
|
|
101
|
+
if (compositeItem.pinned ||
|
|
102
|
+
compositeItem.id === COLLAPSE_ITEM_ID ||
|
|
103
|
+
compositeItem.afterMoreButton) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (compositeItem.type === 'divider') {
|
|
107
|
+
if (index + 1 < listItems.length && ((_a = listItems[index + 1]) === null || _a === undefined ? undefined : _a.type) === 'divider') {
|
|
108
|
+
listHeight -= getItemHeight(compositeItem);
|
|
109
|
+
listItems.splice(index, 1);
|
|
110
|
+
}
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
listHeight -= getItemHeight(compositeItem);
|
|
114
|
+
collapseItems.unshift(...listItems.splice(index, 1));
|
|
115
|
+
}
|
|
116
|
+
if (((_b = listItems[index]) === null || _b === undefined ? undefined : _b.type) === 'divider' &&
|
|
117
|
+
(index === 0 || ((_c = listItems[index - 1]) === null || _c === undefined ? undefined : _c.type) === 'divider')) {
|
|
118
|
+
listItems.splice(index, 1);
|
|
74
119
|
}
|
|
75
|
-
return
|
|
120
|
+
return { listItems, collapseItems };
|
|
76
121
|
}
|
|
77
122
|
|
|
78
|
-
export {
|
|
123
|
+
export { getAutosizeListItems, getItemHeight, getItemsHeight, getItemsMinHeight, getMoreButtonItem, getPopupItemHeight, getPopupItemsHeight, getReorderedItems, getSelectedItemIndex };
|
|
79
124
|
//# sourceMappingURL=utils.js.map
|