В библиотеке MUI (Material-UI) управление цветами
темы осуществляется через объект theme, который можно
создать с помощью функции createTheme. Темная тема требует
внимательной настройки, чтобы обеспечить достаточный контраст и
удобочитаемость интерфейса. Основная структура кастомизации включает
палитру (palette), тип темы (mode), а также
дополнительные настройки цветов для компонентов.
Для включения темного режима необходимо задать свойство
mode объекта palette:
import { createTheme } from '@mui/material/styles';
const darkTheme = createTheme({
palette: {
mode: 'dark',
},
});
Значение mode: 'dark' автоматически меняет базовые цвета
компонентов MUI, такие как background, text,
divider и т. д. Однако, для продвинутой кастомизации часто
требуется задать собственные цвета для ключевых элементов
интерфейса.
В темном режиме особенно важно корректно определять цвета фона и текста:
const darkTheme = createTheme({
palette: {
mode: 'dark',
primary: {
main: '#90caf9', // основной цвет для интерактивных элементов
contrastText: '#000000', // текст поверх primary
},
secondary: {
main: '#f48fb1',
contrastText: '#ffffff',
},
background: {
default: '#121212', // основной фон приложения
paper: '#1d1d1d', // фон карточек и поверхностей
},
text: {
primary: '#ffffff',
secondary: '#b0b0b0',
disabled: '#666666',
},
},
});
Особенности:
background.default – фон всей страницы.background.paper – фон компонентов с поднятой
визуальной иерархией (Paper, Card).contrastText – цвет текста на фоне primary
и secondary.text.primary и
text.secondary требуют высокого контраста для
читаемости.MUI позволяет определять дополнительные цветовые группы для компонентов:
const darkTheme = createTheme({
palette: {
mode: 'dark',
info: {
main: '#29b6f6',
contrastText: '#ffffff',
},
success: {
main: '#66bb6a',
contrastText: '#000000',
},
warning: {
main: '#ffa726',
contrastText: '#000000',
},
error: {
main: '#ef5350',
contrastText: '#ffffff',
},
},
});
Использование этих цветов помогает создавать визуально понятные индикаторы состояния для уведомлений, кнопок и других компонентов интерфейса.
componentsДля точечной настройки цветов компонентов можно использовать ключ
components в теме. Пример для кнопок:
const darkTheme = createTheme({
palette: { mode: 'dark' },
components: {
MuiButton: {
styleOverrides: {
containedPrimary: {
backgroundColor: '#90caf9',
color: '#000000',
'&:hover': {
backgroundColor: '#64b5f6',
},
},
outlinedSecondary: {
borderColor: '#f48fb1',
color: '#f48fb1',
'&:hover': {
backgroundColor: 'rgba(244,143,177,0.1)',
},
},
},
},
},
});
Пояснения:
styleOverrides позволяет переопределять стандартные
стили MUI компонентов.&:hover задаёт поведение при
наведении, что особенно важно для темного режима, чтобы элементы
оставались заметными.background.paper или default.Для сложных интерфейсов удобно создавать собственные цветовые токены:
const darkTheme = createTheme({
palette: {
mode: 'dark',
custom: {
sidebar: '#1b1b1b',
highlight: '#ff4081',
border: '#333333',
},
},
});
Чтобы использовать эти токены в компонентах:
import { useTheme } from '@mui/material/styles';
import Box from '@mui/material/Box';
function Sidebar() {
const theme = useTheme();
return <Box sx={{ backgroundColor: theme.palette.custom.sidebar }}>Контент</Box>;
}
Такой подход упрощает поддержку консистентности цветов по всему приложению.
Темная тема требует внимательного выбора контрастных цветов. В MUI рекомендуются следующие практики:
text.primary должен иметь контраст не ниже 15.8:1
относительно background.default.contrastText с
достаточной читаемостью.Можно динамически переключать светлую и темную тему, используя
useMediaQuery:
import { useMediaQuery } from '@mui/material';
import { ThemeProvider, createTheme } from '@mui/material/styles';
function App() {
const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');
const theme = createTheme({
palette: {
mode: prefersDarkMode ? 'dark' : 'light',
},
});
return <ThemeProvider theme={theme}>...</ThemeProvider>;
}
Это позволяет автоматически подстраивать интерфейс под системные настройки пользователя.
Настройка темной темы в MUI сочетает управление базовыми палитрами, кастомными токенами и стилями компонентов. Правильная комбинация этих инструментов обеспечивает удобочитаемость, визуальную консистентность и современный вид интерфейса.