Skip to main content

Theme System Guide

AI-оптимизированный справочник по цветам и темам goLoot TMA.

Цель: Когда нужно изменить цвет элемента — этот документ объясняет что и где менять.


Quick Reference

Когда использовать какой цвет

ЭлементTailwind классCSS Variable
Основная кнопка (CTA)bg-btn-primary-bg/15--btn-primary-bg
Кнопка "Забрать" / "Вывести"bg-btn-gold-bg/15--btn-gold-bg
Disabled кнопкаbg-btn-disabled-bg/10--btn-disabled-bg
Основной текстtext-glass-text--color-glass-text
Вторичный текстtext-glass-muted--color-glass-muted
Фон карточкиbg-glass-card--color-glass-card
Фон приложенияbg-app-bg--color-app-bg
Границаborder-glass-border/25--color-glass-border
Прогресс-бар (трек)bg-progress-track--progress-track
Skeleton loader.skeleton-shimmer (CSS class)--skeleton-base, --skeleton-shimmer

Button Variants

Primary (Blue) — Основные действия

Используй для: "Открыть", "Сохранить", "Что внутри?"

className="bg-btn-primary-bg/15 text-btn-primary-text border border-btn-primary-border/40
hover:bg-btn-primary-bg/25 active:scale-95 transition-all duration-200"

Gold — Награды и Claim

Используй для: "Забрать", "Получить награду", "Вывести"

className="bg-btn-gold-bg/15 text-btn-gold-text border border-btn-gold-border/50
hover:bg-btn-gold-bg/25 active:scale-95 transition-all duration-200"

Disabled — Заблокированные состояния

Используй для: Claimed, Locked, In Progress

className="bg-btn-disabled-bg/10 text-btn-disabled-text border-2 border-btn-disabled-border/20
cursor-not-allowed opacity-60"

DO NOT USE (Запрещённые паттерны)

Эти паттерны ломают переключение тем — не используй их:

Плохой паттернЗамени на
text-[#cccccc]text-glass-text
text-[#888888]text-glass-muted
bg-[#181818]bg-app-bg
bg-[#1e1e1e]bg-progress-track
bg-[#2a2a2a]bg-progress-track
bg-[rgba(61,152,217,0.15)]bg-btn-primary-bg/15
text-[#6ab3e8]text-btn-primary-text
border-[rgba(61,152,217,*)]border-btn-primary-border/*
bg-[rgba(255,184,77,0.15)]bg-btn-gold-bg/15
text-[#ffb84d]text-btn-gold-text
bg-[rgba(120,120,120,*)]bg-btn-disabled-bg/*
text-[#666666]text-btn-disabled-text

Архитектура

Слои переменных

┌─────────────────────────────────────────────────┐
│ Tailwind Classes (используй в компонентах) │
│ bg-btn-primary-bg/15, text-glass-text │
└─────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────┐
│ Component Tokens (семантические) │
│ --btn-primary-bg, --btn-gold-text │
└─────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────┐
│ Palette (примитивы RGB) │
│ --color-glass-text: 204, 204, 204 │
└─────────────────────────────────────────────────┘

Как работает переключение тем

  1. Zustand store хранит theme: 'dark' | 'light'
  2. App.tsx устанавливает data-theme на <body>
  3. CSS автоматически применяет правильные переменные:
body[data-theme='dark'] {
--btn-primary-bg: 61, 152, 217; /* тёмно-синий */
}

body[data-theme='light'] {
--btn-primary-bg: 52, 152, 219; /* ярко-синий */
}
  1. Tailwind классы подхватывают значения автоматически

Файлы системы

ФайлНазначение
frontend/src/index.cssCSS переменные (lines 115-210)
frontend/tailwind.config.jsМаппинг переменных → классы
frontend/src/stores/settingsStore.tsZustand store для темы
frontend/src/App.tsxПрименение data-theme

Как добавить новый цвет

1. Добавь CSS переменную

В frontend/src/index.css:

/* В body[data-theme='dark'] */
--my-new-color: 100, 150, 200;

/* В body[data-theme='light'] */
--my-new-color: 120, 170, 220;

2. Добавь в Tailwind config

В frontend/tailwind.config.js:

colors: {
'my-new': 'rgba(var(--my-new-color), <alpha-value>)',
}

3. Используй в компоненте

<div className="bg-my-new/20 text-my-new">

Цветовая палитра

Dark Theme

ПеременнаяRGBHexНазначение
--color-app-bg24, 24, 24#181818Фон приложения
--color-glass-card36, 36, 36#242424Фон карточек
--color-glass-text204, 204, 204#ccccccОсновной текст
--color-glass-muted136, 136, 136#888888Вторичный текст
--color-glass-border120, 120, 120#787878Границы
--btn-primary-bg61, 152, 217#3d98d9Синие кнопки
--btn-gold-bg255, 184, 77#ffb84dЗолотые кнопки
--btn-disabled-bg120, 120, 120#787878Disabled
--skeleton-base36, 36, 36#242424Skeleton фон (= glass-card)
--skeleton-shimmer60, 60, 60#3c3c3cSkeleton градиент sweep

Light Theme

ПеременнаяRGBHexНазначение
--color-app-bg50, 50, 50#323232Фон приложения
--color-glass-card95, 95, 95#5f5f5fФон карточек
--color-glass-text245, 245, 245#f5f5f5Основной текст
--color-glass-muted190, 190, 190#bebebeВторичный текст
--color-glass-border170, 170, 170#aaaaaaГраницы
--btn-primary-bg52, 152, 219#3498dbСиние кнопки
--btn-gold-bg255, 193, 7#ffc107Золотые кнопки
--btn-disabled-bg160, 160, 160#a0a0a0Disabled
--skeleton-base95, 95, 95#5f5f5fSkeleton фон (= glass-card)
--skeleton-shimmer130, 130, 130#828282Skeleton градиент sweep

Semantic Colors (статические)

Эти цвета одинаковы для обеих тем:

КлассHexНазначение
ui-success#4ade80Успех (зелёный)
ui-error#ef4444Ошибка (красный)
ui-warning#ffc107Предупреждение (жёлтый)
ui-info#0088ccИнформация (синий)

Проверка Grep

После миграции компонентов эти команды должны вернуть 0 результатов:

grep -r "text-\[#cccccc\]" frontend/src/components --include="*.tsx"
grep -r "text-\[#888888\]" frontend/src/components --include="*.tsx"
grep -r "bg-\[rgba(61,152,217" frontend/src/components --include="*.tsx"
grep -r "bg-\[rgba(255,184,77" frontend/src/components --include="*.tsx"
grep -r "bg-\[rgba(120,120,120" frontend/src/components --include="*.tsx"