Перейти к содержимому
EN
Масштаб
Плотность
Тема
Акцент

Графики

Категориальная палитра

Шесть тонов, различающих ряды графика. Единственное место в библиотеке, где цвет не кодирует состояние, — и потому единственное, у которого свои правила.

Компонент
  • Ряд 1
  • Ряд 2
  • Ряд 3
  • Ряд 4
  • Ряд 5
  • Ряд 6
Разметка
<ul class="inst-legend">
  <li class="inst-legend-item"><span class="inst-legend-swatch" style="--series:var(--chart-1)"></span>Ряд 1</li>
  <li class="inst-legend-item"><span class="inst-legend-swatch" style="--series:var(--chart-2)"></span>Ряд 2</li>
  <li class="inst-legend-item"><span class="inst-legend-swatch" style="--series:var(--chart-3)"></span>Ряд 3</li>
  <li class="inst-legend-item"><span class="inst-legend-swatch" style="--series:var(--chart-4)"></span>Ряд 4</li>
  <li class="inst-legend-item"><span class="inst-legend-swatch" style="--series:var(--chart-5)"></span>Ряд 5</li>
  <li class="inst-legend-item"><span class="inst-legend-swatch" style="--series:var(--chart-6)"></span>Ряд 6</li>
</ul>

Первый закон требует, чтобы цвет кодировал состояние, категорию или полярность. Ряд графика — это категория, поэтому палитра закон не нарушает, а уточняет его. Исключение оговорено в принципах дизайна поимённо, и вместе с ним оговорены пять правил, которых нет больше нигде в библиотеке.

Контракт

Ряд назначается через --series, инлайном, как канал данных: номер ряда приходит вместе с данными и не может быть известен статическому CSS.

Пример
Разметка
<svg class="inst-sparkline" viewBox="0 0 120 32" preserveAspectRatio="none" aria-hidden="true" style="--series:var(--chart-3)">
  <path class="inst-sparkline-area" d="M0,20 24,14 48,18 72,9 96,12 120,5 120,32 0,32Z"/>
  <path class="inst-sparkline-line" d="M0,20 24,14 48,18 72,9 96,12 120,5"/>
</svg>
Что Обязательно Почему
--series на корне ряда да Один раз на <svg> или на метку легенды — все узлы ряда наследуют её
Тон через --series, а не напрямую да Компонент читает приёмник, а не тон ряда: иначе переназначить ряд можно только правкой разметки каждого узла
Легенда при двух рядах и больше да Без расшифровки цвет ничего не сообщает
--series при одном ряде нет Умолчание — --accent-mark: один ряд не категория, различать нечего

Компоненты, читающие --series:

Компонент Узлы
Легенда inst-legend-swatch
Спарклайн inst-sparkline-line · inst-sparkline-area · inst-sparkline-last
Аватар Тон группы: аватар различает сущности, а не сообщает состояние — та же работа, что у ряда

Кольцо и мера --series не читают: они показывают одну величину и берут --tone-mark.

/* Именованный ряд приложения — привязка номера к показателю в одном месте */
.chart-render  { --series: var(--chart-1); }
.chart-physics { --series: var(--chart-2); }

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

Доступность

Цвет не единственный носитель Ряд всегда назван словом в легенде. Палитра различает ряды, но не сообщает о них ничего — сообщает подпись
Дальтонизм Разная светлота внутри палитры выбрана для этого: при потере тона ряды остаются различимы по яркости
Чёрно-белая печать Тот же механизм. Шесть тонов одной светлоты слились бы в один серый
Контраст Каждый тон держит 3:1 против поверхности в пяти темах: линия и метка ряда — несущие знаки
Подписи Категориальный тон не используется для текста: 3:1 хватает знаку, но не подписи. Текст берёт --text-primary или --tone-ink
Режим принудительных цветов Категориальные тона сбрасываются системой, и это правильно: различать ряды в таком режиме обязана легенда со словами

Варианты

Токен Тон Светлота (светлая тема) Светлота (тёмная)
--chart-1 292 0.520 0.700
--chart-2 320 0.600 0.760
--chart-3 355 0.550 0.720
--chart-4 55 0.650 0.800
--chart-5 115 0.580 0.740
--chart-6 190 0.620 0.780

Значения записаны в OKLCH через light-dark(): тон и насыщенность держатся, а светлота переворачивается по теме. От статусных тонов палитра отстоит минимум на 25°: коридоры 25 (ошибка), 85 (предупреждение) и 150 (успех) закреплены навсегда, и ряд, попавший в них, читается как «упало» или «готово».

Ряд №3 стоит на 355, то есть в 30° от ошибочного 25: это ближайшее сближение со статусным тоном во всей палитре, и дальше её расширять нельзя не только из-за различимости, но и потому, что свободных коридоров не осталось.

От акцента такой гарантии нет и быть не может. Акцент — ручка на четыре положения: петроль 215, графит 250, индиго 275, глина 45. Четыре положения закрывают слишком много круга: глина стоит в 10° от ряда №4 (55). Вместо угловой гарантии здесь работает разделение ОБЛАСТЕЙ — акцент не заходит внутрь графика, категориальный цвет не выходит наружу. Единственное место, где они встречаются на одном экране, — легенда многорядного графика рядом с интерфейсом, и там их различает светлота.

API

Токены
ИмяЗначениеОткуда
переменная
--seriesПриёмник тона. Компонент ряда читает её, а не тон напрямую--accent-markзадаёт приложение
токен
--chart-1Тон ряда №1. Порядок — часть контракта: ряд №1 всегда этот тонlight-dark(oklch(0.520 0.150 292), oklch(0.700 0.130 292))одно на все ячейки
--chart-2Тон ряда №2. Порядок — часть контракта: ряд №2 всегда этот тонlight-dark(oklch(0.600 0.150 320), oklch(0.760 0.120 320))одно на все ячейки
--chart-3Тон ряда №3. Порядок — часть контракта: ряд №3 всегда этот тонlight-dark(oklch(0.550 0.140 355), oklch(0.720 0.120 355))одно на все ячейки
--chart-4Тон ряда №4. Порядок — часть контракта: ряд №4 всегда этот тонlight-dark(oklch(0.650 0.120 55), oklch(0.800 0.110 55))одно на все ячейки
--chart-5Тон ряда №5. Порядок — часть контракта: ряд №5 всегда этот тонlight-dark(oklch(0.580 0.130 115), oklch(0.740 0.120 115))одно на все ячейки
--chart-6Тон ряда №6. Порядок — часть контракта: ряд №6 всегда этот тонlight-dark(oklch(0.620 0.110 190), oklch(0.780 0.100 190))одно на все ячейки

Почему кит устроен именно так — конституция · Открытый код под MIT, github.com/keshon/instrument