Если разделы равнозначны и пользователь переключается между ними — возьмите CdsTabs. Для иерархии из вложенных узлов подойдёт CdsTree, а для блока, который просто отделяет контент, — CdsCard.
Анатомия
Панели всегда живут внутри группы CdsExpandablePanels: она хранит, какие панели раскрыты, и раздаёт общие настройки. Каждая панель — заголовок-кнопка с иконкой состояния и раскрываемое содержимое.
Вариации
Группа панелей
CdsExpandablePanel без обёртки CdsExpandablePanels не работает — группа отвечает за раскрытие. Простую панель собирают из пропсов title и text, без слотов. По умолчанию раскрыта одна панель: открывая следующую, вы сворачиваете предыдущую.
Внешний вид
Свойство appearance задаёт фон панелей: primary — на обычной странице, secondary — на цветной подложке, transparent — когда панель встроена в уже оформленный блок (карточку, сайдбар).
Отступ между панелями меняет свойство gap — оно принимает число или строку с CSS-единицами.
Компоновка
Свойство variant="accordion" убирает отступы и склеивает панели в единый блок с общими скруглениями. Так список из нескольких вопросов читается как одна таблица, а не как набор карточек.
Раскрытие
Свойство multiple разрешает держать открытыми несколько панелей сразу. Через v-model вы читаете и задаёте, что раскрыто: индекс панели (или её value) в обычном режиме и массив — в multiple. Свойство mandatory запрещает сворачивать последнюю открытую панель, max ограничивает число одновременно раскрытых.
Состояния
Свойство disabled на панели блокирует одну панель, на группе — сразу все: заголовок перестаёт откликаться и теряет контраст. Свойство readonly оставляет панели в текущем состоянии — используйте его в режиме просмотра, когда содержимое нужно показать, но переключать нечего.
Иконки
Иконку состояния задают свойства expand-icon и collapse-icon — на группе, на панели или на отдельном заголовке; значение с ближайшего уровня побеждает. Слот action заголовка заменяет иконку целиком и получает состояние панели, а hide-actions убирает её вовсе.
Слоты
Пропсов title и text хватает для текстовой панели. Как только в заголовке нужен счётчик, статус или иконка — соберите его из CdsExpandablePanelTitle и CdsExpandablePanelContent.
| Слот | Описание |
|---|---|
CdsExpandablePanels → default | Панели группы. В аргументах — навигация next и prev |
CdsExpandablePanel → title | Содержимое заголовка. Замещает текст из title |
CdsExpandablePanel → text | Раскрываемое содержимое. Замещает текст из text |
CdsExpandablePanelTitle → default | Содержимое заголовка. В аргументах — expanded, disabled, readonly |
CdsExpandablePanelTitle → action | Иконка раскрытия. В аргументах — то же состояние панели |
Рекомендации
Сценарии использования
Вопросы и ответы
Классический случай для accordion: список вопросов виден целиком, ответ раскрывается по клику. Одновременно открыт один ответ — так пользователь не теряет место в списке. Содержимое рендерится только после первого раскрытия; если ответы должны попадать в поисковую выдачу, включите eager.
Форма с итогами
Заголовок показывает текущее значение, а раскрытая панель — поле для его изменения. Слот default заголовка получает expanded, поэтому подпись можно менять на лету. Такая форма занимает мало места и не прячет от пользователя то, что он уже заполнил.
Фильтры в сайдбаре
Группы фильтров в боковой панели: multiple держит открытыми нужные секции, transparent убирает лишний фон, а бейдж в заголовке показывает, сколько условий выбрано в свёрнутой группе.
Пошаговое заполнение
Слот группы отдаёт next и prev — кнопки внутри панели переводят пользователя на следующий шаг, а mandatory не даёт закрыть все шаги сразу. Для длинных мастеров с валидацией шагов возьмите CdsSteps.
API
CdsExpandablePanels
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
appearance | "primary" | "secondary" | "transparent" | undefined | 'primary' | Внешний вид панелей |
collapseIcon | IconValue | undefined | 'chevron-up' | Иконка сворачивания панели |
disabled | boolean | null | undefined | null | Заблокированное состояние |
eager | boolean | undefined | — | Принудительно рендерит содержимое компонента при его использовании. Это полезно, если у вас есть контент, который не отображается в DOM, но который необходимо проиндексировать для SEO. |
expandIcon | IconValue | undefined | 'chevron-down' | Иконка раскрытия панели |
focusable | boolean | undefined | — | Подсвечивать заголовок фоном при фокусе |
gap | string | number | undefined | — | Отступ между панелями |
hideActions | boolean | undefined | — | Скрыть иконку раскрытия/сворачивания |
hover | boolean | undefined | true | Подсвечивать заголовок фоном при наведении курсора |
mandatory | boolean | "force" | undefined | — | Обязательный выбор хотя бы одного элемента |
max | number | undefined | — | Максимальное количество выбираемых элементов |
modelValue | any | — | Значение выбранных элементов группы |
multiple | boolean | undefined | — | Разрешить множественный выбор |
readonly | boolean | null | undefined | null | Только для чтения |
required | boolean | "force" | undefined | — | Обязательный выбор хотя бы одного элемента |
selectedClass | string | undefined | — | CSS класс для выбранного состояния |
static | boolean | undefined | — | Отключить анимацию заголовка |
tag | string | JSXComponent<any> | undefined | 'div' | Пользовательский HTML-тег для отображения |
theme | string | undefined | — | Тема компонента |
variant | "default" | "accordion" | undefined | 'default' | Вариант отображения группы панелей |
События
| Имя | Тип | Описание |
|---|---|---|
update:modelValue | [value: unknown] | Срабатывает при изменении выбранных панелей. |
Слоты
| Имя | Тип | Описание |
|---|---|---|
default | CdsExpandablePanelsSlotProps | Панели группы. В аргументах слота доступна навигация по панелям. |
Exposed
| Имя | Тип | Описание |
|---|---|---|
next | () => void | Раскрыть следующую панель |
prev | () => void | Раскрыть предыдущую панель |
CdsExpandablePanel
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
collapseIcon | IconValue | undefined | 'chevron-up' | Иконка сворачивания панели |
disabled | boolean | null | undefined | null | Заблокированное состояние |
eager | boolean | undefined | — | Принудительно рендерит содержимое компонента при его использовании. Это полезно, если у вас есть контент, который не отображается в DOM, но который необходимо проиндексировать для SEO. |
expandIcon | IconValue | undefined | 'chevron-down' | Иконка раскрытия панели |
focusable | boolean | undefined | — | Подсвечивать заголовок фоном при фокусе |
height | string | number | undefined | — | Высота компонента |
hideActions | boolean | undefined | — | Скрыть иконку раскрытия/сворачивания |
hover | boolean | undefined | true | Подсвечивать заголовок фоном при наведении курсора |
maxHeight | string | number | undefined | — | Максимальная высота компонента |
maxWidth | string | number | undefined | — | Максимальная ширина компонента |
minHeight | string | number | undefined | — | Минимальная высота компонента |
minWidth | string | number | undefined | — | Минимальная ширина компонента |
readonly | boolean | null | undefined | null | Только для чтения |
selectedClass | string | undefined | — | CSS класс для выбранного состояния |
static | boolean | undefined | — | Отключить анимацию заголовка |
tag | string | JSXComponent<any> | undefined | 'div' | Пользовательский HTML-тег для отображения |
text | string | undefined | — | Текст раскрываемого содержимого панели |
title | string | undefined | — | Текст заголовка панели |
value | any | — | Значение компонента в группе |
width | string | number | undefined | — | Ширина компонента |
События
| Имя | Тип | Описание |
|---|---|---|
group:selected | [value: { value: boolean; }] | Срабатывает при раскрытии/сворачивании панели. |
Слоты
| Имя | Тип | Описание |
|---|---|---|
default | any | Произвольное содержимое панели. |
text | any | Раскрываемое содержимое панели. |
title | any | Содержимое заголовка панели. |
Exposed
| Имя | Тип | Описание |
|---|---|---|
isSelected | boolean | Панель раскрыта |
select | (value: boolean) => void | Раскрыть/свернуть панель |
toggle | () => void | Переключить раскрытие панели |
CdsExpandablePanelTitle
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
collapseIcon | IconValue | undefined | 'chevron-up' | Иконка сворачивания панели |
expandIcon | IconValue | undefined | 'chevron-down' | Иконка раскрытия панели |
focusable | boolean | undefined | — | Подсвечивать заголовок фоном при фокусе |
height | string | number | undefined | — | Высота компонента |
hideActions | boolean | undefined | — | Скрыть иконку раскрытия/сворачивания |
hover | boolean | undefined | true | Подсвечивать заголовок фоном при наведении курсора |
maxHeight | string | number | undefined | — | Максимальная высота компонента |
maxWidth | string | number | undefined | — | Максимальная ширина компонента |
minHeight | string | number | undefined | — | Минимальная высота компонента |
minWidth | string | number | undefined | — | Минимальная ширина компонента |
readonly | boolean | null | undefined | null | Только для чтения |
static | boolean | undefined | — | Отключить анимацию заголовка |
width | string | number | undefined | — | Ширина компонента |
Слоты
| Имя | Тип | Описание |
|---|---|---|
action | CdsExpandablePanelTitleSlotProps | Иконка раскрытия/сворачивания. В аргументах слота доступно состояние панели. |
default | CdsExpandablePanelTitleSlotProps | Содержимое заголовка. В аргументах слота доступно состояние панели. |
Exposed
| Имя | Тип | Описание |
|---|---|---|
isSelected | boolean | Панель раскрыта |
toggle | () => void | Переключить раскрытие панели |
CdsExpandablePanelContent
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
eager | boolean | undefined | — | Принудительно рендерит содержимое компонента при его использовании. Это полезно, если у вас есть контент, который не отображается в DOM, но который необходимо проиндексировать для SEO. |
Слоты
| Имя | Тип | Описание |
|---|---|---|
default | any | Раскрываемое содержимое панели. |