Card

Card — составной компонент карточки: обложка, заголовок, описание, действия и нижняя строка с исполнителем и сроком.

Card.Root задаёт фон (нейтральный или свой через color), рамку, паддинги и скругление и держит ритм между зонами. Зон три, и все они необязательны: Card.Header — обложка и заголовок поверх неё, Card.Content — основное содержимое, Card.Footer — нижняя строка, отделённая от контента увеличенным отступом.

Содержимое собирается из частей — Card.Title, Card.Description, Card.Preview, Card.Info. Часть смотрит на зону, в которой лежит: Card.Preview в шапке растягивается во всю ширину карточки без паддингов, а в контенте остаётся в их границах со скруглением. Card.Actions — единственная часть вне зон: это прямой ребёнок Card.Root, потому что позиционируется в правом верхнем углу поверх всего остального.

Сама карточка неинтерактивна — это div, а не кнопка: переход по клику вешает потребитель на свою обёртку. Клики по Card.Actions при этом не всплывают, так что кнопки действий с такой обёрткой не конфликтуют.

Строку с аватаром в футере удобно собирать компонентом EntityLabel: у него нет своего фона и паддингов, в отличие от Cell.

Заглушка карточки на время загрузки — отдельный компонент CardSkeleton с теми же частями.

Обложка задачи
Собрать макет лендинга
Черновой макет главной страницы: hero, блок возможностей и подвал. Согласовать с командой перед вёрсткой.

Анатомия

Card.Root
Actions
Header
Preview
Title
Content
Title
Icon | Text
Description
Preview
Footer
Children
Info

Примеры

Заголовок

Card.Title — заголовок карточки в одну строку: длинный текст не переносится, а обрезается многоточием. icon — иконка слева от текста (компонент из @phosphor-icons/react), она не сжимается и остаётся видна целиком при любой длине заголовка.

Собрать макет лендинга
Иконка стоит слева от текста и не сжимается вместе с ним.
Согласовать финальную версию макета главной страницы с командой
Длинный заголовок не переносится на вторую строку.

Описание

Card.Description — текст под заголовком caption-типографикой приглушённым цветом. Обрезается многоточием после четырёх строк, поэтому карточки в списке не разъезжаются по высоте из-за одного длинного текста.

Обрезка описания
Описание обрезается многоточием после четырёх строк. Этот текст специально сделан длинным, чтобы показать поведение: сначала идёт вводная часть, затем подробности, которые уже не помещаются в отведённое место, — детали реализации, ссылки на обсуждения, критерии приёмки и прочие вещи, которые в карточке целиком показывать не нужно.

Превью в шапке

Card.Preview в Card.Header — обложка карточки: растягивается во всю ширину, гасит паддинги Card.Root и прижимается к его верхнему краю без скругления. Высота изображения ограничена, лишнее кадрируется по центру, так что картинки любых пропорций дают одинаковые карточки. src обязателен, alt — по ситуации.

Обложка
Preview в шапке
Изображение растягивается во всю ширину карточки, без паддингов.

Заголовок поверх превью

Card.Preview и Card.Title вместе в шапке: изображение затемняется полупрозрачной подложкой, заголовок становится белым и прижимается к нижнему краю картинки. Отдельного пропа для этого нет — режим включает само соседство частей в Card.Header.

Обложка
Заголовок поверх превью
Когда Card.Title лежит в шапке рядом с Card.Preview, заголовок становится белым и ложится поверх изображения, а картинка затемняется полупрозрачной подложкой.

Превью в контенте

В Card.Content изображение остаётся в границах паддингов и получает скругление. Место в контенте — любое: до заголовка, между заголовком и описанием или после описания, перед футером. Заголовок поверх картинку в контенте не ложится — это поведение только для шапки.

Горы на рассвете
До заголовка
Неделя в горах: маршрут, снаряжение и что пошло не по плану.
После заголовка
Вечерний город
Город после заката: подборка мест, куда стоит дойти пешком.
Перед футером
Полевой отчёт экспедиции: наблюдения, фото и выводы команды.
Полевой лагерь

Футер

Card.Footer — нижняя строка: произвольный контент слева (например, подпись исполнителя) и Card.Info — короткая справка справа. Card.Info прижимается к правому краю, не переносится и не сжимается, поэтому длинное содержимое слева усечётся раньше, чем срок справа.

Задача с исполнителем
Доп. контент футера и Card.Info рендерятся в одну строку внизу карточки, Card.Info прижимается к правому краю.

Действия

Card.Actions — кнопки действий в правом верхнем углу карточки, поверх обложки. Видны только по наведению на карточку или когда фокус внутри блока — с клавиатуры действия достижимы так же, как мышью.

Клики по блоку не всплывают и не запускают действие по умолчанию, поэтому карточку с действиями можно оборачивать в ссылку или вешать onClick на обёртку: нажатие на «Удалить» не приведёт к переходу.

Наведите курсор на карточку
Действия появляются в правом верхнем углу по hover карточки или при фокусе внутри блока действий.

Действия поверх обложки

Блок действий — прямой ребёнок Card.Root, поэтому он лежит выше любой зоны: и над обложкой в шапке, и над заголовком, который на неё наложен. Порядок частей в разметке на это не влияет — Card.Actions можно ставить хоть перед Card.Header, хоть после него.

Кнопки не растворяются в картинке: у блока своя подложка с тенью и скруглением, как у панели инструментов. Отдельного режима «действия на изображении» нет — разметка та же, что и у карточки без обложки.

Обложка
Действия поверх обложки
Блок действий лежит выше изображения и заголовка, а собственная подложка не даёт кнопкам потеряться на картинке.

Цвет

color — цвет фона карточки, принимает любое CSS-значение и заменяет нейтральный фон вместе с рамкой. Цвет текста подбирается автоматически: на тёмном фоне — белый, на светлом — чёрный; описание и Card.Info остаются приглушённее заголовка, но в том же контрастном цвете.

Тёмный фон
Заголовок и описание становятся белыми.
Светлый фон
На светлом фоне текст становится чёрным.

Цвет из названия

Карточки сущностей без собственного цвета — проектов, досок, категорий — красит хелпер getStableColor: одно и то же название всегда даёт один и тот же цвет, поэтому карточка выглядит одинаково во всех списках. Цвет из названия «переедет» при переименовании — чтобы закрепить его навсегда, передайте в хелпер id сущности.

Дизайн-система
Компоненты, токены и документация интерфейса.
Мобильное приложение
Клиент для iOS и Android на общей кодовой базе.
Аналитика
Дашборды, метрики продукта и отчёты для команды.

Цвет и обложка

Цветной фон и обложка не мешают друг другу: Card.Preview в шапке по-прежнему растягивается во всю ширину, а цвет остаётся видимым ниже картинки — в контенте и футере.

Заголовок поверх изображения всегда белый на затемняющей подложке и от color не зависит: контраст ему даёт картинка, а не фон карточки. Автоподбор по фону работает для остального текста — на светлой карточке описание и Card.Info станут чёрными, а заголовок на обложке останется белым.

Обложка маршрута
Горный маршрут
Обложка занимает всю ширину, цветной фон остаётся под ней.
Обложка подборки
Городская подборка
На светлом фоне описание чёрное, а заголовок поверх картинки остаётся белым.

className

style

Не удалось сгенерировать пример - настройте его вручную (example) или отключите (disabled: true). тип пропа "style" (CSSProperties) не является перечислением литералов

API

PropTypeDefault
children*ReactNode-
color

Цвет фона карточки — для тематических карточек вне нейтрального фона. Принимает любое CSS-значение; цвет текста подбирается автоматически

string-
classNamestring-
styleCSSProperties-

Card.Actions

Кнопки действий в правом верхнем углу карточки — видны по наведению или при фокусе внутри; клики не всплывают.

PropTypeDefault
children*

Кнопки действий. Блок абсолютно позиционируется в правом верхнем углу карточки (поверх изображения, если оно есть) и виден по hover карточки или при фокусе внутри; клики по нему не всплывают — карточку можно оборачивать в ссылку или вешать onClick на обёртку

ReactNode-

Card.Header

Шапка: Card.Preview во всю ширину карточки и/или Card.Title поверх изображения.

PropTypeDefault
children*

Содержимое шапки: Card.Preview и/или Card.Title. Card.Preview в шапке растягивается во всю ширину карточки без паддингов; если рядом лежит Card.Title — заголовок ложится поверх изображения (белый текст на затемняющей подложке)

ReactNode-

Card.Content

Основная зона: Card.Title, Card.Description и Card.Preview в любом порядке, плюс произвольный контент.

PropTypeDefault
children*

Содержимое карточки: Card.Title, Card.Description и Card.Preview в любом порядке, а также произвольный контент

ReactNode-

Card.Footer

Нижняя строка: доп. контент и Card.Info в один ряд.

PropTypeDefault

Card.Title

Заголовок: одна строка с многоточием, слева — опциональная иконка (icon).

PropTypeDefault
children*

Текст заголовка. Не переносится — длинный обрезается многоточием в одну строку

ReactNode-
icon

Иконка, отображается слева от заголовка

Icon-

Card.Description

Описание: обрезается многоточием после четырёх строк.

PropTypeDefault
children*

Текст описания. Обрезается многоточием после четырёх строк

ReactNode-

Card.Preview

Изображение карточки: src обязателен, alt — по ситуации; вид зависит от зоны, в которой лежит.

PropTypeDefault
src*

Адрес изображения

string-
alt

Альтернативный текст изображения

string-

Card.Info

Строка доп. информации в футере — прижимается к правому краю и не переносится.

PropTypeDefault
children*

Строка доп. информации. Прижимается к правому краю футера, не переносится

ReactNode-