# @cloud-ru/ds-accordion > Аккордеон дизайн-системы — контейнер Accordion и три уровня раскрываемых блоков CollapseBlock с общими токенами view, backgroundPredefined и chevronPosition. Docs: /snack-v2/components/accordion/ ## Установка ```sh pnpm add @cloud-ru/ds-accordion ``` ## Когда использовать | Задача | Как решить | |--------|------------| | Длинная форма / настройки с логическими секциями | `Accordion` + `CollapseBlockPrimary` на каждый раздел | | Двух- / трёхуровневая иерархия (раздел → подраздел → деталь) | Вложенные `Accordion` с `Primary` → `Secondary` → `Tertiary` | | Разрешить открыть один блок за раз (FAQ) | `selectionMode='single'` | | Разрешить одновременно несколько открытых блоков | `selectionMode='multiple'` | Когда **не** нужен аккордеон: короткие списки (≤ 3 пунктов), критичный контент, который пользователь не должен пропустить, и навигация — для неё используйте `Tabs`. ## API ### Accordion | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `children` | `string \| number \| boolean \| ReactElement> \| Iterable \| ReactPortal \| null \| undefined` | — | no | | | `expanded` | `string \| string[]` | — | no | Controlled состояние | | `expandedDefault` | `string \| string[]` | — | no | Начальное состояние | | `onExpandedChange` | `((value: string) => void) \| ((value: string[]) => void) \| undefined` | — | no | Controlled обработчик измения состояния | | `selectionMode` | `multiple \| single` | — | no | Режим работы аккордиона | ### CollapseBlock | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `afterTitle` | `ReactNode` | — | no | Контент справа от заголовка | | `backgroundPredefined` | `blueBackground \| decorTransparent \| greenBackground \| neutralBackground1Level \| orangeBackground \| pinkBackground \| primaryBackground \| redBackground \| transparent \| violetBackground \| yellowBackground` | `neutralBackground1Level` | no | Слой backgroundPredefined + acrylic (см. `BACKGROUND_PREDEFINED_FILL` в `@cloud-ru/ds-materials`). По умолчанию `material/neutralBackground1Level`. | | `chevronPosition` | `after \| before` | `after` | no | Положение шеврона-раскрытия относительно текста (`before` \| `after`) | | `children` | `string \| number \| boolean \| ReactElement> \| Iterable \| ReactPortal \| null \| undefined` | — | no | | | `className` | `string` | — | no | Дополнительный класс корневого элемента | | `component` | `accordionPrimary \| accordionSecondary \| accordionTertiary` | — | yes | Уровень аккордеона: размер типографики и отступы | | `data-test-id` | `string` | — | no | | | `id` | `string` | — | yes | Уникальный идентификатор блока в группе переключателей | | `keepMounted` | `boolean` | `false` | no | Оставлять ли контент в DOM при сворачивании | | `showChevron` | `boolean` | `true` | no | Показывать ли шеврон-раскрытия рядом с заголовком (по умолчанию `true`) | | `subTitle` | `ReactNode` | — | no | Подзаголовок под строкой заголовка | | `title` | `string` | — | no | Начальное состояние раскрытия (uncontrolled) | | `view` | `elevated \| outline \| simple` | `simple` | no | Визуальный вариант обложки (`simple`, `outline`, `elevated`) | #### Related types - `BackgroundPredefinedFill` = `blueBackground | decorTransparent | greenBackground | neutralBackground1Level | orangeBackground | pinkBackground | primaryBackground | redBackground | transparent | violetBackground | yellowBackground` - `ChevronPosition` = `after | before` - `Component` = `accordionPrimary | accordionSecondary | accordionTertiary` - `View` = `elevated | outline | simple` ### CollapseBlockPrimary | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `afterTitle` | `ReactNode` | — | no | Контент справа от заголовка | | `backgroundPredefined` | `blueBackground \| decorTransparent \| greenBackground \| neutralBackground1Level \| orangeBackground \| pinkBackground \| primaryBackground \| redBackground \| transparent \| violetBackground \| yellowBackground` | — | no | Слой backgroundPredefined + acrylic (см. `BACKGROUND_PREDEFINED_FILL` в `@cloud-ru/ds-materials`). По умолчанию `material/neutralBackground1Level`. | | `chevronPosition` | `after \| before` | — | no | Положение шеврона-раскрытия относительно текста (`before` \| `after`) | | `children` | `string \| number \| boolean \| ReactElement> \| Iterable \| ReactPortal \| null \| undefined` | — | no | | | `className` | `string` | — | no | Дополнительный класс корневого элемента | | `data-test-id` | `string` | — | no | | | `id` | `string` | — | yes | Уникальный идентификатор блока в группе переключателей | | `keepMounted` | `boolean` | — | no | Оставлять ли контент в DOM при сворачивании | | `showChevron` | `boolean` | — | no | Показывать ли шеврон-раскрытия рядом с заголовком (по умолчанию `true`) | | `subTitle` | `ReactNode` | — | no | Подзаголовок под строкой заголовка | | `title` | `string` | — | no | Начальное состояние раскрытия (uncontrolled) | | `view` | `elevated \| outline \| simple` | — | no | Визуальный вариант обложки (`simple`, `outline`, `elevated`) | #### Related types - `BackgroundPredefinedFill` = `blueBackground | decorTransparent | greenBackground | neutralBackground1Level | orangeBackground | pinkBackground | primaryBackground | redBackground | transparent | violetBackground | yellowBackground` - `ChevronPosition` = `after | before` - `View` = `elevated | outline | simple` ### CollapseBlockSecondary | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `afterTitle` | `ReactNode` | — | no | Контент справа от заголовка | | `backgroundPredefined` | `blueBackground \| decorTransparent \| greenBackground \| neutralBackground1Level \| orangeBackground \| pinkBackground \| primaryBackground \| redBackground \| transparent \| violetBackground \| yellowBackground` | — | no | Слой backgroundPredefined + acrylic (см. `BACKGROUND_PREDEFINED_FILL` в `@cloud-ru/ds-materials`). По умолчанию `material/neutralBackground1Level`. | | `chevronPosition` | `after \| before` | — | no | Положение шеврона-раскрытия относительно текста (`before` \| `after`) | | `children` | `string \| number \| boolean \| ReactElement> \| Iterable \| ReactPortal \| null \| undefined` | — | no | | | `className` | `string` | — | no | Дополнительный класс корневого элемента | | `data-test-id` | `string` | — | no | | | `id` | `string` | — | yes | Уникальный идентификатор блока в группе переключателей | | `keepMounted` | `boolean` | — | no | Оставлять ли контент в DOM при сворачивании | | `showChevron` | `boolean` | — | no | Показывать ли шеврон-раскрытия рядом с заголовком (по умолчанию `true`) | | `subTitle` | `ReactNode` | — | no | Подзаголовок под строкой заголовка | | `title` | `string` | — | no | Начальное состояние раскрытия (uncontrolled) | | `view` | `elevated \| outline \| simple` | — | no | Визуальный вариант обложки (`simple`, `outline`, `elevated`) | #### Related types - `BackgroundPredefinedFill` = `blueBackground | decorTransparent | greenBackground | neutralBackground1Level | orangeBackground | pinkBackground | primaryBackground | redBackground | transparent | violetBackground | yellowBackground` - `ChevronPosition` = `after | before` - `View` = `elevated | outline | simple` ### CollapseBlockTertiary | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `afterTitle` | `ReactNode` | — | no | Контент справа от заголовка | | `chevronPosition` | `after \| before` | — | no | Положение шеврона-раскрытия относительно текста (`before` \| `after`) | | `children` | `string \| number \| boolean \| ReactElement> \| Iterable \| ReactPortal \| null \| undefined` | — | no | | | `className` | `string` | — | no | Дополнительный класс корневого элемента | | `data-test-id` | `string` | — | no | | | `id` | `string` | — | yes | Уникальный идентификатор блока в группе переключателей | | `keepMounted` | `boolean` | — | no | Оставлять ли контент в DOM при сворачивании | | `showChevron` | `boolean` | — | no | Показывать ли шеврон-раскрытия рядом с заголовком (по умолчанию `true`) | | `subTitle` | `ReactNode` | — | no | Подзаголовок под строкой заголовка | | `title` | `string` | — | no | Начальное состояние раскрытия (uncontrolled) | #### Related types - `ChevronPosition` = `after | before` ## Примеры ### AfterTitle ```tsx import { Accordion } from '@cloud-ru/ds-accordion'; import { Counter } from '@cloud-ru/ds-counter'; import styles from './styles.module.scss'; export function AfterTitle() { return (
}> Непрочитанные сообщения и уведомления. }> Перемещённые из входящих.
); } ``` ### Appearances ```tsx 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 (
Нейтральный акрил — значение по умолчанию. Акцентный раздел, выделенный основным цветом. Успех, подтверждённые действия. Предупреждение или критическое внимание.
); } ``` ### BasicAccordion ```tsx import { Accordion } from '@cloud-ru/ds-accordion'; import styles from './styles.module.scss'; export function BasicAccordion() { return (
Имя, email, аватар. Пароль, сессии, 2FA.
); } ``` ### ChevronBefore ```tsx import { Accordion } from '@cloud-ru/ds-accordion'; import styles from './styles.module.scss'; export function ChevronBefore() { return (
Разбивка платежа по позициям. Курьер по Москве, 2–3 дня.
); } ``` ### MultipleMode ```tsx import { Accordion } from '@cloud-ru/ds-accordion'; import { useState } from 'react'; import styles from './styles.module.scss'; export function MultipleMode() { const [expanded, setExpanded] = useState(['email']); return (
setExpanded(next ?? [])}> Уведомления на почту. Браузерные push-уведомления. Telegram, Slack, Mattermost.
); } ``` ### NestedLevels ```tsx import { Accordion } from '@cloud-ru/ds-accordion'; import styles from './styles.module.scss'; export function NestedLevels() { return (
Основная карта, истекает 09/28. Зарплатная карта. История операций и выставленные счета.
); } ```