List
Пакет @cloud-ru/ds-list собирает списочный UI дизайн-системы: плоские и вложенные списки, списки с выбором (single / multiple), группы с раскрытием, поиск, закреплённые элементы, виртуализацию и Droplist — тот же список в popover.
Состав пакета
- List — основной компонент. Принимает
items(+pinTop/pinBottom/footer), управляет выбором черезselection, раскрытием групп черезcollapse, поиском черезsearch. Поддерживает виртуализацию для 1000+ элементов. - Droplist — тот же список в popover. Оборачивает
children-триггер и открывает список рядом с ним. Передаёт почти все пропсыList. - ReorderableList — список с drag&drop-переупорядочиванием строк через
@dnd-kit(плюсReorderableDroplist— то же в поповере). - ItemContent — каноничная разметка содержимого item:
label(заголовок),caption(мета справа),description(подпись снизу). Используется как значениеitem.content.
Когда использовать
| Задача | Как решить |
|---|---|
| Навигация/меню/settings sidebar | List с items |
| Выбор из коллекции (радио-группа/чекбоксы) | List + selection={{ mode: 'single' | 'multiple', ... }} |
| Выпадашка-селектор у кнопки/поля | Droplist с children-триггером |
| Группы с раскрытием (inbox/starred/folders) | items типа { type: 'collapse', items: [...] } + collapse |
| Длинный список (1k+) | virtualized на List |
| Закреплённые действия сверху/снизу | pinTop / pinBottom |
Когда не нужен List:
- Простой набор из 2–4 кнопок — используйте
Button+ layout. - Табличные данные с сортировкой/фильтрацией — используйте
Table. - Многошаговая форма — используйте
Stepper.
Установка
pnpm add @cloud-ru/ds-list
import { List, Droplist, ItemContent } from '@cloud-ru/ds-list'
import '@cloud-ru/ds-list/style.css'
Общие принципы
- Contract первый, стайлинг второй. Элементы описываются как данные (
items: Item[]), а не как JSX. Это даёт стабильную клавиатурную навигацию, selection и поиск «из коробки». - ItemContent — единый слот контента. Разметку внутри элемента задаёт не потребитель, а
ItemContent— чтобы заголовок / caption / description выравнивались одинаково во всех пакетах. - Controlled/uncontrolled симметричны. У
selection,collapseиsearchодинаковая форма:defaultValue/value+onChange. Выбирайте по тому, где должен жить state. - Виртуализация — осознанный выбор. Включайте
virtualizedтолько при 1k+ элементов. На коротких списках виртуализация ломает layout-assumptions (динамическая высота, focus-into-view).
Figma
Все три компонента живут в одном Figma-файле «Состояния для list / tab / toggles». Ссылки на конкретные узлы — на страницах компонентов.