В Chakra UI кнопка (Button) является базовым
компонентом, который легко настраивается и расширяется с помощью
свойств, системных стилей и пользовательских тем. Для создания кастомной
кнопки важно понимать, как работают системные стили,
варианты, состояния и
композиция компонентов.
import { Button } from "@chakra-ui/react";
Эта строка импортирует компонент Button, который можно
использовать как основу для кастомизации.
Chakra UI предоставляет систему пропсов, которая позволяет напрямую изменять визуальные свойства:
colorScheme — задаёт цветовую палитру кнопки
("blue", "red", "green" и
т.д.)size — размеры: "sm", "md",
"lg"variant — стиль кнопки: "solid",
"outline", "ghost", "link",
"unstyled"isDisabled — делает кнопку неактивнойisLoading — добавляет индикатор загрузкиПример базовой кастомной кнопки:
<Button colorScheme="teal" size="lg" variant="solid">
Отправить
</Button>
Здесь используется системная палитра teal, крупный
размер и вариант "solid".
Для более глубокой кастомизации можно использовать extendTheme и определять собственные варианты:
import { extendTheme } from "@chakra-ui/react";
const theme = extendTheme({
components: {
Button: {
variants: {
neon: {
bg: "cyan.400",
color: "black",
_hover: {
bg: "cyan.300",
boxShadow: "0 0 10px cyan",
},
_active: {
bg: "cyan.500",
},
},
},
},
},
});
export default theme;
Использование нового варианта:
<Button variant="neon">Неоновая кнопка</Button>
_hover и _active — состояния наведения и
нажатия.boxShadow добавляет визуальный эффект свечения.Часто кнопки содержат иконки. В Chakra UI есть компонент
Icon и свойство leftIcon /
rightIcon:
import { Button, Icon } from "@chakra-ui/react";
import { MdSend } from "react-icons/md";
<Button colorScheme="purple" leftIcon={<MdSend />}>
Отправить
</Button>
leftIcon добавляет иконку слева от текста,
rightIcon — справа.Для создания интерактивных кнопок можно использовать
motion из Framer Motion, интегрируя его с
Chakra через chakra():
import { chakra, Button } from "@chakra-ui/react";
import { motion } from "framer-motion";
const MotionButton = chakra(motion.button);
<MotionButton
bg="pink.400"
whileHover={{ scale: 1.1 }}
whileTap={{ scale: 0.95 }}
color="white"
px={6}
py={4}
borderRadius="md"
>
Анимированная кнопка
</MotionButton>
whileHover увеличивает размер кнопки при
наведении.whileTap уменьшает размер при клике.px, py,
borderRadius) даже при интеграции с Framer Motion.Для полного контроля над поведением кнопки создаются обёртки над компонентом Button:
import { forwardRef } from "react";
import { Button } from "@chakra-ui/react";
const GradientButton = forwardRef((props, ref) => (
<Button
ref={ref}
bgGradient="linear(to-r, teal.400, green.400)"
color="white"
_hover={{
bgGradient: "linear(to-r, teal.500, green.500)",
transform: "scale(1.05)",
}}
_active={{
bgGradient: "linear(to-r, teal.600, green.600)",
}}
{...props}
/>
));
export default GradientButton;
Использование:
<GradientButton size="lg">Градиентная кнопка</GradientButton>
forwardRef позволяет использовать компонент как обычную
кнопку с поддержкой ref.bgGradient задаёт линейный градиент.transform: scale(1.05) создаёт эффект “поп-ап” при
наведении.Chakra UI поддерживает адаптивные пропсы, что удобно для кастомных кнопок в разных разрешениях экрана:
<Button
w={{ base: "100%", md: "auto" }}
px={{ base: 4, md: 6 }}
py={3}
colorScheme="orange"
>
Адаптивная кнопка
</Button>
w={{ base: "100%", md: "auto" }} — кнопка занимает всю
ширину на мобильных устройствах, но адаптируется на десктопе.px и py также можно задавать
адаптивно.hover, active,
focus, disabled.leftIcon/rightIcon.chakra().Кастомизация кнопок в Chakra UI — гибкая система, которая позволяет создавать уникальные визуальные элементы без потери согласованности интерфейса.