@cloud-ru/ds-accordion

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

Аккордеон дизайн-системы — контейнер Accordion и три уровня раскрываемых блоков CollapseBlock с общими токенами view, backgroundPredefined и chevronPosition.

原始使用文档
文档目录19 节
  1. Когда использовать
  2. Установка
  3. Figma
  4. Accordion
  5. Когда использовать
  6. Анатомия
  7. Примеры использования
  8. Props
  9. CollapseBlock
  10. Когда использовать
  11. Анатомия
  12. Примеры использования
  13. Props
  14. CollapseBlockPrimary
  15. Props CollapseBlockPropsWithoutComponent
  16. CollapseBlockSecondary
  17. Props CollapseBlockPropsWithoutComponent
  18. CollapseBlockTertiary
  19. Props CollapseBlockTertiaryProps

Accordion

@cloud-ru/ds-accordion — Аккордеон дизайн-системы — контейнер Accordion и три уровня раскрываемых блоков CollapseBlock с общими токенами view, backgroundPredefined и chevronPosition.

Пакет @cloud-ru/ds-accordion даёт контейнер Accordion и три уровня раскрываемых блоков CollapseBlockPrimary / CollapseBlockSecondary / CollapseBlockTertiary. Контейнер отвечает за режим выбора (single / multiple) и controlled/uncontrolled состояние, блоки — за внешний вид и иерархию на странице.

  • Accordion — контейнер раскрываемых блоков с режимами single / multiple и controlled/uncontrolled API.
  • CollapseBlock — раскрываемые блоки трёх уровней: Primary, Secondary, Tertiary — для иерархии разделов на странице.

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

ЗадачаКак решить
Длинная форма / настройки с логическими секциямиAccordion + CollapseBlockPrimary на каждый раздел
Двух- / трёхуровневая иерархия (раздел → подраздел → деталь)Вложенные Accordion с Primary → Secondary → Tertiary
Разрешить открыть один блок за раз (FAQ)selectionMode='single'
Разрешить одновременно несколько открытых блоковselectionMode='multiple'

Когда не нужен аккордеон: короткие списки (≤ 3 пунктов), критичный контент, который пользователь не должен пропустить, и навигация — для неё используйте Tabs.

Установка

pnpm add @cloud-ru/ds-accordion
import { Accordion } from '@cloud-ru/ds-accordion'

Figma

Оба компонента следуют одному мастер-файлу Figma. Ссылки на конкретные узлы — на страницах компонентов.

Accordion

Контейнер-группа раскрываемых блоков. Управляет режимом выбора (single / multiple) и controlled/uncontrolled состоянием.

Контейнер, который группирует CollapseBlock* в одну логическую группу и управляет их раскрытием. Под капотом — ToggleGroup из @cloud-ru/ds-toggles, поэтому семантика раскрытия идентична группе переключателей.

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

  • Для группы раскрываемых блоков, где открытие/закрытие должно быть согласовано (один из, несколько из).
  • Для двух- и трёхуровневой иерархии — вкладывайте Accordion внутрь блока, меняя уровень CollapseBlock*.

Когда не нужен: один изолированный раскрывающийся блок без группы — в этом случае достаточно самого CollapseBlock* без обёртки.

Анатомия

Selection mode

Режим раскрытия дочерних блоков: single — одновременно открыт максимум один блок (как radio-группа), multiple — можно открыть любое количество независимо.

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

1. Uncontrolled с начальным состоянием

expandedDefault задаёт первоначально открытый блок; дальше компонент управляет раскрытием сам.

import { Accordion } from '@cloud-ru/ds-accordion';

import styles from './styles.module.scss';
export function BasicAccordion() {
  return (
    <div className={styles.wrapper}>
      <Accordion expandedDefault='profile'>
        <Accordion.CollapseBlockPrimary id='profile' title='Профиль' subTitle='Контакты и предпочтения' view='outline'>
          Имя, email, аватар.
        </Accordion.CollapseBlockPrimary>
        <Accordion.CollapseBlockPrimary id='security' title='Безопасность' view='outline'>
          Пароль, сессии, 2FA.
        </Accordion.CollapseBlockPrimary>
      </Accordion>
    </div>
  );
}

2. Controlled + multiple

expanded + onExpandedChange в режиме multiple — значение массив id.

import { Accordion } from '@cloud-ru/ds-accordion';
import { useState } from 'react';

import styles from './styles.module.scss';
export function MultipleMode() {
  const [expanded, setExpanded] = useState<string[]>(['email']);

  return (
    <div className={styles.wrapper}>
      <Accordion selectionMode='multiple' expanded={expanded} onExpandedChange={next => setExpanded(next ?? [])}>
        <Accordion.CollapseBlockPrimary id='email' title='Email' view='outline'>
          Уведомления на почту.
        </Accordion.CollapseBlockPrimary>
        <Accordion.CollapseBlockPrimary id='push' title='Push' view='outline'>
          Браузерные push-уведомления.
        </Accordion.CollapseBlockPrimary>
        <Accordion.CollapseBlockPrimary id='messenger' title='Мессенджеры' view='outline'>
          Telegram, Slack, Mattermost.
        </Accordion.CollapseBlockPrimary>
      </Accordion>
    </div>
  );
}

Props

AccordionProps

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

CollapseBlock

Семейство раскрываемых блоков аккордеона — Primary (l), Secondary (m), Tertiary (s). Общие пропсы title / subTitle / afterTitle / view / backgroundPredefined / chevronPosition.

Три семантических уровня раскрываемого блока: CollapseBlockPrimary, CollapseBlockSecondary, CollapseBlockTertiary. Уровень задаёт размер типографики заголовка и плотность отступов; все три компонента используют одно и то же API — меняется только роль в иерархии.

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

  • Primary (title size l) — верхнеуровневые разделы страницы или секции формы.
  • Secondary (title size m) — подразделы внутри Primary. Типовой view='outline'.
  • Tertiary (title size s) — плоские детали без дальнейшей вложенности. Без view / backgroundPredefined — только заголовок и контент.

Анатомия

Содержимое

children — слот целиком: компонент задаёт раскладку и отступы, но не типографику и не цвет текста. Содержимое наследует стили родителя, поэтому шрифт задаёт место использования — обёрткой с нужным классом либо компонентом Typography. В макете содержимое набрано regular/body/m.

View

Визуальная подача блока: simple — плоский фон без рамки, outline — с границей, elevated — с тенью для поверхностей поверх страницы.

backgroundPredefined

Слой акрила через BACKGROUND_PREDEFINED_FILL из @cloud-ru/ds-materials (как у Card). По умолчанию — neutralBackground1Level.

chevronPosition (default after)

Положение шеврона-раскрытия относительно заголовка.

  • before — шеврон слева от заголовка.
  • after — шеврон справа от заголовка.

showChevron (default true)

Управляет наличием шеврона-раскрытия в строке заголовка.

  • true — шеврон показывается рядом с заголовком.
  • false — шеврон скрыт; блок по-прежнему раскрывается кликом по строке заголовка.

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

Цветовые схемы

Neutral — дефолт. Primary — акцент. Цветные варианты — для статусных разделов.

import { Accordion } from '@cloud-ru/ds-accordion';
import { BACKGROUND_PREDEFINED_FILL } from '@cloud-ru/ds-materials';

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

export function Appearances() {
  return (
    <div className={styles.wrapper}>
      <Accordion>
        <Accordion.CollapseBlockPrimary
          id='neutral'
          backgroundPredefined={BACKGROUND_PREDEFINED_FILL.NeutralBackground1Level}
          title='Neutral'
          view='outline'
        >
          Нейтральный акрил — значение по умолчанию.
        </Accordion.CollapseBlockPrimary>
        <Accordion.CollapseBlockPrimary
          id='primary'
          backgroundPredefined={BACKGROUND_PREDEFINED_FILL.PrimaryBackground}
          title='Primary'
          view='outline'
        >
          Акцентный раздел, выделенный основным цветом.
        </Accordion.CollapseBlockPrimary>
        <Accordion.CollapseBlockPrimary
          id='green'
          backgroundPredefined={BACKGROUND_PREDEFINED_FILL.GreenBackground}
          title='Green'
          view='outline'
        >
          Успех, подтверждённые действия.
        </Accordion.CollapseBlockPrimary>
        <Accordion.CollapseBlockPrimary
          id='red'
          backgroundPredefined={BACKGROUND_PREDEFINED_FILL.RedBackground}
          title='Red'
          view='outline'
        >
          Предупреждение или критическое внимание.
        </Accordion.CollapseBlockPrimary>
      </Accordion>
    </div>
  );
}

Левый шеврон + afterTitle справа

Читается как «строка итогов»: название слева, значение справа, шеврон возле названия.

import { Accordion } from '@cloud-ru/ds-accordion';

import styles from './styles.module.scss';
export function ChevronBefore() {
  return (
    <div className={styles.wrapper}>
      <Accordion>
        <Accordion.CollapseBlockSecondary
          id='summary'
          view='outline'
          title='Итого'
          chevronPosition='before'
          afterTitle='1 200 ₽'
        >
          Разбивка платежа по позициям.
        </Accordion.CollapseBlockSecondary>
        <Accordion.CollapseBlockSecondary
          id='delivery'
          view='outline'
          title='Доставка'
          chevronPosition='before'
          afterTitle='бесплатно'
        >
          Курьер по Москве, 2–3 дня.
        </Accordion.CollapseBlockSecondary>
      </Accordion>
    </div>
  );
}

afterTitle — счётчик

Counter в правом слоте заголовка. Не кликабельный — клик по строке раскрывает блок.

import { Accordion } from '@cloud-ru/ds-accordion';
import { Counter } from '@cloud-ru/ds-counter';

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

export function AfterTitle() {
  return (
    <div className={styles.wrapper}>
      <Accordion>
        <Accordion.CollapseBlockPrimary id='inbox' title='Входящие' view='outline' afterTitle={<Counter value={12} />}>
          Непрочитанные сообщения и уведомления.
        </Accordion.CollapseBlockPrimary>
        <Accordion.CollapseBlockPrimary id='archive' title='Архив' view='outline' afterTitle={<Counter value={238} />}>
          Перемещённые из входящих.
        </Accordion.CollapseBlockPrimary>
      </Accordion>
    </div>
  );
}

Primary → Secondary → Tertiary

Каждый уровень — собственный Accordion. Вложенный не наследует состояние родителя.

import { Accordion } from '@cloud-ru/ds-accordion';

import styles from './styles.module.scss';
export function NestedLevels() {
  return (
    <div className={styles.wrapper}>
      <Accordion>
        <Accordion.CollapseBlockPrimary id='root' title='Платежи' view='outline'>
          <Accordion>
            <Accordion.CollapseBlockSecondary id='sub-cards' view='outline' title='Карты'>
              <Accordion>
                <Accordion.CollapseBlockTertiary id='visa' title='Visa •••• 4242'>
                  Основная карта, истекает 09/28.
                </Accordion.CollapseBlockTertiary>
                <Accordion.CollapseBlockTertiary id='mir' title='МИР •••• 7781'>
                  Зарплатная карта.
                </Accordion.CollapseBlockTertiary>
              </Accordion>
            </Accordion.CollapseBlockSecondary>
            <Accordion.CollapseBlockSecondary id='sub-invoices' view='outline' title='Счета'>
              История операций и выставленные счета.
            </Accordion.CollapseBlockSecondary>
          </Accordion>
        </Accordion.CollapseBlockPrimary>
      </Accordion>
    </div>
  );
}

Props

CollapseBlockProps

PropTypeDefaultDescription
afterTitleReactNode—Контент справа от заголовка. Текст слота входит в доступное имя кнопки-шеврона вместе с title,
поэтому без title в слот можно передать собственный заголовок.
backgroundPredefined"blueBackground" | "decorTransparent" | "greenBackground" | "neutralBackground1Level" | "orangeBackground" | "pinkBackground" | "primaryBackground" | "redBackground" | "transparent" | "violetBackground" | "yellowBackground"neutralBackground1LevelСлой backgroundPredefined + acrylic (см. BACKGROUND_PREDEFINED_FILL в @cloud-ru/ds-materials).
По умолчанию material/neutralBackground1Level.
chevronPosition"after" | "before"afterПоложение шеврона-раскрытия относительно текста (before | after)
childrenstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—
classNamestring—Дополнительный класс корневого элемента
component"accordionPrimary" | "accordionSecondary" | "accordionTertiary"—Уровень аккордеона: размер типографики и отступы
data-test-idstring—
idstring—Уникальный идентификатор блока в группе переключателей
keepMountedbooleanfalseОставлять ли контент в DOM при сворачивании
showChevronbooleantrueПоказывать ли шеврон-раскрытия рядом с заголовком (по умолчанию true)
stopSlotsClickPropagationbooleanfalseКлики в слотах afterTitle и subTitle не тригерять расскрытие/закрытие блока
subTitleReactNode—Подзаголовок под строкой заголовка
titlestring—Заголовок блока
view"elevated" | "outline" | "simple"simpleВизуальный вариант обложки (simple, outline, elevated)
  • ChevronPosition = "after" | "before"

  • Component = "accordionPrimary" | "accordionSecondary" | "accordionTertiary"

  • View = "elevated" | "outline" | "simple"

CollapseBlockPrimary

import { Accordion } from '@cloud-ru/ds-accordion';
import { Counter } from '@cloud-ru/ds-counter';

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

export function AfterTitle() {
  return (
    <div className={styles.wrapper}>
      <Accordion>
        <Accordion.CollapseBlockPrimary id='inbox' title='Входящие' view='outline' afterTitle={<Counter value={12} />}>
          Непрочитанные сообщения и уведомления.
        </Accordion.CollapseBlockPrimary>
        <Accordion.CollapseBlockPrimary id='archive' title='Архив' view='outline' afterTitle={<Counter value={238} />}>
          Перемещённые из входящих.
        </Accordion.CollapseBlockPrimary>
      </Accordion>
    </div>
  );
}

Props CollapseBlockPropsWithoutComponent

PropTypeDefaultDescription
afterTitleReactNode—Контент справа от заголовка. Текст слота входит в доступное имя кнопки-шеврона вместе с title,
поэтому без title в слот можно передать собственный заголовок.
backgroundPredefined"blueBackground" | "decorTransparent" | "greenBackground" | "neutralBackground1Level" | "orangeBackground" | "pinkBackground" | "primaryBackground" | "redBackground" | "transparent" | "violetBackground" | "yellowBackground"—Слой backgroundPredefined + acrylic (см. BACKGROUND_PREDEFINED_FILL в @cloud-ru/ds-materials).
По умолчанию material/neutralBackground1Level.
chevronPosition"after" | "before"—Положение шеврона-раскрытия относительно текста (before | after)
childrenstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—
classNamestring—Дополнительный класс корневого элемента
data-test-idstring—
idstring—Уникальный идентификатор блока в группе переключателей
keepMountedboolean—Оставлять ли контент в DOM при сворачивании
showChevronboolean—Показывать ли шеврон-раскрытия рядом с заголовком (по умолчанию true)
stopSlotsClickPropagationbooleanfalseКлики в слотах afterTitle и subTitle не тригерять расскрытие/закрытие блока
subTitleReactNode—Подзаголовок под строкой заголовка
titlestring—Заголовок блока
view"elevated" | "outline" | "simple"—Визуальный вариант обложки (simple, outline, elevated)
  • ChevronPosition = "after" | "before"

  • View = "elevated" | "outline" | "simple"

CollapseBlockSecondary

import { Accordion } from '@cloud-ru/ds-accordion';

import styles from './styles.module.scss';
export function ChevronBefore() {
  return (
    <div className={styles.wrapper}>
      <Accordion>
        <Accordion.CollapseBlockSecondary
          id='summary'
          view='outline'
          title='Итого'
          chevronPosition='before'
          afterTitle='1 200 ₽'
        >
          Разбивка платежа по позициям.
        </Accordion.CollapseBlockSecondary>
        <Accordion.CollapseBlockSecondary
          id='delivery'
          view='outline'
          title='Доставка'
          chevronPosition='before'
          afterTitle='бесплатно'
        >
          Курьер по Москве, 2–3 дня.
        </Accordion.CollapseBlockSecondary>
      </Accordion>
    </div>
  );
}

Props CollapseBlockPropsWithoutComponent

PropTypeDefaultDescription
afterTitleReactNode—Контент справа от заголовка. Текст слота входит в доступное имя кнопки-шеврона вместе с title,
поэтому без title в слот можно передать собственный заголовок.
backgroundPredefined"blueBackground" | "decorTransparent" | "greenBackground" | "neutralBackground1Level" | "orangeBackground" | "pinkBackground" | "primaryBackground" | "redBackground" | "transparent" | "violetBackground" | "yellowBackground"—Слой backgroundPredefined + acrylic (см. BACKGROUND_PREDEFINED_FILL в @cloud-ru/ds-materials).
По умолчанию material/neutralBackground1Level.
chevronPosition"after" | "before"—Положение шеврона-раскрытия относительно текста (before | after)
childrenstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—
classNamestring—Дополнительный класс корневого элемента
data-test-idstring—
idstring—Уникальный идентификатор блока в группе переключателей
keepMountedboolean—Оставлять ли контент в DOM при сворачивании
showChevronboolean—Показывать ли шеврон-раскрытия рядом с заголовком (по умолчанию true)
stopSlotsClickPropagationbooleanfalseКлики в слотах afterTitle и subTitle не тригерять расскрытие/закрытие блока
subTitleReactNode—Подзаголовок под строкой заголовка
titlestring—Заголовок блока
view"elevated" | "outline" | "simple"—Визуальный вариант обложки (simple, outline, elevated)
  • ChevronPosition = "after" | "before"

  • View = "elevated" | "outline" | "simple"

CollapseBlockTertiary

import { Accordion } from '@cloud-ru/ds-accordion';

import styles from './styles.module.scss';
export function NestedLevels() {
  return (
    <div className={styles.wrapper}>
      <Accordion>
        <Accordion.CollapseBlockPrimary id='root' title='Платежи' view='outline'>
          <Accordion>
            <Accordion.CollapseBlockSecondary id='sub-cards' view='outline' title='Карты'>
              <Accordion>
                <Accordion.CollapseBlockTertiary id='visa' title='Visa •••• 4242'>
                  Основная карта, истекает 09/28.
                </Accordion.CollapseBlockTertiary>
                <Accordion.CollapseBlockTertiary id='mir' title='МИР •••• 7781'>
                  Зарплатная карта.
                </Accordion.CollapseBlockTertiary>
              </Accordion>
            </Accordion.CollapseBlockSecondary>
            <Accordion.CollapseBlockSecondary id='sub-invoices' view='outline' title='Счета'>
              История операций и выставленные счета.
            </Accordion.CollapseBlockSecondary>
          </Accordion>
        </Accordion.CollapseBlockPrimary>
      </Accordion>
    </div>
  );
}

Props CollapseBlockTertiaryProps

PropTypeDefaultDescription
afterTitleReactNode—Контент справа от заголовка. Текст слота входит в доступное имя кнопки-шеврона вместе с title,
поэтому без title в слот можно передать собственный заголовок.
chevronPosition"after" | "before"—Положение шеврона-раскрытия относительно текста (before | after)
childrenstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—
classNamestring—Дополнительный класс корневого элемента
data-test-idstring—
idstring—Уникальный идентификатор блока в группе переключателей
keepMountedboolean—Оставлять ли контент в DOM при сворачивании
showChevronboolean—Показывать ли шеврон-раскрытия рядом с заголовком (по умолчанию true)
stopSlotsClickPropagationbooleanfalseКлики в слотах afterTitle и subTitle не тригерять расскрытие/закрытие блока
subTitleReactNode—Подзаголовок под строкой заголовка
titlestring—Заголовок блока
  • ChevronPosition = "after" | "before"

版本与发布记录

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

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

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

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

Аккордеон дизайн-системы — контейнер Accordion и три уровня раскрываемых блоков CollapseBlock с общими токенами view, backgroundPredefined и chevronPosition.

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

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

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

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

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

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

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

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

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

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

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

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