Темная тема
Этот документ объясняет реализацию темной темы в@ui8kit/core, включая механизм провайдера тем, управление состоянием, стратегии сохранения и интеграцию с Tailwind CSS. Для общих вопросов тематизации и стилизации вариантов см. Система вариантов. Для паттернов стилизации конкретных компонентов см. Лучшие практики.
Назначение и область применения
Система темной темы обеспечивает автоматическое переключение тем с сохранением пользовательских предпочтений и определением темной темы на уровне системы. Реализация построена на паттерне провайдера React Context, который управляет состоянием темы, применяет CSS-классы к корню документа и синхронизирует предпочтения с localStorage. Источники: src/themes/providers/ThemeProvider.tsx1-93Архитектура ThemeProvider
КомпонентThemeProvider оборачивает приложение и управляет всем состоянием, связанным с темой, через React Context. Он принимает объект theme, соответствующий типу ThemeBase, и предоставляет значения темы и функции управления через контекст.
- Значение из localStorage по ключу
"ui:dark"(если присутствует) - Системное предпочтение через
window.matchMedia('(prefers-color-scheme: dark)') - Значение по умолчанию
false
Инициализация и сохранение состояния темной темы
Состояние темной темы следует определенному потоку инициализации и сохранения, который обеспечивает сохранение пользовательских предпочтений между сеансами, при этом учитывая системные предпочтения, когда явное предпочтение отсутствует."1" (темная) или "0" (светлая) в localStorage по ключу "ui:dark".
Источники: src/themes/providers/ThemeProvider.tsx28-35 src/themes/providers/ThemeProvider.tsx37-44
Интерфейс ThemeContextValue
ThemeContext предоставляет типизированный интерфейс для доступа к состоянию темы и функциям управления. Компоненты получают доступ к этому контексту через хук useTheme.
| Свойство | Тип | Описание |
|---|---|---|
theme | T extends ThemeBase | Объект конфигурации темы |
rounded | T['rounded'] | Варианты скругления углов из темы |
buttonSize | T['buttonSize'] | Варианты размеров кнопок из темы |
isDarkMode | boolean | Текущее состояние темной темы |
isNavFixed | boolean | undefined | Опциональное состояние фиксированной навигации |
prefersReducedMotion | boolean | Предпочтение пользователя по уменьшению движения |
toggleDarkMode | () => void | Функция для переключения темной темы |
setDarkMode | (value: boolean) => void | Функция для явной установки темной темы |
ThemeBase определяет минимальную структуру, необходимую для объектов тем:
Использование хука useTheme
Компоненты получают доступ к контексту темы через хукuseTheme, который обеспечивает использование внутри ThemeProvider и возвращает типизированное значение контекста.
Паттерн использования хука:
Реализация переключения темной темы
Библиотека предоставляет два метода для управления состоянием темной темы:Функция toggleDarkMode
Инвертирует текущее состояние темной темы:Функция setDarkMode
Устанавливает темную тему в конкретное значение:Доступность: поддержка уменьшения движения
ThemeProvider определяет и отслеживает системное предпочтение пользователя prefers-reduced-motion через тот же паттерн медиа-запроса, который используется для определения темной темы.
addListener/removeListener вместо addEventListener/removeEventListener. Компоненты могут получить доступ к этому значению через контекст для условного отключения анимаций.
Источники: src/themes/providers/ThemeProvider.tsx46-68
Интеграция с Tailwind CSS
Система темной темы интегрируется с Tailwind CSS через класс.dark, применяемый к document.documentElement. Это требует конфигурации Tailwind с darkMode: 'class':
isDarkMode имеет значение true, провайдер добавляет класс dark к корневому элементу, активируя модификаторы варианта dark: в Tailwind:
document.documentElement.style.colorScheme в "dark" или "light", что сигнализирует браузеру о предпочтениях пользователя для нативных элементов форм и полос прокрутки.
Источники: src/themes/providers/ThemeProvider.tsx37-44 README.md219-233
Конфигурация темы
Приложения должны обернуть свой корневой компонент вThemeProvider и передать объект темы. Библиотека экспортирует три предварительно настроенные темы:
| Экспорт темы | Модуль | Название темы |
|---|---|---|
modernUITheme | @ui8kit/core | ”modernUI” |
skyOSTheme | @ui8kit/core | ”skyOS” |
lesseUITheme | @ui8kit/core | ”lesseUI” |
ThemeBase со свойствами name, rounded и buttonSize. Пользовательские темы могут быть созданы путем реализации этого интерфейса.
Источники: src/themes/index.ts1-9 README.md223-233
Соображения по рендерингу на стороне сервера
Реализация включает безопасные для SSR проверки с использованием защитных условийtypeof window !== 'undefined' и typeof document === 'undefined' для предотвращения ошибок во время выполнения при серверном рендеринге. Вычисление начального состояния избегает доступа к API браузера до фазы клиентской гидратации.
Паттерн ленивого инициализатора состояния обеспечивает:
- Логика инициализации состояния выполняется только один раз при монтировании
- Доступ к API браузера безопасно защищен
- Окружения SSR получают разумные значения по умолчанию (
falseдля темной темы)