@gravity-ui/navigation 3.3.8 → 3.4.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.
@@ -74,6 +74,12 @@ export interface DrawerProps {
74
74
  * @default false
75
75
  * */
76
76
  keepMounted?: boolean;
77
+ /**
78
+ * Whether to lock page scroll when drawer is open.
79
+ * Applied only when hideVeil=true and disablePortal=false.
80
+ * @default false
81
+ */
82
+ scrollLock?: boolean;
77
83
  }
78
84
  export declare const Drawer: React.FC<DrawerProps>;
79
85
  export {};
@@ -5,4 +5,5 @@ export declare const Showcase: import("@storybook/csf").AnnotatedStoryFn<import(
5
5
  export declare const ResizableItem: import("@storybook/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, import("@storybook/csf").Args>;
6
6
  export declare const DisablePortal: import("@storybook/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, import("@storybook/csf").Args>;
7
7
  export declare const HideVeil: import("@storybook/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, import("@storybook/csf").Args>;
8
+ export declare const ScrollLock: import("@storybook/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, import("@storybook/csf").Args>;
8
9
  export declare const UsePortal: import("@storybook/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, import("@storybook/csf").Args>;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import './ScrollLock.scss';
3
+ export declare function ScrollLockShowcase(): React.JSX.Element;
@@ -5,6 +5,7 @@ export declare const DRAWER_ITEM_INITIAL_RESIZE_WIDTH = 400;
5
5
  export type DrawerDirection = 'right' | 'left' | 'top' | 'bottom';
6
6
  export type OnResizeHandler = (width: number, event: MouseEvent | TouchEvent) => void;
7
7
  export type OnResizeContinueHandler = (width: number) => void;
8
+ export declare function useScrollLock(enabled: boolean): void;
8
9
  export interface UseResizeHandlersParams {
9
10
  onStart: () => void;
10
11
  onMove: (delta: number) => void;
@@ -141,7 +141,7 @@ function styleInject(css, ref) {
141
141
  var css_248z$u = ".g-root{--gn-aside-top-panel-height:0px}.gn-aside-header{--gn-aside-header-min-width:56px;--_--item-icon-background-size:38px;--_--background-color:var(--g-color-base-background);--_--decoration-collapsed-background-color:var(--g-color-base-warning-light);--_--decoration-expanded-background-color:var(--g-color-base-warning-light);--_--vertical-divider-line-color:var(--g-color-line-generic);--_--horizontal-divider-line-color:var(--g-color-line-generic);background-color:var(--g-color-base-background);height:100%;position:relative;width:100%}.gn-aside-header__aside{background-color:var(--gn-aside-header-expanded-background-color,var(--gn-aside-header-background-color,var(--_--background-color)));box-sizing:border-box;display:flex;flex-direction:column;height:100vh;left:0;margin-top:var(--gn-top-alert-height,0);max-height:calc(100vh - var(--gn-top-alert-height, 0));position:sticky;top:var(--gn-top-alert-height,0);width:inherit;z-index:var(--gn-aside-header-z-index,100)}.gn-aside-header__aside:after{background-color:var(--gn-aside-header-divider-vertical-color,var(--_--vertical-divider-line-color));content:\"\";height:100%;position:absolute;right:0;top:0;width:1px;z-index:2}.gn-aside-header__aside-popup-anchor{inset:0;position:absolute;z-index:1}.gn-aside-header__aside-content{--gradient-height:334px;display:flex;flex-direction:column;height:inherit;overflow-x:hidden;padding-top:var(--gn-aside-header-padding-top);position:relative;user-select:none;width:inherit;z-index:2}.gn-aside-header__aside-content>.gn-aside-header-logo{margin:8px 0}.gn-aside-header__aside-content_with-decoration{background:linear-gradient(180deg,var(--gn-aside-header-decoration-expanded-background-color,var(--_--decoration-expanded-background-color)) calc(var(--gradient-height)*.33),transparent calc(var(--gradient-height)*.88))}.gn-aside-header__aside-custom-background{bottom:0;display:flex;position:absolute;top:0;width:var(--gn-aside-header-size);z-index:-1}.gn-aside-header_compact .gn-aside-header__aside{background-color:var(--gn-aside-header-collapsed-background-color,var(--gn-aside-header-background-color,var(--_--background-color)))}.gn-aside-header_compact .gn-aside-header__aside-content{background:transparent}.gn-aside-header__header{--gn-aside-header-header-divider-height:29px;box-sizing:border-box;flex:none;padding-bottom:22px;padding-top:8px;position:relative;width:100%;z-index:1}.gn-aside-header__header .gn-aside-header__header-divider{bottom:0;color:var(--gn-aside-header-decoration-collapsed-background-color,var(--_--decoration-collapsed-background-color));display:none;left:0;position:absolute;z-index:-2}.gn-aside-header__header_with-decoration:before{background-color:var(--gn-aside-header-decoration-collapsed-background-color,var(--_--decoration-collapsed-background-color));content:\"\";display:none;height:calc(100% - var(--gn-aside-header-header-divider-height));left:0;position:absolute;top:0;width:100%;z-index:-2}.gn-aside-header__header:after{background-color:var(--gn-aside-header-divider-horizontal-color,var(--_--horizontal-divider-line-color));bottom:12px;content:\"\";height:1px;left:0;position:absolute;width:100%;z-index:-2}.gn-aside-header_compact .gn-aside-header__header:before,.gn-aside-header_compact .gn-aside-header__header_with-decoration .gn-aside-header__header-divider{display:block}.gn-aside-header_compact .gn-aside-header__header_with-decoration:after{display:none}.gn-aside-header__logo-button .gn-aside-header__logo-icon-place{height:var(--gn-aside-header-item-icon-background-size,var(--_--item-icon-background-size));width:var(--gn-aside-header-min-width)}.gn-aside-header__menu-items{flex-grow:1}.gn-aside-header__footer{display:flex;flex-direction:column;flex-shrink:0;margin:8px 0;width:100%}.gn-aside-header__panels{inset:var(--gn-top-alert-height,0) 0 0;max-height:calc(100vh - var(--gn-top-alert-height, 0));overflow:auto;position:fixed;z-index:var(--gn-aside-header-panel-z-index,98)}.gn-aside-header__panel{height:100%}.gn-aside-header__pane-container{display:flex;flex-direction:row;outline:none;overflow:visible;user-select:text}.gn-aside-header__top-alert{background:var(--g-color-base-background);position:fixed;top:0;width:100%;z-index:var(--gn-aside-header-pane-top-z-index,98)}.gn-aside-header__content{margin-top:var(--gn-top-alert-height,0);width:calc(100% - var(--gn-aside-header-size));z-index:var(--gn-aside-header-content-z-index,95)}";
142
142
  styleInject(css_248z$u);
143
143
 
144
- const TopAlert$1 = React.lazy(() => Promise.resolve().then(function () { return require('./index-dy1dwuOs.js'); }).then((module) => ({ default: module.TopAlert })));
144
+ const TopAlert$1 = React.lazy(() => Promise.resolve().then(function () { return require('./index-Duvas6w0.js'); }).then((module) => ({ default: module.TopAlert })));
145
145
  const Layout = ({ compact, className, children, topAlert }) => {
146
146
  const size = compact ? ASIDE_HEADER_COMPACT_WIDTH : ASIDE_HEADER_EXPANDED_WIDTH;
147
147
  const asideHeaderContextValue = React.useMemo(() => ({ size, compact }), [compact, size]);
@@ -4393,6 +4393,17 @@ function getEventClientPosition(e, direction) {
4393
4393
  }
4394
4394
  return direction === 'horizontal' ? e.clientX : e.clientY;
4395
4395
  }
4396
+ function useScrollLock(enabled) {
4397
+ React__namespace.useEffect(() => {
4398
+ if (!enabled)
4399
+ return;
4400
+ const originalStyle = window.getComputedStyle(document.body).overflow;
4401
+ document.body.style.overflow = 'hidden';
4402
+ return () => {
4403
+ document.body.style.overflow = originalStyle;
4404
+ };
4405
+ }, [enabled]);
4406
+ }
4396
4407
  function useResizeHandlers({ onStart, onMove, onEnd, direction = 'horizontal', }) {
4397
4408
  const initialPosition = React__namespace.useRef(0);
4398
4409
  const currentPosition = React__namespace.useRef(0);
@@ -4430,7 +4441,7 @@ function useResizeHandlers({ onStart, onMove, onEnd, direction = 'horizontal', }
4430
4441
  window.addEventListener('selectstart', disableSelect, { passive: false });
4431
4442
  document.body.style.setProperty('cursor', direction === 'horizontal' ? 'col-resize' : 'row-resize');
4432
4443
  onStart();
4433
- }, [handleEnd, handleMove, onStart, direction]);
4444
+ }, [handleEnd, handleMove, onStart, direction, disableSelect]);
4434
4445
  return {
4435
4446
  onMouseDown: handleStart,
4436
4447
  onTouchStart: handleStart,
@@ -4516,7 +4527,7 @@ const DrawerItem = React.forwardRef(function DrawerItem(props, ref) {
4516
4527
  }, [className]), style: style },
4517
4528
  resizerElement, children !== null && children !== undefined ? children : content)));
4518
4529
  });
4519
- const Drawer = ({ className, veilClassName, children, style, onVeilClick, onEscape, hideVeil, disablePortal = true, keepMounted = false, }) => {
4530
+ const Drawer = ({ className, veilClassName, children, style, onVeilClick, onEscape, hideVeil, disablePortal = true, keepMounted = false, scrollLock = false, }) => {
4520
4531
  let someItemVisible = false;
4521
4532
  React.Children.forEach(children, (child) => {
4522
4533
  if (React.isValidElement(child) && child.type === DrawerItem) {
@@ -4541,9 +4552,11 @@ const Drawer = ({ className, veilClassName, children, style, onVeilClick, onEsca
4541
4552
  }, [onEscape, someItemVisible]);
4542
4553
  const containerRef = React.useRef(null);
4543
4554
  const veilRef = React.useRef(null);
4544
- const drawer = (React.createElement(Transition, { in: someItemVisible, timeout: { enter: 0, exit: TIMEOUT }, mountOnEnter: !keepMounted, unmountOnExit: !keepMounted, nodeRef: containerRef }, (state) => {
4555
+ const shouldApplyScrollLock = scrollLock && someItemVisible && hideVeil && !disablePortal;
4556
+ useScrollLock(shouldApplyScrollLock);
4557
+ return (React.createElement(Transition, { in: someItemVisible, timeout: { enter: 0, exit: TIMEOUT }, mountOnEnter: !keepMounted, unmountOnExit: !keepMounted, nodeRef: containerRef }, (state) => {
4545
4558
  const childrenVisible = someItemVisible && state === 'entered';
4546
- return (React.createElement("div", { ref: containerRef, className: b$m({ hideVeil }, className), style: style },
4559
+ const content = (React.createElement("div", { ref: containerRef, className: b$m({ hideVeil }, className), style: style },
4547
4560
  React.createElement(CSSTransition, { in: childrenVisible, timeout: TIMEOUT, unmountOnExit: true, classNames: b$m('veil-transition'), nodeRef: veilRef },
4548
4561
  React.createElement("div", { ref: veilRef, className: b$m('veil', { hidden: hideVeil }, veilClassName), onClick: onVeilClick })),
4549
4562
  React.Children.map(children, (child) => {
@@ -4554,11 +4567,16 @@ const Drawer = ({ className, veilClassName, children, style, onVeilClick, onEsca
4554
4567
  }
4555
4568
  return child;
4556
4569
  })));
4570
+ if (disablePortal) {
4571
+ return content;
4572
+ }
4573
+ // When hideVeil=true, we don't use FloatingOverlay to avoid blocking mouse events
4574
+ if (hideVeil) {
4575
+ return React.createElement(uikit.Portal, null, content);
4576
+ }
4577
+ return (React.createElement(uikit.Portal, null,
4578
+ React.createElement(FloatingOverlay, { lockScroll: true }, content)));
4557
4579
  }));
4558
- if (disablePortal) {
4559
- return drawer;
4560
- }
4561
- return (React.createElement(uikit.Portal, null, someItemVisible ? React.createElement(FloatingOverlay, { lockScroll: true }, drawer) : drawer));
4562
4580
  };
4563
4581
 
4564
4582
  const Panels = () => {
@@ -4869,7 +4887,6 @@ const COMPONENT$1 = 'Settings';
4869
4887
  var i18n$1 = i18n$5.addComponentKeysets({ en: en$1, ru: ru$1 }, `${NAMESPACE}${COMPONENT$1}`);
4870
4888
 
4871
4889
  const allSearchResultsId = 'allSearchResults';
4872
- const allSearchResultsLabel = i18n$1('label_all-results');
4873
4890
  function useAllResultsPage({ pages, handlePageChange, }) {
4874
4891
  const allSearchResultsPage = pages[allSearchResultsId];
4875
4892
  const hasAllSearchResultsPage = Boolean(allSearchResultsPage);
@@ -4924,7 +4941,7 @@ function createAllResultsPage(pages, menu) {
4924
4941
  function createAllResultsMenuItem() {
4925
4942
  return {
4926
4943
  id: allSearchResultsId,
4927
- title: allSearchResultsLabel,
4944
+ title: i18n$1('label_all-results'),
4928
4945
  icon: { data: icons.ListUl },
4929
4946
  };
4930
4947
  }
@@ -5646,7 +5663,7 @@ const OverlapPanel = ({ title, renderContent, className, onClose, action, closeT
5646
5663
  var css_248z$4 = ".gn-mobile-header{--mobile-header-min-heigth:50px;--mobile-header-icon-size:20px;background-color:var(--g-color-base-background)}.gn-mobile-header__header-container{background-color:var(--g-color-base-background);position:sticky;top:0;z-index:var(--gn-mobile-header-z-index,100)}.gn-mobile-header__header{align-items:center;border-bottom:1px solid var(--g-color-line-generic);box-sizing:border-box;display:flex;justify-content:space-between;padding:0 10px}.gn-mobile-header__burger{padding:12px}.gn-mobile-header__panel-item{--gn-drawer-item-position:var(--gn-mobile-header-panel-position,absolute)}.gn-mobile-header__burger-menu,.gn-mobile-header__panel-item{background-color:var(--g-color-base-background);max-height:100%;max-width:90vw;width:320px}.gn-mobile-header__user-menu{overflow-y:auto}.gn-mobile-header__overlap-panel,.gn-mobile-header__panels{z-index:var(--gn-mobile-header-panel-z-index,98)}.gn-mobile-header__panels{inset:var(--mobile-header-min-heigth) 0 0;overflow:hidden;position:fixed}.gn-mobile-header__panel-item{top:unset}.gn-mobile-header__content{overflow:auto}";
5647
5664
  styleInject(css_248z$4);
5648
5665
 
5649
- const TopAlert = React.lazy(() => Promise.resolve().then(function () { return require('./index-dy1dwuOs.js'); }).then((module) => ({ default: module.TopAlert })));
5666
+ const TopAlert = React.lazy(() => Promise.resolve().then(function () { return require('./index-Duvas6w0.js'); }).then((module) => ({ default: module.TopAlert })));
5650
5667
  const b$4 = block('mobile-header');
5651
5668
  const MobileHeader = React.forwardRef(({ logo, burgerMenu, burgerCloseTitle = i18n('burger_button_close'), burgerOpenTitle = i18n('burger_button_open'), panelItems = [], renderContent, sideItemRenderContent, onClosePanel, onEvent, className, contentClassName, overlapPanel, topAlert, }, ref) => {
5652
5669
  const targetRef = useForwardRef(ref);
@@ -5962,4 +5979,4 @@ exports.styleInject = styleInject;
5962
5979
  exports.useAsideHeaderContext = useAsideHeaderContext;
5963
5980
  exports.useSettingsContext = useSettingsContext;
5964
5981
  exports.useSettingsSelectionContext = useSettingsSelectionContext;
5965
- //# sourceMappingURL=index-BmbKeWND.js.map
5982
+ //# sourceMappingURL=index-D40EbfWh.js.map