@cloud-ru/ds-uikit-product-button-predefined

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

Function-кнопка с выпадающим списком (desktop) или modal (mobile).

原始使用文档
文档目录15 节
  1. Когда использовать
  2. Анатомия
  3. Trigger
  4. Droplist
  5. items
  6. Size (default s )
  7. Appearance (default neutral )
  8. open / onOpenChange
  9. Установка
  10. Базовый пример
  11. Примеры использования
  12. Desktop basic
  13. Desktop open state
  14. Mobile layout
  15. Props

ButtonDropdown

@cloud-ru/ds-uikit-product-button-predefined — Function-кнопка с выпадающим списком (desktop) или modal (mobile).

Кнопка view='function' с AdaptiveDroplist: на desktop — Droplist из @cloud-ru/ds-list, на mobile — @cloud-ru/ds-modal со списком. Раскладка определяется контекстом AdaptiveProvider (см. @cloud-ru/ds-adaptive), а не пропом. Используется, в частности, в PriceSummary для выбора периода биллинга.

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

  • Нужен выбор одного значения из короткого списка (период, валюта, режим) без отдельного поля формы.
  • На desktop достаточно выпадающего списка у триггера; на mobile — полноэкранный modal со списком.

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

  • Произвольный контент в overlay без списка — Dropdown.
  • Одиночное действие без меню — Button view='function'.

Анатомия

Trigger

Button view='function' appearance='neutral' (как buttonFunctionNeutral в Figma) с label и chevron up/down. При open={true} на триггер вешается data-pressed — в макете это stateLayer/text/opacity (прозрачность label/icon через @cloud-ru/ds-materials).

Droplist

ButtonDropdown рендерит Droplist из @cloud-ru/ds-list — он сам адаптивен (раскладку берёт из AdaptiveProvider, отдельного пропа нет):

  • desktop (по умолчанию) — список у триггера через popover.
  • mobile — список уходит в bottom-sheet (адаптивность @cloud-ru/ds-list).

items

Массив пунктов Droplist (content.label, onClick, id). При closeDroplistOnItemClick список закрывается после выбора.

Size (default s)

  • xs — кнопка и droplist рендерятся в размере s (алиас).
  • s — компактный размер.
  • m — средний размер.
  • l — крупный размер.

Appearance (default neutral)

Тон триггерной кнопки — те же значения, что у Button view='function':

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

open / onOpenChange

Controlled API через useValueControl (как у @cloud-ru/ds-utils).

Установка

pnpm add @cloud-ru/ds-uikit-product-button-predefined
import { ButtonDropdown } from '@cloud-ru/ds-uikit-product-button-predefined'

Базовый пример

<ButtonDropdown
  label='Period'
  size='s'
  closeDroplistOnItemClick
  items={[
    { id: 'month', content: { label: 'Month' }, onClick: () => setPeriod('month') },
    { id: 'year', content: { label: 'Year' }, onClick: () => setPeriod('year') },
  ]}
/>

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

{/* client:only — Droplist рендерит контент в портал, который не резолвится при SSR */}

Desktop basic

Базовый dropdown для выбора одного значения.

import { AdaptiveProvider, LAYOUT_TYPE } from '@cloud-ru/ds-adaptive';
import { ButtonDropdown } from '@cloud-ru/ds-uikit-product-button-predefined';
import { useState } from 'react';

const periods = [
  { id: 'month', label: 'Month' },
  { id: 'year', label: 'Year' },
];

export function DesktopBasic() {
  const [period, setPeriod] = useState(periods[0]);

  const items = periods.map(option => ({
    id: option.id,
    content: { label: option.label },
    onClick: () => setPeriod(option),
  }));

  return (
    <AdaptiveProvider layoutType={LAYOUT_TYPE.Desktop}>
      <ButtonDropdown label={period.label} size='s' items={items} closeDroplistOnItemClick />
    </AdaptiveProvider>
  );
}

Desktop open state

Открытое состояние dropdown (portal).

import { AdaptiveProvider, LAYOUT_TYPE } from '@cloud-ru/ds-adaptive';
import { ButtonDropdown } from '@cloud-ru/ds-uikit-product-button-predefined';
import { useState } from 'react';

const periods = [
  { id: 'month', label: 'Month' },
  { id: 'year', label: 'Year' },
];

export function DesktopOpen() {
  const [period, setPeriod] = useState(periods[0]);

  const items = periods.map(option => ({
    id: option.id,
    content: { label: option.label },
    onClick: () => setPeriod(option),
  }));

  return (
    <AdaptiveProvider layoutType={LAYOUT_TYPE.Desktop}>
      <ButtonDropdown label={period.label} size='m' open items={items} />
    </AdaptiveProvider>
  );
}

Mobile layout

AdaptiveProvider layoutType=mobile открывает modal со списком.

import { AdaptiveProvider, LAYOUT_TYPE } from '@cloud-ru/ds-adaptive';
import { ButtonDropdown } from '@cloud-ru/ds-uikit-product-button-predefined';
import { useState } from 'react';

const periods = [
  { id: 'month', label: 'Month' },
  { id: 'year', label: 'Year' },
];

export function MobileLayout() {
  const [period, setPeriod] = useState(periods[0]);

  const items = periods.map(option => ({
    id: option.id,
    content: { label: option.label },
    onClick: () => setPeriod(option),
  }));

  return (
    <AdaptiveProvider layoutType={LAYOUT_TYPE.Mobile}>
      <ButtonDropdown label={period.label} size='s' closeDroplistOnItemClick items={items} />
    </AdaptiveProvider>
  );
}

Props

ButtonDropdownProps

PropTypeDefaultDescription
appearance"critical" | "neutral" | "primary"neutralВариант оформления
as"button"—Элемент или компонент для рендера: 'button' | 'a' | ComponentType (например Link из react-router-dom)
classNamestring—Дополнительный класс
Класс триггерной кнопки.
closeDroplistOnItemClickbooleanfalseЗакрывать выпадающий список после клика на базовый айтем.
Работает в режимах selection: 'none' | 'single'
closeOnPopstateboolean—Закрывать ли поповер при переходе по истории браузера
counterCounterProps—Пропсы для counter. appearance можно задать явно (по умолчанию наследуется от appearance кнопки).
data-test-idstring—
disabledboolean—Отключена
fullWidthboolean—На всю ширину
innerRefPolymorphicRef—Ref на реальный DOM-элемент/инстанс, который рендерится через as.
Используем явный проп, чтобы не зависеть от forwardRef и не тащить type-assertions на экспорт.
itemsBaseItemWithoutNonGroup | CommonGroupItem | Item | ScrollProps—Основные элементы списка
labelstring—Текст кнопки
loadingboolean—Состояние загрузки
minWidthboolean—Минимальная ширина контейнера (min-width из токена размера). По умолчанию true.
false — кнопка сжимается по контенту вместо фиксированного минимума.
onOpenChange((open: boolean) => void)—Колбэк изменения раскрытия.
openboolean—Контролируемое состояние раскрытия.
placement"bottom" | "bottom-end" | "bottom-start" | "left" | "left-end" | "left-start" | "right" | "right-end" | "right-start" | "top" | "top-end" | "top-start"topПоложение поповера относительно своего триггера (children).
size"l" | "m" | "s" | "xs"sРазмер триггера; для xs применяется кнопка s.
triggerClassNamestring—CSS-класс триггера
  • ButtonDropdownSize = "l" | "m" | "s" | "xs"

版本与发布记录

@cloud-ru/ds-uikit-product-button-predefined 共发布 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-uikit-product-button-predefined 的常见问题

@cloud-ru/ds-uikit-product-button-predefined 是什么?

Function-кнопка с выпадающим списком (desktop) или modal (mobile).

如何安装 @cloud-ru/ds-uikit-product-button-predefined?

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

@cloud-ru/ds-uikit-product-button-predefined 支持 TypeScript 吗?

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

@cloud-ru/ds-uikit-product-button-predefined 支持 ESM 还是 CommonJS?

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

@cloud-ru/ds-uikit-product-button-predefined 可以商用吗?

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

@cloud-ru/ds-uikit-product-button-predefined 的下载量有多少?

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

@cloud-ru/ds-uikit-product-button-predefined 还在维护吗?

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