@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.
- package/build/cjs/components/Drawer/Drawer.d.ts +6 -0
- package/build/cjs/components/Drawer/__stories__/Drawer.stories.d.ts +1 -0
- package/build/cjs/components/Drawer/__stories__/ScrollLock.d.ts +3 -0
- package/build/cjs/components/Drawer/utils.d.ts +1 -0
- package/build/cjs/{index-BmbKeWND.js → index-D40EbfWh.js} +30 -13
- package/build/cjs/{index-BmbKeWND.js.map → index-D40EbfWh.js.map} +1 -1
- package/build/cjs/{index-dy1dwuOs.js → index-Duvas6w0.js} +2 -2
- package/build/cjs/{index-dy1dwuOs.js.map → index-Duvas6w0.js.map} +1 -1
- package/build/cjs/index.js +1 -1
- package/build/esm/components/Drawer/Drawer.d.ts +6 -0
- package/build/esm/components/Drawer/__stories__/Drawer.stories.d.ts +1 -0
- package/build/esm/components/Drawer/__stories__/ScrollLock.d.ts +3 -0
- package/build/esm/components/Drawer/utils.d.ts +1 -0
- package/build/esm/{index-CszgqZhV.js → index-BHcJfNP_.js} +2 -2
- package/build/esm/{index-CszgqZhV.js.map → index-BHcJfNP_.js.map} +1 -1
- package/build/esm/{index-Cqt4VOPI.js → index-DWA-PD7D.js} +30 -13
- package/build/esm/{index-Cqt4VOPI.js.map → index-DWA-PD7D.js.map} +1 -1
- package/build/esm/index.js +1 -1
- package/package.json +1 -1
|
@@ -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>;
|
|
@@ -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-
|
|
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
|
|
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
|
-
|
|
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:
|
|
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-
|
|
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-
|
|
5982
|
+
//# sourceMappingURL=index-D40EbfWh.js.map
|