@skbkontur/side-menu 1.11.5 → 1.12.2

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,33 @@
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.12.2](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@1.12.1...@skbkontur/side-menu@1.12.2) (2024-03-29)
7
+
8
+ **Note:** Version bump only for package @skbkontur/side-menu
9
+
10
+
11
+
12
+
13
+
14
+ ## [1.12.1](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@1.12.0...@skbkontur/side-menu@1.12.1) (2024-03-27)
15
+
16
+ **Note:** Version bump only for package @skbkontur/side-menu
17
+
18
+
19
+
20
+
21
+
22
+ # [1.12.0](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@1.11.5...@skbkontur/side-menu@1.12.0) (2024-03-22)
23
+
24
+
25
+ ### Features
26
+
27
+ * **SideMenu:** collapsing menu in wide desktop with right border button ([01556f4](https://git.skbkontur.ru/ui/ui-parking/commits/01556f4cbb138cd8d795889a67341542b4bf6c5b))
28
+
29
+
30
+
31
+
32
+
6
33
  ## [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
34
 
8
35
  **Note:** Version bump only for package @skbkontur/side-menu
package/README.md CHANGED
@@ -1,6 +1,6 @@
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` или выше
3
+ Для корректной работы SideMenu с версии `1.11.0` необходим пакет `@skbkontur/react-ui` версии `4.20.0` или выше
4
4
 
5
5
  [Пример в песочнице](https://codesandbox.io/s/competent-wiles-k85wlm)
6
6
 
@@ -21,7 +21,7 @@ import { AttachLinkIcon } from '@skbkontur/icons/icons/AttachLinkIcon';
21
21
 
22
22
  <div style={{height: '600px', position: 'relative'}}>
23
23
  <ThemeContext.Provider value={ThemeFactory.create({ sideMenuProductColor: '#64b419' }, THEME_2022)}>
24
- <SideMenu disableSwipe={false}>
24
+ <SideMenu>
25
25
  <SideMenu.Header konturLogo={<Kontur/>} productLogo={<Ofd/>}/>
26
26
  <SideMenu.Body>
27
27
  <SideMenu.Item icon={<DocTextIcon24Regular/>} caption={'Документы к подписанию'} marker={'2'}>
@@ -616,7 +616,7 @@ import { ThemeContext, ThemeFactory } from '@skbkontur/react-ui';
616
616
 
617
617
  <div style={{ height: '200px', position: 'relative' }}>
618
618
  <ThemeContext.Provider value={ThemeFactory.create({ sideMenuWidth: '300px', sideMenuIconSize: '32px', sideMenuProductColor: '#64b419' })}>
619
- <SideMenu disableSwipe={false}>
619
+ <SideMenu>
620
620
  <SideMenu.Header konturLogo={<Kontur />} productLogo={<Ofd />} />
621
621
  <SideMenu.Body>
622
622
  <SideMenu.Item icon={<DocTextIcon24Regular />} caption={'Документы к подписанию'} marker={'2'} />
@@ -691,9 +691,9 @@ const [isOpen, setIsOpen] = React.useState(true);
691
691
  sideMenuNestedMenuPaddingLeft: string;
692
692
  //#endregion
693
693
  //#region RightBorder
694
- MenuRightBorderWidth: string;
695
- sideMenuRightBorderColor: string;
696
- sideMenuRightBorderHoverWidth: string;
694
+ sideMenuRightBorderWidth: string;
695
+ sideMenuRightBorderIconColor: string;
696
+ sideMenuRightBorderHoverIconColor: string;
697
697
  // #region BackButton (for Mobiles)
698
698
  sideMenuBackButtonCaptionFontWeight: string;
699
699
  sideMenuBackButtonCaptionFontSize: string;
@@ -3,4 +3,5 @@ export declare const SideMenuDataTids: {
3
3
  burger: string;
4
4
  backButton: string;
5
5
  separatedSubMenu: string;
6
+ rightBorder: string;
6
7
  };
@@ -3,4 +3,5 @@ export var SideMenuDataTids = {
3
3
  burger: 'SideMenu__burger',
4
4
  backButton: 'SideMenu__backButton',
5
5
  separatedSubMenu: 'SideMenu__separatedSubMenu',
6
+ rightBorder: 'SideMenu__rightBorder',
6
7
  };
@@ -1,2 +1,3 @@
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,6 +1,7 @@
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';
4
5
  export var useMemoIcon = function (children, isOpened) {
5
6
  return useMemo(function () {
6
7
  if (children) {
@@ -13,3 +14,13 @@ export var useMemoIcon = function (children, isOpened) {
13
14
  }
14
15
  }, [isOpened, children]);
15
16
  };
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,16 @@ export declare class SideMenuTheme extends SideMenuTheme_base {
101
101
  static sideMenuDividerBgColor: string;
102
102
  static sideMenuNestedMenuPaddingLeft: string;
103
103
  static sideMenuRightBorderWidth: string;
104
+ /**
105
+ * @deprecated doesn't work since v 1.12
106
+ */
104
107
  static get sideMenuRightBorderColor(): string;
108
+ /**
109
+ * @deprecated doesn't work since v 1.12
110
+ */
105
111
  static sideMenuRightBorderHoverWidth: string;
112
+ static sideMenuRightBorderIconColor: string;
113
+ static sideMenuRightBorderHoverIconColor: string;
106
114
  static sideMenuLogotypePaddingLeft: string;
107
115
  static sideMenuLogotypePaddingTop: string;
108
116
  static sideMenuLogotypePaddingBottom: string;
@@ -108,6 +108,9 @@ var SideMenuTheme = /** @class */ (function (_super) {
108
108
  configurable: true
109
109
  });
110
110
  Object.defineProperty(SideMenuTheme, "sideMenuRightBorderColor", {
111
+ /**
112
+ * @deprecated doesn't work since v 1.12
113
+ */
111
114
  get: function () {
112
115
  return this.sideMenuProductColor;
113
116
  },
@@ -238,8 +241,13 @@ var SideMenuTheme = /** @class */ (function (_super) {
238
241
  SideMenuTheme.sideMenuNestedMenuPaddingLeft = '16px';
239
242
  //#endregion
240
243
  //#region RightBorder
241
- SideMenuTheme.sideMenuRightBorderWidth = '20px';
244
+ SideMenuTheme.sideMenuRightBorderWidth = '16px';
245
+ /**
246
+ * @deprecated doesn't work since v 1.12
247
+ */
242
248
  SideMenuTheme.sideMenuRightBorderHoverWidth = '2px';
249
+ SideMenuTheme.sideMenuRightBorderIconColor = '#adadad';
250
+ SideMenuTheme.sideMenuRightBorderHoverIconColor = '#222222';
243
251
  //#endregion
244
252
  //#region Logotype
245
253
  SideMenuTheme.sideMenuLogotypePaddingLeft = '8px';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skbkontur/side-menu",
3
- "version": "1.11.5",
3
+ "version": "1.12.2",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
@@ -22,7 +22,7 @@
22
22
  "@skbkontur/react-ui": "4.20.0"
23
23
  },
24
24
  "dependencies": {
25
- "@skbkontur/icons": "^1.7.3",
25
+ "@skbkontur/icons": "^1.9.0",
26
26
  "@skbkontur/react-ui-addons": "^4.10.2",
27
27
  "tslib": "^1"
28
28
  }
@@ -17,7 +17,14 @@ export interface SideMenuProps extends CommonProps {
17
17
  children?: React.ReactNode;
18
18
  size?: 'small' | 'large';
19
19
  isSeparatedMenu?: boolean;
20
+ /**
21
+ * @deprecated use disableCollapsing
22
+ */
20
23
  disableSwipe?: boolean;
24
+ /**
25
+ * Заблокировать возможность сворачивания меню до иконок на широких экранах
26
+ */
27
+ disableCollapsing?: boolean;
21
28
  value?: string;
22
29
  onValueChange?: (value: string) => void;
23
30
  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, 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"]);
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 ? false : _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"]);
35
35
  var transitionTimer = useRef(null);
36
36
  var sideMenuRef = useRef(null);
37
37
  var contentWrapperRef = useRef(null);
@@ -43,26 +43,31 @@ var SideMenuInner = forwardRef(function (_a, ref) {
43
43
  isNarrowDesktopQuery: narrowDesktopMediaQuery || theme.sideMenuNarrowDesktopMediaQuery,
44
44
  isDesktopQuery: desktopMediaQuery || theme.sideMenuDesktopMediaQuery,
45
45
  };
46
- var _l = useResponsiveLayout({
46
+ var _m = useResponsiveLayout({
47
47
  customMediaQueries: customMediaQueries,
48
- }), isMobileQuery = _l.isMobileQuery, isTabletQuery = _l.isTabletQuery, isNarrowDesktopQuery = _l.isNarrowDesktopQuery, isDesktopQuery = _l.isDesktopQuery;
48
+ }), isMobileQuery = _m.isMobileQuery, isTabletQuery = _m.isTabletQuery, isNarrowDesktopQuery = _m.isNarrowDesktopQuery, isDesktopQuery = _m.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 _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];
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(isNarrowDesktop), 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];
65
68
  useEffect(function () {
69
+ var _a;
70
+ setLeftPosition(((_a = sideMenuRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left) || 0);
66
71
  return function () {
67
72
  if (transitionTimer.current) {
68
73
  clearTimeout(transitionTimer.current);
@@ -95,10 +100,12 @@ var SideMenuInner = forwardRef(function (_a, ref) {
95
100
  useEffect(function () {
96
101
  if (isDesktopQuery) {
97
102
  setIsOpened(true);
103
+ setIsCollapsable(false);
98
104
  }
99
105
  if (isNarrowDesktop || isTablet || isMobile) {
100
106
  setIsOpened(false);
101
107
  }
108
+ isNarrowDesktop && setIsCollapsable(true);
102
109
  }, [isNarrowDesktop, isDesktopQuery, isTablet, isMobile]);
103
110
  useEffect(function () {
104
111
  setActiveMenuItem(value);
@@ -119,33 +126,36 @@ var SideMenuInner = forwardRef(function (_a, ref) {
119
126
  }
120
127
  };
121
128
  var handleMouseEnter = function () {
129
+ setIsHovered(true);
122
130
  if ((isSeparatedMenu && isSeparatedMenuShown && isNarrowDesktop && manual) || isTouchScreen) {
123
131
  return;
124
132
  }
125
- if (isNarrowDesktop || (isDesktopQuery && !isOpened)) {
133
+ if (isCollapsable && !isOpened && !isSeparatedMenuShown) {
126
134
  isMouseOutside && showMinimizedRoot(false);
127
135
  setIsMouseOutside(false);
128
136
  }
129
137
  };
130
138
  var handleMouseLeave = function () {
131
- if (isNarrowDesktop) {
139
+ setIsHovered(false);
140
+ if (isCollapsable) {
132
141
  handleIsOpened(false, !manual);
133
- }
134
- if ((isNarrowDesktop || (isDesktopQuery && !isOpened)) && !manual) {
135
- setIsMouseOutside(true);
142
+ if (!manual) {
143
+ setIsMouseOutside(true);
144
+ }
136
145
  }
137
146
  };
138
147
  var showMinimizedRootForNarrowDesktop = function (e) {
139
- if (!isSeparatedMenu || !isNarrowDesktop)
148
+ if (!isSeparatedMenuShown || !isCollapsable || isTouchScreen)
140
149
  return;
141
- if (e.clientX <= parseInt(theme.sideMenuMinimizedWidth) &&
142
- mousePositionX >= parseInt(theme.sideMenuMinimizedWidth)) {
150
+ var relativeXCoordinate = e.clientX - leftPosition;
151
+ var sideMenuMinimizedWidth = parseInt(theme.sideMenuMinimizedWidth);
152
+ if (relativeXCoordinate <= sideMenuMinimizedWidth && mousePositionX >= sideMenuMinimizedWidth) {
143
153
  showMinimizedRoot(false);
144
154
  }
145
- if (e.clientX > parseInt(theme.sideMenuWidth)) {
155
+ else if (relativeXCoordinate > parseInt(theme.sideMenuWidth)) {
146
156
  showMinimizedRoot(true);
147
157
  }
148
- setMousePositionX(e.clientX);
158
+ setMousePositionX(relativeXCoordinate);
149
159
  };
150
160
  var switchActiveMenuItem = function (id) {
151
161
  if (id !== value) {
@@ -167,13 +177,13 @@ var SideMenuInner = forwardRef(function (_a, ref) {
167
177
  }, burgerTransitionDuration);
168
178
  }
169
179
  };
170
- var isSideMenuOverContent = (isNarrowDesktop || isMobile || (isTablet && !isSeparatedMenuShown)) && isOpened;
171
- var _x = useAnimateOnMount(!!isTabletOrMobile && !!isOpened, burgerTransitionDuration, {
180
+ var isSideMenuOverContent = (isCollapsable || isMobile || (isTablet && !isSeparatedMenuShown)) && isOpened;
181
+ var _1 = useAnimateOnMount(!!isTabletOrMobile && !!isOpened, burgerTransitionDuration, {
172
182
  opacity: DEFAULT_THEME.sidePageBackingBgOpacity,
173
183
  }, {
174
184
  opacity: 0,
175
- }), shouldShowBackdrop = _x[0], backdropStyle = _x[1];
176
- var isSideMenuOverflowing = (isTabletOrMobile || isNarrowDesktop) && isOpened;
185
+ }), shouldShowBackdrop = _1[0], backdropStyle = _1[1];
186
+ var isSideMenuOverflowing = (isTabletOrMobile || isCollapsable) && isOpened;
177
187
  var setScrollBar = function () {
178
188
  var isSeparatedMenuShownInMobile = isMobile && isSeparatedMenuShown;
179
189
  if (isOpened && !isBeingTransitioned && !isSeparatedMenuShownInMobile) {
@@ -181,8 +191,18 @@ var SideMenuInner = forwardRef(function (_a, ref) {
181
191
  }
182
192
  return 'never';
183
193
  };
194
+ var handleRightBorderClick = function () {
195
+ if (isCollapsable) {
196
+ setIsCollapsable(false);
197
+ }
198
+ else {
199
+ setIsOpened(false);
200
+ setIsCollapsable(true);
201
+ }
202
+ };
184
203
  return (React.createElement(SideMenuContext.Provider, { value: {
185
204
  isOpened: isOpened,
205
+ isCollapsable: isCollapsable,
186
206
  toggleIsOpened: function () { return showMenu(!isOpened); },
187
207
  setIsMinimized: showMinimizedRoot,
188
208
  isBeingTransitioned: isBeingTransitioned,
@@ -216,10 +236,10 @@ var SideMenuInner = forwardRef(function (_a, ref) {
216
236
  _b[customStyles.rootForTabletsOrMobiles(headerHeight)] = isTabletOrMobile,
217
237
  _b[jsStylesForSideMenu.shownRootForTabletsOrMobiles()] = isOpened && isTabletOrMobile,
218
238
  _b[jsStylesForSideMenu.transitionedRootForTabletsOrMobiles()] = isBeingTransitioned && isTabletOrMobile,
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,
239
+ _b[jsStylesForSideMenu.rootForNarrowDesktops(theme)] = isCollapsable,
240
+ _b[jsStylesForSideMenu.separatedRootForNarrowDesktops(theme)] = isSeparatedMenuShown && isCollapsable,
241
+ _b[jsStylesForSideMenu.separatedRootForTouchScreens(theme)] = isSeparatedMenuShown && isTouchScreen && isCollapsable,
242
+ _b[jsStylesForSideMenu.separatedRootForDesktops(theme)] = isSeparatedMenuShown && isDesktopQuery && !isCollapsable,
223
243
  _b[jsStylesForSideMenu.separatedRootForTouchScreensForDesktops(theme)] = isDesktopQuery && isSeparatedMenuShown && isTouchScreen,
224
244
  _b)) },
225
245
  React.createElement(React.Fragment, null,
@@ -245,7 +265,7 @@ var SideMenuInner = forwardRef(function (_a, ref) {
245
265
  _e[jsStylesForSideMenu.contentWrapperForTouchScreens(theme)] = isTouchScreen,
246
266
  _e[jsStylesForSideMenu.minimizedContentWrapper()] = !isOpened && !isTabletOrMobile,
247
267
  _e)), ref: contentWrapperRef }, children))),
248
- !disableSwipe && isDesktopQuery && !isSeparatedMenuShown && (React.createElement(RightBorder, { setIsOpened: handleIsOpened, manual: manual }))))))));
268
+ !disableSwipe && !disableCollapsing && isDesktopQuery && isOpened && (React.createElement(RightBorder, { onClick: handleRightBorderClick, showButton: isHovered }))))))));
249
269
  });
250
270
  SideMenuInner.displayName = 'SideMenu';
251
271
  var STATIC_PROPS = {
@@ -18,6 +18,7 @@ export interface SideMenuContextType {
18
18
  isMobile?: boolean;
19
19
  isTouchScreen?: boolean;
20
20
  isOpened?: boolean;
21
+ isCollapsable?: boolean;
21
22
  toggleIsOpened?: () => void;
22
23
  setIsMinimized?: (isMinimized: boolean) => void;
23
24
  flattedArrayOfAllElements?: FlattedArrayElementType[];
@@ -50,10 +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)
53
+ if (context.isMobile || context.isTablet || (context.isDesktop && !context.isCollapsable))
54
54
  return;
55
55
  var topLevelItemInSeparatedSideMenu = context.isSeparatedMenu && !_isSubMenu && children;
56
- if (context.isNarrowDesktop && (lastElementInTheHierarchy || topLevelItemInSeparatedSideMenu)) {
56
+ if (context.isCollapsable && (lastElementInTheHierarchy || topLevelItemInSeparatedSideMenu)) {
57
57
  (_a = context.setIsMinimized) === null || _a === void 0 ? void 0 : _a.call(context, true);
58
58
  }
59
59
  if (!_isSubMenu) {
@@ -99,7 +99,7 @@ var ClickableElement = forwardRef(function (_a, ref) {
99
99
  setIsFocusedByTab(false);
100
100
  };
101
101
  var shouldHighlightTopLevelItemWhenSubItemSelectedInSeparatedMenu = isOpened && !_isSubMenu && context.isSeparatedMenu;
102
- var shouldHighlightTopLevelItemWhenMenuIsMinimized = isOpened && !_isSubMenu && context.isNarrowDesktop && !context.isOpened;
102
+ var shouldHighlightTopLevelItemWhenMenuIsMinimized = isOpened && !_isSubMenu && context.isCollapsable && !context.isOpened;
103
103
  var Component = _isSubMenu || _isDropdown ? 'div' : 'li';
104
104
  var newProps = __assign({ className: cx((_b = {},
105
105
  _b[jsStyles.root(theme)] = true,
@@ -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;
67
+ var isMinimizedInWideDesktop = !context.isOpened && context.isDesktop && !context.isCollapsable;
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
- setIsOpened: (newValue: boolean | undefined, shouldSetState: boolean) => void;
4
- manual: boolean;
3
+ onClick: () => void;
4
+ showButton: boolean;
5
5
  }
6
6
  declare const RightBorderWithStaticFields: React.ForwardRefExoticComponent<RightBorderProps & React.RefAttributes<HTMLDivElement>> & {
7
7
  __KONTUR_REACT_UI__: string;
@@ -1,8 +1,11 @@
1
- import React, { forwardRef, useContext, useEffect, useRef, useState } from 'react';
1
+ import React, { forwardRef, useContext } 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 { ThemeContext } from '@skbkontur/react-ui';
5
+ import { Hint, ThemeContext } from '@skbkontur/react-ui';
6
+ import { useMemoBorderIcon } from '../../hooks/useMemoIcon';
7
+ import { SideMenuContext } from '../SideMenuContext';
8
+ import { SideMenuDataTids } from '../../SideMenuDataTids';
6
9
  /**
7
10
  * Элемент интерактивной правой границы
8
11
  *
@@ -10,63 +13,20 @@ import { ThemeContext } from '@skbkontur/react-ui';
10
13
  */
11
14
  var RightBorder = forwardRef(function (_a, ref) {
12
15
  var _b;
13
- var setIsOpened = _a.setIsOpened, manual = _a.manual;
16
+ var onClick = _a.onClick, showButton = _a.showButton;
14
17
  var theme = getSideMenuTheme(useContext(ThemeContext));
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) })));
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)));
70
30
  });
71
31
  RightBorder.displayName = 'RightBorder';
72
32
  var RightBorderWithStaticFields = Object.assign(RightBorder, { __KONTUR_REACT_UI__: 'RightBorder' });
@@ -1,6 +1,5 @@
1
1
  import { SideMenuTheme } from '../../lib/theming/ThemeTypes';
2
2
  export declare const jsStyles: {
3
3
  root(t: SideMenuTheme): string;
4
- resizableRoot(): string;
5
- rootHovered(t: SideMenuTheme): string;
4
+ rootWithButton(): string;
6
5
  };
@@ -3,15 +3,11 @@ 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 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);
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);
7
7
  },
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);
8
+ rootWithButton: function () {
9
+ return css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n opacity: 1;\n "], ["\n opacity: 1;\n "])));
14
10
  },
15
11
  };
16
12
  export var jsStyles = memoizeStyle(styles);
17
- var templateObject_1, templateObject_2, templateObject_3;
13
+ var templateObject_1, templateObject_2;
@@ -56,8 +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 && context.isOpened && context.isNarrowDesktop,
60
- _b[jsStyles.rootForNarrowDesktop(theme)] = context.isNarrowDesktop,
59
+ _b[jsStyles.rootForTouchScreens(theme)] = context.isTouchScreen && context.isOpened && context.isCollapsable,
60
+ _b[jsStyles.rootForNarrowDesktop(theme)] = context.isCollapsable,
61
61
  _b[jsStyles.rootWithShadow(theme)] = context.isTablet && !isIE11,
62
62
  _b)), ref: ref, "data-tid": SideMenuDataTids.separatedSubMenu },
63
63
  React.createElement(ScrollContainer, { onScrollStateChangeY: function (state) {
@@ -72,7 +72,7 @@ var SideMenuLogotype = forwardRef(function (_a, ref) {
72
72
  _d[jsStyles.logoWrapperHidden()] = !context.isOpened && !(context.isMobile || context.isTablet),
73
73
  _d)) },
74
74
  (context.isTablet || context.isMobile) && React.createElement(Burger, null),
75
- React.createElement(Logotype, __assign({ ref: refLogotype, size: size, productLogo: productLogo, konturLogo: konturLogo, withWidget: getWidget(withWidget, !context.isOpened && context.isNarrowDesktop) }, rest)))));
75
+ React.createElement(Logotype, __assign({ ref: refLogotype, size: size, productLogo: productLogo, konturLogo: konturLogo, withWidget: getWidget(withWidget, !context.isOpened && context.isCollapsable) }, rest)))));
76
76
  });
77
77
  SideMenuLogotype.displayName = 'SideMenuLogotype';
78
78
  var SideMenuLogotypeWithStaticFields = Object.assign(SideMenuLogotype, { __KONTUR_REACT_UI__: 'SideMenuLogotype' });