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Флаг, отвечающий за применение выбранного значения по умолчанию
classNamestring—noCSS-класс
contentRender((option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => ReactNode) | undefined—noКастомный рендер контента опции
data-test-idstring—no
dataErrorboolean—noЗагрузка данных завершилась ошибкой: показывается `errorDataState`
dataFilteredboolean—noТекущий пустой список — результат поиска/фильтра: показывается `noResultsState` вместо `noDataState`
defaultValueItemId—noНачальное состояние
disableFuzzySearchbooleanfalsenoОтключает Fuzzy Search
disabledboolean—noОтключён
dropDownClassNamestring—no
errorDataStateEmptyStateProps—noЭкран при ошибке запроса
filterFn((option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => boolean) | undefined—noФункция фильтрации опций
footerReactNode ;—noКастомизируемый элемент в конце списка
footerActiveElementsRefsRefObject<HTMLElement>[]—noСписок ссылок на кастомные элементы, помещенные в специальную секцию внизу списка
iconReactNode—noИконка
labelstring—noТекст чипа
loadingboolean—noСостояние загрузки Флаг, отвечающий за состояние загрузки списка
noDataStateEmptyStateProps—noЭкран при отсутствии данных
noResultsStateEmptyStateProps—noЭкран при отсутствии результатов поиска или фильтров
onApprove(() => void)—noКолбек основной кнопки
onCancel(() => void)—noКолбек кнопки отмены
onChangeOnChangeHandler<ItemId>—noControlled обработчик изменения состояния — получает выбранный `ItemId`
onClearButtonClickMouseEventHandler<HTMLButtonElement>—noКолбек для клика по кнопке очистки
onClickMouseEventHandler<HTMLButtonElement | HTMLDivElement>—noКолбек обработки клика
onOpenChange((isOpen: boolean) => void)—noКолбек отображения компонента
openboolean—noУправляет состоянием показан/не показан
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Ссылка на элемент, обозначающий самый конец прокручиваемого списка
scrollToSelectedItemboolean—noФлаг, отвечающий за прокручивание до выбранного элемента
searchableboolean—noПоказывать строку поиска в дроплисте
selectionSelectionMultipleState | SelectionSingleState—noНастройки выбора элементов. `mode: 'single'` — один выбранный элемент (`value: ItemId`), `mode: 'multiple'` — множественный выбор (`value: ItemId[]`). Без `selection` выбора нет — клик вызывает только `onClick` элемента.
size"l" | "m" | "s"mnoРазмер
tabIndexnumber—noИндекс в порядке фокусировки
truncateVariant"end" | "middle"'middle'noВариант обрезания строки Вариант обрезания значения
valueItemId—noControlled состояние
valueRender((option?: BaseOption<T>) => ReactNode)—noКолбек формирующий отображение выбранного значения
virtualizedboolean—noВключить виртуализацию элементов списка. Рекомендуется при количестве элементов от 1000.
widthStrategy"auto" | "eq" | "gte"gtenoСтратегия управления шириной контейнера поповера

Storybook

Figma

Смотри также

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