Chakra UI предоставляет встроенную систему для работы с иконками
через компонент Icon. Использование кастомных иконок
позволяет создавать уникальные визуальные элементы интерфейса без
зависимости от сторонних библиотек иконок. Основная структура кастомной
иконки в Chakra UI строится на SVG и компоненте Icon,
который обеспечивает интеграцию с системой стилей библиотеки.
import { Icon } from '@chakra-ui/react';
const CustomIcon = (props) => (
<Icon viewBox="0 0 24 24" {...props}>
<path d="M12 2L15 8H9L12 2Z" fill="currentColor"/>
</Icon>
);
Ключевые моменты:
viewBox определяет область видимости SVG. Обычно
используется 0 0 24 24 для стандартного размера
иконок.fill="currentColor" позволяет иконке наследовать цвет
текста, заданный через свойства Chakra UI, например
color="blue.500".Icon автоматически поддерживает размеры
boxSize, что позволяет управлять размером иконки через
стандартные пропсы Chakra UI (boxSize="6").Кастомные иконки можно использовать в кнопках, ссылках и других
интерактивных элементах Chakra UI. Для этого достаточно передать
компонент иконки в проп icon или встроить его напрямую в
JSX.
import { Button } from '@chakra-ui/react';
<Button leftIcon={<CustomIcon />} colorScheme="teal">
Нажми меня
</Button>
Преимущества подхода:
size и color передаются через
Chakra UI и масштабируют SVG без дополнительной работы.Для сложных интерфейсов часто требуется несколько вариаций одной
иконки: обычная, активная, с эффектом наведения. Chakra UI позволяет
комбинировать кастомные иконки с компонентами Box или
Motion (если используется framer-motion) для
анимации и изменения состояния.
import { Box, Icon } from '@chakra-ui/react';
import { motion } from 'framer-motion';
const MotionBox = motion(Box);
const HoverIcon = () => (
<MotionBox whileHover={{ scale: 1.2 }}>
<CustomIcon color="red.500" boxSize="8"/>
</MotionBox>
);
Особенности подхода:
motion позволяет плавно изменять размер,
цвет и другие свойства SVG.red.500, blue.300) для единообразия
стиля.<path> внутри одного Icon.Для централизованного управления иконками рекомендуется интегрировать
кастомные SVG в тему Chakra UI через расширение компонента
Icon.
import { extendTheme } from '@chakra-ui/react';
import { AddIcon, CheckIcon } from '@chakra-ui/icons';
import CustomIcon from './CustomIcon';
const theme = extendTheme({
components: {
Icon: {
variants: {
customAdd: (props) => <AddIcon {...props} />,
customCheck: (props) => <CheckIcon {...props} />,
customStar: (props) => <CustomIcon {...props} />,
},
},
},
});
Преимущества:
currentColor — это
обеспечивает легкую интеграцию с темой и возможность изменять цвет
иконки через пропсы Chakra UI.viewBox 24x24 — стандарт
для иконок в Chakra UI, упрощает интеграцию с другими компонентами.framer-motion или CSS-транзишнов делает интерфейс более
динамичным и современным.Иногда требуется объединение нескольких SVG для создания сложных
символов. Chakra UI позволяет это сделать с помощью вложенных
Icon.
const ComplexIcon = (props) => (
<Icon viewBox="0 0 24 24" {...props}>
<path d="M2 12L12 2L22 12H2Z" fill="currentColor"/>
<circle cx="12" cy="16" r="4" fill="yellow"/>
</Icon>
);
<path> задаёт форму крыши.<circle> добавляет декоративный элемент.currentColor позволяет основному цвету иконки управлять
остальными слоями через пропсы Chakra UI.Эти подходы создают гибкую систему кастомных иконок, полностью интегрированную с дизайном Chakra UI, обеспечивая единообразие, масштабируемость и удобство поддержки в крупных проектах.