@skbkontur/side-menu 1.11.4-collpsing.0 → 1.11.5

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/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [1.11.5](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@1.11.4...@skbkontur/side-menu@1.11.5) (2024-03-21)
7
+
8
+ **Note:** Version bump only for package @skbkontur/side-menu
9
+
10
+
11
+
12
+
13
+
6
14
  ## [1.11.4](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@1.11.3...@skbkontur/side-menu@1.11.4) (2024-03-01)
7
15
 
8
16
 
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  SideMenu в фирменном стиле (макеты живут [здесь](https://www.figma.com/file/XA8Ytcx8bxemYAkF7eGVSv/%D0%9A%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82-%D0%BB%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE-%D0%BC%D0%B5%D0%BD%D1%8E?node-id=0%3A1)).
2
2
 
3
+ Для корректной работы SideMenu с версии `1.11.0` необходим пакет `@skbkontur/react-ui` версии `4.19.0` или выше
4
+
3
5
  [Пример в песочнице](https://codesandbox.io/s/competent-wiles-k85wlm)
4
6
 
5
7
  ```jsx harmony
@@ -689,9 +691,9 @@ const [isOpen, setIsOpen] = React.useState(true);
689
691
  sideMenuNestedMenuPaddingLeft: string;
690
692
  //#endregion
691
693
  //#region RightBorder
692
- sideMenuRightBorderWidth: string;
693
- sideMenuRightBorderIconColor: string;
694
- sideMenuRightBorderHoverIconColor: string;
694
+ MenuRightBorderWidth: string;
695
+ sideMenuRightBorderColor: string;
696
+ sideMenuRightBorderHoverWidth: string;
695
697
  // #region BackButton (for Mobiles)
696
698
  sideMenuBackButtonCaptionFontWeight: string;
697
699
  sideMenuBackButtonCaptionFontSize: string;
@@ -3,5 +3,4 @@ export declare const SideMenuDataTids: {
3
3
  burger: string;
4
4
  backButton: string;
5
5
  separatedSubMenu: string;
6
- rightBorder: string;
7
6
  };
@@ -3,5 +3,4 @@ export var SideMenuDataTids = {
3
3
  burger: 'SideMenu__burger',
4
4
  backButton: 'SideMenu__backButton',
5
5
  separatedSubMenu: 'SideMenu__separatedSubMenu',
6
- rightBorder: 'SideMenu__rightBorder',
7
6
  };
@@ -1,3 +1,2 @@
1
1
  import React from 'react';
2
2
  export declare const useMemoIcon: (children: React.ReactNode, isOpened: boolean) => JSX.Element | undefined;
3
- export declare const useMemoBorderIcon: (isCollapsed?: boolean | undefined) => JSX.Element;
@@ -1,7 +1,6 @@
1
1
  import React, { useMemo } from 'react';
2
2
  import { ArrowCDownIcon16Regular } from '@skbkontur/icons/icons/ArrowCDownIcon/ArrowCDownIcon16Regular';
3
3
  import { ArrowCRightIcon16Regular } from '@skbkontur/icons/icons/ArrowCRightIcon/ArrowCRightIcon16Regular';
4
- import { ArrowCLeftIcon16Regular } from '@skbkontur/icons/icons/ArrowCLeftIcon/ArrowCLeftIcon16Regular';
5
4
  export var useMemoIcon = function (children, isOpened) {
6
5
  return useMemo(function () {
7
6
  if (children) {
@@ -14,13 +13,3 @@ export var useMemoIcon = function (children, isOpened) {
14
13
  }
15
14
  }, [isOpened, children]);
16
15
  };
17
- export var useMemoBorderIcon = function (isCollapsed) {
18
- return useMemo(function () {
19
- if (isCollapsed) {
20
- return React.createElement(ArrowCRightIcon16Regular, null);
21
- }
22
- else {
23
- return React.createElement(ArrowCLeftIcon16Regular, null);
24
- }
25
- }, [isCollapsed]);
26
- };
@@ -101,8 +101,8 @@ export declare class SideMenuTheme extends SideMenuTheme_base {
101
101
  static sideMenuDividerBgColor: string;
102
102
  static sideMenuNestedMenuPaddingLeft: string;
103
103
  static sideMenuRightBorderWidth: string;
104
- static sideMenuRightBorderIconColor: string;
105
- static sideMenuRightBorderHoverIconColor: string;
104
+ static get sideMenuRightBorderColor(): string;
105
+ static sideMenuRightBorderHoverWidth: string;
106
106
  static sideMenuLogotypePaddingLeft: string;
107
107
  static sideMenuLogotypePaddingTop: string;
108
108
  static sideMenuLogotypePaddingBottom: string;
@@ -107,6 +107,13 @@ var SideMenuTheme = /** @class */ (function (_super) {
107
107
  enumerable: false,
108
108
  configurable: true
109
109
  });
110
+ Object.defineProperty(SideMenuTheme, "sideMenuRightBorderColor", {
111
+ get: function () {
112
+ return this.sideMenuProductColor;
113
+ },
114
+ enumerable: false,
115
+ configurable: true
116
+ });
110
117
  Object.defineProperty(SideMenuTheme, "sideMenuFooterDividerColor", {
111
118
  get: function () {
112
119
  return this.sideMenuDividerBgColor;
@@ -231,9 +238,8 @@ var SideMenuTheme = /** @class */ (function (_super) {
231
238
  SideMenuTheme.sideMenuNestedMenuPaddingLeft = '16px';
232
239
  //#endregion
233
240
  //#region RightBorder
234
- SideMenuTheme.sideMenuRightBorderWidth = '16px';
235
- SideMenuTheme.sideMenuRightBorderIconColor = '#adadad';
236
- SideMenuTheme.sideMenuRightBorderHoverIconColor = '#222222';
241
+ SideMenuTheme.sideMenuRightBorderWidth = '20px';
242
+ SideMenuTheme.sideMenuRightBorderHoverWidth = '2px';
237
243
  //#endregion
238
244
  //#region Logotype
239
245
  SideMenuTheme.sideMenuLogotypePaddingLeft = '8px';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skbkontur/side-menu",
3
- "version": "1.11.4-collpsing.0",
3
+ "version": "1.11.5",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
@@ -17,15 +17,7 @@ export interface SideMenuProps extends CommonProps {
17
17
  children?: React.ReactNode;
18
18
  size?: 'small' | 'large';
19
19
  isSeparatedMenu?: boolean;
20
- /**
21
- * Заблокировать возможность сворачивания меню до иконок на широких экранах
22
- * @deprecated use disableCollapsing
23
- */
24
20
  disableSwipe?: boolean;
25
- /**
26
- * Заблокировать возможность сворачивания меню до иконок на широких экранах
27
- */
28
- disableCollapsing?: boolean;
29
21
  value?: string;
30
22
  onValueChange?: (value: string) => void;
31
23
  desktopMediaQuery?: string;
@@ -31,7 +31,7 @@ export var transitionDuration = 300; //ms
31
31
  export var burgerTransitionDuration = (transitionDuration * 2) / 3;
32
32
  var SideMenuInner = forwardRef(function (_a, ref) {
33
33
  var _b, _c, _d, _e;
34
- var children = _a.children, value = _a.value, onValueChange = _a.onValueChange, _f = _a.size, size = _f === void 0 ? 'small' : _f, _g = _a.isSeparatedMenu, isSeparatedMenu = _g === void 0 ? false : _g, className = _a.className, _h = _a.disableSwipe, disableSwipe = _h === void 0 ? true : _h, _j = _a.disableCollapsing, disableCollapsing = _j === void 0 ? false : _j, desktopMediaQuery = _a.desktopMediaQuery, narrowDesktopMediaQuery = _a.narrowDesktopMediaQuery, tabletMediaQuery = _a.tabletMediaQuery, mobileMediaQuery = _a.mobileMediaQuery, _k = _a.hideScrollBar, hideScrollBar = _k === void 0 ? undefined : _k, _l = _a.showScrollBar, showScrollBar = _l === void 0 ? 'hover' : _l, isOpen = _a.isOpen, onOpen = _a.onOpen, onClose = _a.onClose, rest = __rest(_a, ["children", "value", "onValueChange", "size", "isSeparatedMenu", "className", "disableSwipe", "disableCollapsing", "desktopMediaQuery", "narrowDesktopMediaQuery", "tabletMediaQuery", "mobileMediaQuery", "hideScrollBar", "showScrollBar", "isOpen", "onOpen", "onClose"]);
34
+ var children = _a.children, value = _a.value, onValueChange = _a.onValueChange, _f = _a.size, size = _f === void 0 ? 'small' : _f, _g = _a.isSeparatedMenu, isSeparatedMenu = _g === void 0 ? false : _g, className = _a.className, _h = _a.disableSwipe, disableSwipe = _h === void 0 ? true : _h, desktopMediaQuery = _a.desktopMediaQuery, narrowDesktopMediaQuery = _a.narrowDesktopMediaQuery, tabletMediaQuery = _a.tabletMediaQuery, mobileMediaQuery = _a.mobileMediaQuery, _j = _a.hideScrollBar, hideScrollBar = _j === void 0 ? undefined : _j, _k = _a.showScrollBar, showScrollBar = _k === void 0 ? 'hover' : _k, isOpen = _a.isOpen, onOpen = _a.onOpen, onClose = _a.onClose, rest = __rest(_a, ["children", "value", "onValueChange", "size", "isSeparatedMenu", "className", "disableSwipe", "desktopMediaQuery", "narrowDesktopMediaQuery", "tabletMediaQuery", "mobileMediaQuery", "hideScrollBar", "showScrollBar", "isOpen", "onOpen", "onClose"]);
35
35
  var transitionTimer = useRef(null);
36
36
  var sideMenuRef = useRef(null);
37
37
  var contentWrapperRef = useRef(null);
@@ -43,31 +43,26 @@ var SideMenuInner = forwardRef(function (_a, ref) {
43
43
  isNarrowDesktopQuery: narrowDesktopMediaQuery || theme.sideMenuNarrowDesktopMediaQuery,
44
44
  isDesktopQuery: desktopMediaQuery || theme.sideMenuDesktopMediaQuery,
45
45
  };
46
- var _m = useResponsiveLayout({
46
+ var _l = useResponsiveLayout({
47
47
  customMediaQueries: customMediaQueries,
48
- }), isMobileQuery = _m.isMobileQuery, isTabletQuery = _m.isTabletQuery, isNarrowDesktopQuery = _m.isNarrowDesktopQuery, isDesktopQuery = _m.isDesktopQuery;
48
+ }), isMobileQuery = _l.isMobileQuery, isTabletQuery = _l.isTabletQuery, isNarrowDesktopQuery = _l.isNarrowDesktopQuery, isDesktopQuery = _l.isDesktopQuery;
49
49
  var isNarrowDesktop = isNarrowDesktopQuery && !isDesktopQuery;
50
50
  var isTablet = isTabletQuery && !isNarrowDesktopQuery;
51
51
  var isMobile = isMobileQuery && !isTabletQuery;
52
52
  var isTabletOrMobile = isTablet || isMobile;
53
53
  var isTouchScreen = isTouchDevice() || isMobile || isTablet;
54
54
  var manual = isOpen !== undefined;
55
- var _o = useState(isDesktopQuery), isOpened = _o[0], setIsOpened = _o[1];
56
- var _p = useState(false), isBeingTransitioned = _p[0], setIsBeingTransitioned = _p[1];
57
- var _q = useState(value), activeMenuItem = _q[0], setActiveMenuItem = _q[1];
58
- var _r = useState(null), clickedButton = _r[0], setClickedButton = _r[1];
59
- var _s = useState(false), isSeparatedMenuShown = _s[0], setIsSeparatedMenuShown = _s[1];
60
- var _t = useState(true), isMouseOutside = _t[0], setIsMouseOutside = _t[1];
61
- var _u = useState('top'), scrollState = _u[0], setScrollState = _u[1];
62
- var _v = useState(false), hasScrollBar = _v[0], setHasScrollBar = _v[1];
63
- var _w = useState(0), mousePositionX = _w[0], setMousePositionX = _w[1];
64
- var _x = useState(0), headerHeight = _x[0], setHeaderHeight = _x[1];
65
- var _y = useState(false), isCollapsable = _y[0], setIsCollapsable = _y[1];
66
- var _z = useState(0), leftPosition = _z[0], setLeftPosition = _z[1];
67
- var _0 = useState(false), isHovered = _0[0], setIsHovered = _0[1];
55
+ var _m = useState(isDesktopQuery), isOpened = _m[0], setIsOpened = _m[1];
56
+ var _o = useState(false), isBeingTransitioned = _o[0], setIsBeingTransitioned = _o[1];
57
+ var _p = useState(value), activeMenuItem = _p[0], setActiveMenuItem = _p[1];
58
+ var _q = useState(null), clickedButton = _q[0], setClickedButton = _q[1];
59
+ var _r = useState(false), isSeparatedMenuShown = _r[0], setIsSeparatedMenuShown = _r[1];
60
+ var _s = useState(true), isMouseOutside = _s[0], setIsMouseOutside = _s[1];
61
+ var _t = useState('top'), scrollState = _t[0], setScrollState = _t[1];
62
+ var _u = useState(false), hasScrollBar = _u[0], setHasScrollBar = _u[1];
63
+ var _v = useState(0), mousePositionX = _v[0], setMousePositionX = _v[1];
64
+ var _w = useState(0), headerHeight = _w[0], setHeaderHeight = _w[1];
68
65
  useEffect(function () {
69
- var _a;
70
- setLeftPosition(((_a = sideMenuRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left) || 0);
71
66
  return function () {
72
67
  if (transitionTimer.current) {
73
68
  clearTimeout(transitionTimer.current);
@@ -127,33 +122,30 @@ var SideMenuInner = forwardRef(function (_a, ref) {
127
122
  if ((isSeparatedMenu && isSeparatedMenuShown && isNarrowDesktop && manual) || isTouchScreen) {
128
123
  return;
129
124
  }
130
- setIsHovered(true);
131
- if (isNarrowDesktop || (isDesktopQuery && !isOpened && isCollapsable)) {
125
+ if (isNarrowDesktop || (isDesktopQuery && !isOpened)) {
132
126
  isMouseOutside && showMinimizedRoot(false);
133
127
  setIsMouseOutside(false);
134
128
  }
135
129
  };
136
130
  var handleMouseLeave = function () {
137
- setIsHovered(false);
138
- if (isNarrowDesktop || (isDesktopQuery && isCollapsable)) {
131
+ if (isNarrowDesktop) {
139
132
  handleIsOpened(false, !manual);
140
133
  }
141
- if ((isNarrowDesktop || (isDesktopQuery && isCollapsable)) && !manual) {
134
+ if ((isNarrowDesktop || (isDesktopQuery && !isOpened)) && !manual) {
142
135
  setIsMouseOutside(true);
143
136
  }
144
137
  };
145
138
  var showMinimizedRootForNarrowDesktop = function (e) {
146
- if (!isSeparatedMenuShown || !(isNarrowDesktop || (isDesktopQuery && isCollapsable)) || isTouchScreen)
139
+ if (!isSeparatedMenu || !isNarrowDesktop)
147
140
  return;
148
- var relativeXCoordinate = e.clientX - leftPosition;
149
- var sideMenuMinimizedWidth = parseInt(theme.sideMenuMinimizedWidth);
150
- if (relativeXCoordinate <= sideMenuMinimizedWidth && mousePositionX >= sideMenuMinimizedWidth) {
141
+ if (e.clientX <= parseInt(theme.sideMenuMinimizedWidth) &&
142
+ mousePositionX >= parseInt(theme.sideMenuMinimizedWidth)) {
151
143
  showMinimizedRoot(false);
152
144
  }
153
- else if (relativeXCoordinate > parseInt(theme.sideMenuWidth)) {
145
+ if (e.clientX > parseInt(theme.sideMenuWidth)) {
154
146
  showMinimizedRoot(true);
155
147
  }
156
- setMousePositionX(relativeXCoordinate);
148
+ setMousePositionX(e.clientX);
157
149
  };
158
150
  var switchActiveMenuItem = function (id) {
159
151
  if (id !== value) {
@@ -175,14 +167,13 @@ var SideMenuInner = forwardRef(function (_a, ref) {
175
167
  }, burgerTransitionDuration);
176
168
  }
177
169
  };
178
- var isSideMenuOverContent = (isNarrowDesktop || isMobile || (isTablet && !isSeparatedMenuShown) || (isDesktopQuery && isCollapsable)) &&
179
- isOpened;
180
- var _1 = useAnimateOnMount(!!isTabletOrMobile && !!isOpened, burgerTransitionDuration, {
170
+ var isSideMenuOverContent = (isNarrowDesktop || isMobile || (isTablet && !isSeparatedMenuShown)) && isOpened;
171
+ var _x = useAnimateOnMount(!!isTabletOrMobile && !!isOpened, burgerTransitionDuration, {
181
172
  opacity: DEFAULT_THEME.sidePageBackingBgOpacity,
182
173
  }, {
183
174
  opacity: 0,
184
- }), shouldShowBackdrop = _1[0], backdropStyle = _1[1];
185
- var isSideMenuOverflowing = (isTabletOrMobile || isNarrowDesktop || (isDesktopQuery && isCollapsable)) && isOpened;
175
+ }), shouldShowBackdrop = _x[0], backdropStyle = _x[1];
176
+ var isSideMenuOverflowing = (isTabletOrMobile || isNarrowDesktop) && isOpened;
186
177
  var setScrollBar = function () {
187
178
  var isSeparatedMenuShownInMobile = isMobile && isSeparatedMenuShown;
188
179
  if (isOpened && !isBeingTransitioned && !isSeparatedMenuShownInMobile) {
@@ -190,18 +181,8 @@ var SideMenuInner = forwardRef(function (_a, ref) {
190
181
  }
191
182
  return 'never';
192
183
  };
193
- var handleRightBorderClick = function () {
194
- if (isCollapsable) {
195
- setIsCollapsable(false);
196
- }
197
- else {
198
- setIsOpened(false);
199
- setIsCollapsable(true);
200
- }
201
- };
202
184
  return (React.createElement(SideMenuContext.Provider, { value: {
203
185
  isOpened: isOpened,
204
- isCollapsable: isCollapsable,
205
186
  toggleIsOpened: function () { return showMenu(!isOpened); },
206
187
  setIsMinimized: showMinimizedRoot,
207
188
  isBeingTransitioned: isBeingTransitioned,
@@ -235,10 +216,10 @@ var SideMenuInner = forwardRef(function (_a, ref) {
235
216
  _b[customStyles.rootForTabletsOrMobiles(headerHeight)] = isTabletOrMobile,
236
217
  _b[jsStylesForSideMenu.shownRootForTabletsOrMobiles()] = isOpened && isTabletOrMobile,
237
218
  _b[jsStylesForSideMenu.transitionedRootForTabletsOrMobiles()] = isBeingTransitioned && isTabletOrMobile,
238
- _b[jsStylesForSideMenu.rootForNarrowDesktops(theme)] = isNarrowDesktop || (isDesktopQuery && isCollapsable),
239
- _b[jsStylesForSideMenu.separatedRootForNarrowDesktops(theme)] = isSeparatedMenuShown && (isNarrowDesktop || (isDesktopQuery && isCollapsable)),
240
- _b[jsStylesForSideMenu.separatedRootForTouchScreens(theme)] = isSeparatedMenuShown && isTouchScreen && (isNarrowDesktop || (isDesktopQuery && isCollapsable)),
241
- _b[jsStylesForSideMenu.separatedRootForDesktops(theme)] = isSeparatedMenuShown && isDesktopQuery && !isCollapsable,
219
+ _b[jsStylesForSideMenu.rootForNarrowDesktops(theme)] = isNarrowDesktop,
220
+ _b[jsStylesForSideMenu.separatedRootForNarrowDesktops(theme)] = isSeparatedMenuShown && isNarrowDesktop,
221
+ _b[jsStylesForSideMenu.separatedRootForTouchScreens(theme)] = isSeparatedMenuShown && isTouchScreen && isNarrowDesktop,
222
+ _b[jsStylesForSideMenu.separatedRootForDesktops(theme)] = isSeparatedMenuShown && isDesktopQuery,
242
223
  _b[jsStylesForSideMenu.separatedRootForTouchScreensForDesktops(theme)] = isDesktopQuery && isSeparatedMenuShown && isTouchScreen,
243
224
  _b)) },
244
225
  React.createElement(React.Fragment, null,
@@ -264,7 +245,7 @@ var SideMenuInner = forwardRef(function (_a, ref) {
264
245
  _e[jsStylesForSideMenu.contentWrapperForTouchScreens(theme)] = isTouchScreen,
265
246
  _e[jsStylesForSideMenu.minimizedContentWrapper()] = !isOpened && !isTabletOrMobile,
266
247
  _e)), ref: contentWrapperRef }, children))),
267
- !disableSwipe && !disableCollapsing && isDesktopQuery && isOpened && (React.createElement(RightBorder, { onClick: handleRightBorderClick, showButton: isHovered }))))))));
248
+ !disableSwipe && isDesktopQuery && !isSeparatedMenuShown && (React.createElement(RightBorder, { setIsOpened: handleIsOpened, manual: manual }))))))));
268
249
  });
269
250
  SideMenuInner.displayName = 'SideMenu';
270
251
  var STATIC_PROPS = {
@@ -18,7 +18,6 @@ export interface SideMenuContextType {
18
18
  isMobile?: boolean;
19
19
  isTouchScreen?: boolean;
20
20
  isOpened?: boolean;
21
- isCollapsable?: boolean;
22
21
  toggleIsOpened?: () => void;
23
22
  setIsMinimized?: (isMinimized: boolean) => void;
24
23
  flattedArrayOfAllElements?: FlattedArrayElementType[];
@@ -50,11 +50,10 @@ var ClickableElement = forwardRef(function (_a, ref) {
50
50
  };
51
51
  var setIsMinimized = function (lastElementInTheHierarchy) {
52
52
  var _a, _b;
53
- if (context.isMobile || context.isTablet || (context.isDesktop && !context.isCollapsable))
53
+ if (context.isMobile || context.isTablet || context.isDesktop)
54
54
  return;
55
55
  var topLevelItemInSeparatedSideMenu = context.isSeparatedMenu && !_isSubMenu && children;
56
- if ((context.isNarrowDesktop || (context.isCollapsable && context.isDesktop)) &&
57
- (lastElementInTheHierarchy || topLevelItemInSeparatedSideMenu)) {
56
+ if (context.isNarrowDesktop && (lastElementInTheHierarchy || topLevelItemInSeparatedSideMenu)) {
58
57
  (_a = context.setIsMinimized) === null || _a === void 0 ? void 0 : _a.call(context, true);
59
58
  }
60
59
  if (!_isSubMenu) {
@@ -64,7 +64,7 @@ var InnerBody = function (_a) {
64
64
  return;
65
65
  var activeItemHasParent = activeMenuItemHasParent();
66
66
  var isActive = activeItemHasParent || activeMenuItemHasChildren() || false;
67
- var isMinimizedInWideDesktop = !context.isOpened && context.isDesktop && !context.isCollapsable;
67
+ var isMinimizedInWideDesktop = !context.isOpened && context.isDesktop;
68
68
  if (context.isMobile && !activeItemHasParent && context.isSeparatedMenuShown) {
69
69
  return (_a = context.setIsSeparatedMenuShown) === null || _a === void 0 ? void 0 : _a.call(context, false);
70
70
  }
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  interface RightBorderProps {
3
- onClick: () => void;
4
- showButton: boolean;
3
+ setIsOpened: (newValue: boolean | undefined, shouldSetState: boolean) => void;
4
+ manual: boolean;
5
5
  }
6
6
  declare const RightBorderWithStaticFields: React.ForwardRefExoticComponent<RightBorderProps & React.RefAttributes<HTMLDivElement>> & {
7
7
  __KONTUR_REACT_UI__: string;
@@ -1,11 +1,8 @@
1
- import React, { forwardRef, useContext } from 'react';
1
+ import React, { forwardRef, useContext, useEffect, useRef, useState } from 'react';
2
2
  import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
3
3
  import { jsStyles } from './RightBorder.styles';
4
4
  import { getSideMenuTheme } from '../../lib/theming/ThemeHelpers';
5
- import { Hint, ThemeContext } from '@skbkontur/react-ui';
6
- import { useMemoBorderIcon } from '../../hooks/useMemoIcon';
7
- import { SideMenuContext } from '../SideMenuContext';
8
- import { SideMenuDataTids } from '../../SideMenuDataTids';
5
+ import { ThemeContext } from '@skbkontur/react-ui';
9
6
  /**
10
7
  * Элемент интерактивной правой границы
11
8
  *
@@ -13,20 +10,63 @@ import { SideMenuDataTids } from '../../SideMenuDataTids';
13
10
  */
14
11
  var RightBorder = forwardRef(function (_a, ref) {
15
12
  var _b;
16
- var onClick = _a.onClick, showButton = _a.showButton;
13
+ var setIsOpened = _a.setIsOpened, manual = _a.manual;
17
14
  var theme = getSideMenuTheme(useContext(ThemeContext));
18
- var context = useContext(SideMenuContext);
19
- var icon = useMemoBorderIcon(context.isCollapsable);
20
- var hintText = context.isCollapsable ? 'Закрепить меню' : 'Свернуть меню';
21
- return (React.createElement(Hint, { text: hintText, pos: 'right' },
22
- React.createElement("div", { className: cx((_b = {},
23
- _b[jsStyles.root(theme)] = true,
24
- _b[jsStyles.rootWithButton()] = showButton,
25
- _b)), ref: ref, onClick: onClick, onKeyDown: function (e) {
26
- if (e.key === 'Enter' || e.key === 'Space') {
27
- onClick();
28
- }
29
- }, role: "button", tabIndex: 0, "data-tid": SideMenuDataTids.rightBorder }, icon)));
15
+ var resizeTimer = useRef(null);
16
+ var _c = useState(false), isAbleToResize = _c[0], setIsAbleToResize = _c[1];
17
+ var rightBorderRef = useRef(null);
18
+ var handleMouseEnter = function () {
19
+ resizeTimer.current = setTimeout(function () {
20
+ setIsAbleToResize(true);
21
+ }, 500);
22
+ };
23
+ var handleMouseLeave = function () {
24
+ if (resizeTimer.current) {
25
+ clearTimeout(resizeTimer.current);
26
+ }
27
+ setIsAbleToResize(false);
28
+ };
29
+ var isMouseDown = false, startX = 0;
30
+ var checkStart = function (event) {
31
+ startX = event.pageX;
32
+ isMouseDown = true;
33
+ };
34
+ var checkMove = function (event) {
35
+ if (!isMouseDown) {
36
+ return;
37
+ }
38
+ if (event.pageX < startX) {
39
+ setIsOpened(false, !manual);
40
+ isMouseDown = false;
41
+ }
42
+ return;
43
+ };
44
+ var checkEnd = function () {
45
+ isMouseDown = false;
46
+ };
47
+ var swipe = function (rightBorder) {
48
+ if (rightBorder) {
49
+ rightBorder.addEventListener('mousedown', checkStart);
50
+ rightBorder.addEventListener('mousemove', checkMove);
51
+ document.addEventListener('mouseup', checkEnd);
52
+ }
53
+ };
54
+ useEffect(function () {
55
+ if (rightBorderRef.current) {
56
+ swipe(rightBorderRef.current);
57
+ }
58
+ return function () {
59
+ if (rightBorderRef.current) {
60
+ rightBorderRef.current.removeEventListener('mousedown', checkStart, true);
61
+ rightBorderRef.current.removeEventListener('mousemove', checkMove, true);
62
+ }
63
+ document.removeEventListener('mouseup', checkEnd, true);
64
+ };
65
+ }, []);
66
+ return (React.createElement("div", { className: cx((_b = {},
67
+ _b[jsStyles.root(theme)] = true,
68
+ _b[jsStyles.resizableRoot()] = isAbleToResize,
69
+ _b)), ref: rightBorderRef || ref, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave }, isAbleToResize && React.createElement("div", { className: jsStyles.rootHovered(theme) })));
30
70
  });
31
71
  RightBorder.displayName = 'RightBorder';
32
72
  var RightBorderWithStaticFields = Object.assign(RightBorder, { __KONTUR_REACT_UI__: 'RightBorder' });
@@ -1,5 +1,6 @@
1
1
  import { SideMenuTheme } from '../../lib/theming/ThemeTypes';
2
2
  export declare const jsStyles: {
3
3
  root(t: SideMenuTheme): string;
4
- rootWithButton(): string;
4
+ resizableRoot(): string;
5
+ rootHovered(t: SideMenuTheme): string;
5
6
  };
@@ -3,11 +3,15 @@ import { css } from '@skbkontur/react-ui/lib/theming/Emotion';
3
3
  import { memoizeStyle } from '../../lib/theming/ThemeHelpers';
4
4
  var styles = {
5
5
  root: function (t) {
6
- return css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n opacity: 0;\n position: absolute;\n width: ", ";\n height: 100%;\n right: 0;\n background: transparent;\n display: flex;\n color: ", ";\n transition: opacity, color 150ms cubic-bezier(0.5, 1, 0.89, 1);\n &:hover {\n color: ", ";\n }\n "], ["\n opacity: 0;\n position: absolute;\n width: ", ";\n height: 100%;\n right: 0;\n background: transparent;\n display: flex;\n color: ", ";\n transition: opacity, color 150ms cubic-bezier(0.5, 1, 0.89, 1);\n &:hover {\n color: ", ";\n }\n "])), t.sideMenuRightBorderWidth, t.sideMenuRightBorderIconColor, t.sideMenuRightBorderHoverIconColor);
6
+ return css(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n position: absolute;\n width: ", ";\n height: 100%;\n right: -", "px;\n background: transparent;\n "], ["\n position: absolute;\n width: ", ";\n height: 100%;\n right: -", "px;\n background: transparent;\n "])), t.sideMenuRightBorderWidth, parseInt(t.sideMenuRightBorderWidth) / 2);
7
7
  },
8
- rootWithButton: function () {
9
- return css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n opacity: 1;\n "], ["\n opacity: 1;\n "])));
8
+ resizableRoot: function () {
9
+ return css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n cursor: col-resize;\n "], ["\n cursor: col-resize;\n "])));
10
+ },
11
+ rootHovered: function (t) {
12
+ var left = parseInt(t.sideMenuRightBorderWidth) / 2 - parseInt(t.sideMenuRightBorderHoverWidth) / 2; //левое положение подсвеченной границы: вычисляется как половина активной ширины (`10`) минус половина ширины подсвеченной границы (`1`)
13
+ return css(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n position: absolute;\n width: ", ";\n background: ", ";\n height: 100%;\n left: ", "px;\n "], ["\n position: absolute;\n width: ", ";\n background: ", ";\n height: 100%;\n left: ", "px;\n "])), t.sideMenuRightBorderHoverWidth, t.sideMenuRightBorderColor, left);
10
14
  },
11
15
  };
12
16
  export var jsStyles = memoizeStyle(styles);
13
- var templateObject_1, templateObject_2;
17
+ var templateObject_1, templateObject_2, templateObject_3;
@@ -56,10 +56,8 @@ var SeparatedSubMenu = forwardRef(function (_a, ref) {
56
56
  _b[jsStyles.root(theme)] = true,
57
57
  _b[customStyles.rootForMobiles(context.headerHeight)] = context.isMobile,
58
58
  _b[jsStyles.rootForDesktop()] = context.isDesktop,
59
- _b[jsStyles.rootForTouchScreens(theme)] = context.isTouchScreen &&
60
- context.isOpened &&
61
- (context.isNarrowDesktop || (context.isDesktop && context.isCollapsable)),
62
- _b[jsStyles.rootForNarrowDesktop(theme)] = context.isNarrowDesktop || (context.isDesktop && context.isCollapsable),
59
+ _b[jsStyles.rootForTouchScreens(theme)] = context.isTouchScreen && context.isOpened && context.isNarrowDesktop,
60
+ _b[jsStyles.rootForNarrowDesktop(theme)] = context.isNarrowDesktop,
63
61
  _b[jsStyles.rootWithShadow(theme)] = context.isTablet && !isIE11,
64
62
  _b)), ref: ref, "data-tid": SideMenuDataTids.separatedSubMenu },
65
63
  React.createElement(ScrollContainer, { onScrollStateChangeY: function (state) {