@skbkontur/side-menu 0.1.4 → 0.2.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 (45) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +36 -31
  3. package/index.d.ts +1 -1
  4. package/index.js +1 -1
  5. package/package.json +2 -2
  6. package/src/InnerSubMenu.d.ts +9 -0
  7. package/src/InnerSubMenu.js +18 -0
  8. package/src/RightBorder.d.ts +8 -0
  9. package/src/RightBorder.js +71 -0
  10. package/src/SeparatedSubMenu.d.ts +8 -0
  11. package/src/SeparatedSubMenu.js +32 -0
  12. package/src/SideMenu.d.ts +23 -50
  13. package/src/SideMenu.js +81 -143
  14. package/src/SideMenu.styles.d.ts +7 -4
  15. package/src/SideMenu.styles.js +51 -46
  16. package/src/SideMenuAvatar.d.ts +6 -22
  17. package/src/SideMenuAvatar.js +10 -41
  18. package/src/SideMenuBody.d.ts +5 -7
  19. package/src/SideMenuBody.js +22 -15
  20. package/src/SideMenuBodyChildren.d.ts +6 -0
  21. package/src/SideMenuBodyChildren.js +26 -0
  22. package/src/SideMenuContext.d.ts +7 -6
  23. package/src/SideMenuContext.js +1 -1
  24. package/src/SideMenuDivider.d.ts +5 -10
  25. package/src/SideMenuDivider.js +11 -19
  26. package/src/SideMenuDropdown.d.ts +13 -0
  27. package/src/SideMenuDropdown.js +29 -0
  28. package/src/SideMenuFooter.d.ts +5 -7
  29. package/src/SideMenuFooter.js +19 -6
  30. package/src/SideMenuHeader.d.ts +4 -26
  31. package/src/SideMenuHeader.js +32 -76
  32. package/src/SideMenuItem.d.ts +9 -35
  33. package/src/SideMenuItem.js +134 -165
  34. package/src/SideMenuLogotype.d.ts +6 -0
  35. package/src/SideMenuLogotype.js +65 -0
  36. package/src/SideMenuOrganisations.d.ts +4 -16
  37. package/src/SideMenuOrganisations.js +12 -35
  38. package/src/SideMenuSubItem.d.ts +3 -17
  39. package/src/SideMenuSubItem.js +27 -42
  40. package/src/SideMenuSubItemHeader.d.ts +5 -12
  41. package/src/SideMenuSubItemHeader.js +13 -21
  42. package/src/SideMenuDropdownMenuSeparator.d.ts +0 -11
  43. package/src/SideMenuDropdownMenuSeparator.js +0 -25
  44. package/src/SideMenuSubItemButtons.d.ts +0 -15
  45. package/src/SideMenuSubItemButtons.js +0 -25
@@ -1,184 +1,153 @@
1
- import { __assign, __extends } from "tslib";
2
- import React from 'react';
1
+ import { __assign, __rest } from "tslib";
2
+ import React, { forwardRef, useContext, useEffect, useRef, useState } from 'react';
3
3
  import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
4
- import { CommonWrapper } from '@skbkontur/react-ui/internal/CommonWrapper';
5
4
  import { keyListener } from '@skbkontur/react-ui/lib/events/keyListener';
6
5
  import { jsStyles } from './SideMenu.styles';
7
- import { SideMenuThemeContext } from './SideMenuContext';
6
+ import { SideMenuContext } from './SideMenuContext';
7
+ import { SeparatedSubMenu } from './SeparatedSubMenu';
8
+ import { InnerSubMenu } from './InnerSubMenu';
8
9
  /**
9
10
  * Элемент списка
10
11
  *
11
12
  * @visibleName SideMenu.Item
12
13
  */
13
- var SideMenuItem = /** @class */ (function (_super) {
14
- __extends(SideMenuItem, _super);
15
- function SideMenuItem(props) {
16
- var _this = _super.call(this, props) || this;
17
- _this.previousContext = {};
18
- _this.renderInnerSubMenu = function () {
19
- var childrenWithProps = React.Children.map(_this.props.children, function (child) {
20
- if (React.isValidElement(child)) {
21
- return React.cloneElement(child, { parent: _this });
22
- }
23
- return child;
24
- });
25
- return _this.state.isOpened && !_this.context.isMinimised && !_this.props.isSubMenu && childrenWithProps;
26
- };
27
- _this.renderSeparatedSubMenu = function () {
28
- var _a;
29
- var hasSubItems = false;
30
- var subItemHasChildren = function (subItem) {
31
- return subItem &&
32
- typeof subItem === 'object' &&
33
- 'type' in subItem &&
34
- typeof subItem.type === 'function' &&
35
- (subItem === null || subItem === void 0 ? void 0 : subItem.type.name) === 'SideMenuSubItem' &&
36
- subItem.props.children;
37
- };
38
- if (_this.state.isOpened) {
39
- React.Children.map(_this.props.children, function (child) {
40
- if (subItemHasChildren(child)) {
41
- hasSubItems = true;
42
- }
43
- });
14
+ var SideMenuItem = forwardRef(function (_a, ref) {
15
+ var _b, _c, _d, _e, _f;
16
+ var className = _a.className, onClick = _a.onClick, onKeyDown = _a.onKeyDown, icon = _a.icon, marker = _a.marker, caption = _a.caption, parent = _a.parent, isSubMenu = _a.isSubMenu, children = _a.children, rest = __rest(_a, ["className", "onClick", "onKeyDown", "icon", "marker", "caption", "parent", "isSubMenu", "children"]);
17
+ var context = useContext(SideMenuContext);
18
+ var textRef = useRef(null);
19
+ var _g = useState(false), isOpened = _g[0], setIsOpened = _g[1];
20
+ var _h = useState(false), focusedByTab = _h[0], setFocusedByTab = _h[1];
21
+ var _j = useState(false), isMultiline = _j[0], setIsMultiline = _j[1];
22
+ var _k = useState(context), oldContext = _k[0], setOldContext = _k[1];
23
+ var id = useState('id' + Math.floor(Math.random() * 10000))[0];
24
+ var getNumberOfTextLines = function () {
25
+ if (textRef.current) {
26
+ var el = textRef.current;
27
+ var textHeight = +el.offsetHeight;
28
+ var lineHeight = parseInt(window.getComputedStyle(textRef.current).getPropertyValue('line-height'));
29
+ var lines = textHeight / lineHeight;
30
+ if (lines >= 2) {
31
+ setIsMultiline(true);
44
32
  }
45
- return (_this.state.isOpened &&
46
- !_this.props.isSubMenu && (React.createElement("div", { className: cx((_a = {}, _a[jsStyles.root()] = true, _a[jsStyles.separatedMenu()] = true, _a)), ref: function (node) { return (_this.separatedMenu = node); } },
47
- React.createElement(SideMenuThemeContext.Provider, { value: __assign({ hasSubIcons: hasSubItems }, _this.context) }, _this.props.children))));
48
- };
49
- _this.handleClick = function (e) {
50
- if (_this.props.onClick) {
51
- _this.props.onClick(e);
52
- }
53
- _this.setActive();
54
- _this.setState({ isOpened: !!_this.props.children });
55
- };
56
- _this.handleFocus = function () {
57
- requestAnimationFrame(function () {
58
- if (keyListener.isTabPressed) {
59
- _this.setState({ focusedByTab: true });
60
- }
61
- });
62
- };
63
- _this.handleBlur = function () {
64
- _this.setState({ focusedByTab: false });
65
- };
66
- _this.handleKeyDown = function (e) {
67
- var _a, _b;
68
- if (e.key === 'Enter') {
69
- _this.setState({ isOpened: !_this.props.children ? false : !_this.state.isOpened });
70
- _this.setActive();
71
- }
72
- (_b = (_a = _this.props).onKeyDown) === null || _b === void 0 ? void 0 : _b.call(_a, e);
73
- };
74
- _this.setActive = function () {
75
- if (_this.props.isSubMenu) {
76
- if (_this.props.parent) {
77
- _this.context.setActiveItem(_this.props.parent);
78
- }
79
- _this.context.setActiveSubItem(_this);
80
- }
81
- else {
82
- if (!_this.context.isSeparatedMenu) {
83
- _this.context.setActiveSubItem(null);
84
- }
85
- _this.context.setActiveItem(_this);
33
+ }
34
+ };
35
+ useEffect(function () {
36
+ var _a;
37
+ if (icon && !isSubMenu) {
38
+ (_a = context.setHasIcons) === null || _a === void 0 ? void 0 : _a.call(context);
39
+ }
40
+ getNumberOfTextLines();
41
+ });
42
+ useEffect(function () {
43
+ if (oldContext.activeItem !== context.activeItem && context.activeItem !== id) {
44
+ setIsOpened(false);
45
+ }
46
+ setOldContext(context);
47
+ }, [context.activeItem]);
48
+ var setActive = function () {
49
+ var _a, _b, _c, _d;
50
+ if (isSubMenu) {
51
+ if (parent) {
52
+ (_a = context.setActiveItem) === null || _a === void 0 ? void 0 : _a.call(context, parent);
86
53
  }
87
- };
88
- _this.state = {
89
- isOpened: false,
90
- focusedByTab: false,
91
- isMultiline: false,
92
- };
93
- _this.textRef = React.createRef();
94
- return _this;
95
- }
96
- SideMenuItem.prototype.componentDidMount = function () {
97
- var _a, _b;
98
- if (this.props.icon && !this.props.isSubMenu) {
99
- (_b = (_a = this.context).setHasIcons) === null || _b === void 0 ? void 0 : _b.call(_a);
54
+ (_b = context.setActiveSubItem) === null || _b === void 0 ? void 0 : _b.call(context, id);
100
55
  }
101
- if (this.textRef.current) {
102
- var el = this.textRef.current;
103
- var divHeight = +el.offsetHeight;
104
- var lineHeight = parseInt(window.getComputedStyle(this.textRef.current).getPropertyValue('font-size')) * 1.14;
105
- var lines = divHeight / lineHeight;
106
- if (lines > 2) {
107
- this.setState({ isMultiline: true });
56
+ else {
57
+ if (!context.isSeparatedMenu) {
58
+ (_c = context.setActiveSubItem) === null || _c === void 0 ? void 0 : _c.call(context, null);
108
59
  }
60
+ (_d = context.setActiveItem) === null || _d === void 0 ? void 0 : _d.call(context, id);
109
61
  }
110
- this.previousContext = this.context;
111
62
  };
112
- SideMenuItem.prototype.componentDidUpdate = function () {
113
- if (this.previousContext.activeItem !== this.context.activeItem && this.context.activeItem !== this) {
114
- this.setState({ isOpened: false });
63
+ var active = false;
64
+ if (context) {
65
+ active = context.activeItem === id || context.activeSubItem === id;
66
+ }
67
+ // @ts-expect-error: accessing private property
68
+ var isIconUserAvatar = typeof (icon === null || icon === void 0 ? void 0 : icon.type) === 'function' && icon.type.__KONTUR_REACT_UI__ === 'UserAvatar';
69
+ var handleClick = function (e) {
70
+ if (onClick) {
71
+ onClick(e);
115
72
  }
116
- this.previousContext = this.context;
73
+ setActive();
74
+ setIsOpened(!!children);
75
+ };
76
+ var handleFocus = function () {
77
+ requestAnimationFrame(function () {
78
+ if (keyListener.isTabPressed) {
79
+ setFocusedByTab(true);
80
+ }
81
+ });
82
+ };
83
+ var handleBlur = function () {
84
+ setFocusedByTab(false);
117
85
  };
118
- SideMenuItem.prototype.render = function () {
119
- return this.renderMain();
86
+ var handleKeyDown = function (e) {
87
+ if (e.key === 'Enter') {
88
+ setIsOpened(!isOpened);
89
+ setActive();
90
+ }
91
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e);
120
92
  };
121
- SideMenuItem.prototype.renderMain = function () {
122
- var _a, _b, _c, _d, _e;
123
- var active = false;
124
- if (this.context) {
125
- active = this.context.activeItem === this || this.context.activeSubItem === this;
93
+ var renderSubMenu = function () {
94
+ if (children && isOpened && !isSubMenu && !context.isMinimised) {
95
+ if (context.isSeparatedMenu) {
96
+ return React.createElement(SeparatedSubMenu, null, children);
97
+ }
98
+ else {
99
+ return React.createElement(InnerSubMenu, { id: id }, children);
100
+ }
126
101
  }
127
- var _f = this.props, icon = _f.icon, marker = _f.marker, caption = _f.caption, isSubMenu = _f.isSubMenu;
128
- var isIconUserAvatar = typeof icon === 'object' && typeof icon.type === 'function' && icon.type.name === 'UserAvatar';
129
- var itemClasses = cx((_a = {},
130
- _a[jsStyles.item()] = true,
131
- _a[jsStyles.subItem()] = this.context.isSeparatedMenu && isSubMenu,
132
- _a[jsStyles.focusedItem()] = this.state.focusedByTab,
133
- _a[jsStyles.activeItem()] = (active && !this.state.isOpened) ||
134
- (active && this.state.isOpened && !this.context.activeSubItem) ||
135
- (active && this.state.isOpened && isSubMenu),
136
- _a[jsStyles.activeSubItem()] = active && this.context.isSeparatedMenu && isSubMenu,
137
- _a));
138
- var iconClasses = cx((_b = {},
139
- _b[jsStyles.icon()] = true,
140
- _b[jsStyles.iconMultiline()] = this.state.isMultiline,
141
- _b[jsStyles.iconLarge()] = this.context.size === 'large',
142
- _b[jsStyles.iconSubItem()] = isSubMenu,
143
- _b[jsStyles.iconSubItemLarge()] = isSubMenu && this.context.size === 'large',
144
- _b[jsStyles.avatarIcon()] = isIconUserAvatar,
145
- _b));
146
- var textClasses = cx((_c = {},
147
- _c[jsStyles.itemText()] = true,
148
- _c[jsStyles.itemTextTransitioned()] = this.context.isTransitioned,
149
- _c[jsStyles.subItemText()] = isSubMenu,
150
- _c[jsStyles.itemTextWithoutItemIcon()] = !icon,
151
- _c[jsStyles.itemTextWithoutColumnIcons()] = !this.context.hasIcons && !isSubMenu,
152
- _c[jsStyles.subItemTextWithoutColumnIcons()] = isSubMenu && this.context.isSeparatedMenu && !this.context.hasSubIcons,
153
- _c[jsStyles.itemTextLarge()] = this.context.size === 'large',
154
- _c[jsStyles.itemTextMultiline()] = this.state.isMultiline,
155
- _c));
156
- var markerClasses = cx((_d = {},
157
- _d[jsStyles.marker()] = true,
158
- _d[jsStyles.markerMultiline()] = this.state.isMultiline,
159
- _d));
160
- var itemWrapperClasses = cx((_e = {},
161
- _e[jsStyles.itemWrapper()] = true,
162
- _e[jsStyles.itemMultilineWrapper()] = this.state.isMultiline,
163
- _e[jsStyles.subItemWrapper()] = isSubMenu,
164
- _e[jsStyles.itemWrapperWithoutIcon()] = !this.props.icon && !isSubMenu,
165
- _e[jsStyles.itemLargeWrapper()] = this.context.size === 'large',
166
- _e[jsStyles.subItemLargeWrapper()] = this.context.size === 'large' && isSubMenu,
167
- _e[jsStyles.itemLargeMultilineWrapper()] = this.state.isMultiline && this.context.size === 'large',
168
- _e[jsStyles.itemLargeWrapperWithoutIcon()] = !this.props.icon && !isSubMenu && this.context.size === 'large',
169
- _e));
170
- return (React.createElement(CommonWrapper, __assign({}, this.props),
171
- React.createElement("div", null,
172
- React.createElement("div", { className: itemClasses, onClick: this.handleClick, onKeyDown: this.handleKeyDown, role: "button", tabIndex: 0, onFocus: this.handleFocus, onBlur: this.handleBlur },
173
- React.createElement("div", { className: itemWrapperClasses },
174
- icon && (React.createElement("span", { className: iconClasses }, React.cloneElement(icon, { size: isSubMenu ? 16 : 24, disableCompensation: true }))),
175
- !this.context.isMinimised && (React.createElement(React.Fragment, null,
176
- React.createElement("div", { className: textClasses, ref: this.textRef }, caption),
177
- marker && React.createElement("span", { className: markerClasses }, marker))))),
178
- this.context.isSeparatedMenu ? this.renderSeparatedSubMenu() : this.renderInnerSubMenu())));
179
102
  };
180
- SideMenuItem.__KONTUR_REACT_UI__ = 'SideMenuItem';
181
- SideMenuItem.contextType = SideMenuThemeContext;
182
- return SideMenuItem;
183
- }(React.Component));
184
- export { SideMenuItem };
103
+ return (React.createElement("div", null,
104
+ React.createElement("button", __assign({ className: cx((_b = {},
105
+ _b[jsStyles.item()] = true,
106
+ _b[jsStyles.subItem()] = context.isSeparatedMenu && isSubMenu,
107
+ _b[jsStyles.focusedItem()] = focusedByTab,
108
+ _b[jsStyles.activeItem()] = (active && !isOpened) ||
109
+ (active && isOpened && !context.activeSubItem) ||
110
+ (active && isOpened && isSubMenu),
111
+ _b[jsStyles.activeSubItem()] = active && context.isSeparatedMenu && isSubMenu,
112
+ _b), className), onClick: handleClick, onKeyDown: handleKeyDown, tabIndex: 0, onFocus: handleFocus, onBlur: handleBlur, ref: ref }, rest),
113
+ React.createElement("div", { className: cx((_c = {},
114
+ _c[jsStyles.itemWrapper()] = true,
115
+ _c[jsStyles.itemMultilineWrapper()] = isMultiline,
116
+ _c[jsStyles.subItemWrapper()] = isSubMenu,
117
+ _c[jsStyles.itemWrapperWithoutIcon()] = !icon && !isSubMenu,
118
+ _c[jsStyles.itemLargeWrapper()] = context.size === 'large',
119
+ _c[jsStyles.subItemLargeWrapper()] = context.size === 'large' && isSubMenu,
120
+ _c[jsStyles.itemLargeMultilineWrapper()] = isMultiline && context.size === 'large',
121
+ _c[jsStyles.itemLargeWrapperWithoutIcon()] = !icon && !isSubMenu && context.size === 'large',
122
+ _c)) },
123
+ icon && (React.createElement("span", { className: cx((_d = {},
124
+ _d[jsStyles.icon()] = true,
125
+ _d[jsStyles.iconMultiline()] = isMultiline,
126
+ _d[jsStyles.iconLarge()] = context.size === 'large',
127
+ _d[jsStyles.iconSubItem()] = isSubMenu,
128
+ _d[jsStyles.iconSubItemLarge()] = isSubMenu && context.size === 'large',
129
+ _d[jsStyles.avatarIcon()] = isIconUserAvatar,
130
+ _d)) }, React.cloneElement(icon, {
131
+ size: isSubMenu ? 16 : 24,
132
+ disableCompensation: true,
133
+ }))),
134
+ !context.isMinimised && (React.createElement("div", { className: jsStyles.textAndMarkerWrapper() },
135
+ React.createElement("p", { className: cx((_e = {},
136
+ _e[jsStyles.itemText()] = true,
137
+ _e[jsStyles.itemTextTransitioned()] = context.isTransitioned,
138
+ _e[jsStyles.subItemText()] = isSubMenu,
139
+ _e[jsStyles.itemTextWithoutItemIcon()] = !icon,
140
+ _e[jsStyles.itemTextWithoutColumnIcons()] = !context.hasIcons && !isSubMenu,
141
+ _e[jsStyles.subItemTextWithoutColumnIcons()] = isSubMenu && context.isSeparatedMenu && !context.hasSubIcons,
142
+ _e[jsStyles.itemTextLarge()] = context.size === 'large',
143
+ _e[jsStyles.itemTextMultiline()] = isMultiline,
144
+ _e)), ref: textRef }, caption),
145
+ marker && (React.createElement("span", { className: cx((_f = {},
146
+ _f[jsStyles.marker()] = true,
147
+ _f[jsStyles.markerMultiline()] = isMultiline,
148
+ _f)) }, marker)))))),
149
+ renderSubMenu()));
150
+ });
151
+ SideMenuItem.displayName = 'SideMenuItem';
152
+ var SideMenuItemWithStaticFields = Object.assign(SideMenuItem, { __KONTUR_REACT_UI__: 'SideMenuItem' });
153
+ export { SideMenuItemWithStaticFields as SideMenuItem };
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { SideMenuHeaderProps } from './SideMenuHeader';
3
+ declare const SideMenuLogotypeWithStaticFields: React.ForwardRefExoticComponent<SideMenuHeaderProps & React.RefAttributes<HTMLDivElement>> & {
4
+ __KONTUR_REACT_UI__: string;
5
+ };
6
+ export { SideMenuLogotypeWithStaticFields as SideMenuLogotype };
@@ -0,0 +1,65 @@
1
+ import { __assign, __rest } from "tslib";
2
+ import React, { forwardRef, useContext, useEffect, useRef, useState } from 'react';
3
+ import { Logotype } from '@skbkontur/react-ui-addons/components/Logotype';
4
+ import { jsStyles } from './SideMenu.styles';
5
+ import { SideMenuContext } from './SideMenuContext';
6
+ /**
7
+ * Логотип
8
+ *
9
+ * @visibleName SideMenu.Logotype
10
+ */
11
+ var SideMenuLogotype = forwardRef(function (_a, ref) {
12
+ var productLogo = _a.productLogo, konturLogo = _a.konturLogo, iconUrl = _a.iconUrl, rest = __rest(_a, ["productLogo", "konturLogo", "iconUrl"]);
13
+ var context = useContext(SideMenuContext);
14
+ var refLogotype = useRef(null);
15
+ var _b = useState(28), size = _b[0], setSize = _b[1];
16
+ useEffect(function () {
17
+ var _a, _b, _c;
18
+ (_a = context.setProductColor) === null || _a === void 0 ? void 0 : _a.call(context, productLogo === null || productLogo === void 0 ? void 0 : productLogo.props.color);
19
+ var logotypeWidth = (_c = (_b = refLogotype.current) === null || _b === void 0 ? void 0 : _b.logotypeRef) === null || _c === void 0 ? void 0 : _c.clientWidth;
20
+ if (logotypeWidth && logotypeWidth > 186) {
21
+ //TODO 186 заменить на headerWrapper width после возврата к кастомизации
22
+ setSize(24);
23
+ }
24
+ });
25
+ var widgetTimer;
26
+ var _c = useState(false), withWidget = _c[0], setWithWidget = _c[1];
27
+ var handleMouseEnter = function () {
28
+ widgetTimer = setTimeout(function () {
29
+ setWithWidget(true);
30
+ }, 500);
31
+ };
32
+ var handleMouseLeave = function () {
33
+ if (widgetTimer) {
34
+ clearTimeout(widgetTimer);
35
+ }
36
+ setWithWidget(false);
37
+ };
38
+ var changeCamelCaseToKebabCase = function (str) {
39
+ return str
40
+ .split('')
41
+ .map(function (letter, idx) {
42
+ return letter.toUpperCase() === letter ? "" + (idx !== 0 ? '-' : '') + letter.toLowerCase() : letter;
43
+ })
44
+ .join('');
45
+ };
46
+ var getProductName = function () {
47
+ var name = 'kontur';
48
+ if (productLogo && typeof productLogo.type === 'function') {
49
+ name = changeCamelCaseToKebabCase(productLogo.type.name);
50
+ }
51
+ return name;
52
+ };
53
+ var productName = getProductName();
54
+ var getStaticIconPath = function () {
55
+ return "https://s.kontur.ru/common-v2/icons-products/" + productName + "/" + productName + "-32.svg";
56
+ };
57
+ if (context.isMinimised || context.isTransitioned) {
58
+ return React.createElement("img", { className: jsStyles.headerIcon(), src: iconUrl || getStaticIconPath(), alt: productName });
59
+ }
60
+ return (React.createElement("div", { onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, ref: ref },
61
+ React.createElement(Logotype, __assign({ ref: refLogotype, size: size, productLogo: productLogo, konturLogo: konturLogo, withWidget: withWidget }, rest))));
62
+ });
63
+ SideMenuLogotype.displayName = 'SideMenuLogotype';
64
+ var SideMenuLogotypeWithStaticFields = Object.assign(SideMenuLogotype, { __KONTUR_REACT_UI__: 'SideMenuLogotype' });
65
+ export { SideMenuLogotypeWithStaticFields as SideMenuLogotype };
@@ -1,18 +1,6 @@
1
1
  import React from 'react';
2
- declare type SideMenuOrganisationsProps = {
3
- icon?: React.ReactElement;
4
- children?: React.ReactNode;
5
- caption?: string;
2
+ import { SideMenuDropdownProps } from './SideMenuDropdown';
3
+ declare const SideMenuOrganisationsWithStaticFields: React.ForwardRefExoticComponent<SideMenuDropdownProps & React.RefAttributes<HTMLDivElement>> & {
4
+ __KONTUR_REACT_UI__: string;
6
5
  };
7
- /**
8
- * Список организаций
9
- *
10
- * @visibleName SideMenu.Organisations
11
- */
12
- export declare class SideMenuOrganisations extends React.Component<SideMenuOrganisationsProps> {
13
- static __KONTUR_REACT_UI__: string;
14
- static defaultProps: Partial<SideMenuOrganisationsProps>;
15
- render(): JSX.Element;
16
- renderMain(): JSX.Element;
17
- }
18
- export {};
6
+ export { SideMenuOrganisationsWithStaticFields as SideMenuOrganisations };
@@ -1,40 +1,17 @@
1
- import { __assign, __extends } from "tslib";
2
- import React from 'react';
3
- import { ThemeContext } from '@skbkontur/react-ui/lib/theming/ThemeContext';
4
- import { DEFAULT_THEME, DropdownMenu, ThemeFactory } from '@skbkontur/react-ui';
5
- import { CommonWrapper } from '@skbkontur/react-ui/internal/CommonWrapper';
6
- import { SideMenuItem } from './SideMenuItem';
7
- import { jsStyles } from './SideMenu.styles';
1
+ import { __assign, __rest } from "tslib";
2
+ import React, { forwardRef } from 'react';
3
+ import { SideMenuDropdown } from './SideMenuDropdown';
8
4
  /**
9
5
  * Список организаций
10
6
  *
11
7
  * @visibleName SideMenu.Organisations
12
8
  */
13
- var SideMenuOrganisations = /** @class */ (function (_super) {
14
- __extends(SideMenuOrganisations, _super);
15
- function SideMenuOrganisations() {
16
- return _super !== null && _super.apply(this, arguments) || this;
17
- }
18
- SideMenuOrganisations.prototype.render = function () {
19
- return this.renderMain();
20
- };
21
- SideMenuOrganisations.prototype.renderMain = function () {
22
- var label = (React.createElement("div", { className: jsStyles.dropdownLabel() },
23
- React.createElement(SideMenuItem, { icon: this.props.icon, caption: this.props.caption })));
24
- return (React.createElement(ThemeContext.Provider, { value: ThemeFactory.create({
25
- menuItemHoverBg: '#f6f6f6',
26
- menuItemHoverColor: '#222',
27
- popupBorderRadius: '8px',
28
- menuItemPaddingX: '32px',
29
- }, DEFAULT_THEME) },
30
- React.createElement(CommonWrapper, __assign({}, this.props),
31
- React.createElement("div", { className: jsStyles.dropdownWrapper() },
32
- React.createElement(DropdownMenu, { caption: label, menuWidth: '240px', positions: ['top left'] }, this.props.children)))));
33
- };
34
- SideMenuOrganisations.__KONTUR_REACT_UI__ = 'SideMenuOrganisations';
35
- SideMenuOrganisations.defaultProps = {
36
- caption: 'СКБ Контур',
37
- };
38
- return SideMenuOrganisations;
39
- }(React.Component));
40
- export { SideMenuOrganisations };
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, {
15
+ __KONTUR_REACT_UI__: 'SideMenuOrganisations',
16
+ });
17
+ export { SideMenuOrganisationsWithStaticFields as SideMenuOrganisations };
@@ -1,20 +1,6 @@
1
1
  import React from 'react';
2
2
  import { SideMenuItemProps } from './SideMenuItem';
3
- declare type SideMenuSubItemState = {
4
- isOpened: boolean;
3
+ declare const SideMenuSubItemWithStaticFields: React.ForwardRefExoticComponent<SideMenuItemProps & React.RefAttributes<HTMLDivElement>> & {
4
+ __KONTUR_REACT_UI__: string;
5
5
  };
6
- /**
7
- * Элемент списка второго уровня
8
- *
9
- * @visibleName SideMenu.SubItem
10
- */
11
- export declare class SideMenuSubItem extends React.Component<SideMenuItemProps, SideMenuSubItemState> {
12
- static __KONTUR_REACT_UI__: string;
13
- static contextType: React.Context<import("./SideMenuContext").SideMenuContextType>;
14
- constructor(props: SideMenuItemProps);
15
- render(): JSX.Element;
16
- renderMain(): JSX.Element;
17
- private handleClick;
18
- private handleKeyDown;
19
- }
20
- export {};
6
+ export { SideMenuSubItemWithStaticFields as SideMenuSubItem };
@@ -1,54 +1,39 @@
1
- import { __assign, __extends } from "tslib";
2
- import React from 'react';
3
- import { CommonWrapper } from '@skbkontur/react-ui/internal/CommonWrapper';
4
- import { SideMenuThemeContext } from './SideMenuContext';
1
+ import { __assign } from "tslib";
2
+ import React, { forwardRef, useMemo, useState } from 'react';
3
+ import { ArrowCDownIcon16Regular, ArrowCRightIcon16Regular } from '@skbkontur/icons';
5
4
  import { SideMenuItem } from './SideMenuItem';
6
5
  import { jsStyles } from './SideMenu.styles';
7
- import { ArrowChevronDown, ArrowChevronRight } from '@skbkontur/react-icons';
8
6
  /**
9
7
  * Элемент списка второго уровня
10
8
  *
11
9
  * @visibleName SideMenu.SubItem
12
10
  */
13
- var SideMenuSubItem = /** @class */ (function (_super) {
14
- __extends(SideMenuSubItem, _super);
15
- function SideMenuSubItem(props) {
16
- var _this = _super.call(this, props) || this;
17
- _this.handleClick = function () {
18
- _this.setState({ isOpened: true });
19
- };
20
- _this.handleKeyDown = function (e) {
21
- var _a, _b;
22
- if (e.key === 'Enter') {
23
- _this.setState({ isOpened: true });
24
- }
25
- (_b = (_a = _this.props).onKeyDown) === null || _b === void 0 ? void 0 : _b.call(_a, e);
26
- };
27
- _this.state = {
28
- isOpened: false,
29
- };
30
- return _this;
31
- }
32
- SideMenuSubItem.prototype.render = function () {
33
- return this.renderMain();
11
+ var SideMenuSubItem = forwardRef(function (props, ref) {
12
+ var _a = useState(false), isOpened = _a[0], setIsOpened = _a[1];
13
+ var handleClick = function () {
14
+ setIsOpened(true);
15
+ };
16
+ var handleKeyDown = function (e) {
17
+ var _a;
18
+ if (e.key === 'Enter') {
19
+ setIsOpened(true);
20
+ }
21
+ (_a = props.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(props, e);
34
22
  };
35
- SideMenuSubItem.prototype.renderMain = function () {
36
- var icon;
37
- if (this.props.children) {
38
- if (this.state.isOpened) {
39
- icon = React.createElement(ArrowChevronDown, null);
23
+ var icon = useMemo(function () {
24
+ if (props.children) {
25
+ if (isOpened) {
26
+ return React.createElement(ArrowCDownIcon16Regular, null);
40
27
  }
41
28
  else {
42
- icon = React.createElement(ArrowChevronRight, null);
29
+ return React.createElement(ArrowCRightIcon16Regular, null);
43
30
  }
44
31
  }
45
- return (React.createElement(CommonWrapper, __assign({}, this.props),
46
- React.createElement("div", null,
47
- React.createElement(SideMenuItem, __assign({}, this.props, { onClick: this.handleClick, icon: icon, isSubMenu: true, onKeyDown: this.handleKeyDown })),
48
- this.props.children && this.state.isOpened && (React.createElement("div", { className: jsStyles.subItemMenu() }, this.props.children)))));
49
- };
50
- SideMenuSubItem.__KONTUR_REACT_UI__ = 'SideMenuSubItem';
51
- SideMenuSubItem.contextType = SideMenuThemeContext;
52
- return SideMenuSubItem;
53
- }(React.Component));
54
- export { SideMenuSubItem };
32
+ }, [isOpened, props.children]);
33
+ return (React.createElement("div", { ref: ref },
34
+ React.createElement(SideMenuItem, __assign({ onClick: handleClick, icon: icon, isSubMenu: true, onKeyDown: handleKeyDown }, props)),
35
+ props.children && isOpened && React.createElement("div", { className: jsStyles.subItemMenu() }, props.children)));
36
+ });
37
+ SideMenuSubItem.displayName = 'SideMenuSubItem';
38
+ var SideMenuSubItemWithStaticFields = Object.assign(SideMenuSubItem, { __KONTUR_REACT_UI__: 'SideMenuSubItem' });
39
+ export { SideMenuSubItemWithStaticFields as SideMenuSubItem };
@@ -1,16 +1,9 @@
1
1
  import React from 'react';
2
2
  import { CommonProps } from '@skbkontur/react-ui/internal/CommonWrapper';
3
- export declare type SideMenuSubItemHeaderProps = CommonProps & {
3
+ export interface SideMenuSubItemHeaderProps extends CommonProps {
4
4
  children?: React.ReactNode;
5
- };
6
- /**
7
- * Заголовок списка второго уровня
8
- *
9
- * @visibleName SideMenu.SubItemHeader
10
- */
11
- export declare class SideMenuSubItemHeader extends React.Component<SideMenuSubItemHeaderProps> {
12
- static __KONTUR_REACT_UI__: string;
13
- static contextType: React.Context<import("./SideMenuContext").SideMenuContextType>;
14
- render(): JSX.Element;
15
- renderMain(): JSX.Element;
16
5
  }
6
+ declare const SideMenuSubItemHeaderWithStaticFields: React.ForwardRefExoticComponent<SideMenuSubItemHeaderProps & React.RefAttributes<HTMLParagraphElement>> & {
7
+ __KONTUR_REACT_UI__: string;
8
+ };
9
+ export { SideMenuSubItemHeaderWithStaticFields as SideMenuSubItemHeader };
@@ -1,27 +1,19 @@
1
- import { __assign, __extends } from "tslib";
2
- import React from 'react';
3
- import { CommonWrapper } from '@skbkontur/react-ui/internal/CommonWrapper';
1
+ import { __assign, __rest } from "tslib";
2
+ import React, { forwardRef } from 'react';
3
+ import { cx } from '@skbkontur/react-ui/lib/theming/Emotion';
4
4
  import { jsStyles } from './SideMenu.styles';
5
- import { SideMenuThemeContext } from './SideMenuContext';
6
5
  /**
7
6
  * Заголовок списка второго уровня
8
7
  *
9
8
  * @visibleName SideMenu.SubItemHeader
10
9
  */
11
- var SideMenuSubItemHeader = /** @class */ (function (_super) {
12
- __extends(SideMenuSubItemHeader, _super);
13
- function SideMenuSubItemHeader() {
14
- return _super !== null && _super.apply(this, arguments) || this;
15
- }
16
- SideMenuSubItemHeader.prototype.render = function () {
17
- return this.renderMain();
18
- };
19
- SideMenuSubItemHeader.prototype.renderMain = function () {
20
- return (React.createElement(CommonWrapper, __assign({}, this.props),
21
- React.createElement("div", { className: jsStyles.subItemHeader() }, this.props.children)));
22
- };
23
- SideMenuSubItemHeader.__KONTUR_REACT_UI__ = 'SideMenuSubItemHeader';
24
- SideMenuSubItemHeader.contextType = SideMenuThemeContext;
25
- return SideMenuSubItemHeader;
26
- }(React.Component));
27
- export { SideMenuSubItemHeader };
10
+ var SideMenuSubItemHeader = forwardRef(function (_a, ref) {
11
+ var _b;
12
+ var className = _a.className, children = _a.children, rest = __rest(_a, ["className", "children"]);
13
+ return (React.createElement("p", __assign({ className: cx((_b = {}, _b[jsStyles.subItemHeader()] = true, _b), className), ref: ref }, rest), children));
14
+ });
15
+ SideMenuSubItemHeader.displayName = 'SideMenuSubItemHeader';
16
+ var SideMenuSubItemHeaderWithStaticFields = Object.assign(SideMenuSubItemHeader, {
17
+ __KONTUR_REACT_UI__: 'SideMenuSubItemHeader',
18
+ });
19
+ export { SideMenuSubItemHeaderWithStaticFields as SideMenuSubItemHeader };