AIST.tech DS  /  Components  /  Tables & Data

Tables & Data.

Таблицы — главный инструмент аналитики и админок. Цель: дать прочитать данные за один взгляд, не утопить в линиях, дать управление без шума. Tabular figures для чисел — всегда.

Анатомия

Базовая таблица: header в caps-метках, тонкая граница между строками, hover-подсветка строки. Без вертикальных линий между колонками — расстояние делает работу.

— базовая таблица, default density
Продукт Регион Звонки Конверсия Статус
Voice OperatorRU18 42128.1%active
MI AnalystRU / KZ9 87022.4%active
Doc ReaderRU12 00519.7%degraded
Custom LLMRU / EU7 99525.6%paused

Принципы анатомии

Плотность

Три режима — см. Density & Information. По умолчанию default; dense — для аналитических отчётов с 100+ строками; relaxed — для коротких списков (5–10 строк) с rich-ячейками.

— dense (24px row, 0.8125rem text) — для аналитики
Week Product Calls Conv Δ wk Δ qtr Health
W1Voice Operator1 42127.4%+1.2+5.8ok
W2Voice Operator1 53228.1%+0.7+6.5ok
W3Voice Operator1 48926.8%−1.3+5.2watch
W4Voice Operator1 61229.4%+2.6+7.8ok
W5Voice Operator1 58828.9%−0.5+7.3ok
W6Voice Operator1 70130.2%+1.3+8.6ok
W7Voice Operator1 09222.1%−8.1+0.5incident
— relaxed (52px row, 0.9375rem text) — для rich списков
КлиентКонтрактARRМенеджер
МТ
М.Видео — Эльдорадо
contract-2026-018
Voice Operator Pro 14 800 000 ₽ А. Калинин
ХЛ
Хлебпром Сибирь
contract-2026-024
MI Analyst 3 200 000 ₽ А. Калинин
КБ
Колор Бизнес Логистика
contract-2026-031
Custom LLM + Doc Reader 21 500 000 ₽ Е. Гиль

Числовые ячейки

Все числа — tabular figures, моноширинно, выравнены вправо. Это закон, не опция. Колонки чисел сравнивают глазами — одинаковая ширина цифр обязательна.

— числа: tabular-nums, моно, right-aligned
Метрика Q1 Q2 Q3 Q4 YoY
Звонки48 29152 10461 88072 451+50.1%
Конверсия23.8%24.1%25.4%26.9%+3.1 п.п.
Cost / call12.40 ₽11.80 ₽10.90 ₽9.40 ₽−24.2%
NPS42485154+12

Форматирование

ТысячиТонкий неразрывный пробел   между разрядами: 48 291. Не запятая, не точка.
ПроцентыБез пробела: 23.8%. Точка — десятичный разделитель.
ДеньгиСумма + неразрывный + знак валюты: 12 400 ₽. Знак валюты после, как в русской типографике.
ПустотаEm-dash «—», цвет muted. Не 0, не N/A, не пустая ячейка.
ТочностьЧем больше число — тем меньше знаков. 1 234 567 ₽, не 1 234 567.42 ₽.

Статус и дельты

Пять статусов — ok, warn, err, muted, и нейтральный. Дельты — знак, цвет, проценты или п.п. — но никогда стрелки↑↓ в тексте (избыточно с цветом и знаком).

— статусы строки
ЗапросИсточникConfidenceСтатус
Топ-5 продуктов Q4cc_calls_2026q494%verified
Отказы по неделямcc_calls_2026q187%verified
Прогноз ARR на Q2contracts_202662%low confidence
Сегментация клиентовno data
Тест-черновикdraft

Сортировка

Кликабельный header — стрелка↑↓ справа. По умолчанию ничего не сортировано (показываем естественный порядок: даты, ID). Клик — сортировать asc; повторный — desc; третий — сбросить.

— сортировка по колонке «Конверсия» ↓
Продукт Звонки Конверсия Cost/call Статус
Voice Operator18 42128.1%9.20 ₽active
Custom LLM7 99525.6%14.80 ₽active
MI Analyst9 87022.4%8.10 ₽active
Doc Reader12 00519.7%11.50 ₽degraded

Выбор и bulk actions

Чекбокс в первой колонке. Когда строки выбраны — над таблицей появляется чёрная панель с контекстными действиями. Без выбора — панели нет.

— 2 строки выбраны, bulk bar активен
2 выбрано
Запрос Автор Создано Статус
Топ-5 продуктов Q4А. Калинин12.04done
Отказы по неделямЕ. Гиль11.04done
Прогноз ARRА. Калинин10.04running
Сегментация клиентовМ. Сафин08.04draft

Sticky колонки и header

Когда колонок больше 5 и идёт горизонтальный скролл — первая колонка остаётся на месте (label), header при вертикальном скролле тоже фиксируется.

— sticky-first column, прокрути таблицу →
Регион W1W2W3W4 W5W6W7W8 W9W10W11W12 YTD
Москва1 4211 5321 4891 6121 5881 7011 0921 6451 7201 8021 8501 92119 373
СПб8219328891 0129881 1016921 0451 1201 2021 2501 32112 373
Екатеринбург5216325897126888013927458209029501 0218 773
Алматы3214323895124886012925456207027508216 473

Toolbar и фильтры

Над таблицей — поиск, кнопки-фильтры, переключатель плотности. Кнопки фильтра — ghost, с числом активных значений. Поиск — по первой видимой колонке (label).

— toolbar + table + pagination — полный паттерн
Запрос Автор Создано Длительность Статус
Топ-5 продуктов Q4А. Калинин12.04 11:423.2 сdone
Отказы по неделямЕ. Гиль12.04 09:188.7 сdone
Прогноз ARR на Q2А. Калинин11.04 17:55runningrunning
Сегментация клиентовМ. Сафин11.04 14:0212.4 сdone
Heatmap по днямЕ. Гиль10.04 16:114.1 сdone
1–5 из 28 · 20 на странице

Пагинация

Простая нумерация в конце — стрелка, страницы, стрелка. Для коротких списков (≤ 20 строк) пагинации нет вообще. Для длинных (> 500) — добавить page-size dropdown и «Перейти на стр.» input.

До 20 строкБез пагинации. Показать всё.
20–500Простая пагинация. 20 на странице по умолчанию.
500++ Page-size picker (20 / 50 / 100), + «Перейти на стр.».
Стриминг данныхInfinite scroll — только если строки можно «забыть» (лог, чат). Не для аналитики.

Богатые ячейки

Внутри ячейки — аватары, мини-полоски прогресса, спарклайны, иконки источников. Цель — дать больше информации в ту же строку, не выходя за её высоту.

— avatar + name, mini-bar, sparkline в одной таблице
Менеджер План Прогресс Динамика YTD
АК
А. Калинин
24 000 000 ₽
78%
18 720 000 ₽
ЕГ
Е. Гиль
18 000 000 ₽
92%
16 560 000 ₽
МС
М. Сафин
12 000 000 ₽
45%
5 400 000 ₽

Empty / Loading

Состояния пустоты и загрузки внутри таблицы. Голос — см. Empty / Error / Loading. Здесь — как именно их разместить в таблице.

— empty state: пусто после фильтра
ЗапросАвторСозданоСтатус
Запросы не найдены Под фильтр «Автор: М. Сафин» в этом квартале ничего не попало.
Попробуйте расширить период или сбросить фильтры.
— loading state: скелетон строк
ЗапросАвторСозданоСтатус

Правила

Когда таблица — правильный выбор

ТаблицаСравнение значений по нескольким колонкам. Сортировка важна. 10+ строк.
Карточки listКаждый элемент имеет «личность» (название, аватар, действия). Колонок мало (2–3).
ГрафикТренд во времени, распределение, доли. Точные значения вторичны.
KPI-блокОдно число — главное. Δ к прошлому периоду, мини-спарклайн.

Do / Don't

DO Числа — mono, tabular, right. Всегда. Это закон. Колонка сравнивается глазами.
DON'T Спанить числа sans-serif. Цифры «0» и «1» будут разной ширины — колонка поплывёт.
DO Hover на строку. Чёткий feedback, что строка — единица.
DON'T Zebra-stripes. Это шум из 80-х. Граница между строками работает лучше.
DO Sort by default — по «главной» колонке. Запросы — по дате ↓. Клиенты — по ARR ↓. Менеджеры — по % плана ↓.
DON'T Алфавит как default. Алфавит — это «я не подумал, что тут важно».
DO Em-dash «—» для пустоты. Цвет muted. Это признак, что там нет данных, а не ноль.
DON'T «N/A» или «—» в foreground. Пустота должна тихо опускаться, не кричать.
DO Status pill — short noun. active, running, verified, paused.
DON'T «В процессе обработки» в колонке. Pill — это ярлык. Длинный текст ломает строку.

Сравнение режимов

Default40 px row, 14 px text. ЛК-листинги, админка, settings.
Dense24 px row, 13 px text. MI Analyst, отчёты, 50+ строк.
Relaxed52 px row, 15 px text. Списки клиентов, контрактов, людей.

Токены

Headercaps 0.6875rem, weight 600letter-spacing 0.08em, muted-foreground
Row height40 / 24 / 52 (default / dense / relaxed)padding 14 / 8 / 18
Body cell0.875rem, line-height 1.4font-body
Number cell0.8125rem, font-mono, tabular-numstext-align right
Border1px solid var(--border)только bottom, не vertical
Hover rowbackground var(--muted)no transition — моментально
Selected rowrgba(0,72,178,0.04)тонкий primary tint
Status okrgba(34,197,94,0.10) / #15803Dbg / text
Status warnrgba(245,158,11,0.10) / #B45309bg / text
Status errrgba(220,38,38,0.10) / var(--destructive)bg / text
Checkbox16 × 16, 1.5 px borderforeground filled when checked