# @cloud-ru/ds-button > Пакет кнопок дизайн-системы — компоненты Button и ButtonGroup с едиными токенами размеров, appearance и view. Docs: /snack-v2/components/button/ ## Установка ```sh pnpm add @cloud-ru/ds-button ``` ## API ### Button | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `appearance` | `critical \| neutral \| primary` | `primary` | no | Вариант оформления | | `as` | `ElementType` | — | no | Элемент или компонент для рендера: 'button' \| 'a' \| ComponentType (например Link из react-router-dom) | | `className` | `string` | — | no | Дополнительный класс | | `counter` | `Omit` | — | no | Пропсы для counter. `appearance` можно задать явно (по умолчанию наследуется от appearance кнопки). | | `data-test-id` | `string` | — | no | | | `disabled` | `boolean` | `false` | no | Отключена | | `fullWidth` | `boolean` | `false` | no | На всю ширину | | `icon` | `ReactNode` | — | no | Иконка | | `iconPosition` | `after \| before` | `before` | no | Позиция иконки относительно текста | | `innerRef` | `any` | — | no | Ref на реальный DOM-элемент/инстанс, который рендерится через `as`. Используем явный проп, чтобы не зависеть от `forwardRef` и не тащить type-assertions на экспорт. | | `label` | `string` | — | no | Текст кнопки | | `loading` | `boolean` | `false` | no | Состояние загрузки | | `minWidth` | `boolean` | `true` | no | Минимальная ширина контейнера (`min-width` из токена размера). По умолчанию `true`. `false` — кнопка сжимается по контенту вместо фиксированного минимума. | | `size` | `l \| m \| s` | `m` | no | Размер | | `view` | `elevated \| filled \| function \| outline \| simple \| tonal` | `filled` | no | Вариант кнопки (Figma: filled, outline, function, simple, elevated) | #### Related types - `Appearance` = `critical | neutral | primary` - `CounterProps` (interface) - `IconPosition` = `after | before` - `PolymorphicRef` (alias) - `RoleAppearance` = `accent | decor` - `Size` = `l | m | s` - `Variant` = `icon-after | icon-before | icon-only | label-only` - `View` = `elevated | filled | function | outline | simple | tonal` ### BUTTON_GROUP_ACTION_SLOT _Нет публичных пропсов._ ### ButtonGroup | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `break` | `boolean` | `false` | no | Перенос на новую строку при нехватке места | | `centered` | `boolean` | `false` | no | Центрирование по горизонтали | | `className` | `string` | — | no | Дополнительный класс | | `data-test-id` | `string` | — | no | | | `filled` | `boolean` | `false` | no | Заливка контейнера | | `primaryAction` | `ActionProps` | — | no | Основное действие (filled) | | `renderAction` | `((button: ReactNode, slot: ButtonGroupActionSlot) => ReactNode)` | — | no | Обёртка каждой кнопки. Получает готовый `