@skbkontur/side-menu 3.1.7 → 3.2.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/CHANGELOG.md +19 -0
- package/SideMenuDataTids.d.ts +8 -8
- package/SideMenuDataTids.js +8 -8
- package/hooks/useAnimateOnMount.d.ts +2 -2
- package/hooks/useAnimateOnMount.js +19 -19
- package/hooks/useMemoIcon.d.ts +8 -8
- package/hooks/useMemoIcon.js +27 -27
- package/index.d.ts +14 -14
- package/index.js +14 -14
- package/internal/themes/SideMenuTheme.d.ts +132 -132
- package/internal/themes/SideMenuTheme.js +291 -291
- package/lib/theming/ThemeHelpers.d.ts +18 -18
- package/lib/theming/ThemeHelpers.js +77 -77
- package/lib/theming/ThemeTypes.d.ts +3 -3
- package/lib/theming/ThemeTypes.js +1 -0
- package/lib/utils/memo.d.ts +1 -1
- package/lib/utils/memo.js +9 -9
- package/lib/utils/scripts.d.ts +5 -5
- package/lib/utils/scripts.js +10 -10
- package/package.json +4 -4
- package/src/Navigation.d.ts +52 -52
- package/src/Navigation.js +191 -156
- package/src/SideMenu/SideMenu.d.ts +90 -90
- package/src/SideMenu/SideMenu.js +315 -315
- package/src/SideMenu/SideMenu.styles.d.ts +27 -27
- package/src/SideMenu/SideMenu.styles.js +77 -77
- package/src/SideMenuAvatar/SideMenuAvatar.d.ts +13 -13
- package/src/SideMenuAvatar/SideMenuAvatar.js +18 -18
- package/src/SideMenuBody/SideMenuBody.d.ts +13 -13
- package/src/SideMenuBody/SideMenuBody.js +27 -27
- package/src/SideMenuBody/SideMenuBody.styles.d.ts +5 -5
- package/src/SideMenuBody/SideMenuBody.styles.js +13 -13
- package/src/SideMenuContext.d.ts +30 -30
- package/src/SideMenuContext.js +2 -2
- package/src/SideMenuDivider/SideMenuDivider.d.ts +10 -10
- package/src/SideMenuDivider/SideMenuDivider.js +19 -19
- package/src/SideMenuDivider/SideMenuDivider.styles.d.ts +4 -4
- package/src/SideMenuDivider/SideMenuDivider.styles.js +10 -10
- package/src/SideMenuDropdown/SideMenuDropdown.d.ts +17 -17
- package/src/SideMenuDropdown/SideMenuDropdown.js +40 -40
- package/src/SideMenuDropdown/SideMenuDropdown.styles.d.ts +7 -7
- package/src/SideMenuDropdown/SideMenuDropdown.styles.js +20 -20
- package/src/SideMenuFooter/SideMenuFooter.d.ts +13 -13
- package/src/SideMenuFooter/SideMenuFooter.js +34 -34
- package/src/SideMenuFooter/SideMenuFooter.styles.d.ts +6 -6
- package/src/SideMenuFooter/SideMenuFooter.styles.js +16 -16
- package/src/SideMenuHeader/SideMenuHeader.d.ts +13 -13
- package/src/SideMenuHeader/SideMenuHeader.js +39 -39
- package/src/SideMenuHeader/SideMenuHeader.styles.d.ts +8 -8
- package/src/SideMenuHeader/SideMenuHeader.styles.js +22 -22
- package/src/SideMenuItem/SideMenuItem.d.ts +15 -15
- package/src/SideMenuItem/SideMenuItem.js +16 -16
- package/src/SideMenuLink/SideMenuLink.d.ts +16 -16
- package/src/SideMenuLink/SideMenuLink.js +21 -21
- package/src/SideMenuLink/SideMenuLink.styles.d.ts +3 -3
- package/src/SideMenuLink/SideMenuLink.styles.js +9 -9
- package/src/SideMenuOrganisations/SideMenuOrganisations.d.ts +10 -10
- package/src/SideMenuOrganisations/SideMenuOrganisations.js +16 -16
- package/src/SideMenuSubItem/SideMenuSubItem.d.ts +12 -12
- package/src/SideMenuSubItem/SideMenuSubItem.js +15 -15
- package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.d.ts +13 -13
- package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.js +26 -26
- package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.styles.d.ts +5 -5
- package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.styles.js +13 -13
- package/src/SideMenuSubLink/SideMenuSubLink.d.ts +14 -14
- package/src/SideMenuSubLink/SideMenuSubLink.js +18 -18
- package/src/Tree.d.ts +17 -17
- package/src/Tree.js +133 -133
- package/src/internal/BackButton.d.ts +9 -9
- package/src/internal/BackButton.js +25 -25
- package/src/internal/Backdrop.d.ts +4 -4
- package/src/internal/Backdrop.js +13 -13
- package/src/internal/Backdrop.styles.d.ts +3 -3
- package/src/internal/Backdrop.styles.js +10 -10
- package/src/internal/Burger.d.ts +1 -1
- package/src/internal/Burger.js +13 -13
- package/src/internal/Burger.styles.d.ts +4 -4
- package/src/internal/Burger.styles.js +11 -11
- package/src/internal/ClickableElement.d.ts +32 -32
- package/src/internal/ClickableElement.js +141 -141
- package/src/internal/ClickableElement.styles.d.ts +10 -10
- package/src/internal/ClickableElement.styles.js +29 -29
- package/src/internal/InnerSubMenu.d.ts +10 -10
- package/src/internal/InnerSubMenu.js +21 -21
- package/src/internal/ItemContent/Caption.d.ts +9 -9
- package/src/internal/ItemContent/Caption.js +73 -73
- package/src/internal/ItemContent/Caption.styles.d.ts +19 -19
- package/src/internal/ItemContent/Caption.styles.js +51 -51
- package/src/internal/ItemContent/Icon.d.ts +6 -6
- package/src/internal/ItemContent/Icon.js +42 -42
- package/src/internal/ItemContent/Icon.styles.d.ts +10 -10
- package/src/internal/ItemContent/Icon.styles.js +28 -28
- package/src/internal/ItemContent/ItemContent.d.ts +8 -8
- package/src/internal/ItemContent/ItemContent.js +68 -68
- package/src/internal/ItemContent/ItemContent.styles.d.ts +14 -14
- package/src/internal/ItemContent/ItemContent.styles.js +40 -40
- package/src/internal/ItemContent/Marker.d.ts +7 -7
- package/src/internal/ItemContent/Marker.js +21 -21
- package/src/internal/ItemContent/Marker.styles.d.ts +11 -11
- package/src/internal/ItemContent/Marker.styles.js +31 -31
- package/src/internal/NestedMenu.d.ts +10 -10
- package/src/internal/NestedMenu.js +26 -26
- package/src/internal/NestedMenu.styles.d.ts +4 -4
- package/src/internal/NestedMenu.styles.js +10 -10
- package/src/internal/RightBorder.d.ts +9 -9
- package/src/internal/RightBorder.js +33 -33
- package/src/internal/RightBorder.styles.d.ts +5 -5
- package/src/internal/RightBorder.styles.js +13 -13
- package/src/internal/SeparatedSubMenu.d.ts +11 -11
- package/src/internal/SeparatedSubMenu.js +64 -64
- package/src/internal/SeparatedSubMenu.styles.d.ts +13 -13
- package/src/internal/SeparatedSubMenu.styles.js +33 -33
- package/src/internal/SideMenuLogotype.d.ts +6 -6
- package/src/internal/SideMenuLogotype.js +80 -79
- package/src/internal/SideMenuLogotype.styles.d.ts +12 -12
- package/src/internal/SideMenuLogotype.styles.js +31 -31
- package/src/internal/SubMenu.d.ts +13 -13
- package/src/internal/SubMenu.js +25 -25
package/src/SideMenu/SideMenu.js
CHANGED
|
@@ -1,315 +1,315 @@
|
|
|
1
|
-
import { __assign, __read, __rest } from "tslib";
|
|
2
|
-
import React, { forwardRef, useContext, useEffect, useRef, useState } from 'react';
|
|
3
|
-
import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
|
|
4
|
-
import { isIE11 } from '@skbkontur/react-ui/lib/client';
|
|
5
|
-
import { ThemeContext } from '@skbkontur/react-ui/lib/theming/ThemeContext';
|
|
6
|
-
import { jsStylesForSideMenu, customStyles } from './SideMenu.styles';
|
|
7
|
-
import { SideMenuOrganisations } from '../SideMenuOrganisations/SideMenuOrganisations';
|
|
8
|
-
import { SideMenuContext } from '../SideMenuContext';
|
|
9
|
-
import { SideMenuBody } from '../SideMenuBody/SideMenuBody';
|
|
10
|
-
import { SideMenuFooter } from '../SideMenuFooter/SideMenuFooter';
|
|
11
|
-
import { SideMenuHeader } from '../SideMenuHeader/SideMenuHeader';
|
|
12
|
-
import { SideMenuItem } from '../SideMenuItem/SideMenuItem';
|
|
13
|
-
import { SideMenuAvatar } from '../SideMenuAvatar/SideMenuAvatar';
|
|
14
|
-
import { SideMenuSubItem } from '../SideMenuSubItem/SideMenuSubItem';
|
|
15
|
-
import { SideMenuDivider } from '../SideMenuDivider/SideMenuDivider';
|
|
16
|
-
import { SideMenuSubItemHeader } from '../SideMenuSubItemHeader/SideMenuSubItemHeader';
|
|
17
|
-
import { RightBorder } from '../internal/RightBorder';
|
|
18
|
-
import { SideMenuDropdown } from '../SideMenuDropdown/SideMenuDropdown';
|
|
19
|
-
import { SideMenuLink } from '../SideMenuLink/SideMenuLink';
|
|
20
|
-
import { SideMenuSubLink } from '../SideMenuSubLink/SideMenuSubLink';
|
|
21
|
-
import { LIGHT_THEME, ScrollContainer, useResponsiveLayout } from '@skbkontur/react-ui';
|
|
22
|
-
import { Backdrop } from '../internal/Backdrop';
|
|
23
|
-
import { RenderLayer } from '@skbkontur/react-ui/internal/RenderLayer';
|
|
24
|
-
import { isTouchDevice } from '../../lib/utils/scripts';
|
|
25
|
-
import { SideMenuDataTids } from '../../SideMenuDataTids';
|
|
26
|
-
import { ZIndex } from '@skbkontur/react-ui/internal/ZIndex';
|
|
27
|
-
import { useAnimateOnMount } from '../../hooks/useAnimateOnMount';
|
|
28
|
-
import { getSideMenuTheme } from '../../lib/theming/ThemeHelpers';
|
|
29
|
-
import { mergeRefs } from '@skbkontur/react-ui/lib/utils';
|
|
30
|
-
import { MenuNavigation } from '../Navigation';
|
|
31
|
-
export var transitionDuration = 300; //ms
|
|
32
|
-
export var burgerTransitionDuration = (transitionDuration * 2) / 3;
|
|
33
|
-
var SideMenuInner = forwardRef(function (_a, ref) {
|
|
34
|
-
var _b, _c, _d, _e;
|
|
35
|
-
var _f, _g;
|
|
36
|
-
var children = _a.children, value = _a.value, activeItem = _a.activeItem, _h = _a.size, size = _h === void 0 ? 'small' : _h, _j = _a.isSeparatedMenu, isSeparatedMenu = _j === void 0 ? false : _j, className = _a.className, _k = _a.disableSwipe, disableSwipe = _k === void 0 ? false : _k, _l = _a.disableCollapsing, disableCollapsing = _l === void 0 ? false : _l, desktopMediaQuery = _a.desktopMediaQuery, narrowDesktopMediaQuery = _a.narrowDesktopMediaQuery, tabletMediaQuery = _a.tabletMediaQuery, mobileMediaQuery = _a.mobileMediaQuery, _m = _a.showScrollBar, showScrollBar = _m === void 0 ? 'hover' : _m, isOpen = _a.isOpen, isPinned = _a.isPinned, onValueChange = _a.onValueChange, onActiveItemChange = _a.onActiveItemChange, onOpen = _a.onOpen, onClose = _a.onClose, onPinnedValueChange = _a.onPinnedValueChange, rest = __rest(_a, ["children", "value", "activeItem", "size", "isSeparatedMenu", "className", "disableSwipe", "disableCollapsing", "desktopMediaQuery", "narrowDesktopMediaQuery", "tabletMediaQuery", "mobileMediaQuery", "showScrollBar", "isOpen", "isPinned", "onValueChange", "onActiveItemChange", "onOpen", "onClose", "onPinnedValueChange"]);
|
|
37
|
-
var transitionTimer = useRef(null);
|
|
38
|
-
var sideMenuRef = useRef(null);
|
|
39
|
-
var contentWrapperRef = useRef(null);
|
|
40
|
-
var scrollContainerRef = useRef(null);
|
|
41
|
-
var navigation = useRef(null);
|
|
42
|
-
var theme = getSideMenuTheme(useContext(ThemeContext));
|
|
43
|
-
var customMediaQueries = {
|
|
44
|
-
isMobileQuery: mobileMediaQuery || theme.sideMenuMobileMediaQuery,
|
|
45
|
-
isTabletQuery: tabletMediaQuery || theme.sideMenuTabletMediaQuery,
|
|
46
|
-
isNarrowDesktopQuery: narrowDesktopMediaQuery || theme.sideMenuNarrowDesktopMediaQuery,
|
|
47
|
-
isDesktopQuery: desktopMediaQuery || theme.sideMenuDesktopMediaQuery,
|
|
48
|
-
};
|
|
49
|
-
var _o = useResponsiveLayout({
|
|
50
|
-
customMediaQueries: customMediaQueries,
|
|
51
|
-
}), isMobileQuery = _o.isMobileQuery, isTabletQuery = _o.isTabletQuery, isNarrowDesktopQuery = _o.isNarrowDesktopQuery, isDesktopQuery = _o.isDesktopQuery;
|
|
52
|
-
var isNarrowDesktop = isNarrowDesktopQuery && !isDesktopQuery;
|
|
53
|
-
var isTablet = isTabletQuery && !isNarrowDesktopQuery;
|
|
54
|
-
var isMobile = isMobileQuery && !isTabletQuery;
|
|
55
|
-
var isTabletOrMobile = isTablet || isMobile;
|
|
56
|
-
var isTouchScreen = isTouchDevice() || isMobile || isTablet;
|
|
57
|
-
var manual = isOpen !== undefined;
|
|
58
|
-
var _p = __read(useState(isDesktopQuery && !isPinned), 2), isOpened = _p[0], setIsOpened = _p[1];
|
|
59
|
-
var _q = __read(useState(false), 2), isBeingTransitioned = _q[0], setIsBeingTransitioned = _q[1];
|
|
60
|
-
var _r = __read(useState(value !== null && value !== void 0 ? value : activeItem), 2), activeMenuItem = _r[0], setActiveMenuItem = _r[1];
|
|
61
|
-
var _s = __read(useState(false), 2), isSeparatedMenuShown = _s[0], setIsSeparatedMenuShown = _s[1];
|
|
62
|
-
var _t = __read(useState(true), 2), isMouseOutside = _t[0], setIsMouseOutside = _t[1];
|
|
63
|
-
var _u = __read(useState('top'), 2), scrollState = _u[0], setScrollState = _u[1];
|
|
64
|
-
var _v = __read(useState(false), 2), hasScrollBar = _v[0], setHasScrollBar = _v[1];
|
|
65
|
-
var _w = __read(useState(0), 2), mousePositionX = _w[0], setMousePositionX = _w[1];
|
|
66
|
-
var _x = __read(useState(0), 2), headerHeight = _x[0], setHeaderHeight = _x[1];
|
|
67
|
-
var _y = __read(useState(isNarrowDesktop || (isDesktopQuery && isPinned)), 2), isCollapsable = _y[0], setIsCollapsable = _y[1];
|
|
68
|
-
var _z = __read(useState(0), 2), leftPosition = _z[0], setLeftPosition = _z[1];
|
|
69
|
-
var _0 = __read(useState(false), 2), isHovered = _0[0], setIsHovered = _0[1];
|
|
70
|
-
var switchActiveMenuItem = function (id) {
|
|
71
|
-
if (id !== value && id !== activeItem) {
|
|
72
|
-
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(id);
|
|
73
|
-
onActiveItemChange === null || onActiveItemChange === void 0 ? void 0 : onActiveItemChange(id);
|
|
74
|
-
setActiveMenuItem(id);
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
useEffect(function () {
|
|
78
|
-
var _a;
|
|
79
|
-
setLeftPosition(((_a = sideMenuRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left) || 0);
|
|
80
|
-
navigation.current = new MenuNavigation({
|
|
81
|
-
rootRef: sideMenuRef,
|
|
82
|
-
activeMenuItem: activeMenuItem,
|
|
83
|
-
setActiveMenuItem: switchActiveMenuItem,
|
|
84
|
-
isSeparatedMenu: isSeparatedMenu,
|
|
85
|
-
isSeparatedMenuShown: isSeparatedMenuShown,
|
|
86
|
-
setIsSeparatedMenuShown: setIsSeparatedMenuShown,
|
|
87
|
-
isOpened: isOpened,
|
|
88
|
-
isDesktopQuery: isDesktopQuery,
|
|
89
|
-
isMobile: isMobile,
|
|
90
|
-
isCollapsable: isCollapsable,
|
|
91
|
-
});
|
|
92
|
-
return function () {
|
|
93
|
-
if (transitionTimer.current) {
|
|
94
|
-
clearTimeout(transitionTimer.current);
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
}, []);
|
|
98
|
-
useEffect(function () {
|
|
99
|
-
if (isMobile && isSeparatedMenuShown)
|
|
100
|
-
return;
|
|
101
|
-
setTimeout(function () {
|
|
102
|
-
var _a;
|
|
103
|
-
var contentWrapper = contentWrapperRef.current;
|
|
104
|
-
var scrollContainer = (_a = scrollContainerRef.current) === null || _a === void 0 ? void 0 : _a.inner;
|
|
105
|
-
if (!contentWrapper || !scrollContainer)
|
|
106
|
-
return;
|
|
107
|
-
setHasScrollBar(scrollContainer.clientHeight < contentWrapper.scrollHeight);
|
|
108
|
-
}, 50);
|
|
109
|
-
}, [activeMenuItem, isOpened, isBeingTransitioned]);
|
|
110
|
-
useEffect(function () {
|
|
111
|
-
isDesktopQuery && setIsOpened(!isPinned);
|
|
112
|
-
}, [isPinned, isDesktopQuery]);
|
|
113
|
-
var handleIsOpened = function (newIsOpened, shouldSetState) {
|
|
114
|
-
if (newIsOpened === isOpened || !shouldSetState)
|
|
115
|
-
return;
|
|
116
|
-
setIsOpened(newIsOpened);
|
|
117
|
-
if (newIsOpened) {
|
|
118
|
-
onOpen === null || onOpen === void 0 ? void 0 : onOpen();
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
useEffect(function () {
|
|
125
|
-
if (isDesktopQuery && !isPinned) {
|
|
126
|
-
setIsOpened(true);
|
|
127
|
-
setIsCollapsable(false);
|
|
128
|
-
}
|
|
129
|
-
if (isNarrowDesktop || isTablet || isMobile) {
|
|
130
|
-
setIsOpened(false);
|
|
131
|
-
}
|
|
132
|
-
isNarrowDesktop && setIsCollapsable(true);
|
|
133
|
-
if (isDesktopQuery && isPinned) {
|
|
134
|
-
setIsCollapsable(true);
|
|
135
|
-
if (navigation.current) {
|
|
136
|
-
navigation.current.isCollapsable = true;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}, [isNarrowDesktop, isDesktopQuery, isTablet, isMobile, isPinned]);
|
|
140
|
-
useEffect(function () {
|
|
141
|
-
var _a;
|
|
142
|
-
!activeItem && ((_a = navigation.current) === null || _a === void 0 ? void 0 : _a.switchActiveMenuItem(value));
|
|
143
|
-
}, [value, (_f = navigation.current) === null || _f === void 0 ? void 0 : _f.navigationTree]);
|
|
144
|
-
useEffect(function () {
|
|
145
|
-
var _a;
|
|
146
|
-
!value && ((_a = navigation.current) === null || _a === void 0 ? void 0 : _a.switchActiveMenuItem(activeItem));
|
|
147
|
-
}, [activeItem, (_g = navigation.current) === null || _g === void 0 ? void 0 : _g.navigationTree]);
|
|
148
|
-
useEffect(function () {
|
|
149
|
-
var _a;
|
|
150
|
-
(_a = navigation.current) === null || _a === void 0 ? void 0 : _a.switchIsSeparatedMenu(isSeparatedMenu);
|
|
151
|
-
}, [isSeparatedMenu]);
|
|
152
|
-
useEffect(function () {
|
|
153
|
-
handleIsOpened(isOpen, manual);
|
|
154
|
-
}, [isOpen]);
|
|
155
|
-
var showMinimizedRoot = function (newIsMinimized) {
|
|
156
|
-
if ((!isBeingTransitioned || isSeparatedMenu) && newIsMinimized === isOpened) {
|
|
157
|
-
setIsBeingTransitioned(true);
|
|
158
|
-
handleIsOpened(!newIsMinimized, !manual);
|
|
159
|
-
if (transitionTimer.current) {
|
|
160
|
-
clearTimeout(transitionTimer.current);
|
|
161
|
-
}
|
|
162
|
-
transitionTimer.current = setTimeout(function () {
|
|
163
|
-
setIsBeingTransitioned(false);
|
|
164
|
-
}, transitionDuration + 200);
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
var shouldNotOpenOnHover = (isSeparatedMenu && isSeparatedMenuShown && isNarrowDesktop && manual) || isTouchScreen;
|
|
168
|
-
var handleMouseEnter = function () {
|
|
169
|
-
if (shouldNotOpenOnHover) {
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
setIsHovered(true);
|
|
173
|
-
if (isCollapsable && !isOpened && !isSeparatedMenuShown) {
|
|
174
|
-
isMouseOutside && showMinimizedRoot(false);
|
|
175
|
-
setIsMouseOutside(false);
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
var handleMouseLeave = function () {
|
|
179
|
-
if (shouldNotOpenOnHover) {
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
setIsHovered(false);
|
|
183
|
-
if (isCollapsable) {
|
|
184
|
-
handleIsOpened(false, !manual);
|
|
185
|
-
if (!manual) {
|
|
186
|
-
setIsMouseOutside(true);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
var showMinimizedRootForNarrowDesktop = function (e) {
|
|
191
|
-
if (!isSeparatedMenuShown || !isCollapsable || isTouchScreen)
|
|
192
|
-
return;
|
|
193
|
-
var relativeXCoordinate = e.clientX - leftPosition;
|
|
194
|
-
var sideMenuMinimizedWidth = parseInt(theme.sideMenuMinimizedWidth);
|
|
195
|
-
if (relativeXCoordinate <= sideMenuMinimizedWidth && mousePositionX >= sideMenuMinimizedWidth) {
|
|
196
|
-
showMinimizedRoot(false);
|
|
197
|
-
}
|
|
198
|
-
else if (relativeXCoordinate > parseInt(theme.sideMenuWidth)) {
|
|
199
|
-
showMinimizedRoot(true);
|
|
200
|
-
}
|
|
201
|
-
setMousePositionX(relativeXCoordinate);
|
|
202
|
-
};
|
|
203
|
-
var showMenu = function (newIsShown) {
|
|
204
|
-
if (!isTabletOrMobile)
|
|
205
|
-
return;
|
|
206
|
-
if (!isBeingTransitioned && newIsShown !== isOpened) {
|
|
207
|
-
setIsBeingTransitioned(true);
|
|
208
|
-
handleIsOpened(newIsShown, !manual);
|
|
209
|
-
if (transitionTimer.current) {
|
|
210
|
-
clearTimeout(transitionTimer.current);
|
|
211
|
-
}
|
|
212
|
-
transitionTimer.current = setTimeout(function () {
|
|
213
|
-
setIsBeingTransitioned(false);
|
|
214
|
-
}, burgerTransitionDuration);
|
|
215
|
-
}
|
|
216
|
-
};
|
|
217
|
-
var isSideMenuOverContent = (isCollapsable || isMobile || (isTablet && !isSeparatedMenuShown)) && isOpened;
|
|
218
|
-
var _1 = __read(useAnimateOnMount(!!isTabletOrMobile && !!isOpened, burgerTransitionDuration, {
|
|
219
|
-
opacity: LIGHT_THEME.sidePageBackingBgOpacity,
|
|
220
|
-
}, {
|
|
221
|
-
opacity: 0,
|
|
222
|
-
}), 2), shouldShowBackdrop = _1[0], backdropStyle = _1[1];
|
|
223
|
-
var isSideMenuOverflowing = (isTabletOrMobile || isCollapsable) && isOpened;
|
|
224
|
-
var setScrollBar = function () {
|
|
225
|
-
var isSeparatedMenuShownInMobile = isMobile && isSeparatedMenuShown;
|
|
226
|
-
if (isOpened && !isBeingTransitioned && !isSeparatedMenuShownInMobile) {
|
|
227
|
-
return isTouchScreen ? 'always' : showScrollBar;
|
|
228
|
-
}
|
|
229
|
-
return 'never';
|
|
230
|
-
};
|
|
231
|
-
var handleRightBorderClick = function () {
|
|
232
|
-
if (!isCollapsable) {
|
|
233
|
-
setIsOpened(false);
|
|
234
|
-
}
|
|
235
|
-
onPinnedValueChange === null || onPinnedValueChange === void 0 ? void 0 : onPinnedValueChange(!isCollapsable);
|
|
236
|
-
setIsCollapsable(!isCollapsable);
|
|
237
|
-
};
|
|
238
|
-
return (React.createElement(SideMenuContext.Provider, { value: {
|
|
239
|
-
isOpened: isOpened,
|
|
240
|
-
isCollapsable: isCollapsable,
|
|
241
|
-
toggleIsOpened: function () { return showMenu(!isOpened); },
|
|
242
|
-
setIsMinimized: showMinimizedRoot,
|
|
243
|
-
isBeingTransitioned: isBeingTransitioned,
|
|
244
|
-
isSeparatedMenu: isSeparatedMenu,
|
|
245
|
-
size: size,
|
|
246
|
-
isDesktop: isDesktopQuery,
|
|
247
|
-
isNarrowDesktop: isNarrowDesktop,
|
|
248
|
-
isTablet: isTablet,
|
|
249
|
-
isMobile: isMobile,
|
|
250
|
-
isTouchScreen: isTouchScreen,
|
|
251
|
-
setIsMouseOutside: setIsMouseOutside,
|
|
252
|
-
scrollState: scrollState,
|
|
253
|
-
setScrollState: setScrollState,
|
|
254
|
-
hasScrollBar: hasScrollBar,
|
|
255
|
-
setHasScrollBar: setHasScrollBar,
|
|
256
|
-
headerHeight: headerHeight,
|
|
257
|
-
setHeaderHeight: setHeaderHeight,
|
|
258
|
-
showScrollBar: showScrollBar,
|
|
259
|
-
sideMenuRef: sideMenuRef,
|
|
260
|
-
navigation: navigation.current,
|
|
261
|
-
} },
|
|
262
|
-
(isOpened || isBeingTransitioned) && isTabletOrMobile && React.createElement("div", { style: { height: headerHeight } }),
|
|
263
|
-
React.createElement(ZIndex, { priority: isSideMenuOverflowing ? 8 : 0, className: cx((_b = {},
|
|
264
|
-
_b[jsStylesForSideMenu.root()] = true,
|
|
265
|
-
_b[customStyles.rootForTabletsOrMobiles(headerHeight)] = isTabletOrMobile,
|
|
266
|
-
_b[jsStylesForSideMenu.shownRootForTabletsOrMobiles()] = isOpened && isTabletOrMobile,
|
|
267
|
-
_b[jsStylesForSideMenu.transitionedRootForTabletsOrMobiles()] = isBeingTransitioned && isTabletOrMobile,
|
|
268
|
-
_b[jsStylesForSideMenu.rootForNarrowDesktops(theme)] = isCollapsable,
|
|
269
|
-
_b[jsStylesForSideMenu.separatedRootForNarrowDesktops(theme)] = isSeparatedMenuShown && isCollapsable,
|
|
270
|
-
_b[jsStylesForSideMenu.separatedRootForTouchScreens(theme)] = isSeparatedMenuShown && isTouchScreen && isCollapsable,
|
|
271
|
-
_b[jsStylesForSideMenu.separatedRootForDesktops(theme)] = isSeparatedMenuShown && isDesktopQuery && !isCollapsable,
|
|
272
|
-
_b[jsStylesForSideMenu.separatedRootForTouchScreensForDesktops(theme)] = isDesktopQuery && isSeparatedMenuShown && isTouchScreen,
|
|
273
|
-
_b)) },
|
|
274
|
-
React.createElement(React.Fragment, null,
|
|
275
|
-
shouldShowBackdrop && React.createElement(Backdrop, { style: backdropStyle }),
|
|
276
|
-
React.createElement(RenderLayer, { onClickOutside: function () { return showMenu(false); } },
|
|
277
|
-
React.createElement("aside", __assign({ className: cx((_c = {},
|
|
278
|
-
_c[jsStylesForSideMenu.wrapper()] = true,
|
|
279
|
-
_c[jsStylesForSideMenu.wrapperIE()] = isIE11,
|
|
280
|
-
_c[jsStylesForSideMenu.wrapperWithShadow(theme)] = isSideMenuOverContent,
|
|
281
|
-
_c), className), "data-tid": SideMenuDataTids.root, ref: mergeRefs([sideMenuRef, ref]) }, rest, { onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onMouseMove: showMinimizedRootForNarrowDesktop }),
|
|
282
|
-
React.createElement("div", { className: cx((_d = {},
|
|
283
|
-
_d[jsStylesForSideMenu.container(theme)] = true,
|
|
284
|
-
_d[jsStylesForSideMenu.collapsedContainerForTabletsOrMobiles()] = !isOpened && isTabletOrMobile && !isBeingTransitioned,
|
|
285
|
-
_d[jsStylesForSideMenu.minimizedContainer(theme)] = !isOpened && !isTabletOrMobile,
|
|
286
|
-
_d[jsStylesForSideMenu.containerForTouchScreens(theme)] = isTouchScreen,
|
|
287
|
-
_d[jsStylesForSideMenu.separatedContainerForMobiles(theme)] = isMobile && isSeparatedMenuShown && (isOpened || isBeingTransitioned),
|
|
288
|
-
_d)) },
|
|
289
|
-
React.createElement(ScrollContainer, { onScrollStateChangeY: function (state) {
|
|
290
|
-
setScrollState === null || setScrollState === void 0 ? void 0 : setScrollState(state);
|
|
291
|
-
}, showScrollBar: setScrollBar(), ref: scrollContainerRef },
|
|
292
|
-
React.createElement("div", { className: cx((_e = {},
|
|
293
|
-
_e[jsStylesForSideMenu.contentWrapper(theme)] = true,
|
|
294
|
-
_e[jsStylesForSideMenu.contentWrapperForTouchScreens(theme)] = isTouchScreen,
|
|
295
|
-
_e[jsStylesForSideMenu.minimizedContentWrapper()] = !isOpened && !isTabletOrMobile,
|
|
296
|
-
_e)), ref: contentWrapperRef }, children))),
|
|
297
|
-
!disableSwipe && !disableCollapsing && isDesktopQuery && isOpened && (React.createElement(RightBorder, { onClick: handleRightBorderClick, showButton: isHovered }))))))));
|
|
298
|
-
});
|
|
299
|
-
SideMenuInner.displayName = 'SideMenu';
|
|
300
|
-
var STATIC_PROPS = {
|
|
301
|
-
Body: SideMenuBody,
|
|
302
|
-
Footer: SideMenuFooter,
|
|
303
|
-
Header: SideMenuHeader,
|
|
304
|
-
Item: SideMenuItem,
|
|
305
|
-
SubItem: SideMenuSubItem,
|
|
306
|
-
SubItemHeader: SideMenuSubItemHeader,
|
|
307
|
-
Avatar: SideMenuAvatar,
|
|
308
|
-
Organisations: SideMenuOrganisations,
|
|
309
|
-
Divider: SideMenuDivider,
|
|
310
|
-
Link: SideMenuLink,
|
|
311
|
-
SubLink: SideMenuSubLink,
|
|
312
|
-
Dropdown: SideMenuDropdown,
|
|
313
|
-
__KONTUR_REACT_UI__: 'SideMenu',
|
|
314
|
-
};
|
|
315
|
-
export var SideMenu = Object.assign(SideMenuInner, STATIC_PROPS);
|
|
1
|
+
import { __assign, __read, __rest } from "tslib";
|
|
2
|
+
import React, { forwardRef, useContext, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
|
|
4
|
+
import { isIE11 } from '@skbkontur/react-ui/lib/client';
|
|
5
|
+
import { ThemeContext } from '@skbkontur/react-ui/lib/theming/ThemeContext';
|
|
6
|
+
import { jsStylesForSideMenu, customStyles } from './SideMenu.styles';
|
|
7
|
+
import { SideMenuOrganisations } from '../SideMenuOrganisations/SideMenuOrganisations';
|
|
8
|
+
import { SideMenuContext } from '../SideMenuContext';
|
|
9
|
+
import { SideMenuBody } from '../SideMenuBody/SideMenuBody';
|
|
10
|
+
import { SideMenuFooter } from '../SideMenuFooter/SideMenuFooter';
|
|
11
|
+
import { SideMenuHeader } from '../SideMenuHeader/SideMenuHeader';
|
|
12
|
+
import { SideMenuItem } from '../SideMenuItem/SideMenuItem';
|
|
13
|
+
import { SideMenuAvatar } from '../SideMenuAvatar/SideMenuAvatar';
|
|
14
|
+
import { SideMenuSubItem } from '../SideMenuSubItem/SideMenuSubItem';
|
|
15
|
+
import { SideMenuDivider } from '../SideMenuDivider/SideMenuDivider';
|
|
16
|
+
import { SideMenuSubItemHeader } from '../SideMenuSubItemHeader/SideMenuSubItemHeader';
|
|
17
|
+
import { RightBorder } from '../internal/RightBorder';
|
|
18
|
+
import { SideMenuDropdown } from '../SideMenuDropdown/SideMenuDropdown';
|
|
19
|
+
import { SideMenuLink } from '../SideMenuLink/SideMenuLink';
|
|
20
|
+
import { SideMenuSubLink } from '../SideMenuSubLink/SideMenuSubLink';
|
|
21
|
+
import { LIGHT_THEME, ScrollContainer, useResponsiveLayout } from '@skbkontur/react-ui';
|
|
22
|
+
import { Backdrop } from '../internal/Backdrop';
|
|
23
|
+
import { RenderLayer } from '@skbkontur/react-ui/internal/RenderLayer';
|
|
24
|
+
import { isTouchDevice } from '../../lib/utils/scripts';
|
|
25
|
+
import { SideMenuDataTids } from '../../SideMenuDataTids';
|
|
26
|
+
import { ZIndex } from '@skbkontur/react-ui/internal/ZIndex';
|
|
27
|
+
import { useAnimateOnMount } from '../../hooks/useAnimateOnMount';
|
|
28
|
+
import { getSideMenuTheme } from '../../lib/theming/ThemeHelpers';
|
|
29
|
+
import { mergeRefs } from '@skbkontur/react-ui/lib/utils';
|
|
30
|
+
import { MenuNavigation } from '../Navigation';
|
|
31
|
+
export var transitionDuration = 300; //ms
|
|
32
|
+
export var burgerTransitionDuration = (transitionDuration * 2) / 3;
|
|
33
|
+
var SideMenuInner = forwardRef(function (_a, ref) {
|
|
34
|
+
var _b, _c, _d, _e;
|
|
35
|
+
var _f, _g;
|
|
36
|
+
var children = _a.children, value = _a.value, activeItem = _a.activeItem, _h = _a.size, size = _h === void 0 ? 'small' : _h, _j = _a.isSeparatedMenu, isSeparatedMenu = _j === void 0 ? false : _j, className = _a.className, _k = _a.disableSwipe, disableSwipe = _k === void 0 ? false : _k, _l = _a.disableCollapsing, disableCollapsing = _l === void 0 ? false : _l, desktopMediaQuery = _a.desktopMediaQuery, narrowDesktopMediaQuery = _a.narrowDesktopMediaQuery, tabletMediaQuery = _a.tabletMediaQuery, mobileMediaQuery = _a.mobileMediaQuery, _m = _a.showScrollBar, showScrollBar = _m === void 0 ? 'hover' : _m, isOpen = _a.isOpen, isPinned = _a.isPinned, onValueChange = _a.onValueChange, onActiveItemChange = _a.onActiveItemChange, onOpen = _a.onOpen, onClose = _a.onClose, onPinnedValueChange = _a.onPinnedValueChange, rest = __rest(_a, ["children", "value", "activeItem", "size", "isSeparatedMenu", "className", "disableSwipe", "disableCollapsing", "desktopMediaQuery", "narrowDesktopMediaQuery", "tabletMediaQuery", "mobileMediaQuery", "showScrollBar", "isOpen", "isPinned", "onValueChange", "onActiveItemChange", "onOpen", "onClose", "onPinnedValueChange"]);
|
|
37
|
+
var transitionTimer = useRef(null);
|
|
38
|
+
var sideMenuRef = useRef(null);
|
|
39
|
+
var contentWrapperRef = useRef(null);
|
|
40
|
+
var scrollContainerRef = useRef(null);
|
|
41
|
+
var navigation = useRef(null);
|
|
42
|
+
var theme = getSideMenuTheme(useContext(ThemeContext));
|
|
43
|
+
var customMediaQueries = {
|
|
44
|
+
isMobileQuery: mobileMediaQuery || theme.sideMenuMobileMediaQuery,
|
|
45
|
+
isTabletQuery: tabletMediaQuery || theme.sideMenuTabletMediaQuery,
|
|
46
|
+
isNarrowDesktopQuery: narrowDesktopMediaQuery || theme.sideMenuNarrowDesktopMediaQuery,
|
|
47
|
+
isDesktopQuery: desktopMediaQuery || theme.sideMenuDesktopMediaQuery,
|
|
48
|
+
};
|
|
49
|
+
var _o = useResponsiveLayout({
|
|
50
|
+
customMediaQueries: customMediaQueries,
|
|
51
|
+
}), isMobileQuery = _o.isMobileQuery, isTabletQuery = _o.isTabletQuery, isNarrowDesktopQuery = _o.isNarrowDesktopQuery, isDesktopQuery = _o.isDesktopQuery;
|
|
52
|
+
var isNarrowDesktop = isNarrowDesktopQuery && !isDesktopQuery;
|
|
53
|
+
var isTablet = isTabletQuery && !isNarrowDesktopQuery;
|
|
54
|
+
var isMobile = isMobileQuery && !isTabletQuery;
|
|
55
|
+
var isTabletOrMobile = isTablet || isMobile;
|
|
56
|
+
var isTouchScreen = isTouchDevice() || isMobile || isTablet;
|
|
57
|
+
var manual = isOpen !== undefined;
|
|
58
|
+
var _p = __read(useState(isDesktopQuery && !isPinned), 2), isOpened = _p[0], setIsOpened = _p[1];
|
|
59
|
+
var _q = __read(useState(false), 2), isBeingTransitioned = _q[0], setIsBeingTransitioned = _q[1];
|
|
60
|
+
var _r = __read(useState(value !== null && value !== void 0 ? value : activeItem), 2), activeMenuItem = _r[0], setActiveMenuItem = _r[1];
|
|
61
|
+
var _s = __read(useState(false), 2), isSeparatedMenuShown = _s[0], setIsSeparatedMenuShown = _s[1];
|
|
62
|
+
var _t = __read(useState(true), 2), isMouseOutside = _t[0], setIsMouseOutside = _t[1];
|
|
63
|
+
var _u = __read(useState('top'), 2), scrollState = _u[0], setScrollState = _u[1];
|
|
64
|
+
var _v = __read(useState(false), 2), hasScrollBar = _v[0], setHasScrollBar = _v[1];
|
|
65
|
+
var _w = __read(useState(0), 2), mousePositionX = _w[0], setMousePositionX = _w[1];
|
|
66
|
+
var _x = __read(useState(0), 2), headerHeight = _x[0], setHeaderHeight = _x[1];
|
|
67
|
+
var _y = __read(useState(isNarrowDesktop || (isDesktopQuery && isPinned)), 2), isCollapsable = _y[0], setIsCollapsable = _y[1];
|
|
68
|
+
var _z = __read(useState(0), 2), leftPosition = _z[0], setLeftPosition = _z[1];
|
|
69
|
+
var _0 = __read(useState(false), 2), isHovered = _0[0], setIsHovered = _0[1];
|
|
70
|
+
var switchActiveMenuItem = function (id) {
|
|
71
|
+
if (id !== value && id !== activeItem) {
|
|
72
|
+
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(id);
|
|
73
|
+
onActiveItemChange === null || onActiveItemChange === void 0 ? void 0 : onActiveItemChange(id);
|
|
74
|
+
setActiveMenuItem(id);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
useEffect(function () {
|
|
78
|
+
var _a;
|
|
79
|
+
setLeftPosition(((_a = sideMenuRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left) || 0);
|
|
80
|
+
navigation.current = new MenuNavigation({
|
|
81
|
+
rootRef: sideMenuRef,
|
|
82
|
+
activeMenuItem: activeMenuItem,
|
|
83
|
+
setActiveMenuItem: switchActiveMenuItem,
|
|
84
|
+
isSeparatedMenu: isSeparatedMenu,
|
|
85
|
+
isSeparatedMenuShown: isSeparatedMenuShown,
|
|
86
|
+
setIsSeparatedMenuShown: setIsSeparatedMenuShown,
|
|
87
|
+
isOpened: isOpened,
|
|
88
|
+
isDesktopQuery: isDesktopQuery,
|
|
89
|
+
isMobile: isMobile,
|
|
90
|
+
isCollapsable: isCollapsable,
|
|
91
|
+
});
|
|
92
|
+
return function () {
|
|
93
|
+
if (transitionTimer.current) {
|
|
94
|
+
clearTimeout(transitionTimer.current);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}, []);
|
|
98
|
+
useEffect(function () {
|
|
99
|
+
if (isMobile && isSeparatedMenuShown)
|
|
100
|
+
return;
|
|
101
|
+
setTimeout(function () {
|
|
102
|
+
var _a;
|
|
103
|
+
var contentWrapper = contentWrapperRef.current;
|
|
104
|
+
var scrollContainer = (_a = scrollContainerRef.current) === null || _a === void 0 ? void 0 : _a.inner;
|
|
105
|
+
if (!contentWrapper || !scrollContainer)
|
|
106
|
+
return;
|
|
107
|
+
setHasScrollBar(scrollContainer.clientHeight < contentWrapper.scrollHeight);
|
|
108
|
+
}, 50);
|
|
109
|
+
}, [activeMenuItem, isOpened, isBeingTransitioned]);
|
|
110
|
+
useEffect(function () {
|
|
111
|
+
isDesktopQuery && setIsOpened(!isPinned);
|
|
112
|
+
}, [isPinned, isDesktopQuery]);
|
|
113
|
+
var handleIsOpened = function (newIsOpened, shouldSetState) {
|
|
114
|
+
if (newIsOpened === isOpened || !shouldSetState)
|
|
115
|
+
return;
|
|
116
|
+
setIsOpened(newIsOpened);
|
|
117
|
+
if (newIsOpened) {
|
|
118
|
+
onOpen === null || onOpen === void 0 ? void 0 : onOpen();
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
useEffect(function () {
|
|
125
|
+
if (isDesktopQuery && !isPinned) {
|
|
126
|
+
setIsOpened(true);
|
|
127
|
+
setIsCollapsable(false);
|
|
128
|
+
}
|
|
129
|
+
if (isNarrowDesktop || isTablet || isMobile) {
|
|
130
|
+
setIsOpened(false);
|
|
131
|
+
}
|
|
132
|
+
isNarrowDesktop && setIsCollapsable(true);
|
|
133
|
+
if (isDesktopQuery && isPinned) {
|
|
134
|
+
setIsCollapsable(true);
|
|
135
|
+
if (navigation.current) {
|
|
136
|
+
navigation.current.isCollapsable = true;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}, [isNarrowDesktop, isDesktopQuery, isTablet, isMobile, isPinned]);
|
|
140
|
+
useEffect(function () {
|
|
141
|
+
var _a;
|
|
142
|
+
!activeItem && ((_a = navigation.current) === null || _a === void 0 ? void 0 : _a.switchActiveMenuItem(value));
|
|
143
|
+
}, [value, (_f = navigation.current) === null || _f === void 0 ? void 0 : _f.navigationTree]);
|
|
144
|
+
useEffect(function () {
|
|
145
|
+
var _a;
|
|
146
|
+
!value && ((_a = navigation.current) === null || _a === void 0 ? void 0 : _a.switchActiveMenuItem(activeItem));
|
|
147
|
+
}, [activeItem, (_g = navigation.current) === null || _g === void 0 ? void 0 : _g.navigationTree]);
|
|
148
|
+
useEffect(function () {
|
|
149
|
+
var _a;
|
|
150
|
+
(_a = navigation.current) === null || _a === void 0 ? void 0 : _a.switchIsSeparatedMenu(isSeparatedMenu);
|
|
151
|
+
}, [isSeparatedMenu]);
|
|
152
|
+
useEffect(function () {
|
|
153
|
+
handleIsOpened(isOpen, manual);
|
|
154
|
+
}, [isOpen]);
|
|
155
|
+
var showMinimizedRoot = function (newIsMinimized) {
|
|
156
|
+
if ((!isBeingTransitioned || isSeparatedMenu) && newIsMinimized === isOpened) {
|
|
157
|
+
setIsBeingTransitioned(true);
|
|
158
|
+
handleIsOpened(!newIsMinimized, !manual);
|
|
159
|
+
if (transitionTimer.current) {
|
|
160
|
+
clearTimeout(transitionTimer.current);
|
|
161
|
+
}
|
|
162
|
+
transitionTimer.current = setTimeout(function () {
|
|
163
|
+
setIsBeingTransitioned(false);
|
|
164
|
+
}, transitionDuration + 200);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
var shouldNotOpenOnHover = (isSeparatedMenu && isSeparatedMenuShown && isNarrowDesktop && manual) || isTouchScreen;
|
|
168
|
+
var handleMouseEnter = function () {
|
|
169
|
+
if (shouldNotOpenOnHover) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
setIsHovered(true);
|
|
173
|
+
if (isCollapsable && !isOpened && !isSeparatedMenuShown) {
|
|
174
|
+
isMouseOutside && showMinimizedRoot(false);
|
|
175
|
+
setIsMouseOutside(false);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
var handleMouseLeave = function () {
|
|
179
|
+
if (shouldNotOpenOnHover) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
setIsHovered(false);
|
|
183
|
+
if (isCollapsable) {
|
|
184
|
+
handleIsOpened(false, !manual);
|
|
185
|
+
if (!manual) {
|
|
186
|
+
setIsMouseOutside(true);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
var showMinimizedRootForNarrowDesktop = function (e) {
|
|
191
|
+
if (!isSeparatedMenuShown || !isCollapsable || isTouchScreen)
|
|
192
|
+
return;
|
|
193
|
+
var relativeXCoordinate = e.clientX - leftPosition;
|
|
194
|
+
var sideMenuMinimizedWidth = parseInt(theme.sideMenuMinimizedWidth);
|
|
195
|
+
if (relativeXCoordinate <= sideMenuMinimizedWidth && mousePositionX >= sideMenuMinimizedWidth) {
|
|
196
|
+
showMinimizedRoot(false);
|
|
197
|
+
}
|
|
198
|
+
else if (relativeXCoordinate > parseInt(theme.sideMenuWidth)) {
|
|
199
|
+
showMinimizedRoot(true);
|
|
200
|
+
}
|
|
201
|
+
setMousePositionX(relativeXCoordinate);
|
|
202
|
+
};
|
|
203
|
+
var showMenu = function (newIsShown) {
|
|
204
|
+
if (!isTabletOrMobile)
|
|
205
|
+
return;
|
|
206
|
+
if (!isBeingTransitioned && newIsShown !== isOpened) {
|
|
207
|
+
setIsBeingTransitioned(true);
|
|
208
|
+
handleIsOpened(newIsShown, !manual);
|
|
209
|
+
if (transitionTimer.current) {
|
|
210
|
+
clearTimeout(transitionTimer.current);
|
|
211
|
+
}
|
|
212
|
+
transitionTimer.current = setTimeout(function () {
|
|
213
|
+
setIsBeingTransitioned(false);
|
|
214
|
+
}, burgerTransitionDuration);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
var isSideMenuOverContent = (isCollapsable || isMobile || (isTablet && !isSeparatedMenuShown)) && isOpened;
|
|
218
|
+
var _1 = __read(useAnimateOnMount(!!isTabletOrMobile && !!isOpened, burgerTransitionDuration, {
|
|
219
|
+
opacity: LIGHT_THEME.sidePageBackingBgOpacity,
|
|
220
|
+
}, {
|
|
221
|
+
opacity: 0,
|
|
222
|
+
}), 2), shouldShowBackdrop = _1[0], backdropStyle = _1[1];
|
|
223
|
+
var isSideMenuOverflowing = (isTabletOrMobile || isCollapsable) && isOpened;
|
|
224
|
+
var setScrollBar = function () {
|
|
225
|
+
var isSeparatedMenuShownInMobile = isMobile && isSeparatedMenuShown;
|
|
226
|
+
if (isOpened && !isBeingTransitioned && !isSeparatedMenuShownInMobile) {
|
|
227
|
+
return isTouchScreen ? 'always' : showScrollBar;
|
|
228
|
+
}
|
|
229
|
+
return 'never';
|
|
230
|
+
};
|
|
231
|
+
var handleRightBorderClick = function () {
|
|
232
|
+
if (!isCollapsable) {
|
|
233
|
+
setIsOpened(false);
|
|
234
|
+
}
|
|
235
|
+
onPinnedValueChange === null || onPinnedValueChange === void 0 ? void 0 : onPinnedValueChange(!isCollapsable);
|
|
236
|
+
setIsCollapsable(!isCollapsable);
|
|
237
|
+
};
|
|
238
|
+
return (React.createElement(SideMenuContext.Provider, { value: {
|
|
239
|
+
isOpened: isOpened,
|
|
240
|
+
isCollapsable: isCollapsable,
|
|
241
|
+
toggleIsOpened: function () { return showMenu(!isOpened); },
|
|
242
|
+
setIsMinimized: showMinimizedRoot,
|
|
243
|
+
isBeingTransitioned: isBeingTransitioned,
|
|
244
|
+
isSeparatedMenu: isSeparatedMenu,
|
|
245
|
+
size: size,
|
|
246
|
+
isDesktop: isDesktopQuery,
|
|
247
|
+
isNarrowDesktop: isNarrowDesktop,
|
|
248
|
+
isTablet: isTablet,
|
|
249
|
+
isMobile: isMobile,
|
|
250
|
+
isTouchScreen: isTouchScreen,
|
|
251
|
+
setIsMouseOutside: setIsMouseOutside,
|
|
252
|
+
scrollState: scrollState,
|
|
253
|
+
setScrollState: setScrollState,
|
|
254
|
+
hasScrollBar: hasScrollBar,
|
|
255
|
+
setHasScrollBar: setHasScrollBar,
|
|
256
|
+
headerHeight: headerHeight,
|
|
257
|
+
setHeaderHeight: setHeaderHeight,
|
|
258
|
+
showScrollBar: showScrollBar,
|
|
259
|
+
sideMenuRef: sideMenuRef,
|
|
260
|
+
navigation: navigation.current,
|
|
261
|
+
} },
|
|
262
|
+
(isOpened || isBeingTransitioned) && isTabletOrMobile && React.createElement("div", { style: { height: headerHeight } }),
|
|
263
|
+
React.createElement(ZIndex, { priority: isSideMenuOverflowing ? 8 : 0, className: cx((_b = {},
|
|
264
|
+
_b[jsStylesForSideMenu.root()] = true,
|
|
265
|
+
_b[customStyles.rootForTabletsOrMobiles(headerHeight)] = isTabletOrMobile,
|
|
266
|
+
_b[jsStylesForSideMenu.shownRootForTabletsOrMobiles()] = isOpened && isTabletOrMobile,
|
|
267
|
+
_b[jsStylesForSideMenu.transitionedRootForTabletsOrMobiles()] = isBeingTransitioned && isTabletOrMobile,
|
|
268
|
+
_b[jsStylesForSideMenu.rootForNarrowDesktops(theme)] = isCollapsable,
|
|
269
|
+
_b[jsStylesForSideMenu.separatedRootForNarrowDesktops(theme)] = isSeparatedMenuShown && isCollapsable,
|
|
270
|
+
_b[jsStylesForSideMenu.separatedRootForTouchScreens(theme)] = isSeparatedMenuShown && isTouchScreen && isCollapsable,
|
|
271
|
+
_b[jsStylesForSideMenu.separatedRootForDesktops(theme)] = isSeparatedMenuShown && isDesktopQuery && !isCollapsable,
|
|
272
|
+
_b[jsStylesForSideMenu.separatedRootForTouchScreensForDesktops(theme)] = isDesktopQuery && isSeparatedMenuShown && isTouchScreen,
|
|
273
|
+
_b)) },
|
|
274
|
+
React.createElement(React.Fragment, null,
|
|
275
|
+
shouldShowBackdrop && React.createElement(Backdrop, { style: backdropStyle }),
|
|
276
|
+
React.createElement(RenderLayer, { onClickOutside: function () { return showMenu(false); } },
|
|
277
|
+
React.createElement("aside", __assign({ className: cx((_c = {},
|
|
278
|
+
_c[jsStylesForSideMenu.wrapper()] = true,
|
|
279
|
+
_c[jsStylesForSideMenu.wrapperIE()] = isIE11,
|
|
280
|
+
_c[jsStylesForSideMenu.wrapperWithShadow(theme)] = isSideMenuOverContent,
|
|
281
|
+
_c), className), "data-tid": SideMenuDataTids.root, ref: mergeRefs([sideMenuRef, ref]) }, rest, { onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onMouseMove: showMinimizedRootForNarrowDesktop }),
|
|
282
|
+
React.createElement("div", { className: cx((_d = {},
|
|
283
|
+
_d[jsStylesForSideMenu.container(theme)] = true,
|
|
284
|
+
_d[jsStylesForSideMenu.collapsedContainerForTabletsOrMobiles()] = !isOpened && isTabletOrMobile && !isBeingTransitioned,
|
|
285
|
+
_d[jsStylesForSideMenu.minimizedContainer(theme)] = !isOpened && !isTabletOrMobile,
|
|
286
|
+
_d[jsStylesForSideMenu.containerForTouchScreens(theme)] = isTouchScreen,
|
|
287
|
+
_d[jsStylesForSideMenu.separatedContainerForMobiles(theme)] = isMobile && isSeparatedMenuShown && (isOpened || isBeingTransitioned),
|
|
288
|
+
_d)) },
|
|
289
|
+
React.createElement(ScrollContainer, { onScrollStateChangeY: function (state) {
|
|
290
|
+
setScrollState === null || setScrollState === void 0 ? void 0 : setScrollState(state);
|
|
291
|
+
}, showScrollBar: setScrollBar(), ref: scrollContainerRef },
|
|
292
|
+
React.createElement("div", { className: cx((_e = {},
|
|
293
|
+
_e[jsStylesForSideMenu.contentWrapper(theme)] = true,
|
|
294
|
+
_e[jsStylesForSideMenu.contentWrapperForTouchScreens(theme)] = isTouchScreen,
|
|
295
|
+
_e[jsStylesForSideMenu.minimizedContentWrapper()] = !isOpened && !isTabletOrMobile,
|
|
296
|
+
_e)), ref: contentWrapperRef }, children))),
|
|
297
|
+
!disableSwipe && !disableCollapsing && isDesktopQuery && isOpened && (React.createElement(RightBorder, { onClick: handleRightBorderClick, showButton: isHovered }))))))));
|
|
298
|
+
});
|
|
299
|
+
SideMenuInner.displayName = 'SideMenu';
|
|
300
|
+
var STATIC_PROPS = {
|
|
301
|
+
Body: SideMenuBody,
|
|
302
|
+
Footer: SideMenuFooter,
|
|
303
|
+
Header: SideMenuHeader,
|
|
304
|
+
Item: SideMenuItem,
|
|
305
|
+
SubItem: SideMenuSubItem,
|
|
306
|
+
SubItemHeader: SideMenuSubItemHeader,
|
|
307
|
+
Avatar: SideMenuAvatar,
|
|
308
|
+
Organisations: SideMenuOrganisations,
|
|
309
|
+
Divider: SideMenuDivider,
|
|
310
|
+
Link: SideMenuLink,
|
|
311
|
+
SubLink: SideMenuSubLink,
|
|
312
|
+
Dropdown: SideMenuDropdown,
|
|
313
|
+
__KONTUR_REACT_UI__: 'SideMenu',
|
|
314
|
+
};
|
|
315
|
+
export var SideMenu = Object.assign(SideMenuInner, STATIC_PROPS);
|