Appearance
Theme Switching (Dark/Light Mode) — Design
Решения
- Режим по умолчанию: системные настройки (
prefers-color-scheme) - Переключатель: иконка sun/moon в хедере (двухпозиционный toggle) + полный контроль в
/cabinet/settings - Хранение: localStorage + cookie (встроенный механизм
@nuxtjs/color-modeиз Nuxt UI) - Анимация: без анимации, мгновенное переключение
- Палитра:
primary: 'blue',neutral: 'slate'(без изменений)
Техническая основа
Nuxt UI v3 включает @nuxtjs/color-mode как встроенную зависимость:
useColorMode()доступен из коробки- Режимы:
'light','dark','system' - Хранение: cookie
nuxt-color-mode+ класс на<html>— SSR без мерцания - Tailwind 4 настроен на
.darkкласс — существующиеdark:классы работают
Конфиг в nuxt.config.ts:
ts
colorMode: {
preference: 'system',
fallback: 'light',
}Компоненты UI
Переключатель в хедере
- Иконка
sunв тёмном режиме,moonв светлом UButtonсvariant="ghost",size="sm"- Клик: если
preference === 'system'— ставит противоположный от текущегоvalue, иначе togglelight/dark - Компонент:
app/shared/ui/ThemeToggle.vue
Настройки в кабинете
- Секция "Оформление" в
/cabinet/settings URadioGroupс тремя вариантами: Светлая (sun), Тёмная (moon), Системная (monitor)- Подпись для системной: "Следует настройкам вашего устройства"
- Выбор применяется сразу, без кнопки "Сохранить"
Аудит существующих компонентов
Файлы с dark: классами (уже готовы):
layouts/default.vue— бордеры хедера/футераlayouts/cabinet.vue— бордеры хедераpages/product/[id].vue— галерея, спеки, секция продавцаpages/auth/login.vue— разделителиentities/product/ui/ProductCard.vue— бордеры, фоныfeatures/product-form/ui/ProductFormPage.vue— стили формыfeatures/image-upload/ui/ImageUploader.vue— зона загрузки
Проверить после подключения:
- Визуальный проход по всем страницам в обоих режимах
- Места с хардкод-цветами без
dark:варианта (bg-whiteбезdark:bg-gray-900) - Nuxt UI компоненты адаптируются автоматически через CSS-переменные
Правило для разработки
Добавлено в CLAUDE.md → Conventions:
При добавлении цветовых классов Tailwind (
bg-*,text-*,border-*) всегда добавлятьdark:вариант. Предпочитать семантические CSS-переменные Nuxt UI (text-[var(--ui-text)],bg-[var(--ui-bg)]) вместо хардкода цветов.
Файлы и порядок реализации
Изменяемые файлы
nuxt.config.ts— секцияcolorModeapp.config.ts— комментарии с примерами палитрapp/shared/ui/ThemeToggle.vue— новый компонентapp/layouts/default.vue— добавитьSharedThemeToggleв хедерapp/layouts/cabinet.vue— добавитьSharedThemeToggleв хедерapp/pages/cabinet/settings.vue— секция "Оформление"i18n/locales/ru.json— ключи для темыCLAUDE.md— правило проdark:классы (готово)
Тесты
app/shared/ui/ThemeToggle.test.ts— рендер иконки, клик переключает режим
Порядок
- Конфиг (
nuxt.config.ts,app.config.ts) - i18n ключи
- Компонент
ThemeToggle+ тест - Интеграция в layouts
- Секция в настройках кабинета
- Визуальный аудит существующих страниц
- Обновление Progress в CLAUDE.md