@cloud-ru/ds-button-combo

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

Кнопка с основным действием и выпадающим списком дополнительных действий.

原始使用文档
文档目录13 节
  1. Когда использовать
  2. Анатомия
  3. View (default filled )
  4. Appearance (default primary )
  5. Size (default m )
  6. Установка
  7. Примеры использования
  8. Основной сценарий
  9. Варианты оформления
  10. Controlled
  11. На всю ширину
  12. Props
  13. Смотри также

Button Combo

@cloud-ru/ds-button-combo — Кнопка с основным действием и выпадающим списком дополнительных действий.

Комбинированная кнопка: основное действие слева и триггер выпадающего списка с остальными действиями справа. Обе части — Button из @cloud-ru/ds-button с общими view / appearance / size; список — адаптивный Droplist из @cloud-ru/ds-list (на мобильной раскладке раскрывается в BottomSheet). Выбор пункта делает его основным действием кнопки.

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

  • Когда у действия есть основной сценарий и несколько родственных вариантов: Сохранить / Сохранить копию / Сохранить как шаблон.
  • Когда нужно сэкономить место: вместо ряда кнопок — одна с выпадающим списком.

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

  • Для единственного действия — обычный Button из @cloud-ru/ds-button.
  • Для выбора значения (а не запуска действия) — @cloud-ru/ds-segment-control или select.
  • Для равнозначных несвязанных действий — ButtonGroup из @cloud-ru/ds-button.

Анатомия

View (default filled)

Оформление обеих частей комбо. Совпадает с осью view у @cloud-ru/ds-button:

  • filled — заполненная акцентом.
  • tonal — мягкая тонированная подложка.
  • outline — обводка без заливки.
  • simple — только текст, без фона и рамки.
  • elevated — светлая карточка с тенью.
  • function — компактная текстовая, минимум отступов.

Appearance (default primary)

Цветовое назначение обеих частей:

  • primary — брендовый акцент, основное действие экрана.
  • neutral — нейтральное, второстепенное действие.
  • critical — деструктивное действие.

Size (default m)

Размер комбо: s, m, l. Прокидывается и в кнопки, и в выпадающий список.

Установка

pnpm add @cloud-ru/ds-button-combo
import { ButtonCombo } from '@cloud-ru/ds-button-combo'

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

Основной сценарий

Uncontrolled: defaultValue задаёт стартовое действие, выбор пункта меняет основную кнопку

import { ButtonCombo, Item } from '@cloud-ru/ds-button-combo';

const items: Item[] = [
  { id: 'save', label: 'Сохранить', onClick: () => console.info('Сохранить') },
  { id: 'save-copy', label: 'Сохранить копию', onClick: () => console.info('Сохранить копию') },
  { id: 'save-template', label: 'Сохранить как шаблон', onClick: () => console.info('Сохранить как шаблон') },
];

export function Basic() {
  return <ButtonCombo items={items} defaultValue='save' />;
}

Варианты оформления

Ось view: filled, tonal, outline, function

import { ButtonCombo, Item, VIEW } from '@cloud-ru/ds-button-combo';

const items: Item[] = [
  { id: 'run', label: 'Запустить', onClick: () => console.info('Запустить') },
  { id: 'run-debug', label: 'Запустить с отладкой', onClick: () => console.info('Запустить с отладкой') },
];

export function Views() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <ButtonCombo view={VIEW.Filled} items={items} defaultValue='run' />
      <ButtonCombo view={VIEW.Tonal} items={items} defaultValue='run' />
      <ButtonCombo view={VIEW.Outline} items={items} defaultValue='run' />
      <ButtonCombo view={VIEW.Function} items={items} defaultValue='run' />
    </div>
  );
}

Controlled

Выбранное действие и раскрытие списка управляются извне через пары value/onChange и open/onOpenChange

import { ButtonCombo, Item } from '@cloud-ru/ds-button-combo';
import { ItemId } from '@cloud-ru/ds-list';
import { useState } from 'react';

const items: Item[] = [
  { id: 'publish', label: 'Опубликовать', onClick: () => console.info('Опубликовать') },
  { id: 'draft', label: 'Сохранить черновик', onClick: () => console.info('Сохранить черновик') },
  { id: 'schedule', label: 'Запланировать', onClick: () => console.info('Запланировать') },
];

export function Controlled() {
  const [value, setValue] = useState<ItemId>('publish');
  const [open, setOpen] = useState(false);

  return <ButtonCombo items={items} value={value} onChange={setValue} open={open} onOpenChange={setOpen} />;
}

На всю ширину

fullWidth растягивает основную кнопку по контейнеру, триггер сохраняет свою ширину

import { ButtonCombo, Item } from '@cloud-ru/ds-button-combo';

import styles from './styles.module.scss';

const items: Item[] = [
  { id: 'confirm', label: 'Подтвердить', onClick: () => console.info('Подтвердить') },
  { id: 'confirm-notify', label: 'Подтвердить и уведомить', onClick: () => console.info('Подтвердить и уведомить') },
];

export function FullWidth() {
  return (
    <div className={styles.narrow}>
      <ButtonCombo fullWidth items={items} defaultValue='confirm' />
    </div>
  );
}

Props

ButtonComboProps

PropTypeDefaultDescription
appearance"critical" | "neutral" | "primary"primaryЦветовое назначение обеих кнопок
classNamestring—CSS-класс корневого контейнера
data-test-idstring—
defaultLabelstring``Начальный label основной кнопки, пока ничего не выбрано
defaultValueItemId—Начальный выбранный элемент (uncontrolled)
disabledboolean—Отключена
dropdownClassNamestring—CSS-класс выпадающего списка
dropdownTriggerClassNamestring—CSS-класс кнопки-триггера выпадающего списка
fullWidthboolean—Растянуть на всю ширину родителя
innerRefRef<HTMLDivElement>—Ref на корневой DOM-элемент.
Используем явный проп, чтобы не зависеть от forwardRef и не тащить type-assertions на экспорт.
itemsItem—Основные элементы списка (действия)
loadingboolean—Состояние загрузки
onChange((value: ItemId) => void)—Controlled: обработчик смены выбранного элемента
onOpenChange((open: boolean) => void)—Обработчик изменения видимости выпадающего списка
openboolean—Управляет видимостью выпадающего списка
optionClassNamestring—CSS-класс основной (option) кнопки
size"l" | "m" | "s"mРазмер
tabIndexnumber—HTML-атрибут tab-index корневого контейнера
valueItemId—Controlled: выбранный элемент
view"elevated" | "filled" | "function" | "outline" | "simple" | "tonal"filledВариант оформления обеих кнопок

Item

PropTypeDefaultDescription
afterContentstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—Слот после основного контента
beforeContentstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—Слот до основного контента
checkedboolean | undefined—Управляемое состояние выбранности айтема
classNamestring | undefined—CSS-класс
contentItemContent—Основной контент айтема
data-test-idstring | undefined—
disabledboolean | undefined—Флаг неактивности элемента
hiddenboolean | undefined—Скрыть элемент из списка (не рендерится и исключается из навигации)
idItemId—Уникальный идентификатор
inactiveboolean | undefined—Флаг отображения отключения реакции на любое css состояние (hover/focus и тд)


Также элемент исключается из навигации с клавиатуры и не может быть выбран (selection)
itemRefRefObject<HTMLElement> | undefined—Ссылка на DOM-элемент айтема
itemWrapRender((item: ReactNode) => ReactNode) | undefined—Рендер-обёртка вокруг айтема (например, для проксирования в Tooltip/Link)
labelstring | undefined—Название действия: текст пункта списка и label основной кнопки при выборе
onClick(e: MouseEvent<HTMLElement>) => void—Колбек обработки клика
showSwitchIconboolean | undefined—Флаг отображения иконки у чекбоксов
switchboolean | undefined—Флаг отображения состояния выбранного элемента через switch

Смотри также

版本与发布记录

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

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

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

@cloud-ru/ds-button-combo 是什么?

Кнопка с основным действием и выпадающим списком дополнительных действий.

如何安装 @cloud-ru/ds-button-combo?

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

@cloud-ru/ds-button-combo 支持 TypeScript 吗?

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

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

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

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

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

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

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

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

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