@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 +27 -0
- package/README.md +6 -6
- package/SideMenuDataTids.d.ts +1 -0
- package/SideMenuDataTids.js +1 -0
- package/hooks/useMemoIcon.d.ts +1 -0
- package/hooks/useMemoIcon.js +11 -0
- package/internal/themes/SideMenuTheme.d.ts +8 -0
- package/internal/themes/SideMenuTheme.js +9 -1
- package/package.json +2 -2
- package/src/SideMenu/SideMenu.d.ts +7 -0
- package/src/SideMenu/SideMenu.js +52 -32
- package/src/SideMenuContext.d.ts +1 -0
- package/src/internal/ClickableElement.js +3 -3
- package/src/internal/InnerBody.js +1 -1
- package/src/internal/RightBorder.d.ts +2 -2
- package/src/internal/RightBorder.js +18 -58
- package/src/internal/RightBorder.styles.d.ts +1 -2
- package/src/internal/RightBorder.styles.js +4 -8
- package/src/internal/SeparatedSubMenu.js +2 -2
- package/src/internal/SideMenuLogotype.js +1 -1
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
695
|
-
|
|
696
|
-
|
|
694
|
+
sideMenuRightBorderWidth: string;
|
|
695
|
+
sideMenuRightBorderIconColor: string;
|
|
696
|
+
sideMenuRightBorderHoverIconColor: string;
|
|
697
697
|
// #region BackButton (for Mobiles)
|
|
698
698
|
sideMenuBackButtonCaptionFontWeight: string;
|
|
699
699
|
sideMenuBackButtonCaptionFontSize: string;
|
package/SideMenuDataTids.d.ts
CHANGED
package/SideMenuDataTids.js
CHANGED
package/hooks/useMemoIcon.d.ts
CHANGED
package/hooks/useMemoIcon.js
CHANGED
|
@@ -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 = '
|
|
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.
|
|
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.
|
|
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;
|
package/src/SideMenu/SideMenu.js
CHANGED
|
@@ -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 ?
|
|
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
|
|
46
|
+
var _m = useResponsiveLayout({
|
|
47
47
|
customMediaQueries: customMediaQueries,
|
|
48
|
-
}), isMobileQuery =
|
|
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
|
|
56
|
-
var
|
|
57
|
-
var
|
|
58
|
-
var
|
|
59
|
-
var
|
|
60
|
-
var
|
|
61
|
-
var
|
|
62
|
-
var
|
|
63
|
-
var
|
|
64
|
-
var
|
|
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 (
|
|
133
|
+
if (isCollapsable && !isOpened && !isSeparatedMenuShown) {
|
|
126
134
|
isMouseOutside && showMinimizedRoot(false);
|
|
127
135
|
setIsMouseOutside(false);
|
|
128
136
|
}
|
|
129
137
|
};
|
|
130
138
|
var handleMouseLeave = function () {
|
|
131
|
-
|
|
139
|
+
setIsHovered(false);
|
|
140
|
+
if (isCollapsable) {
|
|
132
141
|
handleIsOpened(false, !manual);
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
142
|
+
if (!manual) {
|
|
143
|
+
setIsMouseOutside(true);
|
|
144
|
+
}
|
|
136
145
|
}
|
|
137
146
|
};
|
|
138
147
|
var showMinimizedRootForNarrowDesktop = function (e) {
|
|
139
|
-
if (!
|
|
148
|
+
if (!isSeparatedMenuShown || !isCollapsable || isTouchScreen)
|
|
140
149
|
return;
|
|
141
|
-
|
|
142
|
-
|
|
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 (
|
|
155
|
+
else if (relativeXCoordinate > parseInt(theme.sideMenuWidth)) {
|
|
146
156
|
showMinimizedRoot(true);
|
|
147
157
|
}
|
|
148
|
-
setMousePositionX(
|
|
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 = (
|
|
171
|
-
var
|
|
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 =
|
|
176
|
-
var isSideMenuOverflowing = (isTabletOrMobile ||
|
|
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)] =
|
|
220
|
-
_b[jsStylesForSideMenu.separatedRootForNarrowDesktops(theme)] = isSeparatedMenuShown &&
|
|
221
|
-
_b[jsStylesForSideMenu.separatedRootForTouchScreens(theme)] = isSeparatedMenuShown && isTouchScreen &&
|
|
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 &&
|
|
268
|
+
!disableSwipe && !disableCollapsing && isDesktopQuery && isOpened && (React.createElement(RightBorder, { onClick: handleRightBorderClick, showButton: isHovered }))))))));
|
|
249
269
|
});
|
|
250
270
|
SideMenuInner.displayName = 'SideMenu';
|
|
251
271
|
var STATIC_PROPS = {
|
package/src/SideMenuContext.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
-
|
|
4
|
-
|
|
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
|
|
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
|
|
16
|
+
var onClick = _a.onClick, showButton = _a.showButton;
|
|
14
17
|
var theme = getSideMenuTheme(useContext(ThemeContext));
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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' });
|
|
@@ -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:
|
|
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
|
-
|
|
9
|
-
return css(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\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
|
|
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.
|
|
60
|
-
_b[jsStyles.rootForNarrowDesktop(theme)] = context.
|
|
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.
|
|
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' });
|