Chakra UI предоставляет мощный механизм темизации, позволяющий централизованно управлять стилями компонентов и обеспечивать единообразие интерфейса. Темы в Chakra UI — это объекты JavaScript, содержащие настройки цветов, шрифтов, размеров, отступов и других визуальных параметров. Они позволяют создавать как стандартные, так и пользовательские стили, применимые ко всему приложению.
Базовая структура темы в Chakra UI включает несколько ключевых разделов:
const theme = {
colors: {
brand: {
50: '#f5f7ff',
100: '#e0e7ff',
500: '#4348ff',
900: '#1a1b4f'
},
red: {
500: '#e53e3e'
}
}
}
const theme = {
fonts: {
heading: 'Roboto, sans-serif',
body: 'Open Sans, sans-serif',
mono: 'Menlo, monospace'
}
}
const theme = {
fontSizes: {
xs: '0.75rem',
sm: '0.875rem',
md: '1rem',
lg: '1.125rem',
xl: '1.25rem'
}
}
const theme = {
space: {
1: '4px',
2: '8px',
4: '16px',
8: '32px'
}
}
const theme = {
components: {
Button: {
baseStyle: {
fontWeight: 'bold',
borderRadius: 'md'
},
sizes: {
lg: {
h: '56px',
fontSize: 'lg',
px: 8
}
},
variants: {
solid: {
bg: 'brand.500',
color: 'white',
_hover: {
bg: 'brand.600'
}
},
outline: {
borderColor: 'brand.500',
color: 'brand.500'
}
}
}
}
}
Chakra UI предоставляет функцию extendTheme, позволяющую
добавлять или переопределять элементы стандартной темы. Это удобно для
поддержания обновлений библиотеки, сохраняя совместимость с базовой
темой.
import { extendTheme } from '@chakra-ui/react'
const customTheme = extendTheme({
colors: {
brand: {
50: '#f0f4ff',
500: '#1a73e8'
}
},
fonts: {
heading: 'Poppins, sans-serif'
}
})
export default customTheme
Chakra UI позволяет создавать варианты компонентов,
определяя их внешний вид в зависимости от контекста. Для кнопок, инпутов
и других элементов можно задавать состояния (_hover,
_active, _disabled), что повышает гибкость
интерфейса.
Пример для Input:
const theme = extendTheme({
components: {
Input: {
variants: {
filled: {
field: {
bg: 'gray.100',
_hover: { bg: 'gray.200' },
_focus: { bg: 'white', borderColor: 'brand.500' }
}
}
}
}
}
})
Chakra UI поддерживает светлую и тёмную темы через
механизм Color Mode. Управление осуществляется с помощью хука
useColorMode и провайдера ChakraProvider.
Пример:
import { ChakraProvider, extendTheme } from '@chakra-ui/react'
const theme = extendTheme({
config: {
initialColorMode: 'light',
useSystemColorMode: false
}
})
<ChakraProvider theme={theme}>
<App />
</ChakraProvider>
Цветовые режимы позволяют задавать значения для light и
dark одновременно:
const colors = {
text: {
light: 'gray.800',
dark: 'whiteAlpha.900'
}
}
Внутри компонентов это используется через
useColorModeValue:
import { useColorModeValue, Box } from '@chakra-ui/react'
<Box bg={useColorModeValue('white', 'gray.800')}>
Содержимое
</Box>
В Chakra UI можно создавать собственные компоненты с
уникальной темой. Это делается через
withDefaultColorScheme или полное переопределение
компонента.
import { extendTheme, withDefaultColorScheme } from '@chakra-ui/react'
const theme = extendTheme(
withDefaultColorScheme({ colorScheme: 'teal' })
)
Такой подход упрощает унификацию всех элементов интерфейса под общий стиль, снижая дублирование кода.
После создания темы её подключают через ChakraProvider,
что делает все настройки доступными во всех дочерних компонентах. Все
компоненты Chakra автоматически применяют заданные значения: цвета,
размеры, шрифты и состояния.
import { ChakraProvider } from '@chakra-ui/react'
import customTheme from './theme'
<ChakraProvider theme={customTheme}>
<App />
</ChakraProvider>
Темы можно изменять динамически, комбинируя цветовые режимы с пропсами компонентов. Пример использования кастомного цвета для кнопки с учётом режима:
<Button
bg={useColorModeValue('brand.500', 'brand.200')}
color={useColorModeValue('white', 'gray.800')}
>
Кнопка
</Button>
Это обеспечивает гибкость интерфейса при изменении внешнего вида без изменения кода темы глобально.
Темизация в Chakra UI объединяет возможности централизованного управления стилями, вариантов компонентов, поддержки цветовых режимов и наследования настроек, что позволяет создавать масштабируемые, унифицированные и легко поддерживаемые интерфейсы в приложениях на JavaScript.