@gravity-ui/navigation 0.20.0 → 0.21.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.
@@ -7,6 +7,7 @@ export interface SettingsProps {
7
7
  filterPlaceholder?: string;
8
8
  emptyPlaceholder?: string;
9
9
  initialPage?: string;
10
+ initialSearch?: string;
10
11
  onPageChange?: (page: string | undefined) => void;
11
12
  renderNotFound?: () => React.ReactNode;
12
13
  renderLoading?: () => React.ReactNode;
@@ -36,6 +37,7 @@ export interface SettingsSectionProps {
36
37
  }
37
38
  export interface SettingsItemProps {
38
39
  title: string;
40
+ highlightedTitle?: React.ReactNode | null;
39
41
  renderTitleComponent?: (highlightedTitle: React.ReactNode | null) => React.ReactNode;
40
42
  align?: 'top' | 'center';
41
43
  children: React.ReactNode;
@@ -51,5 +53,5 @@ export declare namespace Settings {
51
53
  var Group: ({ children }: SettingsGroupProps) => React.JSX.Element;
52
54
  var Page: ({ children }: SettingsPageProps) => React.JSX.Element;
53
55
  var Section: ({ children }: SettingsSectionProps) => React.JSX.Element;
54
- var Item: ({ title, children, align, withBadge, renderTitleComponent, mode, description, }: SettingsItemProps) => React.JSX.Element;
56
+ var Item: ({ title, highlightedTitle, children, align, withBadge, renderTitleComponent, mode, description, }: SettingsItemProps) => React.JSX.Element;
55
57
  }
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { TextInputSize } from '@gravity-ui/uikit';
3
3
  interface SettingsSearchProps {
4
4
  className?: string;
5
+ initialValue?: string;
5
6
  onChange: (search: string) => void;
6
7
  debounce?: number;
7
8
  inputRef?: React.Ref<HTMLInputElement>;
@@ -9,5 +10,5 @@ interface SettingsSearchProps {
9
10
  placeholder?: string;
10
11
  autoFocus?: boolean;
11
12
  }
12
- export declare function SettingsSearch({ className, onChange, debounce, inputRef, inputSize, placeholder, autoFocus, }: SettingsSearchProps): React.JSX.Element;
13
+ export declare function SettingsSearch({ className, initialValue, onChange, debounce, inputRef, inputSize, placeholder, autoFocus, }: SettingsSearchProps): React.JSX.Element;
13
14
  export {};
@@ -5087,11 +5087,15 @@ function escapeStringForRegExp(input) {
5087
5087
  }
5088
5088
 
5089
5089
  const b$9 = block('settings-search');
5090
- function SettingsSearch({ className, onChange, debounce = 200, inputRef, inputSize, placeholder, autoFocus = true, }) {
5091
- const onChangeStable = useStableCallback(onChange);
5092
- const handleUpdate = React__default.useCallback(debounce_1(onChangeStable, debounce), [debounce]);
5090
+ function SettingsSearch({ className, initialValue, onChange, debounce = 200, inputRef, inputSize, placeholder, autoFocus = true, }) {
5091
+ const [value, setValue] = React__default.useState(initialValue !== null && initialValue !== void 0 ? initialValue : '');
5092
+ const onChangeDebounced = useStableCallback(debounce_1(onChange, debounce));
5093
+ const handleUpdate = useStableCallback((updated) => {
5094
+ setValue(updated);
5095
+ onChangeDebounced(updated);
5096
+ });
5093
5097
  return (React__default.createElement("div", { className: b$9(null, className) },
5094
- React__default.createElement(TextInput, { controlRef: inputRef, hasClear: true, autoFocus: autoFocus, size: inputSize, placeholder: placeholder, onUpdate: handleUpdate })));
5098
+ React__default.createElement(TextInput, { value: value, controlRef: inputRef, hasClear: true, autoFocus: autoFocus, size: inputSize, placeholder: placeholder, onUpdate: handleUpdate })));
5095
5099
  }
5096
5100
 
5097
5101
  var css_248z$8 = ".gn-settings-menu__group-heading {\n font-weight: var(--g-text-accent-font-weight);\n display: inline-block;\n padding: 0 20px;\n margin-bottom: 12px;\n line-height: 18px;\n}\n.gn-settings-menu__group + .gn-settings-menu__group {\n margin-top: 24px;\n}\n.gn-settings-menu__item {\n display: flex;\n align-items: center;\n height: 40px;\n padding: 0 20px;\n cursor: pointer;\n color: var(--g-color-text-primary);\n}\n.gn-settings-menu__item-icon {\n color: var(--g-color-text-misc);\n margin-right: 5px;\n}\n.gn-settings-menu__item:hover, .gn-settings-menu__item_focused {\n background: var(--g-color-base-simple-hover);\n}\n.gn-settings-menu__item_selected {\n background: var(--g-color-base-selection);\n}\n.gn-settings-menu__item_selected:hover, .gn-settings-menu__item_selected.gn-settings-menu__item_focused {\n background: var(--g-color-base-selection-hover);\n}\n.gn-settings-menu__item_disabled {\n color: var(--g-color-text-secondary);\n cursor: auto;\n}\n.gn-settings-menu__item_disabled:hover {\n background: none;\n}\n.gn-settings-menu__item_disabled .gn-settings-menu__item-icon {\n color: var(--g-color-base-misc-heavy);\n}\n.gn-settings-menu__item_badge {\n position: relative;\n}\n.gn-settings-menu__item_badge::after {\n content: \"\";\n display: block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: var(--g-color-text-danger);\n position: absolute;\n right: 9px;\n top: calc(50% - 3px);\n}";
@@ -5363,9 +5367,9 @@ const getPageTitleById = (menu, activePage) => {
5363
5367
  }
5364
5368
  return '';
5365
5369
  };
5366
- function SettingsContent({ initialPage, children, renderNotFound, title = i18n$1('label_title'), filterPlaceholder = i18n$1('label_filter-placeholder'), emptyPlaceholder = i18n$1('label_empty-placeholder'), view, onPageChange, onClose, }) {
5370
+ function SettingsContent({ initialPage, initialSearch, children, renderNotFound, title = i18n$1('label_title'), filterPlaceholder = i18n$1('label_filter-placeholder'), emptyPlaceholder = i18n$1('label_empty-placeholder'), view, onPageChange, onClose, }) {
5367
5371
  var _a, _b;
5368
- const [search, setSearch] = React__default.useState('');
5372
+ const [search, setSearch] = React__default.useState(initialSearch !== null && initialSearch !== void 0 ? initialSearch : '');
5369
5373
  const { menu, pages } = getSettingsFromChildren(children, search);
5370
5374
  const pageKeys = Object.keys(pages);
5371
5375
  const [selectedPage, setCurrentPage] = React__default.useState(initialPage && pageKeys.includes(initialPage) ? initialPage : undefined);
@@ -5414,13 +5418,13 @@ function SettingsContent({ initialPage, children, renderNotFound, title = i18n$1
5414
5418
  section.showTitle && (React__default.createElement("h3", { className: b$6('section-heading') }, section.title)),
5415
5419
  section.header &&
5416
5420
  (isMobile ? (React__default.createElement("div", { className: b$6('section-subheader') }, section.header)) : (section.header)),
5417
- section.items.map(({ hidden, title, element }) => hidden ? null : (React__default.createElement("div", { key: title, className: b$6('section-item') }, React__default.cloneElement(element, Object.assign(Object.assign({}, element.props), { title: search && title
5421
+ section.items.map(({ hidden, title, element }) => hidden ? null : (React__default.createElement("div", { key: title, className: b$6('section-item') }, React__default.cloneElement(element, Object.assign(Object.assign({}, element.props), { highlightedTitle: search && title
5418
5422
  ? prepareTitle(title, search)
5419
5423
  : title })))))))))));
5420
5424
  };
5421
5425
  return (React__default.createElement("div", { className: b$6({ view }) },
5422
5426
  isMobile ? (React__default.createElement(React__default.Fragment, null,
5423
- React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), onChange: setSearch, autoFocus: false, inputSize: 'l' }),
5427
+ React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), initialValue: initialSearch, onChange: setSearch, autoFocus: false, inputSize: 'l' }),
5424
5428
  React__default.createElement(SettingsMenuMobile, { items: menu, onChange: handlePageChange, activeItemId: activePage, className: b$6('tabs') }))) : (React__default.createElement("div", { className: b$6('menu'), onClick: () => {
5425
5429
  if (searchInputRef.current) {
5426
5430
  searchInputRef.current.focus();
@@ -5433,7 +5437,7 @@ function SettingsContent({ initialPage, children, renderNotFound, title = i18n$1
5433
5437
  }
5434
5438
  } },
5435
5439
  React__default.createElement(Title, null, title),
5436
- React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), onChange: setSearch, placeholder: filterPlaceholder, autoFocus: true }),
5440
+ React__default.createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), initialValue: initialSearch, onChange: setSearch, placeholder: filterPlaceholder, autoFocus: true }),
5437
5441
  React__default.createElement(SettingsMenu, { ref: menuRef, items: menu, onChange: handlePageChange, activeItemId: activePage }))),
5438
5442
  React__default.createElement("div", { className: b$6('page') }, renderPageContent())));
5439
5443
  }
@@ -5446,9 +5450,9 @@ Settings.Page = function SettingsPage({ children }) {
5446
5450
  Settings.Section = function SettingsSection({ children }) {
5447
5451
  return React__default.createElement(React__default.Fragment, null, children);
5448
5452
  };
5449
- Settings.Item = function SettingsItem({ title, children, align = 'center', withBadge, renderTitleComponent = identity_1, mode, description, }) {
5453
+ Settings.Item = function SettingsItem({ title, highlightedTitle, children, align = 'center', withBadge, renderTitleComponent = identity_1, mode, description, }) {
5450
5454
  const { renderRightAdornment, showRightAdornmentOnHover } = useSettingsContext();
5451
- const titleNode = (React__default.createElement("span", { className: b$6('item-title', { badge: withBadge }) }, renderTitleComponent(title)));
5455
+ const titleNode = (React__default.createElement("span", { className: b$6('item-title', { badge: withBadge }) }, renderTitleComponent(highlightedTitle)));
5452
5456
  return (React__default.createElement("div", { className: b$6('item', { align, mode }) },
5453
5457
  React__default.createElement("label", { className: b$6('item-heading') },
5454
5458
  renderRightAdornment ? (React__default.createElement(Flex, { className: b$6('item-title-wrapper'), gap: 3 },