@skbkontur/side-menu 0.6.2 → 0.7.1

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.
Files changed (71) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +204 -1
  3. package/hooks/useActiveState.js +5 -5
  4. package/hooks/useMobileSeparatedMenuScroll.js +2 -2
  5. package/hooks/useOpenedSubElementState.js +4 -4
  6. package/package.json +1 -1
  7. package/src/SideMenu/SideMenu.d.ts +3 -0
  8. package/src/SideMenu/SideMenu.js +100 -63
  9. package/src/SideMenu/SideMenu.styles.d.ts +22 -14
  10. package/src/SideMenu/SideMenu.styles.js +45 -29
  11. package/src/SideMenuBody/SideMenuBody.js +1 -1
  12. package/src/SideMenuBody/SideMenuBody.styles.d.ts +1 -1
  13. package/src/SideMenuBody/SideMenuBody.styles.js +1 -1
  14. package/src/SideMenuContext.d.ts +9 -6
  15. package/src/SideMenuDivider/SideMenuDivider.js +1 -1
  16. package/src/SideMenuDivider/SideMenuDivider.styles.d.ts +1 -1
  17. package/src/SideMenuDivider/SideMenuDivider.styles.js +1 -1
  18. package/src/SideMenuDropdown/SideMenuDropdown.js +3 -3
  19. package/src/SideMenuDropdown/SideMenuDropdown.styles.d.ts +3 -3
  20. package/src/SideMenuDropdown/SideMenuDropdown.styles.js +3 -3
  21. package/src/SideMenuFooter/SideMenuFooter.js +1 -1
  22. package/src/SideMenuFooter/SideMenuFooter.styles.d.ts +1 -1
  23. package/src/SideMenuFooter/SideMenuFooter.styles.js +1 -1
  24. package/src/SideMenuHeader/SideMenuHeader.js +8 -8
  25. package/src/SideMenuHeader/SideMenuHeader.styles.d.ts +5 -5
  26. package/src/SideMenuHeader/SideMenuHeader.styles.js +5 -5
  27. package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.js +1 -1
  28. package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.styles.d.ts +2 -2
  29. package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.styles.js +2 -2
  30. package/src/internal/BackButton.js +1 -1
  31. package/src/internal/Backdrop.js +1 -1
  32. package/src/internal/Backdrop.styles.d.ts +1 -1
  33. package/src/internal/Backdrop.styles.js +1 -1
  34. package/src/internal/Burger.js +1 -1
  35. package/src/internal/Burger.styles.d.ts +1 -1
  36. package/src/internal/Burger.styles.js +1 -1
  37. package/src/internal/ClickableElement.js +53 -17
  38. package/src/internal/ClickableElement.styles.d.ts +5 -5
  39. package/src/internal/ClickableElement.styles.js +5 -5
  40. package/src/internal/InnerBody.js +1 -1
  41. package/src/internal/InnerBody.styles.d.ts +1 -1
  42. package/src/internal/InnerBody.styles.js +1 -1
  43. package/src/internal/ItemContent/Caption.js +13 -13
  44. package/src/internal/ItemContent/Caption.styles.d.ts +12 -12
  45. package/src/internal/ItemContent/Caption.styles.js +12 -12
  46. package/src/internal/ItemContent/Icon.js +8 -8
  47. package/src/internal/ItemContent/Icon.styles.d.ts +8 -8
  48. package/src/internal/ItemContent/Icon.styles.js +8 -8
  49. package/src/internal/ItemContent/ItemContent.js +10 -10
  50. package/src/internal/ItemContent/ItemContent.styles.d.ts +8 -8
  51. package/src/internal/ItemContent/ItemContent.styles.js +8 -8
  52. package/src/internal/ItemContent/Marker.js +2 -2
  53. package/src/internal/ItemContent/Marker.styles.d.ts +2 -2
  54. package/src/internal/ItemContent/Marker.styles.js +2 -2
  55. package/src/internal/NestedMenu.js +1 -1
  56. package/src/internal/NestedMenu.styles.d.ts +1 -1
  57. package/src/internal/NestedMenu.styles.js +1 -1
  58. package/src/internal/RightBorder.d.ts +1 -1
  59. package/src/internal/RightBorder.js +5 -5
  60. package/src/internal/RightBorder.styles.d.ts +3 -3
  61. package/src/internal/RightBorder.styles.js +3 -3
  62. package/src/internal/SeparatedSubMenu.js +10 -4
  63. package/src/internal/SeparatedSubMenu.styles.d.ts +5 -2
  64. package/src/internal/SeparatedSubMenu.styles.js +13 -3
  65. package/src/internal/SideMenuLogotype.js +3 -3
  66. package/src/internal/SideMenuLogotype.styles.d.ts +2 -2
  67. package/src/internal/SideMenuLogotype.styles.js +2 -2
  68. package/src/internal/SubMenu.d.ts +1 -1
  69. package/src/internal/SubMenu.js +6 -3
  70. package/utils/scripts.d.ts +2 -2
  71. package/utils/scripts.js +5 -4
package/CHANGELOG.md CHANGED
@@ -3,6 +3,25 @@
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.1](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@0.7.0...@skbkontur/side-menu@0.7.1) (2023-03-13)
7
+
8
+ **Note:** Version bump only for package @skbkontur/side-menu
9
+
10
+
11
+
12
+
13
+
14
+ # [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)
15
+
16
+
17
+ ### Features
18
+
19
+ * **SideMenu:** implement narrow desktop adaptive version ([3688ea8](https://git.skbkontur.ru/ui/ui-parking/commits/3688ea80138c5d855eda95e45239e73895d63258))
20
+
21
+
22
+
23
+
24
+
6
25
  ## [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)
7
26
 
8
27
 
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
 
@@ -456,6 +590,19 @@ const items = [
456
590
  ```
457
591
 
458
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)'}/>`
459
606
 
460
607
  Пример встраивания SideMenu с адаптивом (более наглядно в [песочнице](https://codesandbox.io/s/dark-waterfall-5b4fkh?file=/src/App.js)):
461
608
 
@@ -495,3 +642,59 @@ const items = [
495
642
  }
496
643
  }
497
644
  ```
645
+
646
+
647
+ ### Роутинг
648
+
649
+ Компонент `SideMenu.Link` можно использовать, например, вместе с `react-router-dom`.
650
+
651
+ Для этого можно сделать подобную обёртку:
652
+
653
+
654
+ ```ts static
655
+ // react-router-dom v6
656
+ import { useNavigate } from "react-router-dom";
657
+
658
+ interface SideMuneReLinkProps extends SideMenuLinkProps {
659
+ href: string;
660
+ }
661
+
662
+ const SideMuneReLink: React.FunctionComponent<SideMuneReLinkProps> = (
663
+ props
664
+ ) => {
665
+ const navigate = useNavigate();
666
+
667
+ return (
668
+ <SideMenu.Link
669
+ {...props}
670
+ onClick={(e) => {
671
+ e.preventDefault();
672
+ navigate(props.href);
673
+ }}
674
+ />
675
+ );
676
+ };
677
+ ```
678
+
679
+ Пример `v6` в [песочнице](https://codesandbox.io/s/side-menu-react-router-dom-v6-4cl188?file=/src/App.tsx).
680
+
681
+ ---
682
+
683
+ В предыдущей мажорной версии хук назывался иначе - `useHistory`.
684
+
685
+ ```ts static
686
+ // react-router-dom v5
687
+ import { useHistory } from "react-router-dom";
688
+ ```
689
+
690
+
691
+ Пример `v5` в [песочнице](https://codesandbox.io/s/side-menu-react-router-dom-v5-0ipgj4?file=/src/App.tsx).
692
+
693
+
694
+ В самом пакете `react-router-dom v5` обработчик клика немного умнее.
695
+ Например, он игнорирует клики с модификаторами, чтобы ссылка отрабатывала привычным способом.
696
+
697
+ Детали реализации можно посмотреть здесь: https://github.com/remix-run/react-router/blob/v5/packages/react-router-dom/modules/Link.js#L36
698
+
699
+
700
+ При необходимости вы можете повторить часть этой логики в своей обёртке.
@@ -1,12 +1,12 @@
1
1
  import { useEffect, useState } from 'react';
2
- import { isIdActive } from '../utils/scripts';
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 hrefIsActive = isIdActive(href, activeMenuItem);
7
- var idIsActive = isIdActive(id, activeMenuItem);
8
- var generatedIdIsActive = isIdActive(generatedId, activeMenuItem);
9
- setIsActive(hrefIsActive || idIsActive || generatedIdIsActive);
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.setMobileSeparatedMenuIsScrolling) === null || _b === void 0 ? void 0 : _b.call(context, !isScrolledToTop);
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.setMobileSeparatedMenuIsScrolling) === null || _b === void 0 ? void 0 : _b.call(context, false);
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 { isIdActive, isParentOpened } from '../utils/scripts';
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 idIsActive = isIdActive(id, activeMenuItem);
8
- var generatedIdIsActive = isIdActive(generatedId, activeMenuItem);
9
- setIsOpened(isOpenedParent || isOpened || idIsActive || generatedIdIsActive);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skbkontur/side-menu",
3
- "version": "0.6.2",
3
+ "version": "0.7.1",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
@@ -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;
@@ -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 { isTouchScreen } from '../../utils/scripts';
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.tabletMediaQuery, tabletMediaQuery = _j === void 0 ? '768px' : _j, _k = _a.mobileMediaQuery, mobileMediaQuery = _k === void 0 ? '0px' : _k, rest = __rest(_a, ["children", "value", "onValueChange", "size", "isSeparatedMenu", "className", "disableSwipe", "tabletMediaQuery", "mobileMediaQuery"]);
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
- isMobile: "(min-width: " + mobileMediaQuery + ")",
34
- isTablet: "(min-width: " + tabletMediaQuery + ")",
35
- isNarrowDesktop: '(min-width: 992px)',
36
- isDesktop: "(min-width: 1200px)",
33
+ isMobileQuery: mobileMediaQuery,
34
+ isTabletQuery: tabletMediaQuery,
35
+ isNarrowDesktopQuery: narrowDesktopMediaQuery,
36
+ isDesktopQuery: desktopMediaQuery,
37
37
  };
38
- var _l = useResponsiveLayout({
38
+ var _p = useResponsiveLayout({
39
39
  customMediaQueries: customMediaQueries,
40
- }), isMobile = _l.isMobile, isTablet = _l.isTablet, isNarrowDesktop = _l.isNarrowDesktop, isDesktop = _l.isDesktop;
41
- var isTabletSideMenu = isTablet && !isNarrowDesktop;
42
- var isMobileSideMenu = isMobile && !isTablet;
43
- var isTabletOrMobileSideMenu = isTabletSideMenu || isMobileSideMenu;
44
- var isTouchScreenSideMenu = isTouchScreen() || isMobileSideMenu || isTabletSideMenu;
45
- var _m = useState(false), isMinimised = _m[0], setIsMinimised = _m[1];
46
- var _o = useState(false), hasScrollBar = _o[0], setHasScrollBar = _o[1];
47
- var _p = useState(false), isTransitioned = _p[0], setIsTransitioned = _p[1];
48
- var _q = useState('#2291ff'), productColor = _q[0], setProductColor = _q[1];
49
- var _r = useState(false), showWidget = _r[0], setShowWidget = _r[1];
50
- var _s = useState(value), activeMenuItem = _s[0], setActiveMenuItem = _s[1];
51
- var _t = useState(isDesktop || isNarrowDesktop), isShown = _t[0], setIsShown = _t[1];
52
- var _u = useState(false), separatedMenuIsShown = _u[0], setSeparatedMenuIsShown = _u[1];
53
- var _v = useState(false), mobileSeparatedMenuIsScrolling = _v[0], setMobileSeparatedMenuIsScrolling = _v[1];
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) {
@@ -59,22 +62,29 @@ var SideMenuInner = forwardRef(function (_a, ref) {
59
62
  };
60
63
  });
61
64
  useEffect(function () {
62
- if (isNarrowDesktop || isDesktop) {
65
+ if (isNarrowDesktop || isDesktopQuery) {
63
66
  setIsShown(true);
64
67
  }
65
- }, [isNarrowDesktop, isDesktop]);
68
+ if (isDesktopQuery) {
69
+ setIsMinimized(false);
70
+ }
71
+ if (isNarrowDesktop) {
72
+ setIsMinimized(true);
73
+ }
74
+ }, [isNarrowDesktop, isDesktopQuery]);
66
75
  useEffect(function () {
67
76
  setActiveMenuItem(value);
68
77
  }, [value]);
69
- var showMinimisedRoot = function () {
70
- if (isMinimised) {
71
- setIsTransitioned(true);
72
- setIsMinimised(false);
78
+ var showMinimizedRoot = function (newIsMinimized) {
79
+ var minimizeWithoutOverlay = separatedMenuWithoutOverlay && newIsMinimized;
80
+ if ((!isBeingTransitioned || minimizeWithoutOverlay) && newIsMinimized !== isMinimized) {
81
+ setIsBeingTransitioned(true);
82
+ setIsMinimized(newIsMinimized);
73
83
  if (transitionTimer) {
74
84
  clearTimeout(transitionTimer);
75
85
  }
76
86
  transitionTimer = setTimeout(function () {
77
- setIsTransitioned(false);
87
+ setIsBeingTransitioned(false);
78
88
  }, 1000);
79
89
  }
80
90
  };
@@ -94,6 +104,11 @@ var SideMenuInner = forwardRef(function (_a, ref) {
94
104
  }, 200);
95
105
  };
96
106
  var handleMouseEnter = function () {
107
+ if (separatedMenuWithoutOverlay && isSeparatedMenuShown && isNarrowDesktop) {
108
+ return;
109
+ }
110
+ isMouseOutside && showMinimizedRoot(false);
111
+ setIsMouseOutside(false);
97
112
  widgetTimer = setTimeout(function () {
98
113
  setShowWidget(true);
99
114
  }, 500);
@@ -103,68 +118,90 @@ var SideMenuInner = forwardRef(function (_a, ref) {
103
118
  clearTimeout(widgetTimer);
104
119
  }
105
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
+ }
106
135
  };
107
- var handleSwitchActiveItem = function (id) {
136
+ var switchActiveMenuItem = function (id) {
108
137
  if (id !== value) {
109
138
  onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(id);
110
139
  setActiveMenuItem(id);
111
140
  }
112
141
  };
113
142
  var toggleIsShown = function () {
114
- isTabletOrMobileSideMenu && setIsShown(!isShown);
143
+ isTabletOrMobile && setIsShown(!isShown);
115
144
  };
116
145
  var turnOffIsShown = function () {
117
- isTabletOrMobileSideMenu && setIsShown(false);
146
+ isTabletOrMobile && setIsShown(false);
118
147
  };
148
+ var isSideMenuOverContent = (isNarrowDesktop && !isMinimized) || (isMobile && isShown) || (isTablet && isShown && !isSeparatedMenuShown);
119
149
  return (React.createElement(SideMenuContext.Provider, { value: {
120
- isMinimised: isMinimised,
121
- isTransitioned: isTransitioned,
150
+ isMinimized: isMinimized,
151
+ setIsMinimized: showMinimizedRoot,
152
+ isBeingTransitioned: isBeingTransitioned,
122
153
  isSeparatedMenu: isSeparatedMenu,
123
154
  size: size,
124
155
  productColor: productColor,
125
156
  setProductColor: setProductColor,
126
157
  showWidget: showWidget,
127
158
  activeMenuItem: activeMenuItem,
128
- switchActiveMenuItem: handleSwitchActiveItem,
129
- isDesktop: isDesktop,
159
+ switchActiveMenuItem: switchActiveMenuItem,
160
+ isDesktop: isDesktopQuery,
130
161
  isNarrowDesktop: isNarrowDesktop,
131
- isTablet: isTabletSideMenu,
132
- isMobile: isMobileSideMenu,
133
- isTouchScreen: isTouchScreenSideMenu,
162
+ isTablet: isTablet,
163
+ isMobile: isMobile,
164
+ isTouchScreen: isTouchScreen,
134
165
  isShown: isShown,
135
166
  toggleIsShown: toggleIsShown,
136
- separatedMenuIsShown: separatedMenuIsShown,
137
- setSeparatedMenuIsShown: setSeparatedMenuIsShown,
138
- mobileSeparatedMenuIsScrolling: mobileSeparatedMenuIsScrolling,
139
- setMobileSeparatedMenuIsScrolling: setMobileSeparatedMenuIsScrolling,
167
+ isSeparatedMenuShown: isSeparatedMenuShown,
168
+ setIsSeparatedMenuShown: setIsSeparatedMenuShown,
169
+ separatedMenuWithoutOverlay: separatedMenuWithoutOverlay,
170
+ setIsMouseOutside: setIsMouseOutside,
171
+ isMobileSeparatedMenuScrolling: isMobileSeparatedMenuScrolling,
172
+ setIsMobileSeparatedMenuScrolling: setIsMobileSeparatedMenuScrolling,
140
173
  } },
141
- React.createElement(ZIndex, { priority: isTabletOrMobileSideMenu ? 'Sidepage' : 0, className: cx((_b = {},
142
- _b[jsStyles.sideMenuZIndex()] = true,
143
- _b[jsStyles.sideMenuZIndexForTabletsOrMobiles()] = isTabletOrMobileSideMenu,
144
- _b[jsStyles.shownSideMenuZIndexForTabletsOrMobiles()] = isShown && isTabletOrMobileSideMenu,
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,
145
181
  _b)) },
146
182
  React.createElement(React.Fragment, null,
147
- isTabletOrMobileSideMenu && isShown && React.createElement(Backdrop, null),
183
+ isTabletOrMobile && isShown && React.createElement(Backdrop, null),
148
184
  React.createElement(RenderLayer, { onClickOutside: turnOffIsShown },
149
185
  React.createElement("aside", __assign({ className: cx((_c = {},
150
- _c[jsStyles.rootWrapper()] = true,
151
- _c[jsStyles.rootWrapperIE()] = isIE11,
152
- _c), className), "data-tid": SideMenuDataTids.root, ref: ref }, rest, { onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave }),
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 }),
153
190
  React.createElement("div", { className: cx((_d = {},
154
- _d[jsStyles.root()] = true,
155
- _d[jsStyles.collapsedRootForTabletsOrMobiles()] = !isShown,
156
- _d[jsStyles.rootSafari()] = isSafari,
157
- _d[jsStyles.minimisedRoot()] = isMinimised,
158
- _d[jsStyles.rootWithInnerSubMenu()] = !isSeparatedMenu,
159
- _d[jsStyles.rootForTouchScreens()] = isTouchScreenSideMenu,
160
- _d[jsStyles.rootInSeparatedMenuForMobiles()] = isMobileSideMenu && separatedMenuIsShown && isShown,
161
- _d)), onMouseOver: showMinimisedRoot, onFocus: showMinimisedRoot, onScroll: handleScroll },
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 },
162
199
  React.createElement("div", { className: cx((_e = {},
163
- _e[jsStyles.rootInnerContainer()] = true,
164
- _e[jsStyles.rootInnerWithoutScrollBar()] = !hasScrollBar,
165
- _e[jsStyles.collapsedRootInnerForTabletsOrMobiles()] = !isShown || separatedMenuIsShown,
200
+ _e[jsStyles.contentWrapper()] = true,
201
+ _e[jsStyles.contentWrapperWithoutScrollBar()] = !hasScrollBar,
202
+ _e[jsStyles.collapsedContentWrapperForTabletsOrMobiles()] = !isShown || isSeparatedMenuShown,
166
203
  _e)) }, children)),
167
- !disableSwipe && isDesktop && React.createElement(RightBorder, { setIsMinimised: setIsMinimised })))))));
204
+ !disableSwipe && isDesktopQuery && !isSeparatedMenuShown && (React.createElement(RightBorder, { setIsMinimized: setIsMinimized }))))))));
168
205
  });
169
206
  SideMenuInner.displayName = 'SideMenu';
170
207
  var STATIC_PROPS = {
@@ -1,17 +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
- shownSideMenuZIndexForTabletsOrMobiles(): string;
5
6
  root(): string;
6
- rootSafari(): string;
7
- rootInnerWithoutScrollBar(): string;
8
- collapsedRootInnerForTabletsOrMobiles(): string;
9
- minimisedRoot(): string;
10
- rootWithInnerSubMenu(): string;
11
- rootForTouchScreens(): string;
12
- rootInSeparatedMenuForMobiles(): string;
13
- rootInnerContainer(): string;
14
- rootWrapper(): string;
15
- rootWrapperIE(): string;
16
- collapsedRootForTabletsOrMobiles(): string;
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;
17
25
  };