@gravity-ui/navigation 1.1.2 → 1.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.
- package/README.md +27 -0
- package/build/cjs/ActionBar-393db3ea.js +62 -0
- package/build/cjs/ActionBar-393db3ea.js.map +1 -0
- package/build/cjs/AsideHeader.js +50 -0
- package/build/cjs/AsideHeader.js.map +1 -0
- package/build/cjs/AsideHeaderContext.js +41 -0
- package/build/cjs/AsideHeaderContext.js.map +1 -0
- package/build/cjs/Content-64d5738a.js +20 -0
- package/build/cjs/Content-64d5738a.js.map +1 -0
- package/build/cjs/Drawer.js +3091 -0
- package/build/cjs/Drawer.js.map +1 -0
- package/build/cjs/FooterItem-01b32eb7.js +286 -0
- package/build/cjs/FooterItem-01b32eb7.js.map +1 -0
- package/build/cjs/FooterItem.js +30 -0
- package/build/cjs/FooterItem.js.map +1 -0
- package/build/cjs/HotkeysPanel-9e5af200.js +66 -0
- package/build/cjs/HotkeysPanel-9e5af200.js.map +1 -0
- package/build/cjs/Item-ff00938b.js +294 -0
- package/build/cjs/Item-ff00938b.js.map +1 -0
- package/build/cjs/PageLayout.js +36 -0
- package/build/cjs/PageLayout.js.map +1 -0
- package/build/cjs/PageLayoutAside.js +967 -0
- package/build/cjs/PageLayoutAside.js.map +1 -0
- package/build/cjs/Settings-014971f7.js +489 -0
- package/build/cjs/Settings-014971f7.js.map +1 -0
- package/build/cjs/Title-d58ff158.js +41 -0
- package/build/cjs/Title-d58ff158.js.map +1 -0
- package/build/cjs/components/AsideHeader/AsideHeader.d.ts +15 -1
- package/build/cjs/components/AsideHeader/AsideHeaderContext.d.ts +1 -2
- package/build/cjs/components/AsideHeader/__stories__/AsideHeader.stories.d.ts +1 -0
- package/build/cjs/components/AsideHeader/components/PageLayout/PageLayout.d.ts +11 -0
- package/build/cjs/components/AsideHeader/components/PageLayout/PageLayoutAside.d.ts +5 -0
- package/build/cjs/components/AsideHeader/types.d.ts +8 -3
- package/build/cjs/components/CompositeBar/utils.d.ts +1 -1
- package/build/cjs/components/Content/Content.d.ts +1 -2
- package/build/cjs/components/index.d.ts +2 -0
- package/build/cjs/constants-9783dc2d.js +10 -0
- package/build/cjs/constants-9783dc2d.js.map +1 -0
- package/build/cjs/debounce-8772fd80.js +545 -0
- package/build/cjs/debounce-8772fd80.js.map +1 -0
- package/build/cjs/index.js +47 -6036
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/index2.js +13 -0
- package/build/cjs/index2.js.map +1 -0
- package/build/cjs/index3.js +16 -0
- package/build/cjs/index3.js.map +1 -0
- package/build/cjs/index4.js +17 -0
- package/build/cjs/index4.js.map +1 -0
- package/build/cjs/index5.js +20 -0
- package/build/cjs/index5.js.map +1 -0
- package/build/cjs/index6.js +19 -0
- package/build/cjs/index6.js.map +1 -0
- package/build/cjs/registerKeyset-f4ce9ee7.js +215 -0
- package/build/cjs/registerKeyset-f4ce9ee7.js.map +1 -0
- package/build/cjs/style-inject.es-935afc04.js +38 -0
- package/build/cjs/style-inject.es-935afc04.js.map +1 -0
- package/build/cjs/tslib.es6-705c6589.js +36 -0
- package/build/cjs/tslib.es6-705c6589.js.map +1 -0
- package/build/cjs/utils-e82025ce.js +8 -0
- package/build/cjs/utils-e82025ce.js.map +1 -0
- package/build/esm/ActionBar-f1c9a2d3.js +56 -0
- package/build/esm/ActionBar-f1c9a2d3.js.map +1 -0
- package/build/esm/AsideHeader.js +42 -0
- package/build/esm/AsideHeader.js.map +1 -0
- package/build/esm/AsideHeaderContext.js +28 -0
- package/build/esm/AsideHeaderContext.js.map +1 -0
- package/build/esm/Content-f94ba85d.js +14 -0
- package/build/esm/Content-f94ba85d.js.map +1 -0
- package/build/esm/Drawer.js +3081 -0
- package/build/esm/Drawer.js.map +1 -0
- package/build/esm/FooterItem-d66ab545.js +279 -0
- package/build/esm/FooterItem-d66ab545.js.map +1 -0
- package/build/esm/FooterItem.js +22 -0
- package/build/esm/FooterItem.js.map +1 -0
- package/build/esm/HotkeysPanel-67f3066d.js +60 -0
- package/build/esm/HotkeysPanel-67f3066d.js.map +1 -0
- package/build/esm/Item-30c88899.js +280 -0
- package/build/esm/Item-30c88899.js.map +1 -0
- package/build/esm/PageLayout.js +28 -0
- package/build/esm/PageLayout.js.map +1 -0
- package/build/esm/PageLayoutAside.js +941 -0
- package/build/esm/PageLayoutAside.js.map +1 -0
- package/build/esm/Settings-ea96388d.js +464 -0
- package/build/esm/Settings-ea96388d.js.map +1 -0
- package/build/esm/Title-3d579ca4.js +35 -0
- package/build/esm/Title-3d579ca4.js.map +1 -0
- package/build/esm/components/AsideHeader/AsideHeader.d.ts +15 -1
- package/build/esm/components/AsideHeader/AsideHeaderContext.d.ts +1 -2
- package/build/esm/components/AsideHeader/__stories__/AsideHeader.stories.d.ts +1 -0
- package/build/esm/components/AsideHeader/components/PageLayout/PageLayout.d.ts +11 -0
- package/build/esm/components/AsideHeader/components/PageLayout/PageLayoutAside.d.ts +5 -0
- package/build/esm/components/AsideHeader/types.d.ts +8 -3
- package/build/esm/components/CompositeBar/utils.d.ts +1 -1
- package/build/esm/components/Content/Content.d.ts +1 -2
- package/build/esm/components/index.d.ts +2 -0
- package/build/esm/constants-b3a73cd1.js +6 -0
- package/build/esm/constants-b3a73cd1.js.map +1 -0
- package/build/esm/debounce-64cd2b4c.js +543 -0
- package/build/esm/debounce-64cd2b4c.js.map +1 -0
- package/build/esm/index.js +24 -6000
- package/build/esm/index.js.map +1 -1
- package/build/esm/index2.js +5 -0
- package/build/esm/index2.js.map +1 -0
- package/build/esm/index3.js +8 -0
- package/build/esm/index3.js.map +1 -0
- package/build/esm/index4.js +9 -0
- package/build/esm/index4.js.map +1 -0
- package/build/esm/index5.js +11 -0
- package/build/esm/index5.js.map +1 -0
- package/build/esm/index6.js +10 -0
- package/build/esm/index6.js.map +1 -0
- package/build/esm/registerKeyset-35f1ea08.js +212 -0
- package/build/esm/registerKeyset-35f1ea08.js.map +1 -0
- package/build/esm/style-inject.es-cfd97593.js +35 -0
- package/build/esm/style-inject.es-cfd97593.js.map +1 -0
- package/build/esm/tslib.es6-3cd4e99f.js +34 -0
- package/build/esm/tslib.es6-3cd4e99f.js.map +1 -0
- package/build/esm/utils-cc9b1968.js +6 -0
- package/build/esm/utils-cc9b1968.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import { _ as __rest } from './tslib.es6-3cd4e99f.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import React__default from 'react';
|
|
4
|
+
import { b as block, s as styleInject } from './style-inject.es-cfd97593.js';
|
|
5
|
+
import { TextInput, Icon, Tabs, Loader, Flex } from '@gravity-ui/uikit';
|
|
6
|
+
import { d as debounce_1 } from './debounce-64cd2b4c.js';
|
|
7
|
+
import { r as registerKeyset } from './registerKeyset-35f1ea08.js';
|
|
8
|
+
import { T as Title } from './Title-3d579ca4.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* This method returns the first argument it receives.
|
|
12
|
+
*
|
|
13
|
+
* @static
|
|
14
|
+
* @since 0.1.0
|
|
15
|
+
* @memberOf _
|
|
16
|
+
* @category Util
|
|
17
|
+
* @param {*} value Any value.
|
|
18
|
+
* @returns {*} Returns `value`.
|
|
19
|
+
* @example
|
|
20
|
+
*
|
|
21
|
+
* var object = { 'a': 1 };
|
|
22
|
+
*
|
|
23
|
+
* console.log(_.identity(object) === object);
|
|
24
|
+
* // => true
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
function identity(value) {
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
var identity_1 = identity;
|
|
32
|
+
|
|
33
|
+
function useStableCallback(func) {
|
|
34
|
+
const funcRef = React.useRef();
|
|
35
|
+
React.useEffect(() => {
|
|
36
|
+
funcRef.current = func;
|
|
37
|
+
return () => {
|
|
38
|
+
funcRef.current = undefined;
|
|
39
|
+
};
|
|
40
|
+
}, [func]);
|
|
41
|
+
return React.useCallback((...args) => {
|
|
42
|
+
if (typeof funcRef.current === 'function') {
|
|
43
|
+
return funcRef.current(...args);
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}, []);
|
|
47
|
+
}
|
|
48
|
+
function useCurrent(value) {
|
|
49
|
+
const ref = React.useRef(value);
|
|
50
|
+
ref.current = value;
|
|
51
|
+
return React.useCallback(() => ref.current, []);
|
|
52
|
+
}
|
|
53
|
+
function invariant(cond, message) {
|
|
54
|
+
if (!cond) {
|
|
55
|
+
throw new Error(message);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function escapeStringForRegExp(input) {
|
|
59
|
+
return input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const b$3 = block('settings-search');
|
|
63
|
+
function SettingsSearch({ className, initialValue, onChange, debounce = 200, inputRef, inputSize, placeholder, autoFocus = true, }) {
|
|
64
|
+
const [value, setValue] = React__default.useState(initialValue !== null && initialValue !== void 0 ? initialValue : '');
|
|
65
|
+
const onChangeDebounced = useStableCallback(debounce_1(onChange, debounce));
|
|
66
|
+
const handleUpdate = useStableCallback((updated) => {
|
|
67
|
+
setValue(updated);
|
|
68
|
+
onChangeDebounced(updated);
|
|
69
|
+
});
|
|
70
|
+
return (React__default.createElement("div", { className: b$3(null, className) },
|
|
71
|
+
React__default.createElement(TextInput, { value: value, controlRef: inputRef, hasClear: true, autoFocus: autoFocus, size: inputSize, placeholder: placeholder, onUpdate: handleUpdate })));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
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}";
|
|
75
|
+
styleInject(css_248z$2);
|
|
76
|
+
|
|
77
|
+
const b$2 = block('settings-menu');
|
|
78
|
+
const SettingsMenu = React__default.forwardRef(
|
|
79
|
+
// eslint-disable-next-line prefer-arrow-callback
|
|
80
|
+
function SettingsMenu({ items, onChange, activeItemId }, ref) {
|
|
81
|
+
const [focusItemId, setFocusId] = React__default.useState();
|
|
82
|
+
const containerRef = React__default.useRef(null);
|
|
83
|
+
const handleChange = useStableCallback(onChange);
|
|
84
|
+
const getFocused = useCurrent(focusItemId);
|
|
85
|
+
React__default.useImperativeHandle(ref, () => ({
|
|
86
|
+
handleKeyDown(event) {
|
|
87
|
+
if (!containerRef.current) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
const focused = getFocused();
|
|
91
|
+
if (focused && event.key === 'Enter') {
|
|
92
|
+
handleChange(focused);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
else if (event.key === 'ArrowDown') {
|
|
96
|
+
setFocusId(focusNext(containerRef.current, focused, 1));
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
else if (event.key === 'ArrowUp') {
|
|
100
|
+
setFocusId(focusNext(containerRef.current, focused, -1));
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
},
|
|
105
|
+
clearFocus() {
|
|
106
|
+
setFocusId(undefined);
|
|
107
|
+
},
|
|
108
|
+
}), [getFocused, handleChange]);
|
|
109
|
+
return (React__default.createElement("div", { ref: containerRef, className: b$2() }, items.map((firstLevelItem) => {
|
|
110
|
+
if ('groupTitle' in firstLevelItem) {
|
|
111
|
+
return (React__default.createElement("div", { key: firstLevelItem.groupTitle, className: b$2('group') },
|
|
112
|
+
React__default.createElement("span", { className: b$2('group-heading') }, firstLevelItem.groupTitle),
|
|
113
|
+
firstLevelItem.items.map((item) => {
|
|
114
|
+
return renderMenuItem(item, onChange, activeItemId, focusItemId);
|
|
115
|
+
})));
|
|
116
|
+
}
|
|
117
|
+
return renderMenuItem(firstLevelItem, onChange, activeItemId, focusItemId);
|
|
118
|
+
})));
|
|
119
|
+
});
|
|
120
|
+
function renderMenuItem(item, onChange, activeItemId, focusItemId) {
|
|
121
|
+
return (React__default.createElement("span", { key: item.title, className: b$2('item', {
|
|
122
|
+
selected: activeItemId === item.id,
|
|
123
|
+
disabled: item.disabled,
|
|
124
|
+
focused: focusItemId === item.id,
|
|
125
|
+
badge: item.withBadge,
|
|
126
|
+
}), onClick: () => {
|
|
127
|
+
if (!item.disabled) {
|
|
128
|
+
onChange(item.id);
|
|
129
|
+
}
|
|
130
|
+
}, "data-id": item.id },
|
|
131
|
+
item.icon ? React__default.createElement(Icon, Object.assign({ size: 16 }, item.icon, { className: b$2('item-icon') })) : undefined,
|
|
132
|
+
React__default.createElement("span", null, item.title)));
|
|
133
|
+
}
|
|
134
|
+
function focusNext(container, focused, direction) {
|
|
135
|
+
var _a;
|
|
136
|
+
const elements = container.querySelectorAll(`.${b$2('item')}:not(.${b$2('item')}_disabled)`);
|
|
137
|
+
if (elements.length === 0) {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
let currentIndex = direction > 0 ? -1 : 0;
|
|
141
|
+
if (focused) {
|
|
142
|
+
currentIndex = Array.prototype.findIndex.call(elements, (element) => element.getAttribute('data-id') === focused);
|
|
143
|
+
}
|
|
144
|
+
currentIndex = (elements.length + currentIndex + direction) % elements.length;
|
|
145
|
+
return (_a = elements[currentIndex].getAttribute('data-id')) !== null && _a !== void 0 ? _a : undefined;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
var css_248z$1 = ".gn-settings-menu-mobile.yc-tabs_direction_horizontal{-ms-overflow-style:none;flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:none;scrollbar-width:none}.gn-settings-menu-mobile.yc-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}";
|
|
149
|
+
styleInject(css_248z$1);
|
|
150
|
+
|
|
151
|
+
const b$1 = block('settings-menu-mobile');
|
|
152
|
+
const SettingsMenuMobile = ({ items, onChange, activeItemId, className, }) => {
|
|
153
|
+
const ref = React__default.useRef(null);
|
|
154
|
+
const tabItems = React__default.useMemo(() => {
|
|
155
|
+
const tabItems = [];
|
|
156
|
+
items.forEach((firstLevelItem) => {
|
|
157
|
+
if ('groupTitle' in firstLevelItem) {
|
|
158
|
+
tabItems.push(...firstLevelItem.items.map(({ id, title, disabled, withBadge }) => ({
|
|
159
|
+
id,
|
|
160
|
+
title,
|
|
161
|
+
disabled,
|
|
162
|
+
className: b$1('item', { badge: withBadge }),
|
|
163
|
+
})));
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
const { id, title, disabled, withBadge } = firstLevelItem;
|
|
167
|
+
tabItems.push({ id, title, disabled, className: b$1('item', { badge: withBadge }) });
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
return tabItems;
|
|
171
|
+
}, [items]);
|
|
172
|
+
const handleTouchMove = (e) => {
|
|
173
|
+
e.stopPropagation();
|
|
174
|
+
};
|
|
175
|
+
return (React__default.createElement("div", { ref: ref, onTouchMove: handleTouchMove },
|
|
176
|
+
React__default.createElement(Tabs, { items: tabItems, className: b$1(null, className), size: "l", activeTab: activeItemId, onSelectTab: onChange })));
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
var label_title$1 = "Settings";
|
|
180
|
+
var en = {
|
|
181
|
+
label_title: label_title$1,
|
|
182
|
+
"label_filter-placeholder": "Search settings",
|
|
183
|
+
"label_empty-placeholder": "No results found"
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
var label_title = "Настройки";
|
|
187
|
+
var ru = {
|
|
188
|
+
label_title: label_title,
|
|
189
|
+
"label_filter-placeholder": "Найти настройки",
|
|
190
|
+
"label_empty-placeholder": "Ничего не найдено"
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
const COMPONENT = 'Settings';
|
|
194
|
+
var i18n = registerKeyset({ en, ru }, COMPONENT);
|
|
195
|
+
|
|
196
|
+
function getSettingsFromChildren(children, searchText = '') {
|
|
197
|
+
// 'abc def fg' -> abc.*?cde.*?fg
|
|
198
|
+
const preparedFilter = escapeStringForRegExp(searchText).replace(/\s+/g, '.*?');
|
|
199
|
+
const filterRe = new RegExp(preparedFilter, 'i');
|
|
200
|
+
return getSettingsFromChildrenRecursive(children, '', filterRe);
|
|
201
|
+
}
|
|
202
|
+
function getSettingsFromChildrenRecursive(children, basepath = '', filterRe) {
|
|
203
|
+
const menu = [];
|
|
204
|
+
const pages = {};
|
|
205
|
+
let hasGroup = false;
|
|
206
|
+
let hasItems = false;
|
|
207
|
+
React__default.Children.forEach(children, (element) => {
|
|
208
|
+
var _a, _b;
|
|
209
|
+
if (!React__default.isValidElement(element)) {
|
|
210
|
+
// Ignore non-elements.
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (element.type === React__default.Fragment) {
|
|
214
|
+
// Transparently support React.Fragment and its children.
|
|
215
|
+
const { menu: menuFragment, pages: pagesFragment } = getSettingsFromChildrenRecursive(element.props.children, basepath, filterRe);
|
|
216
|
+
menu.push(...menuFragment);
|
|
217
|
+
Object.assign(pages, pagesFragment);
|
|
218
|
+
}
|
|
219
|
+
else if (element.props.groupTitle) {
|
|
220
|
+
if (process.env.NODE_ENV === 'development') {
|
|
221
|
+
invariant(!hasItems, 'Setting menu must not mix groups and pages on one level');
|
|
222
|
+
}
|
|
223
|
+
const pageId = `${basepath}/${(_a = element.props.id) !== null && _a !== void 0 ? _a : element.props.groupTitle}`;
|
|
224
|
+
hasGroup = true;
|
|
225
|
+
const { menu: menuFragment, pages: pagesFragment } = getSettingsFromChildrenRecursive(element.props.children, pageId, filterRe);
|
|
226
|
+
if (process.env.NODE_ENV === 'development') {
|
|
227
|
+
const hasInnerGroup = menuFragment.some((item) => 'groupTitle' in item);
|
|
228
|
+
invariant(!hasInnerGroup, `Group ${element.props.groupTitle} should not include groups`);
|
|
229
|
+
}
|
|
230
|
+
menu.push({
|
|
231
|
+
groupTitle: element.props.groupTitle,
|
|
232
|
+
// @ts-ignore
|
|
233
|
+
items: menuFragment,
|
|
234
|
+
});
|
|
235
|
+
Object.assign(pages, pagesFragment);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
hasItems = true;
|
|
239
|
+
const pageId = `${basepath}/${(_b = element.props.id) !== null && _b !== void 0 ? _b : element.props.title}`;
|
|
240
|
+
if (process.env.NODE_ENV === 'development') {
|
|
241
|
+
invariant(Boolean(element.props.title), 'Component must include title prop');
|
|
242
|
+
invariant(!hasGroup, 'Setting menu must not mix groups and pages on one level');
|
|
243
|
+
invariant(!pages[pageId], `Setting menu page id must be uniq (${pageId})`);
|
|
244
|
+
}
|
|
245
|
+
pages[pageId] = getSettingsPageFromChildren(element.props.children, filterRe);
|
|
246
|
+
pages[pageId].id = pageId;
|
|
247
|
+
menu.push({
|
|
248
|
+
id: pageId,
|
|
249
|
+
title: element.props.title,
|
|
250
|
+
icon: element.props.icon,
|
|
251
|
+
withBadge: pages[pageId].withBadge,
|
|
252
|
+
disabled: pages[pageId].hidden,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
return { menu, pages };
|
|
257
|
+
}
|
|
258
|
+
function getSettingsPageFromChildren(children, filterRe) {
|
|
259
|
+
const page = { id: '', sections: [], hidden: true };
|
|
260
|
+
React__default.Children.forEach(children, (element) => {
|
|
261
|
+
if (!React__default.isValidElement(element)) {
|
|
262
|
+
// Ignore non-elements.
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (element.type === React__default.Fragment) {
|
|
266
|
+
// Transparently support React.Fragment and its children.
|
|
267
|
+
const { sections, withBadge, hidden } = getSettingsPageFromChildren(element.props.children, filterRe);
|
|
268
|
+
page.sections.push(...sections);
|
|
269
|
+
page.withBadge = withBadge || page.withBadge;
|
|
270
|
+
page.hidden = hidden && page.hidden;
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
const { title, header, withBadge, showTitle = true } = element.props;
|
|
274
|
+
const { items, hidden } = getSettingsItemsFromChildren(element.props.children, filterRe);
|
|
275
|
+
page.withBadge = withBadge || page.withBadge;
|
|
276
|
+
page.hidden = hidden && page.hidden;
|
|
277
|
+
page.sections.push({
|
|
278
|
+
title,
|
|
279
|
+
header,
|
|
280
|
+
withBadge,
|
|
281
|
+
items,
|
|
282
|
+
hidden,
|
|
283
|
+
showTitle,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
return page;
|
|
288
|
+
}
|
|
289
|
+
function getSettingsItemsFromChildren(children, filterRe) {
|
|
290
|
+
let hidden = true;
|
|
291
|
+
const items = [];
|
|
292
|
+
React__default.Children.forEach(children, (element) => {
|
|
293
|
+
if (!React__default.isValidElement(element)) {
|
|
294
|
+
// Ignore non-elements.
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (element.type === React__default.Fragment) {
|
|
298
|
+
// Transparently support React.Fragment and its children.
|
|
299
|
+
const fragmentItems = getSettingsItemsFromChildren(element.props.children, filterRe);
|
|
300
|
+
items.push(...fragmentItems.items);
|
|
301
|
+
hidden = hidden && fragmentItems.hidden;
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
const item = {
|
|
305
|
+
title: element.props.title,
|
|
306
|
+
renderTitleComponent: element.props.renderTitleComponent,
|
|
307
|
+
element,
|
|
308
|
+
hidden: !filterRe.test(element.props.title),
|
|
309
|
+
};
|
|
310
|
+
items.push(item);
|
|
311
|
+
hidden = hidden && item.hidden;
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
return { items, hidden };
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
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 .yc-tabs__item:first-child{margin-left:20px}.gn-settings_view_mobile .gn-settings__tabs .yc-tabs__item:last-child{margin-right:20px}.gn-settings_view_mobile .gn-settings__section-heading{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-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-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-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{align-self:center;justify-self:center}.gn-settings__not-found{align-items:center;display:grid;height:100%;justify-items:center}.gn-settings__menu{border-right:1px solid var(--g-color-line-generic)}.gn-settings__heading{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-heading{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__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-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__found{background:var(--g-color-base-selection);font-weight:var(--g-text-accent-font-weight)}";
|
|
318
|
+
styleInject(css_248z);
|
|
319
|
+
|
|
320
|
+
const b = block('settings');
|
|
321
|
+
const SettingsContext = React__default.createContext({});
|
|
322
|
+
const useSettingsContext = () => React__default.useContext(SettingsContext);
|
|
323
|
+
function Settings(_a) {
|
|
324
|
+
var { loading, renderLoading, children, view = 'normal', renderRightAdornment, showRightAdornmentOnHover = true } = _a, props = __rest(_a, ["loading", "renderLoading", "children", "view", "renderRightAdornment", "showRightAdornmentOnHover"]);
|
|
325
|
+
if (loading) {
|
|
326
|
+
return (React__default.createElement("div", { className: b({ loading: true, view }) }, typeof renderLoading === 'function' ? (renderLoading()) : (React__default.createElement(Loader, { className: b('loader'), size: "m" }))));
|
|
327
|
+
}
|
|
328
|
+
return (React__default.createElement(SettingsContext.Provider, { value: { renderRightAdornment, showRightAdornmentOnHover } },
|
|
329
|
+
React__default.createElement(SettingsContent, Object.assign({ view: view }, props), children)));
|
|
330
|
+
}
|
|
331
|
+
const getPageTitleById = (menu, activePage) => {
|
|
332
|
+
for (const firstLevel of menu) {
|
|
333
|
+
if ('groupTitle' in firstLevel) {
|
|
334
|
+
for (const secondLevel of firstLevel.items)
|
|
335
|
+
if (secondLevel.id === activePage)
|
|
336
|
+
return secondLevel.title;
|
|
337
|
+
}
|
|
338
|
+
else if (firstLevel.id === activePage)
|
|
339
|
+
return firstLevel.title;
|
|
340
|
+
}
|
|
341
|
+
return '';
|
|
342
|
+
};
|
|
343
|
+
function SettingsContent({ initialPage, initialSearch, children, renderNotFound, title = i18n('label_title'), filterPlaceholder = i18n('label_filter-placeholder'), emptyPlaceholder = i18n('label_empty-placeholder'), view, onPageChange, onClose, }) {
|
|
344
|
+
var _a, _b;
|
|
345
|
+
const [search, setSearch] = React__default.useState(initialSearch !== null && initialSearch !== void 0 ? initialSearch : '');
|
|
346
|
+
const { menu, pages } = getSettingsFromChildren(children, search);
|
|
347
|
+
const pageKeys = Object.keys(pages);
|
|
348
|
+
const [selectedPage, setCurrentPage] = React__default.useState(initialPage && pageKeys.includes(initialPage) ? initialPage : undefined);
|
|
349
|
+
const searchInputRef = React__default.useRef(null);
|
|
350
|
+
const menuRef = React__default.useRef(null);
|
|
351
|
+
const isMobile = view === 'mobile';
|
|
352
|
+
React__default.useEffect(() => {
|
|
353
|
+
var _a;
|
|
354
|
+
(_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.clearFocus();
|
|
355
|
+
}, [search]);
|
|
356
|
+
React__default.useEffect(() => {
|
|
357
|
+
const handler = () => {
|
|
358
|
+
var _a;
|
|
359
|
+
(_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.clearFocus();
|
|
360
|
+
};
|
|
361
|
+
window.addEventListener('click', handler);
|
|
362
|
+
return () => {
|
|
363
|
+
window.removeEventListener('click', handler);
|
|
364
|
+
};
|
|
365
|
+
}, []);
|
|
366
|
+
let activePage = selectedPage;
|
|
367
|
+
if (!activePage || ((_a = pages[activePage]) === null || _a === void 0 ? void 0 : _a.hidden)) {
|
|
368
|
+
activePage = (_b = Object.values(pages).find(({ hidden }) => !hidden)) === null || _b === void 0 ? void 0 : _b.id;
|
|
369
|
+
}
|
|
370
|
+
const handlePageChange = (newPage) => {
|
|
371
|
+
setCurrentPage((prevPage) => {
|
|
372
|
+
if (prevPage !== newPage) {
|
|
373
|
+
onPageChange === null || onPageChange === void 0 ? void 0 : onPageChange(newPage);
|
|
374
|
+
}
|
|
375
|
+
return newPage;
|
|
376
|
+
});
|
|
377
|
+
};
|
|
378
|
+
React__default.useEffect(() => {
|
|
379
|
+
if (activePage !== selectedPage) {
|
|
380
|
+
handlePageChange(activePage);
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
const renderPageContent = () => {
|
|
384
|
+
if (!activePage) {
|
|
385
|
+
return typeof renderNotFound === 'function' ? (renderNotFound()) : (React__default.createElement("div", { className: b('not-found') }, emptyPlaceholder));
|
|
386
|
+
}
|
|
387
|
+
const filteredSections = pages[activePage].sections.filter((section) => !section.hidden);
|
|
388
|
+
return (React__default.createElement(React__default.Fragment, null,
|
|
389
|
+
!isMobile && (React__default.createElement(Title, { hasSeparator: true, onClose: onClose }, getPageTitleById(menu, activePage))),
|
|
390
|
+
React__default.createElement("div", { className: b('content') }, filteredSections.map((section) => (React__default.createElement("div", { key: section.title, className: b('section') },
|
|
391
|
+
section.showTitle && (React__default.createElement("h3", { className: b('section-heading') }, section.title)),
|
|
392
|
+
section.header &&
|
|
393
|
+
(isMobile ? (React__default.createElement("div", { className: b('section-subheader') }, section.header)) : (section.header)),
|
|
394
|
+
section.items.map(({ hidden, title, element }) => hidden ? null : (React__default.createElement("div", { key: title, className: b('section-item') }, React__default.cloneElement(element, Object.assign(Object.assign({}, element.props), { highlightedTitle: search && title
|
|
395
|
+
? prepareTitle(title, search)
|
|
396
|
+
: title })))))))))));
|
|
397
|
+
};
|
|
398
|
+
return (React__default.createElement("div", { className: b({ view }) },
|
|
399
|
+
isMobile ? (React__default.createElement(React__default.Fragment, null,
|
|
400
|
+
React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b('search'), initialValue: initialSearch, onChange: setSearch, autoFocus: false, inputSize: 'xl' }),
|
|
401
|
+
React__default.createElement(SettingsMenuMobile, { items: menu, onChange: handlePageChange, activeItemId: activePage, className: b('tabs') }))) : (React__default.createElement("div", { className: b('menu'), onClick: () => {
|
|
402
|
+
if (searchInputRef.current) {
|
|
403
|
+
searchInputRef.current.focus();
|
|
404
|
+
}
|
|
405
|
+
}, onKeyDown: (event) => {
|
|
406
|
+
if (menuRef.current) {
|
|
407
|
+
if (menuRef.current.handleKeyDown(event)) {
|
|
408
|
+
event.preventDefault();
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
} },
|
|
412
|
+
React__default.createElement(Title, null, title),
|
|
413
|
+
React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b('search'), initialValue: initialSearch, onChange: setSearch, placeholder: filterPlaceholder, autoFocus: true }),
|
|
414
|
+
React__default.createElement(SettingsMenu, { ref: menuRef, items: menu, onChange: handlePageChange, activeItemId: activePage }))),
|
|
415
|
+
React__default.createElement("div", { className: b('page') }, renderPageContent())));
|
|
416
|
+
}
|
|
417
|
+
Settings.Group = function SettingsGroup({ children }) {
|
|
418
|
+
return React__default.createElement(React__default.Fragment, null, children);
|
|
419
|
+
};
|
|
420
|
+
Settings.Page = function SettingsPage({ children }) {
|
|
421
|
+
return React__default.createElement(React__default.Fragment, null, children);
|
|
422
|
+
};
|
|
423
|
+
Settings.Section = function SettingsSection({ children }) {
|
|
424
|
+
return React__default.createElement(React__default.Fragment, null, children);
|
|
425
|
+
};
|
|
426
|
+
Settings.Item = function SettingsItem({ title, highlightedTitle, children, align = 'center', withBadge, renderTitleComponent = identity_1, mode, description, }) {
|
|
427
|
+
const { renderRightAdornment, showRightAdornmentOnHover } = useSettingsContext();
|
|
428
|
+
const titleNode = (React__default.createElement("span", { className: b('item-title', { badge: withBadge }) }, renderTitleComponent(highlightedTitle)));
|
|
429
|
+
return (React__default.createElement("div", { className: b('item', { align, mode }) },
|
|
430
|
+
React__default.createElement("label", { className: b('item-heading') },
|
|
431
|
+
renderRightAdornment ? (React__default.createElement(Flex, { className: b('item-title-wrapper'), gap: 3 },
|
|
432
|
+
titleNode,
|
|
433
|
+
React__default.createElement("div", { className: b('item-right-adornment', {
|
|
434
|
+
hidden: showRightAdornmentOnHover,
|
|
435
|
+
}) }, renderRightAdornment({ title })))) : (titleNode),
|
|
436
|
+
description ? React__default.createElement("span", { className: b('item-description') }, description) : null),
|
|
437
|
+
React__default.createElement("div", { className: b('item-content') }, children)));
|
|
438
|
+
};
|
|
439
|
+
function prepareTitle(string, search) {
|
|
440
|
+
let temp = string.slice(0);
|
|
441
|
+
const title = [];
|
|
442
|
+
const parts = escapeStringForRegExp(search).split(' ').filter(Boolean);
|
|
443
|
+
let key = 0;
|
|
444
|
+
for (const part of parts) {
|
|
445
|
+
const regex = new RegExp(part, 'ig');
|
|
446
|
+
const match = regex.exec(temp);
|
|
447
|
+
if (match) {
|
|
448
|
+
const m = match[0];
|
|
449
|
+
const i = match.index;
|
|
450
|
+
if (i > 0) {
|
|
451
|
+
title.push(temp.slice(0, i));
|
|
452
|
+
}
|
|
453
|
+
title.push(React__default.createElement("strong", { key: key++, className: b('found') }, m));
|
|
454
|
+
temp = temp.slice(i + m.length);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
if (temp) {
|
|
458
|
+
title.push(temp);
|
|
459
|
+
}
|
|
460
|
+
return title;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
export { Settings as S, useSettingsContext as u };
|
|
464
|
+
//# sourceMappingURL=Settings-ea96388d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Settings-ea96388d.js","sources":["../../node_modules/lodash/identity.js","../../../src/components/Settings/helpers.ts","../../../src/components/Settings/SettingsSearch/SettingsSearch.tsx","../../../src/components/Settings/SettingsMenu/SettingsMenu.tsx","../../../src/components/Settings/SettingsMenuMobile/SettingsMenuMobile.tsx","../../../src/components/Settings/i18n/index.ts","../../../src/components/Settings/collect-settings.ts","../../../src/components/Settings/Settings.tsx"],"sourcesContent":["/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","import * as React from 'react';\n\ntype AnyFunc = (...args: any[]) => any;\n\nexport function useStableCallback<T extends AnyFunc>(\n func: T,\n): (...args: Parameters<T>) => ReturnType<T> | undefined {\n const funcRef = React.useRef<T>();\n\n React.useEffect(() => {\n funcRef.current = func;\n return () => {\n funcRef.current = undefined;\n };\n }, [func]);\n\n return React.useCallback((...args: Parameters<T>) => {\n if (typeof funcRef.current === 'function') {\n return funcRef.current(...args);\n }\n return undefined;\n }, []);\n}\n\nexport function useCurrent<T>(value: T) {\n const ref = React.useRef(value);\n ref.current = value;\n return React.useCallback(() => ref.current, []);\n}\n\nexport function invariant(cond: boolean, message: string): void {\n if (!cond) {\n throw new Error(message);\n }\n}\n\nexport function escapeStringForRegExp(input: string) {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import React from 'react';\nimport debounceFn from 'lodash/debounce';\n\nimport {TextInput, TextInputSize} from '@gravity-ui/uikit';\n\nimport {block} from '../../utils/cn';\nimport {useStableCallback} from '../helpers';\n\nconst b = block('settings-search');\n\ninterface SettingsSearchProps {\n className?: string;\n initialValue?: string;\n onChange: (search: string) => void;\n debounce?: number;\n inputRef?: React.Ref<HTMLInputElement>;\n inputSize?: TextInputSize;\n placeholder?: string;\n autoFocus?: boolean;\n}\n\nexport function SettingsSearch({\n className,\n initialValue,\n onChange,\n debounce = 200,\n inputRef,\n inputSize,\n placeholder,\n autoFocus = true,\n}: SettingsSearchProps) {\n const [value, setValue] = React.useState(initialValue ?? '');\n\n const onChangeDebounced = useStableCallback(debounceFn(onChange, debounce));\n const handleUpdate = useStableCallback((updated: string) => {\n setValue(updated);\n onChangeDebounced(updated);\n });\n\n return (\n <div className={b(null, className)}>\n <TextInput\n value={value}\n controlRef={inputRef}\n hasClear\n autoFocus={autoFocus}\n size={inputSize}\n placeholder={placeholder}\n onUpdate={handleUpdate}\n />\n </div>\n );\n}\n","import React from 'react';\n\nimport {Icon} from '@gravity-ui/uikit';\n\nimport {block} from '../../utils/cn';\nimport {useCurrent, useStableCallback} from '../helpers';\nimport {Item, SettingsMenuProps} from '../types';\n\nimport './SettingsMenu.scss';\n\nconst b = block('settings-menu');\n\nexport interface SettingsMenuInstance {\n handleKeyDown(event: React.KeyboardEvent): boolean;\n clearFocus(): void;\n}\n\nexport const SettingsMenu = React.forwardRef<SettingsMenuInstance, SettingsMenuProps>(\n // eslint-disable-next-line prefer-arrow-callback\n function SettingsMenu({items, onChange, activeItemId}, ref) {\n const [focusItemId, setFocusId] = React.useState<string>();\n const containerRef = React.useRef<HTMLDivElement>(null);\n const handleChange = useStableCallback(onChange);\n const getFocused = useCurrent(focusItemId);\n\n React.useImperativeHandle(\n ref,\n () => ({\n handleKeyDown(event) {\n if (!containerRef.current) {\n return false;\n }\n const focused = getFocused();\n if (focused && event.key === 'Enter') {\n handleChange(focused);\n return true;\n } else if (event.key === 'ArrowDown') {\n setFocusId(focusNext(containerRef.current, focused, 1));\n return true;\n } else if (event.key === 'ArrowUp') {\n setFocusId(focusNext(containerRef.current, focused, -1));\n return true;\n }\n return false;\n },\n clearFocus() {\n setFocusId(undefined);\n },\n }),\n [getFocused, handleChange],\n );\n\n return (\n <div ref={containerRef} className={b()}>\n {items.map((firstLevelItem) => {\n if ('groupTitle' in firstLevelItem) {\n return (\n <div key={firstLevelItem.groupTitle} className={b('group')}>\n <span className={b('group-heading')}>\n {firstLevelItem.groupTitle}\n </span>\n {firstLevelItem.items.map((item) => {\n return renderMenuItem(\n item,\n onChange,\n activeItemId,\n focusItemId,\n );\n })}\n </div>\n );\n }\n return renderMenuItem(firstLevelItem, onChange, activeItemId, focusItemId);\n })}\n </div>\n );\n },\n);\n\nfunction renderMenuItem(\n item: Item,\n onChange: (id: string) => void,\n activeItemId: string | undefined,\n focusItemId: string | undefined,\n) {\n return (\n <span\n key={item.title}\n className={b('item', {\n selected: activeItemId === item.id,\n disabled: item.disabled,\n focused: focusItemId === item.id,\n badge: item.withBadge,\n })}\n onClick={() => {\n if (!item.disabled) {\n onChange(item.id);\n }\n }}\n data-id={item.id}\n >\n {item.icon ? <Icon size={16} {...item.icon} className={b('item-icon')} /> : undefined}\n <span>{item.title}</span>\n </span>\n );\n}\n\nfunction focusNext(container: HTMLElement, focused: string | undefined, direction: number) {\n const elements = container.querySelectorAll(`.${b('item')}:not(.${b('item')}_disabled)`);\n if (elements.length === 0) {\n return undefined;\n }\n\n let currentIndex = direction > 0 ? -1 : 0;\n if (focused) {\n currentIndex = Array.prototype.findIndex.call(\n elements,\n (element) => element.getAttribute('data-id') === focused,\n );\n }\n\n currentIndex = (elements.length + currentIndex + direction) % elements.length;\n return elements[currentIndex].getAttribute('data-id') ?? undefined;\n}\n","import React from 'react';\nimport {Tabs, TabsItemProps} from '@gravity-ui/uikit';\nimport {block} from '../../utils/cn';\nimport {SettingsMenuProps} from '../types';\n\nimport './SettingsMenuMobile.scss';\n\nconst b = block('settings-menu-mobile');\n\nexport const SettingsMenuMobile = ({\n items,\n onChange,\n activeItemId,\n className,\n}: SettingsMenuProps) => {\n const ref = React.useRef<HTMLDivElement>(null);\n\n const tabItems = React.useMemo(() => {\n const tabItems: TabsItemProps[] = [];\n\n items.forEach((firstLevelItem) => {\n if ('groupTitle' in firstLevelItem) {\n tabItems.push(\n ...firstLevelItem.items.map(({id, title, disabled, withBadge}) => ({\n id,\n title,\n disabled,\n className: b('item', {badge: withBadge}),\n })),\n );\n } else {\n const {id, title, disabled, withBadge} = firstLevelItem;\n tabItems.push({id, title, disabled, className: b('item', {badge: withBadge})});\n }\n });\n return tabItems;\n }, [items]);\n\n const handleTouchMove = (e: React.TouchEvent<HTMLDivElement>) => {\n e.stopPropagation();\n };\n\n return (\n <div ref={ref} onTouchMove={handleTouchMove}>\n <Tabs\n items={tabItems}\n className={b(null, className)}\n size=\"l\"\n activeTab={activeItemId}\n onSelectTab={onChange}\n />\n </div>\n );\n};\n","import {registerKeyset} from '../../utils/registerKeyset';\n\nimport en from './en.json';\nimport ru from './ru.json';\n\nconst COMPONENT = 'Settings';\nexport default registerKeyset({en, ru}, COMPONENT);\n","import React from 'react';\nimport {IconProps} from '@gravity-ui/uikit';\nimport {escapeStringForRegExp, invariant} from './helpers';\n\nexport type SettingsMenu = (SettingsMenuGroup | SettingsMenuItem)[];\n\ninterface SettingsMenuGroup {\n groupTitle: string;\n items: SettingsMenuItem[];\n}\n\ninterface SettingsMenuItem {\n id: string;\n title: string;\n icon?: IconProps;\n withBadge?: boolean;\n disabled?: boolean;\n}\n\nexport interface SettingsPage {\n id: string;\n sections: SettingsPageSection[];\n hidden?: boolean;\n withBadge?: boolean;\n}\n\ninterface SettingsPageSection {\n title: string;\n header?: React.ReactNode;\n items: SettingsItem[];\n hidden?: boolean;\n withBadge?: boolean;\n showTitle?: boolean;\n}\n\ninterface SettingsItem {\n title: string;\n element: React.ReactElement;\n hidden: boolean;\n titleComponent?: React.ReactNode;\n renderTitleComponent?: (highlightedTitle: React.ReactNode | null) => React.ReactNode;\n}\n\ninterface SettingsDescription {\n menu: SettingsMenu;\n pages: Record<string, SettingsPage>;\n}\nexport function getSettingsFromChildren(\n children: React.ReactNode,\n searchText = '',\n): SettingsDescription {\n // 'abc def fg' -> abc.*?cde.*?fg\n const preparedFilter = escapeStringForRegExp(searchText).replace(/\\s+/g, '.*?');\n const filterRe = new RegExp(preparedFilter, 'i');\n\n return getSettingsFromChildrenRecursive(children, '', filterRe);\n}\n\nfunction getSettingsFromChildrenRecursive(\n children: React.ReactNode,\n basepath = '',\n filterRe: RegExp,\n): SettingsDescription {\n const menu: SettingsMenu = [];\n const pages: Record<string, SettingsPage> = {};\n let hasGroup = false;\n let hasItems = false;\n React.Children.forEach(children, (element) => {\n if (!React.isValidElement(element)) {\n // Ignore non-elements.\n return;\n }\n if (element.type === React.Fragment) {\n // Transparently support React.Fragment and its children.\n const {menu: menuFragment, pages: pagesFragment} = getSettingsFromChildrenRecursive(\n element.props.children,\n basepath,\n filterRe,\n );\n menu.push(...menuFragment);\n Object.assign(pages, pagesFragment);\n } else if (element.props.groupTitle) {\n if (process.env.NODE_ENV === 'development') {\n invariant(!hasItems, 'Setting menu must not mix groups and pages on one level');\n }\n\n const pageId = `${basepath}/${element.props.id ?? element.props.groupTitle}`;\n hasGroup = true;\n\n const {menu: menuFragment, pages: pagesFragment} = getSettingsFromChildrenRecursive(\n element.props.children,\n pageId,\n filterRe,\n );\n\n if (process.env.NODE_ENV === 'development') {\n const hasInnerGroup = menuFragment.some((item) => 'groupTitle' in item);\n invariant(\n !hasInnerGroup,\n `Group ${element.props.groupTitle} should not include groups`,\n );\n }\n\n menu.push({\n groupTitle: element.props.groupTitle,\n // @ts-ignore\n items: menuFragment,\n });\n Object.assign(pages, pagesFragment);\n } else {\n hasItems = true;\n const pageId = `${basepath}/${element.props.id ?? element.props.title}`;\n\n if (process.env.NODE_ENV === 'development') {\n invariant(Boolean(element.props.title), 'Component must include title prop');\n invariant(!hasGroup, 'Setting menu must not mix groups and pages on one level');\n invariant(!pages[pageId], `Setting menu page id must be uniq (${pageId})`);\n }\n\n pages[pageId] = getSettingsPageFromChildren(element.props.children, filterRe);\n pages[pageId].id = pageId;\n menu.push({\n id: pageId,\n title: element.props.title,\n icon: element.props.icon,\n withBadge: pages[pageId].withBadge,\n disabled: pages[pageId].hidden,\n });\n }\n });\n return {menu, pages};\n}\n\nfunction getSettingsPageFromChildren(children: React.ReactNode, filterRe: RegExp): SettingsPage {\n const page: SettingsPage = {id: '', sections: [], hidden: true};\n React.Children.forEach(children, (element) => {\n if (!React.isValidElement(element)) {\n // Ignore non-elements.\n return;\n }\n if (element.type === React.Fragment) {\n // Transparently support React.Fragment and its children.\n const {sections, withBadge, hidden} = getSettingsPageFromChildren(\n element.props.children,\n filterRe,\n );\n page.sections.push(...sections);\n page.withBadge = withBadge || page.withBadge;\n page.hidden = hidden && page.hidden;\n } else {\n const {title, header, withBadge, showTitle = true} = element.props;\n const {items, hidden} = getSettingsItemsFromChildren(element.props.children, filterRe);\n page.withBadge = withBadge || page.withBadge;\n page.hidden = hidden && page.hidden;\n page.sections.push({\n title,\n header,\n withBadge,\n items,\n hidden,\n showTitle,\n });\n }\n });\n return page;\n}\n\nfunction getSettingsItemsFromChildren(children: React.ReactNode, filterRe: RegExp) {\n let hidden = true;\n const items: SettingsItem[] = [];\n React.Children.forEach(children, (element) => {\n if (!React.isValidElement(element)) {\n // Ignore non-elements.\n return;\n }\n if (element.type === React.Fragment) {\n // Transparently support React.Fragment and its children.\n const fragmentItems = getSettingsItemsFromChildren(element.props.children, filterRe);\n items.push(...fragmentItems.items);\n hidden = hidden && fragmentItems.hidden;\n } else {\n const item: SettingsItem = {\n title: element.props.title,\n renderTitleComponent: element.props.renderTitleComponent,\n element,\n hidden: !filterRe.test(element.props.title),\n };\n items.push(item);\n hidden = hidden && item.hidden;\n }\n });\n return {items, hidden};\n}\n","import React from 'react';\nimport {block} from '../utils/cn';\nimport identity from 'lodash/identity';\n\nimport {Flex, IconProps, Loader} from '@gravity-ui/uikit';\nimport {SettingsSearch} from './SettingsSearch/SettingsSearch';\nimport {SettingsMenu, SettingsMenuInstance} from './SettingsMenu/SettingsMenu';\nimport {SettingsMenuMobile} from './SettingsMenuMobile/SettingsMenuMobile';\nimport {Title} from '../Title';\nimport i18n from './i18n';\n\nimport type {SettingsMenu as SettingsMenuType} from './collect-settings';\nimport {getSettingsFromChildren} from './collect-settings';\nimport {escapeStringForRegExp} from './helpers';\n\nimport './Settings.scss';\n\nconst b = block('settings');\n\nexport interface SettingsProps {\n children: React.ReactNode;\n title?: string;\n filterPlaceholder?: string;\n emptyPlaceholder?: string;\n initialPage?: string;\n initialSearch?: string;\n onPageChange?: (page: string | undefined) => void;\n renderNotFound?: () => React.ReactNode;\n renderLoading?: () => React.ReactNode;\n loading?: boolean;\n view?: 'normal' | 'mobile';\n onClose?: () => void;\n renderRightAdornment?: (item: Pick<SettingsItemProps, 'title'>) => React.ReactNode;\n showRightAdornmentOnHover?: boolean;\n}\n\nexport interface SettingsGroupProps {\n id?: string;\n groupTitle: string;\n children: React.ReactNode;\n}\n\nexport interface SettingsPageProps {\n id?: string;\n title: string;\n icon?: IconProps;\n children: React.ReactNode;\n}\n\nexport interface SettingsSectionProps {\n title: string;\n header?: React.ReactNode;\n children: React.ReactNode;\n withBadge?: boolean;\n showTitle?: boolean;\n}\n\nexport interface SettingsItemProps {\n title: string;\n highlightedTitle?: React.ReactNode | null;\n renderTitleComponent?: (highlightedTitle: React.ReactNode | null) => React.ReactNode;\n align?: 'top' | 'center';\n children: React.ReactNode;\n withBadge?: boolean;\n mode?: 'row';\n description?: React.ReactNode;\n}\n\nexport interface SettingsContextType\n extends Pick<SettingsProps, 'renderRightAdornment' | 'showRightAdornmentOnHover'> {}\n\nconst SettingsContext = React.createContext<SettingsContextType>({});\n\nexport const useSettingsContext = () => React.useContext(SettingsContext);\n\nexport function Settings({\n loading,\n renderLoading,\n children,\n view = 'normal',\n renderRightAdornment,\n showRightAdornmentOnHover = true,\n ...props\n}: SettingsProps) {\n if (loading) {\n return (\n <div className={b({loading: true, view})}>\n {typeof renderLoading === 'function' ? (\n renderLoading()\n ) : (\n <Loader className={b('loader')} size=\"m\" />\n )}\n </div>\n );\n }\n\n return (\n <SettingsContext.Provider value={{renderRightAdornment, showRightAdornmentOnHover}}>\n <SettingsContent view={view} {...props}>\n {children}\n </SettingsContent>\n </SettingsContext.Provider>\n );\n}\n\nconst getPageTitleById = (menu: SettingsMenuType, activePage: string) => {\n for (const firstLevel of menu) {\n if ('groupTitle' in firstLevel) {\n for (const secondLevel of firstLevel.items)\n if (secondLevel.id === activePage) return secondLevel.title;\n } else if (firstLevel.id === activePage) return firstLevel.title;\n }\n\n return '';\n};\n\ntype SettingsContentProps = Omit<SettingsProps, 'loading' | 'renderLoading'>;\nfunction SettingsContent({\n initialPage,\n initialSearch,\n children,\n renderNotFound,\n title = i18n('label_title'),\n filterPlaceholder = i18n('label_filter-placeholder'),\n emptyPlaceholder = i18n('label_empty-placeholder'),\n view,\n onPageChange,\n onClose,\n}: SettingsContentProps) {\n const [search, setSearch] = React.useState(initialSearch ?? '');\n const {menu, pages} = getSettingsFromChildren(children, search);\n const pageKeys = Object.keys(pages);\n const [selectedPage, setCurrentPage] = React.useState<string | undefined>(\n initialPage && pageKeys.includes(initialPage) ? initialPage : undefined,\n );\n const searchInputRef = React.useRef<HTMLInputElement>(null);\n const menuRef = React.useRef<SettingsMenuInstance>(null);\n const isMobile = view === 'mobile';\n\n React.useEffect(() => {\n menuRef.current?.clearFocus();\n }, [search]);\n\n React.useEffect(() => {\n const handler = () => {\n menuRef.current?.clearFocus();\n };\n window.addEventListener('click', handler);\n return () => {\n window.removeEventListener('click', handler);\n };\n }, []);\n\n let activePage = selectedPage;\n if (!activePage || pages[activePage]?.hidden) {\n activePage = Object.values(pages).find(({hidden}) => !hidden)?.id;\n }\n\n const handlePageChange = (newPage: string | undefined) => {\n setCurrentPage((prevPage) => {\n if (prevPage !== newPage) {\n onPageChange?.(newPage);\n }\n return newPage;\n });\n };\n\n React.useEffect(() => {\n if (activePage !== selectedPage) {\n handlePageChange(activePage);\n }\n });\n\n const renderPageContent = () => {\n if (!activePage) {\n return typeof renderNotFound === 'function' ? (\n renderNotFound()\n ) : (\n <div className={b('not-found')}>{emptyPlaceholder}</div>\n );\n }\n\n const filteredSections = pages[activePage].sections.filter((section) => !section.hidden);\n\n return (\n <>\n {!isMobile && (\n <Title hasSeparator onClose={onClose}>\n {getPageTitleById(menu, activePage)}\n </Title>\n )}\n\n <div className={b('content')}>\n {filteredSections.map((section) => (\n <div key={section.title} className={b('section')}>\n {section.showTitle && (\n <h3 className={b('section-heading')}>{section.title}</h3>\n )}\n\n {section.header &&\n (isMobile ? (\n <div className={b('section-subheader')}>{section.header}</div>\n ) : (\n section.header\n ))}\n\n {section.items.map(({hidden, title, element}) =>\n hidden ? null : (\n <div key={title} className={b('section-item')}>\n {React.cloneElement(element, {\n ...element.props,\n highlightedTitle:\n search && title\n ? prepareTitle(title, search)\n : title,\n })}\n </div>\n ),\n )}\n </div>\n ))}\n </div>\n </>\n );\n };\n\n return (\n <div className={b({view})}>\n {isMobile ? (\n <>\n <SettingsSearch\n inputRef={searchInputRef}\n className={b('search')}\n initialValue={initialSearch}\n onChange={setSearch}\n autoFocus={false}\n inputSize={'xl'}\n />\n <SettingsMenuMobile\n items={menu}\n onChange={handlePageChange}\n activeItemId={activePage}\n className={b('tabs')}\n />\n </>\n ) : (\n <div\n className={b('menu')}\n onClick={() => {\n if (searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }}\n onKeyDown={(event) => {\n if (menuRef.current) {\n if (menuRef.current.handleKeyDown(event)) {\n event.preventDefault();\n }\n }\n }}\n >\n <Title>{title}</Title>\n <SettingsSearch\n inputRef={searchInputRef}\n className={b('search')}\n initialValue={initialSearch}\n onChange={setSearch}\n placeholder={filterPlaceholder}\n autoFocus\n />\n <SettingsMenu\n ref={menuRef}\n items={menu}\n onChange={handlePageChange}\n activeItemId={activePage}\n />\n </div>\n )}\n <div className={b('page')}>{renderPageContent()}</div>\n </div>\n );\n}\n\nSettings.Group = function SettingsGroup({children}: SettingsGroupProps) {\n return <React.Fragment>{children}</React.Fragment>;\n};\n\nSettings.Page = function SettingsPage({children}: SettingsPageProps) {\n return <React.Fragment>{children}</React.Fragment>;\n};\n\nSettings.Section = function SettingsSection({children}: SettingsSectionProps) {\n return <React.Fragment>{children}</React.Fragment>;\n};\n\nSettings.Item = function SettingsItem({\n title,\n highlightedTitle,\n children,\n align = 'center',\n withBadge,\n renderTitleComponent = identity,\n mode,\n description,\n}: SettingsItemProps) {\n const {renderRightAdornment, showRightAdornmentOnHover} = useSettingsContext();\n const titleNode = (\n <span className={b('item-title', {badge: withBadge})}>\n {renderTitleComponent(highlightedTitle)}\n </span>\n );\n return (\n <div className={b('item', {align, mode})}>\n <label className={b('item-heading')}>\n {renderRightAdornment ? (\n <Flex className={b('item-title-wrapper')} gap={3}>\n {titleNode}\n <div\n className={b('item-right-adornment', {\n hidden: showRightAdornmentOnHover,\n })}\n >\n {renderRightAdornment({title})}\n </div>\n </Flex>\n ) : (\n titleNode\n )}\n {description ? <span className={b('item-description')}>{description}</span> : null}\n </label>\n <div className={b('item-content')}>{children}</div>\n </div>\n );\n};\n\nfunction prepareTitle(string: string, search: string) {\n let temp = string.slice(0);\n const title: React.ReactNode[] = [];\n const parts = escapeStringForRegExp(search).split(' ').filter(Boolean);\n let key = 0;\n for (const part of parts) {\n const regex = new RegExp(part, 'ig');\n const match = regex.exec(temp);\n if (match) {\n const m = match[0];\n const i = match.index;\n if (i > 0) {\n title.push(temp.slice(0, i));\n }\n title.push(\n <strong key={key++} className={b('found')}>\n {m}\n </strong>,\n );\n temp = temp.slice(i + m.length);\n }\n }\n if (temp) {\n title.push(temp);\n }\n return title;\n}\n"],"names":["b","React","debounceFn","identity"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,SAAS,QAAQ,CAAC,KAAK,EAAE;AACzB,EAAE,OAAO,KAAK,CAAC;AACf,CAAC;AACD;AACA,IAAA,UAAc,GAAG,QAAQ;;AChBnB,SAAU,iBAAiB,CAC7B,IAAO,EAAA;AAEP,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAK,CAAC;AAElC,IAAA,KAAK,CAAC,SAAS,CAAC,MAAK;AACjB,QAAA,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;AACvB,QAAA,OAAO,MAAK;AACR,YAAA,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;AAChC,SAAC,CAAC;AACN,KAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,IAAmB,KAAI;AAChD,QAAA,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE;AACvC,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnC,SAAA;AACD,QAAA,OAAO,SAAS,CAAC;KACpB,EAAE,EAAE,CAAC,CAAC;AACX,CAAC;AAEK,SAAU,UAAU,CAAI,KAAQ,EAAA;IAClC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChC,IAAA,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;AACpB,IAAA,OAAO,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAEe,SAAA,SAAS,CAAC,IAAa,EAAE,OAAe,EAAA;IACpD,IAAI,CAAC,IAAI,EAAE;AACP,QAAA,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC5B,KAAA;AACL,CAAC;AAEK,SAAU,qBAAqB,CAAC,KAAa,EAAA;IAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACxD;;AC9BA,MAAMA,GAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAa7B,SAAU,cAAc,CAAC,EAC3B,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,QAAQ,GAAG,GAAG,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,GAAG,IAAI,GACE,EAAA;AAClB,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGC,cAAK,CAAC,QAAQ,CAAC,YAAY,aAAZ,YAAY,KAAA,KAAA,CAAA,GAAZ,YAAY,GAAI,EAAE,CAAC,CAAC;IAE7D,MAAM,iBAAiB,GAAG,iBAAiB,CAACC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC5E,IAAA,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,OAAe,KAAI;QACvD,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC/B,KAAC,CAAC,CAAC;IAEH,QACID,sCAAK,SAAS,EAAED,GAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAA;AAC9B,QAAAC,cAAA,CAAA,aAAA,CAAC,SAAS,EAAA,EACN,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,QAAQ,EACpB,QAAQ,EAAA,IAAA,EACR,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,YAAY,EACxB,CAAA,CACA,EACR;AACN;;;;;AC1CA,MAAMD,GAAC,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;AAO1B,MAAM,YAAY,GAAGC,cAAK,CAAC,UAAU;AACxC;AACA,SAAS,YAAY,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAC,EAAE,GAAG,EAAA;IACtD,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,GAAGA,cAAK,CAAC,QAAQ,EAAU,CAAC;IAC3D,MAAM,YAAY,GAAGA,cAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;AACxD,IAAA,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACjD,IAAA,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAE3CA,cAAK,CAAC,mBAAmB,CACrB,GAAG,EACH,OAAO;AACH,QAAA,aAAa,CAAC,KAAK,EAAA;AACf,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACvB,gBAAA,OAAO,KAAK,CAAC;AAChB,aAAA;AACD,YAAA,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAC7B,YAAA,IAAI,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;gBAClC,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,gBAAA,OAAO,IAAI,CAAC;AACf,aAAA;AAAM,iBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;AAClC,gBAAA,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AACxD,gBAAA,OAAO,IAAI,CAAC;AACf,aAAA;AAAM,iBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;AAChC,gBAAA,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,gBAAA,OAAO,IAAI,CAAC;AACf,aAAA;AACD,YAAA,OAAO,KAAK,CAAC;SAChB;QACD,UAAU,GAAA;YACN,UAAU,CAAC,SAAS,CAAC,CAAC;SACzB;AACJ,KAAA,CAAC,EACF,CAAC,UAAU,EAAE,YAAY,CAAC,CAC7B,CAAC;AAEF,IAAA,QACIA,cAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,GAAG,EAAE,YAAY,EAAE,SAAS,EAAED,GAAC,EAAE,EAAA,EACjC,KAAK,CAAC,GAAG,CAAC,CAAC,cAAc,KAAI;QAC1B,IAAI,YAAY,IAAI,cAAc,EAAE;AAChC,YAAA,QACIC,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,cAAc,CAAC,UAAU,EAAE,SAAS,EAAED,GAAC,CAAC,OAAO,CAAC,EAAA;gBACtDC,cAAM,CAAA,aAAA,CAAA,MAAA,EAAA,EAAA,SAAS,EAAED,GAAC,CAAC,eAAe,CAAC,EAC9B,EAAA,cAAc,CAAC,UAAU,CACvB;gBACN,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;oBAC/B,OAAO,cAAc,CACjB,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,WAAW,CACd,CAAC;iBACL,CAAC,CACA,EACR;AACL,SAAA;QACD,OAAO,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;KAC9E,CAAC,CACA,EACR;AACN,CAAC,CACJ,CAAC;AAEF,SAAS,cAAc,CACnB,IAAU,EACV,QAA8B,EAC9B,YAAgC,EAChC,WAA+B,EAAA;AAE/B,IAAA,QACIC,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EACI,GAAG,EAAE,IAAI,CAAC,KAAK,EACf,SAAS,EAAED,GAAC,CAAC,MAAM,EAAE;AACjB,YAAA,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC,EAAE;YAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,YAAA,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC,EAAE;YAChC,KAAK,EAAE,IAAI,CAAC,SAAS;AACxB,SAAA,CAAC,EACF,OAAO,EAAE,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAChB,gBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrB,aAAA;SACJ,EAAA,SAAA,EACQ,IAAI,CAAC,EAAE,EAAA;QAEf,IAAI,CAAC,IAAI,GAAGC,cAAC,CAAA,aAAA,CAAA,IAAI,EAAC,MAAA,CAAA,MAAA,CAAA,EAAA,IAAI,EAAE,EAAE,EAAM,EAAA,IAAI,CAAC,IAAI,EAAA,EAAE,SAAS,EAAED,GAAC,CAAC,WAAW,CAAC,EAAI,CAAA,CAAA,GAAG,SAAS;AACrF,QAAAC,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA,IAAA,EAAO,IAAI,CAAC,KAAK,CAAQ,CACtB,EACT;AACN,CAAC;AAED,SAAS,SAAS,CAAC,SAAsB,EAAE,OAA2B,EAAE,SAAiB,EAAA;;AACrF,IAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,IAAID,GAAC,CAAC,MAAM,CAAC,SAASA,GAAC,CAAC,MAAM,CAAC,CAAA,UAAA,CAAY,CAAC,CAAC;AACzF,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,QAAA,OAAO,SAAS,CAAC;AACpB,KAAA;AAED,IAAA,IAAI,YAAY,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1C,IAAA,IAAI,OAAO,EAAE;QACT,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CACzC,QAAQ,EACR,CAAC,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,OAAO,CAC3D,CAAC;AACL,KAAA;AAED,IAAA,YAAY,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,YAAY,GAAG,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC;AAC9E,IAAA,OAAO,CAAA,EAAA,GAAA,QAAQ,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,SAAS,CAAC;AACvE;;;;;ACpHA,MAAMA,GAAC,GAAG,KAAK,CAAC,sBAAsB,CAAC,CAAC;AAEjC,MAAM,kBAAkB,GAAG,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,GACO,KAAI;IACpB,MAAM,GAAG,GAAGC,cAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;AAE/C,IAAA,MAAM,QAAQ,GAAGA,cAAK,CAAC,OAAO,CAAC,MAAK;QAChC,MAAM,QAAQ,GAAoB,EAAE,CAAC;AAErC,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,cAAc,KAAI;YAC7B,IAAI,YAAY,IAAI,cAAc,EAAE;gBAChC,QAAQ,CAAC,IAAI,CACT,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAC,MAAM;oBAC/D,EAAE;oBACF,KAAK;oBACL,QAAQ;oBACR,SAAS,EAAED,GAAC,CAAC,MAAM,EAAE,EAAC,KAAK,EAAE,SAAS,EAAC,CAAC;iBAC3C,CAAC,CAAC,CACN,CAAC;AACL,aAAA;AAAM,iBAAA;gBACH,MAAM,EAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAC,GAAG,cAAc,CAAC;gBACxD,QAAQ,CAAC,IAAI,CAAC,EAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAEA,GAAC,CAAC,MAAM,EAAE,EAAC,KAAK,EAAE,SAAS,EAAC,CAAC,EAAC,CAAC,CAAC;AAClF,aAAA;AACL,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,QAAQ,CAAC;AACpB,KAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAEZ,IAAA,MAAM,eAAe,GAAG,CAAC,CAAmC,KAAI;QAC5D,CAAC,CAAC,eAAe,EAAE,CAAC;AACxB,KAAC,CAAC;IAEF,QACIC,sCAAK,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,eAAe,EAAA;AACvC,QAAAA,cAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EACD,KAAK,EAAE,QAAQ,EACf,SAAS,EAAED,GAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAC7B,IAAI,EAAC,GAAG,EACR,SAAS,EAAE,YAAY,EACvB,WAAW,EAAE,QAAQ,EACvB,CAAA,CACA,EACR;AACN,CAAC;;;;;;;;;;;;;;;;AChDD,MAAM,SAAS,GAAG,UAAU,CAAC;AAC7B,WAAe,cAAc,CAAC,EAAC,EAAE,EAAE,EAAE,EAAC,EAAE,SAAS,CAAC;;SCyClC,uBAAuB,CACnC,QAAyB,EACzB,UAAU,GAAG,EAAE,EAAA;;AAGf,IAAA,MAAM,cAAc,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAEjD,OAAO,gCAAgC,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,gCAAgC,CACrC,QAAyB,EACzB,QAAQ,GAAG,EAAE,EACb,QAAgB,EAAA;IAEhB,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAiC,EAAE,CAAC;IAC/C,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrBC,cAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,KAAI;;AACzC,QAAA,IAAI,CAACA,cAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;;YAEhC,OAAO;AACV,SAAA;AACD,QAAA,IAAI,OAAO,CAAC,IAAI,KAAKA,cAAK,CAAC,QAAQ,EAAE;;YAEjC,MAAM,EAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAC,GAAG,gCAAgC,CAC/E,OAAO,CAAC,KAAK,CAAC,QAAQ,EACtB,QAAQ,EACR,QAAQ,CACX,CAAC;AACF,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;AAC3B,YAAA,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACvC,SAAA;AAAM,aAAA,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE;AACjC,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;AACxC,gBAAA,SAAS,CAAC,CAAC,QAAQ,EAAE,yDAAyD,CAAC,CAAC;AACnF,aAAA;AAED,YAAA,MAAM,MAAM,GAAG,CAAA,EAAG,QAAQ,CAAI,CAAA,EAAA,CAAA,EAAA,GAAA,OAAO,CAAC,KAAK,CAAC,EAAE,mCAAI,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAC7E,QAAQ,GAAG,IAAI,CAAC;YAEhB,MAAM,EAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAC,GAAG,gCAAgC,CAC/E,OAAO,CAAC,KAAK,CAAC,QAAQ,EACtB,MAAM,EACN,QAAQ,CACX,CAAC;AAEF,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;AACxC,gBAAA,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,CAAC;AACxE,gBAAA,SAAS,CACL,CAAC,aAAa,EACd,CAAS,MAAA,EAAA,OAAO,CAAC,KAAK,CAAC,UAAU,CAA4B,0BAAA,CAAA,CAChE,CAAC;AACL,aAAA;YAED,IAAI,CAAC,IAAI,CAAC;AACN,gBAAA,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;;AAEpC,gBAAA,KAAK,EAAE,YAAY;AACtB,aAAA,CAAC,CAAC;AACH,YAAA,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AACvC,SAAA;AAAM,aAAA;YACH,QAAQ,GAAG,IAAI,CAAC;AAChB,YAAA,MAAM,MAAM,GAAG,CAAA,EAAG,QAAQ,CAAI,CAAA,EAAA,CAAA,EAAA,GAAA,OAAO,CAAC,KAAK,CAAC,EAAE,mCAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AAExE,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;AACxC,gBAAA,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,mCAAmC,CAAC,CAAC;AAC7E,gBAAA,SAAS,CAAC,CAAC,QAAQ,EAAE,yDAAyD,CAAC,CAAC;gBAChF,SAAS,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAsC,mCAAA,EAAA,MAAM,CAAG,CAAA,CAAA,CAAC,CAAC;AAC9E,aAAA;AAED,YAAA,KAAK,CAAC,MAAM,CAAC,GAAG,2BAA2B,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC9E,YAAA,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC;AACN,gBAAA,EAAE,EAAE,MAAM;AACV,gBAAA,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK;AAC1B,gBAAA,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI;AACxB,gBAAA,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS;AAClC,gBAAA,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM;AACjC,aAAA,CAAC,CAAC;AACN,SAAA;AACL,KAAC,CAAC,CAAC;AACH,IAAA,OAAO,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC;AACzB,CAAC;AAED,SAAS,2BAA2B,CAAC,QAAyB,EAAE,QAAgB,EAAA;AAC5E,IAAA,MAAM,IAAI,GAAiB,EAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC;IAChEA,cAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,KAAI;AACzC,QAAA,IAAI,CAACA,cAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;;YAEhC,OAAO;AACV,SAAA;AACD,QAAA,IAAI,OAAO,CAAC,IAAI,KAAKA,cAAK,CAAC,QAAQ,EAAE;;AAEjC,YAAA,MAAM,EAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAC,GAAG,2BAA2B,CAC7D,OAAO,CAAC,KAAK,CAAC,QAAQ,EACtB,QAAQ,CACX,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YAChC,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;YAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;AACvC,SAAA;AAAM,aAAA;AACH,YAAA,MAAM,EAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,EAAC,GAAG,OAAO,CAAC,KAAK,CAAC;AACnE,YAAA,MAAM,EAAC,KAAK,EAAE,MAAM,EAAC,GAAG,4BAA4B,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACvF,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;YAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;AACpC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACf,KAAK;gBACL,MAAM;gBACN,SAAS;gBACT,KAAK;gBACL,MAAM;gBACN,SAAS;AACZ,aAAA,CAAC,CAAC;AACN,SAAA;AACL,KAAC,CAAC,CAAC;AACH,IAAA,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,4BAA4B,CAAC,QAAyB,EAAE,QAAgB,EAAA;IAC7E,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjCA,cAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,KAAI;AACzC,QAAA,IAAI,CAACA,cAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;;YAEhC,OAAO;AACV,SAAA;AACD,QAAA,IAAI,OAAO,CAAC,IAAI,KAAKA,cAAK,CAAC,QAAQ,EAAE;;AAEjC,YAAA,MAAM,aAAa,GAAG,4BAA4B,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACrF,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;AACnC,YAAA,MAAM,GAAG,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC;AAC3C,SAAA;AAAM,aAAA;AACH,YAAA,MAAM,IAAI,GAAiB;AACvB,gBAAA,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK;AAC1B,gBAAA,oBAAoB,EAAE,OAAO,CAAC,KAAK,CAAC,oBAAoB;gBACxD,OAAO;gBACP,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;aAC9C,CAAC;AACF,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,YAAA,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;AAClC,SAAA;AACL,KAAC,CAAC,CAAC;AACH,IAAA,OAAO,EAAC,KAAK,EAAE,MAAM,EAAC,CAAC;AAC3B;;;;;AC/KA,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;AAsD5B,MAAM,eAAe,GAAGA,cAAK,CAAC,aAAa,CAAsB,EAAE,CAAC,CAAC;AAE9D,MAAM,kBAAkB,GAAG,MAAMA,cAAK,CAAC,UAAU,CAAC,eAAe,EAAE;AAEpE,SAAU,QAAQ,CAAC,EAQT,EAAA;QARS,EACrB,OAAO,EACP,aAAa,EACb,QAAQ,EACR,IAAI,GAAG,QAAQ,EACf,oBAAoB,EACpB,yBAAyB,GAAG,IAAI,EAAA,GAAA,EAEpB,EADT,KAAK,GAAA,MAAA,CAAA,EAAA,EAPa,qGAQxB,CADW,CAAA;AAER,IAAA,IAAI,OAAO,EAAE;QACT,QACIA,sCAAK,SAAS,EAAE,CAAC,CAAC,EAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC,EACnC,EAAA,OAAO,aAAa,KAAK,UAAU,IAChC,aAAa,EAAE,KAEfA,cAAC,CAAA,aAAA,CAAA,MAAM,EAAC,EAAA,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAC,GAAG,EAAG,CAAA,CAC9C,CACC,EACR;AACL,KAAA;AAED,IAAA,QACIA,cAAA,CAAA,aAAA,CAAC,eAAe,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,EAAC,oBAAoB,EAAE,yBAAyB,EAAC,EAAA;AAC9E,QAAAA,cAAA,CAAA,aAAA,CAAC,eAAe,EAAA,MAAA,CAAA,MAAA,CAAA,EAAC,IAAI,EAAE,IAAI,EAAA,EAAM,KAAK,CAAA,EACjC,QAAQ,CACK,CACK,EAC7B;AACN,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,IAAsB,EAAE,UAAkB,KAAI;AACpE,IAAA,KAAK,MAAM,UAAU,IAAI,IAAI,EAAE;QAC3B,IAAI,YAAY,IAAI,UAAU,EAAE;AAC5B,YAAA,KAAK,MAAM,WAAW,IAAI,UAAU,CAAC,KAAK;AACtC,gBAAA,IAAI,WAAW,CAAC,EAAE,KAAK,UAAU;oBAAE,OAAO,WAAW,CAAC,KAAK,CAAC;AACnE,SAAA;AAAM,aAAA,IAAI,UAAU,CAAC,EAAE,KAAK,UAAU;YAAE,OAAO,UAAU,CAAC,KAAK,CAAC;AACpE,KAAA;AAED,IAAA,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AAGF,SAAS,eAAe,CAAC,EACrB,WAAW,EACX,aAAa,EACb,QAAQ,EACR,cAAc,EACd,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAC3B,iBAAiB,GAAG,IAAI,CAAC,0BAA0B,CAAC,EACpD,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,CAAC,EAClD,IAAI,EACJ,YAAY,EACZ,OAAO,GACY,EAAA;;AACnB,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGA,cAAK,CAAC,QAAQ,CAAC,aAAa,aAAb,aAAa,KAAA,KAAA,CAAA,GAAb,aAAa,GAAI,EAAE,CAAC,CAAC;AAChE,IAAA,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,GAAG,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,GAAGA,cAAK,CAAC,QAAQ,CACjD,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,WAAW,GAAG,SAAS,CAC1E,CAAC;IACF,MAAM,cAAc,GAAGA,cAAK,CAAC,MAAM,CAAmB,IAAI,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAGA,cAAK,CAAC,MAAM,CAAuB,IAAI,CAAC,CAAC;AACzD,IAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ,CAAC;AAEnC,IAAAA,cAAK,CAAC,SAAS,CAAC,MAAK;;AACjB,QAAA,CAAA,EAAA,GAAA,OAAO,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAU,EAAE,CAAC;AAClC,KAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAEb,IAAAA,cAAK,CAAC,SAAS,CAAC,MAAK;QACjB,MAAM,OAAO,GAAG,MAAK;;AACjB,YAAA,CAAA,EAAA,GAAA,OAAO,CAAC,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,UAAU,EAAE,CAAC;AAClC,SAAC,CAAC;AACF,QAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,QAAA,OAAO,MAAK;AACR,YAAA,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,SAAC,CAAC;KACL,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,UAAU,GAAG,YAAY,CAAC;IAC9B,IAAI,CAAC,UAAU,KAAI,CAAA,EAAA,GAAA,KAAK,CAAC,UAAU,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,CAAA,EAAE;QAC1C,UAAU,GAAG,MAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAC,MAAM,EAAC,KAAK,CAAC,MAAM,CAAC,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,EAAE,CAAC;AACrE,KAAA;AAED,IAAA,MAAM,gBAAgB,GAAG,CAAC,OAA2B,KAAI;AACrD,QAAA,cAAc,CAAC,CAAC,QAAQ,KAAI;YACxB,IAAI,QAAQ,KAAK,OAAO,EAAE;AACtB,gBAAA,YAAY,aAAZ,YAAY,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAZ,YAAY,CAAG,OAAO,CAAC,CAAC;AAC3B,aAAA;AACD,YAAA,OAAO,OAAO,CAAC;AACnB,SAAC,CAAC,CAAC;AACP,KAAC,CAAC;AAEF,IAAAA,cAAK,CAAC,SAAS,CAAC,MAAK;QACjB,IAAI,UAAU,KAAK,YAAY,EAAE;YAC7B,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAChC,SAAA;AACL,KAAC,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,MAAK;QAC3B,IAAI,CAAC,UAAU,EAAE;YACb,OAAO,OAAO,cAAc,KAAK,UAAU,IACvC,cAAc,EAAE,KAEhBA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,EAAG,EAAA,gBAAgB,CAAO,CAC3D,CAAC;AACL,SAAA;QAED,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAEzF,QAAA,QACIA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA;AACK,YAAA,CAAC,QAAQ,KACNA,6BAAC,KAAK,EAAA,EAAC,YAAY,EAAC,IAAA,EAAA,OAAO,EAAE,OAAO,EAAA,EAC/B,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,CAC/B,CACX;AAED,YAAAA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,EACvB,EAAA,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,MAC1BA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,EAAA;AAC3C,gBAAA,OAAO,CAAC,SAAS,KACdA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAAG,EAAA,OAAO,CAAC,KAAK,CAAM,CAC5D;AAEA,gBAAA,OAAO,CAAC,MAAM;qBACV,QAAQ,IACLA,cAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAA,EAAG,OAAO,CAAC,MAAM,CAAO,KAE9D,OAAO,CAAC,MAAM,CACjB,CAAC;gBAEL,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAC,KACxC,MAAM,GAAG,IAAI,IACTA,sCAAK,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,EAAA,EACxCA,cAAK,CAAC,YAAY,CAAC,OAAO,EACpB,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,OAAO,CAAC,KAAK,KAChB,gBAAgB,EACZ,MAAM,IAAI,KAAK;AACX,0BAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC;AAC7B,0BAAE,KAAK,EACjB,CAAA,CAAA,CACA,CACT,CACJ,CACC,CACT,CAAC,CACA,CACP,EACL;AACN,KAAC,CAAC;IAEF,QACIA,sCAAK,SAAS,EAAE,CAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAA;QACpB,QAAQ,IACLA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA;AACI,YAAAA,cAAA,CAAA,aAAA,CAAC,cAAc,EAAA,EACX,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,EACtB,YAAY,EAAE,aAAa,EAC3B,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,KAAK,EAChB,SAAS,EAAE,IAAI,EACjB,CAAA;AACF,YAAAA,cAAA,CAAA,aAAA,CAAC,kBAAkB,EACf,EAAA,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,gBAAgB,EAC1B,YAAY,EAAE,UAAU,EACxB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAA,CACtB,CACH,KAEHA,cACI,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EACpB,OAAO,EAAE,MAAK;gBACV,IAAI,cAAc,CAAC,OAAO,EAAE;AACxB,oBAAA,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;AAClC,iBAAA;AACL,aAAC,EACD,SAAS,EAAE,CAAC,KAAK,KAAI;gBACjB,IAAI,OAAO,CAAC,OAAO,EAAE;oBACjB,IAAI,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;wBACtC,KAAK,CAAC,cAAc,EAAE,CAAC;AAC1B,qBAAA;AACJ,iBAAA;aACJ,EAAA;YAEDA,cAAC,CAAA,aAAA,CAAA,KAAK,EAAE,IAAA,EAAA,KAAK,CAAS;YACtBA,cAAC,CAAA,aAAA,CAAA,cAAc,EACX,EAAA,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,EACtB,YAAY,EAAE,aAAa,EAC3B,QAAQ,EAAE,SAAS,EACnB,WAAW,EAAE,iBAAiB,EAC9B,SAAS,EACX,IAAA,EAAA,CAAA;AACF,YAAAA,cAAA,CAAA,aAAA,CAAC,YAAY,EACT,EAAA,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,gBAAgB,EAC1B,YAAY,EAAE,UAAU,EAAA,CAC1B,CACA,CACT;AACD,QAAAA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAG,EAAA,iBAAiB,EAAE,CAAO,CACpD,EACR;AACN,CAAC;AAED,QAAQ,CAAC,KAAK,GAAG,SAAS,aAAa,CAAC,EAAC,QAAQ,EAAqB,EAAA;AAClE,IAAA,OAAOA,6BAACA,cAAK,CAAC,QAAQ,EAAE,IAAA,EAAA,QAAQ,CAAkB,CAAC;AACvD,CAAC,CAAC;AAEF,QAAQ,CAAC,IAAI,GAAG,SAAS,YAAY,CAAC,EAAC,QAAQ,EAAoB,EAAA;AAC/D,IAAA,OAAOA,6BAACA,cAAK,CAAC,QAAQ,EAAE,IAAA,EAAA,QAAQ,CAAkB,CAAC;AACvD,CAAC,CAAC;AAEF,QAAQ,CAAC,OAAO,GAAG,SAAS,eAAe,CAAC,EAAC,QAAQ,EAAuB,EAAA;AACxE,IAAA,OAAOA,6BAACA,cAAK,CAAC,QAAQ,EAAE,IAAA,EAAA,QAAQ,CAAkB,CAAC;AACvD,CAAC,CAAC;AAEF,QAAQ,CAAC,IAAI,GAAG,SAAS,YAAY,CAAC,EAClC,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,KAAK,GAAG,QAAQ,EAChB,SAAS,EACT,oBAAoB,GAAGE,UAAQ,EAC/B,IAAI,EACJ,WAAW,GACK,EAAA;IAChB,MAAM,EAAC,oBAAoB,EAAE,yBAAyB,EAAC,GAAG,kBAAkB,EAAE,CAAC;IAC/E,MAAM,SAAS,IACXF,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,CAAC,CAAC,YAAY,EAAE,EAAC,KAAK,EAAE,SAAS,EAAC,CAAC,EAC/C,EAAA,oBAAoB,CAAC,gBAAgB,CAAC,CACpC,CACV,CAAC;AACF,IAAA,QACIA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,EAAA;AACpC,QAAAA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAO,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,EAAA;AAC9B,YAAA,oBAAoB,IACjBA,cAAA,CAAA,aAAA,CAAC,IAAI,EAAC,EAAA,SAAS,EAAE,CAAC,CAAC,oBAAoB,CAAC,EAAE,GAAG,EAAE,CAAC,EAAA;gBAC3C,SAAS;AACV,gBAAAA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EACI,SAAS,EAAE,CAAC,CAAC,sBAAsB,EAAE;AACjC,wBAAA,MAAM,EAAE,yBAAyB;AACpC,qBAAA,CAAC,EAED,EAAA,oBAAoB,CAAC,EAAC,KAAK,EAAC,CAAC,CAC5B,CACH,KAEP,SAAS,CACZ;AACA,YAAA,WAAW,GAAGA,cAAM,CAAA,aAAA,CAAA,MAAA,EAAA,EAAA,SAAS,EAAE,CAAC,CAAC,kBAAkB,CAAC,IAAG,WAAW,CAAQ,GAAG,IAAI,CAC9E;QACRA,cAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,EAAA,EAAG,QAAQ,CAAO,CACjD,EACR;AACN,CAAC,CAAC;AAEF,SAAS,YAAY,CAAC,MAAc,EAAE,MAAc,EAAA;IAChD,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAsB,EAAE,CAAC;AACpC,IAAA,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvE,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACtB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,QAAA,IAAI,KAAK,EAAE;AACP,YAAA,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACnB,YAAA,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,EAAE;AACP,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAChC,aAAA;AACD,YAAA,KAAK,CAAC,IAAI,CACNA,yCAAQ,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,IACpC,CAAC,CACG,CACZ,CAAC;YACF,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACnC,SAAA;AACJ,KAAA;AACD,IAAA,IAAI,IAAI,EAAE;AACN,QAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpB,KAAA;AACD,IAAA,OAAO,KAAK,CAAC;AACjB;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { Text, Button, Icon } from '@gravity-ui/uikit';
|
|
3
|
+
import { Xmark } from '@gravity-ui/icons';
|
|
4
|
+
import { s as styleInject, b as block } from './style-inject.es-cfd97593.js';
|
|
5
|
+
import { r as registerKeyset } from './registerKeyset-35f1ea08.js';
|
|
6
|
+
|
|
7
|
+
var button_close$1 = "Close";
|
|
8
|
+
var en = {
|
|
9
|
+
button_close: button_close$1
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
var button_close = "Закрыть";
|
|
13
|
+
var ru = {
|
|
14
|
+
button_close: button_close
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const COMPONENT = 'Title';
|
|
18
|
+
var i18n = registerKeyset({ en, ru }, COMPONENT);
|
|
19
|
+
|
|
20
|
+
var css_248z = ".gn-title{align-items:center;box-sizing:border-box;display:flex;justify-content:space-between;min-height:64px;padding:14px 10px 14px 20px}.gn-title_separator{border-bottom:1px solid var(--g-color-line-generic)}.gn-title__text{margin:0 20px 0 0}";
|
|
21
|
+
styleInject(css_248z);
|
|
22
|
+
|
|
23
|
+
const b = block('title');
|
|
24
|
+
const Title = ({ children, closeIconSize = 23, hasSeparator, closeTitle = i18n('button_close'), onClose, }) => {
|
|
25
|
+
return (React__default.createElement("div", { className: b({ separator: hasSeparator }) },
|
|
26
|
+
React__default.createElement(Text, { className: b('text'), as: 'h3', variant: 'subheader-3' }, children),
|
|
27
|
+
onClose && (React__default.createElement(Button, { onClick: onClose, view: "flat", size: "l", extraProps: {
|
|
28
|
+
'aria-label': closeTitle,
|
|
29
|
+
} },
|
|
30
|
+
React__default.createElement(Icon, { data: Xmark, size: closeIconSize })))));
|
|
31
|
+
};
|
|
32
|
+
Title.displayName = 'Title';
|
|
33
|
+
|
|
34
|
+
export { Title as T };
|
|
35
|
+
//# sourceMappingURL=Title-3d579ca4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Title-3d579ca4.js","sources":["../../../src/components/Title/i18n/index.ts","../../../src/components/Title/Title.tsx"],"sourcesContent":["import {registerKeyset} from '../../utils/registerKeyset';\n\nimport en from './en.json';\nimport ru from './ru.json';\n\nconst COMPONENT = 'Title';\nexport default registerKeyset({en, ru}, COMPONENT);\n","import React from 'react';\nimport {Button, Icon, Text} from '@gravity-ui/uikit';\nimport {Xmark} from '@gravity-ui/icons';\nimport {block} from '../utils/cn';\nimport i18n from './i18n';\n\nimport './Title.scss';\n\nconst b = block('title');\n\ninterface TitleProps {\n hasSeparator?: boolean;\n closeTitle?: string;\n closeIconSize?: number;\n onClose?: () => void;\n}\nexport const Title: React.FC<React.PropsWithChildren<TitleProps>> = ({\n children,\n closeIconSize = 23,\n hasSeparator,\n closeTitle = i18n('button_close'),\n onClose,\n}) => {\n return (\n <div className={b({separator: hasSeparator})}>\n <Text className={b('text')} as={'h3'} variant={'subheader-3'}>\n {children}\n </Text>\n {onClose && (\n <Button\n onClick={onClose}\n view=\"flat\"\n size=\"l\"\n extraProps={{\n 'aria-label': closeTitle,\n }}\n >\n <Icon data={Xmark} size={closeIconSize} />\n </Button>\n )}\n </div>\n );\n};\n\nTitle.displayName = 'Title';\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;AAKA,MAAM,SAAS,GAAG,OAAO,CAAC;AAC1B,WAAe,cAAc,CAAC,EAAC,EAAE,EAAE,EAAE,EAAC,EAAE,SAAS,CAAC;;;;;ACElD,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;AAQZ,MAAA,KAAK,GAAkD,CAAC,EACjE,QAAQ,EACR,aAAa,GAAG,EAAE,EAClB,YAAY,EACZ,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,EACjC,OAAO,GACV,KAAI;IACD,QACIA,cAAK,CAAA,aAAA,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,CAAC,CAAC,EAAC,SAAS,EAAE,YAAY,EAAC,CAAC,EAAA;AACxC,QAAAA,cAAA,CAAA,aAAA,CAAC,IAAI,EAAC,EAAA,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAA,EACvD,QAAQ,CACN;AACN,QAAA,OAAO,KACJA,cAAA,CAAA,aAAA,CAAC,MAAM,EACH,EAAA,OAAO,EAAE,OAAO,EAChB,IAAI,EAAC,MAAM,EACX,IAAI,EAAC,GAAG,EACR,UAAU,EAAE;AACR,gBAAA,YAAY,EAAE,UAAU;AAC3B,aAAA,EAAA;AAED,YAAAA,cAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAI,CAAA,CACrC,CACZ,CACC,EACR;AACN,EAAE;AAEF,KAAK,CAAC,WAAW,GAAG,OAAO;;;;"}
|