# Тёмная тема UI (изменение 038) ## Context Сейчас у UI только светлая тема. Нужна тёмная. Решение пользователя: по умолчанию тема следует настройке ОС и браузера (`prefers-color-scheme`), в меню логина есть переключатель «Тема: авто / светлая / тёмная». Выбор хранится в браузере (`localStorage`). На экране входа тема тоже берётся по системе или по сохранённому выбору. Сейчас в `web/styles.css` есть токены в `:root` (`--bg`, `--card`, `--line`, `--text`, `--muted`, `--primary`, `--head`, `--hover` …), но около 36 цветов прописаны прямо в правилах: бейджи, баннеры, тени, `#fff` у кнопок и `.pop`, `.org-btn` и т. п. Ещё около 16 цветов задано в `web/app.js`: `utilColor`, цвета загрузки, инлайн-стили. ## Изменения 1. **Токены.** Все цвета в `styles.css` перевести на CSS-переменные в `:root`. Для каждого прописанного цвета — семантический токен: `--card`, `--input-bg`, `--shadow`, `--badge-*-bg/fg`, `--danger`, `--warn`, `--ok`, `--primary-soft`, `--overlay` … Светлые значения остаются прежними: светлая тема визуально не меняется. 2. **Тёмная палитра.** Та же структура токенов в двух местах: - `@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { … } }` — режим «авто»; - `:root[data-theme="dark"] { … }` — принудительная тёмная. Плюс `color-scheme: light` / `dark` — нативные поля ввода, скроллбары, автозаполнение. Палитра: фон `#0f1419`–`#151b23`, карточки на ступень светлее, линии приглушённые, текст `#e6edf3`, `--muted` около `#9aa7b8`, `--primary` светлее для контраста около `#6b9bff`. Бейджи — тёмный насыщенный фон и светлый текст. Контраст текста не ниже WCAG AA. 3. **Цвета в `web/app.js`.** Прописанные цвета (`utilColor`, инлайн `style="color:#…"`, фон полос загрузки) заменить на `var(--…)` или классы. Логика выбора (порог загрузки → зелёный/жёлтый/красный) не меняется. Особые случаи: - QR-код 2FA остаётся тёмным на белом: сканеры хуже читают инвертированный. Его контейнеру — белый фон с отступом. - Коды восстановления и моноширинные блоки — через токены. 4. **Переключатель.** - `web/theme.js` (новый), подключается в `
` `web/index.html` обычным синхронным `