Cell

Cell — составной компонент строки списка: аватар, текстовый блок и действия в один ряд.

Cell.Root задаёт размер (size), цвет (variant с appearance) и ритм между частями, а также включает режим выбора (selectValue). Части внутри необязательны и свободно комбинируются: Cell.Avatar — слот под аватар слева, Cell.Content — текстовый блок с Cell.Title, Cell.Description и Cell.Tags, Cell.Actions — кнопки справа.

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

Списки с выбором собирает Cell.Group: она держит выбранное значение, а вложенные Cell.Root с selectValue получают слева чекбокс или радио и становятся кликабельными целиком; вне группы selectValue не действует.

Ячейка рассчитана на список сущностей во всю ширину: у неё есть фон, паддинги и минимальная высота. Подпись с аватаром внутри другого компонента — например строка исполнителя в футере Card — собирается не ячейкой, а EntityLabel: он без фона и паддингов и занимает ровно столько места, сколько нужно тексту.

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

T
Tulls
Организация, 12 проектов

Анатомия

Cell.Group
Cell.Root
Checkbox | Radio (при selectValue)
Avatar
Content
Title
Icon | Text
Description
Tags
Actions

Примеры

Аватар

Cell.Avatar — слот слева от текста: Avatar рендерится в нём как есть, скругление и оверлеи вроде статуса остаются на Avatar.Root. Размер аватару задавать не нужно — его раздаёт ячейка по своему size, а свой size на Avatar.Root эту раздачу перебивает, как в AvatarGroup.

В режиме загрузки слот подменяет содержимое круглой плашкой-скелетоном того же размера. Слот необязателен: ячейка без аватара просто начинается с текстового блока.

TU
Tulls User
Круглый аватар со статусом — всё задаётся на Avatar.Root.
Р
Разработка
Скруглённый квадрат с цветом из названия проекта.

Иконка в заголовке

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

Разработка
Проект организации Tulls

Только заголовок

Без Cell.Description текстовый блок центрируется по вертикали ячейки — отдельного пропа для этого нет, режим включает само отсутствие описания. Высота ячейки при этом не меняется, поэтому строки с описанием и без него в одном списке не разъезжаются.

М
Маркетинг

Обрезка текста

Cell.Content занимает всё свободное место между аватаром и действиями, а заголовок и описание живут в одну строку: не поместившийся текст обрезается многоточием. Ужимается именно текст — аватар, иконка заголовка и кнопки действий сохраняют свой размер, как бы ни было длинно название.

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

Теги

Cell.Tags — ряд тегов под описанием: обычно Badge — владелец, статус, категория. Теги лежат с переносом и не обрезаются, поэтому строка с ними выше своей ступени.

Ступень каскада размера внутри слота всегда xs: бейджи под подписью остаются компактными при любом size ячейки, задавать им размер не нужно. В режиме загрузки теги не рисуются, но место под ними сохраняется.

Р
Разработка
Внутренние инструменты команды
Tullsактивен

Действия

Cell.Actions — кнопки действий справа: блок скрыт, пока курсор не наведён на ячейку, и не занимает места, когда спрятан. Раскрывает его только наведение — фокус с клавиатуры блок не показывает (в отличие от Card).

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

Р
Наведите курсор на ячейку
Действия появляются справа по hover ячейки.

Размеры

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

xs и sm — плотные списки: подсказки поиска, вложенные перечни. md (по умолчанию) — обычная строка списка сущностей. lg и xl — акцентные строки, где ячейка работает как крупная карточка-ряд.

Высота именно минимальная: ячейки одной ступени стоят ровным списком, но строка с длинным описанием вырастет, а не обрежет текст.

Р
size="xs"
Проект организации Tulls
Р
size="sm"
Проект организации Tulls
Р
size="md"
Проект организации Tulls
Р
size="lg"
Проект организации Tulls
Р
size="xl"
Проект организации Tulls

Вариант

variant — смысловой цвет строки из общей палитры ДС: primary — акцент, secondary — второстепенная, success / warning / danger — состояния, default — нейтральная метка. Цвета и формулы те же, что у Badge и Button, поэтому строка и бейдж внутри неё не спорят между собой.

Без variant (и без appearance) ячейка остаётся нейтральной строкой списка — это не то же самое, что variant="default": тот уже заливает фон цветом default-варианта. По умолчанию цвет подаётся сплошной заливкой (appearance="solid"), текст на ней — контрастный, описание приглушается прозрачностью.

Ч
Черновик
Ещё не в работе
Вр
В работе
Взято в спринт
Нр
На ревью
Ждёт проверки
Г
Готово
Задача закрыта
Сб
Срок близко
Остался день
П
Просрочено
Срок вышел вчера

Внешний вид

appearance — как подать цвет варианта: solid (по умолчанию) — сплошная заливка с контрастным текстом, ghost — без своего фона, подложка цвета варианта только на ховере, outline — обводка при нейтральном фоне, dashed — та же обводка пунктиром.

Проп работает в паре с variant, но включить окраску может и сам: appearance без variant красит ячейку default-вариантом. Исключение — ghost: без variant строка остаётся нейтральной, только прозрачной — так список лежит на фоне контейнера (стекло поповера фильтров), а чекбокс в режиме выбора остаётся обычным. Подсветка по наведению подстраивается под подачу — заливка темнеет, у ghost появляется подложка, у обводки фон слегка окрашивается.

П
appearance="solid"
Срок вышел вчера
П
appearance="ghost"
Срок вышел вчера
П
appearance="outline"
Срок вышел вчера
П
appearance="dashed"
Срок вышел вчера

Ячейка-ссылка

Пропа href у ячейки нет: оборачивайте Cell.Root в ссылку приложения (в web — next/link), подсветку по наведению ДС берёт на себя. Ячейка должна быть прямым ребёнком ссылки — лишняя обёртка между ними погасит подсветку.

Мультивыбор

Cell.Group с mode="multiple" (по умолчанию) — чекбоксы: value — массив выбранных значений, onValueChange получает такой же массив. Ячейка с selectValue внутри группы становится лейблом чекбокса — клик по всей строке, а не только по квадратику, переключает выбор.

Сама группа — display: contents: на раскладку списка она не влияет, gap и обёртки остаются вашими.

Одиночный выбор

mode="single" — те же ячейки, но с радио: value — одно значение или null. Колбэк здесь приходит от радиогруппы и отдаёт объект, а не значение: onValueChange={(details) => setValue(details.value)}.

API

PropTypeDefault
children*ReactNode-
selectValue

Режим выбора: если передан, слева появляется чекбокс (или радио — по mode у Cell.Group) с этим value, клик по строке переключает выбор. Действует только внутри Cell.Group, вне её ячейка — обычная строка

string-
disabled

Недоступный вариант в режиме выбора: строка гаснет, клик по ней не переключает выбор. Без selectValue не действует

booleanfalse
size

Размер ячейки — задаёт высоту, паддинги, промежуток между частями, кегль заголовка с описанием и размер вложенного аватара

Sizemd
variant

Смысловой вариант — задаёт цвет ячейки. Без него (и без appearance) ячейка нейтральная, как обычная строка списка

Variant-
appearance

Подача цвета варианта: сплошная заливка, обводка (сплошная либо пунктирная) или ghost — без своего фона, подложка только на ховере. Работает в паре с variant — любой из двух пропов включает окраску, кроме ghost: без variant он оставляет строку нейтральной, только прозрачной (список на стекле поповера)

Appearancesolid
classNamestring-
styleCSSProperties-

Cell.Group

Группа ячеек для выбора: держит value и onValueChange, вложенные Cell.Root с selectValue биндятся к ней; display: contents — на раскладку списка не влияет.

PropTypeDefault
mode"multiple"-
children

Вложенные Checkbox.Root — биндятся к группе по своему value.

ArkCheckboxGroupProps["children"]-
value

Контролируемый список выбранных значений. Пара с onValueChange. The controlled value of the radio group

ArkCheckboxGroupProps["value"]-
defaultValue

Начальный список выбранных значений для неконтролируемой группы. The initial value of the checked radio when rendered. Use when you don't need to control the value of the radio group.

ArkCheckboxGroupProps["defaultValue"]-
onValueChange

Колбэк смены выбора: получает массив значений отмеченных чекбоксов. Function called once a radio is checked

ArkCheckboxGroupProps["onValueChange"]-
disabled

Отключает всю группу разом. If true, the radio group will be disabled

ArkCheckboxGroupProps["disabled"]-

Cell.Avatar

Слот под аватар — обычно Avatar.Root с частями; размер приходит от size ячейки, в режиме загрузки слот рисует плашку-скелетон.

PropTypeDefault
children*

Аватар ячейки — обычно Avatar.Root с частями

ReactNode-

Cell.Content

Текстовый блок: занимает всё место между аватаром и действиями, без описания центрируется по вертикали.

PropTypeDefault
children*ReactNode-

Cell.Title

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

PropTypeDefault
children*ReactNode-
icon

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

Icon-

Cell.Description

Вторая строка — приглушённое описание, тоже в одну строку с многоточием.

PropTypeDefault
children*ReactNode-

Cell.Tags

Ряд тегов под описанием — бейджи с переносом; внутри слота ступень размера всегда xs.

PropTypeDefault
children*

Теги строки — обычно Badge.Root; лежат в ряд с переносом

ReactNode-

Cell.Actions

Кнопки действий справа: видны по наведению на ячейку, клики не всплывают.

PropTypeDefault
children*ReactNode-