2026-07-11 09:26:43 +03:00
# @gromlab/svg-sprites
[🇬🇧 English ](README.md ) | 🇷🇺 Русский
 
2026-07-11 23:20:39 +03:00
`@gromlab/svg-sprites` — генератор SVG-спрайтов для современных веб-приложений. Он собирает выбранные SVG-иконки в один или несколько внешних кешируемых спрайтов и подготавливает их для использования в интерфейсе.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Для React и Next.js пакет создаёт типизированные компоненты и поддерживает Vite, Webpack 5 и Turbopack. В основе при этом остаётся обычный SVG-спрайт, который можно использовать без фреймворка, в том числе в нативном HTML.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## SVG-спрайт так же прост, как обычная SVG-иконка
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Для всего спрайта генерируется один типизированный React-компонент. Выберите иконку через `icon` , а редактор покажет автокомплит всех доступных имён.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```tsx
< AppIcon icon = "search" width = {24} height = {24} / >
```
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Компонент принимает привычные SVG-атрибуты: размеры, `color` , `className` , `style` , `aria-*` и обработчики событий. Если нужен внешний контейнер, добавьте `wrapped` .
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```tsx
< AppIcon icon = "search" wrapped className = "iconWrapper" / >
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
В приложении не приходится работать с о спрайтом напрямую. Вы используете е г о так же, как обычную SVG-иконку, но получаете один компонент, автокомплит и TypeScript-проверку всех имён.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## AI-friendly из коробки
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
`@gromlab/svg-sprites` сразу рассчитан на работу с AI-агентами. Подключите готовый skill и поручите агенту настройку, миграцию или диагностику без длинных инструкций и ручного изучения документации.
2026-07-11 09:26:43 +03:00
2026-07-11 23:50:39 +03:00
[🇷🇺 Скачать AI skill (на русском) ](https://github.com/gromlab-ru/svg-sprites/releases/latest/download/svg-sprites-ru.zip )
2026-07-11 09:26:43 +03:00
2026-07-11 23:50:39 +03:00
[🇬🇧 Скачать AI skill (на английском) ](https://github.com/gromlab-ru/svg-sprites/releases/latest/download/svg-sprites.zip )
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## От SVG до компонента за четыре шага
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Основной пример использует Next.js App Router и Turbopack.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
### 1. Установите пакет
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```bash
npm install --save-dev @gromlab/svg -sprites
```
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
### 2. Укажите нужные иконки
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
SVG могут оставаться в существующей структуре проекта:
2026-07-11 09:26:43 +03:00
```text
2026-07-11 23:20:39 +03:00
src/
├── assets/icons/
│ ├── search.svg
│ └── settings.svg
├── features/profile/
│ └── user.svg
└── ui/app-icons/
└── svg-sprite.config.ts
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
Создайте конфигурацию спрайта:
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```ts
// src/ui/app-icons/svg-sprite.config.ts
import { defineNextSpriteConfig } from '@gromlab/svg -sprites'
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
export default defineNextSpriteConfig({
name: 'app',
inputFiles: [
'../../assets/icons/search.svg',
'../../assets/icons/settings.svg',
'../../features/profile/user.svg',
],
})
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
### 3. Добавьте генерацию
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```json
{
"scripts": {
"sprites": "svg-sprites --mode next@app/turbopack src/ui/app-icons",
"predev": "npm run sprites",
"prebuild": "npm run sprites"
}
}
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
Первый запуск:
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```bash
npm run sprites
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
Пакет создаст `AppIcon` , TypeScript-типы и отдельный SVG-спрайт.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
### 4. Используйте как обычную иконку
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```tsx
import { AppIcon } from '@/ui/app -icons'
export default function SearchButton() {
return (
< button type = "button" >
< AppIcon icon = "search" width = {20} height = {20} / >
Найти
< / button >
)
}
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
Это Server Component. Для иконки не нужны provider, `'use client'` или ручная сборка URL.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## Типизированный React-компонент с автокомплитом
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Каждый спрайт получает собственный готовый компонент. Свойство `icon` формируется из реальных имён SVG, поэтому редактор показывает точный список доступных иконок, а TypeScript сразу обнаруживает опечатки.
2026-07-11 09:26:43 +03:00
```tsx
2026-07-11 23:20:39 +03:00
< AppIcon icon = "search" / > // доступная иконка
< AppIcon icon = "serach" / > // ошибка TypeScript
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
После добавления новой SVG-иконки и повторной генерации её имя автоматически появляется в типах и автокомплите. Н е нужно вручную поддерживать компоненты, union-типы или реестр имён.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## Next.js App Router и SSR из коробки
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Generated-компоненты работают в Server Components, SSR и SSG без `'use client'` .
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Подключение иконки не переносит страницу на клиент, не требует provider и не создаёт дополнительную границу гидратации.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Один и тот же компонент можно использовать в `page.tsx` , `layout.tsx` , серверных и клиентских компонентах.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## Множественные спрайты вместо одного глобального
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Проект не ограничен одним набором иконок. Создавайте независимые спрайты для общих элементов, отдельных страниц и крупных UI-модулей.
2026-07-11 09:26:43 +03:00
```tsx
2026-07-11 23:20:39 +03:00
< AppIcon icon = "search" / >
< AnalyticsIcon icon = "chart" / >
< EditorIcon icon = "bold" / >
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
Каждый набор получает собственный типизированный компонент и SVG asset, поэтому разделы приложения не несут иконки, которые им не нужны.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## Каждая иконка хранится в одном экземпляре
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
В библиотеке исходников каждая SVG-иконка хранится в одном экземпляре и может входить в любое количество спрайтов. Общие иконки не приходится копировать между страницами и модулями: они обновляются для всех наборов из одного места.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```text
search.svg ─┬─→ AppIcon
├─→ AnalyticsIcon
└─→ EditorIcon
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
Спрайты разделяются ради производительности, но библиотека исходных иконок остаётся единой.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## Браузерное кеширование
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
При стандартной конфигурации Vite, Webpack или Next.js каждый спрайт выпускается отдельным версионированным SVG-файлом.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Пока набор иконок не меняется, браузер может использовать сохранённую копию независимо от обновлений JavaScript приложения.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Изменение React-компонентов не требует повторно загружать геометрию всех иконок.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## JavaScript без SVG-балласта
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Контуры иконок остаются во внешних SVG assets и не увеличивают chunks приложения.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```text
React-код → JavaScript chunks
SVG-иконки → отдельные SVG assets
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
JavaScript отвечает за интерфейс и поведение, а графика загружается и кешируется отдельно.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## Трансформации SVG из коробки
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
В о время генерации пакет автоматически подготавливает исходные SVG для интерфейса:
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
- удаляет фиксированные `width` и `height` ;
- сохраняет существующий `viewBox` ;
- преобразует `fill` и `stroke` в CSS-переменные;
- добавляет плавные transitions непосредственно в цветные элементы иконки.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Каждую трансформацию можно настроить или отключить независимо.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## Каждый цвет под контролем CSS
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
При генерации цвета `fill` и `stroke` автоматически преобразуются в CSS-переменные `--icon-color-N` .
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Монохромная иконка наследует `currentColor` :
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```tsx
< AppIcon icon = "search" color = "rebeccapurple" / >
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
В многоцветной иконке каждый цвет можно менять отдельно:
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```tsx
< AppIcon
icon="user"
style={{
'--icon-color-1': '#2563eb ',
'--icon-color-2': '#dbeafe ',
}}
/>
2026-07-11 09:26:43 +03:00
```
2026-07-11 23:20:39 +03:00
Темы, состояния и hover-эффекты создаются без редактирования SVG и дополнительных копий иконки.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## SpriteViewer: все спрайты на одной debug-странице
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
`SpriteViewer` рендерит все спрайты проекта в одном месте и показывает, какие иконки вошли в каждый набор и как они выглядят.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Для каждой иконки видны созданные CSS-переменные и их fallback-цвета. Значения можно менять прямо в Viewer и сразу наблюдать результат.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Здесь же доступны готовые примеры подключения через:
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
- React;
- `<svg><use>` ;
- `<img>` ;
- CSS.
2026-07-11 09:26:43 +03:00
2026-07-11 23:50:39 +03:00

2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Viewer подключается только к внутренней debug-странице и не становится частью generated-компонентов иконок.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## От нативного HTML до Next.js
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
В основе остаётся обычный SVG-спрайт, который можно использовать даже без фреймворка и сборщика.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Для React и Next.js пакет генерирует типизированные компоненты и поддерживает Vite, Webpack 5 и Turbopack. Список готовых интеграций будет расширяться новыми фреймворками.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## Чистый Git
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Генератор создаёт локальный `.gitignore` , который исключает generated-файлы и не позволяет им засорять историю, pull requests и код проекта.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
В репозитории остаются исходные SVG, конфигурация и правило `.gitignore` , а локально и в CI спрайты, компоненты и типы заново создаются через `prebuild` .
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## В production только иконки
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
`@gromlab/svg-sprites` выполняет основную работу на этапе генерации и остаётся в `devDependencies` .
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
Production-компоненты используют только локальный generated-код, стили и внешний SVG-файл. Compiler и CLI не попадают в клиентское приложение, а `SpriteViewer` подключается отдельно только там, где нужна debug-страница.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
## Документация
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
README знакомит с возможностями проекта и показывает основной сценарий использования. Для настройки выберите руководство под свой стек.
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
### Быстрый старт
2026-07-11 09:26:43 +03:00
- [Next.js App Router ](docs/ru/next-app.md )
- [Next.js Pages Router ](docs/ru/next-pages.md )
2026-07-11 23:20:39 +03:00
- [React + Vite ](docs/ru/react-vite.md )
- [React + Webpack 5 ](docs/ru/react-webpack.md )
- [Нативный HTML и классические SVG-спрайты ](docs/ru/legacy.md )
### Технические материалы
- [Технический справочник ](docs/ru/reference.md )
2026-07-11 09:26:43 +03:00
- [Программный API ](docs/ru/programmatic-api.md )
2026-07-11 23:20:39 +03:00
- [Миграция с 0.1.x ](docs/ru/migration-1.md )
2026-07-11 09:26:43 +03:00
## Лицензия
MIT