@gravity-ui/navigation 1.3.0 → 1.4.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.
@@ -270,18 +270,14 @@ function getSettingsPageFromChildren(children, filterRe) {
270
270
  page.hidden = hidden && page.hidden;
271
271
  }
272
272
  else {
273
- const { title, header, withBadge, showTitle = true } = element.props;
273
+ const { withBadge, showTitle = true } = element.props;
274
274
  const { items, hidden } = getSettingsItemsFromChildren(element.props.children, filterRe);
275
275
  page.withBadge = withBadge || page.withBadge;
276
276
  page.hidden = hidden && page.hidden;
277
- page.sections.push({
278
- title,
279
- header,
280
- withBadge,
277
+ page.sections.push(Object.assign(Object.assign({}, element.props), { withBadge,
281
278
  items,
282
279
  hidden,
283
- showTitle,
284
- });
280
+ showTitle }));
285
281
  }
286
282
  });
287
283
  return page;
@@ -301,31 +297,89 @@ function getSettingsItemsFromChildren(children, filterRe) {
301
297
  hidden = hidden && fragmentItems.hidden;
302
298
  }
303
299
  else {
304
- const item = {
305
- title: element.props.title,
306
- renderTitleComponent: element.props.renderTitleComponent,
307
- element,
308
- hidden: !filterRe.test(element.props.title),
309
- };
300
+ const item = Object.assign(Object.assign({}, element.props), { element, hidden: !filterRe.test(element.props.title) });
310
301
  items.push(item);
311
302
  hidden = hidden && item.hidden;
312
303
  }
313
304
  });
314
305
  return { items, hidden };
315
306
  }
307
+ function getSelectedSettingsPart(pages, selection) {
308
+ if (!selection.settingId && !selection.section && !selection.page) {
309
+ return {};
310
+ }
311
+ for (const page of Object.values(pages)) {
312
+ if (!selection.settingId && !selection.section) {
313
+ if (selection.page !== page.id)
314
+ continue;
315
+ return { page };
316
+ }
317
+ for (const section of page.sections) {
318
+ if (selection.settingId) {
319
+ for (const setting of section.items) {
320
+ if (setting.id === selection.settingId) {
321
+ return { page, section, setting };
322
+ }
323
+ }
324
+ }
325
+ else if (selection.section &&
326
+ ('id' in selection.section
327
+ ? selection.section.id === section.id
328
+ : selection.section.title === section.title)) {
329
+ return { page, section };
330
+ }
331
+ }
332
+ }
333
+ return {};
334
+ }
335
+
336
+ const defaultValue = {};
337
+ const context = React__default.createContext(defaultValue);
338
+ context.displayName = 'SettingsSelectionContext';
339
+ function useSettingsSelectionProviderValue(pages, selection) {
340
+ const selectedRef = React__default.useRef(null);
341
+ const contextValue = React__default.useMemo(() => {
342
+ if (!selection)
343
+ return { selectedRef };
344
+ return Object.assign({ selectedRef }, getSelectedSettingsPart(pages, selection));
345
+ }, [pages, selection]);
346
+ return contextValue;
347
+ }
348
+ const SettingsSelectionContextProvider = context.Provider;
349
+ function useSettingsSelectionContext() {
350
+ return React__default.useContext(context);
351
+ }
352
+
353
+ function isSectionSelected(selected, pageId, section) {
354
+ var _a;
355
+ if (!selected.section || selected.setting) {
356
+ return false;
357
+ }
358
+ else if (selected.section.id && selected.section.id === section.id) {
359
+ return true;
360
+ }
361
+ else if (((_a = selected.page) === null || _a === void 0 ? void 0 : _a.id) === pageId &&
362
+ selected.section.title &&
363
+ selected.section.title === section.title) {
364
+ return true;
365
+ }
366
+ else {
367
+ return false;
368
+ }
369
+ }
316
370
 
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)}";
371
+ 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-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-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__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)}";
318
372
  styleInject(css_248z);
319
373
 
320
374
  const b = block('settings');
321
375
  const SettingsContext = React__default.createContext({});
322
376
  const useSettingsContext = () => React__default.useContext(SettingsContext);
323
377
  function Settings(_a) {
324
- var { loading, renderLoading, children, view = 'normal', renderRightAdornment, showRightAdornmentOnHover = true } = _a, props = __rest(_a, ["loading", "renderLoading", "children", "view", "renderRightAdornment", "showRightAdornmentOnHover"]);
378
+ var { loading, renderLoading, children, view = 'normal', renderRightAdornment, renderSectionRightAdornment, showRightAdornmentOnHover = true } = _a, props = __rest(_a, ["loading", "renderLoading", "children", "view", "renderRightAdornment", "renderSectionRightAdornment", "showRightAdornmentOnHover"]);
325
379
  if (loading) {
326
380
  return (React__default.createElement("div", { className: b({ loading: true, view }) }, typeof renderLoading === 'function' ? (renderLoading()) : (React__default.createElement(Loader, { className: b('loader'), size: "m" }))));
327
381
  }
328
- return (React__default.createElement(SettingsContext.Provider, { value: { renderRightAdornment, showRightAdornmentOnHover } },
382
+ return (React__default.createElement(SettingsContext.Provider, { value: { renderRightAdornment, renderSectionRightAdornment, showRightAdornmentOnHover } },
329
383
  React__default.createElement(SettingsContent, Object.assign({ view: view }, props), children)));
330
384
  }
331
385
  const getPageTitleById = (menu, activePage) => {
@@ -340,12 +394,16 @@ const getPageTitleById = (menu, activePage) => {
340
394
  }
341
395
  return '';
342
396
  };
343
- function SettingsContent({ initialPage, initialSearch, children, renderNotFound, title = i18n('label_title'), filterPlaceholder = i18n('label_filter-placeholder'), emptyPlaceholder = i18n('label_empty-placeholder'), view, onPageChange, onClose, }) {
397
+ function SettingsContent({ initialPage, initialSearch, selection, children, renderNotFound, title = i18n('label_title'), filterPlaceholder = i18n('label_filter-placeholder'), emptyPlaceholder = i18n('label_empty-placeholder'), view, onPageChange, onClose, }) {
344
398
  var _a, _b;
399
+ const { renderSectionRightAdornment, showRightAdornmentOnHover } = useSettingsContext();
345
400
  const [search, setSearch] = React__default.useState(initialSearch !== null && initialSearch !== void 0 ? initialSearch : '');
346
401
  const { menu, pages } = getSettingsFromChildren(children, search);
402
+ const selected = useSettingsSelectionProviderValue(pages, selection);
347
403
  const pageKeys = Object.keys(pages);
348
- const [selectedPage, setCurrentPage] = React__default.useState(initialPage && pageKeys.includes(initialPage) ? initialPage : undefined);
404
+ const selectionInitialPage = selected.page && pageKeys.includes(selected.page.id) ? selected.page.id : undefined;
405
+ const [selectedPage, setCurrentPage] = React__default.useState(selectionInitialPage ||
406
+ (initialPage && pageKeys.includes(initialPage) ? initialPage : undefined));
349
407
  const searchInputRef = React__default.useRef(null);
350
408
  const menuRef = React__default.useRef(null);
351
409
  const isMobile = view === 'mobile';
@@ -380,39 +438,60 @@ function SettingsContent({ initialPage, initialSearch, children, renderNotFound,
380
438
  handlePageChange(activePage);
381
439
  }
382
440
  });
383
- const renderPageContent = () => {
384
- if (!activePage) {
441
+ React__default.useEffect(() => {
442
+ if (!selectionInitialPage)
443
+ return;
444
+ setCurrentPage(selectionInitialPage);
445
+ }, [selectionInitialPage]);
446
+ React__default.useEffect(() => {
447
+ var _a;
448
+ if ((_a = selected.selectedRef) === null || _a === void 0 ? void 0 : _a.current) {
449
+ selected.selectedRef.current.scrollIntoView();
450
+ }
451
+ }, [selected.selectedRef]);
452
+ const renderSetting = ({ title: settingTitle, element }) => {
453
+ return (React__default.createElement("div", { key: settingTitle, className: b('section-item') }, React__default.cloneElement(element, Object.assign(Object.assign({}, element.props), { highlightedTitle: search && settingTitle ? prepareTitle(settingTitle, search) : settingTitle }))));
454
+ };
455
+ const renderSection = (page, section) => {
456
+ const isSelected = isSectionSelected(selected, page, section);
457
+ return (React__default.createElement("div", { key: section.title, className: b('section', { selected: isSelected }), ref: isSelected ? selected.selectedRef : undefined },
458
+ section.showTitle && (React__default.createElement("h3", { className: b('section-heading') }, renderSectionRightAdornment ? (React__default.createElement(Flex, { gap: 2, alignItems: 'center' },
459
+ section.title,
460
+ React__default.createElement("div", { className: b('section-right-adornment', {
461
+ hidden: showRightAdornmentOnHover,
462
+ }) }, renderSectionRightAdornment(section)))) : (section.title))),
463
+ section.header &&
464
+ (isMobile ? (React__default.createElement("div", { className: b('section-subheader') }, section.header)) : (section.header)),
465
+ section.items.map((setting) => (setting.hidden ? null : renderSetting(setting)))));
466
+ };
467
+ const renderPageContent = (page) => {
468
+ if (!page) {
385
469
  return typeof renderNotFound === 'function' ? (renderNotFound()) : (React__default.createElement("div", { className: b('not-found') }, emptyPlaceholder));
386
470
  }
387
- const filteredSections = pages[activePage].sections.filter((section) => !section.hidden);
471
+ const filteredSections = pages[page].sections.filter((section) => !section.hidden);
388
472
  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 })))))))))));
473
+ !isMobile && (React__default.createElement(Title, { hasSeparator: true, onClose: onClose }, getPageTitleById(menu, page))),
474
+ React__default.createElement("div", { className: b('content') }, filteredSections.map((section) => renderSection(page, section)))));
397
475
  };
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();
476
+ return (React__default.createElement(SettingsSelectionContextProvider, { value: selected },
477
+ React__default.createElement("div", { className: b({ view }) },
478
+ isMobile ? (React__default.createElement(React__default.Fragment, null,
479
+ React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b('search'), initialValue: initialSearch, onChange: setSearch, autoFocus: false, inputSize: 'xl' }),
480
+ React__default.createElement(SettingsMenuMobile, { items: menu, onChange: handlePageChange, activeItemId: activePage, className: b('tabs') }))) : (React__default.createElement("div", { className: b('menu'), onClick: () => {
481
+ if (searchInputRef.current) {
482
+ searchInputRef.current.focus();
409
483
  }
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())));
484
+ }, onKeyDown: (event) => {
485
+ if (menuRef.current) {
486
+ if (menuRef.current.handleKeyDown(event)) {
487
+ event.preventDefault();
488
+ }
489
+ }
490
+ } },
491
+ React__default.createElement(Title, null, title),
492
+ React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b('search'), initialValue: initialSearch, onChange: setSearch, placeholder: filterPlaceholder, autoFocus: true }),
493
+ React__default.createElement(SettingsMenu, { ref: menuRef, items: menu, onChange: handlePageChange, activeItemId: activePage }))),
494
+ React__default.createElement("div", { className: b('page') }, renderPageContent(activePage)))));
416
495
  }
417
496
  Settings.Group = function SettingsGroup({ children }) {
418
497
  return React__default.createElement(React__default.Fragment, null, children);
@@ -423,16 +502,19 @@ Settings.Page = function SettingsPage({ children }) {
423
502
  Settings.Section = function SettingsSection({ children }) {
424
503
  return React__default.createElement(React__default.Fragment, null, children);
425
504
  };
426
- Settings.Item = function SettingsItem({ title, highlightedTitle, children, align = 'center', withBadge, renderTitleComponent = identity_1, mode, description, }) {
505
+ Settings.Item = function SettingsItem(setting) {
506
+ const { id, highlightedTitle, children, align = 'center', withBadge, renderTitleComponent = identity_1, mode, description, } = setting;
507
+ const selected = useSettingsSelectionContext();
508
+ const isSettingSelected = selected.setting && selected.setting.id === id;
427
509
  const { renderRightAdornment, showRightAdornmentOnHover } = useSettingsContext();
428
510
  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 }) },
511
+ return (React__default.createElement("div", { className: b('item', { align, mode, selected: isSettingSelected }), ref: isSettingSelected ? selected.selectedRef : undefined },
430
512
  React__default.createElement("label", { className: b('item-heading') },
431
513
  renderRightAdornment ? (React__default.createElement(Flex, { className: b('item-title-wrapper'), gap: 3 },
432
514
  titleNode,
433
515
  React__default.createElement("div", { className: b('item-right-adornment', {
434
516
  hidden: showRightAdornmentOnHover,
435
- }) }, renderRightAdornment({ title })))) : (titleNode),
517
+ }) }, renderRightAdornment(setting)))) : (titleNode),
436
518
  description ? React__default.createElement("span", { className: b('item-description') }, description) : null),
437
519
  React__default.createElement("div", { className: b('item-content') }, children)));
438
520
  };
@@ -461,4 +543,4 @@ function prepareTitle(string, search) {
461
543
  }
462
544
 
463
545
  export { Settings as S, useSettingsContext as u };
464
- //# sourceMappingURL=Settings-ea96388d.js.map
546
+ //# sourceMappingURL=Settings-d2e34d31.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Settings-d2e34d31.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/Selection/context.ts","../../../src/components/Settings/Selection/utils.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';\nimport {SettingsSelection} from './Selection/types';\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\nexport interface SettingsPageSection {\n id?: string;\n title: string;\n header?: React.ReactNode;\n items: SettingsItem[];\n hidden?: boolean;\n withBadge?: boolean;\n showTitle?: boolean;\n}\n\nexport interface SettingsItem {\n id?: string;\n title: string;\n element: React.ReactElement;\n hidden: boolean;\n titleComponent?: React.ReactNode;\n renderTitleComponent?: (highlightedTitle: React.ReactNode | null) => React.ReactNode;\n}\n\nexport interface SelectedSettingsPart {\n page?: SettingsPage;\n section?: SettingsPageSection;\n setting?: SettingsItem;\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 {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 ...element.props,\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 ...element.props,\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\nexport function getSelectedSettingsPart(\n pages: Record<string, SettingsPage>,\n selection: SettingsSelection,\n): SelectedSettingsPart {\n if (!selection.settingId && !selection.section && !selection.page) {\n return {};\n }\n\n for (const page of Object.values(pages)) {\n if (!selection.settingId && !selection.section) {\n if (selection.page !== page.id) continue;\n\n return {page};\n }\n\n for (const section of page.sections) {\n if (selection.settingId) {\n for (const setting of section.items) {\n if (setting.id === selection.settingId) {\n return {page, section, setting};\n }\n }\n } else if (\n selection.section &&\n ('id' in selection.section\n ? selection.section.id === section.id\n : selection.section.title === section.title)\n ) {\n return {page, section};\n }\n }\n }\n\n return {};\n}\n","import React from 'react';\nimport {SelectedSettingsPart, SettingsPage, getSelectedSettingsPart} from '../collect-settings';\nimport {SettingsSelection} from './types';\n\ninterface ContextValue extends SelectedSettingsPart {\n selectedRef?: React.RefObject<HTMLDivElement>;\n}\n\nconst defaultValue: ContextValue = {};\n\nconst context = React.createContext(defaultValue);\ncontext.displayName = 'SettingsSelectionContext';\n\nexport function useSettingsSelectionProviderValue(\n pages: Record<string, SettingsPage>,\n selection: SettingsSelection | undefined,\n): ContextValue {\n const selectedRef = React.useRef<HTMLDivElement>(null);\n\n const contextValue: ContextValue = React.useMemo(() => {\n if (!selection) return {selectedRef};\n\n return {selectedRef, ...getSelectedSettingsPart(pages, selection)};\n }, [pages, selection]);\n\n return contextValue;\n}\n\nexport const SettingsSelectionContextProvider = context.Provider;\n\nexport function useSettingsSelectionContext() {\n return React.useContext(context);\n}\n","import {SelectedSettingsPart, SettingsPageSection} from '../collect-settings';\n\nexport function isSectionSelected(\n selected: SelectedSettingsPart,\n pageId: string,\n section: SettingsPageSection,\n) {\n if (!selected.section || selected.setting) {\n return false;\n } else if (selected.section.id && selected.section.id === section.id) {\n return true;\n } else if (\n selected.page?.id === pageId &&\n selected.section.title &&\n selected.section.title === section.title\n ) {\n return true;\n } else {\n return false;\n }\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 {\n SettingsItem,\n SettingsMenu as SettingsMenuType,\n SettingsPageSection,\n} from './collect-settings';\nimport {getSettingsFromChildren} from './collect-settings';\nimport {escapeStringForRegExp} from './helpers';\n\nimport {SettingsSelection} from './Selection';\nimport {\n SettingsSelectionContextProvider,\n useSettingsSelectionContext,\n useSettingsSelectionProviderValue,\n} from './Selection/context';\nimport {isSectionSelected} from './Selection/utils';\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 selection?: SettingsSelection;\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: SettingsItemProps) => React.ReactNode;\n renderSectionRightAdornment?: (section: SettingsPageSection) => 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 id?: string;\n title: string;\n header?: React.ReactNode;\n children: React.ReactNode;\n withBadge?: boolean;\n showTitle?: boolean;\n}\n\nexport interface SettingsItemProps {\n id?: string;\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<\n SettingsProps,\n 'renderRightAdornment' | 'renderSectionRightAdornment' | 'showRightAdornmentOnHover'\n > {}\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 renderSectionRightAdornment,\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\n value={{renderRightAdornment, renderSectionRightAdornment, showRightAdornmentOnHover}}\n >\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 selection,\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 {renderSectionRightAdornment, showRightAdornmentOnHover} = useSettingsContext();\n\n const [search, setSearch] = React.useState(initialSearch ?? '');\n const {menu, pages} = getSettingsFromChildren(children, search);\n\n const selected = useSettingsSelectionProviderValue(pages, selection);\n\n const pageKeys = Object.keys(pages);\n const selectionInitialPage =\n selected.page && pageKeys.includes(selected.page.id) ? selected.page.id : undefined;\n const [selectedPage, setCurrentPage] = React.useState<string | undefined>(\n selectionInitialPage ||\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 React.useEffect(() => {\n if (!selectionInitialPage) return;\n setCurrentPage(selectionInitialPage);\n }, [selectionInitialPage]);\n\n React.useEffect(() => {\n if (selected.selectedRef?.current) {\n selected.selectedRef.current.scrollIntoView();\n }\n }, [selected.selectedRef]);\n\n const renderSetting = ({title: settingTitle, element}: SettingsItem) => {\n return (\n <div key={settingTitle} className={b('section-item')}>\n {React.cloneElement(element, {\n ...element.props,\n highlightedTitle:\n search && settingTitle ? prepareTitle(settingTitle, search) : settingTitle,\n })}\n </div>\n );\n };\n\n const renderSection = (page: string, section: SettingsPageSection) => {\n const isSelected = isSectionSelected(selected, page, section);\n\n return (\n <div\n key={section.title}\n className={b('section', {selected: isSelected})}\n ref={isSelected ? selected.selectedRef : undefined}\n >\n {section.showTitle && (\n <h3 className={b('section-heading')}>\n {renderSectionRightAdornment ? (\n <Flex gap={2} alignItems={'center'}>\n {section.title}\n <div\n className={b('section-right-adornment', {\n hidden: showRightAdornmentOnHover,\n })}\n >\n {renderSectionRightAdornment(section)}\n </div>\n </Flex>\n ) : (\n section.title\n )}\n </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((setting) => (setting.hidden ? null : renderSetting(setting)))}\n </div>\n );\n };\n\n const renderPageContent = (page: string | undefined) => {\n if (!page) {\n return typeof renderNotFound === 'function' ? (\n renderNotFound()\n ) : (\n <div className={b('not-found')}>{emptyPlaceholder}</div>\n );\n }\n\n const filteredSections = pages[page].sections.filter((section) => !section.hidden);\n\n return (\n <>\n {!isMobile && (\n <Title hasSeparator onClose={onClose}>\n {getPageTitleById(menu, page)}\n </Title>\n )}\n\n <div className={b('content')}>\n {filteredSections.map((section) => renderSection(page, section))}\n </div>\n </>\n );\n };\n\n return (\n <SettingsSelectionContextProvider value={selected}>\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(activePage)}</div>\n </div>\n </SettingsSelectionContextProvider>\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(setting: SettingsItemProps) {\n const {\n id,\n highlightedTitle,\n children,\n align = 'center',\n withBadge,\n renderTitleComponent = identity,\n mode,\n description,\n } = setting;\n\n const selected = useSettingsSelectionContext();\n const isSettingSelected = selected.setting && selected.setting.id === id;\n\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\n className={b('item', {align, mode, selected: isSettingSelected})}\n ref={isSettingSelected ? selected.selectedRef : undefined}\n >\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(setting)}\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":"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"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { SelectedSettingsPart, SettingsPage } from '../collect-settings';
3
+ import { SettingsSelection } from './types';
4
+ interface ContextValue extends SelectedSettingsPart {
5
+ selectedRef?: React.RefObject<HTMLDivElement>;
6
+ }
7
+ export declare function useSettingsSelectionProviderValue(pages: Record<string, SettingsPage>, selection: SettingsSelection | undefined): ContextValue;
8
+ export declare const SettingsSelectionContextProvider: React.Provider<ContextValue>;
9
+ export declare function useSettingsSelectionContext(): ContextValue;
10
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './context';
2
+ export * from './types';
@@ -0,0 +1,9 @@
1
+ export interface SettingsSelection {
2
+ page?: string;
3
+ section?: {
4
+ id: string;
5
+ } | {
6
+ title: string;
7
+ };
8
+ settingId?: string;
9
+ }
@@ -0,0 +1,2 @@
1
+ import { SelectedSettingsPart, SettingsPageSection } from '../collect-settings';
2
+ export declare function isSectionSelected(selected: SelectedSettingsPart, pageId: string, section: SettingsPageSection): boolean;
@@ -1,5 +1,7 @@
1
1
  import React from 'react';
2
2
  import { IconProps } from '@gravity-ui/uikit';
3
+ import type { SettingsPageSection } from './collect-settings';
4
+ import { SettingsSelection } from './Selection';
3
5
  import './Settings.scss';
4
6
  export interface SettingsProps {
5
7
  children: React.ReactNode;
@@ -8,13 +10,15 @@ export interface SettingsProps {
8
10
  emptyPlaceholder?: string;
9
11
  initialPage?: string;
10
12
  initialSearch?: string;
13
+ selection?: SettingsSelection;
11
14
  onPageChange?: (page: string | undefined) => void;
12
15
  renderNotFound?: () => React.ReactNode;
13
16
  renderLoading?: () => React.ReactNode;
14
17
  loading?: boolean;
15
18
  view?: 'normal' | 'mobile';
16
19
  onClose?: () => void;
17
- renderRightAdornment?: (item: Pick<SettingsItemProps, 'title'>) => React.ReactNode;
20
+ renderRightAdornment?: (item: SettingsItemProps) => React.ReactNode;
21
+ renderSectionRightAdornment?: (section: SettingsPageSection) => React.ReactNode;
18
22
  showRightAdornmentOnHover?: boolean;
19
23
  }
20
24
  export interface SettingsGroupProps {
@@ -29,6 +33,7 @@ export interface SettingsPageProps {
29
33
  children: React.ReactNode;
30
34
  }
31
35
  export interface SettingsSectionProps {
36
+ id?: string;
32
37
  title: string;
33
38
  header?: React.ReactNode;
34
39
  children: React.ReactNode;
@@ -36,6 +41,7 @@ export interface SettingsSectionProps {
36
41
  showTitle?: boolean;
37
42
  }
38
43
  export interface SettingsItemProps {
44
+ id?: string;
39
45
  title: string;
40
46
  highlightedTitle?: React.ReactNode | null;
41
47
  renderTitleComponent?: (highlightedTitle: React.ReactNode | null) => React.ReactNode;
@@ -45,13 +51,13 @@ export interface SettingsItemProps {
45
51
  mode?: 'row';
46
52
  description?: React.ReactNode;
47
53
  }
48
- export interface SettingsContextType extends Pick<SettingsProps, 'renderRightAdornment' | 'showRightAdornmentOnHover'> {
54
+ export interface SettingsContextType extends Pick<SettingsProps, 'renderRightAdornment' | 'renderSectionRightAdornment' | 'showRightAdornmentOnHover'> {
49
55
  }
50
56
  export declare const useSettingsContext: () => SettingsContextType;
51
- export declare function Settings({ loading, renderLoading, children, view, renderRightAdornment, showRightAdornmentOnHover, ...props }: SettingsProps): React.JSX.Element;
57
+ export declare function Settings({ loading, renderLoading, children, view, renderRightAdornment, renderSectionRightAdornment, showRightAdornmentOnHover, ...props }: SettingsProps): React.JSX.Element;
52
58
  export declare namespace Settings {
53
59
  var Group: ({ children }: SettingsGroupProps) => React.JSX.Element;
54
60
  var Page: ({ children }: SettingsPageProps) => React.JSX.Element;
55
61
  var Section: ({ children }: SettingsSectionProps) => React.JSX.Element;
56
- var Item: ({ title, highlightedTitle, children, align, withBadge, renderTitleComponent, mode, description, }: SettingsItemProps) => React.JSX.Element;
62
+ var Item: (setting: SettingsItemProps) => React.JSX.Element;
57
63
  }
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { IconProps } from '@gravity-ui/uikit';
3
+ import { SettingsSelection } from './Selection/types';
3
4
  export type SettingsMenu = (SettingsMenuGroup | SettingsMenuItem)[];
4
5
  interface SettingsMenuGroup {
5
6
  groupTitle: string;
@@ -18,7 +19,8 @@ export interface SettingsPage {
18
19
  hidden?: boolean;
19
20
  withBadge?: boolean;
20
21
  }
21
- interface SettingsPageSection {
22
+ export interface SettingsPageSection {
23
+ id?: string;
22
24
  title: string;
23
25
  header?: React.ReactNode;
24
26
  items: SettingsItem[];
@@ -26,16 +28,23 @@ interface SettingsPageSection {
26
28
  withBadge?: boolean;
27
29
  showTitle?: boolean;
28
30
  }
29
- interface SettingsItem {
31
+ export interface SettingsItem {
32
+ id?: string;
30
33
  title: string;
31
34
  element: React.ReactElement;
32
35
  hidden: boolean;
33
36
  titleComponent?: React.ReactNode;
34
37
  renderTitleComponent?: (highlightedTitle: React.ReactNode | null) => React.ReactNode;
35
38
  }
39
+ export interface SelectedSettingsPart {
40
+ page?: SettingsPage;
41
+ section?: SettingsPageSection;
42
+ setting?: SettingsItem;
43
+ }
36
44
  interface SettingsDescription {
37
45
  menu: SettingsMenu;
38
46
  pages: Record<string, SettingsPage>;
39
47
  }
40
48
  export declare function getSettingsFromChildren(children: React.ReactNode, searchText?: string): SettingsDescription;
49
+ export declare function getSelectedSettingsPart(pages: Record<string, SettingsPage>, selection: SettingsSelection): SelectedSettingsPart;
41
50
  export {};
@@ -8,7 +8,7 @@ export { L as Lang, c as configure } from './registerKeyset-35f1ea08.js';
8
8
  export { P as ActionBar } from './ActionBar-f1c9a2d3.js';
9
9
  export { T as Title } from './Title-3d579ca4.js';
10
10
  export { H as HotkeysPanel } from './HotkeysPanel-67f3066d.js';
11
- export { S as Settings, u as useSettingsContext } from './Settings-ea96388d.js';
11
+ export { S as Settings, u as useSettingsContext } from './Settings-d2e34d31.js';
12
12
  export { M as MobileHeader, F as MobileHeaderFooterItem } from './FooterItem-d66ab545.js';
13
13
  import './tslib.es6-3cd4e99f.js';
14
14
  import 'react';
@@ -1,4 +1,4 @@
1
- export { S as Settings, u as useSettingsContext } from './Settings-ea96388d.js';
1
+ export { S as Settings, u as useSettingsContext } from './Settings-d2e34d31.js';
2
2
  import './tslib.es6-3cd4e99f.js';
3
3
  import 'react';
4
4
  import './style-inject.es-cfd97593.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/navigation",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Gravity UI Navigation components",
5
5
  "license": "MIT",
6
6
  "repository": {