В MUI (Material-UI) создание темы является центральным инструментом
для стандартизации визуального стиля приложения. Тема позволяет задавать
цвета, типографику, отступы и глобальные стили компонентов. Центральным
объектом является createTheme, который
принимает конфигурационный объект с ключевыми настройками.
import { createTheme } from '@mui/material/styles';
const theme = createTheme({
palette: {
primary: {
main: '#1976d2',
},
secondary: {
main: '#dc004e',
},
},
typography: {
fontFamily: 'Roboto, Arial, sans-serif',
h1: {
fontSize: '2rem',
fontWeight: 500,
},
body1: {
fontSize: '1rem',
},
},
});
Ключевые элементы темы:
theme.spacing(1)).Цветовая палитра разделяется на основные категории:
primary, secondary, error,
warning, info, success и
background. Каждый цвет можно задавать полностью или
частично, определяя main, light и
dark оттенки.
const theme = createTheme({
palette: {
primary: {
light: '#63a4ff',
main: '#1976d2',
dark: '#004ba0',
contrastText: '#ffffff',
},
background: {
default: '#f5f5f5',
paper: '#ffffff',
},
},
});
Использование contrastText обеспечивает автоматическое
определение цвета текста на фоне основного цвета, что упрощает
поддержание доступности интерфейса.
Типографика в MUI позволяет настраивать шрифты для разных уровней
заголовков (h1–h6), параграфов
(body1, body2), кнопок (button) и
других элементов. Кроме стандартных настроек, можно задавать
кастомные размеры, межстрочные интервалы и трансформации
текста.
const theme = createTheme({
typography: {
fontFamily: 'Arial, sans-serif',
h1: { fontSize: '2.5rem', fontWeight: 700, letterSpacing: '-0.02em' },
body1: { fontSize: '1rem', lineHeight: 1.6 },
button: { textTransform: 'none', fontWeight: 600 },
},
});
Типографические настройки применяются глобально, что позволяет избежать повторного указания стилей для каждого компонента.
MUI предоставляет возможность глобальной настройки стилей
компонентов, чтобы унифицировать внешний вид без необходимости
применять sx или inline-стили в каждом компоненте. Для
этого используется ключ components в
createTheme.
const theme = createTheme({
components: {
MuiButton: {
styleOverrides: {
root: {
borderRadius: 12,
padding: '8px 20px',
},
containedPrimary: {
boxShadow: 'none',
'&:hover': {
backgroundColor: '#115293',
},
},
},
},
MuiAppBar: {
styleOverrides: {
colorPrimary: {
backgroundColor: '#333333',
},
},
},
},
});
Преимущества approach:
MUI позволяет создавать кастомные палитры цветов и
тени для компонентов, которые затем можно использовать в приложении
через theme.palette и theme.shadows.
const theme = createTheme({
palette: {
custom: {
light: '#ffe0b2',
main: '#ff9800',
dark: '#ef6c00',
contrastText: '#000000',
},
},
shadows: [
'none',
'0px 1px 3px rgba(0,0,0,0.2)',
'0px 1px 5px rgba(0,0,0,0.2)',
'0px 1px 8px rgba(0,0,0,0.3)',
// можно добавить свои тени
],
});
Для реализации тёмной и светлой темы используется
параметр mode в palette. Это позволяет быстро
переключать оформление приложения без изменения каждого компонента.
const lightTheme = createTheme({
palette: {
mode: 'light',
primary: { main: '#1976d2' },
},
});
const darkTheme = createTheme({
palette: {
mode: 'dark',
primary: { main: '#90caf9' },
},
});
Динамическая смена темы может быть связана с состоянием React через
ThemeProvider:
import { ThemeProvider } from '@mui/material/styles';
<ThemeProvider theme={isDarkMode ? darkTheme : lightTheme}>
<App />
</ThemeProvider>
Для TypeScript можно расширять тему, добавляя кастомные свойства в объект темы. Это позволяет использовать собственные палитры, размеры и настройки без ошибок компиляции.
import { createTheme } from '@mui/material/styles';
import { Theme } from '@mui/material';
declare module '@mui/material/styles' {
interface Theme {
customShadows: {
widget: string;
};
}
interface ThemeOptions {
customShadows?: {
widget?: string;
};
}
}
const theme = createTheme({
customShadows: {
widget: '0px 4px 20px rgba(0,0,0,0.1)',
},
});
Это позволяет безопасно использовать
theme.customShadows.widget в sx и стилях
компонентов.
Создание собственной темы в MUI — это не только эстетическое решение, но и инструмент для упрощения поддержки кода, стандартизации интерфейса и ускорения разработки. Комбинация палитры, типографики, глобальных стилей компонентов и кастомных расширений обеспечивает гибкость и полный контроль над визуальной составляющей приложения.