Chakra UI предоставляет встроенную поддержку
темизации, что позволяет легко переключаться между
светлой и темной темами в приложениях на React. Основным инструментом
для управления цветовой схемой является хук useColorMode, а
также компонент ChakraProvider для глобальной настройки
темы.
ColorModeColorMode управляет текущей схемой приложения —
"light" или "dark". Для работы с ним
используются:
import { useColorMode, Button } from '@chakra-ui/react';
function ThemeSwitcher() {
const { colorMode, toggleColorMode } = useColorMode();
return (
<Button onCl ick={toggleColorMode}>
{colorMode === 'light' ? 'Переключить на темную' : 'Переключить на светлую'}
</Button>
);
}
colorMode — текущая тема.toggleColorMode() — функция для переключения между
темами.setColorMode(mode) — установка конкретного режима
('light' или 'dark').ChakraProviderДля того чтобы Chakra UI корректно применял темы, необходимо обернуть
приложение в ChakraProvider и при необходимости настроить
пользовательскую тему:
import { ChakraProvider, extendTheme } from '@chakra-ui/react';
const customTheme = extendTheme({
config: {
initialColorMode: 'light',
useSystemColorMode: false,
},
colors: {
brand: {
50: '#e3f2f9',
100: '#c5e4f3',
500: '#3182ce',
900: '#1a365d',
},
},
});
function App() {
return (
<ChakraProvider theme={customTheme}>
<YourAppComponents />
</ChakraProvider>
);
}
initialColorMode — начальный режим темы.useSystemColorMode — использование системных настроек
ОС.extendTheme — позволяет добавлять новые цвета, шрифты,
размеры и глобальные стили.Chakra UI предоставляет токены цветов, которые автоматически адаптируются под текущую тему. Например:
import { Box, Text } from '@chakra-ui/react';
function Card() {
return (
<Box bg={{ base: 'white', dark: 'gray.800' }} p={5} borderRadius="md">
<Text color={{ base: 'black', dark: 'white' }}>
Пример текста с адаптацией к теме
</Text>
</Box>
);
}
bg={{ base: 'white', dark: 'gray.800' }} —
Box будет белым в светлой теме и тёмно-серым в темной.color={{ base: 'black', dark: 'white' }} — аналогично
для текста.Для управления глобальными стилями можно использовать объект
styles в расширенной теме:
const customTheme = extendTheme({
styles: {
global: (props) => ({
body: {
bg: props.colorMode === 'dark' ? 'gray.900' : 'gray.100',
color: props.colorMode === 'dark' ? 'whiteAlpha.900' : 'blackAlpha.900',
},
}),
},
});
props.colorMode предоставляет текущий режим темы.ColorModeScript для корректного SSRПри использовании серверного рендеринга важно, чтобы начальная тема соответствовала настройкам клиента:
import { ColorModeScript } from '@chakra-ui/react';
import customTheme from './theme';
function Root() {
return (
<>
<ColorModeScript initialColorMode={customTheme.config.initialColorMode} />
<App />
</>
);
}
ColorModeScript предотвращает мигание
неправильной темы при загрузке страницы.Многие компоненты Chakra UI поддерживают автоматическую адаптацию к теме через встроенные пропсы:
import { Button } from '@chakra-ui/react';
function ThemedButton() {
return (
<Button
bg="brand.500"
color="white"
_hover={{ bg: 'brand.600' }}
_dark={{ bg: 'brand.300', _hover: { bg: 'brand.400' } }}
>
Кнопка с темной темой
</Button>
);
}
_dark — позволяет переопределять стили для темной
темы._hover, _active, _focus также
могут иметь версии для темной темы.Комбинирование тем с компонентами Layout делает интерфейс динамичным:
import { Flex, Box, useColorModeValue } from '@chakra-ui/react';
function Navbar() {
const bg = useColorModeValue('white', 'gray.800');
const color = useColorModeValue('gray.800', 'white');
return (
<Flex bg={bg} color={color} p={4} justify="space-between">
<Box>Логотип</Box>
<Box>Меню</Box>
</Flex>
);
}
useColorModeValue(lightValue, darkValue) автоматически
выбирает значение в зависимости от темы.Chakra UI позволяет создавать собственные темы для каждого компонента, например, настраивать цветовые схемы для кнопок, модальных окон и input-полей:
const customTheme = extendTheme({
components: {
Button: {
variants: {
solid: (props) => ({
bg: props.colorMode === 'dark' ? 'teal.300' : 'teal.500',
}),
},
},
},
});
components — объект для настройки каждого
компонента.props.colorMode внутри функции позволяет динамически
адаптировать все варианты компонента под тему.Chakra UI предоставляет полный инструментарий для управления светлой и темной темами, включая хуки, токены цветов, глобальные стили, адаптивные пропсы и возможности расширенной настройки компонентов. Такой подход обеспечивает простоту, консистентность и масштабируемость дизайна в React-приложениях.