@skbkontur/side-menu 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +13 -6
  3. package/hooks/UseMemoIcon.d.ts +2 -0
  4. package/hooks/UseMemoIcon.js +14 -0
  5. package/hooks/useActiveState.d.ts +1 -0
  6. package/hooks/useActiveState.js +12 -0
  7. package/hooks/useOpenedState.d.ts +2 -0
  8. package/hooks/useOpenedState.js +11 -0
  9. package/hooks/useOpenedSubElementState.d.ts +1 -0
  10. package/hooks/useOpenedSubElementState.js +12 -0
  11. package/index.d.ts +13 -11
  12. package/index.js +13 -11
  13. package/package.json +1 -1
  14. package/src/SideMenu/SideMenu.d.ts +42 -0
  15. package/src/{SideMenu.js → SideMenu/SideMenu.js} +33 -27
  16. package/src/SideMenu/SideMenu.md +0 -0
  17. package/src/SideMenu.styles.d.ts +3 -1
  18. package/src/SideMenu.styles.js +60 -54
  19. package/src/SideMenuAvatar/SideMenuAvatar.d.ts +13 -0
  20. package/src/{SideMenuAvatar.js → SideMenuAvatar/SideMenuAvatar.js} +9 -10
  21. package/src/SideMenuAvatar/SideMenuAvatar.md +0 -0
  22. package/src/SideMenuBody/SideMenuBody.d.ts +13 -0
  23. package/src/{SideMenuBody.js → SideMenuBody/SideMenuBody.js} +10 -11
  24. package/src/SideMenuBody/SideMenuBody.md +0 -0
  25. package/src/SideMenuDivider/SideMenuDivider.d.ts +10 -0
  26. package/src/{SideMenuDivider.js → SideMenuDivider/SideMenuDivider.js} +8 -9
  27. package/src/SideMenuDivider/SideMenuDivider.md +0 -0
  28. package/src/{SideMenuDropdown.d.ts → SideMenuDropdown/SideMenuDropdown.d.ts} +6 -2
  29. package/src/{SideMenuDropdown.js → SideMenuDropdown/SideMenuDropdown.js} +11 -12
  30. package/src/SideMenuDropdown/SideMenuDropdown.md +0 -0
  31. package/src/{SideMenuFooter.d.ts → SideMenuFooter/SideMenuFooter.d.ts} +6 -2
  32. package/src/{SideMenuFooter.js → SideMenuFooter/SideMenuFooter.js} +10 -11
  33. package/src/SideMenuFooter/SideMenuFooter.md +0 -0
  34. package/src/{SideMenuHeader.d.ts → SideMenuHeader/SideMenuHeader.d.ts} +6 -2
  35. package/src/{SideMenuHeader.js → SideMenuHeader/SideMenuHeader.js} +11 -12
  36. package/src/SideMenuHeader/SideMenuHeader.md +0 -0
  37. package/src/SideMenuItem/SideMenuItem.d.ts +14 -0
  38. package/src/SideMenuItem/SideMenuItem.js +15 -0
  39. package/src/SideMenuItem/SideMenuItem.md +0 -0
  40. package/src/SideMenuLink/SideMenuLink.d.ts +16 -0
  41. package/src/SideMenuLink/SideMenuLink.js +21 -0
  42. package/src/SideMenuLink/SideMenuLink.md +0 -0
  43. package/src/SideMenuOrganisations/SideMenuOrganisations.d.ts +10 -0
  44. package/src/{SideMenuOrganisations.js → SideMenuOrganisations/SideMenuOrganisations.js} +7 -8
  45. package/src/SideMenuOrganisations/SideMenuOrganisations.md +0 -0
  46. package/src/SideMenuSubItem/SideMenuSubItem.d.ts +12 -0
  47. package/src/SideMenuSubItem/SideMenuSubItem.js +27 -0
  48. package/src/SideMenuSubItem/SideMenuSubItem.md +0 -0
  49. package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.d.ts +13 -0
  50. package/src/{SideMenuSubItemHeader.js → SideMenuSubItemHeader/SideMenuSubItemHeader.js} +10 -11
  51. package/src/SideMenuSubItemHeader/SideMenuSubItemHeader.md +0 -0
  52. package/src/SideMenuSubLink/SideMenuSubLink.d.ts +16 -0
  53. package/src/SideMenuSubLink/SideMenuSubLink.js +31 -0
  54. package/src/SideMenuSubLink/SideMenuSubLink.md +0 -0
  55. package/src/internal/ClickableElement.d.ts +25 -0
  56. package/src/internal/ClickableElement.js +63 -0
  57. package/src/{SideMenuBodyChildren.d.ts → internal/InnerBody.d.ts} +2 -2
  58. package/src/{SideMenuBodyChildren.js → internal/InnerBody.js} +13 -12
  59. package/src/{InnerSubMenu.d.ts → internal/InnerSubMenu.d.ts} +0 -0
  60. package/src/{InnerSubMenu.js → internal/InnerSubMenu.js} +3 -1
  61. package/src/internal/ItemContent/Avatar.d.ts +5 -0
  62. package/src/internal/ItemContent/Avatar.js +12 -0
  63. package/src/internal/ItemContent/Caption.d.ts +9 -0
  64. package/src/internal/ItemContent/Caption.js +19 -0
  65. package/src/internal/ItemContent/Icon.d.ts +8 -0
  66. package/src/internal/ItemContent/Icon.js +20 -0
  67. package/src/internal/ItemContent/ItemContent.d.ts +7 -0
  68. package/src/internal/ItemContent/ItemContent.js +39 -0
  69. package/src/internal/ItemContent/Marker.d.ts +6 -0
  70. package/src/internal/ItemContent/Marker.js +11 -0
  71. package/src/internal/NestedMenu.d.ts +9 -0
  72. package/src/internal/NestedMenu.js +27 -0
  73. package/src/{RightBorder.d.ts → internal/RightBorder.d.ts} +0 -0
  74. package/src/{RightBorder.js → internal/RightBorder.js} +2 -2
  75. package/src/{SeparatedSubMenu.d.ts → internal/SeparatedSubMenu.d.ts} +0 -0
  76. package/src/{SeparatedSubMenu.js → internal/SeparatedSubMenu.js} +6 -4
  77. package/src/{SideMenuLogotype.d.ts → internal/SideMenuLogotype.d.ts} +1 -1
  78. package/src/{SideMenuLogotype.js → internal/SideMenuLogotype.js} +2 -2
  79. package/src/internal/SubMenu.d.ts +13 -0
  80. package/src/internal/SubMenu.js +21 -0
  81. package/utils/scripts.d.ts +4 -2
  82. package/utils/scripts.js +18 -14
  83. package/src/SideMenu.d.ts +0 -38
  84. package/src/SideMenuAvatar.d.ts +0 -9
  85. package/src/SideMenuBody.d.ts +0 -9
  86. package/src/SideMenuDivider.d.ts +0 -6
  87. package/src/SideMenuItem.d.ts +0 -19
  88. package/src/SideMenuItem.js +0 -126
  89. package/src/SideMenuOrganisations.d.ts +0 -6
  90. package/src/SideMenuSubItem.d.ts +0 -8
  91. package/src/SideMenuSubItem.js +0 -58
  92. package/src/SideMenuSubItemHeader.d.ts +0 -9
@@ -0,0 +1,21 @@
1
+ import { __assign, __rest } from "tslib";
2
+ import React, { forwardRef } from 'react';
3
+ import { ClickableElement } from '../internal/ClickableElement';
4
+ import { jsStyles } from '../SideMenu.styles';
5
+ import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
6
+ var SideMenuLinkInner = forwardRef(function (_a, ref) {
7
+ var _b;
8
+ var className = _a.className, rest = __rest(_a, ["className"]);
9
+ return React.createElement(ClickableElement, __assign({}, rest, { ref: ref, element: 'a', className: cx((_b = {}, _b[jsStyles.link()] = true, _b), className) }));
10
+ });
11
+ SideMenuLinkInner.displayName = 'SideMenuLink';
12
+ /**
13
+ * Ссылка для `SideMenu`
14
+ *
15
+ * Визуально повторяет `SideMenu.Item`
16
+ *
17
+ * Может принимать все атрибуты обычной HTML-ссылки
18
+ *
19
+ * @visibleName SideMenu.Link
20
+ */
21
+ export var SideMenuLink = Object.assign(SideMenuLinkInner, { __KONTUR_REACT_UI__: 'SideMenuLink' });
File without changes
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { SideMenuDropdownProps } from '../SideMenuDropdown/SideMenuDropdown';
3
+ /**
4
+ * Список организаций
5
+ *
6
+ * @visibleName SideMenu.Organisations
7
+ */
8
+ export declare const SideMenuOrganisations: React.ForwardRefExoticComponent<SideMenuDropdownProps & React.RefAttributes<HTMLDivElement>> & {
9
+ __KONTUR_REACT_UI__: string;
10
+ };
@@ -1,17 +1,16 @@
1
1
  import { __assign, __rest } from "tslib";
2
2
  import React, { forwardRef } from 'react';
3
- import { SideMenuDropdown } from './SideMenuDropdown';
3
+ import { SideMenuDropdown } from '../SideMenuDropdown/SideMenuDropdown';
4
+ var SideMenuOrganisationsInner = forwardRef(function (_a, ref) {
5
+ var children = _a.children, _b = _a.caption, caption = _b === void 0 ? 'СКБ Контур' : _b, rest = __rest(_a, ["children", "caption"]);
6
+ return (React.createElement(SideMenuDropdown, __assign({ caption: caption, menuWidth: '240px', positions: ['top left'], ref: ref }, rest), children));
7
+ });
8
+ SideMenuOrganisationsInner.displayName = 'SideMenuOrganisations';
4
9
  /**
5
10
  * Список организаций
6
11
  *
7
12
  * @visibleName SideMenu.Organisations
8
13
  */
9
- var SideMenuOrganisations = forwardRef(function (_a, ref) {
10
- var children = _a.children, _b = _a.caption, caption = _b === void 0 ? 'СКБ Контур' : _b, rest = __rest(_a, ["children", "caption"]);
11
- return (React.createElement(SideMenuDropdown, __assign({ caption: caption, menuWidth: '240px', positions: ['top left'], ref: ref }, rest), children));
12
- });
13
- SideMenuOrganisations.displayName = 'SideMenuOrganisations';
14
- var SideMenuOrganisationsWithStaticFields = Object.assign(SideMenuOrganisations, {
14
+ export var SideMenuOrganisations = Object.assign(SideMenuOrganisationsInner, {
15
15
  __KONTUR_REACT_UI__: 'SideMenuOrganisations',
16
16
  });
17
- export { SideMenuOrganisationsWithStaticFields as SideMenuOrganisations };
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { SideMenuItemProps } from '../SideMenuItem/SideMenuItem';
3
+ export interface SideMenuSubItemProps extends Omit<SideMenuItemProps, 'icon'>, Partial<Pick<SideMenuItemProps, 'icon'>> {
4
+ }
5
+ /**
6
+ * Элемент списка второго уровня
7
+ *
8
+ * @visibleName SideMenu.SubItem
9
+ */
10
+ export declare const SideMenuSubItem: React.ForwardRefExoticComponent<SideMenuSubItemProps & React.RefAttributes<HTMLDivElement>> & {
11
+ __KONTUR_REACT_UI__: string;
12
+ };
@@ -0,0 +1,27 @@
1
+ import { __assign, __rest } from "tslib";
2
+ import React, { forwardRef, useContext } from 'react';
3
+ import { SideMenuItem } from '../SideMenuItem/SideMenuItem';
4
+ import { SideMenuContext } from '../SideMenuContext';
5
+ import { NestedMenu } from '../internal/NestedMenu';
6
+ import { useOpenedSubElementState } from '../../hooks/useOpenedSubElementState';
7
+ import { useMemoIcon } from '../../hooks/UseMemoIcon';
8
+ var SideMenuSubItemInner = forwardRef(function (_a, ref) {
9
+ var children = _a.children, _generatedId = _a._generatedId, id = _a.id, rest = __rest(_a, ["children", "_generatedId", "id"]);
10
+ var context = useContext(SideMenuContext);
11
+ var isOpened = useOpenedSubElementState(id, _generatedId, context.openedParents, context.activeMenuItem);
12
+ var icon = useMemoIcon(children, isOpened);
13
+ return (React.createElement("div", { ref: ref },
14
+ React.createElement(SideMenuItem
15
+ /*@ts-expect-error: SideMenuItem should have icon */
16
+ , __assign({
17
+ /*@ts-expect-error: SideMenuItem should have icon */
18
+ icon: icon, _isSubMenu: true, id: id, _generatedId: _generatedId }, rest)),
19
+ children && isOpened && React.createElement(NestedMenu, { _generatedId: _generatedId }, children)));
20
+ });
21
+ SideMenuSubItemInner.displayName = 'SideMenuSubItem';
22
+ /**
23
+ * Элемент списка второго уровня
24
+ *
25
+ * @visibleName SideMenu.SubItem
26
+ */
27
+ export var SideMenuSubItem = Object.assign(SideMenuSubItemInner, { __KONTUR_REACT_UI__: 'SideMenuSubItem' });
File without changes
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { CommonProps } from '@skbkontur/react-ui/internal/CommonWrapper';
3
+ export interface SideMenuSubItemHeaderProps extends CommonProps {
4
+ children?: React.ReactNode;
5
+ }
6
+ /**
7
+ * Заголовок списка второго уровня
8
+ *
9
+ * @visibleName SideMenu.SubItemHeader
10
+ */
11
+ export declare const SideMenuSubItemHeader: React.ForwardRefExoticComponent<SideMenuSubItemHeaderProps & React.RefAttributes<HTMLParagraphElement>> & {
12
+ __KONTUR_REACT_UI__: string;
13
+ };
@@ -1,21 +1,20 @@
1
1
  import { __assign, __rest } from "tslib";
2
2
  import React, { forwardRef, useContext } from 'react';
3
3
  import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
4
- import { jsStyles } from './SideMenu.styles';
5
- import { SideMenuContext } from './SideMenuContext';
6
- /**
7
- * Заголовок списка второго уровня
8
- *
9
- * @visibleName SideMenu.SubItemHeader
10
- */
11
- var SideMenuSubItemHeader = forwardRef(function (_a, ref) {
4
+ import { jsStyles } from '../SideMenu.styles';
5
+ import { SideMenuContext } from '../SideMenuContext';
6
+ var SideMenuSubItemHeaderInner = forwardRef(function (_a, ref) {
12
7
  var _b;
13
8
  var className = _a.className, children = _a.children, rest = __rest(_a, ["className", "children"]);
14
9
  var context = useContext(SideMenuContext);
15
10
  return (React.createElement("p", __assign({ className: cx((_b = {}, _b[jsStyles.subItemHeader()] = true, _b[jsStyles.subItemHeaderInSeparatedSubMenu()] = context.isSeparatedMenu, _b), className), ref: ref }, rest), children));
16
11
  });
17
- SideMenuSubItemHeader.displayName = 'SideMenuSubItemHeader';
18
- var SideMenuSubItemHeaderWithStaticFields = Object.assign(SideMenuSubItemHeader, {
12
+ SideMenuSubItemHeaderInner.displayName = 'SideMenuSubItemHeader';
13
+ /**
14
+ * Заголовок списка второго уровня
15
+ *
16
+ * @visibleName SideMenu.SubItemHeader
17
+ */
18
+ export var SideMenuSubItemHeader = Object.assign(SideMenuSubItemHeaderInner, {
19
19
  __KONTUR_REACT_UI__: 'SideMenuSubItemHeader',
20
20
  });
21
- export { SideMenuSubItemHeaderWithStaticFields as SideMenuSubItemHeader };
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import { SideMenuLinkProps } from '../SideMenuLink/SideMenuLink';
3
+ export interface SideMenuSubLinkProps extends Omit<SideMenuLinkProps, 'icon'>, Partial<Pick<SideMenuLinkProps, 'icon'>> {
4
+ }
5
+ /**
6
+ * Ссылка в подменю для `SideMenu`
7
+ *
8
+ * Визуально повторяет `SideMenu.SubItem`
9
+ *
10
+ * Может принимать все атрибуты обычной HTML-ссылки
11
+ *
12
+ * @visibleName SideMenu.SubLink
13
+ */
14
+ export declare const SideMenuSubLink: React.ForwardRefExoticComponent<SideMenuSubLinkProps & React.RefAttributes<HTMLDivElement>> & {
15
+ __KONTUR_REACT_UI__: string;
16
+ };
@@ -0,0 +1,31 @@
1
+ import { __assign, __rest } from "tslib";
2
+ import React, { forwardRef, useContext } from 'react';
3
+ import { SideMenuContext } from '../SideMenuContext';
4
+ import { SideMenuLink } from '../SideMenuLink/SideMenuLink';
5
+ import { NestedMenu } from '../internal/NestedMenu';
6
+ import { useOpenedSubElementState } from '../../hooks/useOpenedSubElementState';
7
+ import { useMemoIcon } from '../../hooks/UseMemoIcon';
8
+ var SideMenuSubLinkInner = forwardRef(function (_a, ref) {
9
+ var className = _a.className, marker = _a.marker, id = _a.id, _generatedId = _a._generatedId, _isSubMenu = _a._isSubMenu, _isNestedSubMenu = _a._isNestedSubMenu, children = _a.children, rest = __rest(_a, ["className", "marker", "id", "_generatedId", "_isSubMenu", "_isNestedSubMenu", "children"]);
10
+ var context = useContext(SideMenuContext);
11
+ var isOpened = useOpenedSubElementState(id, _generatedId, context.openedParents, context.activeMenuItem);
12
+ var icon = useMemoIcon(children, isOpened);
13
+ return (React.createElement("div", { ref: ref },
14
+ React.createElement(SideMenuLink
15
+ /*@ts-expect-error: SideMenuItem should have icon */
16
+ , __assign({
17
+ /*@ts-expect-error: SideMenuItem should have icon */
18
+ icon: icon, _isSubMenu: true, _isNestedSubMenu: _isNestedSubMenu, id: id, _generatedId: _generatedId }, rest)),
19
+ children && isOpened && React.createElement(NestedMenu, { _generatedId: _generatedId }, children)));
20
+ });
21
+ SideMenuSubLinkInner.displayName = 'SideMenuSubLink';
22
+ /**
23
+ * Ссылка в подменю для `SideMenu`
24
+ *
25
+ * Визуально повторяет `SideMenu.SubItem`
26
+ *
27
+ * Может принимать все атрибуты обычной HTML-ссылки
28
+ *
29
+ * @visibleName SideMenu.SubLink
30
+ */
31
+ export var SideMenuSubLink = Object.assign(SideMenuSubLinkInner, { __KONTUR_REACT_UI__: 'SideMenuSubLink' });
File without changes
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { CommonProps } from '@skbkontur/react-ui/internal/CommonWrapper';
3
+ export interface CommonClickableElementProps extends CommonProps {
4
+ children?: React.ReactNode;
5
+ icon: React.ReactElement;
6
+ marker?: string;
7
+ caption?: string;
8
+ id?: string;
9
+ _generatedId?: string;
10
+ _isSubMenu?: boolean;
11
+ _isNestedSubMenu?: boolean;
12
+ _avatar?: React.ReactElement;
13
+ }
14
+ export interface ClickableElementProps extends CommonClickableElementProps {
15
+ element: 'a' | 'button';
16
+ href?: string;
17
+ onClick?: React.EventHandler<React.MouseEvent<Element>>;
18
+ onKeyDown?: React.EventHandler<React.KeyboardEvent<Element>>;
19
+ onFocus?: React.EventHandler<React.FocusEvent<Element>>;
20
+ onBlur?: React.EventHandler<React.FocusEvent<Element>>;
21
+ }
22
+ declare const ClickableElementWithStaticFields: React.ForwardRefExoticComponent<ClickableElementProps & React.RefAttributes<HTMLButtonElement | HTMLAnchorElement>> & {
23
+ __KONTUR_REACT_UI__: string;
24
+ };
25
+ export { ClickableElementWithStaticFields as ClickableElement };
@@ -0,0 +1,63 @@
1
+ import { __assign, __rest } from "tslib";
2
+ import React, { forwardRef, useContext, useState } from 'react';
3
+ import { keyListener } from '@skbkontur/react-ui/lib/events/keyListener';
4
+ import { SideMenuContext } from '../SideMenuContext';
5
+ import { ItemContent } from './ItemContent/ItemContent';
6
+ import { SubMenu } from './SubMenu';
7
+ import { useOpenedState } from '../../hooks/useOpenedState';
8
+ import { useActiveState } from '../../hooks/useActiveState';
9
+ import { jsStyles } from '../SideMenu.styles';
10
+ import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
11
+ /**
12
+ * Элемент списка (пункт меню либо ссылка)
13
+ *
14
+ * @visibleName ClickableElement
15
+ */
16
+ var ClickableElement = forwardRef(function (_a, ref) {
17
+ var _b;
18
+ var onClick = _a.onClick, icon = _a.icon, _avatar = _a._avatar, marker = _a.marker, caption = _a.caption, id = _a.id, _isSubMenu = _a._isSubMenu, children = _a.children, _isNestedSubMenu = _a._isNestedSubMenu, _generatedId = _a._generatedId, Tag = _a.element, onKeyDown = _a.onKeyDown, onFocus = _a.onFocus, onBlur = _a.onBlur, className = _a.className, rest = __rest(_a, ["onClick", "icon", "_avatar", "marker", "caption", "id", "_isSubMenu", "children", "_isNestedSubMenu", "_generatedId", "element", "onKeyDown", "onFocus", "onBlur", "className"]);
19
+ var context = useContext(SideMenuContext);
20
+ var isActive = useActiveState(id, rest.href, _generatedId, context.activeMenuItem);
21
+ var _c = useState(false), focusedByTab = _c[0], setFocusedByTab = _c[1];
22
+ var isOpened = useOpenedState(id || rest.href, _generatedId, context.openedParents, isActive, children);
23
+ var handleClick = function (e) {
24
+ var _a, _b, _c;
25
+ onClick === null || onClick === void 0 ? void 0 : onClick(e);
26
+ if (id) {
27
+ (_a = context.switchActiveMenuItem) === null || _a === void 0 ? void 0 : _a.call(context, id);
28
+ }
29
+ else if (rest.href) {
30
+ (_b = context.switchActiveMenuItem) === null || _b === void 0 ? void 0 : _b.call(context, rest.href);
31
+ }
32
+ else if (_generatedId) {
33
+ (_c = context.switchActiveMenuItem) === null || _c === void 0 ? void 0 : _c.call(context, _generatedId);
34
+ }
35
+ };
36
+ var handleFocus = function (e) {
37
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(e);
38
+ requestAnimationFrame(function () {
39
+ if (keyListener.isTabPressed) {
40
+ setFocusedByTab(true);
41
+ }
42
+ });
43
+ };
44
+ var handleBlur = function (e) {
45
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur(e);
46
+ setFocusedByTab(false);
47
+ };
48
+ var isOpenedFirstLevelItemInSeparatedMenu = isOpened && !_isSubMenu && context.isSeparatedMenu;
49
+ return (React.createElement("div", null,
50
+ React.cloneElement(React.createElement(Tag, null), __assign({ className: cx((_b = {},
51
+ _b[jsStyles.item()] = true,
52
+ _b[jsStyles.subItem()] = context.isSeparatedMenu && _isSubMenu,
53
+ _b[jsStyles.focusedItem()] = focusedByTab,
54
+ _b[jsStyles.activeItem()] = isActive || isOpenedFirstLevelItemInSeparatedMenu,
55
+ _b[jsStyles.activeSubItem()] = isActive && context.isSeparatedMenu && _isSubMenu,
56
+ _b), className), onClick: handleClick, onFocus: handleFocus, onBlur: handleBlur, children: (React.createElement(ItemContent, { _isSubMenu: _isSubMenu, icon: icon, _isNestedSubMenu: _isNestedSubMenu, caption: caption, marker: marker, _avatar: _avatar })), ref: ref }, rest)),
57
+ React.createElement(SubMenu, { generatedId: _generatedId, isSubMenu: _isSubMenu, isSeparatedMenu: context.isSeparatedMenu, isOpened: isOpened, isMinimised: context.isMinimised }, children)));
58
+ });
59
+ ClickableElement.displayName = 'ClickableElement';
60
+ var ClickableElementWithStaticFields = Object.assign(ClickableElement, {
61
+ __KONTUR_REACT_UI__: 'ClickableElement',
62
+ });
63
+ export { ClickableElementWithStaticFields as ClickableElement };
@@ -6,7 +6,7 @@ export interface FlattedArrayElementType {
6
6
  parentId: string | null;
7
7
  generatedParentId: string | null;
8
8
  }
9
- declare const SideMenuBodyChildrenWithStaticFields: React.FC<CommonProps> & {
9
+ declare const InnerBodyWithStaticFields: React.FC<CommonProps> & {
10
10
  __KONTUR_REACT_UI__: string;
11
11
  };
12
- export { SideMenuBodyChildrenWithStaticFields as SideMenuBodyChildren };
12
+ export { InnerBodyWithStaticFields as InnerBody };
@@ -1,14 +1,14 @@
1
1
  import { __assign } from "tslib";
2
2
  import React, { isValidElement, useContext, useEffect, useRef, useState } from 'react';
3
- import { jsStyles } from './SideMenu.styles';
4
- import { SideMenuContext } from './SideMenuContext';
5
- import { getAllParents, getElementsChildren, getItemId } from '../utils/scripts';
3
+ import { jsStyles } from '../SideMenu.styles';
4
+ import { SideMenuContext } from '../SideMenuContext';
5
+ import { getAllParents, getElementsChildren, getItemId, isClickableElement } from '../../utils/scripts';
6
6
  /**
7
7
  * Внутренняя часть SideMenuBody
8
8
  *
9
- * @visibleName SideMenuBodyChildren
9
+ * @visibleName InnerBody
10
10
  */
11
- var SideMenuBodyChildren = function (_a) {
11
+ var InnerBody = function (_a) {
12
12
  var children = _a.children;
13
13
  var context = useContext(SideMenuContext);
14
14
  var _b = useState([]), parents = _b[0], setParents = _b[1];
@@ -18,10 +18,10 @@ var SideMenuBodyChildren = function (_a) {
18
18
  React.Children.map(children, function (child) {
19
19
  if (isValidElement(child) &&
20
20
  // @ts-expect-error: accessing private property
21
- child.type.__KONTUR_REACT_UI__ === 'SideMenuItem') {
21
+ isClickableElement(child.type.__KONTUR_REACT_UI__)) {
22
22
  var generatedId = getItemId('body', levelIndex++);
23
23
  flattedArrayOfAllElements.current.push({
24
- id: child.props.id,
24
+ id: child.props.id || child.props.href,
25
25
  generatedId: generatedId,
26
26
  parentId: null,
27
27
  generatedParentId: null,
@@ -50,8 +50,9 @@ var SideMenuBodyChildren = function (_a) {
50
50
  className: jsStyles.dividerInSideMenu(),
51
51
  });
52
52
  }
53
+ if (
53
54
  // @ts-expect-error: accessing private property
54
- if ((child === null || child === void 0 ? void 0 : child.type.__KONTUR_REACT_UI__) === 'SideMenuItem') {
55
+ isClickableElement(child.type.__KONTUR_REACT_UI__)) {
55
56
  var oldIndex = levelIndex;
56
57
  levelIndex++;
57
58
  return React.cloneElement(child, {
@@ -62,8 +63,8 @@ var SideMenuBodyChildren = function (_a) {
62
63
  }
63
64
  })));
64
65
  };
65
- SideMenuBodyChildren.displayName = 'SideMenuBodyChildren';
66
- var SideMenuBodyChildrenWithStaticFields = Object.assign(SideMenuBodyChildren, {
67
- __KONTUR_REACT_UI__: 'SideMenuBodyChildren',
66
+ InnerBody.displayName = 'InnerBody';
67
+ var InnerBodyWithStaticFields = Object.assign(InnerBody, {
68
+ __KONTUR_REACT_UI__: 'InnerBody',
68
69
  });
69
- export { SideMenuBodyChildrenWithStaticFields as SideMenuBodyChildren };
70
+ export { InnerBodyWithStaticFields as InnerBody };
@@ -1,4 +1,5 @@
1
1
  import React, { forwardRef } from 'react';
2
+ import { isClickableSubElement } from '../../utils/scripts';
2
3
  /**
3
4
  * Подменю, раскрывающееся внутри основного меню
4
5
  *
@@ -9,8 +10,9 @@ var InnerSubMenu = forwardRef(function (_a, ref) {
9
10
  var levelIndex = 0;
10
11
  return (React.createElement(React.Fragment, null, React.Children.map(children, function (child) {
11
12
  if (React.isValidElement(child)) {
13
+ if (
12
14
  // @ts-expect-error: accessing private property
13
- if ((child === null || child === void 0 ? void 0 : child.type.__KONTUR_REACT_UI__) === 'SideMenuSubItem') {
15
+ isClickableSubElement(child.type.__KONTUR_REACT_UI__)) {
14
16
  var oldIndex = levelIndex;
15
17
  levelIndex++;
16
18
  return React.cloneElement(child, {
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import { SideMenuItemProps } from '../../SideMenuItem/SideMenuItem';
3
+ declare type AvatarProps = Pick<SideMenuItemProps, '_avatar'>;
4
+ export declare const Avatar: ({ _avatar }: AvatarProps) => React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)>;
5
+ export {};
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
3
+ import { jsStyles } from '../../SideMenu.styles';
4
+ export var Avatar = function (_a) {
5
+ var _b;
6
+ var _avatar = _a._avatar;
7
+ return React.cloneElement(_avatar, {
8
+ className: cx((_b = {},
9
+ _b[jsStyles.avatarIcon()] = true,
10
+ _b)),
11
+ });
12
+ };
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { ItemContentProps } from './ItemContent';
3
+ import { SideMenuContextType } from '../../SideMenuContext';
4
+ interface CaptionProps extends Pick<ItemContentProps, '_isSubMenu' | '_isNestedSubMenu' | 'caption'>, Pick<SideMenuContextType, 'isTransitioned' | 'isSeparatedMenu' | 'hasSubIcons' | 'size'> {
5
+ hasShortcutImage: boolean;
6
+ isMultiline: boolean;
7
+ }
8
+ export declare const Caption: React.ForwardRefExoticComponent<CaptionProps & React.RefAttributes<HTMLParagraphElement>>;
9
+ export {};
@@ -0,0 +1,19 @@
1
+ import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
2
+ import { jsStyles } from '../../SideMenu.styles';
3
+ import React, { forwardRef } from 'react';
4
+ export var Caption = forwardRef(function (_a, ref) {
5
+ var _b;
6
+ var isTransitioned = _a.isTransitioned, _isSubMenu = _a._isSubMenu, isSeparatedMenu = _a.isSeparatedMenu, _isNestedSubMenu = _a._isNestedSubMenu, hasShortcutImage = _a.hasShortcutImage, hasSubIcons = _a.hasSubIcons, size = _a.size, caption = _a.caption, isMultiline = _a.isMultiline;
7
+ return (React.createElement("p", { className: cx((_b = {},
8
+ _b[jsStyles.itemText()] = true,
9
+ _b[jsStyles.itemTextTransitioned()] = isTransitioned,
10
+ _b[jsStyles.subItemText()] = _isSubMenu,
11
+ _b[jsStyles.subItemTextSeparatedMenuFirstLevel()] = isSeparatedMenu && !_isNestedSubMenu && _isSubMenu,
12
+ _b[jsStyles.nestedSubItemTextSeparatedMenu()] = isSeparatedMenu && _isNestedSubMenu && !hasShortcutImage,
13
+ _b[jsStyles.itemTextWithoutItemIcon()] = !hasShortcutImage && !isSeparatedMenu,
14
+ _b[jsStyles.subItemTextWithoutColumnIcons()] = _isSubMenu && isSeparatedMenu && !hasSubIcons,
15
+ _b[jsStyles.itemTextLarge()] = size === 'large',
16
+ _b[jsStyles.itemTextMultiline()] = isMultiline,
17
+ _b)), ref: ref }, caption));
18
+ });
19
+ Caption.displayName = 'Caption';
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { ItemContentProps } from './ItemContent';
3
+ import { SideMenuContextType } from '../../SideMenuContext';
4
+ interface IconProps extends Pick<ItemContentProps, '_isSubMenu' | 'icon'>, Pick<SideMenuContextType, 'isSeparatedMenu' | 'size'> {
5
+ isMultiline: boolean;
6
+ }
7
+ export declare const Icon: ({ icon, _isSubMenu, isMultiline, size, isSeparatedMenu }: IconProps) => React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)>;
8
+ export {};
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
3
+ import { jsStyles } from '../../SideMenu.styles';
4
+ export var Icon = function (_a) {
5
+ var _b;
6
+ var icon = _a.icon, _isSubMenu = _a._isSubMenu, isMultiline = _a.isMultiline, size = _a.size, isSeparatedMenu = _a.isSeparatedMenu;
7
+ return React.cloneElement(icon, {
8
+ size: _isSubMenu ? 16 : 24,
9
+ disableCompensation: true,
10
+ className: cx((_b = {},
11
+ _b[jsStyles.icon()] = true,
12
+ _b[jsStyles.iconMultiline()] = isMultiline,
13
+ _b[jsStyles.iconLarge()] = size === 'large',
14
+ _b[jsStyles.iconMultilineLarge()] = size === 'large' && isMultiline,
15
+ _b[jsStyles.iconSubItem()] = _isSubMenu,
16
+ _b[jsStyles.iconSubItemSeparatedMenu()] = isSeparatedMenu && _isSubMenu,
17
+ _b[jsStyles.iconSubItemLarge()] = _isSubMenu && size === 'large',
18
+ _b)),
19
+ });
20
+ };
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { SideMenuItemProps } from '../../SideMenuItem/SideMenuItem';
3
+ export declare type ItemContentProps = Pick<SideMenuItemProps, '_isSubMenu' | 'icon' | '_isNestedSubMenu' | 'caption' | 'marker' | '_avatar'>;
4
+ declare const ItemContentWithStaticFields: React.ForwardRefExoticComponent<Pick<SideMenuItemProps, "_isSubMenu" | "icon" | "_isNestedSubMenu" | "caption" | "marker" | "_avatar"> & React.RefAttributes<HTMLDivElement>> & {
5
+ __KONTUR_REACT_UI__: string;
6
+ };
7
+ export { ItemContentWithStaticFields as ItemContent };
@@ -0,0 +1,39 @@
1
+ import React, { forwardRef, useContext, useEffect, useRef, useState } from 'react';
2
+ import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
3
+ import { jsStyles } from '../../SideMenu.styles';
4
+ import { SideMenuContext } from '../../SideMenuContext';
5
+ import { useNumberOfTextLinesInItem } from '../../../hooks/useNumberOfTextLinesInItem';
6
+ import { Icon } from './Icon';
7
+ import { Caption } from './Caption';
8
+ import { Marker } from './Marker';
9
+ import { Avatar } from './Avatar';
10
+ /**
11
+ * Контент для SideMenuItem или SideMenuLink
12
+ */
13
+ var ItemContent = forwardRef(function (_a, ref) {
14
+ var _b;
15
+ var _isSubMenu = _a._isSubMenu, icon = _a.icon, _isNestedSubMenu = _a._isNestedSubMenu, caption = _a.caption, marker = _a.marker, _avatar = _a._avatar;
16
+ var context = useContext(SideMenuContext);
17
+ var textRef = useRef(null);
18
+ var _c = useState(false), isMultiline = _c[0], setIsMultiline = _c[1];
19
+ useEffect(function () {
20
+ useNumberOfTextLinesInItem(textRef, setIsMultiline);
21
+ }, [textRef.current]);
22
+ var hasShortcutImage = !!icon || !!_avatar;
23
+ return (React.createElement("div", { className: cx((_b = {},
24
+ _b[jsStyles.itemWrapper()] = true,
25
+ _b[jsStyles.itemMultilineWrapper()] = isMultiline,
26
+ _b[jsStyles.subItemWrapper()] = _isSubMenu,
27
+ _b[jsStyles.itemLargeWrapper()] = context.size === 'large',
28
+ _b[jsStyles.subItemLargeWrapper()] = context.size === 'large' && _isSubMenu,
29
+ _b[jsStyles.itemLargeMultilineWrapper()] = isMultiline && context.size === 'large',
30
+ _b)), ref: ref },
31
+ icon && (React.createElement(Icon, { icon: icon, _isSubMenu: _isSubMenu, isMultiline: isMultiline, size: context.size, isSeparatedMenu: context.isSeparatedMenu })),
32
+ _avatar && React.createElement(Avatar, { _avatar: _avatar }),
33
+ !context.isMinimised && (React.createElement("div", { className: jsStyles.textAndMarkerWrapper() },
34
+ React.createElement(Caption, { isTransitioned: context.isTransitioned, _isSubMenu: _isSubMenu, isSeparatedMenu: context.isSeparatedMenu, _isNestedSubMenu: _isNestedSubMenu, hasShortcutImage: hasShortcutImage, size: context.size, hasSubIcons: context.hasSubIcons, isMultiline: isMultiline, caption: caption, ref: textRef }),
35
+ marker && React.createElement(Marker, { isMultiline: isMultiline, marker: marker })))));
36
+ });
37
+ ItemContent.displayName = 'ItemContent';
38
+ var ItemContentWithStaticFields = Object.assign(ItemContent, { __KONTUR_REACT_UI__: 'ItemContent' });
39
+ export { ItemContentWithStaticFields as ItemContent };
@@ -0,0 +1,6 @@
1
+ import { ItemContentProps } from './ItemContent';
2
+ interface MarkerProps extends Pick<ItemContentProps, 'marker'> {
3
+ isMultiline: boolean;
4
+ }
5
+ export declare const Marker: ({ isMultiline, marker }: MarkerProps) => JSX.Element;
6
+ export {};
@@ -0,0 +1,11 @@
1
+ import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
2
+ import { jsStyles } from '../../SideMenu.styles';
3
+ import React from 'react';
4
+ export var Marker = function (_a) {
5
+ var _b;
6
+ var isMultiline = _a.isMultiline, marker = _a.marker;
7
+ return (React.createElement("span", { className: cx((_b = {},
8
+ _b[jsStyles.marker()] = true,
9
+ _b[jsStyles.markerMultiline()] = isMultiline,
10
+ _b)) }, marker));
11
+ };
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export interface NestedMenuProps {
3
+ _generatedId?: string;
4
+ children: React.ReactNode;
5
+ }
6
+ declare const NestedMenuWithStaticFields: React.ForwardRefExoticComponent<NestedMenuProps & React.RefAttributes<HTMLDivElement>> & {
7
+ __KONTUR_REACT_UI__: string;
8
+ };
9
+ export { NestedMenuWithStaticFields as NestedMenu };
@@ -0,0 +1,27 @@
1
+ import React, { forwardRef } from 'react';
2
+ import { jsStyles } from '../SideMenu.styles';
3
+ import { isClickableSubElement } from '../../utils/scripts';
4
+ /**
5
+ * Вложенное подменю
6
+ *
7
+ * @visibleName NestedMenu
8
+ */
9
+ var NestedMenu = forwardRef(function (_a, ref) {
10
+ var _generatedId = _a._generatedId, children = _a.children;
11
+ var levelIndex = 0;
12
+ return (React.createElement("div", { className: jsStyles.nestedMenu() }, React.Children.map(children, function (child) {
13
+ if (React.isValidElement(child) &&
14
+ // @ts-expect-error: accessing private property
15
+ isClickableSubElement(child.type.__KONTUR_REACT_UI__)) {
16
+ return React.cloneElement(child, {
17
+ _generatedId: _generatedId + "-" + levelIndex++,
18
+ _isNestedSubMenu: true,
19
+ ref: ref,
20
+ });
21
+ }
22
+ return child;
23
+ })));
24
+ });
25
+ NestedMenu.displayName = 'NestedMenu';
26
+ var NestedMenuWithStaticFields = Object.assign(NestedMenu, { __KONTUR_REACT_UI__: 'NestedMenu' });
27
+ export { NestedMenuWithStaticFields as NestedMenu };
@@ -1,7 +1,7 @@
1
1
  import React, { forwardRef, useContext, useEffect, useRef, useState } from 'react';
2
2
  import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
3
- import { customStyles, jsStyles } from './SideMenu.styles';
4
- import { SideMenuContext } from './SideMenuContext';
3
+ import { customStyles, jsStyles } from '../SideMenu.styles';
4
+ import { SideMenuContext } from '../SideMenuContext';
5
5
  /**
6
6
  * Элемент интерактивной правой границы
7
7
  *
@@ -1,8 +1,9 @@
1
1
  import { __assign } from "tslib";
2
2
  import React, { forwardRef, useContext } from 'react';
3
3
  import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
4
- import { jsStyles } from './SideMenu.styles';
5
- import { SideMenuContext } from './SideMenuContext';
4
+ import { jsStyles } from '../SideMenu.styles';
5
+ import { SideMenuContext } from '../SideMenuContext';
6
+ import { isClickableSubElement } from '../../utils/scripts';
6
7
  /**
7
8
  * Отдельностоящее подменю
8
9
  *
@@ -14,7 +15,7 @@ var SeparatedSubMenu = forwardRef(function (_a, ref) {
14
15
  var context = useContext(SideMenuContext);
15
16
  var isSubItemWithChildren = function (child) {
16
17
  // @ts-expect-error: accessing private property
17
- return (child === null || child === void 0 ? void 0 : child.type.__KONTUR_REACT_UI__) === 'SideMenuSubItem' && child.props.children;
18
+ return isClickableSubElement(child.type.__KONTUR_REACT_UI__) && child.props.children;
18
19
  };
19
20
  var hasSubItems = function (children) {
20
21
  return React.Children.toArray(children).some(function (child) {
@@ -28,8 +29,9 @@ var SeparatedSubMenu = forwardRef(function (_a, ref) {
28
29
  return (React.createElement("div", { className: cx((_b = {}, _b[jsStyles.root()] = true, _b[jsStyles.separatedMenu()] = true, _b)), ref: ref },
29
30
  React.createElement(SideMenuContext.Provider, { value: __assign({ hasSubIcons: hasSubItems(children) }, context) }, React.Children.map(children, function (child) {
30
31
  if (React.isValidElement(child)) {
32
+ if (
31
33
  // @ts-expect-error: accessing private property
32
- if ((child === null || child === void 0 ? void 0 : child.type.__KONTUR_REACT_UI__) === 'SideMenuSubItem') {
34
+ isClickableSubElement(child.type.__KONTUR_REACT_UI__)) {
33
35
  var oldIndex = levelIndex;
34
36
  levelIndex++;
35
37
  return React.cloneElement(child, {