@skbkontur/side-menu 1.12.7 → 1.12.9-any-level.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.
Files changed (49) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +0 -9
  3. package/SideMenuDataTids.d.ts +1 -0
  4. package/SideMenuDataTids.js +1 -0
  5. package/hooks/useAnimateOnMount.js +3 -2
  6. package/lib/theming/ThemeHelpers.js +14 -3
  7. package/lib/utils/scripts.d.ts +1 -10
  8. package/lib/utils/scripts.js +0 -75
  9. package/package.json +2 -2
  10. package/src/Navigation.d.ts +47 -0
  11. package/src/Navigation.js +146 -0
  12. package/src/SideMenu/SideMenu.js +44 -31
  13. package/src/SideMenu/SideMenu.styles.d.ts +1 -0
  14. package/src/SideMenu/SideMenu.styles.js +5 -2
  15. package/src/SideMenuBody/SideMenuBody.js +7 -9
  16. package/src/SideMenuContext.d.ts +2 -7
  17. package/src/SideMenuDropdown/SideMenuDropdown.d.ts +1 -3
  18. package/src/SideMenuDropdown/SideMenuDropdown.js +1 -1
  19. package/src/SideMenuFooter/SideMenuFooter.js +3 -11
  20. package/src/SideMenuHeader/SideMenuHeader.js +3 -2
  21. package/src/SideMenuSubItem/SideMenuSubItem.js +3 -16
  22. package/src/SideMenuSubLink/SideMenuSubLink.js +4 -17
  23. package/src/Tree.d.ts +17 -0
  24. package/src/Tree.js +133 -0
  25. package/src/internal/BackButton.d.ts +0 -1
  26. package/src/internal/BackButton.js +3 -15
  27. package/src/internal/ClickableElement.d.ts +1 -5
  28. package/src/internal/ClickableElement.js +45 -44
  29. package/src/internal/InnerSubMenu.d.ts +1 -1
  30. package/src/internal/InnerSubMenu.js +10 -19
  31. package/src/internal/ItemContent/Caption.d.ts +2 -1
  32. package/src/internal/ItemContent/Caption.js +6 -5
  33. package/src/internal/ItemContent/ItemContent.d.ts +3 -1
  34. package/src/internal/ItemContent/ItemContent.js +6 -4
  35. package/src/internal/NestedMenu.d.ts +2 -2
  36. package/src/internal/NestedMenu.js +6 -16
  37. package/src/internal/SeparatedSubMenu.d.ts +2 -3
  38. package/src/internal/SeparatedSubMenu.js +9 -37
  39. package/src/internal/SideMenuLogotype.js +3 -3
  40. package/src/internal/SubMenu.d.ts +1 -4
  41. package/src/internal/SubMenu.js +8 -10
  42. package/hooks/useActiveState.d.ts +0 -1
  43. package/hooks/useActiveState.js +0 -12
  44. package/hooks/useOpenedState.d.ts +0 -2
  45. package/hooks/useOpenedState.js +0 -14
  46. package/hooks/useOpenedSubElementState.d.ts +0 -1
  47. package/hooks/useOpenedSubElementState.js +0 -12
  48. package/src/internal/InnerBody.d.ts +0 -14
  49. package/src/internal/InnerBody.js +0 -108
package/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
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.9](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@1.12.8...@skbkontur/side-menu@1.12.9) (2024-06-07)
7
+
8
+ **Note:** Version bump only for package @skbkontur/side-menu
9
+
10
+
11
+
12
+
13
+
14
+ ## [1.12.8](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@1.12.7...@skbkontur/side-menu@1.12.8) (2024-06-05)
15
+
16
+ **Note:** Version bump only for package @skbkontur/side-menu
17
+
18
+
19
+
20
+
21
+
6
22
  ## [1.12.7](https://git.skbkontur.ru/ui/ui-parking/compare/@skbkontur/side-menu@1.12.6...@skbkontur/side-menu@1.12.7) (2024-05-20)
7
23
 
8
24
  **Note:** Version bump only for package @skbkontur/side-menu
package/README.md CHANGED
@@ -328,15 +328,6 @@ const items = [
328
328
  </div>
329
329
  ```
330
330
 
331
- Если не хочется передавать свой `id`, то для ручного управления можно воспользоваться автоматически сгенерированными айдишниками. А также комбинировать свои `id` с автоматически сгенерированными.
332
-
333
- Автоматическая генерация айдишников происходит по следующей схеме:
334
- элементы меню первого уровня получают `id` равный `body-x`, где `x` - индекс элемента.
335
- Элементы меню следующих уровней добавляют свой индекс: `body-x-y`.
336
-
337
- Например, в пункте `Документы к подписанию` передан проп `id='documents'`, а также есть автоматически сгенерированный `id='body-0'`. Управлять можно по любому из них.
338
-
339
-
340
331
  ```jsx harmony
341
332
  import { useState } from 'react';
342
333
  import { getKonturAvatarUrl } from '@skbkontur/react-ui-addons';
@@ -4,4 +4,5 @@ export declare const SideMenuDataTids: {
4
4
  backButton: string;
5
5
  separatedSubMenu: string;
6
6
  rightBorder: string;
7
+ clickableElement: string;
7
8
  };
@@ -4,4 +4,5 @@ export var SideMenuDataTids = {
4
4
  backButton: 'SideMenu__backButton',
5
5
  separatedSubMenu: 'SideMenu__separatedSubMenu',
6
6
  rightBorder: 'SideMenu__rightBorder',
7
+ clickableElement: 'SideMenu__clickableElement',
7
8
  };
@@ -1,7 +1,8 @@
1
+ import { __read } from "tslib";
1
2
  import { useEffect, useState } from 'react';
2
3
  export function useAnimateOnMount(isMounted, delayTime, mountStyles, unmountStyles) {
3
- var _a = useState(isMounted ? mountStyles : unmountStyles), style = _a[0], setStyle = _a[1];
4
- var _b = useState(isMounted), shouldShowComponent = _b[0], setShouldShowComponent = _b[1];
4
+ var _a = __read(useState(isMounted ? mountStyles : unmountStyles), 2), style = _a[0], setStyle = _a[1];
5
+ var _b = __read(useState(isMounted), 2), shouldShowComponent = _b[0], setShouldShowComponent = _b[1];
5
6
  useEffect(function () {
6
7
  var timeoutId;
7
8
  if (isMounted) {
@@ -1,3 +1,4 @@
1
+ import { __values } from "tslib";
1
2
  import { isFunction } from '@skbkontur/react-ui/lib/utils';
2
3
  import { memo } from '../utils/memo';
3
4
  import { SideMenuThemeInternal, isSideMenuTheme, markAsSideMenuTheme } from '../../internal/themes/SideMenuTheme';
@@ -12,6 +13,7 @@ import { SideMenuThemeInternal, isSideMenuTheme, markAsSideMenuTheme } from '../
12
13
  * and using ReactUI's ThemeContext.Provider for overriding them.
13
14
  */
14
15
  export var createSideMenuTheme = function (theme) {
16
+ var e_1, _a;
15
17
  if (isSideMenuTheme(theme))
16
18
  return theme;
17
19
  var sideMenuTheme = Object.create(theme, Object.assign(Object.getOwnPropertyDescriptors(SideMenuThemeInternal), {}));
@@ -28,9 +30,18 @@ export var createSideMenuTheme = function (theme) {
28
30
  },
29
31
  });
30
32
  };
31
- for (var _i = 0, _a = Object.keys(sideMenuTheme); _i < _a.length; _i++) {
32
- var key = _a[_i];
33
- _loop_1(key);
33
+ try {
34
+ for (var _b = __values(Object.keys(sideMenuTheme)), _c = _b.next(); !_c.done; _c = _b.next()) {
35
+ var key = _c.value;
36
+ _loop_1(key);
37
+ }
38
+ }
39
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
40
+ finally {
41
+ try {
42
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
43
+ }
44
+ finally { if (e_1) throw e_1.error; }
34
45
  }
35
46
  return markAsSideMenuTheme(sideMenuTheme);
36
47
  };
@@ -1,13 +1,4 @@
1
- import React, { ReactElement } from 'react';
2
- import { FlattedArrayElementType } from '../../src/internal/InnerBody';
3
- export declare const getItemId: (prefix: 'body' | 'footer', id: string | number) => string;
4
- export declare const isClickableSubElement: (element: string) => boolean;
5
- export declare const isClickableElement: (element: string) => boolean;
6
- export declare const getAllParents: (id: string, flattedArrayOfAllElements: FlattedArrayElementType[]) => string[];
7
- export declare const getChildrenIdArray: (childrenArray: FlattedArrayElementType[], id: string, isIdGenerated?: boolean) => string[];
8
- export declare const getElementsChildren: (element: ReactElement, levelIndex: string) => FlattedArrayElementType[];
9
- export declare const isParentOpened: (id: string | undefined, generatedId: string | undefined, openedParents: string[] | undefined) => boolean | "" | undefined;
10
- export declare const isElementActive: (id: string | undefined, activeMenuItem: string | undefined | null) => boolean;
1
+ import React from 'react';
11
2
  export declare const isBrowser: boolean;
12
3
  export declare const isTouchDevice: () => boolean;
13
4
  export declare const isKonturIcon: (icon: React.ReactElement) => boolean;
@@ -1,78 +1,3 @@
1
- import React, { isValidElement } from 'react';
2
- import { isNonNullable } from '@skbkontur/react-ui/lib/utils';
3
- export var getItemId = function (prefix, id) {
4
- return prefix + "-" + id;
5
- };
6
- var SideMenuClickableSubElements = ['SideMenuSubItem', 'SideMenuSubLink'];
7
- export var isClickableSubElement = function (element) {
8
- return SideMenuClickableSubElements.includes(element);
9
- };
10
- var SideMenuClickableElements = ['SideMenuItem', 'SideMenuLink'];
11
- export var isClickableElement = function (element) {
12
- return SideMenuClickableElements.includes(element);
13
- };
14
- export var getAllParents = function (id, flattedArrayOfAllElements) {
15
- var parentsArray = [];
16
- var element = flattedArrayOfAllElements.find(function (element) { return element.id === id || element.generatedId === id; });
17
- if (element && element.id && isNonNullable(element.parentId)) {
18
- parentsArray.push(element.parentId);
19
- parentsArray.push.apply(parentsArray, getAllParents(element.parentId, flattedArrayOfAllElements));
20
- }
21
- else if (element && isNonNullable(element.generatedParentId)) {
22
- parentsArray.push(element.generatedParentId);
23
- parentsArray.push.apply(parentsArray, getAllParents(element.generatedParentId, flattedArrayOfAllElements));
24
- }
25
- return parentsArray;
26
- };
27
- export var getChildrenIdArray = function (childrenArray, id, isIdGenerated) {
28
- if (isIdGenerated === void 0) { isIdGenerated = false; }
29
- var parentId = isIdGenerated ? 'generatedParentId' : 'parentId';
30
- var childId = isIdGenerated ? 'generatedId' : 'id';
31
- return childrenArray.filter(function (el) { return el[parentId] === id; }).map(function (el) { return el[childId]; });
32
- };
33
- export var getElementsChildren = function (element, levelIndex) {
34
- var childrenArray = [];
35
- if (element.props.children) {
36
- var childLevelIndex_1 = 0;
37
- React.Children.map(element.props.children, function (child) {
38
- var _a, _b;
39
- var isClickableComponent =
40
- // @ts-expect-error: accessing private property
41
- isClickableElement((_a = child === null || child === void 0 ? void 0 : child.type) === null || _a === void 0 ? void 0 : _a.__KONTUR_REACT_UI__) ||
42
- // @ts-expect-error: accessing private property
43
- isClickableSubElement((_b = child === null || child === void 0 ? void 0 : child.type) === null || _b === void 0 ? void 0 : _b.__KONTUR_REACT_UI__);
44
- if (isValidElement(child) && isClickableComponent) {
45
- var id = child.props.id;
46
- var generatedId = levelIndex + "-" + childLevelIndex_1;
47
- var subChildrenArray = getElementsChildren(child, levelIndex + "-" + childLevelIndex_1);
48
- var childrenIdArray = getChildrenIdArray(subChildrenArray, id);
49
- var generatedChildrenIdArray = getChildrenIdArray(subChildrenArray, generatedId, true);
50
- childrenArray.push({
51
- id: id || child.props.href,
52
- generatedId: generatedId,
53
- parentId: element.props.id || element.props.href,
54
- generatedParentId: "" + levelIndex,
55
- childrenId: childrenIdArray,
56
- generatedChildrenId: generatedChildrenIdArray,
57
- });
58
- childrenArray.push.apply(childrenArray, subChildrenArray);
59
- childLevelIndex_1++;
60
- }
61
- });
62
- }
63
- return childrenArray;
64
- };
65
- export var isParentOpened = function (id, generatedId, openedParents) {
66
- if (!openedParents || (openedParents === null || openedParents === void 0 ? void 0 : openedParents.length) === 0) {
67
- return false;
68
- }
69
- var idIsOpened = id && openedParents.includes(id);
70
- var generatedIdIsOpened = generatedId && openedParents.includes(generatedId);
71
- return idIsOpened || generatedIdIsOpened;
72
- };
73
- export var isElementActive = function (id, activeMenuItem) {
74
- return !!id && !!activeMenuItem && id === activeMenuItem;
75
- };
76
1
  export var isBrowser = typeof window !== 'undefined';
77
2
  export var isTouchDevice = function () {
78
3
  return isBrowser && ('ontouchstart' in window || navigator.maxTouchPoints > 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skbkontur/side-menu",
3
- "version": "1.12.7",
3
+ "version": "1.12.9-any-level.0",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@skbkontur/icons": "^1.10.0",
26
- "@skbkontur/react-ui-addons": "^4.11.0",
26
+ "@skbkontur/react-ui-addons": "^4.11.2",
27
27
  "tslib": "^1"
28
28
  }
29
29
  }
@@ -0,0 +1,47 @@
1
+ import { RefObject } from 'react';
2
+ import { Tree, TreeNode } from './Tree';
3
+ export interface NavigableElement {
4
+ setIsActive: (value: boolean) => void;
5
+ setIsOpened: (value: boolean) => void;
6
+ setIsNestedSubMenu: (value: boolean) => void;
7
+ setHasSubIcons: (value: boolean) => void;
8
+ setIsFirstLevelParentOfActiveMenuItem: (value: boolean) => void;
9
+ isSubMenu?: boolean;
10
+ }
11
+ interface MenuNavigationOptions {
12
+ root: RefObject<HTMLDivElement> | null;
13
+ activeMenuItem?: string;
14
+ setActiveMenuItem: (id: string) => void;
15
+ isSeparatedMenu: boolean;
16
+ isSeparatedMenuShown: boolean;
17
+ setIsSeparatedMenuShown: (value: boolean) => void;
18
+ isOpened?: boolean;
19
+ isDesktopQuery?: boolean;
20
+ isMobile?: boolean;
21
+ isCollapsable?: boolean;
22
+ }
23
+ export declare class MenuNavigation {
24
+ private readonly root;
25
+ navigationTree: Tree | null;
26
+ activeMenuItem?: string;
27
+ isSeparatedMenuShown?: boolean;
28
+ setIsSeparatedMenuShown?: (value: boolean) => void;
29
+ private readonly setActiveMenuItem?;
30
+ private readonly isSeparatedMenu;
31
+ activeMenuItemTreeNode?: TreeNode;
32
+ private readonly isOpened?;
33
+ private readonly isDesktop?;
34
+ private readonly isMobile?;
35
+ private readonly isCollapsable?;
36
+ constructor(options: MenuNavigationOptions);
37
+ updateNavigationTree(): void;
38
+ addValue(id: string, value: NavigableElement): void;
39
+ switchActiveMenuItem(id?: string, isButton?: boolean): void;
40
+ private setActiveFirstLevelMenuItemInSeparatedMenu;
41
+ private setHighlightedFirstLevelMenuItemInMinimizedInnerMenu;
42
+ private openMenuItems;
43
+ private openAllParents;
44
+ private getParentId;
45
+ private switchVisibilityOfSeparatedMenu;
46
+ }
47
+ export {};
@@ -0,0 +1,146 @@
1
+ import { __read, __spread } from "tslib";
2
+ import { SideMenuDataTids } from '../SideMenuDataTids';
3
+ import { Tree } from './Tree';
4
+ var MENU_ROOT_ID = 'menu-root-id';
5
+ var MenuNavigation = /** @class */ (function () {
6
+ function MenuNavigation(options) {
7
+ this.navigationTree = null;
8
+ this.navigationTree = new Tree(MENU_ROOT_ID);
9
+ this.activeMenuItemTreeNode = this.navigationTree.find(options.activeMenuItem);
10
+ this.root = options.root;
11
+ this.activeMenuItem = options.activeMenuItem;
12
+ this.setActiveMenuItem = options.setActiveMenuItem;
13
+ this.isSeparatedMenu = options.isSeparatedMenu;
14
+ this.isSeparatedMenuShown = options.isSeparatedMenuShown;
15
+ this.setIsSeparatedMenuShown = options.setIsSeparatedMenuShown;
16
+ this.isOpened = options.isOpened;
17
+ this.isDesktop = options.isDesktopQuery;
18
+ this.isMobile = options.isMobile;
19
+ this.isCollapsable = options.isCollapsable;
20
+ }
21
+ MenuNavigation.prototype.updateNavigationTree = function () {
22
+ var _this = this;
23
+ var _a;
24
+ if ((_a = this.root) === null || _a === void 0 ? void 0 : _a.current) {
25
+ var menuItems = Array.from(this.root.current.querySelectorAll("[data-tid=\"SideMenu__clickableElement\"]")).filter(function (item) { return !item.querySelector('button[data-tid="SideMenu__backButton"]'); });
26
+ menuItems.forEach(function (menuItem) {
27
+ var _a, _b, _c;
28
+ var id = menuItem.getAttribute('data-navigation-id');
29
+ var parentId = _this.getParentId(menuItem);
30
+ var oldValue = (_b = (_a = _this.navigationTree) === null || _a === void 0 ? void 0 : _a.find(id)) === null || _b === void 0 ? void 0 : _b.value;
31
+ (_c = _this.navigationTree) === null || _c === void 0 ? void 0 : _c.insert(parentId, id, oldValue);
32
+ });
33
+ }
34
+ };
35
+ MenuNavigation.prototype.addValue = function (id, value) {
36
+ var _a, _b, _c;
37
+ this.updateNavigationTree();
38
+ var foundTreeNode = (_a = this.navigationTree) === null || _a === void 0 ? void 0 : _a.find(id);
39
+ if (foundTreeNode) {
40
+ foundTreeNode.value = value;
41
+ }
42
+ if ((foundTreeNode === null || foundTreeNode === void 0 ? void 0 : foundTreeNode.parent) && foundTreeNode.parent.parent && foundTreeNode.parent.parent.id !== MENU_ROOT_ID) {
43
+ (_b = foundTreeNode.value) === null || _b === void 0 ? void 0 : _b.setIsNestedSubMenu(true);
44
+ }
45
+ if (this.isSeparatedMenu && (foundTreeNode === null || foundTreeNode === void 0 ? void 0 : foundTreeNode.hasChildren)) {
46
+ (_c = foundTreeNode.value) === null || _c === void 0 ? void 0 : _c.setHasSubIcons(true);
47
+ }
48
+ };
49
+ MenuNavigation.prototype.switchActiveMenuItem = function (id, isButton) {
50
+ var _a, _b, _c, _d;
51
+ !isButton &&
52
+ __spread((_a = this.navigationTree) === null || _a === void 0 ? void 0 : _a.preOrderTraversal()).map(function (x) {
53
+ var _a;
54
+ (_a = x.value) === null || _a === void 0 ? void 0 : _a.setIsActive(false);
55
+ });
56
+ var foundTreeNode = (_b = this.navigationTree) === null || _b === void 0 ? void 0 : _b.find(id);
57
+ if (foundTreeNode) {
58
+ if (!isButton) {
59
+ this.activeMenuItem = foundTreeNode.id;
60
+ this.activeMenuItemTreeNode = foundTreeNode;
61
+ (_c = this.setActiveMenuItem) === null || _c === void 0 ? void 0 : _c.call(this, foundTreeNode.id);
62
+ this.isSeparatedMenu && this.setActiveFirstLevelMenuItemInSeparatedMenu(foundTreeNode);
63
+ this.setHighlightedFirstLevelMenuItemInMinimizedInnerMenu(foundTreeNode);
64
+ (_d = foundTreeNode.value) === null || _d === void 0 ? void 0 : _d.setIsActive(true);
65
+ }
66
+ this.isSeparatedMenu && this.switchVisibilityOfSeparatedMenu();
67
+ this.openMenuItems(foundTreeNode);
68
+ }
69
+ };
70
+ MenuNavigation.prototype.setActiveFirstLevelMenuItemInSeparatedMenu = function (treeNode) {
71
+ var _a;
72
+ var parentTreeNode = treeNode.parent;
73
+ while (parentTreeNode) {
74
+ var foundNode = parentTreeNode.parent;
75
+ if ((foundNode === null || foundNode === void 0 ? void 0 : foundNode.id) === MENU_ROOT_ID) {
76
+ break;
77
+ }
78
+ parentTreeNode = foundNode;
79
+ }
80
+ (_a = parentTreeNode === null || parentTreeNode === void 0 ? void 0 : parentTreeNode.value) === null || _a === void 0 ? void 0 : _a.setIsFirstLevelParentOfActiveMenuItem(true);
81
+ };
82
+ MenuNavigation.prototype.setHighlightedFirstLevelMenuItemInMinimizedInnerMenu = function (treeNode) {
83
+ var _a, _b;
84
+ __spread((_a = this.navigationTree) === null || _a === void 0 ? void 0 : _a.preOrderTraversal()).map(function (x) {
85
+ var _a;
86
+ (_a = x.value) === null || _a === void 0 ? void 0 : _a.setIsFirstLevelParentOfActiveMenuItem(false);
87
+ });
88
+ var parentTreeNode = treeNode.parent;
89
+ while (parentTreeNode) {
90
+ var foundNode = parentTreeNode.parent;
91
+ if ((foundNode === null || foundNode === void 0 ? void 0 : foundNode.id) === MENU_ROOT_ID) {
92
+ break;
93
+ }
94
+ parentTreeNode = foundNode;
95
+ }
96
+ (_b = parentTreeNode === null || parentTreeNode === void 0 ? void 0 : parentTreeNode.value) === null || _b === void 0 ? void 0 : _b.setIsFirstLevelParentOfActiveMenuItem(true);
97
+ };
98
+ MenuNavigation.prototype.openMenuItems = function (treeNode) {
99
+ var _a, _b, _c;
100
+ !((_a = treeNode.value) === null || _a === void 0 ? void 0 : _a.isSubMenu) && __spread((_b = this.navigationTree) === null || _b === void 0 ? void 0 : _b.preOrderTraversal()).map(function (x) { var _a; return (_a = x.value) === null || _a === void 0 ? void 0 : _a.setIsOpened(false); });
101
+ if (treeNode.children.length > 0) {
102
+ (_c = treeNode.value) === null || _c === void 0 ? void 0 : _c.setIsOpened(true);
103
+ }
104
+ this.openAllParents(treeNode);
105
+ };
106
+ MenuNavigation.prototype.openAllParents = function (treeNode) {
107
+ var _a;
108
+ var parentTreeNode = treeNode.parent;
109
+ while (parentTreeNode && parentTreeNode.id !== MENU_ROOT_ID) {
110
+ (_a = parentTreeNode.value) === null || _a === void 0 ? void 0 : _a.setIsOpened(true);
111
+ parentTreeNode = parentTreeNode.parent;
112
+ }
113
+ };
114
+ MenuNavigation.prototype.getParentId = function (menuItem) {
115
+ var _a, _b, _c;
116
+ var parentElement;
117
+ var clickableElementSelector = "[data-tid=" + SideMenuDataTids.clickableElement + "]";
118
+ var separatedMenuSelector = "[data-tid=" + SideMenuDataTids.separatedSubMenu + "]";
119
+ parentElement = (_a = menuItem.parentElement) === null || _a === void 0 ? void 0 : _a.closest(clickableElementSelector);
120
+ if (!parentElement) {
121
+ var separatedMenu = menuItem.closest(separatedMenuSelector);
122
+ if (separatedMenu) {
123
+ var firstLevelMenuId = separatedMenu.getAttribute('data-parent-navigation-id');
124
+ parentElement = (_c = (_b = this.root) === null || _b === void 0 ? void 0 : _b.current) === null || _c === void 0 ? void 0 : _c.querySelector("[data-navigation-id=\"" + firstLevelMenuId + "\"]");
125
+ }
126
+ }
127
+ return (parentElement === null || parentElement === void 0 ? void 0 : parentElement.getAttribute('data-navigation-id')) || MENU_ROOT_ID;
128
+ };
129
+ MenuNavigation.prototype.switchVisibilityOfSeparatedMenu = function () {
130
+ var _a, _b, _c, _d, _e;
131
+ if (!this.isSeparatedMenu)
132
+ return;
133
+ var activeItemHasParent = (_b = (_a = this.activeMenuItemTreeNode) === null || _a === void 0 ? void 0 : _a.value) === null || _b === void 0 ? void 0 : _b.isSubMenu;
134
+ var activeMenuItemHasChildren = (_c = this.activeMenuItemTreeNode) === null || _c === void 0 ? void 0 : _c.hasChildren;
135
+ var isActive = activeItemHasParent || activeMenuItemHasChildren || false;
136
+ var isMinimizedInWideDesktop = !this.isOpened && this.isDesktop && !this.isCollapsable;
137
+ if (this.isMobile && !activeItemHasParent && this.isSeparatedMenuShown) {
138
+ this.isSeparatedMenuShown = false;
139
+ return (_d = this.setIsSeparatedMenuShown) === null || _d === void 0 ? void 0 : _d.call(this, false);
140
+ }
141
+ this.isSeparatedMenuShown = isActive && !isMinimizedInWideDesktop;
142
+ (_e = this.setIsSeparatedMenuShown) === null || _e === void 0 ? void 0 : _e.call(this, this.isSeparatedMenuShown);
143
+ };
144
+ return MenuNavigation;
145
+ }());
146
+ export { MenuNavigation };
@@ -1,4 +1,4 @@
1
- import { __assign, __rest } from "tslib";
1
+ import { __assign, __read, __rest } from "tslib";
2
2
  import React, { forwardRef, useContext, useEffect, useRef, useState } from 'react';
3
3
  import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
4
4
  import { isIE11 } from '@skbkontur/react-ui/lib/client';
@@ -27,15 +27,18 @@ import { ZIndex } from '@skbkontur/react-ui/internal/ZIndex';
27
27
  import { useAnimateOnMount } from '../../hooks/useAnimateOnMount';
28
28
  import { getSideMenuTheme } from '../../lib/theming/ThemeHelpers';
29
29
  import { mergeRefs } from '@skbkontur/react-ui/lib/utils';
30
+ import { MenuNavigation } from '../Navigation';
30
31
  export var transitionDuration = 300; //ms
31
32
  export var burgerTransitionDuration = (transitionDuration * 2) / 3;
32
33
  var SideMenuInner = forwardRef(function (_a, ref) {
33
34
  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 ? 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
+ var _f;
36
+ var children = _a.children, value = _a.value, onValueChange = _a.onValueChange, _g = _a.size, size = _g === void 0 ? 'small' : _g, _h = _a.isSeparatedMenu, isSeparatedMenu = _h === void 0 ? false : _h, className = _a.className, _j = _a.disableSwipe, disableSwipe = _j === void 0 ? false : _j, _k = _a.disableCollapsing, disableCollapsing = _k === void 0 ? false : _k, desktopMediaQuery = _a.desktopMediaQuery, narrowDesktopMediaQuery = _a.narrowDesktopMediaQuery, tabletMediaQuery = _a.tabletMediaQuery, mobileMediaQuery = _a.mobileMediaQuery, _l = _a.hideScrollBar, hideScrollBar = _l === void 0 ? undefined : _l, _m = _a.showScrollBar, showScrollBar = _m === void 0 ? 'hover' : _m, 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
37
  var transitionTimer = useRef(null);
36
38
  var sideMenuRef = useRef(null);
37
39
  var contentWrapperRef = useRef(null);
38
40
  var scrollContainerRef = useRef(null);
41
+ var navigation = useRef(null);
39
42
  var theme = getSideMenuTheme(useContext(ThemeContext));
40
43
  var customMediaQueries = {
41
44
  isMobileQuery: mobileMediaQuery || theme.sideMenuMobileMediaQuery,
@@ -43,31 +46,49 @@ var SideMenuInner = forwardRef(function (_a, ref) {
43
46
  isNarrowDesktopQuery: narrowDesktopMediaQuery || theme.sideMenuNarrowDesktopMediaQuery,
44
47
  isDesktopQuery: desktopMediaQuery || theme.sideMenuDesktopMediaQuery,
45
48
  };
46
- var _m = useResponsiveLayout({
49
+ var _o = useResponsiveLayout({
47
50
  customMediaQueries: customMediaQueries,
48
- }), isMobileQuery = _m.isMobileQuery, isTabletQuery = _m.isTabletQuery, isNarrowDesktopQuery = _m.isNarrowDesktopQuery, isDesktopQuery = _m.isDesktopQuery;
51
+ }), isMobileQuery = _o.isMobileQuery, isTabletQuery = _o.isTabletQuery, isNarrowDesktopQuery = _o.isNarrowDesktopQuery, isDesktopQuery = _o.isDesktopQuery;
49
52
  var isNarrowDesktop = isNarrowDesktopQuery && !isDesktopQuery;
50
53
  var isTablet = isTabletQuery && !isNarrowDesktopQuery;
51
54
  var isMobile = isMobileQuery && !isTabletQuery;
52
55
  var isTabletOrMobile = isTablet || isMobile;
53
56
  var isTouchScreen = isTouchDevice() || isMobile || isTablet;
54
57
  var manual = isOpen !== undefined;
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];
58
+ var _p = __read(useState(isDesktopQuery), 2), isOpened = _p[0], setIsOpened = _p[1];
59
+ var _q = __read(useState(false), 2), isBeingTransitioned = _q[0], setIsBeingTransitioned = _q[1];
60
+ var _r = __read(useState(value), 2), activeMenuItem = _r[0], setActiveMenuItem = _r[1];
61
+ var _s = __read(useState(null), 2), clickedButton = _s[0], setClickedButton = _s[1];
62
+ var _t = __read(useState(false), 2), isSeparatedMenuShown = _t[0], setIsSeparatedMenuShown = _t[1];
63
+ var _u = __read(useState(true), 2), isMouseOutside = _u[0], setIsMouseOutside = _u[1];
64
+ var _v = __read(useState('top'), 2), scrollState = _v[0], setScrollState = _v[1];
65
+ var _w = __read(useState(false), 2), hasScrollBar = _w[0], setHasScrollBar = _w[1];
66
+ var _x = __read(useState(0), 2), mousePositionX = _x[0], setMousePositionX = _x[1];
67
+ var _y = __read(useState(0), 2), headerHeight = _y[0], setHeaderHeight = _y[1];
68
+ var _z = __read(useState(isNarrowDesktop), 2), isCollapsable = _z[0], setIsCollapsable = _z[1];
69
+ var _0 = __read(useState(0), 2), leftPosition = _0[0], setLeftPosition = _0[1];
70
+ var _1 = __read(useState(false), 2), isHovered = _1[0], setIsHovered = _1[1];
71
+ var switchActiveMenuItem = function (id) {
72
+ if (id !== value) {
73
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(id);
74
+ setActiveMenuItem(id);
75
+ }
76
+ };
68
77
  useEffect(function () {
69
78
  var _a;
70
79
  setLeftPosition(((_a = sideMenuRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left) || 0);
80
+ navigation.current = new MenuNavigation({
81
+ root: sideMenuRef,
82
+ activeMenuItem: activeMenuItem,
83
+ setActiveMenuItem: switchActiveMenuItem,
84
+ isSeparatedMenu: isSeparatedMenu,
85
+ isSeparatedMenuShown: isSeparatedMenuShown,
86
+ setIsSeparatedMenuShown: setIsSeparatedMenuShown,
87
+ isOpened: isOpened,
88
+ isDesktopQuery: isDesktopQuery,
89
+ isMobile: isMobile,
90
+ isCollapsable: isCollapsable,
91
+ });
71
92
  return function () {
72
93
  if (transitionTimer.current) {
73
94
  clearTimeout(transitionTimer.current);
@@ -108,8 +129,9 @@ var SideMenuInner = forwardRef(function (_a, ref) {
108
129
  isNarrowDesktop && setIsCollapsable(true);
109
130
  }, [isNarrowDesktop, isDesktopQuery, isTablet, isMobile]);
110
131
  useEffect(function () {
111
- setActiveMenuItem(value);
112
- }, [value]);
132
+ var _a;
133
+ (_a = navigation.current) === null || _a === void 0 ? void 0 : _a.switchActiveMenuItem(value);
134
+ }, [value, (_f = navigation.current) === null || _f === void 0 ? void 0 : _f.navigationTree]);
113
135
  useEffect(function () {
114
136
  handleIsOpened(isOpen, manual);
115
137
  }, [isOpen]);
@@ -157,12 +179,6 @@ var SideMenuInner = forwardRef(function (_a, ref) {
157
179
  }
158
180
  setMousePositionX(relativeXCoordinate);
159
181
  };
160
- var switchActiveMenuItem = function (id) {
161
- if (id !== value) {
162
- onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(id);
163
- setActiveMenuItem(id);
164
- }
165
- };
166
182
  var showMenu = function (newIsShown) {
167
183
  if (!isTabletOrMobile)
168
184
  return;
@@ -178,11 +194,11 @@ var SideMenuInner = forwardRef(function (_a, ref) {
178
194
  }
179
195
  };
180
196
  var isSideMenuOverContent = (isCollapsable || isMobile || (isTablet && !isSeparatedMenuShown)) && isOpened;
181
- var _1 = useAnimateOnMount(!!isTabletOrMobile && !!isOpened, burgerTransitionDuration, {
197
+ var _2 = __read(useAnimateOnMount(!!isTabletOrMobile && !!isOpened, burgerTransitionDuration, {
182
198
  opacity: DEFAULT_THEME.sidePageBackingBgOpacity,
183
199
  }, {
184
200
  opacity: 0,
185
- }), shouldShowBackdrop = _1[0], backdropStyle = _1[1];
201
+ }), 2), shouldShowBackdrop = _2[0], backdropStyle = _2[1];
186
202
  var isSideMenuOverflowing = (isTabletOrMobile || isCollapsable) && isOpened;
187
203
  var setScrollBar = function () {
188
204
  var isSeparatedMenuShownInMobile = isMobile && isSeparatedMenuShown;
@@ -208,8 +224,6 @@ var SideMenuInner = forwardRef(function (_a, ref) {
208
224
  isBeingTransitioned: isBeingTransitioned,
209
225
  isSeparatedMenu: isSeparatedMenu,
210
226
  size: size,
211
- activeMenuItem: activeMenuItem,
212
- switchActiveMenuItem: switchActiveMenuItem,
213
227
  clickedButton: clickedButton,
214
228
  setClickedButton: setClickedButton,
215
229
  isDesktop: isDesktopQuery,
@@ -217,8 +231,6 @@ var SideMenuInner = forwardRef(function (_a, ref) {
217
231
  isTablet: isTablet,
218
232
  isMobile: isMobile,
219
233
  isTouchScreen: isTouchScreen,
220
- isSeparatedMenuShown: isSeparatedMenuShown,
221
- setIsSeparatedMenuShown: setIsSeparatedMenuShown,
222
234
  setIsMouseOutside: setIsMouseOutside,
223
235
  scrollState: scrollState,
224
236
  setScrollState: setScrollState,
@@ -229,6 +241,7 @@ var SideMenuInner = forwardRef(function (_a, ref) {
229
241
  hideScrollBar: hideScrollBar,
230
242
  showScrollBar: showScrollBar,
231
243
  sideMenuRef: sideMenuRef,
244
+ navigation: navigation.current,
232
245
  } },
233
246
  (isOpened || isBeingTransitioned) && isTabletOrMobile && React.createElement("div", { style: { height: headerHeight } }),
234
247
  React.createElement(ZIndex, { priority: isSideMenuOverflowing ? 8 : 0, className: cx((_b = {},
@@ -23,4 +23,5 @@ export declare const jsStylesForSideMenu: {
23
23
  wrapperWithShadow(t: SideMenuTheme): string;
24
24
  collapsedContainerForTabletsOrMobiles(): string;
25
25
  list(): string;
26
+ hidden(): string;
26
27
  };
@@ -64,11 +64,14 @@ var styles = {
64
64
  list: function () {
65
65
  return css(templateObject_20 || (templateObject_20 = __makeTemplateObject(["\n list-style: none;\n padding: 0;\n margin: 0;\n "], ["\n list-style: none;\n padding: 0;\n margin: 0;\n "])));
66
66
  },
67
+ hidden: function () {
68
+ return css(templateObject_21 || (templateObject_21 = __makeTemplateObject(["\n display: none;\n "], ["\n display: none;\n "])));
69
+ },
67
70
  };
68
71
  export var customStyles = {
69
72
  rootForTabletsOrMobiles: function (headerHeight) {
70
- return css(templateObject_21 || (templateObject_21 = __makeTemplateObject(["\n height: ", "px;\n top: 0;\n transition: height ", "ms ease-out;\n "], ["\n height: ", "px;\n top: 0;\n transition: height ", "ms ease-out;\n "])), headerHeight, burgerTransitionDuration);
73
+ return css(templateObject_22 || (templateObject_22 = __makeTemplateObject(["\n height: ", "px;\n top: 0;\n transition: height ", "ms ease-out;\n "], ["\n height: ", "px;\n top: 0;\n transition: height ", "ms ease-out;\n "])), headerHeight, burgerTransitionDuration);
71
74
  },
72
75
  };
73
76
  export var jsStylesForSideMenu = memoizeStyle(styles);
74
- var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9, templateObject_10, templateObject_11, templateObject_12, templateObject_13, templateObject_14, templateObject_15, templateObject_16, templateObject_17, templateObject_18, templateObject_19, templateObject_20, templateObject_21;
77
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9, templateObject_10, templateObject_11, templateObject_12, templateObject_13, templateObject_14, templateObject_15, templateObject_16, templateObject_17, templateObject_18, templateObject_19, templateObject_20, templateObject_21, templateObject_22;
@@ -3,22 +3,20 @@ import React, { forwardRef, useContext } from 'react';
3
3
  import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
4
4
  import { ThemeContext } from '@skbkontur/react-ui/lib/theming/ThemeContext';
5
5
  import { jsStyles } from './SideMenuBody.styles';
6
- import { InnerBody } from '../internal/InnerBody';
7
6
  import { SideMenuContext } from '../SideMenuContext';
8
7
  import { getSideMenuTheme } from '../../lib/theming/ThemeHelpers';
9
8
  import { jsStylesForSideMenu } from '../SideMenu/SideMenu.styles';
10
9
  var SideMenuBodyInner = forwardRef(function (_a, ref) {
11
- var _b;
10
+ var _b, _c;
12
11
  var className = _a.className, children = _a.children, rest = __rest(_a, ["className", "children"]);
13
12
  var context = useContext(SideMenuContext);
14
13
  var theme = getSideMenuTheme(useContext(ThemeContext));
15
- if (!(context.isMobile || context.isTablet) || (context.isOpened && (context.isMobile || context.isTablet))) {
16
- return (React.createElement("div", { ref: ref, className: cx(jsStyles.root(theme), className) },
17
- React.createElement("nav", null,
18
- React.createElement("ul", __assign({ className: cx((_b = {}, _b[jsStylesForSideMenu.list()] = true, _b[jsStyles.wrapper(theme)] = true, _b)) }, rest),
19
- React.createElement(InnerBody, null, children)))));
20
- }
21
- return null;
14
+ return (React.createElement("div", { ref: ref, className: cx((_b = {},
15
+ _b[jsStyles.root(theme)] = true,
16
+ _b[jsStylesForSideMenu.hidden()] = !context.isOpened && (context.isMobile || context.isTablet),
17
+ _b)) },
18
+ React.createElement("nav", null,
19
+ React.createElement("ul", __assign({ className: cx((_c = {}, _c[jsStylesForSideMenu.list()] = true, _c[jsStyles.wrapper(theme)] = true, _c)) }, rest), children))));
22
20
  });
23
21
  SideMenuBodyInner.displayName = 'SideMenuBody';
24
22
  /**