@gravity-ui/navigation 0.22.1 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
1
  import { MenuItem } from '../types';
2
2
  export declare const ALL_PAGES_ID: "all-pages";
3
- export declare const ALL_PAGES_MENU_ITEM: MenuItem;
3
+ export declare function getAllPagesMenuItem(): MenuItem;
@@ -1,3 +1,3 @@
1
1
  export { AllPagesPanel } from './AllPagesPanel';
2
- export { ALL_PAGES_MENU_ITEM, ALL_PAGES_ID } from './constants';
2
+ export { getAllPagesMenuItem, ALL_PAGES_ID } from './constants';
3
3
  export { useVisibleMenuItems } from './useVisibleMenuItems';
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
2
  import { AsideHeaderProps } from './types';
3
3
  import './AsideHeader.scss';
4
- export declare const AsideHeader: (props: AsideHeaderProps) => React.JSX.Element;
4
+ export declare const AsideHeader: React.ForwardRefExoticComponent<AsideHeaderProps & React.RefAttributes<HTMLDivElement>>;
@@ -1,2 +1,2 @@
1
1
  import React from 'react';
2
- export declare const FirstPanel: () => React.JSX.Element;
2
+ export declare const FirstPanel: React.ForwardRefExoticComponent<React.RefAttributes<HTMLDivElement>>;
@@ -14,7 +14,7 @@ export interface AsideHeaderGeneralProps {
14
14
  renderFooter?: (data: {
15
15
  size: number;
16
16
  compact: boolean;
17
- asideRef: React.RefObject<HTMLDivElement>;
17
+ asideRef: React.ForwardedRef<HTMLDivElement>;
18
18
  }) => React.ReactNode;
19
19
  onClosePanel?: () => void;
20
20
  onChangeCompact?: (compact: boolean) => void;
@@ -1673,12 +1673,14 @@ const COMPONENT$4 = 'AllPagesPanel';
1673
1673
  var i18n$4 = registerKeyset({ en: en$4, ru: ru$4 }, COMPONENT$4);
1674
1674
 
1675
1675
  const ALL_PAGES_ID = 'all-pages';
1676
- const ALL_PAGES_MENU_ITEM = {
1677
- id: ALL_PAGES_ID,
1678
- title: i18n$4('menu-item.all-pages.title'),
1679
- tooltipText: i18n$4('menu-item.all-pages.title'),
1680
- icon: Ellipsis,
1681
- };
1676
+ function getAllPagesMenuItem() {
1677
+ return {
1678
+ id: ALL_PAGES_ID,
1679
+ title: i18n$4('menu-item.all-pages.title'),
1680
+ tooltipText: i18n$4('menu-item.all-pages.title'),
1681
+ icon: Ellipsis,
1682
+ };
1683
+ }
1682
1684
 
1683
1685
  const useGroupedMenuItems = (items) => {
1684
1686
  const allPagesMenuItems = useMemo(() => {
@@ -4998,24 +5000,25 @@ const Panels = () => {
4998
5000
  return panelItems ? (React__default.createElement(Drawer, { className: b$m('panels'), onVeilClick: onClosePanel, onEscape: onClosePanel, style: { left: size } }, panelItems.map((item) => (React__default.createElement(DrawerItem, Object.assign({ key: item.id }, item)))))) : null;
4999
5001
  };
5000
5002
 
5001
- const FirstPanel = () => {
5003
+ const FirstPanel = React__default.forwardRef((_props, ref) => {
5002
5004
  const { size, onItemClick, headerDecoration, multipleTooltip, menuMoreTitle, renderFooter, compact, } = useAsideHeaderInnerContext();
5003
5005
  const visibleMenuItems = useVisibleMenuItems();
5004
5006
  const asideRef = useRef(null);
5007
+ const popupAnchorRef = useMemo(() => ref || asideRef, [ref, asideRef]);
5005
5008
  return (React__default.createElement(React__default.Fragment, null,
5006
5009
  React__default.createElement("div", { className: b$m('aside'), style: { width: size } },
5007
- React__default.createElement("div", { className: b$m('aside-popup-anchor'), ref: asideRef }),
5010
+ React__default.createElement("div", { className: b$m('aside-popup-anchor'), ref: popupAnchorRef }),
5008
5011
  React__default.createElement("div", { className: b$m('aside-content', { ['with-decoration']: headerDecoration }) },
5009
5012
  React__default.createElement(Header, null),
5010
5013
  (visibleMenuItems === null || visibleMenuItems === void 0 ? void 0 : visibleMenuItems.length) ? (React__default.createElement(CompositeBar, { type: "menu", items: visibleMenuItems, menuMoreTitle: menuMoreTitle !== null && menuMoreTitle !== void 0 ? menuMoreTitle : i18n$3('label_more'), onItemClick: onItemClick, multipleTooltip: multipleTooltip })) : (React__default.createElement("div", { className: b$m('menu-items') })),
5011
5014
  React__default.createElement("div", { className: b$m('footer') }, renderFooter === null || renderFooter === void 0 ? void 0 : renderFooter({
5012
5015
  size,
5013
5016
  compact: Boolean(compact),
5014
- asideRef,
5017
+ asideRef: popupAnchorRef,
5015
5018
  })),
5016
5019
  React__default.createElement(CollapseButton, null))),
5017
5020
  React__default.createElement(Panels, null)));
5018
- };
5021
+ });
5019
5022
 
5020
5023
  var css_248z$h = ".g-root {\n --gn-aside-header-background-color: var(--g-color-base-warning-light);\n --gn-aside-header-collapse-button-divider-line-color: var(\n --gn-aside-header-subheader-divider-line-color\n );\n --gn-aside-header-footer-item-icon-color: var(--g-color-text-primary);\n --gn-aside-header-subheader-item-icon-color: var(--g-color-text-primary);\n --gn-aside-header-item-icon-background-size: 38px;\n}\n\n.g-root_theme_light,\n.g-root_theme_light-hc {\n --gn-aside-header-divider-line-color: transparent;\n --gn-aside-header-subheader-divider-line-color: var(--g-color-line-generic);\n}\n\n.g-root_theme_dark,\n.g-root_theme_dark-hc {\n --gn-aside-header-divider-line-color: var(--g-color-line-generic-solid);\n --gn-aside-header-subheader-divider-line-color: var(--g-color-line-generic-solid);\n}\n\n.gn-aside-header {\n --gn-aside-header-min-width: 56px;\n height: 100%;\n width: 100%;\n position: relative;\n background-color: var(--g-color-base-background);\n}\n.gn-aside-header__aside {\n position: sticky;\n top: 0;\n left: 0;\n height: 100vh;\n width: inherit;\n display: flex;\n flex-direction: column;\n background-color: var(--g-color-base-background);\n z-index: 100;\n box-sizing: border-box;\n}\n.gn-aside-header__aside::after {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n width: 1px;\n height: 100%;\n content: \"\";\n background-color: var(--gn-aside-header-divider-line-color);\n}\n.gn-aside-header__aside-popup-anchor {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n}\n.gn-aside-header__aside-content {\n --gradient-height: 334px;\n display: flex;\n flex-direction: column;\n overflow-x: hidden;\n width: inherit;\n height: inherit;\n position: relative;\n z-index: 2;\n user-select: none;\n}\n.gn-aside-header__aside-content::after {\n position: absolute;\n top: 0;\n right: -100px;\n bottom: 0;\n width: 100px;\n content: \"\";\n box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.1), 0px 0px 24px rgba(0, 0, 0, 0.08);\n}\n.gn-aside-header__aside-content > .gn-aside-header-logo {\n margin: 8px 0;\n}\n.gn-aside-header__aside-content_with-decoration {\n background: linear-gradient(180deg, var(--gn-aside-header-background-color) calc(var(--gradient-height) * 0.33), transparent calc(var(--gradient-height) * 0.88));\n}\n.gn-aside-header_compact .gn-aside-header__aside-content {\n background: transparent;\n}\n.gn-aside-header__header {\n --gn-aside-header-header-divider-height: 29px;\n position: relative;\n z-index: 1;\n flex: none;\n box-sizing: border-box;\n width: 100%;\n padding-top: 8px;\n padding-bottom: 22px;\n}\n.gn-aside-header__header .gn-aside-header__header-divider {\n position: absolute;\n bottom: 0;\n left: 0;\n z-index: -2;\n display: none;\n color: var(--gn-aside-header-background-color);\n}\n.gn-aside-header__header_with-decoration::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: -2;\n display: none;\n width: 100%;\n height: calc(100% - var(--gn-aside-header-header-divider-height));\n content: \"\";\n background-color: var(--gn-aside-header-background-color);\n}\n.gn-aside-header__header::after {\n position: absolute;\n bottom: 12px;\n left: 0;\n z-index: -2;\n width: 100%;\n height: 1px;\n content: \"\";\n background-color: var(--gn-aside-header-subheader-divider-line-color);\n}\n.gn-aside-header_compact .gn-aside-header__header::before {\n display: block;\n}\n.gn-aside-header_compact .gn-aside-header__header_with-decoration .gn-aside-header__header-divider {\n display: block;\n}\n.gn-aside-header_compact .gn-aside-header__header_with-decoration::after {\n display: none;\n}\n.gn-aside-header__menu-items {\n flex-grow: 1;\n}\n.gn-aside-header__footer {\n flex-shrink: 0;\n width: 100%;\n margin: 8px 0;\n display: flex;\n flex-direction: column;\n}\n.gn-aside-header__panels {\n z-index: 98;\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n overflow: auto;\n}\n.gn-aside-header__panel {\n height: 100%;\n}\n.gn-aside-header__pane-container {\n display: flex;\n outline: none;\n overflow: visible;\n user-select: text;\n flex-direction: row;\n}\n.gn-aside-header__content {\n width: calc(100% - var(--gn-aside-header-size));\n z-index: 95;\n}\n.gn-aside-header__collapse-button {\n --yc-button-background-color-hover: transparent;\n overflow: hidden;\n box-sizing: border-box;\n flex: none;\n width: 100%;\n height: 20px;\n border-top: 1px solid var(--gn-aside-header-collapse-button-divider-line-color);\n margin-top: auto;\n}\n.gn-aside-header__collapse-button > .yc-button__text {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 20px;\n}\n.gn-aside-header__collapse-button:not(.gn-aside-header__collapse-button_compact) .gn-aside-header__collapse-icon {\n transform: rotate(180deg);\n}\n.gn-aside-header__collapse-button .gn-aside-header__collapse-icon {\n color: var(--g-color-text-secondary);\n}\n.gn-aside-header__collapse-button:hover .gn-aside-header__collapse-icon {\n color: var(--g-color-text-primary);\n}";
5021
5024
  styleInject(css_248z$h);
@@ -5029,6 +5032,9 @@ const EMPTY_MENU_ITEMS = [];
5029
5032
  const useAsideHeaderInnerContextValue = (props) => {
5030
5033
  const { size, onClosePanel, menuItems, panelItems, onMenuItemsChanged } = props;
5031
5034
  const [innerVisiblePanel, setInnerVisiblePanel] = useState();
5035
+ const ALL_PAGES_MENU_ITEM = React__default.useMemo(() => {
5036
+ return getAllPagesMenuItem();
5037
+ }, []);
5032
5038
  const allPagesIsAvailable = Boolean(onMenuItemsChanged) && (!menuItems || (menuItems === null || menuItems === void 0 ? void 0 : menuItems.length) > 0);
5033
5039
  useEffect(() => {
5034
5040
  // If any user panel became visible we need to switch off all inner panels
@@ -5049,13 +5055,13 @@ const useAsideHeaderInnerContextValue = (props) => {
5049
5055
  innerOnClosePanel();
5050
5056
  }
5051
5057
  (_a = item.onItemClick) === null || _a === void 0 ? void 0 : _a.call(item, item, collapsed, event);
5052
- }, [innerOnClosePanel]);
5058
+ }, [innerOnClosePanel, ALL_PAGES_MENU_ITEM]);
5053
5059
  const innerMenuItems = useMemo(() => allPagesIsAvailable
5054
5060
  ? [
5055
5061
  ...(menuItems || EMPTY_MENU_ITEMS),
5056
5062
  Object.assign(Object.assign({}, ALL_PAGES_MENU_ITEM), { current: innerVisiblePanel === InnerPanels.AllPages }),
5057
5063
  ]
5058
- : menuItems || EMPTY_MENU_ITEMS, [allPagesIsAvailable, menuItems, innerVisiblePanel]);
5064
+ : menuItems || EMPTY_MENU_ITEMS, [allPagesIsAvailable, menuItems, innerVisiblePanel, ALL_PAGES_MENU_ITEM]);
5059
5065
  const innerPanelItems = useMemo(() => {
5060
5066
  if (!allPagesIsAvailable) {
5061
5067
  return panelItems;
@@ -5073,7 +5079,7 @@ const useAsideHeaderInnerContextValue = (props) => {
5073
5079
  onItemClick });
5074
5080
  };
5075
5081
 
5076
- const AsideHeader = (props) => {
5082
+ const AsideHeader = React__default.forwardRef((props, ref) => {
5077
5083
  const { className, compact } = props;
5078
5084
  const size = compact ? ASIDE_HEADER_COMPACT_WIDTH : ASIDE_HEADER_EXPANDED_WIDTH;
5079
5085
  const asideHeaderContextValue = useMemo(() => ({ size, compact }), [compact, size]);
@@ -5082,9 +5088,9 @@ const AsideHeader = (props) => {
5082
5088
  React__default.createElement(AsideHeaderInnerContextProvider, { value: asideHeaderInnerContextValue },
5083
5089
  React__default.createElement("div", { className: b$m({ compact }, className) },
5084
5090
  React__default.createElement("div", { className: b$m('pane-container') },
5085
- React__default.createElement(FirstPanel, null),
5091
+ React__default.createElement(FirstPanel, { ref: ref }),
5086
5092
  React__default.createElement(Content, { size: size, renderContent: props.renderContent, className: b$m('content') }))))));
5087
- };
5093
+ });
5088
5094
 
5089
5095
  /******************************************************************************
5090
5096
  Copyright (c) Microsoft Corporation.