@gravity-ui/navigation 0.14.0 → 0.15.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,5 +1,5 @@
1
1
  import React from 'react';
2
- import { MenuItem, AsideHeaderDict, LogoProps } from '../types';
2
+ import { MenuItem, AsideHeaderDict, LogoProps, SubheaderMenuItem } from '../types';
3
3
  import { DrawerItemProps } from '../Drawer/Drawer';
4
4
  import { RenderContentType } from '../Content';
5
5
  import './AsideHeader.scss';
@@ -20,7 +20,7 @@ interface AsideHeaderGeneralProps {
20
20
  }
21
21
  interface AsideHeaderDefaultProps {
22
22
  panelItems: DrawerItemProps[];
23
- subheaderItems: MenuItem[];
23
+ subheaderItems: SubheaderMenuItem[];
24
24
  menuItems: MenuItem[];
25
25
  headerDecoration: boolean;
26
26
  }
@@ -1 +1,3 @@
1
+ import { MenuItem } from 'src/components/types';
2
+ export declare const menuItemsShowcase: MenuItem[];
1
3
  export declare const text = "\nDid you attend? He sang by grove ripe -\nThe bard of love, the singer of his mourning.\nWhen fields were silent by the early morning,\nTo sad and simple sounds of a pipe\nDid you attend?\n\nDid you behold in dark of forest leaf\nThe bard of love, the singer of his sadness?\nThe trace of tears, the smile, the utter paleness,\nThe quiet look, full of eternal grief,\nDid you behold?\n\nThen did you sigh when hearing how cries\nThe bard of love, the singer of his dole?\nWhen in the woods you saw the young man, sole,\nAnd met the look of his extinguished eyes,\nThen did you sigh?\n";
@@ -1,14 +1,18 @@
1
1
  import React, { FC } from 'react';
2
- import { AsideHeaderDict, MenuItem } from '../types';
2
+ import { AsideHeaderDict, MenuItem, SubheaderMenuItem } from '../types';
3
3
  import './CompositeBar.scss';
4
- interface CompositeBarBaseProps {
4
+ export type CompositeBarItem = MenuItem | SubheaderMenuItem;
5
+ type CompositeBarItems = {
6
+ type: 'menu';
5
7
  items: MenuItem[];
8
+ } | {
9
+ type: 'subheader';
10
+ items: SubheaderMenuItem[];
11
+ };
12
+ export type CompositeBarProps = CompositeBarItems & {
6
13
  onItemClick?: (item: MenuItem, collapsed: boolean, event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
7
14
  multipleTooltip?: boolean;
8
- }
9
- export interface CompositeBarProps extends CompositeBarBaseProps {
10
- enableCollapsing: boolean;
11
15
  dict?: AsideHeaderDict;
12
- }
16
+ };
13
17
  export declare const CompositeBar: FC<CompositeBarProps>;
14
18
  export {};
@@ -1,6 +1,7 @@
1
1
  import { AsideHeaderDict, MenuItem } from './../types';
2
- export declare function getItemHeight(item: MenuItem): 15 | 40 | 50;
3
- export declare function getItemsHeight(items: MenuItem[]): number;
2
+ import { CompositeBarItem } from '../CompositeBar/CompositeBar';
3
+ export declare function getItemHeight(item: CompositeBarItem): 40 | 15 | 50;
4
+ export declare function getItemsHeight<T extends CompositeBarItem>(items: T[]): number;
4
5
  export declare function getSelectedItemIndex(items: MenuItem[]): number | undefined;
5
6
  export declare function getPinnedItems(items: MenuItem[]): MenuItem[];
6
7
  export declare function getItemsMinHeight(items: MenuItem[]): number;
@@ -9,3 +10,4 @@ export declare function getAutosizeListItems(items: MenuItem[], height: number,
9
10
  listItems: MenuItem[];
10
11
  collapseItems: MenuItem[];
11
12
  };
13
+ export declare function isMenuItem(item: CompositeBarItem): item is MenuItem;
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { IconProps } from '@gravity-ui/uikit';
3
+ import { ItemProps } from 'src/components/CompositeBar/Item/Item';
3
4
  export type MenuItemType = 'regular' | 'action' | 'divider';
4
5
  export interface MakeItemParams {
5
6
  icon?: React.ReactNode;
@@ -26,6 +27,7 @@ export interface MenuItem {
26
27
  type?: MenuItemType;
27
28
  afterMoreButton?: boolean;
28
29
  }
30
+ export type SubheaderMenuItem = Omit<ItemProps, 'onItemClick' | 'onItemClickCapture'>;
29
31
  export declare enum MobileHeaderDict {
30
32
  CloseBurger = "button_close-burger",
31
33
  OpenBurger = "button_open-burger"
@@ -3608,6 +3608,9 @@ const POPUP_PLACEMENT = ['right-start', 'right-end', 'right'];
3608
3608
  const POPUP_ITEM_HEIGHT = 28;
3609
3609
 
3610
3610
  function getItemHeight$1(item) {
3611
+ if (!isMenuItem(item)) {
3612
+ return ITEM_HEIGHT;
3613
+ }
3611
3614
  switch (item.type) {
3612
3615
  case 'action':
3613
3616
  return 50;
@@ -3694,6 +3697,9 @@ function getAutosizeListItems(items, height, collapseItem) {
3694
3697
  }
3695
3698
  return { listItems, collapseItems };
3696
3699
  }
3700
+ function isMenuItem(item) {
3701
+ return (item === null || item === void 0 ? void 0 : item.id) !== undefined;
3702
+ }
3697
3703
 
3698
3704
  var css_248z$k = ".gn-composite-bar-item {\n --composite-bar-item-action-size: 36px;\n display: flex;\n width: 100%;\n height: 100%;\n align-items: center;\n cursor: pointer;\n}\n.gn-composite-bar-item__icon {\n color: var(--g-color-text-misc);\n}\n.gn-composite-bar-item__icon-place {\n flex-shrink: 0;\n width: var(--aside-header-min-width);\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n.gn-composite-bar-item__title {\n display: flex;\n overflow: hidden;\n}\n.gn-composite-bar-item__title-text {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.gn-composite-bar-item__title-adornment {\n margin: 0 10px;\n}\n.gn-composite-bar-item__collapse-item {\n display: flex;\n padding: 0 16px;\n align-items: center;\n width: 100%;\n height: 100%;\n cursor: pointer;\n}\n.gn-composite-bar-item__collapse-item .gn-composite-bar-item__title-adornment {\n margin-right: 0;\n}\n.gn-composite-bar-item__menu-divider {\n margin: 0 8px;\n width: 100%;\n border-top: 1px solid var(--g-color-line-generic);\n cursor: default;\n}\n.gn-composite-bar-item__collapse-items-popup-content {\n padding: 4px 0;\n}\n.gn-composite-bar-item__link {\n display: flex;\n width: 100%;\n height: 100%;\n align-items: center;\n}\n.gn-composite-bar-item__link, .gn-composite-bar-item__link:hover, .gn-composite-bar-item__link:active, .gn-composite-bar-item__link:visited, .gn-composite-bar-item__link:focus {\n text-decoration: none;\n outline: none;\n color: inherit;\n}\n.gn-composite-bar-item__btn-icon {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.gn-composite-bar-item_type_action {\n justify-content: center;\n height: var(--composite-bar-item-action-size);\n margin: 0 10px 8px;\n background: var(--g-color-base-float);\n box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.03), 0px 5px 6px rgba(0, 0, 0, 0.12);\n border-radius: var(--composite-bar-item-action-size);\n transition: transform 0.1s ease-out, background-color 0.15s linear;\n}\n.gn-composite-bar-item_type_action:focus {\n box-shadow: 0 0 0 2px var(--g-color-line-misc);\n}\n.gn-composite-bar-item_type_action:focus:not(:focus-visible) {\n box-shadow: none;\n}\n.gn-composite-bar-item_type_action:hover {\n background-color: var(--g-color-base-float-hover);\n}\n.gn-composite-bar-item_type_action:active {\n box-shadow: 0 1px 2px var(--g-color-sfx-shadow);\n transition: none;\n transform: scale(0.96);\n}\n.gn-composite-bar-item_type_action .gn-composite-bar-item__icon-place {\n width: var(--composite-bar-item-action-size);\n}\n.gn-composite-bar-item_type_action .gn-composite-bar-item__title {\n margin-right: 16px;\n}\n.gn-composite-bar-item__icon-tooltip_item-type_action {\n margin-left: 10px;\n}\n.gn-composite-bar-item:not(.gn-composite-bar-item_compact).gn-composite-bar-item_current.gn-composite-bar-item_type_regular {\n background-color: var(--g-color-base-selection);\n}\n.gn-composite-bar-item:not(.gn-composite-bar-item_compact):not(.gn-composite-bar-item_current):hover.gn-composite-bar-item_type_regular {\n background-color: var(--g-color-base-simple-hover);\n}\n.gn-composite-bar-item_compact.gn-composite-bar-item_type_action {\n width: var(--composite-bar-item-action-size);\n}\n.gn-composite-bar-item_compact.gn-composite-bar-item_type_action .gn-composite-bar-item__title {\n margin: 0;\n}\n.gn-composite-bar-item_compact.gn-composite-bar-item_current.gn-composite-bar-item_type_regular .gn-composite-bar-item__btn-icon {\n position: relative;\n background-color: transparent;\n}\n.gn-composite-bar-item_compact.gn-composite-bar-item_current.gn-composite-bar-item_type_regular .gn-composite-bar-item__btn-icon::before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: -1;\n width: 38px;\n height: 38px;\n margin-top: -19px;\n margin-left: -19px;\n border-radius: 7px;\n}\n.gn-composite-bar-item_compact.gn-composite-bar-item_current.gn-composite-bar-item_type_regular .gn-composite-bar-item__btn-icon::before {\n background-color: var(--g-color-base-selection);\n}\n.gn-composite-bar-item_compact:not(.gn-composite-bar-item_current):hover.gn-composite-bar-item_type_regular .gn-composite-bar-item__btn-icon {\n position: relative;\n background-color: transparent;\n}\n.gn-composite-bar-item_compact:not(.gn-composite-bar-item_current):hover.gn-composite-bar-item_type_regular .gn-composite-bar-item__btn-icon::before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: -1;\n width: 38px;\n height: 38px;\n margin-top: -19px;\n margin-left: -19px;\n border-radius: 7px;\n}\n.gn-composite-bar-item_compact:not(.gn-composite-bar-item_current):hover.gn-composite-bar-item_type_regular .gn-composite-bar-item__btn-icon::before {\n background-color: var(--g-color-base-simple-hover);\n}";
3699
3705
  styleInject(css_248z$k);
@@ -3756,7 +3762,7 @@ const Item$1 = (props) => {
3756
3762
  onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave();
3757
3763
  }
3758
3764
  } },
3759
- React__default.createElement("div", { className: b$l('icon-place') }, compact ? (React__default.createElement(Tooltip, { content: tooltipText, disabled: !enableTooltip || (collapsedItem && open), placement: "right", className: b$l('icon-tooltip', { 'item-type': type }) },
3765
+ React__default.createElement("div", { className: b$l('icon-place') }, compact ? (React__default.createElement(Tooltip, { content: tooltipText, disabled: !enableTooltip || (collapsedItem && open) || popupVisible, placement: "right", className: b$l('icon-tooltip', { 'item-type': type }) },
3760
3766
  React__default.createElement("div", { onMouseEnter: () => onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter(), onMouseLeave: () => onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(), className: b$l('btn-icon') }, iconEl))) : (iconEl)),
3761
3767
  React__default.createElement("div", { className: b$l('title'), title: typeof item.title === 'string' ? item.title : undefined }, titleEl),
3762
3768
  renderPopupContent && Boolean(anchorRef === null || anchorRef === void 0 ? void 0 : anchorRef.current) && (React__default.createElement(Popup, { contentClassName: b$l('popup'), open: popupVisible, keepMounted: popupKeepMounted, placement: popupPlacement, offset: popupOffset, anchorRef: anchorRef, onClose: onClose }, renderPopupContent()))));
@@ -3857,7 +3863,7 @@ var css_248z$i = ".gn-composite-bar {\n flex: 1 0 auto;\n width: 100%;\n min-
3857
3863
  styleInject(css_248z$i);
3858
3864
 
3859
3865
  const b$j = block('composite-bar');
3860
- const CompositeBarView = ({ items, onItemClick, collapseItems, multipleTooltip = true, }) => {
3866
+ const CompositeBarView = ({ type, items, onItemClick, collapseItems, multipleTooltip = false, }) => {
3861
3867
  const ref = useRef(null);
3862
3868
  const tooltipRef = useRef(null);
3863
3869
  const { setValue: setMultipleTooltipContextValue, active: multipleTooltipActive, activeIndex, lastClickedItemIndex, } = useContext(MultipleTooltipContext);
@@ -3922,26 +3928,32 @@ const CompositeBarView = ({ items, onItemClick, collapseItems, multipleTooltip =
3922
3928
  }, [lastClickedItemIndex, setMultipleTooltipContextValue]);
3923
3929
  return (React__default.createElement(React__default.Fragment, null,
3924
3930
  React__default.createElement("div", { ref: tooltipRef, onMouseEnter: onTooltipMouseEnter, onMouseLeave: onTooltipMouseLeave },
3925
- React__default.createElement(List, { ref: ref, items: items, selectedItemIndex: getSelectedItemIndex$1(items), itemHeight: getItemHeight$1, itemClassName: b$j('root-menu-item'), itemsHeight: getItemsHeight, virtualized: false, filterable: false, sortable: false, renderItem: (item, _isItemActive, itemIndex) => (React__default.createElement(Item$1, { item: item, onMouseEnter: onMouseEnterByIndex(itemIndex), onMouseLeave: onMouseLeave, onItemClick: onItemClickByIndex(itemIndex), collapseItems: collapseItems, enableTooltip: !multipleTooltip })) })),
3926
- React__default.createElement(MultipleTooltip, { open: compact && multipleTooltip && multipleTooltipActive, anchorRef: tooltipRef, placement: ['right-start'], items: items })));
3931
+ React__default.createElement(List, { ref: ref, items: items, selectedItemIndex: type === 'menu' ? getSelectedItemIndex$1(items) : undefined, itemHeight: getItemHeight$1, itemsHeight: getItemsHeight, itemClassName: b$j('root-menu-item'), virtualized: false, filterable: false, sortable: false, renderItem: (item, _isItemActive, itemIndex) => {
3932
+ const itemExtraProps = isMenuItem(item) ? { item } : item;
3933
+ const enableTooltip = isMenuItem(item)
3934
+ ? !multipleTooltip
3935
+ : item.enableTooltip;
3936
+ return (React__default.createElement(Item$1, Object.assign({}, itemExtraProps, { enableTooltip: enableTooltip, onMouseEnter: onMouseEnterByIndex(itemIndex), onMouseLeave: onMouseLeave, onItemClick: onItemClickByIndex(itemIndex), collapseItems: collapseItems })));
3937
+ } })),
3938
+ type === 'menu' && (React__default.createElement(MultipleTooltip, { open: compact && multipleTooltip && multipleTooltipActive, anchorRef: tooltipRef, placement: ['right-start'], items: items }))));
3927
3939
  };
3928
- const CompositeBar = ({ items, enableCollapsing, dict, onItemClick, multipleTooltip = false, }) => {
3940
+ const CompositeBar = ({ type, items, dict, onItemClick, multipleTooltip = false, }) => {
3929
3941
  if (items.length === 0) {
3930
3942
  return null;
3931
3943
  }
3932
3944
  let node;
3933
- if (enableCollapsing) {
3945
+ if (type === 'menu') {
3934
3946
  const minHeight = getItemsMinHeight(items);
3935
3947
  const collapseItem = getMoreButtonItem(dict);
3936
3948
  node = (React__default.createElement("div", { className: b$j({ autosizer: true }), style: { minHeight } }, items.length !== 0 && (React__default.createElement(AutoSizer, null, ({ width, height }) => {
3937
3949
  const { listItems, collapseItems } = getAutosizeListItems(items, height, collapseItem);
3938
3950
  return (React__default.createElement("div", { style: { width, height } },
3939
- React__default.createElement(CompositeBarView, { items: listItems, onItemClick: onItemClick, collapseItems: collapseItems, multipleTooltip: multipleTooltip })));
3951
+ React__default.createElement(CompositeBarView, { type: "menu", items: listItems, onItemClick: onItemClick, collapseItems: collapseItems, multipleTooltip: multipleTooltip })));
3940
3952
  }))));
3941
3953
  }
3942
3954
  else {
3943
3955
  node = (React__default.createElement("div", { className: b$j() },
3944
- React__default.createElement(CompositeBarView, { items: items, onItemClick: onItemClick, multipleTooltip: multipleTooltip })));
3956
+ React__default.createElement(CompositeBarView, { type: "subheader", items: items, onItemClick: onItemClick })));
3945
3957
  }
3946
3958
  return React__default.createElement(MultipleTooltipProvider, null, node);
3947
3959
  };
@@ -4009,7 +4021,7 @@ class AsideHeader extends React__default.Component {
4009
4021
  React__default.createElement("div", { className: b$i('aside-popup-anchor'), ref: this.asideRef }),
4010
4022
  React__default.createElement("div", { className: b$i('aside-content', { ['with-decoration']: headerDecoration }) },
4011
4023
  this.renderHeader(),
4012
- (menuItems === null || menuItems === void 0 ? void 0 : menuItems.length) ? (React__default.createElement(CompositeBar, { items: menuItems, enableCollapsing: true, dict: dict, onItemClick: this.onItemClick, multipleTooltip: multipleTooltip })) : (React__default.createElement("div", { className: b$i('menu-items') })),
4024
+ (menuItems === null || menuItems === void 0 ? void 0 : menuItems.length) ? (React__default.createElement(CompositeBar, { type: "menu", items: menuItems, dict: dict, onItemClick: this.onItemClick, multipleTooltip: multipleTooltip })) : (React__default.createElement("div", { className: b$i('menu-items') })),
4013
4025
  this.renderFooter(size),
4014
4026
  this.renderCollapseButton())),
4015
4027
  panelItems && this.renderPanels(size)));
@@ -4020,7 +4032,7 @@ class AsideHeader extends React__default.Component {
4020
4032
  this.renderLogo = () => React__default.createElement(Logo$1, Object.assign({}, this.props.logo, { onClick: this.onLogoClick }));
4021
4033
  this.renderHeader = () => (React__default.createElement("div", { className: b$i('header', { ['with-decoration']: this.props.headerDecoration }) },
4022
4034
  this.renderLogo(),
4023
- React__default.createElement(CompositeBar, { items: this.props.subheaderItems, enableCollapsing: false, onItemClick: this.onItemClick }),
4035
+ React__default.createElement(CompositeBar, { type: "subheader", items: this.props.subheaderItems, onItemClick: this.onItemClick }),
4024
4036
  React__default.createElement(Icon, { data: headerDividerCollapsedIcon, className: b$i('header-divider'), width: ASIDE_HEADER_COMPACT_WIDTH, height: "29" })));
4025
4037
  this.renderFooter = (size) => {
4026
4038
  const { renderFooter, compact } = this.props;