Для короткого сообщения о результате операции подойдёт CdsToast, а пока данные ещё загружаются, покажите CdsSkeletonLoader вместо пустого состояния.
Анатомия
Пустое состояние — вертикальный стек зон. Каждая зона появляется, только когда задан её проп или слот, поэтому состав подбирается под ситуацию: от одной строки заголовка до полного набора с медиа и кнопкой.
Вариации
Наполнение
У каждой текстовой зоны свой проп: headline — крупный акцент («404», «Пусто»), title — суть ситуации, text — подробности и подсказка, что делать. Ширину текста ограничивает text-width (по умолчанию 500), чтобы длинное описание не растягивалось на весь экран.
Медиа
Проп icon показывает иконку, image — изображение (имеет приоритет над иконкой). Размер медиа задаёт size: по умолчанию 96 для иконки и 200 для изображения. Цвет иконки меняет проп color.
Иллюстрации
Legacy-иллюстрации из пакета @central-design-system/illustrations (CDS 3): проп illustration принимает kebab-case имя глобально зарегистрированного компонента (регистрируются через опцию illustrations в createCds). Свою иллюстрацию можно отрендерить слотом illustration.
Выравнивание
Проп justify прижимает контент к краю контейнера: start, center (по умолчанию) или end. Пунктирная рамка в демо показывает границы контейнера.
Действия
Проп action-text добавляет кнопку под контентом; клик по ней приходит событием click:action. Когда действий несколько, рендерите свои кнопки слотом actions — привяжите props.onClick из слота к главной кнопке, чтобы событие click:action продолжало работать.
Слоты
Слоты заменяют контент из пропсов, когда нужна полная свобода разметки.
| Слот | Описание |
|---|---|
media | Медиа-область. Замещает контент из icon и image |
illustration | Иллюстрация. Замещает контент из illustration |
headline | Акцентный заголовок. Замещает текст из headline |
title | Заголовок. Замещает текст из title |
text | Описание. Замещает текст из text |
description | Дополнительное описание. Замещает текст из description |
default | Произвольный контент между описанием и действиями |
actions | Кнопки действий; получает props с обработчиком onClick |
Рекомендации
Сценарии использования
Поиск без результатов
Когда запросу ничего не соответствует, вместо списка появляется пустое состояние. Кнопка из action-text очищает запрос по событию click:action — пользователь возвращается к полному списку одним кликом. Попробуйте ввести запрос, которого нет в списке.
Пустой список
Первое посещение раздела — повод не извиняться за пустоту, а помочь начать: title называет ситуацию, text обещает результат, кнопка из action-text создаёт первую запись. После добавления записи список замещает заглушку.
Ошибка загрузки
Если данные не загрузились, объясните причину и дайте повторить запрос на месте. Кнопка в слоте actions показывает loading на время повтора, а props.onClick из слота сохраняет событие click:action.
Страница 404
headline выводит крупный код ошибки, а href (или to для vue-router) передаётся кнопке действия — она работает как ссылка и уводит пользователя с тупиковой страницы.
API
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
actionText | string | undefined | — | Текст кнопки действия. При указании рендерится кнопка под контентом. |
bgColor | string | undefined | — | Цвет фона компонента |
color | string | undefined | — | Цвет компонента |
content | string | number | undefined | — | Контент, отображаемый в компоненте. |
description | string | undefined | — | Описание |
headline | string | undefined | — | Крупный акцентный заголовок над основным заголовком. |
height | string | number | undefined | — | Высота компонента |
href | string | undefined | — | Атрибут href для ссылки. Если указан, компонент будет вести себя как обычная ссылка |
icon | IconValue | undefined | — | Иконка в медиа-области. |
illustration | string | undefined | — | Legacy-иллюстрация из пакета @central-design-system/illustrations (CDS 3):
kebab-case имя глобально зарегистрированного компонента, например rocket.
Иллюстрации регистрируются через опцию illustrations в createCds. |
image | string | undefined | — | Источник изображения в медиа-области (имеет приоритет над icon). |
justify | "start" | "end" | "center" | undefined | 'center' | Горизонтальное выравнивание контента: start, center, end. |
maxHeight | string | number | undefined | — | Максимальная высота компонента |
maxWidth | string | number | undefined | — | Максимальная ширина компонента |
minHeight | string | number | undefined | — | Минимальная высота компонента |
minWidth | string | number | undefined | — | Минимальная ширина компонента |
size | number | "xs" | "sm" | "md" | "lg" | "xl" | undefined | 'md' | Размер компонента |
text | string | number | undefined | — | Текст, отображаемый в компоненте. |
textWidth | string | number | undefined | 500 | Максимальная ширина блока описания. |
theme | string | undefined | — | Тема компонента |
title | string | undefined | — | Заголовок. |
to | LinkTo | undefined | — | Маршрут назначения или объект для RouterLink. Если указан, компонент будет вести себя как RouterLink |
width | string | number | undefined | — | Ширина компонента |
События
| Имя | Тип | Описание |
|---|---|---|
click:action | [event: MouseEvent] | Клик по кнопке действия. |
Слоты
| Имя | Тип | Описание |
|---|---|---|
actions | { props: { onClick: (event: MouseEvent) => void; }; } | Слот действий; получает props с обработчиком onClick для привязки к своему элементу. |
default | any | Произвольный контент между описанием и действиями. |
description | any | Слот описания (вместо пропа description). |
headline | any | Слот акцентного заголовка (вместо пропа headline). |
illustration | any | Слот медиа-области для иллюстрации (вместо пропса illustration). |
media | any | Слот медиа-области (вместо пропсов image/icon). |
text | any | Слот описания (вместо пропа text). |
title | any | Слот заголовка (вместо пропа title). |