Chakra UI предоставляет мощный механизм кастомизации компонентов через Theme Components API, который позволяет централизованно управлять стилями, поведением и вариантами компонентов. Это значительно упрощает поддержание консистентного дизайна приложения и уменьшает дублирование кода.
Внутри темы Chakra UI все кастомизации компонентов хранятся в объекте
theme.components. Каждый компонент представлен отдельным
ключом, например:
import { extendTheme } from "@chakra-ui/react";
const theme = extendTheme({
components: {
Button: {
baseStyle: {},
sizes: {},
variants: {},
defaultProps: {},
},
Input: {
baseStyle: {},
sizes: {},
variants: {},
defaultProps: {},
},
},
});
Ключи внутри компонента имеют строго определённое назначение:
sm, md, lg), влияющие на padding,
font-size, высоту и другие параметры.solid, outline, ghost.baseStyle задаёт основу для всех экземпляров компонента.
Здесь можно определять цвета, отступы, типографику и другие
CSS-свойства.
Пример для кнопки:
Button: {
baseStyle: {
fontWeight: "bold",
borderRadius: "md",
_focus: {
boxShadow: "outline",
},
},
}
Особенности:
_hover,
_active, _focus, _disabled) для
описания интерактивного поведения.baseStyle: (props) => ({
bg: props.colorMode === "dark" ? "gray.700" : "gray.100",
})
Sizes позволяют стандартизировать размеры компонентов. Каждый размер определяет набор CSS-свойств, влияющих на элемент.
Пример для Button:
sizes: {
sm: {
fontSize: "sm",
px: 3,
py: 2,
},
md: {
fontSize: "md",
px: 4,
py: 3,
},
lg: {
fontSize: "lg",
px: 6,
py: 4,
},
}
Особенности:
theme.space,
theme.fontSizes) для консистентности.Variants задают визуальные стили, отличные от базового. Они идеально подходят для создания разных визуальных состояний компонента без повторного кода.
Пример для Button:
variants: {
solid: (props) => ({
bg: props.colorScheme === "red" ? "red.500" : "blue.500",
color: "white",
_hover: {
bg: props.colorScheme === "red" ? "red.600" : "blue.600",
},
}),
outline: {
border: "2px solid",
borderColor: "currentColor",
},
ghost: {
bg: "transparent",
_hover: { bg: "gray.100" },
},
}
Особенности:
props.sizes и baseStyle
для максимальной гибкости.colorScheme).DefaultProps задают стандартные значения для компонента, такие как размер или вариант. Это позволяет не указывать их вручную при каждом использовании.
Пример:
defaultProps: {
size: "md",
variant: "solid",
colorScheme: "blue",
}
Эффект:
Button без явного указания
size или variant автоматически примет эти
значения.theme.components), что упрощает поддержку больших
приложений.baseStyle и variants даёт доступ к props и
теме, обеспечивая адаптивность и поддержку colorMode.colorMode, spacing,
typography и другими возможностями темы.const theme = extendTheme({
components: {
Button: {
baseStyle: {
fontWeight: "semibold",
borderRadius: "full",
},
sizes: {
xl: {
fontSize: "xl",
px: 8,
py: 6,
},
},
variants: {
gradient: {
bgGradient: "linear(to-r, teal.500, green.500)",
color: "white",
_hover: {
bgGradient: "linear(to-r, teal.600, green.600)",
},
},
},
defaultProps: {
size: "md",
variant: "solid",
colorScheme: "teal",
},
},
},
});
В этом примере:
xl с увеличенными отступами.gradient с градиентной заливкой и
hover-эффектом.Theme Components API в Chakra UI — это гибкий и мощный инструмент, который позволяет создавать сложные и масштабируемые интерфейсы с единым источником правды для всех компонентов. Он обеспечивает комбинацию структурированного подхода, динамических возможностей и полной интеграции с темой приложения, делая кастомизацию интуитивной и управляемой.