ChipChoice.Single

Чип с выпадающим списком опций и одиночным выбором. Текущее значение отображается в лейбле чипа, список открывается кликом и рендерится через портал.

Когда использовать

  • Для выбора одного значения из набора прямо в ряду фильтров: статус, владелец, категория.
  • Когда выбор должен выглядеть как компактный чип, а не полноценный Select в форме.
  • Когда списку нужен поиск по опциям — через проп searchable.

Когда не нужен ChipChoice.Single:

  • Нужно выбрать несколько значений одновременно:
  • Нужно inline-действие без выбора:
  • Нужна классическая кнопка действия:
    • используйте Button.

Анатомия

Size (default s)

  • s — для плотных тулбаров и строк фильтров.
  • m — стандартный размер.
  • l — для крупных форм.

Apply mode

Режим применения выбора управляется пропом autoApply.

  • autoApply (default true) — выбор опции применяется сразу и закрывает список.
  • autoApply={false} — внизу списка появляется футер с кнопками Apply/Cancel; изменение фиксируется через onApprove, отмена — через onCancel.

Searchable

  • searchable — добавляет поле поиска в выпадающий список, опции фильтруются по введённому тексту.

Уместно для списков от 6–7 опций, где скролл становится неудобным.

Состояния

  • disabled — отключает взаимодействие.
  • loading — показывает спиннер и блокирует открытие списка.

Установка

pnpm add @cloud-ru/ds-chips
import { ChipChoice } from '@cloud-ru/ds-chips'

Примеры использования

Одиночный выбор

Одиночный выборКонтролируемое значение через useState
tsx
import { ChipChoice } from '@cloud-ru/ds-chips';
import { useState } from 'react';

const OPTIONS = [
  { value: 'active', label: 'Активный' },
  { value: 'inactive', label: 'Неактивный' },
  { value: 'archived', label: 'В архиве' },
];

export function ChoiceSingleBasic() {
  const [value, setValue] = useState<string | number | undefined>('active');

  return <ChipChoice.Single label='Status' options={OPTIONS} value={value} onChange={setValue} />;
}

С поиском

С поискомsearchable добавляет поле поиска по опциям
tsx
import { ChipChoice } from '@cloud-ru/ds-chips';
import { useState } from 'react';

const OPTIONS = [
  { value: 'design', label: 'Дизайн' },
  { value: 'frontend', label: 'Фронтенд' },
  { value: 'backend', label: 'Бэкенд' },
  { value: 'analytics', label: 'Аналитика' },
  { value: 'qa', label: 'Тестирование' },
  { value: 'devops', label: 'DevOps' },
];

export function ChoiceSingleSearchable() {
  const [value, setValue] = useState<string | number | undefined>('frontend');

  return <ChipChoice.Single searchable label='Team' options={OPTIONS} value={value} onChange={setValue} />;
}

Ручное применение

Ручное применениеautoApply={false} — футер с Apply/Cancel
tsx
import { ChipChoice } from '@cloud-ru/ds-chips';
import { useState } from 'react';

const OPTIONS = [
  { value: 'anna', label: 'Анна' },
  { value: 'boris', label: 'Борис' },
  { value: 'vera', label: 'Вера' },
];

export function ChoiceSingleManualApply() {
  const [value, setValue] = useState<string | number | undefined>('anna');

  return <ChipChoice.Single autoApply={false} label='Owner' options={OPTIONS} value={value} onChange={setValue} />;
}

Props

Types

PropsChipChoiceSingleProps
PropTypeDefaultRequiredDescription
autoApplybooleantruenoФлаг, отвечающий за применение выбранного значения по умолчанию
classNamestringnoCSS-класс
contentRender((option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => ReactNode) | undefinednoКастомный рендер контента опции
data-test-idstringno
dataErrorbooleannoЗагрузка данных завершилась ошибкой: показывается `errorDataState`
dataFilteredbooleannoТекущий пустой список — результат поиска/фильтра: показывается `noResultsState` вместо `noDataState`
defaultValueItemIdnoНачальное состояние
disableFuzzySearchbooleanfalsenoОтключает Fuzzy Search
disabledbooleannoОтключён
dropDownClassNamestringno
errorDataStateEmptyStatePropsnoЭкран при ошибке запроса
filterFn((option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => boolean) | undefinednoФункция фильтрации опций
footerReactNode ;noКастомизируемый элемент в конце списка
footerActiveElementsRefsRefObject<HTMLElement>[]noСписок ссылок на кастомные элементы, помещенные в специальную секцию внизу списка
iconReactNodenoИконка
labelstringnoТекст чипа
loadingbooleannoСостояние загрузки Флаг, отвечающий за состояние загрузки списка
noDataStateEmptyStatePropsnoЭкран при отсутствии данных
noResultsStateEmptyStatePropsnoЭкран при отсутствии результатов поиска или фильтров
onApprove(() => void)noКолбек основной кнопки
onCancel(() => void)noКолбек кнопки отмены
onChangeOnChangeHandler<ItemId>noControlled обработчик изменения состояния — получает выбранный `ItemId`
onClearButtonClickMouseEventHandler<HTMLButtonElement>noКолбек для клика по кнопке очистки
onClickMouseEventHandler<HTMLButtonElement | HTMLDivElement>noКолбек обработки клика
onOpenChange((isOpen: boolean) => void)noКолбек отображения компонента
openbooleannoУправляет состоянием показан/не показан
optionsFilterOption<T>[]yesМассив опций
placement"bottom" | "bottom-end" | "bottom-start" | "left" | "left-end" | "left-start" | "right" | "right-end" | "right-start" | "top" | "top-end" | "top-start"noРасположение выпадающего меню
scrollContainerRefRef<HTMLElement>noСсылка на контейнер, который скроллится
scrollRefRef<HTMLElement>noСсылка на элемент, обозначающий самый конец прокручиваемого списка
scrollToSelectedItembooleannoФлаг, отвечающий за прокручивание до выбранного элемента
searchablebooleannoПоказывать строку поиска в дроплисте
selectionSelectionMultipleState | SelectionSingleStatenoНастройки выбора элементов. `mode: 'single'` — один выбранный элемент (`value: ItemId`), `mode: 'multiple'` — множественный выбор (`value: ItemId[]`). Без `selection` выбора нет — клик вызывает только `onClick` элемента.
size"l" | "m" | "s"mnoРазмер
tabIndexnumbernoИндекс в порядке фокусировки
truncateVariant"end" | "middle"'middle'noВариант обрезания строки Вариант обрезания значения
valueItemIdnoControlled состояние
valueRender((option?: BaseOption<T>) => ReactNode)noКолбек формирующий отображение выбранного значения
virtualizedbooleannoВключить виртуализацию элементов списка. Рекомендуется при количестве элементов от 1000.
widthStrategy"auto" | "eq" | "gte"gtenoСтратегия управления шириной контейнера поповера

Storybook

Figma

Смотри также

  • ChipChoice.Multiple — чип-селектор с множественным выбором.
  • Chips — обзор семейства чипов.