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

Основания

Токены

Полный справочник. Четыре яруса, и разделение между ними — весь смысл файла: компонент имеет право видеть ярусы 2 и 3, ярус 1 — никогда.

Компонент
Ярусы
1. Рампы
Сырые шаги. Не меняются между темами
2. Семантика
Для чего цвет нужен. Одно объявление через light-dark()
3. Роли
Отступы и размеры по назначению. Их перенастраивает плотность
4. Компонент
--btn-bg и подобные, 2–3 переменные
Разметка
<div class="inst-panel">
  <div class="inst-panel-header">
    <span class="inst-panel-title">Ярусы</span>
  </div>
  <div class="inst-panel-body">
    <dl class="inst-kv">
      <dt>1. Рампы</dt><dd>Сырые шаги. Не меняются между темами</dd>
      <dt>2. Семантика</dt><dd>Для чего цвет нужен. Одно объявление через light-dark()</dd>
      <dt>3. Роли</dt><dd>Отступы и размеры по назначению. Их перенастраивает плотность</dd>
      <dt>4. Компонент</dt><dd>--btn-bg и подобные, 2–3 переменные</dd>
    </dl>
  </div>
</div>

Контракт

Компонент видит ярусы 2 и 3 — семантику и роли. Ярус 1 не видит никогда.

.my-thing {
  /* ярус 2: для чего цвет нужен */
  color: var(--text-primary);
  /* ярус 3: отступ по назначению */
  padding: var(--pad-panel);
  /* ярус 4: точка настройки самого компонента.
     У кнопки таких пять: --btn-bg и соседи */
  background: var(--btn-bg);
}
Что Обязательно Почему
Ярусы 2 и 3 в компоненте да Ярус 1 — сырьё: рампа между темами не меняется, и обращение к ней захардкоживает светлую тему
Один экземпляр каждого параметра да Дубликат — это будущее расхождение, и оно наступает быстрее, чем кажется
2–3 переменные на компонент да Ярус 4 — точки настройки, а не копия всех свойств
Значение через light-dark() да Второй темы как отдельного блока не существует

Доступность

Проверка go -C tools run ./cmd/contrast читает настоящий tokens.css и резолвит light-dark(), color-mix() и var() так же, как браузер. Новая пара токенов добавляется туда вместе с токеном
Пороги Текст 4.5:1, метка 3:1 (против поверхности и против дорожки), несущая рамка 3:1
Шесть тем Каждая пара проверяется во всех шести, а не в двух
Кегли в rem Настройка «размер шрифта по умолчанию» в браузере работает; высоты применяются как min-block-size
Пол кегля --text-2xs, 11px. Ниже токена нет

Устройство

Сырые шаги. Между темами не меняются. Рампа непрерывна по определению: шаг, не занятый семантикой, — резерв под приложение и графики, а не мусор.

Группа Токены Тон
Нейтраль --n-0 … --n-14 --hue-neutral (75 тёплый / 250 холодный)
Акцент --a-1 … --a-6 250°
Успех --ok-1 --ok-2 --ok-3 --ok-4 --ok-5 --ok-6 150°
Предупреждение --warn-1 --warn-3 --warn-4 --warn-5 --warn-6 85°
Ошибка --err-1 --err-3 --err-4 --err-5 --err-6 25°

Шага 2 у статусов нет: у них закреплённые роли (1 — фон в светлой, 3 — текст в тёмной, 4 — заливка в светлой, 5 — текст в светлой, 6 — резерв под графики), и свободный шаг между 1 и 3 не понадобился ни разу. Значения светлот и разбор ролей — в цвете.

Ручка тона

Токен Значение Что делает
--hue-neutral 75 Уклон нейтрали. 75 — тёплый, 250 — холодный. Цветность 0.002–0.006: ниже порога осознанного замечания

Ярус 2 — семантика

Одно объявление на токен через light-dark(). Второго блока токенов не существует, поэтому и расходиться нечему.

Поверхности

Токен Светлая Тёмная
--surface-sunken --n-2 --n-14
--surface-page --n-1 --n-13
--surface-raised --n-0 --n-12
--surface-overlay --n-0 --n-11
--surface-field --surface-recessed, в обеих темах
--surface-hover чёрный 3.5% белый 4.5%
--surface-active чёрный 6.5% белый 8%
--surface-selected --a-4 14%, в обеих темах
--surface-recessed чёрный 6% белый 5%
--surface-recessed-hover чёрный 2.5% белый 1.5%
--surface-recessed-active чёрный 7.5% белый 6.2%

Три последних — утопление контрола: умолчание кнопки, тег, запасная заливка бейджа. Чёрный поверх, а не своя ступень рампы, и это не мелочь. Ступень задаёт светлоту абсолютно и потому знает одну глубину, а контрол лежит то на странице, то на панели, то в модалке — и от каждой обязан отойти на одинаковый шаг. На приподнятой панели --surface-sunken давал провал 0.087 вместо 0.033: панель уже сама на шаг выше, и шаги складывались.

Направление зависит от того, где мы на рампе, как и у --surface-hover. В светлых темах контрол утоплен — чёрная плёнка; в тёмных приподнят — белая.

Это не отказ от провала, а единственная доступная его форма. Плёнка вычитает светлоту, а на дне рампы вычитать не из чего: страница тёмной темы — rgb(12,12,12), и даже сплошной чёрный даёт против неё 1.073 при 1.142 у светлых. Нужного перепада затемнением не существует. А у умолчания кнопки заливка — единственный признак: рамки нет и тени нет, обе снял провал.

Инвариант поэтому формулируется без слова «глубина»: поверхность контрола обязана отличаться от своей подложки на различимую ступень.

Знак плёнки меняется, порядок громкости — нет. Средняя строка служит двум работам сразу: это и наведение умолчания, и заливка покоя мягкого веса inst-btn--soft. Значит она обязана быть тише умолчания в обеих темах, иначе третья ступень лестницы звучит громче второй. Громкость здесь — модуль перепада к подложке, а не альфа: в светлых темах тише значит меньше чёрного, в тёмных — меньше белого.

Сторожат это три пары cmd/contrast: «кнопка против панели», «кнопка против страницы» и «лестница: мягкая против умолчания».

Текст

Токен Светлая Тёмная Порог
--text-primary --n-12 --n-1 4.5:1
--text-secondary --n-9 --n-5 4.5:1
--text-muted --n-8 --n-6 4.5:1
--text-faint --n-7 --n-7 3:1 — не для текста, который читают

Рамки

Токен Светлая Тёмная Требование
--border-subtle чёрный 7% белый 6% Декоративная
--border чёрный 12% белый 11% Декоративная
--border-strong чёрный 22% белый 20% Декоративная
--border-control чёрный 46% белый 38% Несущая, 3:1

Акцент

Токен Светлая Тёмная Работа
--accent-text --a-5 --a-3 Текст, 4.5:1
--accent-mark --a-4 --a-3 Метка без подписи, 3:1 против поверхности и дорожки
--accent-bg --a-1 --a-4 15% Тонированный фон
--accent-solid --a-4, в обеих темах Заливка кнопки, потолок светлоты 0.56
--accent-on --n-0, в обеих темах Подпись на заливке
--accent-hover --a-5, в обеих темах Уходит от цвета подписи, а не к нему
--accent-border --a-4 --a-3 Рамка акцентированного контрола
--focus-ring --a-4 --a-3 Кольцо фокуса — обычный акцент. От заливки, которую оно обводит, его отделяет зазор в 2px из outline-offset, а не цвет, подобранный ради одного этого случая

Статусы

Токен Светлая Тёмная
--ok-text --ok-5 --ok-3
--ok-bg --ok-1 --ok-4 16%
--warn-text --warn-5 --warn-3
--warn-bg --warn-1 --warn-4 16%
--err-text --err-5 --err-3
--err-bg --err-1 --err-4 16%

Третьего токена — «заливки» между текстом и фоном — нет. Исключение одно, акцент: у него есть случай, которого нет у статусов, — заливка под белой подписью.

Тон через атрибут

data-tone ставит три переменные, компонент читает их и больше ничего о тоне не знает.

Значение --tone-ink --tone-mark --tone-bg
neutral --text-secondary --text-secondary --surface-sunken
running --accent-text --accent-mark --accent-bg
ok --ok-text --ok-text --ok-bg
warn --warn-text --warn-text --warn-bg
error --err-text --err-text --err-bg

Графики

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

Прочее

Токен Светлая Тёмная
--track чёрный 10% белый 16%
--switch-track чёрный 45% белый 36%
--scrim чёрный 32% чёрный 58%
--shadow-color-near чёрный 6% чёрный 30%
--shadow-color-far чёрный 10% чёрный 45%
--shadow-popover двухслойная, короткая
--shadow-modal двухслойная, длинная

Порядок слоёв

Токен Значение
--z-sticky 10
--z-popover 100
--z-modal 1000

Ярус 3 — роли

Единственный ярус, который перенастраивает плотность, и единственная причина, по которой в компонентах нет констант. Объявлен через :where() — нулевая специфичность, приложение переопределяет без борьбы. Значения ниже — для плотности по умолчанию, остальные две — в плотности.

Высоты и отступы контролов

Токен Значение
--control-h-xs 20px
--control-h-sm 26px
--control-h-md 32px
--control-h-lg 38px
--control-pad-sm --space-4
--control-pad-md --space-5
--control-pad-lg --space-6

Отступы по назначению

Токен Значение
--pad-panel --space-5
--pad-card --space-6
--pad-cell-x --space-4
--row-pad-y --space-3
--gap-row --space-3
--gap-inline --space-4
--gap-section --space-7

--gap-section — четвёртая ступень ритма: просвет между разделами, тогда как --gap-row работает внутри раздела. Значение не назначено, а выведено: это --gap-row, поднятый на четыре ступени шкалы. Шкала устроена так, что +4 ступени дают ровно ×4 в каждой точке — 4→16, 6→24, 8→32, 12→48, 16→64, — поэтому отношение держится во всех пятнадцати сочетаниях масштаба и плотности без отдельного подбора.

Роль появилась после обмера собранных экранов. Без неё ярус упирался в 16px: самое громкое, чем можно было разделить два блока, было того же порядка, что просвет внутри блока, — и экран читался сплошным потоком. Ступени 24, 32, 48 и 64 при этом лежали в шкале без единой роли.

Глифы и жёлобы

Токен Значение
--size-dot 6px
--size-check 15px
--size-switch-w 30px
--size-switch-h 18px
--size-thumb 14px
--size-track 4px
--size-meter 6px
--size-spinner 14px
--size-icon 18px
--size-chevron 10px
--size-marker 2px
--size-gutter 14px
--size-indent 14px
--label-col 104px

Раскладка

Токен Значение
--aside-w 232px
--container-max 76rem
--split-side 18rem
--split-main 30rem
--col-min 260px

Шкала

Не привязаны к теме и не перенастраиваются плотностью. Подробности — в типографике и ритме и форме.

Типографика

Группа Токены
Семейства --font-sans --font-mono
Кегли --text-2xs --text-xs --text-sm --text-md --text-lg --text-xl --text-2xl
Начертания --weight-normal --weight-medium
Интерлиньяж --leading-tight --leading-ui --leading-code --leading-prose
Трекинг --tracking-tight --tracking-normal
Мера --measure

--measure — предельная длина строки, 68ch. Классическая норма 45–75 знаков; 68 стоит у верхнего края, потому что интерфейсные описания короткие и переносятся редко. Единица ch, а не пиксели: иначе мера разъезжается с кеглем на каждой из пяти ступеней масштаба.

Роль появилась после обмера: 68ch было вписано литералом в двух местах, а тело баннера меры не имело вовсе и на контейнере 1440px доходило до 105 знаков. Обрезается тело баннера, а не сам баннер: подложка сообщения уровня страницы идёт во всю ширину, текст на ней — нет.

Пространство и форма

Группа Токены
Шкала --space-1 … --space-10 (2 · 4 · 6 · 8 · 12 · 16 · 24 · 32 · 48 · 64)
Радиусы --radius-2xs 2 · --radius-xs 4 · --radius-sm 6 · --radius-md 8 · --radius-lg 12 · --radius-full. У контролов — --radius-control-sm/md/lg, они едут за плотностью; у пометок (всё мельче 8px) — --radius-mark, он не едет
Линии --hairline (0.5px от 1.5dppx, иначе 1px) · --stroke 1px

Движение

Группа Токены
Длительности --dur-1 80ms · --dur-2 140ms · --dur-3 220ms
Плавность --ease-out · --ease-in-out

Ярус 4 — компонент

Живёт не здесь, а рядом с компонентом. Правило одно: 2–3 переменные, не больше, и вариант описывается ими, а не переписыванием блока.

.my-btn--accent {
  --btn-fg: var(--accent-on);
  --btn-bg: var(--accent-solid);
}

Список переменных конкретного компонента — на его странице: например, у кнопки их пять, у таблицы — свои.

Варианты

Атрибут color-scheme --hue-neutral Ещё
нет по системе 75
data-theme="light-neutral" light 75 --tint: 0 — умолчание, чистый серый
data-theme="light" light 75 --tint: 2 — тёплая
data-theme="light-cool" light 250 --tint: 2 — холодная
data-theme="dark-soft" dark 75 Стопка на ступень вверх, плюс подписи статусов
data-theme="dark" dark 75

Правила

Правило Следствие
Компонент видит ярусы 2 и 3 --n-3 в компоненте — захардкоженная светлая тема; 14px — сломанная плотность
У смыслового тона ровно два токена --*-text (метка) и --*-bg (фон). Третий не проходил порог на дорожке
Текст и метка — разные передние планы --tone-ink держит 4.5:1, --tone-mark — 3:1, но против двух фонов
Несущая и декоративная рамка — разные токены --border-control обязан 3:1, --border — нет
Дефолты объявляются через :where() Дефолт с той же специфичностью, что переопределение, — не дефолт
Новое значение — роль, а не константа Иначе оно не переживёт compact
Второго акцентного тона не бывает Это не запрос фичи, а сигнал, что смысл несёт что-то другое

Что брать, а что нет

Используйте Возьмите другое
Ярус 2 — семантика: --text-primary, --surface-raised, --ok-text Ярус 1 (--n-3, --a-4) — это захардкоженная светлая тема. Разбор рамп — в цвете
Ярус 3 — роли: --pad-panel, --control-h-md, --size-dot Число в компоненте — оно сломает плотность, см. плотность
Ярус 4 — 2–3 переменные компонента для варианта Копию всего блока правил — вариант должен быть двумя строками, как у кнопки
Новый параметр — как роль Новую константу — константа переживёт вас и сломает compact. Шкалы — в ритме и форме
Переопределение роли в приложении !important — роли объявлены через :where(), борьбы не будет. Пример — форма

API

Перечисляет генератор, читая src/tokens.css. Список не пишется руками и потому не может отстать от исходников.

Токены
ИмяЗначениеОткуда
токен
--a-1oklch(0.960 0.018 215)база +3: акцент
--a-2oklch(0.800 0.078 215)база +3: акцент
--a-3oklch(0.700 0.100 215)база +3: акцент
--a-4oklch(0.545 0.098 215)база +3: акцент
--a-5oklch(0.450 0.082 215)база +3: акцент
--a-6oklch(0.330 0.060 215)база +3: акцент
--accent-bglight-dark(var(--a-1), color-mix(in oklab, var(--a-4) 15%, transparent))одно на все ячейки
--accent-borderlight-dark(var(--a-4), var(--a-3))одно на все ячейки
--accent-edgecolor-mix(in oklab, var(--a-3) 50%, transparent)одно на все ячейки
--accent-hovervar(--a-5)одно на все ячейки
--accent-marklight-dark(var(--a-4), var(--a-3))одно на все ячейки
--accent-onvar(--n-0)одно на все ячейки
--accent-solidvar(--a-4)одно на все ячейки
--accent-textlight-dark(var(--a-5), var(--a-3))база +1: тема
--aside-w232pxбаза +4: масштаб
--borderlight-dark(oklch(0 0 0 / 0.12), oklch(1 0 0 / 0.11))одно на все ячейки
--border-controllight-dark(oklch(0 0 0 / 0.46), oklch(1 0 0 / 0.38))одно на все ячейки
--border-stronglight-dark(oklch(0 0 0 / 0.22), oklch(1 0 0 / 0.20))одно на все ячейки
--border-subtlelight-dark(oklch(0 0 0 / 0.07), oklch(1 0 0 / 0.06))одно на все ячейки
--chart-1light-dark(oklch(0.520 0.150 292), oklch(0.700 0.130 292))одно на все ячейки
--chart-2light-dark(oklch(0.600 0.150 320), oklch(0.760 0.120 320))одно на все ячейки
--chart-3light-dark(oklch(0.550 0.140 355), oklch(0.720 0.120 355))одно на все ячейки
--chart-4light-dark(oklch(0.650 0.120 55), oklch(0.800 0.110 55))одно на все ячейки
--chart-5light-dark(oklch(0.580 0.130 115), oklch(0.740 0.120 115))одно на все ячейки
--chart-6light-dark(oklch(0.620 0.110 190), oklch(0.780 0.100 190))одно на все ячейки
--col-min260pxбаза +4: масштаб
--container-max76remбаза +4: масштаб
--control-h-lg38pxбаза +14: плотность · масштаб
--control-h-md32pxбаза +14: плотность · масштаб
--control-h-sm24pxбаза +14: плотность · масштаб
--control-h-xs20pxбаза +14: плотность · масштаб
--control-pad-lgcalc(var(--control-h-lg) * var(--control-ratio-lg))одно на все ячейки
--control-pad-mdcalc(var(--control-h-md) * var(--control-ratio-md))одно на все ячейки
--control-pad-smcalc(var(--control-h-sm) * var(--control-ratio-sm))одно на все ячейки
--control-ratio-lg0.42одно на все ячейки
--control-ratio-md0.375одно на все ячейки
--control-ratio-sm0.31одно на все ячейки
--dur-180msодно на все ячейки
--dur-2140msодно на все ячейки
--dur-3220msодно на все ячейки
--ease-in-outcubic-bezier(0.65, 0, 0.35, 1)одно на все ячейки
--ease-outcubic-bezier(0.22, 0.61, 0.36, 1)одно на все ячейки
--err-1oklch(0.955 0.025 25)одно на все ячейки
--err-2oklch(0.780 0.150 25)одно на все ячейки
--err-3oklch(0.725 0.160 25)одно на все ячейки
--err-4oklch(0.545 0.185 25)одно на все ячейки
--err-5oklch(0.500 0.185 25)одно на все ячейки
--err-6oklch(0.330 0.110 25)одно на все ячейки
--err-bglight-dark(var(--err-1), color-mix(in oklab, var(--err-4) 16%, transparent))одно на все ячейки
--err-marklight-dark(var(--err-4), var(--err-3))одно на все ячейки
--err-textlight-dark(var(--err-5), var(--err-3))база +1: тема
--focus-ringlight-dark(var(--a-4), var(--a-3))одно на все ячейки
--font-monoui-monospace, " , " , " , Consolas, " , monospaceодно на все ячейки
--font-sansui-sans-serif, system-ui, -apple-system, " , Roboto, " , Arial, sans-serifодно на все ячейки
--gap-inlinevar(--space-4)база +14: плотность · масштаб
--gap-rowvar(--space-3)база +14: плотность · масштаб
--gap-sectionvar(--space-7)база +14: плотность · масштаб
--hairline1pxбаза +1: экран
--hue-neutral75база +2: тема
--label-col104pxбаза +4: масштаб
--leading-code1.55одно на все ячейки
--leading-prose1.65одно на все ячейки
--leading-tight1.25одно на все ячейки
--leading-ui1.4одно на все ячейки
--measure68chодно на все ячейки
--n-0oklch(1.000 calc(0.002 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-1oklch(0.976 calc(0.003 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-10oklch(0.322 calc(0.005 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-11oklch(0.242 calc(0.004 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-12oklch(0.196 calc(0.004 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-13oklch(0.155 calc(0.003 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-14oklch(0.120 calc(0.003 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-2oklch(0.952 calc(0.004 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-3oklch(0.922 calc(0.004 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-4oklch(0.878 calc(0.005 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-5oklch(0.806 calc(0.006 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-6oklch(0.706 calc(0.006 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-7oklch(0.605 calc(0.006 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-8oklch(0.500 calc(0.006 * var(--tint)) var(--hue-neutral))одно на все ячейки
--n-9oklch(0.400 calc(0.006 * var(--tint)) var(--hue-neutral))одно на все ячейки
--ok-1oklch(0.955 0.025 150)одно на все ячейки
--ok-2oklch(0.780 0.140 150)одно на все ячейки
--ok-3oklch(0.660 0.130 150)одно на все ячейки
--ok-4oklch(0.545 0.120 150)одно на все ячейки
--ok-5oklch(0.500 0.120 150)одно на все ячейки
--ok-6oklch(0.330 0.075 150)одно на все ячейки
--ok-bglight-dark(var(--ok-1), color-mix(in oklab, var(--ok-4) 16%, transparent))одно на все ячейки
--ok-marklight-dark(var(--ok-4), var(--ok-3))одно на все ячейки
--ok-textlight-dark(var(--ok-5), var(--ok-3))база +1: тема
--pad-block-yvar(--space-4)база +14: плотность · масштаб
--pad-cardvar(--space-6)база +14: плотность · масштаб
--pad-cell-xvar(--space-4)база +14: плотность · масштаб
--pad-panelvar(--space-5)база +14: плотность · масштаб
--radius-2xs2pxбаза +4: масштаб
--radius-control-lgvar(--radius-md)база +14: плотность · масштаб
--radius-control-mdvar(--radius-md)база +14: плотность · масштаб
--radius-control-smvar(--radius-sm)база +14: плотность · масштаб
--radius-full999pxодно на все ячейки
--radius-lg12pxбаза +4: масштаб
--radius-markvar(--radius-2xs)одно на все ячейки
--radius-md8pxбаза +4: масштаб
--radius-sm6pxбаза +4: масштаб
--radius-xs4pxбаза +4: масштаб
--region-edge-supporttransparentодно на все ячейки
--region-ground-supportvar(--surface-recessed)одно на все ячейки
--region-title-defaultvar(--text-xs)одно на все ячейки
--region-title-leadvar(--text-sm)одно на все ячейки
--region-title-supportvar(--text-2xs)одно на все ячейки
--row-pad-yvar(--space-3)база +14: плотность · масштаб
--scrimlight-dark(oklch(0 0 0 / 0.32), oklch(0 0 0 / 0.58))одно на все ячейки
--shadow-color-farlight-dark(oklch(0 0 0 / 0.10), oklch(0 0 0 / 0.45))одно на все ячейки
--shadow-color-nearlight-dark(oklch(0 0 0 / 0.06), oklch(0 0 0 / 0.30))одно на все ячейки
--shadow-control0 1px 2px -1px var(--shadow-color-far), 0 1px 1px -1px var(--shadow-color-near)одно на все ячейки
--shadow-modal0 16px 40px -8px var(--shadow-color-far), 0 4px 10px -4px var(--shadow-color-near)одно на все ячейки
--shadow-popover0 4px 12px -2px var(--shadow-color-far), 0 2px 4px -2px var(--shadow-color-near)одно на все ячейки
--size-check15pxбаза +14: плотность · масштаб
--size-chevron10pxбаза +4: масштаб
--size-dot6pxбаза +4: масштаб
--size-gutter14pxбаза +14: плотность · масштаб
--size-icon18pxбаза +4: масштаб
--size-icon-lg24pxбаза +4: масштаб
--size-icon-sm14pxбаза +4: масштаб
--size-icon-xs12pxбаза +4: масштаб
--size-indent14pxбаза +14: плотность · масштаб
--size-marker2pxбаза +4: масштаб
--size-meter6pxбаза +4: масштаб
--size-spinner14pxбаза +14: плотность · масштаб
--size-switch-h18pxбаза +14: плотность · масштаб
--size-switch-w30pxбаза +14: плотность · масштаб
--size-thumb14pxбаза +14: плотность · масштаб
--size-tick3pxбаза +4: масштаб
--size-track4pxбаза +4: масштаб
--space-12pxодно на все ячейки
--space-1064pxодно на все ячейки
--space-24pxодно на все ячейки
--space-36pxодно на все ячейки
--space-48pxодно на все ячейки
--space-512pxодно на все ячейки
--space-616pxодно на все ячейки
--space-724pxодно на все ячейки
--space-832pxодно на все ячейки
--space-948pxодно на все ячейки
--split-main30remбаза +4: масштаб
--split-side18remбаза +4: масштаб
--stroke1pxодно на все ячейки
--surface-activelight-dark(oklch(0 0 0 / 0.065), oklch(1 0 0 / 0.080))одно на все ячейки
--surface-fieldvar(--surface-raised)одно на все ячейки
--surface-hoverlight-dark(oklch(0 0 0 / 0.035), oklch(1 0 0 / 0.045))одно на все ячейки
--surface-inverselight-dark(var(--n-12), var(--n-3))одно на все ячейки
--surface-inverse-softlight-dark(var(--n-10), var(--n-4))одно на все ячейки
--surface-overlaylight-dark(var(--n-0), var(--n-11))база +1: тема
--surface-pagelight-dark(var(--n-1), var(--n-13))база +1: тема
--surface-raisedlight-dark(var(--n-0), var(--n-12))база +1: тема
--surface-recessedlight-dark(oklch(0 0 0 / 0.060), oklch(1 0 0 / 0.050))одно на все ячейки
--surface-recessed-activelight-dark(oklch(0 0 0 / 0.075), oklch(1 0 0 / 0.062))одно на все ячейки
--surface-recessed-hoverlight-dark(oklch(0 0 0 / 0.025), oklch(1 0 0 / 0.015))одно на все ячейки
--surface-selectedcolor-mix(in oklab, var(--a-4) 14%, transparent)одно на все ячейки
--surface-sunkenlight-dark(var(--n-2), var(--n-14))база +1: тема
--switch-tracklight-dark(oklch(0 0 0 / 0.45), oklch(1 0 0 / 0.36))одно на все ячейки
--tap-min24pxодно на все ячейки
--text-2xl1.75remбаза +4: масштаб
--text-2xs0.6875remбаза +4: масштаб
--text-faintlight-dark(var(--n-7), var(--n-7))одно на все ячейки
--text-lg1.125remбаза +4: масштаб
--text-md1remбаза +4: масштаб
--text-mutedlight-dark(var(--n-8), var(--n-6))одно на все ячейки
--text-on-inverselight-dark(var(--n-0), var(--n-13))одно на все ячейки
--text-primarylight-dark(var(--n-12), var(--n-1))одно на все ячейки
--text-secondarylight-dark(var(--n-9), var(--n-5))одно на все ячейки
--text-sm0.875remбаза +4: масштаб
--text-xl1.375remбаза +4: масштаб
--text-xs0.78125remбаза +4: масштаб
--tint0база +2: тема
--tracklight-dark(oklch(0 0 0 / 0.10), oklch(1 0 0 / 0.16))одно на все ячейки
--tracking-normal0одно на все ячейки
--tracking-tight-0.01emодно на все ячейки
--warn-1oklch(0.960 0.040 85)одно на все ячейки
--warn-2oklch(0.860 0.145 85)одно на все ячейки
--warn-3oklch(0.760 0.140 85)одно на все ячейки
--warn-4oklch(0.620 0.135 85)одно на все ячейки
--warn-5oklch(0.520 0.135 85)одно на все ячейки
--warn-6oklch(0.360 0.080 85)одно на все ячейки
--warn-bglight-dark(var(--warn-1), color-mix(in oklab, var(--warn-4) 16%, transparent))одно на все ячейки
--warn-marklight-dark(var(--warn-4), var(--warn-3))одно на все ячейки
--warn-textlight-dark(var(--warn-5), var(--warn-3))база +1: тема
--weight-medium600одно на все ячейки
--weight-normal400одно на все ячейки
--z-modal1000одно на все ячейки
--z-popover100одно на все ячейки
--z-sticky10одно на все ячейки

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