@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 {};
@@ -5114,11 +5114,15 @@ function escapeStringForRegExp(input) {
5114
5114
  }
5115
5115
 
5116
5116
  const b$9 = block('settings-search');
5117
- function SettingsSearch({ className, onChange, debounce = 200, inputRef, inputSize, placeholder, autoFocus = true, }) {
5118
- const onChangeStable = useStableCallback(onChange);
5119
- const handleUpdate = React__default["default"].useCallback(debounce_1(onChangeStable, debounce), [debounce]);
5117
+ function SettingsSearch({ className, initialValue, onChange, debounce = 200, inputRef, inputSize, placeholder, autoFocus = true, }) {
5118
+ const [value, setValue] = React__default["default"].useState(initialValue !== null && initialValue !== void 0 ? initialValue : '');
5119
+ const onChangeDebounced = useStableCallback(debounce_1(onChange, debounce));
5120
+ const handleUpdate = useStableCallback((updated) => {
5121
+ setValue(updated);
5122
+ onChangeDebounced(updated);
5123
+ });
5120
5124
  return (React__default["default"].createElement("div", { className: b$9(null, className) },
5121
- React__default["default"].createElement(uikit.TextInput, { controlRef: inputRef, hasClear: true, autoFocus: autoFocus, size: inputSize, placeholder: placeholder, onUpdate: handleUpdate })));
5125
+ React__default["default"].createElement(uikit.TextInput, { value: value, controlRef: inputRef, hasClear: true, autoFocus: autoFocus, size: inputSize, placeholder: placeholder, onUpdate: handleUpdate })));
5122
5126
  }
5123
5127
 
5124
5128
  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}";
@@ -5390,9 +5394,9 @@ const getPageTitleById = (menu, activePage) => {
5390
5394
  }
5391
5395
  return '';
5392
5396
  };
5393
- 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, }) {
5397
+ 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, }) {
5394
5398
  var _a, _b;
5395
- const [search, setSearch] = React__default["default"].useState('');
5399
+ const [search, setSearch] = React__default["default"].useState(initialSearch !== null && initialSearch !== void 0 ? initialSearch : '');
5396
5400
  const { menu, pages } = getSettingsFromChildren(children, search);
5397
5401
  const pageKeys = Object.keys(pages);
5398
5402
  const [selectedPage, setCurrentPage] = React__default["default"].useState(initialPage && pageKeys.includes(initialPage) ? initialPage : undefined);
@@ -5441,13 +5445,13 @@ function SettingsContent({ initialPage, children, renderNotFound, title = i18n$1
5441
5445
  section.showTitle && (React__default["default"].createElement("h3", { className: b$6('section-heading') }, section.title)),
5442
5446
  section.header &&
5443
5447
  (isMobile ? (React__default["default"].createElement("div", { className: b$6('section-subheader') }, section.header)) : (section.header)),
5444
- section.items.map(({ hidden, title, element }) => hidden ? null : (React__default["default"].createElement("div", { key: title, className: b$6('section-item') }, React__default["default"].cloneElement(element, Object.assign(Object.assign({}, element.props), { title: search && title
5448
+ section.items.map(({ hidden, title, element }) => hidden ? null : (React__default["default"].createElement("div", { key: title, className: b$6('section-item') }, React__default["default"].cloneElement(element, Object.assign(Object.assign({}, element.props), { highlightedTitle: search && title
5445
5449
  ? prepareTitle(title, search)
5446
5450
  : title })))))))))));
5447
5451
  };
5448
5452
  return (React__default["default"].createElement("div", { className: b$6({ view }) },
5449
5453
  isMobile ? (React__default["default"].createElement(React__default["default"].Fragment, null,
5450
- React__default["default"].createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), onChange: setSearch, autoFocus: false, inputSize: 'l' }),
5454
+ React__default["default"].createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), initialValue: initialSearch, onChange: setSearch, autoFocus: false, inputSize: 'l' }),
5451
5455
  React__default["default"].createElement(SettingsMenuMobile, { items: menu, onChange: handlePageChange, activeItemId: activePage, className: b$6('tabs') }))) : (React__default["default"].createElement("div", { className: b$6('menu'), onClick: () => {
5452
5456
  if (searchInputRef.current) {
5453
5457
  searchInputRef.current.focus();
@@ -5460,7 +5464,7 @@ function SettingsContent({ initialPage, children, renderNotFound, title = i18n$1
5460
5464
  }
5461
5465
  } },
5462
5466
  React__default["default"].createElement(Title, null, title),
5463
- React__default["default"].createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), onChange: setSearch, placeholder: filterPlaceholder, autoFocus: true }),
5467
+ React__default["default"].createElement(SettingsSearch, { inputRef: searchInputRef, className: b$6('search'), initialValue: initialSearch, onChange: setSearch, placeholder: filterPlaceholder, autoFocus: true }),
5464
5468
  React__default["default"].createElement(SettingsMenu, { ref: menuRef, items: menu, onChange: handlePageChange, activeItemId: activePage }))),
5465
5469
  React__default["default"].createElement("div", { className: b$6('page') }, renderPageContent())));
5466
5470
  }
@@ -5473,9 +5477,9 @@ Settings.Page = function SettingsPage({ children }) {
5473
5477
  Settings.Section = function SettingsSection({ children }) {
5474
5478
  return React__default["default"].createElement(React__default["default"].Fragment, null, children);
5475
5479
  };
5476
- Settings.Item = function SettingsItem({ title, children, align = 'center', withBadge, renderTitleComponent = identity_1, mode, description, }) {
5480
+ Settings.Item = function SettingsItem({ title, highlightedTitle, children, align = 'center', withBadge, renderTitleComponent = identity_1, mode, description, }) {
5477
5481
  const { renderRightAdornment, showRightAdornmentOnHover } = useSettingsContext();
5478
- const titleNode = (React__default["default"].createElement("span", { className: b$6('item-title', { badge: withBadge }) }, renderTitleComponent(title)));
5482
+ const titleNode = (React__default["default"].createElement("span", { className: b$6('item-title', { badge: withBadge }) }, renderTitleComponent(highlightedTitle)));
5479
5483
  return (React__default["default"].createElement("div", { className: b$6('item', { align, mode }) },
5480
5484
  React__default["default"].createElement("label", { className: b$6('item-heading') },
5481
5485
  renderRightAdornment ? (React__default["default"].createElement(uikit.Flex, { className: b$6('item-title-wrapper'), gap: 3 },