SVG и иконки
Когда нужен SVG pipeline
Build pipeline необходим, если хотя бы одно из условий верно:
- дизайн предоставляет кастомные SVG
- планируется ребрендинг или темизация
- иконки используются в нескольких подпроектах
Pipeline: что должно получиться
MUST
- единый SVG-спрайт
- типизированный список имён иконок (
icons.d.ts) - общий
Iconкомпонент
SHOULD
- оптимизация SVG через SVGO
- конвертация в React-компоненты через SVGR (или аналог)
Требования к исходникам
MUST
- все SVG лежат в одной директории
- имена файлов совпадают с именами в дизайне и используют
kebab-case - есть
viewBox, иконка масштабируется без обрезки - для монохромных иконок используется
currentColor
SHOULD
- единый базовый размер (например, 24x24)
- одинаковые правила для stroke/linecap/linejoin
FORBIDDEN
- inline-стили внутри SVG
- жёстко заданные
width/heightбезviewBox - растровые вставки (
<image>внутри SVG)
Цвет и стилизация
MUST
- Монохромные иконки наследуют цвет через
currentColor. - Многоцветные иконки используют токены (CSS variables), а не прямые значения.
✅ Хорошо (currentColor)
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
<path d="..." />
</svg>
✅ Хорошо (token)
<svg viewBox="0 0 24 24">
<path fill="var(--color-icon-accent)" d="..." />
</svg>
❌ Плохо
<path fill="#ff0000" d="..." />
Анимации и inline-SVG
SHOULD
- Для анимаций использовать
Iconкомпонент и CSS-анимации.
Допускается
- Inline-SVG, если анимацию нельзя реализовать иначе (например, сложные keyframes по путям).
Использование в коде
✅ Хорошо
<Icon name="arrow-left" size="m" />
<Icon name="warning" color="var(--color-icon-warning)" />
❌ Плохо
import ArrowLeft from './icons/arrow-left.svg';
<ArrowLeft width={16} height={16} />