Графики
Категориальная палитра
Шесть тонов, различающих ряды графика. Единственное место в библиотеке, где цвет не кодирует состояние, — и потому единственное, у которого свои правила.
- Ряд 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