@skbkontur/side-menu 0.6.1 → 0.7.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 +22 -0
- package/README.md +189 -1
- package/hooks/useActiveState.js +5 -5
- package/hooks/useMobileSeparatedMenuScroll.js +2 -2
- package/hooks/useOpenedSubElementState.js +4 -4
- package/package.json +1 -1
- package/src/SideMenu/SideMenu.d.ts +3 -0
- package/src/SideMenu/SideMenu.js +103 -60
- package/src/SideMenu/SideMenu.styles.d.ts +22 -13
- package/src/SideMenu/SideMenu.styles.js +48 -29
- package/src/SideMenuBody/SideMenuBody.js +1 -1
- package/src/SideMenuBody/SideMenuBody.styles.d.ts +1 -1
- package/src/SideMenuBody/SideMenuBody.styles.js +1 -1
- package/src/SideMenuContext.d.ts +9 -6
- package/src/SideMenuDivider/SideMenuDivider.js +1 -1
- package/src/SideMenuDivider/SideMenuDivider.styles.d.ts +1 -1
- package/src/SideMenuDivider/SideMenuDivider.styles.js +1 -1
- package/src/SideMenuDropdown/SideMenuDropdown.js +5 -5
- package/src/SideMenuDropdown/SideMenuDropdown.styles.d.ts +3 -3
- package/src/SideMenuDropdown/SideMenuDropdown.styles.js +3 -3
- package/src/SideMenuFooter/SideMenuFooter.js +1 -1
- package/src/SideMenuFooter/SideMenuFooter.styles.d.ts +1 -1
- package/src/SideMenuFooter/SideMenuFooter.styles.js +1 -1
- package/src/SideMenuHeader/SideMenuHeader.js +8 -8
- package/src/SideMenuHeader/SideMenuHeader.styles.d.ts +5 -5
- package/src/SideMenuHeader/SideMenuHeader.styles.js +5 -5
- package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.js +1 -1
- package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.styles.d.ts +2 -2
- package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.styles.js +2 -2
- package/src/internal/BackButton.js +1 -1
- package/src/internal/Backdrop.js +1 -1
- package/src/internal/Backdrop.styles.d.ts +1 -1
- package/src/internal/Backdrop.styles.js +1 -1
- package/src/internal/Burger.js +1 -1
- package/src/internal/Burger.styles.d.ts +1 -1
- package/src/internal/Burger.styles.js +2 -2
- package/src/internal/ClickableElement.js +53 -17
- package/src/internal/ClickableElement.styles.d.ts +5 -5
- package/src/internal/ClickableElement.styles.js +5 -5
- package/src/internal/InnerBody.js +1 -1
- package/src/internal/InnerBody.styles.d.ts +1 -1
- package/src/internal/InnerBody.styles.js +1 -1
- package/src/internal/ItemContent/Caption.js +13 -13
- package/src/internal/ItemContent/Caption.styles.d.ts +12 -12
- package/src/internal/ItemContent/Caption.styles.js +12 -12
- package/src/internal/ItemContent/Icon.js +8 -8
- package/src/internal/ItemContent/Icon.styles.d.ts +8 -8
- package/src/internal/ItemContent/Icon.styles.js +8 -8
- package/src/internal/ItemContent/ItemContent.js +10 -10
- package/src/internal/ItemContent/ItemContent.styles.d.ts +8 -8
- package/src/internal/ItemContent/ItemContent.styles.js +8 -8
- package/src/internal/ItemContent/Marker.js +2 -2
- package/src/internal/ItemContent/Marker.styles.d.ts +2 -2
- package/src/internal/ItemContent/Marker.styles.js +2 -2
- package/src/internal/NestedMenu.js +1 -1
- package/src/internal/NestedMenu.styles.d.ts +1 -1
- package/src/internal/NestedMenu.styles.js +1 -1
- package/src/internal/RightBorder.d.ts +1 -1
- package/src/internal/RightBorder.js +5 -5
- package/src/internal/RightBorder.styles.d.ts +3 -3
- package/src/internal/RightBorder.styles.js +3 -3
- package/src/internal/SeparatedSubMenu.js +10 -4
- package/src/internal/SeparatedSubMenu.styles.d.ts +5 -2
- package/src/internal/SeparatedSubMenu.styles.js +13 -3
- package/src/internal/SideMenuLogotype.js +3 -3
- package/src/internal/SideMenuLogotype.styles.d.ts +2 -2
- package/src/internal/SideMenuLogotype.styles.js +2 -2
- package/src/internal/SubMenu.d.ts +1 -1
- package/src/internal/SubMenu.js +6 -3
- package/utils/scripts.d.ts +2 -2
- package/utils/scripts.js +5 -4
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,28 @@
|
|
|
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
|
+
# [0.7.0](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@0.6.2...@skbkontur/side-menu@0.7.0) (2023-03-03)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **SideMenu:** implement narrow desktop adaptive version ([3688ea8](https://git.skbkontur.ru/ui/ui-parking/commits/3688ea80138c5d855eda95e45239e73895d63258))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## [0.6.2](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@0.6.1...@skbkontur/side-menu@0.6.2) (2023-02-20)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* **SideMenu:** adaptive version fix ([8433d88](https://git.skbkontur.ru/ui/ui-parking/commits/8433d88733782b139813d3de802158b447729a6b))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
6
28
|
## [0.6.1](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@0.6.0...@skbkontur/side-menu@0.6.1) (2023-02-09)
|
|
7
29
|
|
|
8
30
|
**Note:** Version bump only for package @skbkontur/side-menu
|
package/README.md
CHANGED
|
@@ -108,6 +108,14 @@ const close = () => {
|
|
|
108
108
|
setOpened(false);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
const linearLightGradient = `repeating-linear-gradient(
|
|
112
|
+
60deg,
|
|
113
|
+
#fafafa,
|
|
114
|
+
#fafafa 20px,
|
|
115
|
+
#dfdede 20px,
|
|
116
|
+
#dfdede 40px
|
|
117
|
+
)`
|
|
118
|
+
|
|
111
119
|
const renderModal = () => {
|
|
112
120
|
return (
|
|
113
121
|
<Modal onClose={close}>
|
|
@@ -120,7 +128,7 @@ const renderModal = () => {
|
|
|
120
128
|
);
|
|
121
129
|
}
|
|
122
130
|
|
|
123
|
-
<div style={{height: '600px', width: '100%', position: 'relative'}}>
|
|
131
|
+
<div style={{height: '600px', width: '100%', position: 'relative', display: 'flex'}}>
|
|
124
132
|
<SideMenu isSeparatedMenu={true}>
|
|
125
133
|
<SideMenu.Header konturLogo={<Kontur/>} productLogo={<Buhgalteria/>}/>
|
|
126
134
|
<SideMenu.Body>
|
|
@@ -188,6 +196,132 @@ const renderModal = () => {
|
|
|
188
196
|
</SideMenu.Avatar>
|
|
189
197
|
</SideMenu.Footer>
|
|
190
198
|
</SideMenu>
|
|
199
|
+
<div style={{ background: linearLightGradient, width: '100%', height: '100%' }}>
|
|
200
|
+
{'Content '.repeat(100)}
|
|
201
|
+
</div>
|
|
202
|
+
</div>
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Меню второго уровня в отдельной колонке можно расположить над контентом с помощью пропа `separatedMenuWithOverlay={true}`
|
|
206
|
+
|
|
207
|
+
```jsx harmony
|
|
208
|
+
import { getKonturAvatarUrl } from '@skbkontur/react-ui-addons';
|
|
209
|
+
import { Buhgalteria, Kontur } from '@skbkontur/logos';
|
|
210
|
+
import { MenuItem, Modal, Input } from '@skbkontur/react-ui';
|
|
211
|
+
import { SideMenu } from './index';
|
|
212
|
+
import {
|
|
213
|
+
DocTextIcon24Regular,
|
|
214
|
+
CommentRectTextIcon24Regular,
|
|
215
|
+
LightbulbIcon24Regular,
|
|
216
|
+
BookOpenTextIcon24Regular,
|
|
217
|
+
BookmarkIcon24Regular,
|
|
218
|
+
StackHDownIcon24Regular,
|
|
219
|
+
SettingsGearIcon24Regular,
|
|
220
|
+
FaceAHappyIcon24Regular
|
|
221
|
+
} from '@skbkontur/icons';
|
|
222
|
+
|
|
223
|
+
const [opened, setOpened] = React.useState(false);
|
|
224
|
+
const [panel, setPanel] = React.useState(false);
|
|
225
|
+
|
|
226
|
+
const open = () => {
|
|
227
|
+
setOpened(true);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const close = () => {
|
|
231
|
+
setOpened(false);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const linearLightGradient = `repeating-linear-gradient(
|
|
235
|
+
60deg,
|
|
236
|
+
#fafafa,
|
|
237
|
+
#fafafa 20px,
|
|
238
|
+
#dfdede 20px,
|
|
239
|
+
#dfdede 40px
|
|
240
|
+
)`
|
|
241
|
+
|
|
242
|
+
const renderModal = () => {
|
|
243
|
+
return (
|
|
244
|
+
<Modal onClose={close}>
|
|
245
|
+
<Modal.Header>Выбор организации</Modal.Header>
|
|
246
|
+
<Modal.Body>
|
|
247
|
+
<Input/>
|
|
248
|
+
<div>Список организаций</div>
|
|
249
|
+
</Modal.Body>
|
|
250
|
+
</Modal>
|
|
251
|
+
);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
<div style={{height: '600px', width: '100%', position: 'relative', display: 'flex'}}>
|
|
255
|
+
<SideMenu isSeparatedMenu={true} separatedMenuWithOverlay={true}>
|
|
256
|
+
<SideMenu.Header konturLogo={<Kontur/>} productLogo={<Buhgalteria/>}/>
|
|
257
|
+
<SideMenu.Body>
|
|
258
|
+
<SideMenu.Item icon={<DocTextIcon24Regular/>} caption={'Документы'} marker={'новое'}>
|
|
259
|
+
<SideMenu.SubItem caption={'Входящие'} marker={'5'}>
|
|
260
|
+
<SideMenu.SubItem caption={'Входящие 1'}>
|
|
261
|
+
<SideMenu.SubItem caption={'Входящие11'}>
|
|
262
|
+
<SideMenu.SubItem caption={'Входящие111'}/>
|
|
263
|
+
<SideMenu.SubItem caption={'Входящие112'}/>
|
|
264
|
+
<SideMenu.SubItem caption={'Входящие113'}/>
|
|
265
|
+
</SideMenu.SubItem>
|
|
266
|
+
<SideMenu.SubItem caption={'Входящие12'}/>
|
|
267
|
+
<SideMenu.SubItem caption={'Входящие13'}/>
|
|
268
|
+
</SideMenu.SubItem>
|
|
269
|
+
<SideMenu.SubItem caption={'Входящие2'}>
|
|
270
|
+
<SideMenu.SubItem caption={'Входящие21'}>
|
|
271
|
+
<SideMenu.SubItem caption={'Входящие211'}/>
|
|
272
|
+
<SideMenu.SubItem caption={'Входящие212'}/>
|
|
273
|
+
<SideMenu.SubItem caption={'Входящие213'}/>
|
|
274
|
+
</SideMenu.SubItem>
|
|
275
|
+
<SideMenu.SubItem caption={'Входящие22'}/>
|
|
276
|
+
<SideMenu.SubItem caption={'Входящие23'}/>
|
|
277
|
+
</SideMenu.SubItem>
|
|
278
|
+
<SideMenu.SubItem caption={'Входящие3'}/>
|
|
279
|
+
</SideMenu.SubItem>
|
|
280
|
+
<SideMenu.SubItem caption={'Исходящие'}/>
|
|
281
|
+
<SideMenu.SubItem caption={'Внутренние'}/>
|
|
282
|
+
<SideMenu.SubItem caption={'Черновики'}/>
|
|
283
|
+
<SideMenu.SubItem caption={'Удаленные'}/>
|
|
284
|
+
<SideMenu.SubItemHeader>Согласованные</SideMenu.SubItemHeader>
|
|
285
|
+
<SideMenu.SubItem caption={'Требуют обработки'}/>
|
|
286
|
+
<SideMenu.SubItem caption={'Обработанные'}/>
|
|
287
|
+
</SideMenu.Item>
|
|
288
|
+
<SideMenu.Item icon={<FaceAHappyIcon24Regular />} caption={'Контрагенты'}/>
|
|
289
|
+
<SideMenu.Item icon={<CommentRectTextIcon24Regular/>} caption={'Сообщения'} marker={'5'}>
|
|
290
|
+
<SideMenu.SubItem caption={'Входящие'} marker={'5'}/>
|
|
291
|
+
<SideMenu.SubItem caption={'Исходящие'}/>
|
|
292
|
+
<SideMenu.SubItem caption={'Внутренние'}/>
|
|
293
|
+
<SideMenu.SubItem caption={'Черновики'}/>
|
|
294
|
+
<SideMenu.SubItem caption={'Удаленные'}/>
|
|
295
|
+
</SideMenu.Item>
|
|
296
|
+
<SideMenu.Item icon={<LightbulbIcon24Regular/>} caption={'Справочная'}/>
|
|
297
|
+
<SideMenu.Divider />
|
|
298
|
+
<SideMenu.Item icon={<BookOpenTextIcon24Regular/>} caption={'Еще раздел'}/>
|
|
299
|
+
<SideMenu.Item icon={<BookmarkIcon24Regular/>} caption={'Отчетность'}/>
|
|
300
|
+
</SideMenu.Body>
|
|
301
|
+
<SideMenu.Footer>
|
|
302
|
+
<div>
|
|
303
|
+
{opened && renderModal()}
|
|
304
|
+
<SideMenu.Item icon={<StackHDownIcon24Regular/>} caption={'СКБ Контур'} onClick={open}/>
|
|
305
|
+
</div>
|
|
306
|
+
<SideMenu.Item icon={<SettingsGearIcon24Regular/>} caption={'Реквизиты и настройки'}/>
|
|
307
|
+
<SideMenu.Avatar
|
|
308
|
+
userName={'Ишматова Елена'}
|
|
309
|
+
avatarUrl={getKonturAvatarUrl({
|
|
310
|
+
userId: '992408aa-050e-41e9-9a48-6bf2f2f20d94'
|
|
311
|
+
})}
|
|
312
|
+
>
|
|
313
|
+
<MenuItem href={'https://cabinet.kontur.ru'} target="_blank">
|
|
314
|
+
Личный кабинет
|
|
315
|
+
</MenuItem>
|
|
316
|
+
<MenuItem >Безопасность</MenuItem>
|
|
317
|
+
<SideMenu.Divider />
|
|
318
|
+
<MenuItem >Выйти</MenuItem>
|
|
319
|
+
</SideMenu.Avatar>
|
|
320
|
+
</SideMenu.Footer>
|
|
321
|
+
</SideMenu>
|
|
322
|
+
<div style={{ background: linearLightGradient, width: '100%', height: '100%' }}>
|
|
323
|
+
{'Content '.repeat(100)}
|
|
324
|
+
</div>
|
|
191
325
|
</div>
|
|
192
326
|
```
|
|
193
327
|
|
|
@@ -454,3 +588,57 @@ const items = [
|
|
|
454
588
|
</div>
|
|
455
589
|
</div>
|
|
456
590
|
```
|
|
591
|
+
|
|
592
|
+
### Адаптивность
|
|
593
|
+
Все брейкпойнты вынесены в пропы:
|
|
594
|
+
|
|
595
|
+
| Проп | Дефолтное значение |
|
|
596
|
+
| ------|--------------------|
|
|
597
|
+
|desktopMediaQuery|'(min-width: 1200px)'|
|
|
598
|
+
|narrowDesktopMediaQuery|'(min-width: 992px)'|
|
|
599
|
+
|tabletMediaQuery|'(min-width: 768px)'|
|
|
600
|
+
|mobileMediaQuery|'(min-width: 0px)'|
|
|
601
|
+
|
|
602
|
+
Для того чтобы пропускать брекпойнты достаточно указать значение, равное следующему за ним брейкпойнту.
|
|
603
|
+
Например, в следующем случае у `SideMenu` не будет адаптива для планшетов:
|
|
604
|
+
|
|
605
|
+
`<SideMenu tabletMediaQuery={'(min-width: 768px)'} narrowDesktopMediaQuery={'(min-width: 768px)'}/>`
|
|
606
|
+
|
|
607
|
+
Пример встраивания SideMenu с адаптивом (более наглядно в [песочнице](https://codesandbox.io/s/dark-waterfall-5b4fkh?file=/src/App.js)):
|
|
608
|
+
|
|
609
|
+
```jsx static
|
|
610
|
+
<div className="App">
|
|
611
|
+
<div className="layout">
|
|
612
|
+
<div className="menu">
|
|
613
|
+
<SideMenu />
|
|
614
|
+
</div>
|
|
615
|
+
<div className="content">
|
|
616
|
+
...
|
|
617
|
+
</div>
|
|
618
|
+
</div>
|
|
619
|
+
</div>
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
где
|
|
623
|
+
|
|
624
|
+
```css static
|
|
625
|
+
.layout {
|
|
626
|
+
display: flex;
|
|
627
|
+
flex-direction: column;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
.layout .menu {
|
|
631
|
+
height: 68px;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
@media screen and (min-width: 992px) {
|
|
635
|
+
.layout {
|
|
636
|
+
flex-direction: row;
|
|
637
|
+
height: 100vh;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
.layout .menu {
|
|
641
|
+
height: 100%;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
```
|
package/hooks/useActiveState.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { useEffect, useState } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { isElementActive } from '../utils/scripts';
|
|
3
3
|
export var useActiveState = function (id, href, generatedId, activeMenuItem) {
|
|
4
4
|
var _a = useState(false), isActive = _a[0], setIsActive = _a[1];
|
|
5
5
|
useEffect(function () {
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
setIsActive(
|
|
6
|
+
var isHrefActive = isElementActive(href, activeMenuItem);
|
|
7
|
+
var isIdActive = isElementActive(id, activeMenuItem);
|
|
8
|
+
var isGeneratedIdActive = isElementActive(generatedId, activeMenuItem);
|
|
9
|
+
setIsActive(isHrefActive || isIdActive || isGeneratedIdActive);
|
|
10
10
|
}, [activeMenuItem]);
|
|
11
11
|
return isActive;
|
|
12
12
|
};
|
|
@@ -6,7 +6,7 @@ export var useMobileSeparatedMenuScroll = function () {
|
|
|
6
6
|
var checkScroll = function () {
|
|
7
7
|
var _a, _b;
|
|
8
8
|
var isScrolledToTop = ((_a = separatedMenuRef.current) === null || _a === void 0 ? void 0 : _a.scrollTop) === 0;
|
|
9
|
-
(_b = context.
|
|
9
|
+
(_b = context.setIsMobileSeparatedMenuScrolling) === null || _b === void 0 ? void 0 : _b.call(context, !isScrolledToTop);
|
|
10
10
|
};
|
|
11
11
|
useEffect(function () {
|
|
12
12
|
var _a;
|
|
@@ -14,7 +14,7 @@ export var useMobileSeparatedMenuScroll = function () {
|
|
|
14
14
|
return function () {
|
|
15
15
|
var _a, _b;
|
|
16
16
|
(_a = separatedMenuRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('scroll', checkScroll, true);
|
|
17
|
-
(_b = context.
|
|
17
|
+
(_b = context.setIsMobileSeparatedMenuScrolling) === null || _b === void 0 ? void 0 : _b.call(context, false);
|
|
18
18
|
};
|
|
19
19
|
}, []);
|
|
20
20
|
return separatedMenuRef;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { useEffect, useState } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { isElementActive, isParentOpened } from '../utils/scripts';
|
|
3
3
|
export var useOpenedSubElementState = function (id, generatedId, openedParents, activeMenuItem) {
|
|
4
4
|
var _a = useState(false), isOpened = _a[0], setIsOpened = _a[1];
|
|
5
5
|
useEffect(function () {
|
|
6
6
|
var isOpenedParent = isParentOpened(id, generatedId, openedParents);
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
setIsOpened(isOpenedParent || isOpened ||
|
|
7
|
+
var isIdActive = isElementActive(id, activeMenuItem);
|
|
8
|
+
var isGeneratedIdActive = isElementActive(generatedId, activeMenuItem);
|
|
9
|
+
setIsOpened(isOpenedParent || isOpened || isIdActive || isGeneratedIdActive);
|
|
10
10
|
}, [openedParents === null || openedParents === void 0 ? void 0 : openedParents.toString(), activeMenuItem]);
|
|
11
11
|
return isOpened;
|
|
12
12
|
};
|
package/package.json
CHANGED
|
@@ -19,8 +19,11 @@ export interface SideMenuProps extends CommonProps {
|
|
|
19
19
|
disableSwipe?: boolean;
|
|
20
20
|
value?: string;
|
|
21
21
|
onValueChange?: (value: string) => void;
|
|
22
|
+
desktopMediaQuery?: string;
|
|
23
|
+
narrowDesktopMediaQuery?: string;
|
|
22
24
|
tabletMediaQuery?: string;
|
|
23
25
|
mobileMediaQuery?: string;
|
|
26
|
+
separatedMenuWithOverlay?: boolean;
|
|
24
27
|
}
|
|
25
28
|
interface SubComponents {
|
|
26
29
|
Body: typeof SideMenuBody;
|
package/src/SideMenu/SideMenu.js
CHANGED
|
@@ -2,7 +2,7 @@ import { __assign, __rest } from "tslib";
|
|
|
2
2
|
import React, { forwardRef, useEffect, useState } from 'react';
|
|
3
3
|
import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
|
|
4
4
|
import { isIE11, isSafari } from '@skbkontur/react-ui/lib/client';
|
|
5
|
-
import { jsStyles } from './SideMenu.styles';
|
|
5
|
+
import { jsStyles, sideMenuMinimizedWidth, sideMenuStandardWidth } from './SideMenu.styles';
|
|
6
6
|
import { SideMenuOrganisations } from '../SideMenuOrganisations/SideMenuOrganisations';
|
|
7
7
|
import { SideMenuContext } from '../SideMenuContext';
|
|
8
8
|
import { SideMenuBody } from '../SideMenuBody/SideMenuBody';
|
|
@@ -20,37 +20,40 @@ import { SideMenuSubLink } from '../SideMenuSubLink/SideMenuSubLink';
|
|
|
20
20
|
import { useResponsiveLayout } from '@skbkontur/react-ui';
|
|
21
21
|
import { Backdrop } from '../internal/Backdrop';
|
|
22
22
|
import { RenderLayer } from '@skbkontur/react-ui/internal/RenderLayer';
|
|
23
|
-
import {
|
|
23
|
+
import { isTouchDevice } from '../../utils/scripts';
|
|
24
24
|
import { SideMenuDataTids } from '../../SideMenuDataTids';
|
|
25
25
|
import { ZIndex } from '@skbkontur/react-ui/internal/ZIndex';
|
|
26
26
|
var SideMenuInner = forwardRef(function (_a, ref) {
|
|
27
27
|
var _b, _c, _d, _e;
|
|
28
|
-
var children = _a.children, value = _a.value, onValueChange = _a.onValueChange, _f = _a.size, size = _f === void 0 ? 'small' : _f, _g = _a.isSeparatedMenu, isSeparatedMenu = _g === void 0 ? false : _g, className = _a.className, _h = _a.disableSwipe, disableSwipe = _h === void 0 ? true : _h, _j = _a.
|
|
28
|
+
var children = _a.children, value = _a.value, onValueChange = _a.onValueChange, _f = _a.size, size = _f === void 0 ? 'small' : _f, _g = _a.isSeparatedMenu, isSeparatedMenu = _g === void 0 ? false : _g, className = _a.className, _h = _a.disableSwipe, disableSwipe = _h === void 0 ? true : _h, _j = _a.desktopMediaQuery, desktopMediaQuery = _j === void 0 ? '(min-width: 1200px)' : _j, _k = _a.narrowDesktopMediaQuery, narrowDesktopMediaQuery = _k === void 0 ? '(min-width: 992px)' : _k, _l = _a.tabletMediaQuery, tabletMediaQuery = _l === void 0 ? '(min-width: 768px)' : _l, _m = _a.mobileMediaQuery, mobileMediaQuery = _m === void 0 ? '(min-width: 0px)' : _m, _o = _a.separatedMenuWithOverlay, separatedMenuWithOverlay = _o === void 0 ? false : _o, rest = __rest(_a, ["children", "value", "onValueChange", "size", "isSeparatedMenu", "className", "disableSwipe", "desktopMediaQuery", "narrowDesktopMediaQuery", "tabletMediaQuery", "mobileMediaQuery", "separatedMenuWithOverlay"]);
|
|
29
29
|
var scrollTimer = null;
|
|
30
30
|
var transitionTimer = null;
|
|
31
31
|
var widgetTimer;
|
|
32
32
|
var customMediaQueries = {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
isMobileQuery: mobileMediaQuery,
|
|
34
|
+
isTabletQuery: tabletMediaQuery,
|
|
35
|
+
isNarrowDesktopQuery: narrowDesktopMediaQuery,
|
|
36
|
+
isDesktopQuery: desktopMediaQuery,
|
|
37
37
|
};
|
|
38
|
-
var
|
|
38
|
+
var _p = useResponsiveLayout({
|
|
39
39
|
customMediaQueries: customMediaQueries,
|
|
40
|
-
}),
|
|
41
|
-
var
|
|
42
|
-
var
|
|
43
|
-
var
|
|
44
|
-
var
|
|
45
|
-
var
|
|
46
|
-
var
|
|
47
|
-
var
|
|
48
|
-
var
|
|
49
|
-
var
|
|
50
|
-
var
|
|
51
|
-
var
|
|
52
|
-
var
|
|
53
|
-
var
|
|
40
|
+
}), isMobileQuery = _p.isMobileQuery, isTabletQuery = _p.isTabletQuery, isNarrowDesktopQuery = _p.isNarrowDesktopQuery, isDesktopQuery = _p.isDesktopQuery;
|
|
41
|
+
var isNarrowDesktop = isNarrowDesktopQuery && !isDesktopQuery;
|
|
42
|
+
var isTablet = isTabletQuery && !isNarrowDesktopQuery;
|
|
43
|
+
var isMobile = isMobileQuery && !isTabletQuery;
|
|
44
|
+
var isTabletOrMobile = isTablet || isMobile;
|
|
45
|
+
var isTouchScreen = isTouchDevice() || isMobile || isTablet;
|
|
46
|
+
var separatedMenuWithoutOverlay = isSeparatedMenu && !separatedMenuWithOverlay;
|
|
47
|
+
var _q = useState(isNarrowDesktop), isMinimized = _q[0], setIsMinimized = _q[1];
|
|
48
|
+
var _r = useState(false), hasScrollBar = _r[0], setHasScrollBar = _r[1];
|
|
49
|
+
var _s = useState(false), isBeingTransitioned = _s[0], setIsBeingTransitioned = _s[1];
|
|
50
|
+
var _t = useState('#2291ff'), productColor = _t[0], setProductColor = _t[1];
|
|
51
|
+
var _u = useState(false), showWidget = _u[0], setShowWidget = _u[1];
|
|
52
|
+
var _v = useState(value), activeMenuItem = _v[0], setActiveMenuItem = _v[1];
|
|
53
|
+
var _w = useState(isDesktopQuery || isNarrowDesktop), isShown = _w[0], setIsShown = _w[1];
|
|
54
|
+
var _x = useState(false), isSeparatedMenuShown = _x[0], setIsSeparatedMenuShown = _x[1];
|
|
55
|
+
var _y = useState(true), isMouseOutside = _y[0], setIsMouseOutside = _y[1];
|
|
56
|
+
var _z = useState(false), isMobileSeparatedMenuScrolling = _z[0], setIsMobileSeparatedMenuScrolling = _z[1];
|
|
54
57
|
useEffect(function () {
|
|
55
58
|
return function () {
|
|
56
59
|
if (scrollTimer) {
|
|
@@ -58,18 +61,30 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
58
61
|
}
|
|
59
62
|
};
|
|
60
63
|
});
|
|
64
|
+
useEffect(function () {
|
|
65
|
+
if (isNarrowDesktop || isDesktopQuery) {
|
|
66
|
+
setIsShown(true);
|
|
67
|
+
}
|
|
68
|
+
if (isDesktopQuery) {
|
|
69
|
+
setIsMinimized(false);
|
|
70
|
+
}
|
|
71
|
+
if (isNarrowDesktop) {
|
|
72
|
+
setIsMinimized(true);
|
|
73
|
+
}
|
|
74
|
+
}, [isNarrowDesktop, isDesktopQuery]);
|
|
61
75
|
useEffect(function () {
|
|
62
76
|
setActiveMenuItem(value);
|
|
63
77
|
}, [value]);
|
|
64
|
-
var
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
78
|
+
var showMinimizedRoot = function (newIsMinimized) {
|
|
79
|
+
var minimizeWithoutOverlay = separatedMenuWithoutOverlay && newIsMinimized;
|
|
80
|
+
if ((!isBeingTransitioned || minimizeWithoutOverlay) && newIsMinimized !== isMinimized) {
|
|
81
|
+
setIsBeingTransitioned(true);
|
|
82
|
+
setIsMinimized(newIsMinimized);
|
|
68
83
|
if (transitionTimer) {
|
|
69
84
|
clearTimeout(transitionTimer);
|
|
70
85
|
}
|
|
71
86
|
transitionTimer = setTimeout(function () {
|
|
72
|
-
|
|
87
|
+
setIsBeingTransitioned(false);
|
|
73
88
|
}, 1000);
|
|
74
89
|
}
|
|
75
90
|
};
|
|
@@ -89,6 +104,11 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
89
104
|
}, 200);
|
|
90
105
|
};
|
|
91
106
|
var handleMouseEnter = function () {
|
|
107
|
+
if (separatedMenuWithoutOverlay && isSeparatedMenuShown && isNarrowDesktop) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
isMouseOutside && showMinimizedRoot(false);
|
|
111
|
+
setIsMouseOutside(false);
|
|
92
112
|
widgetTimer = setTimeout(function () {
|
|
93
113
|
setShowWidget(true);
|
|
94
114
|
}, 500);
|
|
@@ -98,67 +118,90 @@ var SideMenuInner = forwardRef(function (_a, ref) {
|
|
|
98
118
|
clearTimeout(widgetTimer);
|
|
99
119
|
}
|
|
100
120
|
setShowWidget(false);
|
|
121
|
+
if (isNarrowDesktop) {
|
|
122
|
+
setIsMinimized(true);
|
|
123
|
+
}
|
|
124
|
+
setIsMouseOutside(true);
|
|
125
|
+
};
|
|
126
|
+
var showMinimizedRootForNarrowDesktopWithOverlay = function (e) {
|
|
127
|
+
if (separatedMenuWithoutOverlay && isNarrowDesktop) {
|
|
128
|
+
if (e.clientX < parseInt(sideMenuMinimizedWidth)) {
|
|
129
|
+
showMinimizedRoot(false);
|
|
130
|
+
}
|
|
131
|
+
if (e.clientX > parseInt(sideMenuStandardWidth)) {
|
|
132
|
+
showMinimizedRoot(true);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
101
135
|
};
|
|
102
|
-
var
|
|
136
|
+
var switchActiveMenuItem = function (id) {
|
|
103
137
|
if (id !== value) {
|
|
104
138
|
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(id);
|
|
105
139
|
setActiveMenuItem(id);
|
|
106
140
|
}
|
|
107
141
|
};
|
|
108
142
|
var toggleIsShown = function () {
|
|
109
|
-
|
|
143
|
+
isTabletOrMobile && setIsShown(!isShown);
|
|
110
144
|
};
|
|
111
145
|
var turnOffIsShown = function () {
|
|
112
|
-
|
|
146
|
+
isTabletOrMobile && setIsShown(false);
|
|
113
147
|
};
|
|
148
|
+
var isSideMenuOverContent = (isNarrowDesktop && !isMinimized) || (isMobile && isShown) || (isTablet && isShown && !isSeparatedMenuShown);
|
|
114
149
|
return (React.createElement(SideMenuContext.Provider, { value: {
|
|
115
|
-
|
|
116
|
-
|
|
150
|
+
isMinimized: isMinimized,
|
|
151
|
+
setIsMinimized: showMinimizedRoot,
|
|
152
|
+
isBeingTransitioned: isBeingTransitioned,
|
|
117
153
|
isSeparatedMenu: isSeparatedMenu,
|
|
118
154
|
size: size,
|
|
119
155
|
productColor: productColor,
|
|
120
156
|
setProductColor: setProductColor,
|
|
121
157
|
showWidget: showWidget,
|
|
122
158
|
activeMenuItem: activeMenuItem,
|
|
123
|
-
switchActiveMenuItem:
|
|
124
|
-
isDesktop:
|
|
159
|
+
switchActiveMenuItem: switchActiveMenuItem,
|
|
160
|
+
isDesktop: isDesktopQuery,
|
|
125
161
|
isNarrowDesktop: isNarrowDesktop,
|
|
126
|
-
isTablet:
|
|
127
|
-
isMobile:
|
|
128
|
-
isTouchScreen:
|
|
162
|
+
isTablet: isTablet,
|
|
163
|
+
isMobile: isMobile,
|
|
164
|
+
isTouchScreen: isTouchScreen,
|
|
129
165
|
isShown: isShown,
|
|
130
166
|
toggleIsShown: toggleIsShown,
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
167
|
+
isSeparatedMenuShown: isSeparatedMenuShown,
|
|
168
|
+
setIsSeparatedMenuShown: setIsSeparatedMenuShown,
|
|
169
|
+
separatedMenuWithoutOverlay: separatedMenuWithoutOverlay,
|
|
170
|
+
setIsMouseOutside: setIsMouseOutside,
|
|
171
|
+
isMobileSeparatedMenuScrolling: isMobileSeparatedMenuScrolling,
|
|
172
|
+
setIsMobileSeparatedMenuScrolling: setIsMobileSeparatedMenuScrolling,
|
|
135
173
|
} },
|
|
136
|
-
React.createElement(ZIndex, { priority:
|
|
137
|
-
_b[jsStyles.
|
|
138
|
-
_b[jsStyles.
|
|
174
|
+
React.createElement(ZIndex, { priority: isTabletOrMobile ? 'Sidepage' : 0, className: cx((_b = {},
|
|
175
|
+
_b[jsStyles.root()] = true,
|
|
176
|
+
_b[jsStyles.rootForTabletsOrMobiles()] = isTabletOrMobile,
|
|
177
|
+
_b[jsStyles.shownRootForTabletsOrMobiles()] = isShown && isTabletOrMobile,
|
|
178
|
+
_b[jsStyles.rootForNarrowDesktops()] = isNarrowDesktop,
|
|
179
|
+
_b[jsStyles.separatedRootForNarrowDesktops()] = separatedMenuWithoutOverlay && isSeparatedMenuShown && isNarrowDesktop,
|
|
180
|
+
_b[jsStyles.separatedRootForDesktops()] = separatedMenuWithoutOverlay && isSeparatedMenuShown && isDesktopQuery,
|
|
139
181
|
_b)) },
|
|
140
182
|
React.createElement(React.Fragment, null,
|
|
141
|
-
|
|
183
|
+
isTabletOrMobile && isShown && React.createElement(Backdrop, null),
|
|
142
184
|
React.createElement(RenderLayer, { onClickOutside: turnOffIsShown },
|
|
143
185
|
React.createElement("aside", __assign({ className: cx((_c = {},
|
|
144
|
-
_c[jsStyles.
|
|
145
|
-
_c[jsStyles.
|
|
146
|
-
_c)
|
|
186
|
+
_c[jsStyles.wrapper()] = true,
|
|
187
|
+
_c[jsStyles.wrapperIE()] = isIE11,
|
|
188
|
+
_c[jsStyles.wrapperWithShadow()] = isSideMenuOverContent,
|
|
189
|
+
_c), className), "data-tid": SideMenuDataTids.root, ref: ref }, rest, { onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onMouseMove: showMinimizedRootForNarrowDesktopWithOverlay }),
|
|
147
190
|
React.createElement("div", { className: cx((_d = {},
|
|
148
|
-
_d[jsStyles.
|
|
149
|
-
_d[jsStyles.
|
|
150
|
-
_d[jsStyles.
|
|
151
|
-
_d[jsStyles.
|
|
152
|
-
_d[jsStyles.
|
|
153
|
-
_d[jsStyles.
|
|
154
|
-
_d[jsStyles.
|
|
155
|
-
_d)),
|
|
191
|
+
_d[jsStyles.container()] = true,
|
|
192
|
+
_d[jsStyles.collapsedContainerForTabletsOrMobiles()] = !isShown,
|
|
193
|
+
_d[jsStyles.containerSafari()] = isSafari,
|
|
194
|
+
_d[jsStyles.minimizedContainer()] = isMinimized,
|
|
195
|
+
_d[jsStyles.innerContainer()] = !isSeparatedMenu,
|
|
196
|
+
_d[jsStyles.containerForTouchScreens()] = isTouchScreen,
|
|
197
|
+
_d[jsStyles.separatedContainerForMobiles()] = isMobile && isSeparatedMenuShown && isShown,
|
|
198
|
+
_d)), onScroll: handleScroll },
|
|
156
199
|
React.createElement("div", { className: cx((_e = {},
|
|
157
|
-
_e[jsStyles.
|
|
158
|
-
_e[jsStyles.
|
|
159
|
-
_e[jsStyles.
|
|
200
|
+
_e[jsStyles.contentWrapper()] = true,
|
|
201
|
+
_e[jsStyles.contentWrapperWithoutScrollBar()] = !hasScrollBar,
|
|
202
|
+
_e[jsStyles.collapsedContentWrapperForTabletsOrMobiles()] = !isShown || isSeparatedMenuShown,
|
|
160
203
|
_e)) }, children)),
|
|
161
|
-
!disableSwipe &&
|
|
204
|
+
!disableSwipe && isDesktopQuery && !isSeparatedMenuShown && (React.createElement(RightBorder, { setIsMinimized: setIsMinimized }))))))));
|
|
162
205
|
});
|
|
163
206
|
SideMenuInner.displayName = 'SideMenu';
|
|
164
207
|
var STATIC_PROPS = {
|
|
@@ -1,16 +1,25 @@
|
|
|
1
|
+
export declare const sideMenuMinimizedWidth = "72px";
|
|
2
|
+
export declare const sideMenuStandardWidth = "232px";
|
|
3
|
+
export declare const sideMenuForTouchScreenWidth = "328px";
|
|
4
|
+
export declare const sideMenuBoxShadow = "4px 4px 24px rgba(0, 0, 0, 0.24)";
|
|
1
5
|
export declare const jsStyles: {
|
|
2
|
-
sideMenuZIndex(): string;
|
|
3
|
-
sideMenuZIndexForTabletsOrMobiles(): string;
|
|
4
6
|
root(): string;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
7
|
+
rootForTabletsOrMobiles(): string;
|
|
8
|
+
shownRootForTabletsOrMobiles(): string;
|
|
9
|
+
rootForNarrowDesktops(): string;
|
|
10
|
+
separatedRootForNarrowDesktops(): string;
|
|
11
|
+
separatedRootForDesktops(): string;
|
|
12
|
+
container(): string;
|
|
13
|
+
containerSafari(): string;
|
|
14
|
+
contentWrapperWithoutScrollBar(): string;
|
|
15
|
+
collapsedContentWrapperForTabletsOrMobiles(): string;
|
|
16
|
+
minimizedContainer(): string;
|
|
17
|
+
innerContainer(): string;
|
|
18
|
+
containerForTouchScreens(): string;
|
|
19
|
+
separatedContainerForMobiles(): string;
|
|
20
|
+
contentWrapper(): string;
|
|
21
|
+
wrapper(): string;
|
|
22
|
+
wrapperIE(): string;
|
|
23
|
+
wrapperWithShadow(): string;
|
|
24
|
+
collapsedContainerForTabletsOrMobiles(): string;
|
|
16
25
|
};
|