Урок 19. Справочник: токены темы

📁 Раздел: shadcn/ui ⏱️ Время изучения: ~50 мин 🎯 Сложность: Продвинутая

⚡ Кратко

Токен → утилита: --card даёт bg-card, text-card, border-card. Пары «фон / foreground» всегда используются вместе.

Токены и утилиты

ТокенУтилитыТипичное применение
--backgroundbg-backgroundфон страницы
--foregroundtext-foregroundосновной текст
--cardbg-card, text-card-foregroundкарточки
--popoverbg-popover, text-popover-foregroundменю, подсказки
--primarybg-primary, text-primary, text-primary-foregroundосновные кнопки, ссылки
--secondarybg-secondary, text-secondary-foregroundвторостепенные кнопки
--mutedbg-muted, text-muted-foregroundподписи, неактивные зоны
--accentbg-accent, text-accent-foregroundподсветка при наведении
--destructivebg-destructive, text-destructive, ring-destructiveудаление, ошибки
--borderborder-border, ring-borderграницы
--inputborder-input, bg-inputполя ввода
--ringring-ring, border-ringфокус
--chart-1…5fill-chart-1, stroke-chart-2графики
--sidebar…bg-sidebar, text-sidebar-foregroundбоковая панель

Структура темы в CSS

📄 src/index.css
@import "tailwindcss";
@import "tw-animate-css";

@custom-variant dark (&:is(.dark *));

@theme inline {  /* 1. связь токенов с утилитами */ }
:root         {  /* 2. значения для светлой темы */ }
.dark         {  /* 3. значения для тёмной темы */ }

@layer base {    /* 4. базовые стили документа */
  * { @apply border-border outline-ring/50; }
  body { @apply bg-background text-foreground; }
}

Прозрачность токенов

ЗаписьЧто даёт
bg-primary/10лёгкая подложка фирменного цвета
ring-ring/50полупрозрачное кольцо фокуса
bg-destructive/10 text-destructive«мягкая» опасная кнопка
border-foreground/10граница, работающая в обеих темах
Прозрачность — главный приём для тёмной темы: один класс выглядит уместно и на белом, и на тёмном, потому что подмешивается к фону под собой.

Смена базового цвета

npx shadcn@latest init --force   # заново записать конфигурацию и тему
baseColorХарактер
neutralчистый серый, без оттенка
slateхолодный, синеватый
zincслегка холодный
grayнейтрально-холодный
stoneтёплый, бежевый
⚠️ Проверить по документации: повторный init --force перезапишет components.json и может затронуть блок темы в CSS. Делайте это только на чистом рабочем дереве, чтобы увидеть изменения в diff.

Проверка темы

Что проверитьКак
Контраст текстаDevTools → палитра цвета → значение контраста
Все парытестовая страница со всеми токенами (см. «Примеры»)
Тёмная темапереключатель темы плюс просмотр каждого экрана
Фокусобход интерфейса клавишей Tab