@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"
@@ -3635,6 +3635,9 @@ const POPUP_PLACEMENT = ['right-start', 'right-end', 'right'];
3635
3635
  const POPUP_ITEM_HEIGHT = 28;
3636
3636
 
3637
3637
  function getItemHeight$1(item) {
3638
+ if (!isMenuItem(item)) {
3639
+ return ITEM_HEIGHT;
3640
+ }
3638
3641
  switch (item.type) {
3639
3642
  case 'action':
3640
3643
  return 50;
@@ -3721,6 +3724,9 @@ function getAutosizeListItems(items, height, collapseItem) {
3721
3724
  }
3722
3725
  return { listItems, collapseItems };
3723
3726
  }
3727
+ function isMenuItem(item) {
3728
+ return (item === null || item === void 0 ? void 0 : item.id) !== undefined;
3729
+ }
3724
3730
 
3725
3731
  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}";
3726
3732
  styleInject(css_248z$k);
@@ -3783,7 +3789,7 @@ const Item$1 = (props) => {
3783
3789
  onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave();
3784
3790
  }
3785
3791
  } },
3786
- React__default["default"].createElement("div", { className: b$l('icon-place') }, compact ? (React__default["default"].createElement(uikit.Tooltip, { content: tooltipText, disabled: !enableTooltip || (collapsedItem && open), placement: "right", className: b$l('icon-tooltip', { 'item-type': type }) },
3792
+ React__default["default"].createElement("div", { className: b$l('icon-place') }, compact ? (React__default["default"].createElement(uikit.Tooltip, { content: tooltipText, disabled: !enableTooltip || (collapsedItem && open) || popupVisible, placement: "right", className: b$l('icon-tooltip', { 'item-type': type }) },
3787
3793
  React__default["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)),
3788
3794
  React__default["default"].createElement("div", { className: b$l('title'), title: typeof item.title === 'string' ? item.title : undefined }, titleEl),
3789
3795
  renderPopupContent && Boolean(anchorRef === null || anchorRef === void 0 ? void 0 : anchorRef.current) && (React__default["default"].createElement(uikit.Popup, { contentClassName: b$l('popup'), open: popupVisible, keepMounted: popupKeepMounted, placement: popupPlacement, offset: popupOffset, anchorRef: anchorRef, onClose: onClose }, renderPopupContent()))));
@@ -3884,7 +3890,7 @@ var css_248z$i = ".gn-composite-bar {\n flex: 1 0 auto;\n width: 100%;\n min-
3884
3890
  styleInject(css_248z$i);
3885
3891
 
3886
3892
  const b$j = block('composite-bar');
3887
- const CompositeBarView = ({ items, onItemClick, collapseItems, multipleTooltip = true, }) => {
3893
+ const CompositeBarView = ({ type, items, onItemClick, collapseItems, multipleTooltip = false, }) => {
3888
3894
  const ref = React.useRef(null);
3889
3895
  const tooltipRef = React.useRef(null);
3890
3896
  const { setValue: setMultipleTooltipContextValue, active: multipleTooltipActive, activeIndex, lastClickedItemIndex, } = React.useContext(MultipleTooltipContext);
@@ -3949,26 +3955,32 @@ const CompositeBarView = ({ items, onItemClick, collapseItems, multipleTooltip =
3949
3955
  }, [lastClickedItemIndex, setMultipleTooltipContextValue]);
3950
3956
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
3951
3957
  React__default["default"].createElement("div", { ref: tooltipRef, onMouseEnter: onTooltipMouseEnter, onMouseLeave: onTooltipMouseLeave },
3952
- React__default["default"].createElement(uikit.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["default"].createElement(Item$1, { item: item, onMouseEnter: onMouseEnterByIndex(itemIndex), onMouseLeave: onMouseLeave, onItemClick: onItemClickByIndex(itemIndex), collapseItems: collapseItems, enableTooltip: !multipleTooltip })) })),
3953
- React__default["default"].createElement(MultipleTooltip, { open: compact && multipleTooltip && multipleTooltipActive, anchorRef: tooltipRef, placement: ['right-start'], items: items })));
3958
+ React__default["default"].createElement(uikit.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) => {
3959
+ const itemExtraProps = isMenuItem(item) ? { item } : item;
3960
+ const enableTooltip = isMenuItem(item)
3961
+ ? !multipleTooltip
3962
+ : item.enableTooltip;
3963
+ return (React__default["default"].createElement(Item$1, Object.assign({}, itemExtraProps, { enableTooltip: enableTooltip, onMouseEnter: onMouseEnterByIndex(itemIndex), onMouseLeave: onMouseLeave, onItemClick: onItemClickByIndex(itemIndex), collapseItems: collapseItems })));
3964
+ } })),
3965
+ type === 'menu' && (React__default["default"].createElement(MultipleTooltip, { open: compact && multipleTooltip && multipleTooltipActive, anchorRef: tooltipRef, placement: ['right-start'], items: items }))));
3954
3966
  };
3955
- const CompositeBar = ({ items, enableCollapsing, dict, onItemClick, multipleTooltip = false, }) => {
3967
+ const CompositeBar = ({ type, items, dict, onItemClick, multipleTooltip = false, }) => {
3956
3968
  if (items.length === 0) {
3957
3969
  return null;
3958
3970
  }
3959
3971
  let node;
3960
- if (enableCollapsing) {
3972
+ if (type === 'menu') {
3961
3973
  const minHeight = getItemsMinHeight(items);
3962
3974
  const collapseItem = getMoreButtonItem(dict);
3963
3975
  node = (React__default["default"].createElement("div", { className: b$j({ autosizer: true }), style: { minHeight } }, items.length !== 0 && (React__default["default"].createElement(AutoSizer, null, ({ width, height }) => {
3964
3976
  const { listItems, collapseItems } = getAutosizeListItems(items, height, collapseItem);
3965
3977
  return (React__default["default"].createElement("div", { style: { width, height } },
3966
- React__default["default"].createElement(CompositeBarView, { items: listItems, onItemClick: onItemClick, collapseItems: collapseItems, multipleTooltip: multipleTooltip })));
3978
+ React__default["default"].createElement(CompositeBarView, { type: "menu", items: listItems, onItemClick: onItemClick, collapseItems: collapseItems, multipleTooltip: multipleTooltip })));
3967
3979
  }))));
3968
3980
  }
3969
3981
  else {
3970
3982
  node = (React__default["default"].createElement("div", { className: b$j() },
3971
- React__default["default"].createElement(CompositeBarView, { items: items, onItemClick: onItemClick, multipleTooltip: multipleTooltip })));
3983
+ React__default["default"].createElement(CompositeBarView, { type: "subheader", items: items, onItemClick: onItemClick })));
3972
3984
  }
3973
3985
  return React__default["default"].createElement(MultipleTooltipProvider, null, node);
3974
3986
  };
@@ -4036,7 +4048,7 @@ class AsideHeader extends React__default["default"].Component {
4036
4048
  React__default["default"].createElement("div", { className: b$i('aside-popup-anchor'), ref: this.asideRef }),
4037
4049
  React__default["default"].createElement("div", { className: b$i('aside-content', { ['with-decoration']: headerDecoration }) },
4038
4050
  this.renderHeader(),
4039
- (menuItems === null || menuItems === void 0 ? void 0 : menuItems.length) ? (React__default["default"].createElement(CompositeBar, { items: menuItems, enableCollapsing: true, dict: dict, onItemClick: this.onItemClick, multipleTooltip: multipleTooltip })) : (React__default["default"].createElement("div", { className: b$i('menu-items') })),
4051
+ (menuItems === null || menuItems === void 0 ? void 0 : menuItems.length) ? (React__default["default"].createElement(CompositeBar, { type: "menu", items: menuItems, dict: dict, onItemClick: this.onItemClick, multipleTooltip: multipleTooltip })) : (React__default["default"].createElement("div", { className: b$i('menu-items') })),
4040
4052
  this.renderFooter(size),
4041
4053
  this.renderCollapseButton())),
4042
4054
  panelItems && this.renderPanels(size)));
@@ -4047,7 +4059,7 @@ class AsideHeader extends React__default["default"].Component {
4047
4059
  this.renderLogo = () => React__default["default"].createElement(Logo$1, Object.assign({}, this.props.logo, { onClick: this.onLogoClick }));
4048
4060
  this.renderHeader = () => (React__default["default"].createElement("div", { className: b$i('header', { ['with-decoration']: this.props.headerDecoration }) },
4049
4061
  this.renderLogo(),
4050
- React__default["default"].createElement(CompositeBar, { items: this.props.subheaderItems, enableCollapsing: false, onItemClick: this.onItemClick }),
4062
+ React__default["default"].createElement(CompositeBar, { type: "subheader", items: this.props.subheaderItems, onItemClick: this.onItemClick }),
4051
4063
  React__default["default"].createElement(uikit.Icon, { data: headerDividerCollapsedIcon, className: b$i('header-divider'), width: ASIDE_HEADER_COMPACT_WIDTH, height: "29" })));
4052
4064
  this.renderFooter = (size) => {
4053
4065
  const { renderFooter, compact } = this.props;