@cloud-ru/ds-toggles

中文文档
1.1.16发布于 2026/11/11Apache-2.0TypeScriptESM + CJS近 30 天下载 1.4万

Пакет компонентов выбора и переключения — Checkbox, Radio, Switch, Favourite и контейнер ToggleGroup с общими токенами размеров и состояний.

原始使用文档
文档目录26 节
  1. Установка
  2. Checkbox
  3. Когда использовать
  4. Анатомия
  5. Примеры использования
  6. Props
  7. Radio
  8. Когда использовать
  9. Анатомия
  10. Примеры использования
  11. Props
  12. Switch
  13. Когда использовать
  14. Анатомия
  15. Примеры использования
  16. Props
  17. Favourite
  18. Когда использовать
  19. Анатомия
  20. Примеры использования
  21. Props
  22. ToggleGroup
  23. Когда использовать
  24. Анатомия
  25. Примеры использования
  26. Props

Toggles

@cloud-ru/ds-toggles — Пакет компонентов выбора и переключения — Checkbox, Radio, Switch, Favourite и контейнер ToggleGroup с общими токенами размеров и состояний.

Пакет @cloud-ru/ds-toggles объединяет пять компонентов для бинарных и мультиполярных состояний. Все компоненты разделяют единое API (size, checked/defaultChecked, disabled, loading, onChange) и два размера (xs, s).

Установка

pnpm add @cloud-ru/ds-toggles
import { Checkbox, Radio, Switch, Favourite, ToggleGroup } from '@cloud-ru/ds-toggles'

Checkbox

Чекбокс для множественного выбора — два размера, состояния checked/indeterminate/disabled/loading и единое API с остальными toggles.

Чекбокс для множественного выбора из списка. Поддерживает три визуальных состояния — unchecked / checked / indeterminate — плюс disabled и loading.

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

  • Для множественного выбора из двух или более независимых опций.
  • Для согласий («Я согласен с условиями»), чек-листов, фильтров.
  • Для «выбрать всё» в группе — индикатор частичного выбора (indeterminate).

Когда не нужен Checkbox: для взаимоисключающего выбора — используйте Radio, для on/off настроек — Switch.

Анатомия

Size

xs — для плотных таблиц и инлайновых списков, s — дефолт в формах.

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

1. Базовый чекбокс

import { Checkbox } from '@cloud-ru/ds-toggles';

export function CheckboxBasic() {
  return <Checkbox defaultChecked />;
}

2. Indeterminate

Используется для частично выбранной группы

import { Checkbox } from '@cloud-ru/ds-toggles';

export function CheckboxIndeterminate() {
  return <Checkbox indeterminateDefault />;
}

3. Все состояния

import { Checkbox } from '@cloud-ru/ds-toggles';

export function CheckboxStates() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <Checkbox />
      <Checkbox defaultChecked />
      <Checkbox disabled />
      <Checkbox disabled defaultChecked />
      <Checkbox loading />
    </div>
  );
}

Props

CheckboxProps

PropTypeDefaultDescription
autofocusboolean—HTML-аттрибут autofocus
checkedboolean—HTML-аттрибут checked
classNamestring—CSS-класс
data-test-idstring—
defaultCheckedboolean—HTML-аттрибут checked по-умолчанию
disabledbooleanfalseHTML-аттрибут disabled
idstring—HTML-аттрибут id
indeterminateboolean—Состояние частичного выбора
indeterminateDefaultboolean—Состояние частичного выбора по-умолчанию
inputRefRefObject<HTMLInputElement>—
loadingbooleanfalseСостояние загрузки
namestring—HTML-аттрибут name
onBlurFocusEventHandler<HTMLInputElement>—Колбек потери фокуса
onChange((checked: boolean) => void)—Колбек смены значения
onClickMouseEventHandler<HTMLInputElement>—Колбек клика
onFocusFocusEventHandler<HTMLInputElement>—Колбек приобретения фокуса
size"s" | "xs"sРазмер
tabIndexnumber—HTML-аттрибут tab-index
valuestring—HTML-аттрибут value
  • Size = "s" | "xs"

Radio

Радиокнопка для взаимоисключающего выбора из группы опций — два размера, state controlled/uncontrolled, единое API с остальными toggles.

Радиокнопка для взаимоисключающего выбора из группы опций. Группировка — через общий name или через компонент ToggleGroup с selectionMode='single'.

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

  • Для выбора одной опции из 2–5 взаимоисключающих вариантов.
  • Когда все варианты должны быть видны одновременно (иначе используйте Select).

Когда не нужен Radio: для множественного выбора — Checkbox, для on/off — Switch.

Анатомия

Size

xs — для плотных списков опций, s — дефолт в формах.

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

1. Базовый Radio

import { Radio } from '@cloud-ru/ds-toggles';

export function RadioBasic() {
  return <Radio defaultChecked />;
}

2. Группа радиокнопок

Общий name объединяет Radio в группу; выбор переключается автоматически

import { Radio } from '@cloud-ru/ds-toggles';

export function RadioGroup() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <label htmlFor='delivery-courier'>
        <Radio id='delivery-courier' name='delivery' value='courier' defaultChecked /> Курьер
      </label>
      <label htmlFor='delivery-pickup'>
        <Radio id='delivery-pickup' name='delivery' value='pickup' /> Самовывоз
      </label>
      <label htmlFor='delivery-post'>
        <Radio id='delivery-post' name='delivery' value='post' /> Почта
      </label>
    </div>
  );
}

3. Все состояния

import { Radio } from '@cloud-ru/ds-toggles';

export function RadioStates() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <Radio />
      <Radio defaultChecked />
      <Radio disabled />
      <Radio disabled defaultChecked />
      <Radio loading />
    </div>
  );
}

Props

RadioProps

PropTypeDefaultDescription
autofocusboolean—HTML-аттрибут autofocus
checkedboolean—HTML-аттрибут checked
classNamestring—CSS-класс
data-test-idstring—
defaultCheckedboolean—HTML-аттрибут checked по-умолчанию
disabledbooleanfalseHTML-аттрибут disabled
idstring—HTML-аттрибут id
inputRefRefObject<HTMLInputElement>—
loadingbooleanfalseСостояние загрузки
namestring—HTML-аттрибут name
onBlurFocusEventHandler<HTMLInputElement>—Колбек потери фокуса
onChange((checked: boolean) => void)—Колбек смены значения
onClickMouseEventHandler<HTMLInputElement>—Колбек клика
onFocusFocusEventHandler<HTMLInputElement>—Колбек приобретения фокуса
size"s" | "xs"sРазмер
tabIndexnumber—HTML-аттрибут tab-index
valuestring—HTML-аттрибут value
  • Size = "s" | "xs"

Switch

Переключатель on/off для бинарных настроек — два размера, моментальное применение без подтверждения, единое API с остальными toggles.

Переключатель on/off для бинарных настроек с моментальным применением. В отличие от Checkbox, Switch меняет состояние сразу — без кнопки «Сохранить».

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

  • Для бинарных настроек пользователя, применяемых немедленно (уведомления, тёмная тема).
  • В ситуациях, где не нужен пакетный apply/cancel.

Когда не нужен Switch: если изменение требует подтверждения — используйте Checkbox с кнопкой submit.

Анатомия

Size

xs — для плотных настроек и таблиц, s — дефолт в формах и карточках.

Icon (default false)

По умолчанию ползунок — пустой круг. showIcon добавляет галочку в состоянии «включено». Спиннер состояния loading показывается независимо от showIcon.

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

1. Базовый Switch

import { Switch } from '@cloud-ru/ds-toggles';

export function SwitchBasic() {
  return <Switch defaultChecked />;
}

2. Два размера

import { Switch } from '@cloud-ru/ds-toggles';

export function SwitchSizes() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <Switch size='xs' defaultChecked />
      <Switch size='s' defaultChecked />
    </div>
  );
}

3. Все состояния

import { Switch } from '@cloud-ru/ds-toggles';

export function SwitchStates() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <Switch />
      <Switch defaultChecked />
      <Switch disabled />
      <Switch disabled defaultChecked />
      <Switch loading />
    </div>
  );
}

Props

SwitchProps

PropTypeDefaultDescription
autofocusboolean—HTML-аттрибут autofocus
checkedboolean—HTML-аттрибут checked
classNamestring—CSS-класс
data-test-idstring—
defaultCheckedboolean—HTML-аттрибут checked по-умолчанию
disabledbooleanfalseHTML-аттрибут disabled
idstring—HTML-аттрибут id
inputRefRefObject<HTMLInputElement>—
loadingbooleanfalseСостояние загрузки
namestring—HTML-аттрибут name
onBlurFocusEventHandler<HTMLInputElement>—Колбек потери фокуса
onChange((checked: boolean) => void)—Колбек смены значения
onClickMouseEventHandler<HTMLInputElement>—Колбек клика
onFocusFocusEventHandler<HTMLInputElement>—Колбек приобретения фокуса
showIconbooleanfalseПоказывать ли иконку внутри ползунка. Спиннер в состоянии loading показывается независимо
size"s" | "xs"sРазмер
tabIndexnumber—HTML-аттрибут tab-index
valuestring—HTML-аттрибут value
  • Size = "s" | "xs"

Favourite

Toggle для избранного — звезда или сердце, два размера, единое API с остальными toggles.

Toggle для «избранного» — карточка товара, трек в плейлисте, пост в ленте. Переключается между пустой и заполненной иконкой (звезда или сердце).

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

  • «Добавить в избранное», «лайк», «в wishlist».
  • Каталоги, ленты, плейлисты — любой UI с персональными коллекциями.

Когда не нужен Favourite: для булевых настроек — Switch; для выбора опций — Checkbox.

Анатомия

Size

xs — для плотных списков, s — дефолт в карточках.

Favourite icon

Форма иконки: star — «в избранное», heart — «нравится».

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

1. Звезда

import { Favourite } from '@cloud-ru/ds-toggles';

export function FavouriteStar() {
  return <Favourite icon='star' defaultChecked />;
}

2. Сердце

import { Favourite } from '@cloud-ru/ds-toggles';

export function FavouriteHeart() {
  return <Favourite icon='heart' defaultChecked />;
}

3. Все состояния

import { Favourite } from '@cloud-ru/ds-toggles';

export function FavouriteStates() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <Favourite icon='star' />
      <Favourite icon='star' defaultChecked />
      <Favourite icon='heart' disabled />
      <Favourite icon='heart' loading />
    </div>
  );
}

Props

FavouriteProps

PropTypeDefaultDescription
autofocusboolean—HTML-аттрибут autofocus
checkedboolean—HTML-аттрибут checked
classNamestring—CSS-класс
data-test-idstring—
defaultCheckedboolean—HTML-аттрибут checked по-умолчанию
disabledbooleanfalseHTML-аттрибут disabled
icon"heart" | "star"heartВариант иконки: звезда или сердце
idstring—HTML-аттрибут id
inputRefRefObject<HTMLInputElement>—
loadingbooleanfalseСостояние загрузки
namestring—HTML-аттрибут name
onBlurFocusEventHandler<HTMLInputElement>—Колбек потери фокуса
onChange((checked: boolean) => void)—Колбек смены значения
onClickMouseEventHandler<HTMLInputElement>—Колбек клика
onFocusFocusEventHandler<HTMLInputElement>—Колбек приобретения фокуса
onKeyUpKeyboardEventHandler<HTMLSpanElement>—Обработчик keyup
size"s" | "xs"sРазмер
tabIndexnumber—HTML-аттрибут tab-index
valuestring—HTML-аттрибут value
  • FavouriteIcon = "heart" | "star"

  • Size = "s" | "xs"

ToggleGroup

Контейнер для группы связанных toggle'ов — single или multiple selection через общий context + useToggleGroup.

Контейнер для группы связанных toggle'ов (чипы, опции, сегментированный контрол) с общим режимом выбора. Предоставляет React Context — потомки читают текущий выбор через useToggleGroup.

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

  • Сегментированный контрол (выбор размера, периода, типа).
  • Чипы-фильтры с selectionMode='multiple'.
  • Любые связанные опции, где нужен shared state + unified controlled API.

Когда не нужен ToggleGroup: одна опция — Switch или Checkbox; взаимоисключающий выбор с нативной семантикой radio — группа Radio c общим name.

Анатомия

Mode

Тип дочерних контролов: checkbox — мультивыбор/независимые, radio — одиночный выбор.

Size

Размер вложенных тогглов: xs — плотный, s — дефолт.

Selection mode

Правила выбора: single — ровно один элемент (как radio-group), multiple — любое подмножество (как checkbox-group).

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

1. Single selection (сегментированный контрол)

import { ToggleGroup, useToggleGroup } from '@cloud-ru/ds-toggles';
import { useState } from 'react';

function Chip({ id, label }: { id: string; label: string }) {
  const { isChecked, handleClick } = useToggleGroup({ value: id });
  return (
    <button onClick={handleClick} aria-pressed={isChecked}>
      {label}
    </button>
  );
}

export function ToggleGroupSingle() {
  const [value, setValue] = useState<string | undefined>('a');
  return (
    <ToggleGroup selectionMode='single' value={value} onChange={setValue}>
      <Chip id='a' label='A' />
      <Chip id='b' label='B' />
      <Chip id='c' label='C' />
    </ToggleGroup>
  );
}

2. Multiple selection (чипы-фильтры)

import { ToggleGroup, useToggleGroup } from '@cloud-ru/ds-toggles';
import { useState } from 'react';

function Chip({ id, label }: { id: string; label: string }) {
  const { isChecked, handleClick } = useToggleGroup({ value: id });
  return (
    <button onClick={handleClick} aria-pressed={isChecked}>
      {label}
    </button>
  );
}

export function ToggleGroupMultiple() {
  const [value, setValue] = useState<string[]>(['a']);
  return (
    <ToggleGroup selectionMode='multiple' value={value} onChange={next => setValue(next ?? [])}>
      <Chip id='a' label='A' />
      <Chip id='b' label='B' />
      <Chip id='c' label='C' />
    </ToggleGroup>
  );
}

3. Controlled + отображение значения

import { ToggleGroup, useToggleGroup } from '@cloud-ru/ds-toggles';
import { useState } from 'react';

function Option({ id, label }: { id: string; label: string }) {
  const { isChecked, handleClick } = useToggleGroup({ value: id });
  return (
    <button onClick={handleClick} aria-pressed={isChecked}>
      {label}
    </button>
  );
}

export function ToggleGroupControlled() {
  const [value, setValue] = useState<string | undefined>();
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <ToggleGroup selectionMode='single' value={value} onChange={setValue}>
        <Option id='s' label='S' />
        <Option id='m' label='M' />
        <Option id='l' label='L' />
      </ToggleGroup>
      <p>Selected: {value ?? '—'}</p>
    </div>
  );
}

Props

ToggleGroupProps

PropTypeDefaultDescription
childrenstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—
defaultValuestring | string[]—Начальное состояние
onChange((value: string) => void) | ((value: string[]) => void) | undefined—Controlled обработчик измения состояния
selectionMode"multiple" | "single"singleРежим выбора
valuestring | string[]—Controlled состояние

版本与发布记录

@cloud-ru/ds-toggles 共发布 64 个版本,首次发布于 2026/08/18;过去 12 个月发布了 64 个版本。

版本发布日期距今
1.1.16latest2026/11/11今天
1.1.16-preview-e8fe6b56.0preview2026/11/11今天
1.1.16-preview-c0e895ed.02026/11/11今天
1.1.16-preview-90b10112.02026/11/11今天
1.1.16-preview-fd7dd437.02026/11/101 天前
1.1.16-preview-9a75a2a9.02026/11/101 天前

关于 @cloud-ru/ds-toggles 的常见问题

@cloud-ru/ds-toggles 是什么?

Пакет компонентов выбора и переключения — Checkbox, Radio, Switch, Favourite и контейнер ToggleGroup с общими токенами размеров и состояний.

如何安装 @cloud-ru/ds-toggles?

在项目目录运行 npm install @cloud-ru/ds-toggles,或使用 pnpm add / yarn add / bun add。

@cloud-ru/ds-toggles 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@cloud-ru/ds-toggles 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@cloud-ru/ds-toggles 可以商用吗?

@cloud-ru/ds-toggles 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@cloud-ru/ds-toggles 的下载量有多少?

根据 npm 官方下载统计,@cloud-ru/ds-toggles 在 2026/10/10 – 2026/11/08 这 30 天内被下载 13,580 次,日均约 453 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cloud-ru/ds-toggles 还在维护吗?

最新版本 1.1.16 发布于 2026/11/11(今天);至今共发布 64 个版本,其中过去 12 个月发布了 64 个;首次发布于 2026/08/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。