@gravity-ui/navigation 0.0.7 → 0.2.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 (90) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/build/cjs/components/ActionBar/ActionBar.d.ts +28 -0
  3. package/build/cjs/components/ActionBar/Group/ActionBarGroup.d.ts +10 -0
  4. package/build/cjs/components/ActionBar/Item/ActionBarItem.d.ts +11 -0
  5. package/build/cjs/components/ActionBar/Section/ActionBarSection.d.ts +9 -0
  6. package/build/cjs/components/ActionBar/Separator/ActionBarSeparator.d.ts +5 -0
  7. package/build/cjs/components/ActionBar/__stories__/ActionBar.stories.d.ts +44 -0
  8. package/build/cjs/components/ActionBar/__stories__/ActionBarShowcase.d.ts +2 -0
  9. package/build/cjs/components/ActionBar/index.d.ts +5 -0
  10. package/build/cjs/components/ActionBar/types.d.ts +3 -0
  11. package/build/cjs/{types/components → components}/AsideHeader/AsideHeader.d.ts +2 -7
  12. package/build/cjs/{types/components → components}/AsideHeader/Content.d.ts +0 -0
  13. package/build/cjs/{types/components → components}/AsideHeader/__stories__/AsideHeader.stories.d.ts +0 -0
  14. package/build/cjs/{types/components → components}/AsideHeader/__stories__/AsideHeaderShowcase.d.ts +0 -0
  15. package/build/cjs/components/AsideHeader/__stories__/getAsideHeaderWrapper.d.ts +3 -0
  16. package/build/cjs/{types/components → components}/AsideHeader/__stories__/moc.d.ts +0 -0
  17. package/build/cjs/{types/components → components}/CompositeBar/CompositeBar.d.ts +3 -2
  18. package/build/{esm/types → cjs}/components/CompositeBar/Item/Item.d.ts +1 -0
  19. package/build/cjs/{types/components → components}/CompositeBar/__stories__/CompositeBar.stories.d.ts +0 -0
  20. package/build/cjs/{types/components → components}/CompositeBar/__stories__/moc.d.ts +0 -0
  21. package/build/cjs/{types/components → components}/CompositeBar/constants.d.ts +0 -0
  22. package/build/cjs/components/CompositeBar/utils.d.ts +6 -0
  23. package/build/cjs/{types/components → components}/Drawer/Drawer.d.ts +0 -0
  24. package/build/cjs/{types/components → components}/Drawer/__stories__/Drawer.stories.d.ts +0 -0
  25. package/build/cjs/{types/components → components}/Drawer/__stories__/DrawerShowcase.d.ts +0 -0
  26. package/build/cjs/{types/components → components}/FooterItem/FooterItem.d.ts +1 -1
  27. package/build/cjs/{types/components → components}/FooterItem/__stories__/FooterItem.stories.d.ts +0 -0
  28. package/build/cjs/{types/components → components}/ItemTooltip/ItemTooltip.d.ts +0 -0
  29. package/build/cjs/{types/components → components}/Logo/Logo.d.ts +0 -0
  30. package/build/cjs/components/Settings/Settings.d.ts +49 -0
  31. package/build/cjs/components/Settings/SettingsMenu/SettingsMenu.d.ts +27 -0
  32. package/build/cjs/components/Settings/SettingsSearch/SettingsSearch.d.ts +10 -0
  33. package/build/{esm/types/components/AsideHeader/__stories__/AsideHeader.stories.d.ts → cjs/components/Settings/__stories__/Settings.stories.d.ts} +0 -0
  34. package/build/cjs/components/Settings/__stories__/SettingsDemo.d.ts +13 -0
  35. package/build/cjs/components/Settings/collect-settings.d.ts +40 -0
  36. package/build/cjs/components/Settings/helpers.d.ts +6 -0
  37. package/build/cjs/components/Settings/index.d.ts +1 -0
  38. package/build/cjs/{types/components → components}/constants.d.ts +0 -0
  39. package/build/cjs/{types/components → components}/index.d.ts +2 -0
  40. package/build/cjs/{types/components → components}/types.d.ts +1 -1
  41. package/build/cjs/{types/components → components}/utils/cn.d.ts +0 -0
  42. package/build/cjs/{types/index.d.ts → index.d.ts} +0 -0
  43. package/build/cjs/index.js +1187 -191
  44. package/build/cjs/index.js.map +1 -1
  45. package/build/esm/components/ActionBar/ActionBar.d.ts +28 -0
  46. package/build/esm/components/ActionBar/Group/ActionBarGroup.d.ts +10 -0
  47. package/build/esm/components/ActionBar/Item/ActionBarItem.d.ts +11 -0
  48. package/build/esm/components/ActionBar/Section/ActionBarSection.d.ts +9 -0
  49. package/build/esm/components/ActionBar/Separator/ActionBarSeparator.d.ts +5 -0
  50. package/build/esm/components/ActionBar/__stories__/ActionBar.stories.d.ts +44 -0
  51. package/build/esm/components/ActionBar/__stories__/ActionBarShowcase.d.ts +2 -0
  52. package/build/esm/components/ActionBar/index.d.ts +5 -0
  53. package/build/esm/components/ActionBar/types.d.ts +3 -0
  54. package/build/esm/{types/components → components}/AsideHeader/AsideHeader.d.ts +2 -7
  55. package/build/esm/{types/components → components}/AsideHeader/Content.d.ts +0 -0
  56. package/build/esm/{types/components/Drawer/__stories__/Drawer.stories.d.ts → components/AsideHeader/__stories__/AsideHeader.stories.d.ts} +0 -0
  57. package/build/esm/{types/components → components}/AsideHeader/__stories__/AsideHeaderShowcase.d.ts +0 -0
  58. package/build/esm/components/AsideHeader/__stories__/getAsideHeaderWrapper.d.ts +3 -0
  59. package/build/esm/{types/components → components}/AsideHeader/__stories__/moc.d.ts +0 -0
  60. package/build/esm/{types/components → components}/CompositeBar/CompositeBar.d.ts +3 -2
  61. package/build/{cjs/types → esm}/components/CompositeBar/Item/Item.d.ts +1 -0
  62. package/build/esm/{types/components → components}/CompositeBar/__stories__/CompositeBar.stories.d.ts +0 -0
  63. package/build/esm/{types/components → components}/CompositeBar/__stories__/moc.d.ts +0 -0
  64. package/build/esm/{types/components → components}/CompositeBar/constants.d.ts +0 -0
  65. package/build/esm/components/CompositeBar/utils.d.ts +6 -0
  66. package/build/esm/{types/components → components}/Drawer/Drawer.d.ts +0 -0
  67. package/build/esm/components/Drawer/__stories__/Drawer.stories.d.ts +4 -0
  68. package/build/esm/{types/components → components}/Drawer/__stories__/DrawerShowcase.d.ts +0 -0
  69. package/build/esm/{types/components → components}/FooterItem/FooterItem.d.ts +1 -1
  70. package/build/esm/{types/components → components}/FooterItem/__stories__/FooterItem.stories.d.ts +0 -0
  71. package/build/esm/{types/components → components}/ItemTooltip/ItemTooltip.d.ts +0 -0
  72. package/build/esm/{types/components → components}/Logo/Logo.d.ts +0 -0
  73. package/build/esm/components/Settings/Settings.d.ts +49 -0
  74. package/build/esm/components/Settings/SettingsMenu/SettingsMenu.d.ts +27 -0
  75. package/build/esm/components/Settings/SettingsSearch/SettingsSearch.d.ts +10 -0
  76. package/build/esm/components/Settings/__stories__/Settings.stories.d.ts +4 -0
  77. package/build/esm/components/Settings/__stories__/SettingsDemo.d.ts +13 -0
  78. package/build/esm/components/Settings/collect-settings.d.ts +40 -0
  79. package/build/esm/components/Settings/helpers.d.ts +6 -0
  80. package/build/esm/components/Settings/index.d.ts +1 -0
  81. package/build/esm/{types/components → components}/constants.d.ts +0 -0
  82. package/build/esm/{types/components → components}/index.d.ts +2 -0
  83. package/build/esm/{types/components → components}/types.d.ts +1 -1
  84. package/build/esm/{types/components → components}/utils/cn.d.ts +0 -0
  85. package/build/esm/{types/index.d.ts → index.d.ts} +0 -0
  86. package/build/esm/index.js +1187 -193
  87. package/build/esm/index.js.map +1 -1
  88. package/package.json +1 -1
  89. package/build/cjs/types/components/CompositeBar/utils.d.ts +0 -4
  90. package/build/esm/types/components/CompositeBar/utils.d.ts +0 -4
@@ -87,6 +87,84 @@ function block(name) {
87
87
  return _default(`${NAMESPACE}${name}`);
88
88
  }
89
89
 
90
+ function styleInject(css, ref) {
91
+ if ( ref === void 0 ) ref = {};
92
+ var insertAt = ref.insertAt;
93
+
94
+ if (!css || typeof document === 'undefined') { return; }
95
+
96
+ var head = document.head || document.getElementsByTagName('head')[0];
97
+ var style = document.createElement('style');
98
+ style.type = 'text/css';
99
+
100
+ if (insertAt === 'top') {
101
+ if (head.firstChild) {
102
+ head.insertBefore(style, head.firstChild);
103
+ } else {
104
+ head.appendChild(style);
105
+ }
106
+ } else {
107
+ head.appendChild(style);
108
+ }
109
+
110
+ if (style.styleSheet) {
111
+ style.styleSheet.cssText = css;
112
+ } else {
113
+ style.appendChild(document.createTextNode(css));
114
+ }
115
+ }
116
+
117
+ var css_248z$d = ".ycn-action-bar-group {\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n justify-content: flex-start;\n margin: 0;\n padding: 0;\n}\n.ycn-action-bar-group_pull_left {\n margin-left: 0;\n margin-right: auto;\n}\n.ycn-action-bar-group_pull_right {\n margin-left: auto;\n margin-right: 0;\n}\n.ycn-action-bar-group_pull_center {\n margin-left: auto;\n margin-right: auto;\n}";
118
+ styleInject(css_248z$d);
119
+
120
+ const b$e = block('action-bar-group');
121
+ const ActionBarGroup = ({ children, className, pull }) => {
122
+ return (React__default["default"].createElement("ul", { className: b$e({ pull }, className), role: "group" }, children));
123
+ };
124
+ ActionBarGroup.displayName = 'ActionBar.Group';
125
+
126
+ var css_248z$c = ".ycn-action-bar-item {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n.ycn-action-bar-item_pull_left {\n margin-left: 0;\n margin-right: auto;\n}\n.ycn-action-bar-item_pull_right {\n margin-left: auto;\n margin-right: 0;\n}\n.ycn-action-bar-item_pull_center {\n margin-left: auto;\n margin-right: auto;\n}\n.ycn-action-bar-item + .ycn-action-bar-item_spacing {\n margin-left: 8px;\n}";
127
+ styleInject(css_248z$c);
128
+
129
+ const b$d = block('action-bar-item');
130
+ const ActionBarItem = ({ children, className, pull, spacing = true }) => {
131
+ return React__default["default"].createElement("li", { className: b$d({ pull, spacing }, className) }, children);
132
+ };
133
+ ActionBarItem.displayName = 'ActionBar.Item';
134
+
135
+ var css_248z$b = ".ycn-action-bar-section {\n display: flex;\n flex-flow: row nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.ycn-action-bar-section + .ycn-action-bar-section {\n border-left: solid 1px var(--yc-color-line-generic);\n}\n.ycn-action-bar-section_type_primary {\n flex: 1 1 auto;\n padding-left: 20px;\n padding-right: 20px;\n}\n.ycn-action-bar-section_type_secondary {\n padding-left: 6px;\n padding-right: 6px;\n}";
136
+ styleInject(css_248z$b);
137
+
138
+ const b$c = block('action-bar-section');
139
+ const ActionBarSection = ({ children, type = 'primary' }) => {
140
+ return React__default["default"].createElement("div", { className: b$c({ type }) }, children);
141
+ };
142
+ ActionBarSection.displayName = 'ActionBar.Section';
143
+
144
+ var css_248z$a = ".ycn-action-bar-separator {\n list-style: none;\n margin: 0;\n padding: 0;\n margin-left: 6px;\n margin-right: 6px;\n border-right: solid 1px var(--yc-color-line-generic);\n height: 40px;\n}";
145
+ styleInject(css_248z$a);
146
+
147
+ const b$b = block('action-bar-separator');
148
+ const ActionBarSeparator = () => {
149
+ return React__default["default"].createElement("li", { role: "separator", className: b$b() });
150
+ };
151
+ ActionBarSeparator.displayName = 'ActionBar.Separator';
152
+
153
+ var css_248z$9 = ".ycn-action-bar {\n box-sizing: border-box;\n height: 40px;\n border-bottom: solid 1px var(--yc-color-line-generic);\n display: flex;\n flex-flow: row nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}";
154
+ styleInject(css_248z$9);
155
+
156
+ const b$a = block('action-bar');
157
+ const ActionBar = ({ children, className, 'aria-label': ariaLabel }) => {
158
+ return (React__default["default"].createElement("section", { className: b$a(null, className), "aria-label": ariaLabel }, children));
159
+ };
160
+ ActionBar.displayName = 'ActionBar';
161
+ const PublicActionBar = Object.assign(ActionBar, {
162
+ Section: ActionBarSection,
163
+ Group: ActionBarGroup,
164
+ Item: ActionBarItem,
165
+ Separator: ActionBarSeparator,
166
+ });
167
+
90
168
  exports.Dict = void 0;
91
169
  (function (Dict) {
92
170
  Dict["ExpandButton"] = "button_expand";
@@ -97,7 +175,7 @@ exports.Dict = void 0;
97
175
  const ASIDE_HEADER_FOOTER_ICON_SIZE = 20;
98
176
  const ASIDE_HEADER_COMPACT_WIDTH = 56;
99
177
  const ASIDE_HEADER_EXPANDED_WIDTH = 236;
100
- const defaultDict = {
178
+ const defaultDict$1 = {
101
179
  [exports.Dict.CollapseButton]: 'Collapse',
102
180
  [exports.Dict.ExpandButton]: 'Expand',
103
181
  [exports.Dict.MoreButton]: 'More',
@@ -107,14 +185,12 @@ function _extends$4() {
107
185
  _extends$4 = Object.assign ? Object.assign.bind() : function (target) {
108
186
  for (var i = 1; i < arguments.length; i++) {
109
187
  var source = arguments[i];
110
-
111
188
  for (var key in source) {
112
189
  if (Object.prototype.hasOwnProperty.call(source, key)) {
113
190
  target[key] = source[key];
114
191
  }
115
192
  }
116
193
  }
117
-
118
194
  return target;
119
195
  };
120
196
  return _extends$4.apply(this, arguments);
@@ -125,13 +201,11 @@ function _objectWithoutPropertiesLoose(source, excluded) {
125
201
  var target = {};
126
202
  var sourceKeys = Object.keys(source);
127
203
  var key, i;
128
-
129
204
  for (i = 0; i < sourceKeys.length; i++) {
130
205
  key = sourceKeys[i];
131
206
  if (excluded.indexOf(key) >= 0) continue;
132
207
  target[key] = source[key];
133
208
  }
134
-
135
209
  return target;
136
210
  }
137
211
 
@@ -1398,6 +1472,10 @@ var classNamesShape = process.env.NODE_ENV !== 'production' ? propTypes.exports.
1398
1472
 
1399
1473
  var TransitionGroupContext = React__default["default"].createContext(null);
1400
1474
 
1475
+ var forceReflow = function forceReflow(node) {
1476
+ return node.scrollTop;
1477
+ };
1478
+
1401
1479
  var UNMOUNTED = 'unmounted';
1402
1480
  var EXITED = 'exited';
1403
1481
  var ENTERING = 'entering';
@@ -1617,6 +1695,14 @@ var Transition = /*#__PURE__*/function (_React$Component) {
1617
1695
  this.cancelNextCallback();
1618
1696
 
1619
1697
  if (nextStatus === ENTERING) {
1698
+ if (this.props.unmountOnExit || this.props.mountOnEnter) {
1699
+ var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM__default["default"].findDOMNode(this); // https://github.com/reactjs/react-transition-group/pull/749
1700
+ // With unmountOnExit or mountOnEnter, the enter animation should happen at the transition between `exited` and `entering`.
1701
+ // To make the animation happen, we have to separate each rendering and avoid being processed as batched.
1702
+
1703
+ if (node) forceReflow(node);
1704
+ }
1705
+
1620
1706
  this.performEnter(mounting);
1621
1707
  } else {
1622
1708
  this.performExit();
@@ -1809,7 +1895,10 @@ Transition.propTypes = process.env.NODE_ENV !== "production" ? {
1809
1895
  * [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).
1810
1896
  */
1811
1897
  nodeRef: propTypes.exports.shape({
1812
- current: typeof Element === 'undefined' ? propTypes.exports.any : propTypes.exports.instanceOf(Element)
1898
+ current: typeof Element === 'undefined' ? propTypes.exports.any : function (propValue, key, componentName, location, propFullName, secret) {
1899
+ var value = propValue[key];
1900
+ return propTypes.exports.instanceOf(value && 'ownerDocument' in value ? value.ownerDocument.defaultView.Element : Element)(propValue, key, componentName, location, propFullName, secret);
1901
+ }
1813
1902
  }),
1814
1903
 
1815
1904
  /**
@@ -2217,13 +2306,12 @@ var CSSTransition = /*#__PURE__*/function (_React$Component) {
2217
2306
 
2218
2307
  if (type === 'appear' && phase === 'done' && doneClassName) {
2219
2308
  className += " " + doneClassName;
2220
- } // This is for to force a repaint,
2309
+ } // This is to force a repaint,
2221
2310
  // which is necessary in order to transition styles when adding a class name.
2222
2311
 
2223
2312
 
2224
2313
  if (phase === 'active') {
2225
- /* eslint-disable no-unused-expressions */
2226
- node && node.scrollTop;
2314
+ if (node) forceReflow(node);
2227
2315
  }
2228
2316
 
2229
2317
  if (className) {
@@ -2409,7 +2497,6 @@ function _assertThisInitialized(self) {
2409
2497
  if (self === void 0) {
2410
2498
  throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
2411
2499
  }
2412
-
2413
2500
  return self;
2414
2501
  }
2415
2502
 
@@ -3113,42 +3200,15 @@ SwitchTransition.defaultProps = {
3113
3200
  mode: modes.out
3114
3201
  };
3115
3202
 
3116
- function styleInject(css, ref) {
3117
- if ( ref === void 0 ) ref = {};
3118
- var insertAt = ref.insertAt;
3119
-
3120
- if (!css || typeof document === 'undefined') { return; }
3121
-
3122
- var head = document.head || document.getElementsByTagName('head')[0];
3123
- var style = document.createElement('style');
3124
- style.type = 'text/css';
3125
-
3126
- if (insertAt === 'top') {
3127
- if (head.firstChild) {
3128
- head.insertBefore(style, head.firstChild);
3129
- } else {
3130
- head.appendChild(style);
3131
- }
3132
- } else {
3133
- head.appendChild(style);
3134
- }
3135
-
3136
- if (style.styleSheet) {
3137
- style.styleSheet.cssText = css;
3138
- } else {
3139
- style.appendChild(document.createTextNode(css));
3140
- }
3141
- }
3142
-
3143
- var css_248z$6 = ".ycn-drawer__item {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n height: 100%;\n will-change: transform;\n background-color: var(--yc-color-base-background);\n}\n.ycn-drawer__item-transition-enter {\n transform: translate(-100%, 0);\n}\n.ycn-drawer__item-transition-enter-active {\n transform: translate(0, 0);\n transition: transform 300ms;\n}\n.ycn-drawer__item-transition-enter-done {\n filter: blur(0px);\n transform: translateZ(0);\n}\n.ycn-drawer__item-transition-exit {\n transform: translate(0, 0);\n}\n.ycn-drawer__item-transition-exit-active {\n transform: translate(-100%, 0);\n transition: transform 300ms;\n}\n.ycn-drawer__item-transition-exit-done {\n visibility: hidden;\n}\n.ycn-drawer__veil {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n background-color: var(--yc-color-sfx-veil);\n}\n.ycn-drawer__veil-transition-enter {\n opacity: 0;\n}\n.ycn-drawer__veil-transition-enter-active {\n opacity: 1;\n transition: opacity 300ms;\n}\n.ycn-drawer__veil-transition-exit {\n opacity: 1;\n}\n.ycn-drawer__veil-transition-exit-active {\n opacity: 0;\n transition: opacity 300ms;\n}\n.ycn-drawer__veil-transition-exit-done {\n visibility: hidden;\n}";
3144
- styleInject(css_248z$6);
3203
+ var css_248z$8 = ".ycn-drawer__item {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n height: 100%;\n will-change: transform;\n background-color: var(--yc-color-base-background);\n}\n.ycn-drawer__item-transition-enter {\n transform: translate(-100%, 0);\n}\n.ycn-drawer__item-transition-enter-active {\n transform: translate(0, 0);\n transition: transform 300ms;\n}\n.ycn-drawer__item-transition-enter-done {\n filter: blur(0px);\n transform: translateZ(0);\n}\n.ycn-drawer__item-transition-exit {\n transform: translate(0, 0);\n}\n.ycn-drawer__item-transition-exit-active {\n transform: translate(-100%, 0);\n transition: transform 300ms;\n}\n.ycn-drawer__item-transition-exit-done {\n visibility: hidden;\n}\n.ycn-drawer__veil {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n background-color: var(--yc-color-sfx-veil);\n}\n.ycn-drawer__veil-transition-enter {\n opacity: 0;\n}\n.ycn-drawer__veil-transition-enter-active {\n opacity: 1;\n transition: opacity 300ms;\n}\n.ycn-drawer__veil-transition-exit {\n opacity: 1;\n}\n.ycn-drawer__veil-transition-exit-active {\n opacity: 0;\n transition: opacity 300ms;\n}\n.ycn-drawer__veil-transition-exit-done {\n visibility: hidden;\n}";
3204
+ styleInject(css_248z$8);
3145
3205
 
3146
- const b$6 = block('drawer');
3206
+ const b$9 = block('drawer');
3147
3207
  const TIMEOUT = 300;
3148
3208
  const DrawerItem = ({ visible, content, className }) => {
3149
3209
  const itemRef = React__default["default"].useRef(null);
3150
- return (React__default["default"].createElement(CSSTransition, { in: visible, timeout: TIMEOUT, unmountOnExit: true, classNames: b$6('item-transition'), nodeRef: itemRef },
3151
- React__default["default"].createElement("div", { ref: itemRef, className: b$6('item', className) }, content)));
3210
+ return (React__default["default"].createElement(CSSTransition, { in: visible, timeout: TIMEOUT, unmountOnExit: true, classNames: b$9('item-transition'), nodeRef: itemRef },
3211
+ React__default["default"].createElement("div", { ref: itemRef, className: b$9('item', className) }, content)));
3152
3212
  };
3153
3213
  const Drawer = ({ className, children, style, onVeilClick, onEscape, preventScrollBody = true, }) => {
3154
3214
  let someItemVisible = false;
@@ -3206,9 +3266,9 @@ const Drawer = ({ className, children, style, onVeilClick, onEscape, preventScro
3206
3266
  const veilRef = React__default["default"].useRef(null);
3207
3267
  return (React__default["default"].createElement(Transition, { in: someItemVisible, timeout: { enter: 0, exit: TIMEOUT }, mountOnEnter: true, unmountOnExit: true, nodeRef: containerRef }, (state) => {
3208
3268
  const childrenVisible = someItemVisible && state === 'entered';
3209
- return (React__default["default"].createElement("div", { ref: containerRef, className: b$6(null, className), style: style },
3210
- React__default["default"].createElement(CSSTransition, { in: childrenVisible, timeout: TIMEOUT, unmountOnExit: true, classNames: b$6('veil-transition'), nodeRef: veilRef },
3211
- React__default["default"].createElement("div", { ref: veilRef, className: b$6('veil'), onClick: onVeilClick })),
3269
+ return (React__default["default"].createElement("div", { ref: containerRef, className: b$9(null, className), style: style },
3270
+ React__default["default"].createElement(CSSTransition, { in: childrenVisible, timeout: TIMEOUT, unmountOnExit: true, classNames: b$9('veil-transition'), nodeRef: veilRef },
3271
+ React__default["default"].createElement("div", { ref: veilRef, className: b$9('veil'), onClick: onVeilClick })),
3212
3272
  React__default["default"].Children.map(children, (child) => {
3213
3273
  const childElem = child;
3214
3274
  if (childElem.type === DrawerItem) {
@@ -3220,10 +3280,10 @@ const Drawer = ({ className, children, style, onVeilClick, onEscape, preventScro
3220
3280
  }));
3221
3281
  };
3222
3282
 
3223
- var css_248z$5 = ".ycn-logo {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n height: 40px;\n}\n.ycn-logo__logo-btn-place {\n flex-shrink: 0;\n width: var(--aside-header-min-width);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.ycn-logo__btn-logo.yc-button_view_flat.yc-button_size_l {\n --yc-button-height: 38px;\n}\n.ycn-logo__logo {\n font-size: var(--yc-text-body-2-font-size);\n line-height: var(--yc-text-body-2-line-height);\n font-weight: var(--yc-text-body-font-weight);\n vertical-align: middle;\n}\n.ycn-logo__logo-link, .ycn-logo__logo-link:hover, .ycn-logo__logo-link:active, .ycn-logo__logo-link:visited, .ycn-logo__logo-link:focus {\n text-decoration: none;\n outline: none;\n color: inherit;\n}\n.yc-root .ycn-logo__btn-logo.button2_theme_flat.button2_hovered_yes::before {\n background-color: transparent;\n}";
3224
- styleInject(css_248z$5);
3283
+ var css_248z$7 = ".ycn-logo {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n height: 40px;\n}\n.ycn-logo__logo-btn-place {\n flex-shrink: 0;\n width: var(--aside-header-min-width);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.ycn-logo__btn-logo.yc-button_view_flat.yc-button_size_l {\n --yc-button-height: 38px;\n}\n.ycn-logo__logo {\n font-size: var(--yc-text-body-2-font-size);\n line-height: var(--yc-text-body-2-line-height);\n font-weight: var(--yc-text-body-font-weight);\n vertical-align: middle;\n}\n.ycn-logo__logo-link, .ycn-logo__logo-link:hover, .ycn-logo__logo-link:active, .ycn-logo__logo-link:visited, .ycn-logo__logo-link:focus {\n text-decoration: none;\n outline: none;\n color: inherit;\n}\n.yc-root .ycn-logo__btn-logo.button2_theme_flat.button2_hovered_yes::before {\n background-color: transparent;\n}";
3284
+ styleInject(css_248z$7);
3225
3285
 
3226
- const b$5 = block('logo');
3286
+ const b$8 = block('logo');
3227
3287
  const Logo = ({ text, compact, icon, iconSrc, iconClassName, iconSize = 24, textSize = 15, href = '/', wrapper, onClick, }) => {
3228
3288
  const hasClickHandler = typeof onClick === 'function';
3229
3289
  const hasWrapper = typeof wrapper === 'function';
@@ -3241,18 +3301,18 @@ const Logo = ({ text, compact, icon, iconSrc, iconClassName, iconSize = 24, text
3241
3301
  else if (icon) {
3242
3302
  buttonIcon = React__default["default"].createElement(uikit.Icon, { data: icon, size: iconSize, className: iconClassName });
3243
3303
  }
3244
- const button = (React__default["default"].createElement(uikit.Button, Object.assign({ view: "flat", size: "l", className: b$5('btn-logo'), component: hasWrapper ? 'span' : undefined, onClick: onClick }, linkProps), buttonIcon));
3304
+ const button = (React__default["default"].createElement(uikit.Button, Object.assign({ view: "flat", size: "l", className: b$8('btn-logo'), component: hasWrapper ? 'span' : undefined, onClick: onClick }, linkProps), buttonIcon));
3245
3305
  let logo;
3246
3306
  if (typeof text === 'function') {
3247
3307
  logo = text();
3248
3308
  }
3249
3309
  else {
3250
- logo = (React__default["default"].createElement("div", { className: b$5('logo'), style: { fontSize: textSize } }, text));
3310
+ logo = (React__default["default"].createElement("div", { className: b$8('logo'), style: { fontSize: textSize } }, text));
3251
3311
  }
3252
- return (React__default["default"].createElement("div", { className: b$5() },
3253
- React__default["default"].createElement("div", { className: b$5('logo-btn-place') }, hasWrapper ? wrapper(button, compact) : button),
3312
+ return (React__default["default"].createElement("div", { className: b$8() },
3313
+ React__default["default"].createElement("div", { className: b$8('logo-btn-place') }, hasWrapper ? wrapper(button, compact) : button),
3254
3314
  !compact &&
3255
- (hasWrapper ? (wrapper(logo, compact)) : (React__default["default"].createElement("a", Object.assign({}, linkProps, { className: b$5('logo-link'), onClick: onClick }), logo)))));
3315
+ (hasWrapper ? (wrapper(logo, compact)) : (React__default["default"].createElement("a", Object.assign({}, linkProps, { className: b$8('logo-link'), onClick: onClick }), logo)))));
3256
3316
  };
3257
3317
 
3258
3318
  var classCallCheck = function (instance, Constructor) {
@@ -3749,6 +3809,8 @@ function getItemHeight(item) {
3749
3809
  switch (item.type) {
3750
3810
  case 'action':
3751
3811
  return 50;
3812
+ case 'divider':
3813
+ return 15;
3752
3814
  default:
3753
3815
  return ITEM_HEIGHT;
3754
3816
  }
@@ -3756,15 +3818,36 @@ function getItemHeight(item) {
3756
3818
  function getItemsHeight(items) {
3757
3819
  return items.reduce((sum, item) => sum + getItemHeight(item), 0);
3758
3820
  }
3759
- const getSelectedItemIndex = (items) => {
3821
+ function getSelectedItemIndex(items) {
3760
3822
  const index = items.findIndex(({ current }) => Boolean(current));
3761
3823
  return index === -1 ? undefined : index;
3762
- };
3824
+ }
3825
+ function getPinnedItems(items) {
3826
+ const pinnedItems = [];
3827
+ for (const item of items) {
3828
+ if (item.pinned) {
3829
+ pinnedItems.push(item);
3830
+ }
3831
+ else if (item.type === 'divider') {
3832
+ if (pinnedItems.length > 0 && pinnedItems[pinnedItems.length - 1].type !== 'divider') {
3833
+ pinnedItems.push(item);
3834
+ }
3835
+ }
3836
+ }
3837
+ return pinnedItems;
3838
+ }
3839
+ function getItemsMinHeight(items) {
3840
+ const pinnedItems = getPinnedItems(items);
3841
+ const afterMoreButtonItems = items.filter((item) => item.afterMoreButton);
3842
+ return (getItemsHeight(pinnedItems) +
3843
+ getItemsHeight(afterMoreButtonItems) +
3844
+ (pinnedItems.length === items.length ? 0 : ITEM_HEIGHT));
3845
+ }
3763
3846
 
3764
- var css_248z$4 = ".ycn-item-tooltip.yc-popup {\n animation-name: none;\n box-shadow: none;\n border: none;\n}\n.ycn-item-tooltip__text {\n padding: 6px 12px;\n background-color: var(--yc-color-base-float-heavy);\n color: var(--yc-color-text-light-primary);\n border-radius: 4px;\n}";
3765
- styleInject(css_248z$4);
3847
+ var css_248z$6 = ".ycn-item-tooltip.yc-popup {\n animation-name: none;\n box-shadow: none;\n border: none;\n}\n.ycn-item-tooltip__text {\n padding: 6px 12px;\n background-color: var(--yc-color-base-float-heavy);\n color: var(--yc-color-text-light-primary);\n border-radius: 4px;\n}";
3848
+ styleInject(css_248z$6);
3766
3849
 
3767
- const b$4 = block('item-tooltip');
3850
+ const b$7 = block('item-tooltip');
3768
3851
  const popupPlacement = ['right'];
3769
3852
  const ItemTooltip = ({ anchor, text }) => {
3770
3853
  const anchorRef = React__default["default"].useRef(anchor);
@@ -3774,26 +3857,29 @@ const ItemTooltip = ({ anchor, text }) => {
3774
3857
  if (!anchor) {
3775
3858
  return null;
3776
3859
  }
3777
- return (React__default["default"].createElement(uikit.Popup, { className: b$4(), open: true, anchorRef: anchorRef, placement: popupPlacement, disableEscapeKeyDown: true, disableOutsideClick: true, disableLayer: true },
3778
- React__default["default"].createElement("div", { className: b$4('text') }, text)));
3860
+ return (React__default["default"].createElement(uikit.Popup, { className: b$7(), open: true, anchorRef: anchorRef, placement: popupPlacement, disableEscapeKeyDown: true, disableOutsideClick: true, disableLayer: true },
3861
+ React__default["default"].createElement("div", { className: b$7('text') }, text)));
3779
3862
  };
3780
3863
 
3781
- var css_248z$3 = ".ycn-composite-bar-item {\n --composite-bar-item-action-size: 36px;\n display: flex;\n width: 100%;\n height: 100%;\n align-items: center;\n cursor: pointer;\n}\n.ycn-composite-bar-item__icon {\n color: var(--yc-color-text-misc);\n}\n.ycn-composite-bar-item__icon-place {\n flex-shrink: 0;\n width: var(--aside-header-min-width);\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n.ycn-composite-bar-item__title {\n display: flex;\n overflow: hidden;\n}\n.ycn-composite-bar-item__title-text {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.ycn-composite-bar-item__title-adornment {\n margin: 0 10px;\n}\n.ycn-composite-bar-item__collapse-item {\n display: flex;\n padding: 0 16px;\n align-items: center;\n width: 100%;\n height: 100%;\n cursor: pointer;\n}\n.ycn-composite-bar-item__collapse-item .ycn-composite-bar-item__title-adornment {\n margin-right: 0;\n}\n.ycn-composite-bar-item__collapse-items-popup-content {\n padding: 4px 0;\n}\n.ycn-composite-bar-item__link {\n display: flex;\n width: 100%;\n height: 100%;\n align-items: center;\n}\n.ycn-composite-bar-item__link, .ycn-composite-bar-item__link:hover, .ycn-composite-bar-item__link:active, .ycn-composite-bar-item__link:visited, .ycn-composite-bar-item__link:focus {\n text-decoration: none;\n outline: none;\n color: inherit;\n}\n.ycn-composite-bar-item__btn-icon {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.ycn-composite-bar-item_type_action {\n justify-content: center;\n height: var(--composite-bar-item-action-size);\n margin: 0 10px 8px;\n background: var(--yc-color-base-float);\n box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.03), 0px 5px 6px rgba(0, 0, 0, 0.12);\n border-radius: var(--composite-bar-item-action-size);\n transition: transform 0.1s ease-out, background-color 0.15s linear;\n}\n.ycn-composite-bar-item_type_action:focus {\n box-shadow: 0 0 0 2px var(--yc-color-line-misc);\n}\n.ycn-composite-bar-item_type_action:focus:not(:focus-visible) {\n box-shadow: none;\n}\n.ycn-composite-bar-item_type_action:hover {\n background-color: var(--yc-color-base-float-hover);\n}\n.ycn-composite-bar-item_type_action:active {\n box-shadow: 0 1px 2px var(--yc-color-sfx-shadow);\n transition: none;\n transform: scale(0.96);\n}\n.ycn-composite-bar-item_type_action .ycn-composite-bar-item__icon-place {\n width: var(--composite-bar-item-action-size);\n}\n.ycn-composite-bar-item_type_action .ycn-composite-bar-item__title {\n margin-right: 16px;\n}\n.ycn-composite-bar-item:not(.ycn-composite-bar-item_compact).ycn-composite-bar-item_current.ycn-composite-bar-item_type_regular {\n background-color: var(--yc-color-base-selection);\n}\n.ycn-composite-bar-item:not(.ycn-composite-bar-item_compact):not(.ycn-composite-bar-item_current):hover.ycn-composite-bar-item_type_regular {\n background-color: var(--yc-color-base-simple-hover);\n}\n.ycn-composite-bar-item_compact.ycn-composite-bar-item_type_action {\n width: var(--composite-bar-item-action-size);\n}\n.ycn-composite-bar-item_compact.ycn-composite-bar-item_type_action .ycn-composite-bar-item__title {\n margin: 0;\n}\n.ycn-composite-bar-item_compact.ycn-composite-bar-item_current.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon {\n position: relative;\n background-color: transparent;\n}\n.ycn-composite-bar-item_compact.ycn-composite-bar-item_current.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon::before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: -1;\n width: 38px;\n height: 38px;\n margin-top: -19px;\n margin-left: -19px;\n border-radius: 7px;\n}\n.ycn-composite-bar-item_compact.ycn-composite-bar-item_current.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon::before {\n background-color: var(--yc-color-base-selection);\n}\n.ycn-composite-bar-item_compact:not(.ycn-composite-bar-item_current):hover.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon {\n position: relative;\n background-color: transparent;\n}\n.ycn-composite-bar-item_compact:not(.ycn-composite-bar-item_current):hover.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon::before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: -1;\n width: 38px;\n height: 38px;\n margin-top: -19px;\n margin-left: -19px;\n border-radius: 7px;\n}\n.ycn-composite-bar-item_compact:not(.ycn-composite-bar-item_current):hover.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon::before {\n background-color: var(--yc-color-base-simple-hover);\n}";
3782
- styleInject(css_248z$3);
3864
+ var css_248z$5 = ".ycn-composite-bar-item {\n --composite-bar-item-action-size: 36px;\n display: flex;\n width: 100%;\n height: 100%;\n align-items: center;\n cursor: pointer;\n}\n.ycn-composite-bar-item__icon {\n color: var(--yc-color-text-misc);\n}\n.ycn-composite-bar-item__icon-place {\n flex-shrink: 0;\n width: var(--aside-header-min-width);\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n}\n.ycn-composite-bar-item__title {\n display: flex;\n overflow: hidden;\n}\n.ycn-composite-bar-item__title-text {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.ycn-composite-bar-item__title-adornment {\n margin: 0 10px;\n}\n.ycn-composite-bar-item__collapse-item {\n display: flex;\n padding: 0 16px;\n align-items: center;\n width: 100%;\n height: 100%;\n cursor: pointer;\n}\n.ycn-composite-bar-item__collapse-item .ycn-composite-bar-item__title-adornment {\n margin-right: 0;\n}\n.ycn-composite-bar-item__menu-divider {\n margin: 0 8px;\n width: 100%;\n border-top: 1px solid var(--yc-color-line-generic);\n cursor: default;\n}\n.ycn-composite-bar-item__collapse-items-popup-content {\n padding: 4px 0;\n}\n.ycn-composite-bar-item__link {\n display: flex;\n width: 100%;\n height: 100%;\n align-items: center;\n}\n.ycn-composite-bar-item__link, .ycn-composite-bar-item__link:hover, .ycn-composite-bar-item__link:active, .ycn-composite-bar-item__link:visited, .ycn-composite-bar-item__link:focus {\n text-decoration: none;\n outline: none;\n color: inherit;\n}\n.ycn-composite-bar-item__btn-icon {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.ycn-composite-bar-item_type_action {\n justify-content: center;\n height: var(--composite-bar-item-action-size);\n margin: 0 10px 8px;\n background: var(--yc-color-base-float);\n box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.03), 0px 5px 6px rgba(0, 0, 0, 0.12);\n border-radius: var(--composite-bar-item-action-size);\n transition: transform 0.1s ease-out, background-color 0.15s linear;\n}\n.ycn-composite-bar-item_type_action:focus {\n box-shadow: 0 0 0 2px var(--yc-color-line-misc);\n}\n.ycn-composite-bar-item_type_action:focus:not(:focus-visible) {\n box-shadow: none;\n}\n.ycn-composite-bar-item_type_action:hover {\n background-color: var(--yc-color-base-float-hover);\n}\n.ycn-composite-bar-item_type_action:active {\n box-shadow: 0 1px 2px var(--yc-color-sfx-shadow);\n transition: none;\n transform: scale(0.96);\n}\n.ycn-composite-bar-item_type_action .ycn-composite-bar-item__icon-place {\n width: var(--composite-bar-item-action-size);\n}\n.ycn-composite-bar-item_type_action .ycn-composite-bar-item__title {\n margin-right: 16px;\n}\n.ycn-composite-bar-item:not(.ycn-composite-bar-item_compact).ycn-composite-bar-item_current.ycn-composite-bar-item_type_regular {\n background-color: var(--yc-color-base-selection);\n}\n.ycn-composite-bar-item:not(.ycn-composite-bar-item_compact):not(.ycn-composite-bar-item_current):hover.ycn-composite-bar-item_type_regular {\n background-color: var(--yc-color-base-simple-hover);\n}\n.ycn-composite-bar-item_compact.ycn-composite-bar-item_type_action {\n width: var(--composite-bar-item-action-size);\n}\n.ycn-composite-bar-item_compact.ycn-composite-bar-item_type_action .ycn-composite-bar-item__title {\n margin: 0;\n}\n.ycn-composite-bar-item_compact.ycn-composite-bar-item_current.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon {\n position: relative;\n background-color: transparent;\n}\n.ycn-composite-bar-item_compact.ycn-composite-bar-item_current.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon::before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: -1;\n width: 38px;\n height: 38px;\n margin-top: -19px;\n margin-left: -19px;\n border-radius: 7px;\n}\n.ycn-composite-bar-item_compact.ycn-composite-bar-item_current.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon::before {\n background-color: var(--yc-color-base-selection);\n}\n.ycn-composite-bar-item_compact:not(.ycn-composite-bar-item_current):hover.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon {\n position: relative;\n background-color: transparent;\n}\n.ycn-composite-bar-item_compact:not(.ycn-composite-bar-item_current):hover.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon::before {\n content: \"\";\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: -1;\n width: 38px;\n height: 38px;\n margin-top: -19px;\n margin-left: -19px;\n border-radius: 7px;\n}\n.ycn-composite-bar-item_compact:not(.ycn-composite-bar-item_current):hover.ycn-composite-bar-item_type_regular .ycn-composite-bar-item__btn-icon::before {\n background-color: var(--yc-color-base-simple-hover);\n}";
3865
+ styleInject(css_248z$5);
3783
3866
 
3784
- const b$3 = block('composite-bar-item');
3867
+ const b$6 = block('composite-bar-item');
3785
3868
  function renderItemTitle(item) {
3786
- let titleNode = React__default["default"].createElement("div", { className: b$3('title-text') }, item.title);
3869
+ let titleNode = React__default["default"].createElement("div", { className: b$6('title-text') }, item.title);
3787
3870
  if (item.rightAdornment) {
3788
3871
  titleNode = (React__default["default"].createElement(React__default["default"].Fragment, null,
3789
3872
  titleNode,
3790
- React__default["default"].createElement("div", { className: b$3('title-adornment') }, item.rightAdornment)));
3873
+ React__default["default"].createElement("div", { className: b$6('title-adornment') }, item.rightAdornment)));
3791
3874
  }
3792
3875
  return titleNode;
3793
3876
  }
3794
3877
  const defaultPopupPlacement = ['right-end'];
3795
3878
  const defaultPopupOffset = [-20, 8];
3796
- const Item = ({ item, compact, className, collapseItems, onMouseLeave, onMouseEnter, enableTooltip = true, popupVisible = false, popupAnchor, popupPlacement = defaultPopupPlacement, popupOffset = defaultPopupOffset, renderPopupContent, onClosePopup, }) => {
3879
+ const Item = ({ item, compact, className, collapseItems, onMouseLeave, onMouseEnter, enableTooltip = true, popupVisible = false, popupAnchor, popupPlacement = defaultPopupPlacement, popupOffset = defaultPopupOffset, renderPopupContent, onClosePopup, onItemClick, }) => {
3880
+ if (item.type === 'divider') {
3881
+ return React__default["default"].createElement("div", { className: b$6('menu-divider') });
3882
+ }
3797
3883
  const [tooltipAnchor, setTooltipAnchor] = React__default["default"].useState(null);
3798
3884
  const [open, toggleOpen] = React__default["default"].useState(false);
3799
3885
  const ref = React__default["default"].useRef(null);
@@ -3813,14 +3899,19 @@ const Item = ({ item, compact, className, collapseItems, onMouseLeave, onMouseEn
3813
3899
  }
3814
3900
  onClosePopup === null || onClosePopup === void 0 ? void 0 : onClosePopup();
3815
3901
  }, [onClosePopup]);
3816
- const node = (React__default["default"].createElement("div", { className: b$3({ type, current, compact }, className), ref: ref, onClick: () => {
3817
- if (typeof item.onItemClick === 'function') {
3818
- item.onItemClick(item, false);
3819
- }
3902
+ const node = (React__default["default"].createElement("div", { className: b$6({ type, current, compact }, className), ref: ref, onClick: () => {
3820
3903
  if (collapsedItem) {
3904
+ /**
3905
+ * If we call onItemClick for collapsedItem then:
3906
+ * - User get unexpected item in onItemClick callback
3907
+ * - onClosePanel calls twice for each popuped item, as result it will prevent opening of panelItems
3908
+ */
3821
3909
  toggleOpen(!open);
3822
3910
  setTooltipAnchor(null);
3823
3911
  }
3912
+ else {
3913
+ onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item, false);
3914
+ }
3824
3915
  }, onMouseEnter: () => {
3825
3916
  if (!compact) {
3826
3917
  onMouseEnter === null || onMouseEnter === void 0 ? void 0 : onMouseEnter();
@@ -3830,7 +3921,7 @@ const Item = ({ item, compact, className, collapseItems, onMouseLeave, onMouseEn
3830
3921
  onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave();
3831
3922
  }
3832
3923
  } },
3833
- React__default["default"].createElement("div", { className: b$3('icon-place') }, compact ? (React__default["default"].createElement(React__default["default"].Fragment, null,
3924
+ React__default["default"].createElement("div", { className: b$6('icon-place') }, compact ? (React__default["default"].createElement(React__default["default"].Fragment, null,
3834
3925
  React__default["default"].createElement("div", { onMouseEnter: (event) => {
3835
3926
  if (!open) {
3836
3927
  setTooltipAnchor(event.currentTarget);
@@ -3839,51 +3930,47 @@ const Item = ({ item, compact, className, collapseItems, onMouseLeave, onMouseEn
3839
3930
  }, onMouseLeave: () => {
3840
3931
  setTooltipAnchor(null);
3841
3932
  onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave();
3842
- }, className: b$3('btn-icon') }, icon && React__default["default"].createElement(uikit.Icon, { data: icon, size: iconSize, className: b$3('icon') })),
3843
- enableTooltip && React__default["default"].createElement(ItemTooltip, { anchor: tooltipAnchor, text: tooltipText }))) : (icon && React__default["default"].createElement(uikit.Icon, { data: icon, size: iconSize, className: b$3('icon') }))),
3844
- React__default["default"].createElement("div", { className: b$3('title'), title: typeof item.title === 'string' ? item.title : undefined }, renderItemTitle(item)),
3933
+ }, className: b$6('btn-icon') }, icon && React__default["default"].createElement(uikit.Icon, { data: icon, size: iconSize, className: b$6('icon') })),
3934
+ enableTooltip && React__default["default"].createElement(ItemTooltip, { anchor: tooltipAnchor, text: tooltipText }))) : (icon && React__default["default"].createElement(uikit.Icon, { data: icon, size: iconSize, className: b$6('icon') }))),
3935
+ React__default["default"].createElement("div", { className: b$6('title'), title: typeof item.title === 'string' ? item.title : undefined }, renderItemTitle(item)),
3845
3936
  collapsedItem && (collapseItems === null || collapseItems === void 0 ? void 0 : collapseItems.length) && Boolean(anchorRef === null || anchorRef === void 0 ? void 0 : anchorRef.current) && (React__default["default"].createElement(uikit.Popup, { placement: POPUP_PLACEMENT, open: open, anchorRef: ref, onClose: () => toggleOpen(false) },
3846
- React__default["default"].createElement("div", { className: b$3('collapse-items-popup-content') },
3847
- React__default["default"].createElement(uikit.List, { itemClassName: b$3('root-collapse-item'), items: collapseItems, selectedItemIndex: getSelectedItemIndex(collapseItems), itemHeight: POPUP_ITEM_HEIGHT, itemsHeight: collapseItems.length * POPUP_ITEM_HEIGHT, virtualized: false, filterable: false, sortable: false, renderItem: (collapseItem) => {
3848
- const collapseNode = (React__default["default"].createElement("div", { className: b$3('collapse-item'), onClick: () => {
3849
- if (typeof collapseItem.onItemClick === 'function') {
3850
- collapseItem.onItemClick(collapseItem, true);
3851
- }
3937
+ React__default["default"].createElement("div", { className: b$6('collapse-items-popup-content') },
3938
+ React__default["default"].createElement(uikit.List, { itemClassName: b$6('root-collapse-item'), items: collapseItems, selectedItemIndex: getSelectedItemIndex(collapseItems), itemHeight: POPUP_ITEM_HEIGHT, itemsHeight: collapseItems.length * POPUP_ITEM_HEIGHT, virtualized: false, filterable: false, sortable: false, renderItem: (collapseItem) => {
3939
+ const collapseNode = (React__default["default"].createElement("div", { className: b$6('collapse-item'), onClick: () => {
3940
+ onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(collapseItem, true);
3852
3941
  } }, renderItemTitle(collapseItem)));
3853
3942
  if (typeof collapseItem.itemWrapper === 'function') {
3854
3943
  return collapseItem.itemWrapper(collapseNode, collapseItem, true, compact);
3855
3944
  }
3856
- return collapseItem.link ? (React__default["default"].createElement("a", { href: collapseItem.link, className: b$3('link') }, collapseNode)) : (collapseNode);
3945
+ return collapseItem.link ? (React__default["default"].createElement("a", { href: collapseItem.link, className: b$6('link') }, collapseNode)) : (collapseNode);
3857
3946
  } })))),
3858
- renderPopupContent && Boolean(anchorRef === null || anchorRef === void 0 ? void 0 : anchorRef.current) && (React__default["default"].createElement(uikit.Popup, { className: b$3('popup'), open: popupVisible, placement: popupPlacement, offset: popupOffset, anchorRef: anchorRef, onClose: onClose }, renderPopupContent()))));
3947
+ renderPopupContent && Boolean(anchorRef === null || anchorRef === void 0 ? void 0 : anchorRef.current) && (React__default["default"].createElement(uikit.Popup, { className: b$6('popup'), open: popupVisible, placement: popupPlacement, offset: popupOffset, anchorRef: anchorRef, onClose: onClose }, renderPopupContent()))));
3859
3948
  if (typeof item.itemWrapper === 'function') {
3860
3949
  return item.itemWrapper(node, item, false, compact);
3861
3950
  }
3862
- return item.link ? (React__default["default"].createElement("a", { href: item.link, className: b$3('link') }, node)) : (node);
3951
+ return item.link ? (React__default["default"].createElement("a", { href: item.link, className: b$6('link') }, node)) : (node);
3863
3952
  };
3864
3953
  Item.displayName = 'Item';
3865
3954
 
3866
3955
  var _path$2;
3867
-
3868
3956
  function _extends$2() { _extends$2 = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$2.apply(this, arguments); }
3869
-
3870
3957
  var SvgDots = function SvgDots(props) {
3871
3958
  return /*#__PURE__*/React__namespace.createElement("svg", _extends$2({
3872
3959
  xmlns: "http://www.w3.org/2000/svg",
3873
3960
  width: 16,
3874
- height: 16,
3875
- role: "img"
3961
+ height: 16
3876
3962
  }, props), _path$2 || (_path$2 = /*#__PURE__*/React__namespace.createElement("path", {
3877
3963
  d: "M14 6.125a1.874 1.874 0 1 1 .001 3.749A1.874 1.874 0 0 1 14 6.125zm-5.906 0a1.874 1.874 0 1 1 0 3.749 1.874 1.874 0 0 1 0-3.749zM2 6.125a1.874 1.874 0 1 1 .001 3.749A1.874 1.874 0 0 1 2 6.125z",
3878
3964
  fill: "currentColor",
3879
3965
  fillRule: "evenodd"
3880
3966
  })));
3881
3967
  };
3968
+ var dotsIcon = SvgDots;
3882
3969
 
3883
- var css_248z$2 = ".ycn-composite-bar {\n flex: 1 0 auto;\n width: 100%;\n min-height: 40px;\n}\n.ycn-composite-bar .ycn-composite-bar__root-menu-item[class] {\n background-color: transparent;\n}";
3884
- styleInject(css_248z$2);
3970
+ var css_248z$4 = ".ycn-composite-bar {\n flex: 1 0 auto;\n width: 100%;\n min-height: 40px;\n}\n.ycn-composite-bar .ycn-composite-bar__root-menu-item[class] {\n background-color: transparent;\n}";
3971
+ styleInject(css_248z$4);
3885
3972
 
3886
- const b$2 = block('composite-bar');
3973
+ const b$5 = block('composite-bar');
3887
3974
  class CompositeBar extends React__default["default"].Component {
3888
3975
  constructor() {
3889
3976
  super(...arguments);
@@ -3894,15 +3981,14 @@ class CompositeBar extends React__default["default"].Component {
3894
3981
  }
3895
3982
  render() {
3896
3983
  const { enableCollapsing, items } = this.props;
3984
+ if (items.length === 0) {
3985
+ return null;
3986
+ }
3897
3987
  if (!enableCollapsing) {
3898
- return React__default["default"].createElement("div", { className: b$2() }, this.renderMenu());
3988
+ return React__default["default"].createElement("div", { className: b$5() }, this.renderMenu());
3899
3989
  }
3900
- const pinnedItems = items.filter((item) => item.pinned);
3901
- const afterMoreButtonItems = items.filter((item) => item.afterMoreButton);
3902
- const minHeight = getItemsHeight(pinnedItems) +
3903
- getItemsHeight(afterMoreButtonItems) +
3904
- (pinnedItems.length === items.length ? 0 : ITEM_HEIGHT);
3905
- return (React__default["default"].createElement("div", { className: b$2({ autosizer: true }), style: { minHeight } }, items.length !== 0 && (React__default["default"].createElement(AutoSizer, null, ({ width, height }) => {
3990
+ const minHeight = getItemsMinHeight(items);
3991
+ return (React__default["default"].createElement("div", { className: b$5({ autosizer: true }), style: { minHeight } }, items.length !== 0 && (React__default["default"].createElement(AutoSizer, null, ({ width, height }) => {
3906
3992
  const style = {
3907
3993
  width,
3908
3994
  height,
@@ -3911,68 +3997,75 @@ class CompositeBar extends React__default["default"].Component {
3911
3997
  }))));
3912
3998
  }
3913
3999
  renderAutosizeMenu(height) {
3914
- const { dict, items, compact, onItemClick } = this.props;
3915
- const afterMoreButtonItems = items.filter((item) => item.afterMoreButton);
3916
- const extraItemHeight = items.reduce((sum, item) => sum + (getItemHeight(item) - ITEM_HEIGHT), afterMoreButtonItems.length * ITEM_HEIGHT);
3917
- const capacity = Math.max(1, Math.floor((height - extraItemHeight) / ITEM_HEIGHT));
3918
- let listItems;
3919
- let collapseItems = [];
3920
- const regularItems = items.filter((item) => !item.afterMoreButton);
3921
- if (capacity === 1) {
3922
- listItems = regularItems.filter((item) => item.pinned);
3923
- collapseItems = [...regularItems.filter((item) => !item.pinned)];
3924
- }
3925
- else if (capacity < items.length) {
3926
- const extraCount = regularItems.filter((item, idx) => item.pinned && idx >= capacity - 1).length;
3927
- const pinnedFlag = regularItems.reduceRight((acc, curr, idx) => {
3928
- const useExtraCount = !curr.pinned && idx < capacity - 1 && acc.extraCount > 0;
3929
- acc.flags.unshift(curr.pinned || useExtraCount);
3930
- return {
3931
- flags: acc.flags,
3932
- extraCount: acc.extraCount - Number(useExtraCount),
3933
- };
3934
- }, { flags: [], extraCount }).flags;
3935
- listItems = regularItems.filter((item, idx) => item.pinned || (idx < capacity - 1 && !pinnedFlag[idx]));
3936
- collapseItems = regularItems.filter((item, idx) => !item.pinned && (idx >= capacity - 1 || pinnedFlag[idx]));
3937
- }
3938
- else {
3939
- listItems = [...regularItems];
3940
- }
3941
- if ((collapseItems === null || collapseItems === void 0 ? void 0 : collapseItems.length) === 1) {
3942
- listItems = listItems.concat(collapseItems);
3943
- }
3944
- else if ((collapseItems === null || collapseItems === void 0 ? void 0 : collapseItems.length) > 1) {
3945
- listItems.push(this.getMoreButtonItem(dict));
3946
- }
3947
- if (afterMoreButtonItems.length) {
3948
- listItems = listItems.concat(afterMoreButtonItems);
3949
- }
3950
- return (React__default["default"].createElement(uikit.List, { ref: this.listRef, items: listItems, selectedItemIndex: getSelectedItemIndex(listItems), itemHeight: getItemHeight, itemClassName: b$2('root-menu-item'), itemsHeight: getItemsHeight, virtualized: false, filterable: false, sortable: false, onItemClick: onItemClick, renderItem: (item) => (React__default["default"].createElement(Item, { item: item, onMouseLeave: () => {
4000
+ const { compact, onItemClick } = this.props;
4001
+ const { listItems, collapseItems } = this.getAutosizeListItems(height);
4002
+ return (React__default["default"].createElement(uikit.List, { ref: this.listRef, items: listItems, selectedItemIndex: getSelectedItemIndex(listItems), itemHeight: getItemHeight, itemClassName: b$5('root-menu-item'), itemsHeight: getItemsHeight, virtualized: false, filterable: false, sortable: false, renderItem: (item) => (React__default["default"].createElement(Item, { item: item, onMouseLeave: () => {
3951
4003
  var _a;
3952
4004
  if (compact) {
3953
4005
  (_a = this.listRef.current) === null || _a === void 0 ? void 0 : _a.activateItem(undefined);
3954
4006
  }
3955
- }, compact: compact, collapseItems: collapseItems })) }));
4007
+ }, compact: compact, collapseItems: collapseItems, onItemClick: onItemClick })) }));
3956
4008
  }
3957
4009
  renderMenu() {
3958
4010
  const { items, onItemClick, compact } = this.props;
3959
- return (React__default["default"].createElement(uikit.List, { ref: this.listRef, items: items, selectedItemIndex: getSelectedItemIndex(items), itemHeight: getItemHeight, itemClassName: b$2('root-menu-item'), itemsHeight: getItemsHeight, virtualized: false, filterable: false, sortable: false, onItemClick: onItemClick, renderItem: (item) => (React__default["default"].createElement(Item, { item: item, onMouseLeave: () => {
4011
+ return (React__default["default"].createElement(uikit.List, { ref: this.listRef, items: items, selectedItemIndex: getSelectedItemIndex(items), itemHeight: getItemHeight, itemClassName: b$5('root-menu-item'), itemsHeight: getItemsHeight, virtualized: false, filterable: false, sortable: false, renderItem: (item) => (React__default["default"].createElement(Item, { item: item, onMouseLeave: () => {
3960
4012
  var _a;
3961
4013
  if (compact) {
3962
4014
  (_a = this.listRef.current) === null || _a === void 0 ? void 0 : _a.activateItem(undefined);
3963
4015
  }
3964
- }, compact: compact })) }));
4016
+ }, compact: compact, onItemClick: onItemClick })) }));
3965
4017
  }
3966
- getMoreButtonItem(dict) {
4018
+ getMoreButtonItem() {
3967
4019
  var _a;
3968
- const title = (_a = dict === null || dict === void 0 ? void 0 : dict[exports.Dict.MoreButton]) !== null && _a !== void 0 ? _a : defaultDict[exports.Dict.MoreButton];
4020
+ const { dict } = this.props;
4021
+ const title = (_a = dict === null || dict === void 0 ? void 0 : dict[exports.Dict.MoreButton]) !== null && _a !== void 0 ? _a : defaultDict$1[exports.Dict.MoreButton];
3969
4022
  return {
3970
4023
  id: COLLAPSE_ITEM_ID,
3971
4024
  title,
3972
- icon: SvgDots,
4025
+ icon: dotsIcon,
3973
4026
  iconSize: 16,
3974
4027
  };
3975
4028
  }
4029
+ getAutosizeListItems(height) {
4030
+ const { items } = this.props;
4031
+ const afterMoreButtonItems = items.filter((item) => item.afterMoreButton);
4032
+ const regularItems = items.filter((item) => !item.afterMoreButton);
4033
+ const listItems = [...regularItems, ...afterMoreButtonItems];
4034
+ const allItemsHeight = getItemsHeight(listItems);
4035
+ if (allItemsHeight <= height) {
4036
+ return { listItems, collapseItems: [] };
4037
+ }
4038
+ const collapseItem = this.getMoreButtonItem();
4039
+ const collapseItemHeight = getItemHeight(collapseItem);
4040
+ listItems.splice(regularItems.length, 0, collapseItem);
4041
+ const collapseItems = [];
4042
+ let listHeight = allItemsHeight + collapseItemHeight;
4043
+ let index = listItems.length;
4044
+ while (listHeight > height) {
4045
+ if (index === 0) {
4046
+ break;
4047
+ }
4048
+ index--;
4049
+ const item = listItems[index];
4050
+ if (item.pinned || item.id === COLLAPSE_ITEM_ID || item.afterMoreButton) {
4051
+ continue;
4052
+ }
4053
+ if (item.type === 'divider') {
4054
+ if (index + 1 < listItems.length && listItems[index + 1].type === 'divider') {
4055
+ listHeight -= getItemHeight(item);
4056
+ listItems.splice(index, 1);
4057
+ }
4058
+ continue;
4059
+ }
4060
+ listHeight -= getItemHeight(item);
4061
+ collapseItems.unshift(...listItems.splice(index, 1));
4062
+ }
4063
+ if (listItems[index].type === 'divider' &&
4064
+ (index === 0 || listItems[index - 1].type === 'divider')) {
4065
+ listItems.splice(index, 1);
4066
+ }
4067
+ return { listItems, collapseItems };
4068
+ }
3976
4069
  }
3977
4070
 
3978
4071
  /* Used by renderContent AsideHeader prop */
@@ -3985,70 +4078,64 @@ const Content = ({ size, className, renderContent }) => {
3985
4078
  };
3986
4079
 
3987
4080
  var _path$1;
3988
-
3989
4081
  function _extends$1() { _extends$1 = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1.apply(this, arguments); }
3990
-
3991
4082
  var SvgControlMenuButton = function SvgControlMenuButton(props) {
3992
4083
  return /*#__PURE__*/React__namespace.createElement("svg", _extends$1({
3993
4084
  width: 8,
3994
4085
  height: 8,
3995
4086
  fill: "currentColor",
3996
- xmlns: "http://www.w3.org/2000/svg",
3997
- role: "img"
4087
+ xmlns: "http://www.w3.org/2000/svg"
3998
4088
  }, props), _path$1 || (_path$1 = /*#__PURE__*/React__namespace.createElement("path", {
3999
4089
  d: "m.72 7.64 6.39-3.2a.5.5 0 0 0 0-.89L.72.36A.5.5 0 0 0 0 .81v6.38c0 .37.4.61.72.45Z"
4000
4090
  })));
4001
4091
  };
4092
+ var controlMenuButtonIcon = SvgControlMenuButton;
4002
4093
 
4003
4094
  var _path;
4004
-
4005
4095
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
4006
-
4007
4096
  var SvgDividerCollapsed = function SvgDividerCollapsed(props) {
4008
4097
  return /*#__PURE__*/React__namespace.createElement("svg", _extends({
4009
4098
  width: 56,
4010
4099
  height: 29,
4011
4100
  fill: "currentColor",
4012
- xmlns: "http://www.w3.org/2000/svg",
4013
- role: "img"
4101
+ xmlns: "http://www.w3.org/2000/svg"
4014
4102
  }, props), _path || (_path = /*#__PURE__*/React__namespace.createElement("path", {
4015
4103
  d: "M56 0v29c-.8-1-7-6.1-17.7-8.4L13 15.7A16 16 0 0 1 0 0Z"
4016
4104
  })));
4017
4105
  };
4106
+ var headerDividerCollapsedIcon = SvgDividerCollapsed;
4018
4107
 
4019
- var css_248z$1 = ".yc-root {\n --aside-header-background-color: var(--yc-color-base-info);\n --aside-header-collapse-button-divider-line-color: var(\n --aside-header-header-divider-line-color\n );\n}\n\n.yc-root_theme_light {\n --aside-header-divider-line-color: transparent;\n --aside-header-header-divider-line-color: var(--yc-color-line-generic);\n}\n\n.yc-root_theme_dark {\n --aside-header-divider-line-color: var(--yc-color-base-light-simple-hover);\n --aside-header-header-divider-line-color: var(--yc-color-base-light-simple-hover);\n}\n\n.ycn-aside-header {\n --aside-header-min-width: 56px;\n height: 100%;\n width: 100%;\n position: relative;\n background-color: var(--yc-color-base-background);\n}\n.ycn-aside-header__aside {\n position: sticky;\n top: 0;\n left: 0;\n height: 100vh;\n width: inherit;\n display: flex;\n flex-direction: column;\n background-color: var(--yc-color-base-background);\n z-index: 100;\n box-sizing: border-box;\n}\n.ycn-aside-header__aside::after {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n width: 1px;\n height: 100%;\n content: \"\";\n background-color: var(--aside-header-divider-line-color);\n}\n.ycn-aside-header__aside-popup-anchor {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n}\n.ycn-aside-header__aside-content {\n --gradient-height: 334px;\n display: flex;\n flex-direction: column;\n overflow-x: hidden;\n width: inherit;\n height: inherit;\n position: relative;\n z-index: 2;\n user-select: none;\n background: linear-gradient(180deg, var(--aside-header-background-color) calc(var(--gradient-height) * 0.33), transparent calc(var(--gradient-height) * 0.88));\n}\n.ycn-aside-header__aside-content::after {\n position: absolute;\n top: 0;\n right: -100px;\n bottom: 0;\n width: 100px;\n content: \"\";\n box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.1), 0px 0px 24px rgba(0, 0, 0, 0.08);\n}\n.ycn-aside-header__aside-content > .ycn-aside-header-logo {\n margin: 8px 0;\n}\n.ycn-aside-header_compact .ycn-aside-header__aside-content {\n background: transparent;\n}\n.ycn-aside-header__header {\n --aside-header-header-divider-height: 29px;\n position: relative;\n z-index: 1;\n flex: none;\n box-sizing: border-box;\n width: 100%;\n padding-top: 8px;\n padding-bottom: 22px;\n}\n.ycn-aside-header__header .ycn-aside-header__header-divider {\n position: absolute;\n bottom: 0;\n left: 0;\n z-index: -2;\n display: none;\n color: var(--aside-header-background-color);\n}\n.ycn-aside-header__header::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: -2;\n display: none;\n width: 100%;\n height: calc(100% - var(--aside-header-header-divider-height));\n content: \"\";\n background-color: var(--aside-header-background-color);\n}\n.ycn-aside-header__header::after {\n position: absolute;\n bottom: 12px;\n left: 0;\n z-index: -2;\n width: 100%;\n height: 1px;\n content: \"\";\n background-color: var(--aside-header-header-divider-line-color);\n}\n.ycn-aside-header_compact .ycn-aside-header__header::before {\n display: block;\n}\n.ycn-aside-header_compact .ycn-aside-header__header::after {\n display: none;\n}\n.ycn-aside-header_compact .ycn-aside-header__header .ycn-aside-header__header-divider {\n display: block;\n}\n.ycn-aside-header__footer {\n flex-shrink: 0;\n width: 100%;\n margin: 8px 0;\n display: flex;\n flex-direction: column;\n}\n.ycn-aside-header__panels {\n z-index: 98;\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n overflow: auto;\n}\n.ycn-aside-header__panel {\n height: 100%;\n}\n.ycn-aside-header__pane-container {\n display: flex;\n outline: none;\n overflow: visible;\n user-select: text;\n flex-direction: row;\n}\n.ycn-aside-header__content {\n width: calc(100% - var(--aside-header-size));\n}\n.ycn-aside-header__collapse-button {\n --yc-button-background-color-hover: transparent;\n overflow: hidden;\n box-sizing: border-box;\n flex: none;\n width: 100%;\n height: 20px;\n border-top: 1px solid var(--aside-header-collapse-button-divider-line-color);\n}\n.ycn-aside-header__collapse-button:not(.ycn-aside-header__collapse-button_compact) .ycn-aside-header__collapse-icon {\n transform: rotate(180deg);\n}\n.ycn-aside-header__collapse-button .ycn-aside-header__collapse-icon {\n color: var(--yc-color-text-secondary);\n}\n.ycn-aside-header__collapse-button:hover .ycn-aside-header__collapse-icon {\n color: var(--yc-color-text-primary);\n}";
4020
- styleInject(css_248z$1);
4108
+ var css_248z$3 = ".yc-root {\n --aside-header-background-color: var(--yc-color-base-info);\n --aside-header-collapse-button-divider-line-color: var(\n --aside-header-header-divider-line-color\n );\n}\n\n.yc-root_theme_light {\n --aside-header-divider-line-color: transparent;\n --aside-header-header-divider-line-color: var(--yc-color-line-generic);\n}\n\n.yc-root_theme_dark {\n --aside-header-divider-line-color: var(--yc-color-base-light-simple-hover);\n --aside-header-header-divider-line-color: var(--yc-color-base-light-simple-hover);\n}\n\n.ycn-aside-header {\n --aside-header-min-width: 56px;\n height: 100%;\n width: 100%;\n position: relative;\n background-color: var(--yc-color-base-background);\n}\n.ycn-aside-header__aside {\n position: sticky;\n top: 0;\n left: 0;\n height: 100vh;\n width: inherit;\n display: flex;\n flex-direction: column;\n background-color: var(--yc-color-base-background);\n z-index: 100;\n box-sizing: border-box;\n}\n.ycn-aside-header__aside::after {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n width: 1px;\n height: 100%;\n content: \"\";\n background-color: var(--aside-header-divider-line-color);\n}\n.ycn-aside-header__aside-popup-anchor {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n}\n.ycn-aside-header__aside-content {\n --gradient-height: 334px;\n display: flex;\n flex-direction: column;\n overflow-x: hidden;\n width: inherit;\n height: inherit;\n position: relative;\n z-index: 2;\n user-select: none;\n background: linear-gradient(180deg, var(--aside-header-background-color) calc(var(--gradient-height) * 0.33), transparent calc(var(--gradient-height) * 0.88));\n}\n.ycn-aside-header__aside-content::after {\n position: absolute;\n top: 0;\n right: -100px;\n bottom: 0;\n width: 100px;\n content: \"\";\n box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.1), 0px 0px 24px rgba(0, 0, 0, 0.08);\n}\n.ycn-aside-header__aside-content > .ycn-aside-header-logo {\n margin: 8px 0;\n}\n.ycn-aside-header_compact .ycn-aside-header__aside-content {\n background: transparent;\n}\n.ycn-aside-header__header {\n --aside-header-header-divider-height: 29px;\n position: relative;\n z-index: 1;\n flex: none;\n box-sizing: border-box;\n width: 100%;\n padding-top: 8px;\n padding-bottom: 22px;\n}\n.ycn-aside-header__header .ycn-aside-header__header-divider {\n position: absolute;\n bottom: 0;\n left: 0;\n z-index: -2;\n display: none;\n color: var(--aside-header-background-color);\n}\n.ycn-aside-header__header::before {\n position: absolute;\n top: 0;\n left: 0;\n z-index: -2;\n display: none;\n width: 100%;\n height: calc(100% - var(--aside-header-header-divider-height));\n content: \"\";\n background-color: var(--aside-header-background-color);\n}\n.ycn-aside-header__header::after {\n position: absolute;\n bottom: 12px;\n left: 0;\n z-index: -2;\n width: 100%;\n height: 1px;\n content: \"\";\n background-color: var(--aside-header-header-divider-line-color);\n}\n.ycn-aside-header_compact .ycn-aside-header__header::before {\n display: block;\n}\n.ycn-aside-header_compact .ycn-aside-header__header::after {\n display: none;\n}\n.ycn-aside-header_compact .ycn-aside-header__header .ycn-aside-header__header-divider {\n display: block;\n}\n.ycn-aside-header__footer {\n flex-shrink: 0;\n width: 100%;\n margin: 8px 0;\n display: flex;\n flex-direction: column;\n}\n.ycn-aside-header__panels {\n z-index: 98;\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n overflow: auto;\n}\n.ycn-aside-header__panel {\n height: 100%;\n}\n.ycn-aside-header__pane-container {\n display: flex;\n outline: none;\n overflow: visible;\n user-select: text;\n flex-direction: row;\n}\n.ycn-aside-header__content {\n width: calc(100% - var(--aside-header-size));\n z-index: 95;\n}\n.ycn-aside-header__collapse-button {\n --yc-button-background-color-hover: transparent;\n overflow: hidden;\n box-sizing: border-box;\n flex: none;\n width: 100%;\n height: 20px;\n border-top: 1px solid var(--aside-header-collapse-button-divider-line-color);\n margin-top: auto;\n}\n.ycn-aside-header__collapse-button:not(.ycn-aside-header__collapse-button_compact) .ycn-aside-header__collapse-icon {\n transform: rotate(180deg);\n}\n.ycn-aside-header__collapse-button .ycn-aside-header__collapse-icon {\n color: var(--yc-color-text-secondary);\n}\n.ycn-aside-header__collapse-button:hover .ycn-aside-header__collapse-icon {\n color: var(--yc-color-text-primary);\n}";
4109
+ styleInject(css_248z$3);
4021
4110
 
4022
- const b$1 = block('aside-header');
4111
+ const b$4 = block('aside-header');
4023
4112
  class AsideHeader extends React__default["default"].Component {
4024
- constructor(props) {
4025
- super(props);
4113
+ constructor() {
4114
+ super(...arguments);
4026
4115
  this.asideRef = React__default["default"].createRef();
4027
4116
  this.renderFirstPane = (size) => {
4028
- const { dict, menuItems, panelItems } = this.props;
4029
- const { compact } = this.state;
4030
- return (React__default["default"].createElement("div", null,
4031
- React__default["default"].createElement("div", { className: b$1('aside'), style: { width: size } },
4032
- React__default["default"].createElement("div", { className: b$1('aside-popup-anchor'), ref: this.asideRef }),
4033
- React__default["default"].createElement("div", { className: b$1('aside-content') },
4117
+ const { dict, menuItems, panelItems, compact } = this.props;
4118
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
4119
+ React__default["default"].createElement("div", { className: b$4('aside'), style: { width: size } },
4120
+ React__default["default"].createElement("div", { className: b$4('aside-popup-anchor'), ref: this.asideRef }),
4121
+ React__default["default"].createElement("div", { className: b$4('aside-content') },
4034
4122
  this.renderHeader(),
4035
- React__default["default"].createElement(CompositeBar, { items: menuItems, compact: compact, enableCollapsing: true, dict: dict, onItemClick: this.onCompositeBarClick }),
4123
+ React__default["default"].createElement(CompositeBar, { items: menuItems, compact: compact, enableCollapsing: true, dict: dict, onItemClick: this.onItemClick }),
4036
4124
  this.renderFooter(size),
4037
4125
  this.renderCollapseButton())),
4038
4126
  panelItems && this.renderPanels(size)));
4039
4127
  };
4040
4128
  this.renderSecondPane = (size) => {
4041
- return (React__default["default"].createElement(Content, { size: size, renderContent: this.props.renderContent, className: b$1('content') }));
4129
+ return (React__default["default"].createElement(Content, { size: size, renderContent: this.props.renderContent, className: b$4('content') }));
4042
4130
  };
4043
4131
  this.renderLogo = () => React__default["default"].createElement(Logo, Object.assign({}, this.props.logo, { compact: this.props.compact }));
4044
- this.renderHeader = () => (React__default["default"].createElement("div", { className: b$1('header') },
4132
+ this.renderHeader = () => (React__default["default"].createElement("div", { className: b$4('header') },
4045
4133
  this.renderLogo(),
4046
- React__default["default"].createElement(CompositeBar, { items: this.props.subheaderItems, compact: this.props.compact, enableCollapsing: false }),
4047
- React__default["default"].createElement(uikit.Icon, { data: SvgDividerCollapsed, className: b$1('header-divider'), width: ASIDE_HEADER_COMPACT_WIDTH, height: "29" })));
4134
+ React__default["default"].createElement(CompositeBar, { items: this.props.subheaderItems, compact: this.props.compact, enableCollapsing: false, onItemClick: this.onItemClick }),
4135
+ React__default["default"].createElement(uikit.Icon, { data: headerDividerCollapsedIcon, className: b$4('header-divider'), width: ASIDE_HEADER_COMPACT_WIDTH, height: "29" })));
4048
4136
  this.renderFooter = (size) => {
4049
- var _a, _b;
4050
- const { compact } = this.state;
4051
- return (React__default["default"].createElement("div", { className: b$1('footer') }, (_b = (_a = this.props).renderFooter) === null || _b === void 0 ? void 0 : _b.call(_a, {
4137
+ const { compact, renderFooter } = this.props;
4138
+ return (React__default["default"].createElement("div", { className: b$4('footer') }, renderFooter === null || renderFooter === void 0 ? void 0 : renderFooter({
4052
4139
  size,
4053
4140
  compact,
4054
4141
  asideRef: this.asideRef,
@@ -4056,44 +4143,34 @@ class AsideHeader extends React__default["default"].Component {
4056
4143
  };
4057
4144
  this.renderPanels = (size) => {
4058
4145
  const { panelItems } = this.props;
4059
- return (React__default["default"].createElement(Drawer, { className: b$1('panels'), onVeilClick: this.onCloseDrawer, onEscape: this.onCloseDrawer, style: { left: size } }, panelItems.map((item) => (React__default["default"].createElement(DrawerItem, Object.assign({ key: item.id }, item))))));
4146
+ return (React__default["default"].createElement(Drawer, { className: b$4('panels'), onVeilClick: this.onCloseDrawer, onEscape: this.onCloseDrawer, style: { left: size } }, panelItems.map((item) => (React__default["default"].createElement(DrawerItem, Object.assign({ key: item.id }, item))))));
4060
4147
  };
4061
4148
  this.renderCollapseButton = () => {
4062
4149
  var _a;
4063
4150
  const { compact, dict } = this.props;
4064
4151
  const typeButton = compact ? exports.Dict.ExpandButton : exports.Dict.CollapseButton;
4065
- return (React__default["default"].createElement(uikit.Button, { className: b$1('collapse-button', { compact }), view: "flat", onClick: this.onCollapseButtonClick, title: (_a = dict === null || dict === void 0 ? void 0 : dict[typeButton]) !== null && _a !== void 0 ? _a : defaultDict[typeButton] },
4066
- React__default["default"].createElement(uikit.Icon, { data: SvgControlMenuButton, className: b$1('collapse-icon'), width: "16", height: "10" })));
4152
+ return (React__default["default"].createElement(uikit.Button, { className: b$4('collapse-button', { compact }), view: "flat", onClick: this.onCollapseButtonClick, title: (_a = dict === null || dict === void 0 ? void 0 : dict[typeButton]) !== null && _a !== void 0 ? _a : defaultDict$1[typeButton] },
4153
+ React__default["default"].createElement(uikit.Icon, { data: controlMenuButtonIcon, className: b$4('collapse-icon'), width: "16", height: "10" })));
4067
4154
  };
4068
4155
  this.onCollapseButtonClick = () => {
4069
4156
  var _a, _b;
4070
- const newCompact = !this.state.compact;
4071
- this.setState({ compact: newCompact });
4072
- (_b = (_a = this.props).onChangeCompact) === null || _b === void 0 ? void 0 : _b.call(_a, newCompact);
4157
+ (_b = (_a = this.props).onChangeCompact) === null || _b === void 0 ? void 0 : _b.call(_a, !this.props.compact);
4073
4158
  };
4074
4159
  this.onCloseDrawer = () => {
4075
4160
  var _a, _b;
4076
4161
  (_b = (_a = this.props).onClosePanel) === null || _b === void 0 ? void 0 : _b.call(_a);
4077
4162
  };
4078
- this.onCompositeBarClick = () => {
4079
- var _a, _b;
4163
+ this.onItemClick = (item, collapsed) => {
4164
+ var _a, _b, _c;
4080
4165
  (_b = (_a = this.props).onClosePanel) === null || _b === void 0 ? void 0 : _b.call(_a);
4081
- };
4082
- this.state = {
4083
- compact: Boolean(props.compact),
4166
+ (_c = item.onItemClick) === null || _c === void 0 ? void 0 : _c.call(item, item, collapsed);
4084
4167
  };
4085
4168
  }
4086
- componentDidUpdate(prevProps) {
4087
- if (prevProps.compact !== this.props.compact) {
4088
- this.setState({ compact: Boolean(this.props.compact) });
4089
- }
4090
- }
4091
4169
  render() {
4092
- const { className } = this.props;
4093
- const { compact } = this.state;
4170
+ const { className, compact } = this.props;
4094
4171
  const size = compact ? ASIDE_HEADER_COMPACT_WIDTH : ASIDE_HEADER_EXPANDED_WIDTH;
4095
- return (React__default["default"].createElement("div", { className: b$1({ compact }, className) },
4096
- React__default["default"].createElement("div", { className: b$1('pane-container') },
4172
+ return (React__default["default"].createElement("div", { className: b$4({ compact }, className) },
4173
+ React__default["default"].createElement("div", { className: b$4('pane-container') },
4097
4174
  this.renderFirstPane(size),
4098
4175
  this.renderSecondPane(size))));
4099
4176
  }
@@ -4131,17 +4208,936 @@ function __rest(s, e) {
4131
4208
  return t;
4132
4209
  }
4133
4210
 
4134
- var css_248z = ".ycn-footer-item {\n width: 100%;\n height: 40px;\n}";
4135
- styleInject(css_248z);
4211
+ var css_248z$2 = ".ycn-footer-item {\n width: 100%;\n height: 40px;\n}";
4212
+ styleInject(css_248z$2);
4136
4213
 
4137
- const b = block('footer-item');
4214
+ const b$3 = block('footer-item');
4138
4215
  const FooterItem = (_a) => {
4139
4216
  var { item } = _a, props = __rest(_a, ["item"]);
4140
- return (React__default["default"].createElement(Item, Object.assign({}, props, { item: Object.assign({ iconSize: ASIDE_HEADER_FOOTER_ICON_SIZE }, item), className: b({ compact: props.compact }) })));
4217
+ return (React__default["default"].createElement(Item, Object.assign({}, props, { item: Object.assign({ iconSize: ASIDE_HEADER_FOOTER_ICON_SIZE }, item), className: b$3({ compact: props.compact }), onItemClick: item.onItemClick })));
4141
4218
  };
4142
4219
 
4220
+ /**
4221
+ * This method returns the first argument it receives.
4222
+ *
4223
+ * @static
4224
+ * @since 0.1.0
4225
+ * @memberOf _
4226
+ * @category Util
4227
+ * @param {*} value Any value.
4228
+ * @returns {*} Returns `value`.
4229
+ * @example
4230
+ *
4231
+ * var object = { 'a': 1 };
4232
+ *
4233
+ * console.log(_.identity(object) === object);
4234
+ * // => true
4235
+ */
4236
+
4237
+ function identity(value) {
4238
+ return value;
4239
+ }
4240
+
4241
+ var identity_1 = identity;
4242
+
4243
+ /**
4244
+ * Checks if `value` is the
4245
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
4246
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
4247
+ *
4248
+ * @static
4249
+ * @memberOf _
4250
+ * @since 0.1.0
4251
+ * @category Lang
4252
+ * @param {*} value The value to check.
4253
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
4254
+ * @example
4255
+ *
4256
+ * _.isObject({});
4257
+ * // => true
4258
+ *
4259
+ * _.isObject([1, 2, 3]);
4260
+ * // => true
4261
+ *
4262
+ * _.isObject(_.noop);
4263
+ * // => true
4264
+ *
4265
+ * _.isObject(null);
4266
+ * // => false
4267
+ */
4268
+
4269
+ function isObject$2(value) {
4270
+ var type = typeof value;
4271
+ return value != null && (type == 'object' || type == 'function');
4272
+ }
4273
+
4274
+ var isObject_1 = isObject$2;
4275
+
4276
+ /** Detect free variable `global` from Node.js. */
4277
+
4278
+ var freeGlobal$1 = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal;
4279
+
4280
+ var _freeGlobal = freeGlobal$1;
4281
+
4282
+ var freeGlobal = _freeGlobal;
4283
+
4284
+ /** Detect free variable `self`. */
4285
+ var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
4286
+
4287
+ /** Used as a reference to the global object. */
4288
+ var root$2 = freeGlobal || freeSelf || Function('return this')();
4289
+
4290
+ var _root = root$2;
4291
+
4292
+ var root$1 = _root;
4293
+
4294
+ /**
4295
+ * Gets the timestamp of the number of milliseconds that have elapsed since
4296
+ * the Unix epoch (1 January 1970 00:00:00 UTC).
4297
+ *
4298
+ * @static
4299
+ * @memberOf _
4300
+ * @since 2.4.0
4301
+ * @category Date
4302
+ * @returns {number} Returns the timestamp.
4303
+ * @example
4304
+ *
4305
+ * _.defer(function(stamp) {
4306
+ * console.log(_.now() - stamp);
4307
+ * }, _.now());
4308
+ * // => Logs the number of milliseconds it took for the deferred invocation.
4309
+ */
4310
+ var now$1 = function() {
4311
+ return root$1.Date.now();
4312
+ };
4313
+
4314
+ var now_1 = now$1;
4315
+
4316
+ /** Used to match a single whitespace character. */
4317
+
4318
+ var reWhitespace = /\s/;
4319
+
4320
+ /**
4321
+ * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
4322
+ * character of `string`.
4323
+ *
4324
+ * @private
4325
+ * @param {string} string The string to inspect.
4326
+ * @returns {number} Returns the index of the last non-whitespace character.
4327
+ */
4328
+ function trimmedEndIndex$1(string) {
4329
+ var index = string.length;
4330
+
4331
+ while (index-- && reWhitespace.test(string.charAt(index))) {}
4332
+ return index;
4333
+ }
4334
+
4335
+ var _trimmedEndIndex = trimmedEndIndex$1;
4336
+
4337
+ var trimmedEndIndex = _trimmedEndIndex;
4338
+
4339
+ /** Used to match leading whitespace. */
4340
+ var reTrimStart = /^\s+/;
4341
+
4342
+ /**
4343
+ * The base implementation of `_.trim`.
4344
+ *
4345
+ * @private
4346
+ * @param {string} string The string to trim.
4347
+ * @returns {string} Returns the trimmed string.
4348
+ */
4349
+ function baseTrim$1(string) {
4350
+ return string
4351
+ ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')
4352
+ : string;
4353
+ }
4354
+
4355
+ var _baseTrim = baseTrim$1;
4356
+
4357
+ var root = _root;
4358
+
4359
+ /** Built-in value references. */
4360
+ var Symbol$3 = root.Symbol;
4361
+
4362
+ var _Symbol = Symbol$3;
4363
+
4364
+ var Symbol$2 = _Symbol;
4365
+
4366
+ /** Used for built-in method references. */
4367
+ var objectProto$1 = Object.prototype;
4368
+
4369
+ /** Used to check objects for own properties. */
4370
+ var hasOwnProperty = objectProto$1.hasOwnProperty;
4371
+
4372
+ /**
4373
+ * Used to resolve the
4374
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
4375
+ * of values.
4376
+ */
4377
+ var nativeObjectToString$1 = objectProto$1.toString;
4378
+
4379
+ /** Built-in value references. */
4380
+ var symToStringTag$1 = Symbol$2 ? Symbol$2.toStringTag : undefined;
4381
+
4382
+ /**
4383
+ * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
4384
+ *
4385
+ * @private
4386
+ * @param {*} value The value to query.
4387
+ * @returns {string} Returns the raw `toStringTag`.
4388
+ */
4389
+ function getRawTag$1(value) {
4390
+ var isOwn = hasOwnProperty.call(value, symToStringTag$1),
4391
+ tag = value[symToStringTag$1];
4392
+
4393
+ try {
4394
+ value[symToStringTag$1] = undefined;
4395
+ var unmasked = true;
4396
+ } catch (e) {}
4397
+
4398
+ var result = nativeObjectToString$1.call(value);
4399
+ if (unmasked) {
4400
+ if (isOwn) {
4401
+ value[symToStringTag$1] = tag;
4402
+ } else {
4403
+ delete value[symToStringTag$1];
4404
+ }
4405
+ }
4406
+ return result;
4407
+ }
4408
+
4409
+ var _getRawTag = getRawTag$1;
4410
+
4411
+ /** Used for built-in method references. */
4412
+
4413
+ var objectProto = Object.prototype;
4414
+
4415
+ /**
4416
+ * Used to resolve the
4417
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
4418
+ * of values.
4419
+ */
4420
+ var nativeObjectToString = objectProto.toString;
4421
+
4422
+ /**
4423
+ * Converts `value` to a string using `Object.prototype.toString`.
4424
+ *
4425
+ * @private
4426
+ * @param {*} value The value to convert.
4427
+ * @returns {string} Returns the converted string.
4428
+ */
4429
+ function objectToString$1(value) {
4430
+ return nativeObjectToString.call(value);
4431
+ }
4432
+
4433
+ var _objectToString = objectToString$1;
4434
+
4435
+ var Symbol$1 = _Symbol,
4436
+ getRawTag = _getRawTag,
4437
+ objectToString = _objectToString;
4438
+
4439
+ /** `Object#toString` result references. */
4440
+ var nullTag = '[object Null]',
4441
+ undefinedTag = '[object Undefined]';
4442
+
4443
+ /** Built-in value references. */
4444
+ var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined;
4445
+
4446
+ /**
4447
+ * The base implementation of `getTag` without fallbacks for buggy environments.
4448
+ *
4449
+ * @private
4450
+ * @param {*} value The value to query.
4451
+ * @returns {string} Returns the `toStringTag`.
4452
+ */
4453
+ function baseGetTag$1(value) {
4454
+ if (value == null) {
4455
+ return value === undefined ? undefinedTag : nullTag;
4456
+ }
4457
+ return (symToStringTag && symToStringTag in Object(value))
4458
+ ? getRawTag(value)
4459
+ : objectToString(value);
4460
+ }
4461
+
4462
+ var _baseGetTag = baseGetTag$1;
4463
+
4464
+ /**
4465
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
4466
+ * and has a `typeof` result of "object".
4467
+ *
4468
+ * @static
4469
+ * @memberOf _
4470
+ * @since 4.0.0
4471
+ * @category Lang
4472
+ * @param {*} value The value to check.
4473
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
4474
+ * @example
4475
+ *
4476
+ * _.isObjectLike({});
4477
+ * // => true
4478
+ *
4479
+ * _.isObjectLike([1, 2, 3]);
4480
+ * // => true
4481
+ *
4482
+ * _.isObjectLike(_.noop);
4483
+ * // => false
4484
+ *
4485
+ * _.isObjectLike(null);
4486
+ * // => false
4487
+ */
4488
+
4489
+ function isObjectLike$1(value) {
4490
+ return value != null && typeof value == 'object';
4491
+ }
4492
+
4493
+ var isObjectLike_1 = isObjectLike$1;
4494
+
4495
+ var baseGetTag = _baseGetTag,
4496
+ isObjectLike = isObjectLike_1;
4497
+
4498
+ /** `Object#toString` result references. */
4499
+ var symbolTag = '[object Symbol]';
4500
+
4501
+ /**
4502
+ * Checks if `value` is classified as a `Symbol` primitive or object.
4503
+ *
4504
+ * @static
4505
+ * @memberOf _
4506
+ * @since 4.0.0
4507
+ * @category Lang
4508
+ * @param {*} value The value to check.
4509
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
4510
+ * @example
4511
+ *
4512
+ * _.isSymbol(Symbol.iterator);
4513
+ * // => true
4514
+ *
4515
+ * _.isSymbol('abc');
4516
+ * // => false
4517
+ */
4518
+ function isSymbol$1(value) {
4519
+ return typeof value == 'symbol' ||
4520
+ (isObjectLike(value) && baseGetTag(value) == symbolTag);
4521
+ }
4522
+
4523
+ var isSymbol_1 = isSymbol$1;
4524
+
4525
+ var baseTrim = _baseTrim,
4526
+ isObject$1 = isObject_1,
4527
+ isSymbol = isSymbol_1;
4528
+
4529
+ /** Used as references for various `Number` constants. */
4530
+ var NAN = 0 / 0;
4531
+
4532
+ /** Used to detect bad signed hexadecimal string values. */
4533
+ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
4534
+
4535
+ /** Used to detect binary string values. */
4536
+ var reIsBinary = /^0b[01]+$/i;
4537
+
4538
+ /** Used to detect octal string values. */
4539
+ var reIsOctal = /^0o[0-7]+$/i;
4540
+
4541
+ /** Built-in method references without a dependency on `root`. */
4542
+ var freeParseInt = parseInt;
4543
+
4544
+ /**
4545
+ * Converts `value` to a number.
4546
+ *
4547
+ * @static
4548
+ * @memberOf _
4549
+ * @since 4.0.0
4550
+ * @category Lang
4551
+ * @param {*} value The value to process.
4552
+ * @returns {number} Returns the number.
4553
+ * @example
4554
+ *
4555
+ * _.toNumber(3.2);
4556
+ * // => 3.2
4557
+ *
4558
+ * _.toNumber(Number.MIN_VALUE);
4559
+ * // => 5e-324
4560
+ *
4561
+ * _.toNumber(Infinity);
4562
+ * // => Infinity
4563
+ *
4564
+ * _.toNumber('3.2');
4565
+ * // => 3.2
4566
+ */
4567
+ function toNumber$1(value) {
4568
+ if (typeof value == 'number') {
4569
+ return value;
4570
+ }
4571
+ if (isSymbol(value)) {
4572
+ return NAN;
4573
+ }
4574
+ if (isObject$1(value)) {
4575
+ var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
4576
+ value = isObject$1(other) ? (other + '') : other;
4577
+ }
4578
+ if (typeof value != 'string') {
4579
+ return value === 0 ? value : +value;
4580
+ }
4581
+ value = baseTrim(value);
4582
+ var isBinary = reIsBinary.test(value);
4583
+ return (isBinary || reIsOctal.test(value))
4584
+ ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
4585
+ : (reIsBadHex.test(value) ? NAN : +value);
4586
+ }
4587
+
4588
+ var toNumber_1 = toNumber$1;
4589
+
4590
+ var isObject = isObject_1,
4591
+ now = now_1,
4592
+ toNumber = toNumber_1;
4593
+
4594
+ /** Error message constants. */
4595
+ var FUNC_ERROR_TEXT = 'Expected a function';
4596
+
4597
+ /* Built-in method references for those with the same name as other `lodash` methods. */
4598
+ var nativeMax = Math.max,
4599
+ nativeMin = Math.min;
4600
+
4601
+ /**
4602
+ * Creates a debounced function that delays invoking `func` until after `wait`
4603
+ * milliseconds have elapsed since the last time the debounced function was
4604
+ * invoked. The debounced function comes with a `cancel` method to cancel
4605
+ * delayed `func` invocations and a `flush` method to immediately invoke them.
4606
+ * Provide `options` to indicate whether `func` should be invoked on the
4607
+ * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
4608
+ * with the last arguments provided to the debounced function. Subsequent
4609
+ * calls to the debounced function return the result of the last `func`
4610
+ * invocation.
4611
+ *
4612
+ * **Note:** If `leading` and `trailing` options are `true`, `func` is
4613
+ * invoked on the trailing edge of the timeout only if the debounced function
4614
+ * is invoked more than once during the `wait` timeout.
4615
+ *
4616
+ * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
4617
+ * until to the next tick, similar to `setTimeout` with a timeout of `0`.
4618
+ *
4619
+ * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
4620
+ * for details over the differences between `_.debounce` and `_.throttle`.
4621
+ *
4622
+ * @static
4623
+ * @memberOf _
4624
+ * @since 0.1.0
4625
+ * @category Function
4626
+ * @param {Function} func The function to debounce.
4627
+ * @param {number} [wait=0] The number of milliseconds to delay.
4628
+ * @param {Object} [options={}] The options object.
4629
+ * @param {boolean} [options.leading=false]
4630
+ * Specify invoking on the leading edge of the timeout.
4631
+ * @param {number} [options.maxWait]
4632
+ * The maximum time `func` is allowed to be delayed before it's invoked.
4633
+ * @param {boolean} [options.trailing=true]
4634
+ * Specify invoking on the trailing edge of the timeout.
4635
+ * @returns {Function} Returns the new debounced function.
4636
+ * @example
4637
+ *
4638
+ * // Avoid costly calculations while the window size is in flux.
4639
+ * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
4640
+ *
4641
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
4642
+ * jQuery(element).on('click', _.debounce(sendMail, 300, {
4643
+ * 'leading': true,
4644
+ * 'trailing': false
4645
+ * }));
4646
+ *
4647
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
4648
+ * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
4649
+ * var source = new EventSource('/stream');
4650
+ * jQuery(source).on('message', debounced);
4651
+ *
4652
+ * // Cancel the trailing debounced invocation.
4653
+ * jQuery(window).on('popstate', debounced.cancel);
4654
+ */
4655
+ function debounce(func, wait, options) {
4656
+ var lastArgs,
4657
+ lastThis,
4658
+ maxWait,
4659
+ result,
4660
+ timerId,
4661
+ lastCallTime,
4662
+ lastInvokeTime = 0,
4663
+ leading = false,
4664
+ maxing = false,
4665
+ trailing = true;
4666
+
4667
+ if (typeof func != 'function') {
4668
+ throw new TypeError(FUNC_ERROR_TEXT);
4669
+ }
4670
+ wait = toNumber(wait) || 0;
4671
+ if (isObject(options)) {
4672
+ leading = !!options.leading;
4673
+ maxing = 'maxWait' in options;
4674
+ maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
4675
+ trailing = 'trailing' in options ? !!options.trailing : trailing;
4676
+ }
4677
+
4678
+ function invokeFunc(time) {
4679
+ var args = lastArgs,
4680
+ thisArg = lastThis;
4681
+
4682
+ lastArgs = lastThis = undefined;
4683
+ lastInvokeTime = time;
4684
+ result = func.apply(thisArg, args);
4685
+ return result;
4686
+ }
4687
+
4688
+ function leadingEdge(time) {
4689
+ // Reset any `maxWait` timer.
4690
+ lastInvokeTime = time;
4691
+ // Start the timer for the trailing edge.
4692
+ timerId = setTimeout(timerExpired, wait);
4693
+ // Invoke the leading edge.
4694
+ return leading ? invokeFunc(time) : result;
4695
+ }
4696
+
4697
+ function remainingWait(time) {
4698
+ var timeSinceLastCall = time - lastCallTime,
4699
+ timeSinceLastInvoke = time - lastInvokeTime,
4700
+ timeWaiting = wait - timeSinceLastCall;
4701
+
4702
+ return maxing
4703
+ ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
4704
+ : timeWaiting;
4705
+ }
4706
+
4707
+ function shouldInvoke(time) {
4708
+ var timeSinceLastCall = time - lastCallTime,
4709
+ timeSinceLastInvoke = time - lastInvokeTime;
4710
+
4711
+ // Either this is the first call, activity has stopped and we're at the
4712
+ // trailing edge, the system time has gone backwards and we're treating
4713
+ // it as the trailing edge, or we've hit the `maxWait` limit.
4714
+ return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
4715
+ (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
4716
+ }
4717
+
4718
+ function timerExpired() {
4719
+ var time = now();
4720
+ if (shouldInvoke(time)) {
4721
+ return trailingEdge(time);
4722
+ }
4723
+ // Restart the timer.
4724
+ timerId = setTimeout(timerExpired, remainingWait(time));
4725
+ }
4726
+
4727
+ function trailingEdge(time) {
4728
+ timerId = undefined;
4729
+
4730
+ // Only invoke if we have `lastArgs` which means `func` has been
4731
+ // debounced at least once.
4732
+ if (trailing && lastArgs) {
4733
+ return invokeFunc(time);
4734
+ }
4735
+ lastArgs = lastThis = undefined;
4736
+ return result;
4737
+ }
4738
+
4739
+ function cancel() {
4740
+ if (timerId !== undefined) {
4741
+ clearTimeout(timerId);
4742
+ }
4743
+ lastInvokeTime = 0;
4744
+ lastArgs = lastCallTime = lastThis = timerId = undefined;
4745
+ }
4746
+
4747
+ function flush() {
4748
+ return timerId === undefined ? result : trailingEdge(now());
4749
+ }
4750
+
4751
+ function debounced() {
4752
+ var time = now(),
4753
+ isInvoking = shouldInvoke(time);
4754
+
4755
+ lastArgs = arguments;
4756
+ lastThis = this;
4757
+ lastCallTime = time;
4758
+
4759
+ if (isInvoking) {
4760
+ if (timerId === undefined) {
4761
+ return leadingEdge(lastCallTime);
4762
+ }
4763
+ if (maxing) {
4764
+ // Handle invocations in a tight loop.
4765
+ clearTimeout(timerId);
4766
+ timerId = setTimeout(timerExpired, wait);
4767
+ return invokeFunc(lastCallTime);
4768
+ }
4769
+ }
4770
+ if (timerId === undefined) {
4771
+ timerId = setTimeout(timerExpired, wait);
4772
+ }
4773
+ return result;
4774
+ }
4775
+ debounced.cancel = cancel;
4776
+ debounced.flush = flush;
4777
+ return debounced;
4778
+ }
4779
+
4780
+ var debounce_1 = debounce;
4781
+
4782
+ function useStableCallback(func) {
4783
+ const funcRef = React__namespace.useRef();
4784
+ React__namespace.useEffect(() => {
4785
+ funcRef.current = func;
4786
+ return () => {
4787
+ funcRef.current = undefined;
4788
+ };
4789
+ }, [func]);
4790
+ return React__namespace.useCallback((...args) => {
4791
+ if (typeof funcRef.current === 'function') {
4792
+ return funcRef.current(...args);
4793
+ }
4794
+ return undefined;
4795
+ }, []);
4796
+ }
4797
+ function useCurrent(value) {
4798
+ const ref = React__namespace.useRef(value);
4799
+ ref.current = value;
4800
+ return React__namespace.useCallback(() => ref.current, []);
4801
+ }
4802
+ function invariant(cond, message) {
4803
+ if (!cond) {
4804
+ throw new Error(message);
4805
+ }
4806
+ }
4807
+ function escapeStringForRegExp(input) {
4808
+ return input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
4809
+ }
4810
+
4811
+ const b$2 = block('settings-search');
4812
+ function SettingsSearch({ className, onChange, debounce = 200, inputRef, placeholder, }) {
4813
+ const onChangeStable = useStableCallback(onChange);
4814
+ const handleUpdate = React__default["default"].useCallback(debounce_1(onChangeStable, debounce), [debounce]);
4815
+ return (React__default["default"].createElement("div", { className: b$2(null, className) },
4816
+ React__default["default"].createElement(uikit.TextInput, { controlRef: inputRef, hasClear: true, autoFocus: true, placeholder: placeholder, onUpdate: handleUpdate })));
4817
+ }
4818
+
4819
+ var css_248z$1 = ".ycn-settings-menu__group-heading {\n font-weight: var(--yc-text-accent-font-weight);\n display: inline-block;\n padding: 0 20px;\n margin-bottom: 12px;\n line-height: 18px;\n}\n.ycn-settings-menu__group + .ycn-settings-menu__group {\n margin-top: 24px;\n}\n.ycn-settings-menu__item {\n display: flex;\n align-items: center;\n height: 40px;\n padding: 0 20px;\n cursor: pointer;\n color: var(--yc-color-text-primary);\n}\n.ycn-settings-menu__item-icon {\n color: var(--yc-color-text-misc);\n margin-right: 5px;\n}\n.ycn-settings-menu__item:hover, .ycn-settings-menu__item_focused {\n background: var(--yc-color-base-simple-hover);\n}\n.ycn-settings-menu__item_selected {\n background: var(--yc-color-base-selection);\n}\n.ycn-settings-menu__item_selected:hover, .ycn-settings-menu__item_selected.ycn-settings-menu__item_focused {\n background: var(--yc-color-base-selection-hover);\n}\n.ycn-settings-menu__item_disabled {\n color: var(--yc-color-text-secondary);\n cursor: auto;\n}\n.ycn-settings-menu__item_disabled:hover {\n background: none;\n}\n.ycn-settings-menu__item_disabled .ycn-settings-menu__item-icon {\n color: var(--yc-color-base-misc-heavy);\n}\n.ycn-settings-menu__item_badge {\n position: relative;\n}\n.ycn-settings-menu__item_badge::after {\n content: \"\";\n display: block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: var(--yc-color-text-danger);\n position: absolute;\n right: 9px;\n top: calc(50% - 3px);\n}";
4820
+ styleInject(css_248z$1);
4821
+
4822
+ const b$1 = block('settings-menu');
4823
+ const SettingsMenu = React__default["default"].forwardRef(
4824
+ // eslint-disable-next-line prefer-arrow-callback
4825
+ function SettingsMenu({ items, onChange, activeItem }, ref) {
4826
+ const [focusItem, setFocus] = React__default["default"].useState();
4827
+ const containerRef = React__default["default"].useRef(null);
4828
+ const handleChange = useStableCallback(onChange);
4829
+ const getFocused = useCurrent(focusItem);
4830
+ React__default["default"].useImperativeHandle(ref, () => ({
4831
+ handleKeyDown(event) {
4832
+ if (!containerRef.current) {
4833
+ return false;
4834
+ }
4835
+ const focused = getFocused();
4836
+ if (focused && event.key === 'Enter') {
4837
+ handleChange(focused);
4838
+ return true;
4839
+ }
4840
+ else if (event.key === 'ArrowDown') {
4841
+ setFocus(focusNext(containerRef.current, focused, 1));
4842
+ return true;
4843
+ }
4844
+ else if (event.key === 'ArrowUp') {
4845
+ setFocus(focusNext(containerRef.current, focused, -1));
4846
+ return true;
4847
+ }
4848
+ return false;
4849
+ },
4850
+ clearFocus() {
4851
+ setFocus(undefined);
4852
+ },
4853
+ }), [getFocused, handleChange]);
4854
+ return (React__default["default"].createElement("div", { ref: containerRef, className: b$1() }, items.map((firstLevelItem) => {
4855
+ if ('groupTitle' in firstLevelItem) {
4856
+ return (React__default["default"].createElement("div", { key: firstLevelItem.groupTitle, className: b$1('group') },
4857
+ React__default["default"].createElement("span", { className: b$1('group-heading') }, firstLevelItem.groupTitle),
4858
+ firstLevelItem.items.map((item) => {
4859
+ return renderMenuItem(item, onChange, activeItem, focusItem);
4860
+ })));
4861
+ }
4862
+ return renderMenuItem(firstLevelItem, onChange, activeItem, focusItem);
4863
+ })));
4864
+ });
4865
+ function renderMenuItem(item, onChange, activeItem, focusItem) {
4866
+ return (React__default["default"].createElement("span", { key: item.title, className: b$1('item', {
4867
+ selected: activeItem === item.id,
4868
+ disabled: item.disabled,
4869
+ focused: focusItem === item.id,
4870
+ badge: item.withBadge,
4871
+ }), onClick: () => {
4872
+ if (!item.disabled) {
4873
+ onChange(item.id);
4874
+ }
4875
+ }, "data-id": item.id },
4876
+ item.icon ? React__default["default"].createElement(uikit.Icon, Object.assign({ size: 16 }, item.icon, { className: b$1('item-icon') })) : undefined,
4877
+ React__default["default"].createElement("span", null, item.title)));
4878
+ }
4879
+ function focusNext(container, focused, direction) {
4880
+ var _a;
4881
+ const elements = container.querySelectorAll(`.${b$1('item')}:not(.${b$1('item')}_disabled)`);
4882
+ if (elements.length === 0) {
4883
+ return undefined;
4884
+ }
4885
+ let currentIndex = direction > 0 ? -1 : 0;
4886
+ if (focused) {
4887
+ currentIndex = Array.prototype.findIndex.call(elements, (element) => element.getAttribute('data-id') === focused);
4888
+ }
4889
+ currentIndex = (elements.length + currentIndex + direction) % elements.length;
4890
+ return (_a = elements[currentIndex].getAttribute('data-id')) !== null && _a !== void 0 ? _a : undefined;
4891
+ }
4892
+
4893
+ function getSettingsFromChildren(children, searchText = '') {
4894
+ // 'abc def fg' -> abc.*?cde.*?fg
4895
+ const preparedFilter = escapeStringForRegExp(searchText).replace(/\s+/g, '.*?');
4896
+ const filterRe = new RegExp(preparedFilter, 'i');
4897
+ return getSettingsFromChildrenRecursive(children, '', filterRe);
4898
+ }
4899
+ function getSettingsFromChildrenRecursive(children, basepath = '', filterRe) {
4900
+ const menu = [];
4901
+ const pages = {};
4902
+ let hasGroup = false;
4903
+ let hasItems = false;
4904
+ React__default["default"].Children.forEach(children, (element) => {
4905
+ var _a, _b;
4906
+ if (!React__default["default"].isValidElement(element)) {
4907
+ // Ignore non-elements.
4908
+ return;
4909
+ }
4910
+ if (element.type === React__default["default"].Fragment) {
4911
+ // Transparently support React.Fragment and its children.
4912
+ const { menu: menuFragment, pages: pagesFragment } = getSettingsFromChildrenRecursive(element.props.children, basepath, filterRe);
4913
+ menu.push(...menuFragment);
4914
+ Object.assign(pages, pagesFragment);
4915
+ }
4916
+ else if (element.props.groupTitle) {
4917
+ if (process.env.NODE_ENV === 'development') {
4918
+ invariant(!hasItems, 'Setting menu must not mix groups and pages on one level');
4919
+ }
4920
+ const pageId = `${basepath}/${(_a = element.props.id) !== null && _a !== void 0 ? _a : element.props.groupTitle}`;
4921
+ hasGroup = true;
4922
+ const { menu: menuFragment, pages: pagesFragment } = getSettingsFromChildrenRecursive(element.props.children, pageId, filterRe);
4923
+ if (process.env.NODE_ENV === 'development') {
4924
+ const hasInnerGroup = menuFragment.some((item) => 'groupTitle' in item);
4925
+ invariant(!hasInnerGroup, `Group ${element.props.groupTitle} should not include groups`);
4926
+ }
4927
+ menu.push({
4928
+ groupTitle: element.props.groupTitle,
4929
+ // @ts-ignore
4930
+ items: menuFragment,
4931
+ });
4932
+ Object.assign(pages, pagesFragment);
4933
+ }
4934
+ else {
4935
+ hasItems = true;
4936
+ const pageId = `${basepath}/${(_b = element.props.id) !== null && _b !== void 0 ? _b : element.props.title}`;
4937
+ if (process.env.NODE_ENV === 'development') {
4938
+ invariant(Boolean(element.props.title), 'Component must include title prop');
4939
+ invariant(!hasGroup, 'Setting menu must not mix groups and pages on one level');
4940
+ invariant(!pages[pageId], `Setting menu page id must be uniq (${pageId})`);
4941
+ }
4942
+ pages[pageId] = getSettingsPageFromChildren(element.props.children, filterRe);
4943
+ pages[pageId].id = pageId;
4944
+ menu.push({
4945
+ id: pageId,
4946
+ title: element.props.title,
4947
+ icon: element.props.icon,
4948
+ withBadge: pages[pageId].withBadge,
4949
+ disabled: pages[pageId].hidden,
4950
+ });
4951
+ }
4952
+ });
4953
+ return { menu, pages };
4954
+ }
4955
+ function getSettingsPageFromChildren(children, filterRe) {
4956
+ const page = { id: '', sections: [], hidden: true };
4957
+ React__default["default"].Children.forEach(children, (element) => {
4958
+ if (!React__default["default"].isValidElement(element)) {
4959
+ // Ignore non-elements.
4960
+ return;
4961
+ }
4962
+ if (element.type === React__default["default"].Fragment) {
4963
+ // Transparently support React.Fragment and its children.
4964
+ const { sections, withBadge, hidden } = getSettingsPageFromChildren(element.props.children, filterRe);
4965
+ page.sections.push(...sections);
4966
+ page.withBadge = withBadge || page.withBadge;
4967
+ page.hidden = hidden && page.hidden;
4968
+ }
4969
+ else {
4970
+ const { title, header, withBadge } = element.props;
4971
+ const { items, hidden } = getSettingsItemsFromChildren(element.props.children, filterRe);
4972
+ page.withBadge = withBadge || page.withBadge;
4973
+ page.hidden = hidden && page.hidden;
4974
+ page.sections.push({
4975
+ title,
4976
+ header,
4977
+ withBadge,
4978
+ items,
4979
+ hidden,
4980
+ });
4981
+ }
4982
+ });
4983
+ return page;
4984
+ }
4985
+ function getSettingsItemsFromChildren(children, filterRe) {
4986
+ let hidden = true;
4987
+ const items = [];
4988
+ React__default["default"].Children.forEach(children, (element) => {
4989
+ if (!React__default["default"].isValidElement(element)) {
4990
+ // Ignore non-elements.
4991
+ return;
4992
+ }
4993
+ if (element.type === React__default["default"].Fragment) {
4994
+ // Transparently support React.Fragment and its children.
4995
+ const fragmentItems = getSettingsItemsFromChildren(element.props.children, filterRe);
4996
+ items.push(...fragmentItems.items);
4997
+ hidden = hidden && fragmentItems.hidden;
4998
+ }
4999
+ else {
5000
+ const item = {
5001
+ title: element.props.title,
5002
+ renderTitleComponent: element.props.renderTitleComponent,
5003
+ element,
5004
+ hidden: !filterRe.test(element.props.title),
5005
+ };
5006
+ items.push(item);
5007
+ hidden = hidden && item.hidden;
5008
+ }
5009
+ });
5010
+ return { items, hidden };
5011
+ }
5012
+
5013
+ var css_248z = ".ycn-settings {\n display: grid;\n grid-template-columns: 216px 1fr;\n width: 834px;\n height: 100%;\n}\n.ycn-settings_loading {\n grid-template-columns: auto;\n}\n.ycn-settings__loader {\n align-self: center;\n justify-self: center;\n}\n.ycn-settings__not-found {\n display: grid;\n align-items: center;\n justify-items: center;\n height: 100%;\n}\n.ycn-settings__menu {\n border-right: 1px solid var(--yc-color-line-generic);\n}\n.ycn-settings__heading {\n font-size: var(--yc-text-subheader-2-font-size);\n line-height: var(--yc-text-subheader-2-line-height);\n font-weight: var(--yc-text-subheader-font-weight);\n margin: 20px 20px 0;\n}\n.ycn-settings__search {\n margin: 12px 20px 16px;\n}\n.ycn-settings__page {\n padding: 20px;\n overflow-y: auto;\n}\n.ycn-settings__section-heading {\n font-size: var(--yc-text-subheader-2-font-size);\n line-height: var(--yc-text-subheader-2-line-height);\n font-weight: var(--yc-text-subheader-font-weight);\n margin: 0;\n}\n.ycn-settings__section-item {\n margin-top: 24px;\n}\n.ycn-settings__section + .ycn-settings__section {\n margin-top: 32px;\n}\n.ycn-settings__item {\n display: grid;\n grid-template-columns: 216px 1fr;\n justify-items: start;\n}\n.ycn-settings__item_align_top {\n align-items: start;\n}\n.ycn-settings__item_align_center {\n align-items: center;\n}\n.ycn-settings__item-heading_badge {\n position: relative;\n}\n.ycn-settings__item-heading_badge::after {\n content: \"\";\n display: block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: var(--yc-color-text-danger);\n position: absolute;\n right: -8px;\n top: 1px;\n}\n.ycn-settings__found {\n font-weight: var(--yc-text-accent-font-weight);\n background: var(--yc-color-base-selection);\n}";
5014
+ styleInject(css_248z);
5015
+
5016
+ const b = block('settings');
5017
+ const defaultDict = {
5018
+ heading_settings: 'Settings',
5019
+ placeholder_search: 'Search settings',
5020
+ not_found: 'No results found',
5021
+ };
5022
+ function Settings(_a) {
5023
+ var { loading, renderLoading, children } = _a, props = __rest(_a, ["loading", "renderLoading", "children"]);
5024
+ if (loading) {
5025
+ return (React__default["default"].createElement("div", { className: b({ loading: true }) }, typeof renderLoading === 'function' ? (renderLoading()) : (React__default["default"].createElement(uikit.Loader, { className: b('loader'), size: "m" }))));
5026
+ }
5027
+ return React__default["default"].createElement(SettingsContent, Object.assign({}, props), children);
5028
+ }
5029
+ Settings.defaultProps = {
5030
+ dict: defaultDict,
5031
+ };
5032
+ function SettingsContent({ initialPage, onPageChange, children, renderNotFound, dict, }) {
5033
+ var _a, _b;
5034
+ const [search, setSearch] = React__default["default"].useState('');
5035
+ const { menu, pages } = getSettingsFromChildren(children, search);
5036
+ const pageKeys = Object.keys(pages);
5037
+ const [selectedPage, setCurrentPage] = React__default["default"].useState(initialPage && pageKeys.includes(initialPage) ? initialPage : undefined);
5038
+ const searchInputRef = React__default["default"].useRef(null);
5039
+ const menuRef = React__default["default"].useRef(null);
5040
+ React__default["default"].useEffect(() => {
5041
+ var _a;
5042
+ (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.clearFocus();
5043
+ }, [search]);
5044
+ React__default["default"].useEffect(() => {
5045
+ const handler = () => {
5046
+ var _a;
5047
+ (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.clearFocus();
5048
+ };
5049
+ window.addEventListener('click', handler);
5050
+ return () => {
5051
+ window.removeEventListener('click', handler);
5052
+ };
5053
+ }, []);
5054
+ let activePage = selectedPage;
5055
+ if (!activePage || ((_a = pages[activePage]) === null || _a === void 0 ? void 0 : _a.hidden)) {
5056
+ activePage = (_b = Object.values(pages).find(({ hidden }) => !hidden)) === null || _b === void 0 ? void 0 : _b.id;
5057
+ }
5058
+ const handlePageChange = (newPage) => {
5059
+ setCurrentPage((prevPage) => {
5060
+ if (prevPage !== newPage) {
5061
+ onPageChange === null || onPageChange === void 0 ? void 0 : onPageChange(newPage);
5062
+ }
5063
+ return newPage;
5064
+ });
5065
+ };
5066
+ React__default["default"].useEffect(() => {
5067
+ if (activePage !== selectedPage) {
5068
+ handlePageChange(activePage);
5069
+ }
5070
+ });
5071
+ const renderPageContent = () => {
5072
+ if (!activePage) {
5073
+ return typeof renderNotFound === 'function' ? (renderNotFound()) : (React__default["default"].createElement("div", { className: b('not-found') }, dict === null || dict === void 0 ? void 0 : dict.not_found));
5074
+ }
5075
+ return pages[activePage].sections
5076
+ .filter((section) => !section.hidden)
5077
+ .map((section) => (React__default["default"].createElement("div", { key: section.title, className: b('section') },
5078
+ React__default["default"].createElement("h3", { className: b('section-heading') }, section.title),
5079
+ section.header ? section.header : null,
5080
+ section.items.map(({ hidden, title, element }) => hidden ? null : (React__default["default"].createElement("div", { key: title, className: b('section-item') }, React__default["default"].cloneElement(element, Object.assign(Object.assign({}, element.props), { title: search && title ? prepareTitle(title, search) : title }))))))));
5081
+ };
5082
+ return (React__default["default"].createElement("div", { className: b() },
5083
+ React__default["default"].createElement("div", { className: b('menu'), onClick: () => {
5084
+ if (searchInputRef.current) {
5085
+ searchInputRef.current.focus();
5086
+ }
5087
+ }, onKeyDown: (event) => {
5088
+ if (menuRef.current) {
5089
+ if (menuRef.current.handleKeyDown(event)) {
5090
+ event.preventDefault();
5091
+ }
5092
+ }
5093
+ } },
5094
+ React__default["default"].createElement("h2", { className: b('heading') }, dict === null || dict === void 0 ? void 0 : dict.heading_settings),
5095
+ React__default["default"].createElement(SettingsSearch, { inputRef: searchInputRef, className: b('search'), onChange: setSearch, placeholder: dict === null || dict === void 0 ? void 0 : dict.placeholder_search }),
5096
+ React__default["default"].createElement(SettingsMenu, { ref: menuRef, items: menu, onChange: handlePageChange, activeItem: activePage })),
5097
+ React__default["default"].createElement("div", { className: b('page') }, renderPageContent())));
5098
+ }
5099
+ Settings.Group = function SettingsGroup({ children }) {
5100
+ return React__default["default"].createElement(React__default["default"].Fragment, null, children);
5101
+ };
5102
+ Settings.Page = function SettingsPage({ children }) {
5103
+ return React__default["default"].createElement(React__default["default"].Fragment, null, children);
5104
+ };
5105
+ Settings.Section = function SettingsSection({ children }) {
5106
+ return React__default["default"].createElement(React__default["default"].Fragment, null, children);
5107
+ };
5108
+ Settings.Item = function SettingsItem({ title, children, align = 'center', withBadge, renderTitleComponent = identity_1, }) {
5109
+ return (React__default["default"].createElement("div", { className: b('item', { align }) },
5110
+ React__default["default"].createElement("label", { className: b('item-heading', { badge: withBadge }) }, renderTitleComponent(title)),
5111
+ React__default["default"].createElement("div", null, children)));
5112
+ };
5113
+ function prepareTitle(string, search) {
5114
+ let temp = string.slice(0);
5115
+ const title = [];
5116
+ const parts = escapeStringForRegExp(search).split(' ').filter(Boolean);
5117
+ let key = 0;
5118
+ for (const part of parts) {
5119
+ const regex = new RegExp(part, 'ig');
5120
+ const match = regex.exec(temp);
5121
+ if (match) {
5122
+ const m = match[0];
5123
+ const i = match.index;
5124
+ if (i > 0) {
5125
+ title.push(temp.slice(0, i));
5126
+ }
5127
+ title.push(React__default["default"].createElement("strong", { key: key++, className: b('found') }, m));
5128
+ temp = temp.slice(i + m.length);
5129
+ }
5130
+ }
5131
+ if (temp) {
5132
+ title.push(temp);
5133
+ }
5134
+ return title;
5135
+ }
5136
+
5137
+ exports.ActionBar = PublicActionBar;
4143
5138
  exports.AsideHeader = AsideHeader;
4144
5139
  exports.Drawer = Drawer;
4145
5140
  exports.DrawerItem = DrawerItem;
4146
5141
  exports.FooterItem = FooterItem;
5142
+ exports.Settings = Settings;
4147
5143
  //# sourceMappingURL=index.js.map