2026-04-22 16:54:35 +03:00
|
|
|
|
# @gromlab/svg-sprites
|
2026-04-22 19:14:37 +03:00
|
|
|
|
|
|
|
|
|
|
 
|
|
|
|
|
|
|
2026-04-22 18:54:01 +03:00
|
|
|
|
Генерация SVG-спрайтов из папок с иконками. TypeScript-типизация, SVG-трансформации, React-компонент и HTML-превью из коробки.
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
2026-04-22 18:54:01 +03:00
|
|
|
|

|
2026-04-22 18:31:12 +03:00
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
**Чем отличается от аналогов:**
|
|
|
|
|
|
|
|
|
|
|
|
- Генерирует готовый типизированный React-компонент — не нужно писать обёртку
|
|
|
|
|
|
- Автоматически заменяет цвета на CSS-переменные — для тем и hover-состояний
|
|
|
|
|
|
- Выдаёт HTML-превью всех иконок — удобно пересылать дизайнеру
|
|
|
|
|
|
|
|
|
|
|
|
## Требования
|
|
|
|
|
|
|
|
|
|
|
|
- Node.js 18+
|
|
|
|
|
|
- React 18+ (опционально, только если нужен генерируемый компонент)
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
|
|
|
|
|
## Установка
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npm install @gromlab/svg-sprites
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Быстрый старт
|
|
|
|
|
|
|
|
|
|
|
|
Создайте файл `svg-sprites.config.ts` в корне проекта:
|
|
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
import { defineConfig } from '@gromlab/svg-sprites'
|
|
|
|
|
|
|
|
|
|
|
|
export default defineConfig({
|
2026-04-22 18:54:01 +03:00
|
|
|
|
// Папка для сгенерированных SVG-спрайтов
|
|
|
|
|
|
output: 'public/sprites',
|
|
|
|
|
|
|
|
|
|
|
|
// URL-путь к спрайтам (для href в React-компоненте)
|
2026-04-22 19:14:37 +03:00
|
|
|
|
publicPath: '/sprites',
|
2026-04-22 18:54:01 +03:00
|
|
|
|
|
|
|
|
|
|
// Папка для React-компонента и типов
|
2026-04-22 16:54:35 +03:00
|
|
|
|
react: 'src/shared/ui/svg-sprite',
|
|
|
|
|
|
|
|
|
|
|
|
sprites: [
|
|
|
|
|
|
{ name: 'icons', input: 'src/assets/icons' },
|
|
|
|
|
|
{ name: 'logos', input: 'src/assets/logos' },
|
|
|
|
|
|
],
|
|
|
|
|
|
})
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Запустите генерацию:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-04-22 19:14:37 +03:00
|
|
|
|
# или добавьте "sprite": "svg-sprites" в scripts вашего package.json
|
2026-04-22 16:54:35 +03:00
|
|
|
|
npx svg-sprites
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
В результате будут сгенерированы SVG-спрайты, типизированный React-компонент и HTML-превью.
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
Цвета иконок автоматически заменяются на CSS-переменные — см. раздел [Управление цветом](#управление-цветом).
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
|
|
|
|
|
## Использование компонента
|
|
|
|
|
|
|
|
|
|
|
|
```tsx
|
|
|
|
|
|
import { SvgSprite } from './shared/ui/svg-sprite'
|
|
|
|
|
|
|
|
|
|
|
|
// Иконка из первого спрайта (по умолчанию)
|
|
|
|
|
|
<SvgSprite icon="check" />
|
|
|
|
|
|
|
|
|
|
|
|
// Иконка из другого спрайта
|
|
|
|
|
|
<SvgSprite icon="github" sprite="logos" />
|
|
|
|
|
|
|
|
|
|
|
|
// Обёртка в <span> (удобно для inline-элементов)
|
|
|
|
|
|
<SvgSprite icon="arrow-left" wrapped />
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
Компонент полностью типизирован — автодополнение работает для имён иконок и спрайтов. Типы экспортируются из того же модуля:
|
|
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
import type {
|
|
|
|
|
|
IconsIconName, // 'check' | 'arrow-left' | ...
|
|
|
|
|
|
LogosIconName, // 'github' | 'twitter' | ...
|
|
|
|
|
|
SpriteName, // 'icons' | 'logos'
|
|
|
|
|
|
SpriteMap, // { icons: IconsIconName, logos: LogosIconName }
|
|
|
|
|
|
} from './shared/ui/svg-sprite'
|
|
|
|
|
|
```
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
|
|
|
|
|
## Управление цветом
|
|
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
При сборке цвета иконок заменяются на CSS-переменные. Это ключевая фича — иконки адаптируются к теме без дублирования SVG.
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
|
|
|
|
|
**Моно-иконка** (один цвет) — наследует `color` текста:
|
|
|
|
|
|
|
|
|
|
|
|
```css
|
|
|
|
|
|
.button { color: red; }
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Или точечно через CSS-переменную:
|
|
|
|
|
|
|
|
|
|
|
|
```css
|
|
|
|
|
|
.button { --icon-color-1: #ff0000; }
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**Мульти-иконка** (несколько цветов) — каждый цвет задаётся отдельной переменной:
|
|
|
|
|
|
|
|
|
|
|
|
```css
|
|
|
|
|
|
.card {
|
|
|
|
|
|
--icon-color-1: #ff0000;
|
|
|
|
|
|
--icon-color-2: #00ff00;
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
## Способы рендера
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
| Способ | Управление цветом | Пример |
|
|
|
|
|
|
|--------|-------------------|--------|
|
|
|
|
|
|
| React / SVG `<use>` | CSS-переменные, `color` | `<SvgSprite icon="check" />` |
|
|
|
|
|
|
| CSS `mask-image` | `background-color` (монохром) | `.icon { mask: url(...); background-color: red; }` |
|
|
|
|
|
|
| `<img>` | нет | `<img src="icons.sprite.svg#check">` |
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
## Конфигурация
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
### Основные опции
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
| Опция | Обязательная | Описание |
|
|
|
|
|
|
|-------|-------------|----------|
|
|
|
|
|
|
| `output` | да | Папка для сгенерированных SVG-спрайтов |
|
|
|
|
|
|
| `sprites` | да | Массив спрайтов для генерации |
|
|
|
|
|
|
| `publicPath` | нет | URL-путь к спрайтам (для `href` в React-компоненте) |
|
|
|
|
|
|
| `react` | нет | Путь для генерации React-компонента и типов |
|
|
|
|
|
|
| `preview` | нет | Генерация HTML-превью (по умолчанию: `true`) |
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
### `sprites`
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
sprites: [
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'icons', // имя спрайта → icons.sprite.svg
|
|
|
|
|
|
input: 'src/assets/icons', // папка с SVG-файлами
|
|
|
|
|
|
mode: 'stack', // 'stack' (по умолчанию) или 'symbol'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
name: 'flags',
|
|
|
|
|
|
input: [ // или массив конкретных файлов
|
|
|
|
|
|
'src/components/button/arrow.svg',
|
|
|
|
|
|
'src/components/modal/close.svg',
|
|
|
|
|
|
],
|
|
|
|
|
|
},
|
|
|
|
|
|
]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### `publicPath`
|
|
|
|
|
|
|
|
|
|
|
|
Публичный URL-путь к спрайтам. Зашивается в React-компонент для формирования `href`.
|
|
|
|
|
|
|
|
|
|
|
|
```ts
|
2026-04-22 19:14:37 +03:00
|
|
|
|
publicPath: '/sprites'
|
|
|
|
|
|
// → <use href="/sprites/icons.sprite.svg#check" />
|
2026-04-22 16:54:35 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
> **Примечание:** путь не должен включать имя папки `public` — она не входит в URL в Vite/Next.
|
|
|
|
|
|
|
2026-04-22 16:54:35 +03:00
|
|
|
|
### `react`
|
|
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
Имена файлов берутся из названия папки:
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
react: 'src/shared/ui/svg-sprite'
|
|
|
|
|
|
// → svg-sprite.tsx + svg-sprite.module.css
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Если не задан — компонент и типы не генерируются.
|
|
|
|
|
|
|
|
|
|
|
|
### `transform`
|
|
|
|
|
|
|
|
|
|
|
|
Настройки трансформации SVG. Все опции включены по умолчанию.
|
|
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
transform: {
|
|
|
|
|
|
removeSize: true, // удаляет width/height с <svg>
|
|
|
|
|
|
replaceColors: true, // заменяет цвета на CSS-переменные
|
|
|
|
|
|
addTransition: true, // добавляет transition к элементам с цветом
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Например, для спрайта с фиксированными цветами:
|
|
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
transform: {
|
|
|
|
|
|
replaceColors: false,
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
## Ограничения
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
2026-04-22 19:14:37 +03:00
|
|
|
|
- `mode: 'symbol'` — поддерживается, но превью и примеры кода оптимизированы под `stack`
|
|
|
|
|
|
- `replaceColors` может некорректно обработать иконки со сложными градиентами — используйте `transform: { replaceColors: false }` для таких случаев
|
|
|
|
|
|
- Генерируемый React-компонент предназначен для React 18+. Для Vue/Svelte используйте спрайты напрямую через SVG `<use>`
|
2026-04-22 16:54:35 +03:00
|
|
|
|
|
|
|
|
|
|
## Программный API
|
|
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
import { generate, defineConfig } from '@gromlab/svg-sprites'
|
|
|
|
|
|
|
|
|
|
|
|
const config = defineConfig({
|
|
|
|
|
|
output: 'public',
|
|
|
|
|
|
sprites: [{ name: 'icons', input: 'assets/icons' }],
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
const results = await generate(config)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Лицензия
|
|
|
|
|
|
|
|
|
|
|
|
MIT
|