@cloud-ru/ds-segment-control

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

Сегментированный переключатель — компактная радио-группа с единственным выбором, токенами размеров s/m/l, иконками, счётчиками и режимом полной ширины.

原始使用文档
文档目录16 节
  1. Когда использовать
  2. Анатомия
  3. Size (default m )
  4. Width (default auto )
  5. Outline (default false )
  6. Segment slots
  7. Установка
  8. Примеры использования
  9. 1. Базовый сценарий
  10. 2. Все размеры
  11. 3. С иконками и icon-only
  12. 4. Со счётчиком
  13. 5. Полная ширина и outline
  14. 6. Disabled сегмент
  15. 7. Controlled с useState
  16. Props

SegmentControl

@cloud-ru/ds-segment-control — Сегментированный переключатель — компактная радио-группа с единственным выбором, токенами размеров s/m/l, иконками, счётчиками и режимом полной ширины.

Радио-группа с единственным выбором, оформленная как сегментированный контрол. Подходит для переключения режимов отображения, фильтров с малым числом значений и компактных табов на плотных поверхностях. Поддерживает controlled и uncontrolled режим, клавиатурную навигацию (Arrow/Home/End с пропуском disabled), иконки, счётчики и режим полной ширины.

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

  • Когда вариантов от 2 до 5 и все они одновременно видимы на экране.
  • Для переключения режимов отображения (list/grid/kanban, day/week/month).
  • Для компактных фильтров с взаимоисключающим выбором.

Когда не нужен SegmentControl:

  • Вариантов больше 5:
    • используйте Tabs или Select.
  • Допускается множественный выбор:
    • используйте чекбоксы или ToggleGroup.
  • Выбор приводит к загрузке тяжёлого контента и нужны отдельные урлы:
    • используйте Tabs.

Анатомия

Size (default m)

Размерный ряд: s / m / l — стандартные плотности.

Width (default auto)

  • auto — ширина по контенту.
  • full — растягивает контейнер на всю ширину родителя, сегменты делят ширину поровну. Уместен в формах и фильтрах с фиксированной шириной поля.

Outline (default false)

Булевый флаг — добавляет обводку контейнеру. Используется на «лёгких» поверхностях, где контрол должен явно отделяться от фона.

Segment slots

Каждый элемент items[i] собирается из:

  • label — текст сегмента.
  • icon — иконка с iconPosition: 'before' | 'after'.
  • counter — счётчик после label.

Дополнительно:

  • Сегмент может быть icon-only (без label).
  • Отдельный сегмент можно сделать disabled — клавиатурная навигация его пропускает.

Установка

pnpm add @cloud-ru/ds-segment-control
import { SegmentControl } from '@cloud-ru/ds-segment-control'

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

1. Базовый сценарий

Uncontrolled режим через defaultValue — компонент сам хранит выбор

import { SegmentControl } from '@cloud-ru/ds-segment-control';

export function Basic() {
  return (
    <SegmentControl
      defaultValue='overview'
      items={[
        { value: 'overview', label: 'Overview' },
        { value: 'analytics', label: 'Analytics' },
        { value: 'reports', label: 'Reports' },
      ]}
    />
  );
}

2. Все размеры

s / m / l

import { SegmentControl } from '@cloud-ru/ds-segment-control';

const items = [
  { value: 'one', label: 'One' },
  { value: 'two', label: 'Two' },
  { value: 'three', label: 'Three' },
];

export function Sizes() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <SegmentControl size='s' defaultValue='one' items={items} />
      <SegmentControl size='m' defaultValue='one' items={items} />
      <SegmentControl size='l' defaultValue='one' items={items} />
    </div>
  );
}

3. С иконками и icon-only

label + icon, или icon без label для плотных тулбаров

import { HomeSVG, PlusSVG, SettingsSVG } from '@cloud-ru/ds-icons/interface/system';
import { SegmentControl } from '@cloud-ru/ds-segment-control';

export function WithIcons() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <SegmentControl
        defaultValue='home'
        items={[
          { value: 'home', label: 'Home', icon: <HomeSVG /> },
          { value: 'settings', label: 'Settings', icon: <SettingsSVG /> },
          { value: 'add', label: 'Add', icon: <PlusSVG /> },
        ]}
      />
      <SegmentControl
        defaultValue='home'
        items={[
          { value: 'home', icon: <HomeSVG /> },
          { value: 'settings', icon: <SettingsSVG /> },
          { value: 'add', icon: <PlusSVG /> },
        ]}
      />
    </div>
  );
}

4. Со счётчиком

counter рендерится после label и переиспользует @cloud-ru/ds-counter

import { SegmentControl } from '@cloud-ru/ds-segment-control';

export function WithCounter() {
  return (
    <SegmentControl
      defaultValue='inbox'
      items={[
        { value: 'inbox', label: 'Inbox', counter: 12 },
        { value: 'drafts', label: 'Drafts', counter: 3 },
        { value: 'archive', label: 'Archive' },
      ]}
    />
  );
}

5. Полная ширина и outline

width='full' растягивает на родителя; outline даёт обводку контейнера

import { SegmentControl } from '@cloud-ru/ds-segment-control';

export function FullWidth() {
  return (
    <div style={{ width: 480, maxWidth: '100%' }}>
      <SegmentControl
        width='full'
        outline
        defaultValue='day'
        items={[
          { value: 'day', label: 'Day' },
          { value: 'week', label: 'Week' },
          { value: 'month', label: 'Month' },
          { value: 'year', label: 'Year' },
        ]}
      />
    </div>
  );
}

6. Disabled сегмент

Клавиатурная навигация Arrow/Home/End пропускает заблокированные элементы

import { SegmentControl } from '@cloud-ru/ds-segment-control';

export function DisabledSegment() {
  return (
    <SegmentControl
      defaultValue='one'
      items={[
        { value: 'one', label: 'One' },
        { value: 'two', label: 'Two', disabled: true },
        { value: 'three', label: 'Three' },
      ]}
    />
  );
}

7. Controlled с useState

value + onChange когда нужен внешний источник правды

import { SegmentControl } from '@cloud-ru/ds-segment-control';
import { useState } from 'react';

export function Controlled() {
  const [view, setView] = useState<'list' | 'grid' | 'kanban'>('list');

  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <SegmentControl
        value={view}
        onChange={setView}
        items={[
          { value: 'list', label: 'List' },
          { value: 'grid', label: 'Grid' },
          { value: 'kanban', label: 'Kanban' },
        ]}
      />
      <span>Selected: {view}</span>
    </div>
  );
}

Props

SegmentControlProps

PropTypeDefaultDescription
classNamestring—CSS-класс контейнера.
data-test-idstring—
defaultValueIdType—ID выбранного по умолчанию сегмента (uncontrolled).
itemsSegment—Набор сегментов.
namestring—Имя поля (hidden input для формы).
onChange((value: Value) => void)—Колбек смены выбранного сегмента.
outlineboolean—Обводка.
size"l" | "m" | "s"mРазмер компонента.
valueIdType—Value выбранного сегмента.
width"auto" | "full"autoУправление шириной компонента.
  • IconPosition = "after" | "before"

Segment

PropTypeDefaultDescription
counterstring | number | undefined—Счётчик в сегменте (отображается после лейбла).
disabledboolean | undefined—Состояние активности сегмента.
iconstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—Иконка сегмента.
iconPosition"after" | "before"—Позиция иконки относительно лейбла.
labelstring | undefined—Текстовый заголовок сегмента.
renderWrapSegment((segment: ReactNode) => ReactNode) | undefined—Render-обёртка над сегментом.
valueValue—Идентификатор сегмента.
  • Size = "l" | "m" | "s"

  • Width = "auto" | "full"

版本与发布记录

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

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

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

@cloud-ru/ds-segment-control 是什么?

Сегментированный переключатель — компактная радио-группа с единственным выбором, токенами размеров s/m/l, иконками, счётчиками и режимом полной ширины.

如何安装 @cloud-ru/ds-segment-control?

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

@cloud-ru/ds-segment-control 支持 TypeScript 吗?

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

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

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

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

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

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

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

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

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