2026-07-11 09:26:43 +03:00
# @gromlab/svg-sprites
2026-07-15 12:27:46 +03:00
[🇬🇧 English ](https://github.com/gromlab-ru/svg-sprites/blob/master/README.md ) | 🇷🇺 Русский
2026-07-11 09:26:43 +03:00
 
2026-07-16 09:14:11 +03:00
`@gromlab/svg-sprites` — CLI-инструмент для генерации SVG-спрайтов в современных веб-приложениях. Он собирает выбранные SVG-иконки в один или несколько внешних кешируемых спрайтов и подготавливает их для использования в интерфейсе.
2026-07-11 09:26:43 +03:00
feat: добавить поддержку 20 framework exact modes
Добавлены exact modes:
- vue@vite и vue@webpack
- nuxt@vite и nuxt@webpack
- svelte@vite, svelte@webpack и sveltekit@vite
- angular@application и angular@webpack
- astro@vite
- solid@vite, solid@webpack и solid-start@vite
- preact@vite и preact@webpack
- qwik@vite
- lit@vite и lit@webpack
- alpine@vite и alpine@webpack
Для каждого mode реализованы изолированный adapter, нативный
framework-компонент, declarations, manifest, CSS и внешний asset URL.
Добавлены production integration-стенды с генерацией, typecheck,
сборкой и Playwright-проверкой рендера спрайта и Viewer.
Обновлены Viewer, RU/EN-гайды, README, technical reference и AI skills.
Итоговая матрица включает 29 exact modes.
Проверки:
- 48 unit-тестов
- 29 integration E2E-тестов
2026-07-15 16:56:44 +03:00
Каждый exact mode создаёт нативный типизированный компонент для своего framework и bundler: Web Component, React, Vue, Svelte, Angular, Astro, Solid, Preact, Qwik, Lit или Alpine.js. SVG во всех случаях остаётся отдельным кешируемым asset.
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-15 12:27:46 +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-15 12:27:46 +03:00
### 1. Укажите нужные иконки
2026-07-11 09:26:43 +03:00
2026-07-15 12:27:46 +03:00
Создайте папки для исходных иконок и спрайта:
2026-07-11 09:26:43 +03:00
```text
2026-07-15 12:27:46 +03:00
assets/
├── app-icons/
│ └── svg-sprite.config.json
└── svg-icons/
├── search.svg
└── settings.svg
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-15 12:27:46 +03:00
```json
{
"mode": "next@app/turbopack ",
"name": "app",
"input": "../svg-icons/**/*.svg"
2026-07-14 16:11:39 +03:00
}
2026-07-11 09:26:43 +03:00
```
2026-07-15 12:27:46 +03:00
`input` поддерживает пути к папкам, отдельным SVG и glob-шаблоны.
### 2. Добавьте генерацию
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```json
{
"scripts": {
2026-07-15 12:27:46 +03:00
"sprites": "npx --yes @gromlab/svg -sprites assets/app-icons/svg-sprite.config.json",
2026-07-11 23:20:39 +03:00
"predev": "npm run sprites",
"prebuild": "npm run sprites"
}
}
2026-07-11 09:26:43 +03:00
```
2026-07-15 12:27:46 +03:00
Создайте точку входа для сгенерированного API:
```ts
// assets/app-icons/index.ts
export * from './.svg-sprite/index.js'
```
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-15 12:27:46 +03:00
### 3. Используйте как обычную иконку
2026-07-11 09:26:43 +03:00
2026-07-11 23:20:39 +03:00
```tsx
2026-07-15 12:27:46 +03:00
// app/page.tsx
import { AppIcon } from '../assets/app-icons'
2026-07-11 23:20:39 +03:00
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
feat: добавить поддержку 20 framework exact modes
Добавлены exact modes:
- vue@vite и vue@webpack
- nuxt@vite и nuxt@webpack
- svelte@vite, svelte@webpack и sveltekit@vite
- angular@application и angular@webpack
- astro@vite
- solid@vite, solid@webpack и solid-start@vite
- preact@vite и preact@webpack
- qwik@vite
- lit@vite и lit@webpack
- alpine@vite и alpine@webpack
Для каждого mode реализованы изолированный adapter, нативный
framework-компонент, declarations, manifest, CSS и внешний asset URL.
Добавлены production integration-стенды с генерацией, typecheck,
сборкой и Playwright-проверкой рендера спрайта и Viewer.
Обновлены Viewer, RU/EN-гайды, README, technical reference и AI skills.
Итоговая матрица включает 29 exact modes.
Проверки:
- 48 unit-тестов
- 29 integration E2E-тестов
2026-07-15 16:56:44 +03:00
`SpriteViewer` рендерит спрайты всех поддерживаемых exact modes в одном месте. Один Web Component отвечает за визуал, а для React также доступен тонкий bridge к нему.
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
feat: добавить поддержку 20 framework exact modes
Добавлены exact modes:
- vue@vite и vue@webpack
- nuxt@vite и nuxt@webpack
- svelte@vite, svelte@webpack и sveltekit@vite
- angular@application и angular@webpack
- astro@vite
- solid@vite, solid@webpack и solid-start@vite
- preact@vite и preact@webpack
- qwik@vite
- lit@vite и lit@webpack
- alpine@vite и alpine@webpack
Для каждого mode реализованы изолированный adapter, нативный
framework-компонент, declarations, manifest, CSS и внешний asset URL.
Добавлены production integration-стенды с генерацией, typecheck,
сборкой и Playwright-проверкой рендера спрайта и Viewer.
Обновлены Viewer, RU/EN-гайды, README, technical reference и AI skills.
Итоговая матрица включает 29 exact modes.
Проверки:
- 48 unit-тестов
- 29 integration E2E-тестов
2026-07-15 16:56:44 +03:00
Здесь же доступны готовые примеры для framework из manifest, `<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
feat: добавить поддержку 20 framework exact modes
Добавлены exact modes:
- vue@vite и vue@webpack
- nuxt@vite и nuxt@webpack
- svelte@vite, svelte@webpack и sveltekit@vite
- angular@application и angular@webpack
- astro@vite
- solid@vite, solid@webpack и solid-start@vite
- preact@vite и preact@webpack
- qwik@vite
- lit@vite и lit@webpack
- alpine@vite и alpine@webpack
Для каждого mode реализованы изолированный adapter, нативный
framework-компонент, declarations, manifest, CSS и внешний asset URL.
Добавлены production integration-стенды с генерацией, typecheck,
сборкой и Playwright-проверкой рендера спрайта и Viewer.
Обновлены Viewer, RU/EN-гайды, README, technical reference и AI skills.
Итоговая матрица включает 29 exact modes.
Проверки:
- 48 unit-тестов
- 29 integration E2E-тестов
2026-07-15 16:56:44 +03:00
Bare standalone подключает Viewer через browser script и HTML element. Bundler и framework modes используют npm entry Web Component; React и Next.js также могут импортировать bridge из `@gromlab/svg-sprites/react` .
2026-07-14 09:54:36 +03:00
2026-07-16 09:14:11 +03:00
## 30 exact modes
2026-07-11 09:26:43 +03:00
2026-07-16 09:14:11 +03:00
Пакет поддерживает 30 изолированных exact modes: `standalone@server` для серверной генерации универсального SVG-спрайта и 29 consumer modes для современных frameworks и bundlers.
`standalone@server` позволяет заранее сгенерировать SVG-спрайт на сервере или в CI/CD и опубликовать е г о для совместного использования. Такой спрайт не привязан к конкретному framework или bundler и подходит всем consumer modes.
29 consumer modes охватывают standalone, React, Next.js, Vue, Nuxt, Svelte, SvelteKit, Angular, Astro, Solid, SolidStart, Preact, Qwik, Lit и Alpine.js в поддерживаемых вариантах Vite, Webpack, Turbopack и application builder.
В с е 29 consumer modes могут работать как с о спрайтами, сгенерированными локально в проекте, так и с универсальными спрайтами, заранее сгенерированными на сервере через `standalone@server` . API компонентов и способ использования иконок в приложении в обоих сценариях остаются одинаковыми.
Интеграционная матрица охватывает все 30 exact modes. Отдельный producer-стенд проверяет серверную генерацию универсального спрайта, а каждое из 29 consumer-приложений генерирует и рендерит два независимых спрайта: локальный и удалённый.
В с е consumer-приложения проходят production build и Playwright-тесты, а типизированные modes дополнительно проверяются штатным toolchain фреймворка. Каждый E2E-тест подтверждает, что локальный и удалённый спрайты загружаются и отрисовываются, а также проверяет отсутствие browser errors и отображение обеих групп в SpriteViewer.
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-14 16:11:39 +03:00
Bundler и framework modes создают локальный `.gitignore` , который исключает generated-файлы и не позволяет им засорять историю, pull requests и код проекта. Bare `standalone` оставляет политику репозитория приложению.
2026-07-11 09:26:43 +03:00
2026-07-14 16:11:39 +03:00
В bundler и framework modes в репозитории остаются исходные 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-14 16:11:39 +03:00
Генерация полностью работает через `npx` , без добавления package в проект. Устанавливайте е г о как development dependency, только если нужны Viewer, типы конфига или программный API.
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-16 09:14:11 +03:00
### Серверная генерация
- [Standalone + Server ](docs/ru/guides/standalone-server.md )
### Быстрый старт для consumer modes
2026-07-11 09:26:43 +03:00
2026-07-14 16:11:39 +03:00
- [Bare standalone ](docs/ru/guides/standalone.md )
- [Standalone + Vite ](docs/ru/guides/standalone-vite.md )
- [Standalone + Webpack 5 ](docs/ru/guides/standalone-webpack.md )
- [React + Vite ](docs/ru/guides/react-vite.md )
- [React + Webpack 5 ](docs/ru/guides/react-webpack.md )
feat: добавить поддержку 20 framework exact modes
Добавлены exact modes:
- vue@vite и vue@webpack
- nuxt@vite и nuxt@webpack
- svelte@vite, svelte@webpack и sveltekit@vite
- angular@application и angular@webpack
- astro@vite
- solid@vite, solid@webpack и solid-start@vite
- preact@vite и preact@webpack
- qwik@vite
- lit@vite и lit@webpack
- alpine@vite и alpine@webpack
Для каждого mode реализованы изолированный adapter, нативный
framework-компонент, declarations, manifest, CSS и внешний asset URL.
Добавлены production integration-стенды с генерацией, typecheck,
сборкой и Playwright-проверкой рендера спрайта и Viewer.
Обновлены Viewer, RU/EN-гайды, README, technical reference и AI skills.
Итоговая матрица включает 29 exact modes.
Проверки:
- 48 unit-тестов
- 29 integration E2E-тестов
2026-07-15 16:56:44 +03:00
- [Vue + Vite ](docs/ru/guides/vue-vite.md )
- [Vue + Webpack ](docs/ru/guides/vue-webpack.md )
- [Nuxt + Vite ](docs/ru/guides/nuxt-vite.md )
- [Nuxt + Webpack ](docs/ru/guides/nuxt-webpack.md )
- [Svelte + Vite ](docs/ru/guides/svelte-vite.md )
- [Svelte + Webpack ](docs/ru/guides/svelte-webpack.md )
- [SvelteKit + Vite ](docs/ru/guides/sveltekit-vite.md )
- [Angular application builder ](docs/ru/guides/angular-application.md )
- [Angular + Webpack ](docs/ru/guides/angular-webpack.md )
- [Astro + Vite ](docs/ru/guides/astro-vite.md )
- [Solid + Vite ](docs/ru/guides/solid-vite.md )
- [Solid + Webpack ](docs/ru/guides/solid-webpack.md )
- [SolidStart + Vite ](docs/ru/guides/solid-start-vite.md )
- [Preact + Vite ](docs/ru/guides/preact-vite.md )
- [Preact + Webpack ](docs/ru/guides/preact-webpack.md )
- [Qwik + Vite ](docs/ru/guides/qwik-vite.md )
- [Lit + Vite ](docs/ru/guides/lit-vite.md )
- [Lit + Webpack ](docs/ru/guides/lit-webpack.md )
- [Alpine.js + Vite ](docs/ru/guides/alpine-vite.md )
- [Alpine.js + Webpack ](docs/ru/guides/alpine-webpack.md )
2026-07-14 16:11:39 +03:00
- [Next.js App Router + Turbopack ](docs/ru/guides/next-app-turbopack.md )
- [Next.js App Router + Webpack ](docs/ru/guides/next-app-webpack.md )
- [Next.js Pages Router + Turbopack ](docs/ru/guides/next-pages-turbopack.md )
- [Next.js Pages Router + Webpack ](docs/ru/guides/next-pages-webpack.md )
2026-07-11 23:20:39 +03:00
### Технические материалы
2026-07-14 16:11:39 +03:00
- [Индекс документации ](docs/ru/README.md )
2026-07-15 12:27:46 +03:00
- [Конфигурация ](docs/ru/configuration.md )
2026-07-14 16:11:39 +03:00
- [Технический справочник ](docs/ru/reference/technical.md )
- [Программный API ](docs/ru/reference/programmatic-api.md )
2026-07-11 09:26:43 +03:00
## Лицензия
MIT