@gravity-ui/navigation 3.0.0-beta.2 → 3.0.0-beta.4

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 (125) hide show
  1. package/build/cjs/{index-B6c8DVdr.js → index-D5mnpi6c.js} +8 -8
  2. package/build/cjs/{index-B6c8DVdr.js.map → index-D5mnpi6c.js.map} +1 -1
  3. package/build/cjs/index-DOLqlMz4.js +5732 -0
  4. package/build/cjs/index-DOLqlMz4.js.map +1 -0
  5. package/build/cjs/index.js +28 -4
  6. package/build/cjs/index.js.map +1 -1
  7. package/build/esm/{index-BLdwsphX.js → index-CO69JxhQ.js} +5 -5
  8. package/build/esm/{index-BLdwsphX.js.map → index-CO69JxhQ.js.map} +1 -1
  9. package/build/esm/index-Cj3tqMQo.js +5687 -0
  10. package/build/esm/index-Cj3tqMQo.js.map +1 -0
  11. package/build/esm/index.js +5 -3
  12. package/build/esm/index.js.map +1 -1
  13. package/package.json +1 -1
  14. package/build/cjs/ActionBar-_qjZ9IMA.js +0 -59
  15. package/build/cjs/ActionBar-_qjZ9IMA.js.map +0 -1
  16. package/build/cjs/AsideFallback.js +0 -25
  17. package/build/cjs/AsideFallback.js.map +0 -1
  18. package/build/cjs/AsideHeader.js +0 -33
  19. package/build/cjs/AsideHeader.js.map +0 -1
  20. package/build/cjs/AsideHeaderContext.js +0 -38
  21. package/build/cjs/AsideHeaderContext.js.map +0 -1
  22. package/build/cjs/Content-Dy2XkiRi.js +0 -16
  23. package/build/cjs/Content-Dy2XkiRi.js.map +0 -1
  24. package/build/cjs/Drawer.js +0 -2493
  25. package/build/cjs/Drawer.js.map +0 -1
  26. package/build/cjs/FooterItem-CLk0aHrc.js +0 -332
  27. package/build/cjs/FooterItem-CLk0aHrc.js.map +0 -1
  28. package/build/cjs/FooterItem.js +0 -26
  29. package/build/cjs/FooterItem.js.map +0 -1
  30. package/build/cjs/HotkeysPanel-C436myZY.js +0 -63
  31. package/build/cjs/HotkeysPanel-C436myZY.js.map +0 -1
  32. package/build/cjs/Item-CLHysLDd.js +0 -328
  33. package/build/cjs/Item-CLHysLDd.js.map +0 -1
  34. package/build/cjs/PageLayout.js +0 -34
  35. package/build/cjs/PageLayout.js.map +0 -1
  36. package/build/cjs/PageLayoutAside-SMHlPBAO.js +0 -979
  37. package/build/cjs/PageLayoutAside-SMHlPBAO.js.map +0 -1
  38. package/build/cjs/PageLayoutAside.js +0 -24
  39. package/build/cjs/PageLayoutAside.js.map +0 -1
  40. package/build/cjs/Settings-x0a3P0Vr.js +0 -586
  41. package/build/cjs/Settings-x0a3P0Vr.js.map +0 -1
  42. package/build/cjs/Title-CzxcSMoP.js +0 -36
  43. package/build/cjs/Title-CzxcSMoP.js.map +0 -1
  44. package/build/cjs/_commonjsHelpers-BJu3ubxk.js +0 -11
  45. package/build/cjs/_commonjsHelpers-BJu3ubxk.js.map +0 -1
  46. package/build/cjs/cn-DSlPZbcs.js +0 -11
  47. package/build/cjs/cn-DSlPZbcs.js.map +0 -1
  48. package/build/cjs/constants-B0DLAQY9.js +0 -14
  49. package/build/cjs/constants-B0DLAQY9.js.map +0 -1
  50. package/build/cjs/debounce-RFF04eVR.js +0 -660
  51. package/build/cjs/debounce-RFF04eVR.js.map +0 -1
  52. package/build/cjs/divider-collapsed-BLSp99lJ.js +0 -39
  53. package/build/cjs/divider-collapsed-BLSp99lJ.js.map +0 -1
  54. package/build/cjs/index2.js +0 -15
  55. package/build/cjs/index2.js.map +0 -1
  56. package/build/cjs/index3.js +0 -17
  57. package/build/cjs/index3.js.map +0 -1
  58. package/build/cjs/index4.js +0 -21
  59. package/build/cjs/index4.js.map +0 -1
  60. package/build/cjs/index5.js +0 -22
  61. package/build/cjs/index5.js.map +0 -1
  62. package/build/cjs/index6.js +0 -194
  63. package/build/cjs/index6.js.map +0 -1
  64. package/build/cjs/style-inject.es-CsU6UJbw.js +0 -31
  65. package/build/cjs/style-inject.es-CsU6UJbw.js.map +0 -1
  66. package/build/cjs/tslib.es6-D25eJ2i9.js +0 -38
  67. package/build/cjs/tslib.es6-D25eJ2i9.js.map +0 -1
  68. package/build/cjs/utils-BrRoop7o.js +0 -8
  69. package/build/cjs/utils-BrRoop7o.js.map +0 -1
  70. package/build/esm/ActionBar-BD_roj92.js +0 -57
  71. package/build/esm/ActionBar-BD_roj92.js.map +0 -1
  72. package/build/esm/AsideFallback.js +0 -23
  73. package/build/esm/AsideFallback.js.map +0 -1
  74. package/build/esm/AsideHeader.js +0 -31
  75. package/build/esm/AsideHeader.js.map +0 -1
  76. package/build/esm/AsideHeaderContext.js +0 -31
  77. package/build/esm/AsideHeaderContext.js.map +0 -1
  78. package/build/esm/Content-c3e3OunO.js +0 -14
  79. package/build/esm/Content-c3e3OunO.js.map +0 -1
  80. package/build/esm/Drawer.js +0 -2472
  81. package/build/esm/Drawer.js.map +0 -1
  82. package/build/esm/FooterItem-DuFjLZPI.js +0 -326
  83. package/build/esm/FooterItem-DuFjLZPI.js.map +0 -1
  84. package/build/esm/FooterItem.js +0 -24
  85. package/build/esm/FooterItem.js.map +0 -1
  86. package/build/esm/HotkeysPanel-BWL1Xkqi.js +0 -61
  87. package/build/esm/HotkeysPanel-BWL1Xkqi.js.map +0 -1
  88. package/build/esm/Item-BU0M-jfC.js +0 -318
  89. package/build/esm/Item-BU0M-jfC.js.map +0 -1
  90. package/build/esm/PageLayout.js +0 -32
  91. package/build/esm/PageLayout.js.map +0 -1
  92. package/build/esm/PageLayoutAside-Bd3aJNrH.js +0 -958
  93. package/build/esm/PageLayoutAside-Bd3aJNrH.js.map +0 -1
  94. package/build/esm/PageLayoutAside.js +0 -18
  95. package/build/esm/PageLayoutAside.js.map +0 -1
  96. package/build/esm/Settings-BC6Kmplf.js +0 -564
  97. package/build/esm/Settings-BC6Kmplf.js.map +0 -1
  98. package/build/esm/Title-CRlzgg4r.js +0 -34
  99. package/build/esm/Title-CRlzgg4r.js.map +0 -1
  100. package/build/esm/_commonjsHelpers-BFTU3MAI.js +0 -8
  101. package/build/esm/_commonjsHelpers-BFTU3MAI.js.map +0 -1
  102. package/build/esm/cn-CgiqTV3v.js +0 -8
  103. package/build/esm/cn-CgiqTV3v.js.map +0 -1
  104. package/build/esm/constants-ChYDZ5F2.js +0 -8
  105. package/build/esm/constants-ChYDZ5F2.js.map +0 -1
  106. package/build/esm/debounce-DW3XyyUs.js +0 -658
  107. package/build/esm/debounce-DW3XyyUs.js.map +0 -1
  108. package/build/esm/divider-collapsed-BgKmR8h9.js +0 -18
  109. package/build/esm/divider-collapsed-BgKmR8h9.js.map +0 -1
  110. package/build/esm/index2.js +0 -9
  111. package/build/esm/index2.js.map +0 -1
  112. package/build/esm/index3.js +0 -11
  113. package/build/esm/index3.js.map +0 -1
  114. package/build/esm/index4.js +0 -13
  115. package/build/esm/index4.js.map +0 -1
  116. package/build/esm/index5.js +0 -13
  117. package/build/esm/index5.js.map +0 -1
  118. package/build/esm/index6.js +0 -171
  119. package/build/esm/index6.js.map +0 -1
  120. package/build/esm/style-inject.es-Bff-fD1R.js +0 -29
  121. package/build/esm/style-inject.es-Bff-fD1R.js.map +0 -1
  122. package/build/esm/tslib.es6-BCqiemNI.js +0 -36
  123. package/build/esm/tslib.es6-BCqiemNI.js.map +0 -1
  124. package/build/esm/utils-D0s6YtvW.js +0 -6
  125. package/build/esm/utils-D0s6YtvW.js.map +0 -1
@@ -1,586 +0,0 @@
1
- 'use strict';
2
-
3
- var tslib_es6 = require('./tslib.es6-D25eJ2i9.js');
4
- var React = require('react');
5
- var uikit = require('@gravity-ui/uikit');
6
- var _commonjsHelpers = require('./_commonjsHelpers-BJu3ubxk.js');
7
- var Title = require('./Title-CzxcSMoP.js');
8
- var cn = require('./cn-DSlPZbcs.js');
9
- var styleInject_es = require('./style-inject.es-CsU6UJbw.js');
10
- var debounce = require('./debounce-RFF04eVR.js');
11
- var i18n$1 = require('@gravity-ui/uikit/i18n');
12
-
13
- function _interopNamespaceDefault(e) {
14
- var n = Object.create(null);
15
- if (e) {
16
- Object.keys(e).forEach(function (k) {
17
- if (k !== 'default') {
18
- var d = Object.getOwnPropertyDescriptor(e, k);
19
- Object.defineProperty(n, k, d.get ? d : {
20
- enumerable: true,
21
- get: function () { return e[k]; }
22
- });
23
- }
24
- });
25
- }
26
- n.default = e;
27
- return Object.freeze(n);
28
- }
29
-
30
- var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
31
-
32
- function useStableCallback(func) {
33
- const funcRef = React__namespace.useRef();
34
- React__namespace.useEffect(() => {
35
- funcRef.current = func;
36
- return () => {
37
- funcRef.current = undefined;
38
- };
39
- }, [func]);
40
- return React__namespace.useCallback((...args) => {
41
- if (typeof funcRef.current === 'function') {
42
- return funcRef.current(...args);
43
- }
44
- return undefined;
45
- }, []);
46
- }
47
- function useCurrent(value) {
48
- const ref = React__namespace.useRef(value);
49
- ref.current = value;
50
- return React__namespace.useCallback(() => ref.current, []);
51
- }
52
- function invariant(cond, message) {
53
- if (!cond) {
54
- throw new Error(message);
55
- }
56
- }
57
- function escapeStringForRegExp(input) {
58
- return input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
59
- }
60
-
61
- function getSettingsFromChildren(children, searchText = '') {
62
- // 'abc def fg' -> abc.*?cde.*?fg
63
- const preparedFilter = escapeStringForRegExp(searchText).replace(/\s+/g, '.*?');
64
- const filterRe = new RegExp(preparedFilter, 'i');
65
- return getSettingsFromChildrenRecursive(children, '', filterRe);
66
- }
67
- function getSettingsFromChildrenRecursive(children, basepath = '', filterRe) {
68
- const menu = [];
69
- const pages = {};
70
- let hasGroup = false;
71
- let hasItems = false;
72
- React.Children.forEach(children, (element) => {
73
- var _a, _b;
74
- if (!React.isValidElement(element)) {
75
- // Ignore non-elements.
76
- return;
77
- }
78
- if (element.type === React.Fragment) {
79
- // Transparently support React.Fragment and its children.
80
- const { menu: menuFragment, pages: pagesFragment } = getSettingsFromChildrenRecursive(element.props.children, basepath, filterRe);
81
- menu.push(...menuFragment);
82
- Object.assign(pages, pagesFragment);
83
- }
84
- else if (element.props.groupTitle) {
85
- if (process.env.NODE_ENV === 'development') {
86
- invariant(!hasItems, 'Setting menu must not mix groups and pages on one level');
87
- }
88
- const pageId = `${basepath}/${(_a = element.props.id) !== null && _a !== undefined ? _a : element.props.groupTitle}`;
89
- hasGroup = true;
90
- const { menu: menuFragment, pages: pagesFragment } = getSettingsFromChildrenRecursive(element.props.children, pageId, filterRe);
91
- if (process.env.NODE_ENV === 'development') {
92
- const hasInnerGroup = menuFragment.some((item) => 'groupTitle' in item);
93
- invariant(!hasInnerGroup, `Group ${element.props.groupTitle} should not include groups`);
94
- }
95
- menu.push({
96
- groupTitle: element.props.groupTitle,
97
- // @ts-ignore
98
- items: menuFragment,
99
- });
100
- Object.assign(pages, pagesFragment);
101
- }
102
- else {
103
- hasItems = true;
104
- const pageId = `${basepath}/${(_b = element.props.id) !== null && _b !== undefined ? _b : element.props.title}`;
105
- if (process.env.NODE_ENV === 'development') {
106
- invariant(Boolean(element.props.title), 'Component must include title prop');
107
- invariant(!hasGroup, 'Setting menu must not mix groups and pages on one level');
108
- invariant(!pages[pageId], `Setting menu page id must be uniq (${pageId})`);
109
- }
110
- pages[pageId] = getSettingsPageFromChildren(element.props.children, filterRe);
111
- pages[pageId].id = pageId;
112
- menu.push({
113
- id: pageId,
114
- title: element.props.title,
115
- icon: element.props.icon,
116
- withBadge: pages[pageId].withBadge,
117
- disabled: pages[pageId].hidden,
118
- });
119
- }
120
- });
121
- return { menu, pages };
122
- }
123
- function getSettingsPageFromChildren(children, filterRe) {
124
- const page = { id: '', sections: [], hidden: true };
125
- React.Children.forEach(children, (element) => {
126
- if (!React.isValidElement(element)) {
127
- // Ignore non-elements.
128
- return;
129
- }
130
- if (element.type === React.Fragment) {
131
- // Transparently support React.Fragment and its children.
132
- const { sections, withBadge, hidden } = getSettingsPageFromChildren(element.props.children, filterRe);
133
- page.sections.push(...sections);
134
- page.withBadge = withBadge || page.withBadge;
135
- page.hidden = hidden && page.hidden;
136
- }
137
- else {
138
- const { withBadge } = element.props;
139
- const { items, hidden } = getSettingsItemsFromChildren(element.props.children, filterRe);
140
- page.withBadge = withBadge || page.withBadge;
141
- page.hidden = hidden && page.hidden;
142
- page.sections.push(Object.assign(Object.assign({}, element.props), { withBadge,
143
- items,
144
- hidden }));
145
- }
146
- });
147
- return page;
148
- }
149
- function getSettingsItemsFromChildren(children, filterRe) {
150
- let hidden = true;
151
- const items = [];
152
- React.Children.forEach(children, (element) => {
153
- if (!React.isValidElement(element)) {
154
- // Ignore non-elements.
155
- return;
156
- }
157
- if (element.type === React.Fragment) {
158
- // Transparently support React.Fragment and its children.
159
- const fragmentItems = getSettingsItemsFromChildren(element.props.children, filterRe);
160
- items.push(...fragmentItems.items);
161
- hidden = hidden && fragmentItems.hidden;
162
- }
163
- else {
164
- const item = Object.assign(Object.assign({}, element.props), { element, hidden: !filterRe.test(element.props.title) });
165
- items.push(item);
166
- hidden = hidden && item.hidden;
167
- }
168
- });
169
- return { items, hidden };
170
- }
171
- function getSelectedSettingsPart(pages, selection) {
172
- if (!selection.settingId && !selection.section && !selection.page) {
173
- return {};
174
- }
175
- for (const page of Object.values(pages)) {
176
- if (!selection.settingId && !selection.section) {
177
- if (selection.page !== page.id)
178
- continue;
179
- return { page };
180
- }
181
- for (const section of page.sections) {
182
- if (selection.settingId) {
183
- for (const setting of section.items) {
184
- if (setting.id === selection.settingId) {
185
- return { page, section, setting };
186
- }
187
- }
188
- }
189
- else if (selection.section &&
190
- ('id' in selection.section
191
- ? selection.section.id === section.id
192
- : selection.section.title === section.title)) {
193
- return { page, section };
194
- }
195
- }
196
- }
197
- return {};
198
- }
199
-
200
- const defaultValue = {};
201
- const context = React.createContext(defaultValue);
202
- context.displayName = 'SettingsSelectionContext';
203
- function useSettingsSelectionProviderValue(pages, selection) {
204
- const selectedRef = React.useRef(null);
205
- const contextValue = React.useMemo(() => {
206
- if (!selection)
207
- return { selectedRef };
208
- return Object.assign({ selectedRef }, getSelectedSettingsPart(pages, selection));
209
- }, [pages, selection]);
210
- return contextValue;
211
- }
212
- const SettingsSelectionContextProvider = context.Provider;
213
- function useSettingsSelectionContext() {
214
- return React.useContext(context);
215
- }
216
-
217
- /**
218
- * This method returns the first argument it receives.
219
- *
220
- * @static
221
- * @since 0.1.0
222
- * @memberOf _
223
- * @category Util
224
- * @param {*} value Any value.
225
- * @returns {*} Returns `value`.
226
- * @example
227
- *
228
- * var object = { 'a': 1 };
229
- *
230
- * console.log(_.identity(object) === object);
231
- * // => true
232
- */
233
-
234
- var identity_1;
235
- var hasRequiredIdentity;
236
-
237
- function requireIdentity () {
238
- if (hasRequiredIdentity) return identity_1;
239
- hasRequiredIdentity = 1;
240
- function identity(value) {
241
- return value;
242
- }
243
-
244
- identity_1 = identity;
245
- return identity_1;
246
- }
247
-
248
- var identityExports = requireIdentity();
249
- var identity = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(identityExports);
250
-
251
- function isSectionSelected(selected, pageId, section) {
252
- var _a;
253
- if (!selected.section || selected.setting) {
254
- return false;
255
- }
256
- else if (selected.section.id && selected.section.id === section.id) {
257
- return true;
258
- }
259
- else if (((_a = selected.page) === null || _a === undefined ? undefined : _a.id) === pageId &&
260
- selected.section.title &&
261
- selected.section.title === section.title) {
262
- return true;
263
- }
264
- else {
265
- return false;
266
- }
267
- }
268
-
269
- var css_248z$2 = ".gn-settings-menu__group-heading{display:inline-block;font-weight:var(--g-text-accent-font-weight);line-height:18px;margin-bottom:12px;padding:0 20px}.gn-settings-menu__group+.gn-settings-menu__group{margin-top:24px}.gn-settings-menu__item{align-items:center;color:var(--g-color-text-primary);cursor:pointer;display:flex;height:40px;padding:0 20px}.gn-settings-menu__item-icon{color:var(--g-color-text-misc);margin-right:5px}.gn-settings-menu__item:hover,.gn-settings-menu__item_focused{background:var(--g-color-base-simple-hover)}.gn-settings-menu__item_selected{background:var(--g-color-base-selection)}.gn-settings-menu__item_selected.gn-settings-menu__item_focused,.gn-settings-menu__item_selected:hover{background:var(--g-color-base-selection-hover)}.gn-settings-menu__item_disabled{color:var(--g-color-text-secondary);cursor:auto}.gn-settings-menu__item_disabled:hover{background:none}.gn-settings-menu__item_disabled .gn-settings-menu__item-icon{color:var(--g-color-base-misc-heavy)}.gn-settings-menu__item_badge{position:relative}.gn-settings-menu__item_badge:after{background-color:var(--g-color-text-danger);border-radius:50%;content:\"\";display:block;height:6px;position:absolute;right:9px;top:calc(50% - 3px);width:6px}";
270
- styleInject_es.styleInject(css_248z$2);
271
-
272
- const b$3 = cn.block('settings-menu');
273
- const SettingsMenu = React.forwardRef(
274
- // eslint-disable-next-line prefer-arrow-callback
275
- function SettingsMenu({ items, onChange, activeItemId }, ref) {
276
- const [focusItemId, setFocusId] = React.useState();
277
- const containerRef = React.useRef(null);
278
- const handleChange = useStableCallback(onChange);
279
- const getFocused = useCurrent(focusItemId);
280
- React.useImperativeHandle(ref, () => ({
281
- handleKeyDown(event) {
282
- if (!containerRef.current) {
283
- return false;
284
- }
285
- const focused = getFocused();
286
- if (focused && event.key === 'Enter') {
287
- handleChange(focused);
288
- return true;
289
- }
290
- else if (event.key === 'ArrowDown') {
291
- setFocusId(focusNext(containerRef.current, focused, 1));
292
- return true;
293
- }
294
- else if (event.key === 'ArrowUp') {
295
- setFocusId(focusNext(containerRef.current, focused, -1));
296
- return true;
297
- }
298
- return false;
299
- },
300
- clearFocus() {
301
- setFocusId(undefined);
302
- },
303
- }), [getFocused, handleChange]);
304
- return (React.createElement("div", { ref: containerRef, className: b$3() }, items.map((firstLevelItem) => {
305
- if ('groupTitle' in firstLevelItem) {
306
- return (React.createElement("div", { key: firstLevelItem.groupTitle, className: b$3('group') },
307
- React.createElement("span", { className: b$3('group-heading') }, firstLevelItem.groupTitle),
308
- firstLevelItem.items.map((item) => {
309
- return renderMenuItem(item, onChange, activeItemId, focusItemId);
310
- })));
311
- }
312
- return renderMenuItem(firstLevelItem, onChange, activeItemId, focusItemId);
313
- })));
314
- });
315
- function renderMenuItem(item, onChange, activeItemId, focusItemId) {
316
- return (React.createElement("span", { key: item.title, className: b$3('item', {
317
- selected: activeItemId === item.id,
318
- disabled: item.disabled,
319
- focused: focusItemId === item.id,
320
- badge: item.withBadge,
321
- }), onClick: () => {
322
- if (!item.disabled) {
323
- onChange(item.id);
324
- }
325
- }, "data-id": item.id },
326
- item.icon ? React.createElement(uikit.Icon, Object.assign({ size: 16 }, item.icon, { className: b$3('item-icon') })) : undefined,
327
- React.createElement("span", null, item.title)));
328
- }
329
- function focusNext(container, focused, direction) {
330
- var _a;
331
- const elements = container.querySelectorAll(`.${b$3('item')}:not(.${b$3('item')}_disabled)`);
332
- if (elements.length === 0) {
333
- return undefined;
334
- }
335
- let currentIndex = direction > 0 ? -1 : 0;
336
- if (focused) {
337
- currentIndex = Array.prototype.findIndex.call(elements, (element) => element.getAttribute('data-id') === focused);
338
- }
339
- currentIndex = (elements.length + currentIndex + direction) % elements.length;
340
- return (_a = elements[currentIndex].getAttribute('data-id')) !== null && _a !== undefined ? _a : undefined;
341
- }
342
-
343
- var css_248z$1 = ".gn-settings-menu-mobile.g-tabs_direction_horizontal{-ms-overflow-style:none;flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:none;scrollbar-width:none}.gn-settings-menu-mobile.g-tabs_direction_horizontal::-webkit-scrollbar{display:none}.gn-settings-menu-mobile__item_badge{position:relative}.gn-settings-menu-mobile__item_badge:after{background-color:var(--g-color-text-danger);border-radius:50%;content:\"\";display:block;height:6px;position:absolute;right:-8px;top:11px;width:6px}";
344
- styleInject_es.styleInject(css_248z$1);
345
-
346
- const b$2 = cn.block('settings-menu-mobile');
347
- const SettingsMenuMobile = ({ items, onChange, activeItemId, className, }) => {
348
- const ref = React.useRef(null);
349
- const tabItems = React.useMemo(() => {
350
- const tabItems = [];
351
- items.forEach((firstLevelItem) => {
352
- if ('groupTitle' in firstLevelItem) {
353
- tabItems.push(...firstLevelItem.items.map(({ id, title, disabled, withBadge }) => ({
354
- id,
355
- title,
356
- disabled,
357
- className: b$2('item', { badge: withBadge }),
358
- })));
359
- }
360
- else {
361
- const { id, title, disabled, withBadge } = firstLevelItem;
362
- tabItems.push({ id, title, disabled, className: b$2('item', { badge: withBadge }) });
363
- }
364
- });
365
- return tabItems;
366
- }, [items]);
367
- const handleTouchMove = (e) => {
368
- e.stopPropagation();
369
- };
370
- return (React.createElement("div", { ref: ref, onTouchMove: handleTouchMove },
371
- React.createElement(uikit.Tabs, { items: tabItems, className: b$2(null, className), size: "l", activeTab: activeItemId, onSelectTab: onChange })));
372
- };
373
-
374
- var label_title$1 = "Settings";
375
- var label_search$1 = "Search";
376
- var en = {
377
- label_title: label_title$1,
378
- "label_filter-placeholder": "Search settings",
379
- "label_empty-placeholder": "No results found",
380
- label_search: label_search$1
381
- };
382
-
383
- var label_title = "Настройки";
384
- var label_search = "Поиск";
385
- var ru = {
386
- label_title: label_title,
387
- "label_filter-placeholder": "Найти настройки",
388
- "label_empty-placeholder": "Ничего не найдено",
389
- label_search: label_search
390
- };
391
-
392
- const COMPONENT = 'Settings';
393
- var i18n = i18n$1.addComponentKeysets({ en, ru }, `${cn.NAMESPACE}${COMPONENT}`);
394
-
395
- const b$1 = cn.block('settings-search');
396
- function SettingsSearch({ className, initialValue, onChange, debounce: debounce$1 = 200, inputRef, inputSize, placeholder, autoFocus = true, }) {
397
- const [value, setValue] = React.useState(initialValue !== null && initialValue !== undefined ? initialValue : '');
398
- const onChangeDebounced = useStableCallback(debounce.debounceFn(onChange, debounce$1));
399
- const handleUpdate = useStableCallback((updated) => {
400
- setValue(updated);
401
- onChangeDebounced(updated);
402
- });
403
- return (React.createElement("div", { className: b$1(null, className) },
404
- React.createElement(uikit.TextInput, { value: value, controlRef: inputRef, hasClear: true, autoFocus: autoFocus, size: inputSize, placeholder: placeholder, onUpdate: handleUpdate, controlProps: {
405
- 'aria-label': i18n('label_search'),
406
- } })));
407
- }
408
-
409
- var css_248z = ".gn-settings{display:grid;grid-template-columns:216px 1fr;height:100%;width:834px}.gn-settings_view_mobile{display:block;height:calc(80vh - 56px);overflow-x:hidden;width:auto}@supports (height:90dvh){.gn-settings_view_mobile{height:calc(90dvh - 56px)}}.gn-settings_view_mobile.gn-settings_loading{text-align:center}.gn-settings_view_mobile .gn-settings__loader{margin-top:20px}.gn-settings_view_mobile .gn-settings__search{margin:4px 0 16px;padding:0 20px}.gn-settings_view_mobile .gn-settings__page{overflow-y:visible}.gn-settings_view_mobile .gn-settings__tabs .g-tabs__item:first-child{margin-left:20px}.gn-settings_view_mobile .gn-settings__tabs .g-tabs__item:last-child{margin-right:20px}.gn-settings_view_mobile .gn-settings__section-heading{font-family:var(--g-text-subheader-font-family);font-size:var(--g-text-subheader-3-font-size);font-weight:var(--g-text-subheader-font-weight);line-height:var(--g-text-subheader-3-line-height)}.gn-settings_view_mobile .gn-settings__section-subheader{color:var(--g-color-text-secondary)}.gn-settings_view_mobile .gn-settings__section-heading+.gn-settings-subheader{margin-top:8px}.gn-settings_view_mobile .gn-settings__section-item{margin-top:0}.gn-settings_view_mobile .gn-settings__section-heading+.gn-settings__section-item,.gn-settings_view_mobile .gn-settings__section-subheader+.gn-settings__section-item{margin-top:30px}.gn-settings_view_mobile .gn-settings__section-item+.gn-settings__section-item{margin-top:22px}.gn-settings_view_mobile .gn-settings__item:not(.gn-settings_view_mobile .gn-settings__item_mode_row){gap:8px;grid-template-columns:1fr}.gn-settings_view_mobile .gn-settings__item-heading{font-family:var(--g-text-body-font-family);font-size:var(--g-text-body-2-font-size);font-weight:var(--g-text-body-font-weight);line-height:var(--g-text-body-2-line-height)}.gn-settings_view_mobile .gn-settings__item-description{font-family:var(--g-text-body-font-family);font-size:var(--g-text-body-1-font-size);font-weight:var(--g-text-body-font-weight);line-height:var(--g-text-body-1-line-height)}.gn-settings_view_mobile .gn-settings__item_mode_row{grid-template-columns:1fr auto}.gn-settings_view_mobile .gn-settings__item_mode_row .gn-settings__item-heading{padding-right:20px}.gn-settings_view_mobile .gn-settings__item-content{width:100%}.gn-settings_view_mobile .gn-settings__not-found{color:var(--g-color-text-hint);font-family:var(--g-text-body-font-family);font-size:var(--g-text-body-2-font-size);font-weight:var(--g-text-body-font-weight);justify-items:start;line-height:var(--g-text-body-2-line-height);margin:20px 0 0 20px}.gn-settings_loading{grid-template-columns:auto}.gn-settings__loader{place-self:center}.gn-settings__not-found{display:grid;height:100%;place-items:center}.gn-settings__menu{border-right:1px solid var(--g-color-line-generic)}.gn-settings__heading{font-family:var(--g-text-subheader-font-family);font-size:var(--g-text-subheader-2-font-size);font-weight:var(--g-text-subheader-font-weight);line-height:var(--g-text-subheader-2-line-height);margin:20px 20px 0}.gn-settings__search{margin:0 20px 16px}.gn-settings__page{overflow-y:auto}.gn-settings__content{padding:20px}.gn-settings__section-right-adornment_hidden{opacity:0;transition:opacity .2s}.gn-settings__section-heading:hover .gn-settings__section-right-adornment_hidden{opacity:1}.gn-settings__section-heading{font-family:var(--g-text-subheader-font-family);font-size:var(--g-text-subheader-2-font-size);font-weight:var(--g-text-subheader-font-weight);line-height:var(--g-text-subheader-2-line-height);margin:0}.gn-settings__section-item{margin-top:24px}.gn-settings__section+.gn-settings__section{margin-top:32px}.gn-settings__section:only-child .gn-settings__section-item:first-of-type{margin-top:0}.gn-settings__section:only-child .gn-settings__section-heading{display:none}.gn-settings__item{display:grid;grid-template-columns:216px 1fr;justify-items:start}.gn-settings__item_align_top{align-items:start}.gn-settings__item_align_center{align-items:center}.gn-settings__item-title_badge{position:relative}.gn-settings__item-title_badge:after{background-color:var(--g-color-text-danger);border-radius:50%;content:\"\";display:block;height:6px;position:absolute;right:-8px;top:1px;width:6px}.gn-settings__item-description{color:var(--g-color-text-secondary);display:block;font-family:var(--g-text-caption-font-family);font-size:var(--g-text-caption-2-font-size);font-weight:var(--g-text-caption-font-weight);line-height:var(--g-text-caption-2-line-height);margin-top:2px;padding-right:20px}.gn-settings__item-right-adornment_hidden{opacity:0;transition:opacity .2s}.gn-settings__item:hover .gn-settings__item-right-adornment_hidden{opacity:1}.gn-settings__item_selected,.gn-settings__section_selected{background:var(--g-color-base-selection);border-radius:8px;margin-left:-8px;padding:8px}.gn-settings__found{background:var(--g-color-base-selection);font-weight:var(--g-text-accent-font-weight)}";
410
- styleInject_es.styleInject(css_248z);
411
-
412
- const b = cn.block('settings');
413
- const SettingsContext = React.createContext({});
414
- const useSettingsContext = () => React.useContext(SettingsContext);
415
- function Settings(_a) {
416
- var { loading, renderLoading, children, view = 'normal', renderRightAdornment, renderSectionRightAdornment, showRightAdornmentOnHover = true } = _a, props = tslib_es6.__rest(_a, ["loading", "renderLoading", "children", "view", "renderRightAdornment", "renderSectionRightAdornment", "showRightAdornmentOnHover"]);
417
- if (loading) {
418
- return (React.createElement("div", { className: b({ loading: true, view }) }, typeof renderLoading === 'function' ? (renderLoading()) : (React.createElement(uikit.Loader, { className: b('loader'), size: "m" }))));
419
- }
420
- return (React.createElement(SettingsContext.Provider, { value: { renderRightAdornment, renderSectionRightAdornment, showRightAdornmentOnHover } },
421
- React.createElement(SettingsContent, Object.assign({ view: view }, props), children)));
422
- }
423
- const getPageTitleById = (menu, activePage) => {
424
- for (const firstLevel of menu) {
425
- if ('groupTitle' in firstLevel) {
426
- for (const secondLevel of firstLevel.items)
427
- if (secondLevel.id === activePage)
428
- return secondLevel.title;
429
- }
430
- else if (firstLevel.id === activePage)
431
- return firstLevel.title;
432
- }
433
- return '';
434
- };
435
- function SettingsContent({ initialPage, initialSearch, selection, children, renderNotFound, title = i18n('label_title'), filterPlaceholder = i18n('label_filter-placeholder'), emptyPlaceholder = i18n('label_empty-placeholder'), view, onPageChange, onClose, }) {
436
- var _a, _b;
437
- const { renderSectionRightAdornment, showRightAdornmentOnHover } = useSettingsContext();
438
- const [search, setSearch] = React.useState(initialSearch !== null && initialSearch !== undefined ? initialSearch : '');
439
- const { menu, pages } = getSettingsFromChildren(children, search);
440
- const selected = useSettingsSelectionProviderValue(pages, selection);
441
- const pageKeys = Object.keys(pages);
442
- const selectionInitialPage = selected.page && pageKeys.includes(selected.page.id) ? selected.page.id : undefined;
443
- const [selectedPage, setCurrentPage] = React.useState(selectionInitialPage ||
444
- (initialPage && pageKeys.includes(initialPage) ? initialPage : undefined));
445
- const searchInputRef = React.useRef(null);
446
- const menuRef = React.useRef(null);
447
- const isMobile = view === 'mobile';
448
- React.useEffect(() => {
449
- var _a;
450
- (_a = menuRef.current) === null || _a === undefined ? undefined : _a.clearFocus();
451
- }, [search]);
452
- React.useEffect(() => {
453
- const handler = () => {
454
- var _a;
455
- (_a = menuRef.current) === null || _a === undefined ? undefined : _a.clearFocus();
456
- };
457
- window.addEventListener('click', handler);
458
- return () => {
459
- window.removeEventListener('click', handler);
460
- };
461
- }, []);
462
- let activePage = selectedPage;
463
- if (!activePage || ((_a = pages[activePage]) === null || _a === undefined ? undefined : _a.hidden)) {
464
- activePage = (_b = Object.values(pages).find(({ hidden }) => !hidden)) === null || _b === undefined ? undefined : _b.id;
465
- }
466
- const handlePageChange = (newPage) => {
467
- setCurrentPage((prevPage) => {
468
- if (prevPage !== newPage) {
469
- onPageChange === null || onPageChange === undefined ? undefined : onPageChange(newPage);
470
- }
471
- return newPage;
472
- });
473
- };
474
- React.useEffect(() => {
475
- if (activePage !== selectedPage) {
476
- handlePageChange(activePage);
477
- }
478
- });
479
- React.useEffect(() => {
480
- if (!selectionInitialPage)
481
- return;
482
- setCurrentPage(selectionInitialPage);
483
- }, [selectionInitialPage]);
484
- React.useEffect(() => {
485
- var _a;
486
- if ((_a = selected.selectedRef) === null || _a === undefined ? undefined : _a.current) {
487
- selected.selectedRef.current.scrollIntoView();
488
- }
489
- }, [selected.selectedRef]);
490
- const renderSetting = ({ title: settingTitle, element }) => {
491
- return (React.createElement("div", { key: settingTitle, className: b('section-item') }, React.cloneElement(element, Object.assign(Object.assign({}, element.props), { highlightedTitle: search && settingTitle ? prepareTitle(settingTitle, search) : settingTitle }))));
492
- };
493
- const renderSection = (page, section) => {
494
- const isSelected = isSectionSelected(selected, page, section);
495
- return (React.createElement("div", { key: section.title, className: b('section', { selected: isSelected }), ref: isSelected ? selected.selectedRef : undefined },
496
- section.title && (React.createElement("h3", { className: b('section-heading') }, renderSectionRightAdornment ? (React.createElement(uikit.Flex, { gap: 2, alignItems: 'center' },
497
- section.title,
498
- React.createElement("div", { className: b('section-right-adornment', {
499
- hidden: showRightAdornmentOnHover,
500
- }) }, renderSectionRightAdornment(section)))) : (section.title))),
501
- section.header &&
502
- (isMobile ? (React.createElement("div", { className: b('section-subheader') }, section.header)) : (section.header)),
503
- section.items.map((setting) => (setting.hidden ? null : renderSetting(setting)))));
504
- };
505
- const renderPageContent = (page) => {
506
- if (!page) {
507
- return typeof renderNotFound === 'function' ? (renderNotFound()) : (React.createElement("div", { className: b('not-found') }, emptyPlaceholder));
508
- }
509
- const filteredSections = pages[page].sections.filter((section) => !section.hidden);
510
- return (React.createElement(React.Fragment, null,
511
- !isMobile && (React.createElement(Title.Title, { hasSeparator: true, onClose: onClose }, getPageTitleById(menu, page))),
512
- React.createElement("div", { className: b('content') }, filteredSections.map((section) => renderSection(page, section)))));
513
- };
514
- return (React.createElement(SettingsSelectionContextProvider, { value: selected },
515
- React.createElement("div", { className: b({ view }) },
516
- isMobile ? (React.createElement(React.Fragment, null,
517
- React.createElement(SettingsSearch, { inputRef: searchInputRef, className: b('search'), initialValue: initialSearch, onChange: setSearch, autoFocus: false, inputSize: 'xl' }),
518
- React.createElement(SettingsMenuMobile, { items: menu, onChange: handlePageChange, activeItemId: activePage, className: b('tabs') }))) : (React.createElement("div", { className: b('menu'), onClick: () => {
519
- if (searchInputRef.current) {
520
- searchInputRef.current.focus();
521
- }
522
- }, onKeyDown: (event) => {
523
- if (menuRef.current) {
524
- if (menuRef.current.handleKeyDown(event)) {
525
- event.preventDefault();
526
- }
527
- }
528
- } },
529
- React.createElement(Title.Title, null, title),
530
- React.createElement(SettingsSearch, { inputRef: searchInputRef, className: b('search'), initialValue: initialSearch, onChange: setSearch, placeholder: filterPlaceholder, autoFocus: true }),
531
- React.createElement(SettingsMenu, { ref: menuRef, items: menu, onChange: handlePageChange, activeItemId: activePage }))),
532
- React.createElement("div", { className: b('page') }, renderPageContent(activePage)))));
533
- }
534
- Settings.Group = function SettingsGroup({ children }) {
535
- return React.createElement(React.Fragment, null, children);
536
- };
537
- Settings.Page = function SettingsPage({ children }) {
538
- return React.createElement(React.Fragment, null, children);
539
- };
540
- Settings.Section = function SettingsSection({ children }) {
541
- return React.createElement(React.Fragment, null, children);
542
- };
543
- Settings.Item = function SettingsItem(setting) {
544
- const { id, labelId, highlightedTitle, children, align = 'center', withBadge, renderTitleComponent = identity, mode, description, } = setting;
545
- const selected = useSettingsSelectionContext();
546
- const isSettingSelected = selected.setting && selected.setting.id === id;
547
- const { renderRightAdornment, showRightAdornmentOnHover } = useSettingsContext();
548
- const titleNode = (React.createElement("span", { className: b('item-title', { badge: withBadge }) }, renderTitleComponent(highlightedTitle)));
549
- return (React.createElement("div", { className: b('item', { align, mode, selected: isSettingSelected }), ref: isSettingSelected ? selected.selectedRef : undefined },
550
- React.createElement("label", { className: b('item-heading'), id: labelId },
551
- renderRightAdornment ? (React.createElement(uikit.Flex, { className: b('item-title-wrapper'), gap: 3 },
552
- titleNode,
553
- React.createElement("div", { className: b('item-right-adornment', {
554
- hidden: showRightAdornmentOnHover,
555
- }) }, renderRightAdornment(setting)))) : (titleNode),
556
- description ? React.createElement("span", { className: b('item-description') }, description) : null),
557
- React.createElement("div", { className: b('item-content') }, children)));
558
- };
559
- function prepareTitle(string, search) {
560
- let temp = string.slice(0);
561
- const title = [];
562
- const parts = escapeStringForRegExp(search).split(' ').filter(Boolean);
563
- let key = 0;
564
- for (const part of parts) {
565
- const regex = new RegExp(part, 'ig');
566
- const match = regex.exec(temp);
567
- if (match) {
568
- const m = match[0];
569
- const i = match.index;
570
- if (i > 0) {
571
- title.push(temp.slice(0, i));
572
- }
573
- title.push(React.createElement("strong", { key: key++, className: b('found') }, m));
574
- temp = temp.slice(i + m.length);
575
- }
576
- }
577
- if (temp) {
578
- title.push(temp);
579
- }
580
- return title;
581
- }
582
-
583
- exports.Settings = Settings;
584
- exports.useSettingsContext = useSettingsContext;
585
- exports.useSettingsSelectionContext = useSettingsSelectionContext;
586
- //# sourceMappingURL=Settings-x0a3P0Vr.js.map