@skbkontur/side-menu 3.3.4 → 3.3.5-19a67.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/SideMenuDataTids.js +4 -1
- package/hooks/useAnimateOnMount.js +12 -10
- package/hooks/useMemoIcon.js +18 -13
- package/index.js +17 -14
- package/internal/themes/SideMenuTheme.js +209 -282
- package/lib/theming/ThemeHelpers.js +33 -42
- package/lib/theming/ThemeTypes.js +2 -1
- package/lib/utils/memo.js +7 -3
- package/lib/utils/scripts.js +12 -6
- package/package.json +1 -1
- package/src/Navigation.js +81 -123
- package/src/SideMenu/SideMenu.js +202 -207
- package/src/SideMenu/SideMenu.styles.js +145 -73
- package/src/SideMenuAvatar/SideMenuAvatar.js +13 -11
- package/src/SideMenuBody/SideMenuBody.js +21 -20
- package/src/SideMenuBody/SideMenuBody.styles.js +17 -10
- package/src/SideMenuContext.js +5 -2
- package/src/SideMenuDivider/SideMenuDivider.js +13 -12
- package/src/SideMenuDivider/SideMenuDivider.styles.js +14 -8
- package/src/SideMenuDropdown/SideMenuDropdown.js +34 -36
- package/src/SideMenuDropdown/SideMenuDropdown.styles.js +25 -15
- package/src/SideMenuFooter/SideMenuFooter.js +24 -23
- package/src/SideMenuFooter/SideMenuFooter.styles.js +25 -12
- package/src/SideMenuHeader/SideMenuHeader.js +28 -29
- package/src/SideMenuHeader/SideMenuHeader.styles.js +34 -16
- package/src/SideMenuItem/SideMenuItem.js +9 -7
- package/src/SideMenuLink/SideMenuLink.js +11 -10
- package/src/SideMenuLink/SideMenuLink.styles.js +11 -7
- package/src/SideMenuNotifications/BellWidget.js +61 -78
- package/src/SideMenuNotifications/BellWidgetError.js +22 -18
- package/src/SideMenuNotifications/BellWidgetView.styles.js +48 -20
- package/src/SideMenuNotifications/SideMenuNotifications.js +29 -27
- package/src/SideMenuNotifications/utils/getMarker.js +4 -1
- package/src/SideMenuNotifications/utils/getNotificationsErrorMessages.js +15 -11
- package/src/SideMenuOrganisations/SideMenuOrganisations.js +9 -7
- package/src/SideMenuSubItem/SideMenuSubItem.js +10 -8
- package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.js +18 -17
- package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.styles.js +18 -10
- package/src/SideMenuSubLink/SideMenuSubLink.js +10 -7
- package/src/Tree.js +39 -112
- package/src/internal/BackButton.js +17 -16
- package/src/internal/Backdrop.js +18 -12
- package/src/internal/Backdrop.styles.js +16 -8
- package/src/internal/Burger.js +17 -12
- package/src/internal/Burger.styles.js +14 -9
- package/src/internal/ClickableElement.js +97 -86
- package/src/internal/ClickableElement.styles.js +48 -21
- package/src/internal/InnerSubMenu.js +16 -14
- package/src/internal/ItemContent/Caption.js +47 -48
- package/src/internal/ItemContent/Caption.styles.js +84 -36
- package/src/internal/ItemContent/Icon.js +30 -27
- package/src/internal/ItemContent/Icon.styles.js +49 -20
- package/src/internal/ItemContent/ItemContent.js +44 -44
- package/src/internal/ItemContent/ItemContent.styles.js +65 -28
- package/src/internal/ItemContent/Marker.js +23 -20
- package/src/internal/ItemContent/Marker.styles.js +59 -22
- package/src/internal/NestedMenu.js +21 -19
- package/src/internal/NestedMenu.styles.js +11 -8
- package/src/internal/RightBorder.js +26 -24
- package/src/internal/RightBorder.styles.js +26 -10
- package/src/internal/SeparatedSubMenu.js +48 -49
- package/src/internal/SeparatedSubMenu.styles.js +58 -29
- package/src/internal/SideMenuLogotype.js +48 -49
- package/src/internal/SideMenuLogotype.styles.js +50 -23
- package/src/internal/SubMenu.js +16 -14
package/src/SideMenu/SideMenu.js
CHANGED
|
@@ -1,138 +1,136 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SideMenu = exports.burgerTransitionDuration = exports.transitionDuration = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
6
|
+
const Emotion_1 = require("@skbkontur/react-ui/lib/theming/Emotion");
|
|
7
|
+
const client_1 = require("@skbkontur/react-ui/lib/client");
|
|
8
|
+
const ThemeContext_1 = require("@skbkontur/react-ui/lib/theming/ThemeContext");
|
|
9
|
+
const ScrollContainer_1 = require("@skbkontur/react-ui/components/ScrollContainer");
|
|
10
|
+
const LightTheme_1 = require("@skbkontur/react-ui/lib/theming/themes/LightTheme");
|
|
11
|
+
const useResponsiveLayout_1 = require("@skbkontur/react-ui/components/ResponsiveLayout/useResponsiveLayout");
|
|
12
|
+
const RenderLayer_1 = require("@skbkontur/react-ui/internal/RenderLayer");
|
|
13
|
+
const ZIndex_1 = require("@skbkontur/react-ui/internal/ZIndex");
|
|
14
|
+
const utils_1 = require("@skbkontur/react-ui/lib/utils");
|
|
15
|
+
const SideMenuOrganisations_1 = require("../SideMenuOrganisations/SideMenuOrganisations");
|
|
16
|
+
const SideMenuNotifications_1 = require("../SideMenuNotifications/SideMenuNotifications");
|
|
17
|
+
const SideMenuContext_1 = require("../SideMenuContext");
|
|
18
|
+
const SideMenuBody_1 = require("../SideMenuBody/SideMenuBody");
|
|
19
|
+
const SideMenuFooter_1 = require("../SideMenuFooter/SideMenuFooter");
|
|
20
|
+
const SideMenuHeader_1 = require("../SideMenuHeader/SideMenuHeader");
|
|
21
|
+
const SideMenuItem_1 = require("../SideMenuItem/SideMenuItem");
|
|
22
|
+
const SideMenuAvatar_1 = require("../SideMenuAvatar/SideMenuAvatar");
|
|
23
|
+
const SideMenuSubItem_1 = require("../SideMenuSubItem/SideMenuSubItem");
|
|
24
|
+
const SideMenuDivider_1 = require("../SideMenuDivider/SideMenuDivider");
|
|
25
|
+
const SideMenuSubItemHeader_1 = require("../SideMenuSubItemHeader/SideMenuSubItemHeader");
|
|
26
|
+
const RightBorder_1 = require("../internal/RightBorder");
|
|
27
|
+
const SideMenuDropdown_1 = require("../SideMenuDropdown/SideMenuDropdown");
|
|
28
|
+
const SideMenuLink_1 = require("../SideMenuLink/SideMenuLink");
|
|
29
|
+
const SideMenuSubLink_1 = require("../SideMenuSubLink/SideMenuSubLink");
|
|
30
|
+
const Backdrop_1 = require("../internal/Backdrop");
|
|
31
|
+
const scripts_1 = require("../../lib/utils/scripts");
|
|
32
|
+
const SideMenuDataTids_1 = require("../../SideMenuDataTids");
|
|
33
|
+
const useAnimateOnMount_1 = require("../../hooks/useAnimateOnMount");
|
|
34
|
+
const ThemeHelpers_1 = require("../../lib/theming/ThemeHelpers");
|
|
35
|
+
const Navigation_1 = require("../Navigation");
|
|
36
|
+
const SideMenu_styles_1 = require("./SideMenu.styles");
|
|
37
|
+
exports.transitionDuration = 300; //ms
|
|
38
|
+
exports.burgerTransitionDuration = (exports.transitionDuration * 2) / 3;
|
|
39
|
+
const SideMenuInner = (0, react_1.forwardRef)(({ children, value, activeItem, size = 'small', isSeparatedMenu = false, className, disableSwipe = false, disableCollapsing = false, desktopMediaQuery, narrowDesktopMediaQuery, tabletMediaQuery, mobileMediaQuery, showScrollBar = 'hover', isOpen, isPinned, onValueChange, onActiveItemChange, onOpen, onClose, onPinnedValueChange, ...rest }, ref) => {
|
|
40
|
+
const transitionTimer = (0, react_1.useRef)(null);
|
|
41
|
+
const timerScrollbar = (0, react_1.useRef)(null);
|
|
42
|
+
const sideMenuRef = (0, react_1.useRef)(null);
|
|
43
|
+
const contentWrapperRef = (0, react_1.useRef)(null);
|
|
44
|
+
const scrollContainerRef = (0, react_1.useRef)(null);
|
|
45
|
+
const navigation = (0, react_1.useRef)(null);
|
|
46
|
+
const theme = (0, ThemeHelpers_1.getSideMenuTheme)((0, react_1.useContext)(ThemeContext_1.ThemeContext));
|
|
47
|
+
const customMediaQueries = {
|
|
48
48
|
isMobileQuery: mobileMediaQuery || theme.sideMenuMobileMediaQuery,
|
|
49
49
|
isTabletQuery: tabletMediaQuery || theme.sideMenuTabletMediaQuery,
|
|
50
50
|
isNarrowDesktopQuery: narrowDesktopMediaQuery || theme.sideMenuNarrowDesktopMediaQuery,
|
|
51
51
|
isDesktopQuery: desktopMediaQuery || theme.sideMenuDesktopMediaQuery,
|
|
52
52
|
};
|
|
53
|
-
|
|
54
|
-
customMediaQueries
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
53
|
+
const { isMobileQuery, isTabletQuery, isNarrowDesktopQuery, isDesktopQuery } = (0, useResponsiveLayout_1.useResponsiveLayout)({
|
|
54
|
+
customMediaQueries,
|
|
55
|
+
});
|
|
56
|
+
const isNarrowDesktop = isNarrowDesktopQuery && !isDesktopQuery;
|
|
57
|
+
const isTablet = isTabletQuery && !isNarrowDesktopQuery;
|
|
58
|
+
const isMobile = isMobileQuery && !isTabletQuery;
|
|
59
|
+
const isTabletOrMobile = isTablet || isMobile;
|
|
60
|
+
const isTouchScreen = (0, scripts_1.isTouchDevice)() || isMobile || isTablet;
|
|
61
|
+
const manual = isOpen !== undefined;
|
|
62
|
+
const [isOpened, setIsOpened] = (0, react_1.useState)(isDesktopQuery && !isPinned);
|
|
63
|
+
const [isBeingTransitioned, setIsBeingTransitioned] = (0, react_1.useState)(false);
|
|
64
|
+
const [activeMenuItem, setActiveMenuItem] = (0, react_1.useState)(value ?? activeItem);
|
|
65
|
+
const [isSeparatedMenuShown, setIsSeparatedMenuShown] = (0, react_1.useState)(false);
|
|
66
|
+
const [isMouseOutside, setIsMouseOutside] = (0, react_1.useState)(true);
|
|
67
|
+
const [scrollState, setScrollState] = (0, react_1.useState)('top');
|
|
68
|
+
const [hasScrollBar, setHasScrollBar] = (0, react_1.useState)(false);
|
|
69
|
+
const [mousePositionX, setMousePositionX] = (0, react_1.useState)(0);
|
|
70
|
+
const [headerHeight, setHeaderHeight] = (0, react_1.useState)(0);
|
|
71
|
+
const [isCollapsable, setIsCollapsable] = (0, react_1.useState)(isNarrowDesktop || (isDesktopQuery && isPinned));
|
|
72
|
+
const [leftPosition, setLeftPosition] = (0, react_1.useState)(0);
|
|
73
|
+
const [isHovered, setIsHovered] = (0, react_1.useState)(false);
|
|
74
|
+
const switchActiveMenuItem = (id) => {
|
|
75
75
|
if (id !== value && id !== activeItem) {
|
|
76
|
-
onValueChange
|
|
77
|
-
onActiveItemChange
|
|
76
|
+
onValueChange?.(id);
|
|
77
|
+
onActiveItemChange?.(id);
|
|
78
78
|
setActiveMenuItem(id);
|
|
79
79
|
}
|
|
80
80
|
};
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
navigation.current = new MenuNavigation({
|
|
81
|
+
(0, react_1.useEffect)(() => {
|
|
82
|
+
setLeftPosition(sideMenuRef.current?.getBoundingClientRect().left || 0);
|
|
83
|
+
navigation.current = new Navigation_1.MenuNavigation({
|
|
85
84
|
rootRef: sideMenuRef,
|
|
86
|
-
activeMenuItem
|
|
85
|
+
activeMenuItem,
|
|
87
86
|
setActiveMenuItem: switchActiveMenuItem,
|
|
88
|
-
isSeparatedMenu
|
|
89
|
-
isSeparatedMenuShown
|
|
90
|
-
setIsSeparatedMenuShown
|
|
91
|
-
isOpened
|
|
92
|
-
isDesktopQuery
|
|
93
|
-
isMobile
|
|
94
|
-
isCollapsable
|
|
87
|
+
isSeparatedMenu,
|
|
88
|
+
isSeparatedMenuShown,
|
|
89
|
+
setIsSeparatedMenuShown,
|
|
90
|
+
isOpened,
|
|
91
|
+
isDesktopQuery,
|
|
92
|
+
isMobile,
|
|
93
|
+
isCollapsable,
|
|
95
94
|
});
|
|
96
|
-
return
|
|
95
|
+
return () => {
|
|
97
96
|
if (transitionTimer.current) {
|
|
98
97
|
clearTimeout(transitionTimer.current);
|
|
99
98
|
}
|
|
100
99
|
};
|
|
101
100
|
}, []);
|
|
102
|
-
|
|
101
|
+
(0, react_1.useEffect)(() => {
|
|
103
102
|
if (isMobile && isSeparatedMenuShown) {
|
|
104
103
|
return;
|
|
105
104
|
}
|
|
106
105
|
clearTimeout(timerScrollbar.current);
|
|
107
|
-
timerScrollbar.current = setTimeout(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
var scrollContainer = (_a = scrollContainerRef.current) === null || _a === void 0 ? void 0 : _a.inner;
|
|
106
|
+
timerScrollbar.current = setTimeout(() => {
|
|
107
|
+
const contentWrapper = contentWrapperRef.current;
|
|
108
|
+
const scrollContainer = scrollContainerRef.current?.inner;
|
|
111
109
|
if (!contentWrapper || !scrollContainer) {
|
|
112
110
|
return;
|
|
113
111
|
}
|
|
114
112
|
setHasScrollBar(scrollContainer.clientHeight < contentWrapper.scrollHeight);
|
|
115
113
|
}, 50);
|
|
116
|
-
return
|
|
114
|
+
return () => {
|
|
117
115
|
clearTimeout(timerScrollbar.current);
|
|
118
116
|
};
|
|
119
117
|
});
|
|
120
|
-
|
|
118
|
+
(0, react_1.useEffect)(() => {
|
|
121
119
|
isDesktopQuery && setIsOpened(!isPinned);
|
|
122
120
|
}, [isPinned, isDesktopQuery]);
|
|
123
|
-
|
|
121
|
+
const handleIsOpened = (newIsOpened, shouldSetState) => {
|
|
124
122
|
if (newIsOpened === isOpened || !shouldSetState) {
|
|
125
123
|
return;
|
|
126
124
|
}
|
|
127
125
|
setIsOpened(newIsOpened);
|
|
128
126
|
if (newIsOpened) {
|
|
129
|
-
onOpen
|
|
127
|
+
onOpen?.();
|
|
130
128
|
}
|
|
131
129
|
else {
|
|
132
|
-
onClose
|
|
130
|
+
onClose?.();
|
|
133
131
|
}
|
|
134
132
|
};
|
|
135
|
-
|
|
133
|
+
(0, react_1.useEffect)(() => {
|
|
136
134
|
if (isDesktopQuery && !isPinned) {
|
|
137
135
|
setIsOpened(true);
|
|
138
136
|
setIsCollapsable(false);
|
|
@@ -148,43 +146,40 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
148
146
|
}
|
|
149
147
|
}
|
|
150
148
|
}, [isNarrowDesktop, isDesktopQuery, isTablet, isMobile, isPinned]);
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
useEffect(function () {
|
|
160
|
-
var _a;
|
|
161
|
-
(_a = navigation.current) === null || _a === void 0 ? void 0 : _a.switchIsSeparatedMenu(isSeparatedMenu);
|
|
149
|
+
(0, react_1.useEffect)(() => {
|
|
150
|
+
!activeItem && navigation.current?.switchActiveMenuItem(value);
|
|
151
|
+
}, [value, navigation.current?.navigationTree]);
|
|
152
|
+
(0, react_1.useEffect)(() => {
|
|
153
|
+
!value && navigation.current?.switchActiveMenuItem(activeItem);
|
|
154
|
+
}, [activeItem, navigation.current?.navigationTree]);
|
|
155
|
+
(0, react_1.useEffect)(() => {
|
|
156
|
+
navigation.current?.switchIsSeparatedMenu(isSeparatedMenu);
|
|
162
157
|
}, [isSeparatedMenu]);
|
|
163
|
-
|
|
158
|
+
(0, react_1.useEffect)(() => {
|
|
164
159
|
handleIsOpened(isOpen, manual);
|
|
165
160
|
}, [isOpen]);
|
|
166
|
-
|
|
161
|
+
const showMinimizedRoot = (newIsMinimized) => {
|
|
167
162
|
if ((!isBeingTransitioned || isSeparatedMenu) && newIsMinimized === isOpened) {
|
|
168
163
|
setIsBeingTransitioned(true);
|
|
169
164
|
handleIsOpened(!newIsMinimized, !manual);
|
|
170
165
|
if (transitionTimer.current) {
|
|
171
166
|
clearTimeout(transitionTimer.current);
|
|
172
167
|
}
|
|
173
|
-
transitionTimer.current = setTimeout(
|
|
168
|
+
transitionTimer.current = setTimeout(() => {
|
|
174
169
|
setIsBeingTransitioned(false);
|
|
175
|
-
}, transitionDuration + 200);
|
|
170
|
+
}, exports.transitionDuration + 200);
|
|
176
171
|
}
|
|
177
172
|
};
|
|
178
|
-
|
|
179
|
-
|
|
173
|
+
const shouldNotOpenOnHover = (isSeparatedMenu && isSeparatedMenuShown && isNarrowDesktop && manual) || isTouchScreen;
|
|
174
|
+
const forceUpdatePositionPopups = (0, react_1.useCallback)(() => {
|
|
180
175
|
// дикие костыли для перерисовки попапов, которые не обновляются автоматически при перерисовке меню
|
|
181
|
-
|
|
182
|
-
window.setTimeout(
|
|
176
|
+
const fixPopupsPosition = () => window.dispatchEvent(new CustomEvent('scroll')); // чтобы вызвался LayoutEvent.emit() и перерисовались попапы
|
|
177
|
+
window.setTimeout(() => {
|
|
183
178
|
fixPopupsPosition(); // перерисовка попапов и следом еще раз, чтобы после анимации SideMenu попапы вновь встали на свои места
|
|
184
|
-
window.setTimeout(
|
|
179
|
+
window.setTimeout(() => fixPopupsPosition(), exports.transitionDuration + 100);
|
|
185
180
|
}, 0);
|
|
186
181
|
}, []);
|
|
187
|
-
|
|
182
|
+
const handleMouseEnter = () => {
|
|
188
183
|
if (shouldNotOpenOnHover) {
|
|
189
184
|
return;
|
|
190
185
|
}
|
|
@@ -195,7 +190,7 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
195
190
|
}
|
|
196
191
|
forceUpdatePositionPopups();
|
|
197
192
|
};
|
|
198
|
-
|
|
193
|
+
const handleMouseLeave = () => {
|
|
199
194
|
if (shouldNotOpenOnHover) {
|
|
200
195
|
return;
|
|
201
196
|
}
|
|
@@ -208,12 +203,12 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
208
203
|
}
|
|
209
204
|
forceUpdatePositionPopups();
|
|
210
205
|
};
|
|
211
|
-
|
|
206
|
+
const showMinimizedRootForNarrowDesktop = (e) => {
|
|
212
207
|
if (!isSeparatedMenuShown || !isCollapsable || isTouchScreen) {
|
|
213
208
|
return;
|
|
214
209
|
}
|
|
215
|
-
|
|
216
|
-
|
|
210
|
+
const relativeXCoordinate = e.clientX - leftPosition;
|
|
211
|
+
const sideMenuMinimizedWidth = parseInt(theme.sideMenuMinimizedWidth);
|
|
217
212
|
if (relativeXCoordinate <= sideMenuMinimizedWidth && mousePositionX >= sideMenuMinimizedWidth) {
|
|
218
213
|
showMinimizedRoot(false);
|
|
219
214
|
}
|
|
@@ -222,7 +217,7 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
222
217
|
}
|
|
223
218
|
setMousePositionX(relativeXCoordinate);
|
|
224
219
|
};
|
|
225
|
-
|
|
220
|
+
const showMenu = (newIsShown) => {
|
|
226
221
|
if (!isTabletOrMobile) {
|
|
227
222
|
return;
|
|
228
223
|
}
|
|
@@ -232,42 +227,42 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
232
227
|
if (transitionTimer.current) {
|
|
233
228
|
clearTimeout(transitionTimer.current);
|
|
234
229
|
}
|
|
235
|
-
transitionTimer.current = setTimeout(
|
|
230
|
+
transitionTimer.current = setTimeout(() => {
|
|
236
231
|
setIsBeingTransitioned(false);
|
|
237
|
-
}, burgerTransitionDuration);
|
|
232
|
+
}, exports.burgerTransitionDuration);
|
|
238
233
|
}
|
|
239
234
|
};
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
opacity: LIGHT_THEME.sidePageBackingBgOpacity,
|
|
235
|
+
const isSideMenuOverContent = (isCollapsable || isMobile || (isTablet && !isSeparatedMenuShown)) && isOpened;
|
|
236
|
+
const [shouldShowBackdrop, backdropStyle] = (0, useAnimateOnMount_1.useAnimateOnMount)(!!isTabletOrMobile && !!isOpened, exports.burgerTransitionDuration, {
|
|
237
|
+
opacity: LightTheme_1.LIGHT_THEME.sidePageBackingBgOpacity,
|
|
243
238
|
}, {
|
|
244
239
|
opacity: 0,
|
|
245
|
-
})
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
240
|
+
});
|
|
241
|
+
const isSideMenuOverflowing = (isTabletOrMobile || isCollapsable) && isOpened;
|
|
242
|
+
const setScrollBar = () => {
|
|
243
|
+
const isSeparatedMenuShownInMobile = isMobile && isSeparatedMenuShown;
|
|
249
244
|
if (isOpened && !isBeingTransitioned && !isSeparatedMenuShownInMobile) {
|
|
250
245
|
return isTouchScreen ? 'always' : showScrollBar;
|
|
251
246
|
}
|
|
252
247
|
return 'never';
|
|
253
248
|
};
|
|
254
|
-
|
|
249
|
+
const handleRightBorderClick = () => {
|
|
255
250
|
if (!isCollapsable) {
|
|
256
251
|
setIsOpened(false);
|
|
257
252
|
}
|
|
258
|
-
onPinnedValueChange
|
|
253
|
+
onPinnedValueChange?.(!isCollapsable);
|
|
259
254
|
setIsCollapsable(!isCollapsable);
|
|
260
255
|
};
|
|
261
|
-
|
|
256
|
+
const handleDropDownClose = () => {
|
|
262
257
|
if (!isNarrowDesktop) {
|
|
263
258
|
return;
|
|
264
259
|
}
|
|
265
|
-
|
|
260
|
+
const shouldCloseSideMenu = !manual && document.hasFocus();
|
|
266
261
|
setIsMouseOutside(true);
|
|
267
262
|
shouldCloseSideMenu && handleIsOpened(false, !manual);
|
|
268
263
|
setIsCollapsable(true);
|
|
269
264
|
};
|
|
270
|
-
|
|
265
|
+
const handleDropDownOpen = () => {
|
|
271
266
|
if (!isNarrowDesktop) {
|
|
272
267
|
return;
|
|
273
268
|
}
|
|
@@ -275,84 +270,84 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
275
270
|
handleIsOpened(true, !manual);
|
|
276
271
|
forceUpdatePositionPopups();
|
|
277
272
|
};
|
|
278
|
-
return (
|
|
279
|
-
isOpened
|
|
280
|
-
isCollapsable
|
|
281
|
-
toggleIsOpened:
|
|
273
|
+
return (react_1.default.createElement(SideMenuContext_1.SideMenuContext.Provider, { value: {
|
|
274
|
+
isOpened,
|
|
275
|
+
isCollapsable,
|
|
276
|
+
toggleIsOpened: () => showMenu(!isOpened),
|
|
282
277
|
setIsMinimized: showMinimizedRoot,
|
|
283
|
-
isBeingTransitioned
|
|
284
|
-
isSeparatedMenu
|
|
285
|
-
size
|
|
278
|
+
isBeingTransitioned,
|
|
279
|
+
isSeparatedMenu,
|
|
280
|
+
size,
|
|
286
281
|
isDesktop: isDesktopQuery,
|
|
287
|
-
isNarrowDesktop
|
|
288
|
-
isTablet
|
|
289
|
-
isMobile
|
|
290
|
-
isTouchScreen
|
|
291
|
-
setIsMouseOutside
|
|
292
|
-
scrollState
|
|
293
|
-
setScrollState
|
|
294
|
-
hasScrollBar
|
|
295
|
-
setHasScrollBar
|
|
296
|
-
headerHeight
|
|
297
|
-
setHeaderHeight
|
|
298
|
-
showScrollBar
|
|
299
|
-
sideMenuRef
|
|
282
|
+
isNarrowDesktop,
|
|
283
|
+
isTablet,
|
|
284
|
+
isMobile,
|
|
285
|
+
isTouchScreen,
|
|
286
|
+
setIsMouseOutside,
|
|
287
|
+
scrollState,
|
|
288
|
+
setScrollState,
|
|
289
|
+
hasScrollBar,
|
|
290
|
+
setHasScrollBar,
|
|
291
|
+
headerHeight,
|
|
292
|
+
setHeaderHeight,
|
|
293
|
+
showScrollBar,
|
|
294
|
+
sideMenuRef,
|
|
300
295
|
navigation: navigation.current,
|
|
301
|
-
handleDropDownOpen
|
|
302
|
-
handleDropDownClose
|
|
296
|
+
handleDropDownOpen,
|
|
297
|
+
handleDropDownClose,
|
|
303
298
|
} },
|
|
304
|
-
(isOpened || isBeingTransitioned) && isTabletOrMobile &&
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
shouldShowBackdrop &&
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
setScrollState
|
|
299
|
+
(isOpened || isBeingTransitioned) && isTabletOrMobile && react_1.default.createElement("div", { style: { height: headerHeight } }),
|
|
300
|
+
react_1.default.createElement(ZIndex_1.ZIndex, { priority: isSideMenuOverflowing ? 8 : 0, className: (0, Emotion_1.cx)({
|
|
301
|
+
[SideMenu_styles_1.jsStylesForSideMenu.root()]: true,
|
|
302
|
+
[SideMenu_styles_1.customStyles.rootForTabletsOrMobiles(headerHeight)]: isTabletOrMobile,
|
|
303
|
+
[SideMenu_styles_1.jsStylesForSideMenu.shownRootForTabletsOrMobiles()]: isOpened && isTabletOrMobile,
|
|
304
|
+
[SideMenu_styles_1.jsStylesForSideMenu.transitionedRootForTabletsOrMobiles()]: isBeingTransitioned && isTabletOrMobile,
|
|
305
|
+
[SideMenu_styles_1.jsStylesForSideMenu.rootForNarrowDesktops(theme)]: isCollapsable,
|
|
306
|
+
[SideMenu_styles_1.jsStylesForSideMenu.separatedRootForNarrowDesktops(theme)]: isSeparatedMenuShown && isCollapsable,
|
|
307
|
+
[SideMenu_styles_1.jsStylesForSideMenu.separatedRootForTouchScreens(theme)]: isSeparatedMenuShown && isTouchScreen && isCollapsable,
|
|
308
|
+
[SideMenu_styles_1.jsStylesForSideMenu.separatedRootForDesktops(theme)]: isSeparatedMenuShown && isDesktopQuery && !isCollapsable,
|
|
309
|
+
[SideMenu_styles_1.jsStylesForSideMenu.separatedRootForTouchScreensForDesktops(theme)]: isDesktopQuery && isSeparatedMenuShown && isTouchScreen,
|
|
310
|
+
}) },
|
|
311
|
+
react_1.default.createElement(react_1.default.Fragment, null,
|
|
312
|
+
shouldShowBackdrop && react_1.default.createElement(Backdrop_1.Backdrop, { style: backdropStyle }),
|
|
313
|
+
react_1.default.createElement(RenderLayer_1.RenderLayer, { onClickOutside: () => showMenu(false) },
|
|
314
|
+
react_1.default.createElement("aside", { className: (0, Emotion_1.cx)({
|
|
315
|
+
[SideMenu_styles_1.jsStylesForSideMenu.wrapper()]: true,
|
|
316
|
+
[SideMenu_styles_1.jsStylesForSideMenu.wrapperIE()]: client_1.isIE11,
|
|
317
|
+
[SideMenu_styles_1.jsStylesForSideMenu.wrapperWithShadow(theme)]: isSideMenuOverContent,
|
|
318
|
+
}, className), "data-tid": SideMenuDataTids_1.SideMenuDataTids.root, ref: (0, utils_1.mergeRefs)([sideMenuRef, ref ?? null]), ...rest, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onMouseMove: showMinimizedRootForNarrowDesktop },
|
|
319
|
+
react_1.default.createElement("div", { className: (0, Emotion_1.cx)({
|
|
320
|
+
[SideMenu_styles_1.jsStylesForSideMenu.container(theme)]: true,
|
|
321
|
+
[SideMenu_styles_1.jsStylesForSideMenu.collapsedContainerForTabletsOrMobiles()]: !isOpened && isTabletOrMobile && !isBeingTransitioned,
|
|
322
|
+
[SideMenu_styles_1.jsStylesForSideMenu.minimizedContainer(theme)]: !isOpened && !isTabletOrMobile,
|
|
323
|
+
[SideMenu_styles_1.jsStylesForSideMenu.containerForTouchScreens(theme)]: isTouchScreen,
|
|
324
|
+
[SideMenu_styles_1.jsStylesForSideMenu.separatedContainerForMobiles(theme)]: isMobile && isSeparatedMenuShown && (isOpened || isBeingTransitioned),
|
|
325
|
+
}) },
|
|
326
|
+
react_1.default.createElement(ScrollContainer_1.ScrollContainer, { onScrollStateChangeY: (state) => {
|
|
327
|
+
setScrollState?.(state);
|
|
333
328
|
}, showScrollBar: setScrollBar(), ref: scrollContainerRef },
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
!disableSwipe && !disableCollapsing && isDesktopQuery && isOpened && (
|
|
329
|
+
react_1.default.createElement("div", { className: (0, Emotion_1.cx)({
|
|
330
|
+
[SideMenu_styles_1.jsStylesForSideMenu.contentWrapper(theme)]: true,
|
|
331
|
+
[SideMenu_styles_1.jsStylesForSideMenu.contentWrapperForTouchScreens(theme)]: isTouchScreen,
|
|
332
|
+
[SideMenu_styles_1.jsStylesForSideMenu.minimizedContentWrapper()]: !isOpened && !isTabletOrMobile,
|
|
333
|
+
}), ref: contentWrapperRef }, children))),
|
|
334
|
+
!disableSwipe && !disableCollapsing && isDesktopQuery && isOpened && (react_1.default.createElement(RightBorder_1.RightBorder, { onClick: handleRightBorderClick, showButton: isHovered }))))))));
|
|
340
335
|
});
|
|
341
336
|
SideMenuInner.displayName = 'SideMenu';
|
|
342
|
-
|
|
343
|
-
Body: SideMenuBody,
|
|
344
|
-
Footer: SideMenuFooter,
|
|
345
|
-
Header: SideMenuHeader,
|
|
346
|
-
Item: SideMenuItem,
|
|
347
|
-
SubItem: SideMenuSubItem,
|
|
348
|
-
SubItemHeader: SideMenuSubItemHeader,
|
|
349
|
-
Avatar: SideMenuAvatar,
|
|
350
|
-
Organisations: SideMenuOrganisations,
|
|
351
|
-
Notifications: SideMenuNotifications,
|
|
352
|
-
Divider: SideMenuDivider,
|
|
353
|
-
Link: SideMenuLink,
|
|
354
|
-
SubLink: SideMenuSubLink,
|
|
355
|
-
Dropdown: SideMenuDropdown,
|
|
337
|
+
const STATIC_PROPS = {
|
|
338
|
+
Body: SideMenuBody_1.SideMenuBody,
|
|
339
|
+
Footer: SideMenuFooter_1.SideMenuFooter,
|
|
340
|
+
Header: SideMenuHeader_1.SideMenuHeader,
|
|
341
|
+
Item: SideMenuItem_1.SideMenuItem,
|
|
342
|
+
SubItem: SideMenuSubItem_1.SideMenuSubItem,
|
|
343
|
+
SubItemHeader: SideMenuSubItemHeader_1.SideMenuSubItemHeader,
|
|
344
|
+
Avatar: SideMenuAvatar_1.SideMenuAvatar,
|
|
345
|
+
Organisations: SideMenuOrganisations_1.SideMenuOrganisations,
|
|
346
|
+
Notifications: SideMenuNotifications_1.SideMenuNotifications,
|
|
347
|
+
Divider: SideMenuDivider_1.SideMenuDivider,
|
|
348
|
+
Link: SideMenuLink_1.SideMenuLink,
|
|
349
|
+
SubLink: SideMenuSubLink_1.SideMenuSubLink,
|
|
350
|
+
Dropdown: SideMenuDropdown_1.SideMenuDropdown,
|
|
356
351
|
__KONTUR_REACT_UI__: 'SideMenu',
|
|
357
352
|
};
|
|
358
|
-
|
|
353
|
+
exports.SideMenu = Object.assign(SideMenuInner, STATIC_PROPS);
|