@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;
@@ -1700,12 +1700,14 @@ const COMPONENT$4 = 'AllPagesPanel';
1700
1700
  var i18n$4 = registerKeyset({ en: en$4, ru: ru$4 }, COMPONENT$4);
1701
1701
 
1702
1702
  const ALL_PAGES_ID = 'all-pages';
1703
- const ALL_PAGES_MENU_ITEM = {
1704
- id: ALL_PAGES_ID,
1705
- title: i18n$4('menu-item.all-pages.title'),
1706
- tooltipText: i18n$4('menu-item.all-pages.title'),
1707
- icon: icons.Ellipsis,
1708
- };
1703
+ function getAllPagesMenuItem() {
1704
+ return {
1705
+ id: ALL_PAGES_ID,
1706
+ title: i18n$4('menu-item.all-pages.title'),
1707
+ tooltipText: i18n$4('menu-item.all-pages.title'),
1708
+ icon: icons.Ellipsis,
1709
+ };
1710
+ }
1709
1711
 
1710
1712
  const useGroupedMenuItems = (items) => {
1711
1713
  const allPagesMenuItems = React.useMemo(() => {
@@ -5025,24 +5027,25 @@ const Panels = () => {
5025
5027
  return panelItems ? (React__default["default"].createElement(Drawer, { className: b$m('panels'), onVeilClick: onClosePanel, onEscape: onClosePanel, style: { left: size } }, panelItems.map((item) => (React__default["default"].createElement(DrawerItem, Object.assign({ key: item.id }, item)))))) : null;
5026
5028
  };
5027
5029
 
5028
- const FirstPanel = () => {
5030
+ const FirstPanel = React__default["default"].forwardRef((_props, ref) => {
5029
5031
  const { size, onItemClick, headerDecoration, multipleTooltip, menuMoreTitle, renderFooter, compact, } = useAsideHeaderInnerContext();
5030
5032
  const visibleMenuItems = useVisibleMenuItems();
5031
5033
  const asideRef = React.useRef(null);
5034
+ const popupAnchorRef = React.useMemo(() => ref || asideRef, [ref, asideRef]);
5032
5035
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
5033
5036
  React__default["default"].createElement("div", { className: b$m('aside'), style: { width: size } },
5034
- React__default["default"].createElement("div", { className: b$m('aside-popup-anchor'), ref: asideRef }),
5037
+ React__default["default"].createElement("div", { className: b$m('aside-popup-anchor'), ref: popupAnchorRef }),
5035
5038
  React__default["default"].createElement("div", { className: b$m('aside-content', { ['with-decoration']: headerDecoration }) },
5036
5039
  React__default["default"].createElement(Header, null),
5037
5040
  (visibleMenuItems === null || visibleMenuItems === void 0 ? void 0 : visibleMenuItems.length) ? (React__default["default"].createElement(CompositeBar, { type: "menu", items: visibleMenuItems, menuMoreTitle: menuMoreTitle !== null && menuMoreTitle !== void 0 ? menuMoreTitle : i18n$3('label_more'), onItemClick: onItemClick, multipleTooltip: multipleTooltip })) : (React__default["default"].createElement("div", { className: b$m('menu-items') })),
5038
5041
  React__default["default"].createElement("div", { className: b$m('footer') }, renderFooter === null || renderFooter === void 0 ? void 0 : renderFooter({
5039
5042
  size,
5040
5043
  compact: Boolean(compact),
5041
- asideRef,
5044
+ asideRef: popupAnchorRef,
5042
5045
  })),
5043
5046
  React__default["default"].createElement(CollapseButton, null))),
5044
5047
  React__default["default"].createElement(Panels, null)));
5045
- };
5048
+ });
5046
5049
 
5047
5050
  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}";
5048
5051
  styleInject(css_248z$h);
@@ -5056,6 +5059,9 @@ const EMPTY_MENU_ITEMS = [];
5056
5059
  const useAsideHeaderInnerContextValue = (props) => {
5057
5060
  const { size, onClosePanel, menuItems, panelItems, onMenuItemsChanged } = props;
5058
5061
  const [innerVisiblePanel, setInnerVisiblePanel] = React.useState();
5062
+ const ALL_PAGES_MENU_ITEM = React__default["default"].useMemo(() => {
5063
+ return getAllPagesMenuItem();
5064
+ }, []);
5059
5065
  const allPagesIsAvailable = Boolean(onMenuItemsChanged) && (!menuItems || (menuItems === null || menuItems === void 0 ? void 0 : menuItems.length) > 0);
5060
5066
  React.useEffect(() => {
5061
5067
  // If any user panel became visible we need to switch off all inner panels
@@ -5076,13 +5082,13 @@ const useAsideHeaderInnerContextValue = (props) => {
5076
5082
  innerOnClosePanel();
5077
5083
  }
5078
5084
  (_a = item.onItemClick) === null || _a === void 0 ? void 0 : _a.call(item, item, collapsed, event);
5079
- }, [innerOnClosePanel]);
5085
+ }, [innerOnClosePanel, ALL_PAGES_MENU_ITEM]);
5080
5086
  const innerMenuItems = React.useMemo(() => allPagesIsAvailable
5081
5087
  ? [
5082
5088
  ...(menuItems || EMPTY_MENU_ITEMS),
5083
5089
  Object.assign(Object.assign({}, ALL_PAGES_MENU_ITEM), { current: innerVisiblePanel === InnerPanels.AllPages }),
5084
5090
  ]
5085
- : menuItems || EMPTY_MENU_ITEMS, [allPagesIsAvailable, menuItems, innerVisiblePanel]);
5091
+ : menuItems || EMPTY_MENU_ITEMS, [allPagesIsAvailable, menuItems, innerVisiblePanel, ALL_PAGES_MENU_ITEM]);
5086
5092
  const innerPanelItems = React.useMemo(() => {
5087
5093
  if (!allPagesIsAvailable) {
5088
5094
  return panelItems;
@@ -5100,7 +5106,7 @@ const useAsideHeaderInnerContextValue = (props) => {
5100
5106
  onItemClick });
5101
5107
  };
5102
5108
 
5103
- const AsideHeader = (props) => {
5109
+ const AsideHeader = React__default["default"].forwardRef((props, ref) => {
5104
5110
  const { className, compact } = props;
5105
5111
  const size = compact ? ASIDE_HEADER_COMPACT_WIDTH : ASIDE_HEADER_EXPANDED_WIDTH;
5106
5112
  const asideHeaderContextValue = React.useMemo(() => ({ size, compact }), [compact, size]);
@@ -5109,9 +5115,9 @@ const AsideHeader = (props) => {
5109
5115
  React__default["default"].createElement(AsideHeaderInnerContextProvider, { value: asideHeaderInnerContextValue },
5110
5116
  React__default["default"].createElement("div", { className: b$m({ compact }, className) },
5111
5117
  React__default["default"].createElement("div", { className: b$m('pane-container') },
5112
- React__default["default"].createElement(FirstPanel, null),
5118
+ React__default["default"].createElement(FirstPanel, { ref: ref }),
5113
5119
  React__default["default"].createElement(Content, { size: size, renderContent: props.renderContent, className: b$m('content') }))))));
5114
- };
5120
+ });
5115
5121
 
5116
5122
  /******************************************************************************
5117
5123
  Copyright (c) Microsoft Corporation.