@gravity-ui/navigation 2.16.0 → 2.17.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.
Files changed (36) hide show
  1. package/README.md +4 -73
  2. package/build/cjs/AsideHeader.js +1 -1
  3. package/build/cjs/Drawer.js +121 -7
  4. package/build/cjs/Drawer.js.map +1 -1
  5. package/build/cjs/{FooterItem-e11d85c6.js → FooterItem-2c6eba14.js} +1 -1
  6. package/build/cjs/{FooterItem-e11d85c6.js.map → FooterItem-2c6eba14.js.map} +1 -1
  7. package/build/cjs/{HotkeysPanel-c6e4a0d9.js → HotkeysPanel-61ea3f99.js} +1 -1
  8. package/build/cjs/{HotkeysPanel-c6e4a0d9.js.map → HotkeysPanel-61ea3f99.js.map} +1 -1
  9. package/build/cjs/{PageLayoutAside-3fd5e2be.js → PageLayoutAside-b7365f95.js} +1 -1
  10. package/build/cjs/{PageLayoutAside-3fd5e2be.js.map → PageLayoutAside-b7365f95.js.map} +1 -1
  11. package/build/cjs/PageLayoutAside.js +1 -1
  12. package/build/cjs/components/Drawer/Drawer.d.ts +22 -2
  13. package/build/cjs/components/Drawer/index.d.ts +2 -0
  14. package/build/cjs/components/Drawer/utils.d.ts +29 -0
  15. package/build/cjs/components/index.d.ts +1 -1
  16. package/build/cjs/index.js +7 -7
  17. package/build/cjs/index4.js +1 -1
  18. package/build/cjs/index6.js +1 -1
  19. package/build/esm/AsideHeader.js +1 -1
  20. package/build/esm/Drawer.js +104 -8
  21. package/build/esm/Drawer.js.map +1 -1
  22. package/build/esm/{FooterItem-095251e4.js → FooterItem-4c4f8922.js} +1 -1
  23. package/build/esm/{FooterItem-095251e4.js.map → FooterItem-4c4f8922.js.map} +1 -1
  24. package/build/esm/{HotkeysPanel-a46d3bf8.js → HotkeysPanel-4decc57f.js} +1 -1
  25. package/build/esm/{HotkeysPanel-a46d3bf8.js.map → HotkeysPanel-4decc57f.js.map} +1 -1
  26. package/build/esm/{PageLayoutAside-1a3b5dcf.js → PageLayoutAside-10fd6371.js} +1 -1
  27. package/build/esm/{PageLayoutAside-1a3b5dcf.js.map → PageLayoutAside-10fd6371.js.map} +1 -1
  28. package/build/esm/PageLayoutAside.js +1 -1
  29. package/build/esm/components/Drawer/Drawer.d.ts +22 -2
  30. package/build/esm/components/Drawer/index.d.ts +2 -0
  31. package/build/esm/components/Drawer/utils.d.ts +29 -0
  32. package/build/esm/components/index.d.ts +1 -1
  33. package/build/esm/index.js +6 -6
  34. package/build/esm/index4.js +1 -1
  35. package/build/esm/index6.js +1 -1
  36. package/package.json +1 -1
@@ -4,12 +4,12 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var AsideHeader = require('./AsideHeader.js');
6
6
  var AsideHeaderContext = require('./AsideHeaderContext.js');
7
- var Drawer = require('./Drawer.js');
8
7
  var FooterItem = require('./FooterItem.js');
9
8
  var PageLayout = require('./PageLayout.js');
10
- var PageLayoutAside = require('./PageLayoutAside-3fd5e2be.js');
9
+ var PageLayoutAside = require('./PageLayoutAside-b7365f95.js');
11
10
  var AsideFallback = require('./AsideFallback.js');
12
- var FooterItem$1 = require('./FooterItem-e11d85c6.js');
11
+ var Drawer = require('./Drawer.js');
12
+ var FooterItem$1 = require('./FooterItem-2c6eba14.js');
13
13
  var React = require('react');
14
14
  var uikit = require('@gravity-ui/uikit');
15
15
  var debounce = require('./debounce-8772fd80.js');
@@ -19,15 +19,15 @@ var styleInject_es = require('./style-inject.es-dcee06b6.js');
19
19
  var icons = require('@gravity-ui/icons');
20
20
  var ActionBar = require('./ActionBar-3c6cdf57.js');
21
21
  var Title = require('./Title-54580605.js');
22
- var HotkeysPanel = require('./HotkeysPanel-c6e4a0d9.js');
22
+ var HotkeysPanel = require('./HotkeysPanel-61ea3f99.js');
23
23
  var Settings = require('./Settings-5d2bec1d.js');
24
- require('react-dom');
25
24
  require('./Item-0f90a566.js');
26
25
  require('./constants-d81c3867.js');
27
26
  require('./Content-64d5738a.js');
28
27
  require('./utils-db3e03c2.js');
29
28
  require('@gravity-ui/uikit/i18n');
30
29
  require('./divider-collapsed-153868e7.js');
30
+ require('react-dom');
31
31
  require('@bem-react/classname');
32
32
 
33
33
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -176,13 +176,13 @@ const MobileFooter = ({ className, menuItems: providedMenuItems, withDivider, mo
176
176
  exports.AsideHeader = AsideHeader.AsideHeader;
177
177
  exports.AsideHeaderContextProvider = AsideHeaderContext.AsideHeaderContextProvider;
178
178
  exports.useAsideHeaderContext = AsideHeaderContext.useAsideHeaderContext;
179
- exports.Drawer = Drawer.Drawer;
180
- exports.DrawerItem = Drawer.DrawerItem;
181
179
  exports.FooterItem = FooterItem.FooterItem;
182
180
  exports.PageLayout = PageLayout.PageLayout;
183
181
  exports.Logo = PageLayoutAside.Logo;
184
182
  exports.PageLayoutAside = PageLayoutAside.PageLayoutAside;
185
183
  exports.AsideFallback = AsideFallback.AsideFallback;
184
+ exports.Drawer = Drawer.Drawer;
185
+ exports.DrawerItem = Drawer.DrawerItem;
186
186
  exports.MOBILE_HEADER_EVENT_NAMES = FooterItem$1.MOBILE_HEADER_EVENT_NAMES;
187
187
  exports.MobileHeader = FooterItem$1.MobileHeader;
188
188
  exports.MobileHeaderFooterItem = FooterItem$1.FooterItem;
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var HotkeysPanel = require('./HotkeysPanel-c6e4a0d9.js');
5
+ var HotkeysPanel = require('./HotkeysPanel-61ea3f99.js');
6
6
  require('./tslib.es6-705c6589.js');
7
7
  require('react');
8
8
  require('@gravity-ui/uikit');
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var FooterItem = require('./FooterItem-e11d85c6.js');
5
+ var FooterItem = require('./FooterItem-2c6eba14.js');
6
6
  require('react');
7
7
  require('./Content-64d5738a.js');
8
8
  require('./Drawer.js');
@@ -1,7 +1,7 @@
1
1
  import { _ as __rest } from './tslib.es6-3cd4e99f.js';
2
2
  import React__default from 'react';
3
3
  import { PageLayout } from './PageLayout.js';
4
- import { P as PageLayoutAside } from './PageLayoutAside-1a3b5dcf.js';
4
+ import { P as PageLayoutAside } from './PageLayoutAside-10fd6371.js';
5
5
  import './Content-f94ba85d.js';
6
6
  import './constants-b1604ff5.js';
7
7
  import './AsideHeaderContext.js';
@@ -1,5 +1,6 @@
1
+ import * as React from 'react';
1
2
  import React__default, { Children, isValidElement, cloneElement } from 'react';
2
- import { useBodyScrollLock } from '@gravity-ui/uikit';
3
+ import { useForkRef, useBodyScrollLock, Portal } from '@gravity-ui/uikit';
3
4
  import ReactDOM from 'react-dom';
4
5
  import { b as block } from './cn-ffe5e9f5.js';
5
6
  import { s as styleInject } from './style-inject.es-1f59c1d0.js';
@@ -3024,18 +3025,109 @@ SwitchTransition.defaultProps = {
3024
3025
  mode: modes.out
3025
3026
  };
3026
3027
 
3027
- var css_248z = ".gn-drawer__item{background-color:var(--g-color-base-background);bottom:0;height:100%;left:0;position:absolute;top:0;will-change:transform}.gn-drawer__item_direction_right{left:auto;right:0}.gn-drawer__item-transition-enter{transform:translate(-100%)}.gn-drawer__item-transition_direction_right-enter{transform:translate(100%)}.gn-drawer__item-transition-enter-active,.gn-drawer__item-transition_direction_right-enter-active{transform:translate(0);transition:transform .3s}.gn-drawer__item-transition-enter-done,.gn-drawer__item-transition_direction_right-enter-done{filter:blur(0);transform:translateZ(0)}.gn-drawer__item-transition-exit,.gn-drawer__item-transition_direction_right-exit{transform:translate(0)}.gn-drawer__item-transition-exit-active,.gn-drawer__item-transition_direction_right-exit-active{transition:transform .3s}.gn-drawer__item-transition-exit-active{transform:translate(-100%)}.gn-drawer__item-transition_direction_right-exit-active{transform:translate(100%)}.gn-drawer__item-transition-exit-done,.gn-drawer__item-transition_direction_right-exit-done{visibility:hidden}.gn-drawer__veil{background-color:var(--g-color-sfx-veil);inset:0;position:absolute}.gn-drawer__veil-transition-enter{opacity:0}.gn-drawer__veil-transition-enter-active{opacity:1;transition:opacity .3s}.gn-drawer__veil-transition-exit{opacity:1}.gn-drawer__veil-transition-exit-active{opacity:0;transition:opacity .3s}.gn-drawer__veil-transition-exit-done{visibility:hidden}";
3028
+ const DRAWER_ITEM_MIN_RESIZE_WIDTH = 200;
3029
+ const DRAWER_ITEM_MAX_RESIZE_WIDTH = 800;
3030
+ const DRAWER_ITEM_INITIAL_RESIZE_WIDTH = 400;
3031
+ function getEventClientX(e) {
3032
+ var _a, _b;
3033
+ return 'touches' in e ? (_b = (_a = e.touches[0]) === null || _a === void 0 ? void 0 : _a.clientX) !== null && _b !== void 0 ? _b : 0 : e.clientX;
3034
+ }
3035
+ function useResizeHandlers({ onStart, onMove, onEnd }) {
3036
+ const initialXPosition = React.useRef(0);
3037
+ const currentXPosition = React.useRef(0);
3038
+ const handleMove = React.useCallback((e) => {
3039
+ const currentX = getEventClientX(e);
3040
+ if (currentXPosition.current === currentX) {
3041
+ return;
3042
+ }
3043
+ currentXPosition.current = currentX;
3044
+ const delta = initialXPosition.current - currentX;
3045
+ onMove(delta);
3046
+ }, [onMove]);
3047
+ const handleEnd = React.useCallback((e) => {
3048
+ window.removeEventListener('mousemove', handleMove);
3049
+ window.removeEventListener('touchmove', handleMove);
3050
+ document.body.style.removeProperty('user-select');
3051
+ document.body.style.removeProperty('-webkit-user-select');
3052
+ document.body.style.removeProperty('cursor');
3053
+ const currentX = getEventClientX(e);
3054
+ const delta = initialXPosition.current - currentX;
3055
+ onEnd(delta);
3056
+ }, [handleMove, onEnd]);
3057
+ const handleStart = React.useCallback((e) => {
3058
+ const currentX = getEventClientX(e);
3059
+ initialXPosition.current = currentX;
3060
+ currentXPosition.current = currentX;
3061
+ window.addEventListener('mouseup', handleEnd, { once: true });
3062
+ window.addEventListener('touchend', handleEnd, { once: true });
3063
+ window.addEventListener('touchcancel', handleEnd, { once: true });
3064
+ window.addEventListener('mousemove', handleMove);
3065
+ window.addEventListener('touchmove', handleMove);
3066
+ document.body.style.setProperty('user-select', 'none');
3067
+ document.body.style.setProperty('-webkit-user-select', 'none');
3068
+ document.body.style.setProperty('cursor', 'col-resize');
3069
+ onStart();
3070
+ }, [handleEnd, handleMove, onStart]);
3071
+ return {
3072
+ onMouseDown: handleStart,
3073
+ onTouchStart: handleStart,
3074
+ };
3075
+ }
3076
+ function useResizableDrawerItem(params) {
3077
+ const { direction, width, minResizeWidth = DRAWER_ITEM_MIN_RESIZE_WIDTH, maxResizeWidth = DRAWER_ITEM_MAX_RESIZE_WIDTH, onResize, } = params;
3078
+ const [isResizing, setIsResizing] = React.useState(false);
3079
+ const [resizeDelta, setResizeDelta] = React.useState(0);
3080
+ const [internalWidth, setInternalWidth] = React.useState(width !== null && width !== void 0 ? width : DRAWER_ITEM_INITIAL_RESIZE_WIDTH);
3081
+ const getClampedWidth = React.useCallback((width) => Math.min(Math.max(width, minResizeWidth), maxResizeWidth), [minResizeWidth, maxResizeWidth]);
3082
+ const getResizedWidth = React.useCallback((delta) => {
3083
+ const signedDelta = direction === 'right' ? delta : -delta;
3084
+ const newWidth = (width !== null && width !== void 0 ? width : internalWidth) + signedDelta;
3085
+ return getClampedWidth(newWidth);
3086
+ }, [width, internalWidth, direction, getClampedWidth]);
3087
+ const onStart = React.useCallback(() => {
3088
+ setIsResizing(true);
3089
+ setResizeDelta(0);
3090
+ }, [setIsResizing, setResizeDelta]);
3091
+ const onMove = React.useCallback((delta) => {
3092
+ setResizeDelta(delta);
3093
+ }, []);
3094
+ const onEnd = React.useCallback((delta) => {
3095
+ const newWidth = getResizedWidth(delta);
3096
+ setIsResizing(false);
3097
+ setInternalWidth(newWidth);
3098
+ onResize === null || onResize === void 0 ? void 0 : onResize(newWidth);
3099
+ }, [setIsResizing, setInternalWidth, getResizedWidth, onResize]);
3100
+ const displayWidth = isResizing
3101
+ ? getResizedWidth(resizeDelta)
3102
+ : getClampedWidth(width !== null && width !== void 0 ? width : internalWidth);
3103
+ const handlers = useResizeHandlers({ onStart, onMove, onEnd });
3104
+ return { resizedWidth: displayWidth, resizerHandlers: handlers };
3105
+ }
3106
+
3107
+ var css_248z = ".gn-drawer{--_--resizer-width:8px;--_--resizer-color:var(--g-color-base-generic);--_--resizer-handle-color:var(--g-color-line-generic);--_--resizer-handle-color-hover:var(--g-color-line-generic-hover);--_--resizer-z-index:100;pointer-events:none}.gn-drawer__item{background-color:var(--g-color-base-background);bottom:0;height:100%;left:0;pointer-events:auto;position:absolute;top:0;will-change:transform}.gn-drawer__item_direction_right{left:auto;right:0}.gn-drawer__item-transition-enter{transform:translate(-100%)}.gn-drawer__item-transition_direction_right-enter{transform:translate(100%)}.gn-drawer__item-transition-enter-active,.gn-drawer__item-transition_direction_right-enter-active{transform:translate(0);transition:transform .3s}.gn-drawer__item-transition-enter-done,.gn-drawer__item-transition_direction_right-enter-done{filter:blur(0);transform:translateZ(0)}.gn-drawer__item-transition-exit,.gn-drawer__item-transition_direction_right-exit{transform:translate(0)}.gn-drawer__item-transition-exit-active,.gn-drawer__item-transition_direction_right-exit-active{transition:transform .3s}.gn-drawer__item-transition-exit-active{transform:translate(-100%)}.gn-drawer__item-transition_direction_right-exit-active{transform:translate(100%)}.gn-drawer__item-transition-exit-done,.gn-drawer__item-transition_direction_right-exit-done{visibility:hidden}.gn-drawer__veil{background-color:var(--g-color-sfx-veil);inset:0;pointer-events:auto;position:absolute}.gn-drawer__veil_hidden{display:none}.gn-drawer__veil-transition-enter{opacity:0}.gn-drawer__veil-transition-enter-active{opacity:1;transition:opacity .3s}.gn-drawer__veil-transition-exit{opacity:1}.gn-drawer__veil-transition-exit-active{opacity:0;transition:opacity .3s}.gn-drawer__veil-transition-exit-done{visibility:hidden}.gn-drawer__resizer-handle{background:var(--gn-drawer-item-resizer-handle-color,var(--_--resizer-handle-color));border-radius:2px;height:28px;width:2px}.gn-drawer__resizer{align-items:center;background:var(--gn-drawer-item-resizer-color,var(--_--resizer-color));cursor:col-resize;display:flex;flex-direction:column;height:100%;justify-content:center;position:absolute;top:0;width:var(--gn-drawer-item-resizer-width,var(--_--resizer-width));z-index:var(--gn-drawer-item-resizer-z-index,var(--_--resizer-z-index))}.gn-drawer__resizer_direction_right{left:0}.gn-drawer__resizer_direction_left{right:0}.gn-drawer__resizer:hover .gn-drawer__resizer-handle{background:var(--gn-drawer-item-resizer-handle-color-hover,var(--_--resizer-handle-color-hover))}";
3028
3108
  styleInject(css_248z);
3029
3109
 
3030
3110
  const b = block('drawer');
3031
3111
  const TIMEOUT = 300;
3032
- const DrawerItem = ({ visible, content, children, direction = 'left', className, }) => {
3112
+ const DrawerItem = React__default.forwardRef(function DrawerItem(props, ref) {
3113
+ const { visible, content, children, direction = 'left', className, resizable, width, minResizeWidth, maxResizeWidth, onResize, } = props;
3033
3114
  const itemRef = React__default.useRef(null);
3115
+ const handleRef = useForkRef(ref, itemRef);
3034
3116
  const cssDirection = direction === 'left' ? undefined : direction;
3117
+ const { resizedWidth, resizerHandlers } = useResizableDrawerItem({
3118
+ direction,
3119
+ width,
3120
+ minResizeWidth,
3121
+ maxResizeWidth,
3122
+ onResize,
3123
+ });
3124
+ const resizerElement = resizable ? (React__default.createElement("div", Object.assign({ className: b('resizer', { direction }) }, resizerHandlers),
3125
+ React__default.createElement("div", { className: b('resizer-handle') }))) : null;
3035
3126
  return (React__default.createElement(CSSTransition, { in: visible, timeout: TIMEOUT, unmountOnExit: true, classNames: b('item-transition', { direction: cssDirection }), nodeRef: itemRef },
3036
- React__default.createElement("div", { ref: itemRef, className: b('item', { direction: cssDirection }, className) }, children !== null && children !== void 0 ? children : content)));
3037
- };
3038
- const Drawer = ({ className, children, style, onVeilClick, onEscape, preventScrollBody = true, }) => {
3127
+ React__default.createElement("div", { ref: handleRef, className: b('item', { direction: cssDirection }, className), style: { width: resizable ? `${resizedWidth}px` : undefined } },
3128
+ resizerElement, children !== null && children !== void 0 ? children : content)));
3129
+ });
3130
+ const Drawer = ({ className, children, style, onVeilClick, onEscape, preventScrollBody = true, hideVeil, disablePortal, }) => {
3039
3131
  let someItemVisible = false;
3040
3132
  React__default.Children.forEach(children, (child) => {
3041
3133
  if (React__default.isValidElement(child) && child.type === DrawerItem) {
@@ -3061,11 +3153,11 @@ const Drawer = ({ className, children, style, onVeilClick, onEscape, preventScro
3061
3153
  useBodyScrollLock({ enabled: preventScrollBody && someItemVisible });
3062
3154
  const containerRef = React__default.useRef(null);
3063
3155
  const veilRef = React__default.useRef(null);
3064
- return (React__default.createElement(Transition, { in: someItemVisible, timeout: { enter: 0, exit: TIMEOUT }, mountOnEnter: true, unmountOnExit: true, nodeRef: containerRef }, (state) => {
3156
+ const drawer = (React__default.createElement(Transition, { in: someItemVisible, timeout: { enter: 0, exit: TIMEOUT }, mountOnEnter: true, unmountOnExit: true, nodeRef: containerRef }, (state) => {
3065
3157
  const childrenVisible = someItemVisible && state === 'entered';
3066
3158
  return (React__default.createElement("div", { ref: containerRef, className: b(null, className), style: style },
3067
3159
  React__default.createElement(CSSTransition, { in: childrenVisible, timeout: TIMEOUT, unmountOnExit: true, classNames: b('veil-transition'), nodeRef: veilRef },
3068
- React__default.createElement("div", { ref: veilRef, className: b('veil'), onClick: onVeilClick })),
3160
+ React__default.createElement("div", { ref: veilRef, className: b('veil', { hidden: hideVeil }), onClick: onVeilClick })),
3069
3161
  React__default.Children.map(children, (child) => {
3070
3162
  if (React__default.isValidElement(child) &&
3071
3163
  child.type === DrawerItem) {
@@ -3075,6 +3167,10 @@ const Drawer = ({ className, children, style, onVeilClick, onEscape, preventScro
3075
3167
  return child;
3076
3168
  })));
3077
3169
  }));
3170
+ if (disablePortal) {
3171
+ return drawer;
3172
+ }
3173
+ return React__default.createElement(Portal, null, drawer);
3078
3174
  };
3079
3175
 
3080
3176
  export { Drawer, DrawerItem };