From 44afec7cdbab60d0d73fcacde3658dc552b25745 Mon Sep 17 00:00:00 2001 From: "S.Gromov" Date: Wed, 15 Jul 2026 12:27:46 +0300 Subject: [PATCH] sync --- README_RU.md | 79 ++--- docs/ru/README.md | 7 +- docs/ru/configuration.md | 99 ++++++ docs/ru/guides/AGENTS.md | 78 +++++ docs/ru/guides/next-app-turbopack.md | 145 +++------ docs/ru/guides/next-app-webpack.md | 145 +++------ docs/ru/guides/next-pages-turbopack.md | 138 +++------ docs/ru/guides/next-pages-webpack.md | 138 +++------ docs/ru/guides/react-vite.md | 160 ++++------ docs/ru/guides/react-webpack.md | 165 +++++----- docs/ru/guides/standalone-vite.md | 155 ++++----- docs/ru/guides/standalone-webpack.md | 142 ++++----- docs/ru/next-app.md | 4 - docs/ru/next-pages.md | 4 - docs/ru/programmatic-api.md | 3 - docs/ru/react-vite.md | 3 - docs/ru/react-webpack.md | 3 - docs/ru/reference.md | 3 - docs/ru/reference/programmatic-api.md | 31 +- docs/ru/reference/technical.md | 36 ++- skills/README.md | 24 +- skills/svg-sprites/build.mjs | 8 +- skills/svg-sprites/skill.config.mjs | 33 +- skills/svg-sprites/src/ru/SKILL.md | 293 +++++++++++++++++- .../src/ru/core/00-package-overview.md | 16 - .../src/ru/core/10-mode-selection.md | 30 -- .../src/ru/core/20-project-inspection.md | 22 -- .../src/ru/core/30-react-next-setup.md | 63 ---- .../src/ru/core/40-generated-contract.md | 51 --- .../src/ru/core/50-usage-and-colors.md | 87 ------ .../src/ru/core/60-verification.md | 15 - .../svg-sprites/src/ru/core/70-diagnostics.md | 24 -- .../src/ru/references/complex-svg.md | 2 +- .../src/ru/references/programmatic-api.md | 46 --- test/documentation-guides.test.mjs | 28 +- 35 files changed, 1056 insertions(+), 1224 deletions(-) create mode 100644 docs/ru/configuration.md create mode 100644 docs/ru/guides/AGENTS.md delete mode 100644 docs/ru/next-app.md delete mode 100644 docs/ru/next-pages.md delete mode 100644 docs/ru/programmatic-api.md delete mode 100644 docs/ru/react-vite.md delete mode 100644 docs/ru/react-webpack.md delete mode 100644 docs/ru/reference.md delete mode 100644 skills/svg-sprites/src/ru/core/00-package-overview.md delete mode 100644 skills/svg-sprites/src/ru/core/10-mode-selection.md delete mode 100644 skills/svg-sprites/src/ru/core/20-project-inspection.md delete mode 100644 skills/svg-sprites/src/ru/core/30-react-next-setup.md delete mode 100644 skills/svg-sprites/src/ru/core/40-generated-contract.md delete mode 100644 skills/svg-sprites/src/ru/core/50-usage-and-colors.md delete mode 100644 skills/svg-sprites/src/ru/core/60-verification.md delete mode 100644 skills/svg-sprites/src/ru/core/70-diagnostics.md delete mode 100644 skills/svg-sprites/src/ru/references/programmatic-api.md diff --git a/README_RU.md b/README_RU.md index a41fcdc..0fe049f 100644 --- a/README_RU.md +++ b/README_RU.md @@ -1,6 +1,6 @@ # @gromlab/svg-sprites -[πŸ‡¬πŸ‡§ English](README.md) | πŸ‡·πŸ‡Ί Русский +[πŸ‡¬πŸ‡§ English](https://github.com/gromlab-ru/svg-sprites/blob/master/README.md) | πŸ‡·πŸ‡Ί Русский ![npm](https://img.shields.io/npm/v/@gromlab/svg-sprites) ![license](https://img.shields.io/npm/l/@gromlab/svg-sprites) @@ -24,20 +24,6 @@ Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ приходится Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со спрайтом Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ. Π’Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΅Π³ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ SVG-ΠΈΠΊΠΎΠ½ΠΊΡƒ, Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Π°Π²Ρ‚ΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡ‚ ΠΈ TypeScript-ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ всСх ΠΈΠΌΡ‘Π½. -Π’ `standalone@vite` ΠΈ `standalone@webpack` Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ доступСн Π±Π΅Π· React: - -```ts -import { defineAppIconElement } from './app-icons' - -defineAppIconElement() -``` - -```html - -``` - -Bare `standalone` остаётся ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ SVG asset ΠΈ JSON manifest Π±Π΅Π· JavaScript runtime. - ## AI-friendly ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ `@gromlab/svg-sprites` сразу рассчитан Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с AI-Π°Π³Π΅Π½Ρ‚Π°ΠΌΠΈ. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ skill ΠΈ ΠΏΠΎΡ€ΡƒΡ‡ΠΈΡ‚Π΅ Π°Π³Π΅Π½Ρ‚Ρƒ настройку, ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ ΠΈΠ»ΠΈ диагностику Π±Π΅Π· Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… инструкций ΠΈ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ изучСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. @@ -46,61 +32,54 @@ Bare `standalone` остаётся ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ [πŸ‡¬πŸ‡§ Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ AI skill (Π½Π° английском)](https://github.com/gromlab-ru/svg-sprites/releases/latest/download/svg-sprites.zip) -## ΠžΡ‚ SVG Π΄ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π·Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ шага +## ΠžΡ‚ SVG Π΄ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π·Π° Ρ‚Ρ€ΠΈ шага Основной ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Next.js App Router ΠΈ Turbopack. -### 1. Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π±Π΅Π· установки ΠΏΠ°ΠΊΠ΅Ρ‚Π° +### 1. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΈΠΊΠΎΠ½ΠΊΠΈ -```bash -npx --yes --package=@gromlab/svg-sprites@latest svg-sprites --help -``` - -`npx` Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ скачиваСт CLI, Π½Π΅ добавляСт `@gromlab/svg-sprites` Π² -`package.json`, Π° generated production runtime Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ package. - -### 2. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΈΠΊΠΎΠ½ΠΊΠΈ - -SVG ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ структурС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ°ΠΏΠΊΠΈ для исходных ΠΈΠΊΠΎΠ½ΠΎΠΊ ΠΈ спрайта: ```text -src/ -β”œβ”€β”€ assets/icons/ -β”‚ β”œβ”€β”€ search.svg -β”‚ └── settings.svg -β”œβ”€β”€ features/profile/ -β”‚ └── user.svg -└── ui/app-icons/ - └── svg-sprite.config.ts +assets/ +β”œβ”€β”€ app-icons/ +β”‚ └── svg-sprite.config.json +└── svg-icons/ + β”œβ”€β”€ search.svg + └── settings.svg ``` Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ спрайта: -```ts -// src/ui/app-icons/svg-sprite.config.ts -export default { - mode: 'next@app/turbopack', - name: 'app', - input: [ - '../../assets/icons/search.svg', - '../../assets/icons/settings.svg', - '../../features/profile/user.svg', - ], +```json +{ + "mode": "next@app/turbopack", + "name": "app", + "input": "../svg-icons/**/*.svg" } ``` -### 3. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ +`input` ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡƒΡ‚ΠΈ ΠΊ ΠΏΠ°ΠΏΠΊΠ°ΠΌ, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ SVG ΠΈ glob-ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹. + +### 2. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ```json { "scripts": { - "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/ui/app-icons/svg-sprite.config.ts", + "sprites": "npx --yes @gromlab/svg-sprites assets/app-icons/svg-sprite.config.json", "predev": "npm run sprites", "prebuild": "npm run sprites" } } ``` +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° для сгСнСрированного API: + +```ts +// assets/app-icons/index.ts +export * from './.svg-sprite/index.js' +``` + ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ запуск: ```bash @@ -109,10 +88,11 @@ npm run sprites ΠŸΠ°ΠΊΠ΅Ρ‚ создаст `AppIcon`, TypeScript-Ρ‚ΠΈΠΏΡ‹ ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ SVG-спрайт. -### 4. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΈΠΊΠΎΠ½ΠΊΡƒ +### 3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΈΠΊΠΎΠ½ΠΊΡƒ ```tsx -import { AppIcon } from '@/ui/app-icons' +// app/page.tsx +import { AppIcon } from '../assets/app-icons' export default function SearchButton() { return ( @@ -277,6 +257,7 @@ README Π·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ с возмоТностями ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΠΏΠΎΠΊΠ° ### ВСхничСскиС ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ - [ИндСкс Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ](docs/ru/README.md) +- [ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ](docs/ru/configuration.md) - [ВСхничСский справочник](docs/ru/reference/technical.md) - [ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ API](docs/ru/reference/programmatic-api.md) diff --git a/docs/ru/README.md b/docs/ru/README.md index e226abb..c68ddf5 100644 --- a/docs/ru/README.md +++ b/docs/ru/README.md @@ -3,6 +3,8 @@ Для настройки Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ guide ΠΎΠ΄Π½ΠΎΠ³ΠΎ exact mode. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ guide являСтся ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² AI skills. +ΠžΠ±Ρ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ JSON, JavaScript ΠΈ TypeScript config-Ρ„Π°ΠΉΠ»ΠΎΠ² описан Π² [руководствС ΠΏΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ](configuration.md). + ## Π“Π°ΠΉΠ΄Ρ‹ быстрого старта | ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ | Exact mode | Guide | @@ -20,10 +22,11 @@ ВсС guides ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ порядок: 1. ГСнСрация спрайта Ρ‡Π΅Ρ€Π΅Π· `npx` Π±Π΅Π· добавлСния package Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. -2. ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Viewer для Π΄Π΅Π±Π°Π³Π° ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ. -3. ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ типизация ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° Ρ‡Π΅Ρ€Π΅Π· package ΠΈΠ»ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ copy-paste type. +2. ИспользованиС спрайта Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. +3. ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Viewer для Π΄Π΅Π±Π°Π³Π° ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ. ## Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊΠΈ +- [ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ](configuration.md) - [ВСхничСский справочник](reference/technical.md) - [ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ API](reference/programmatic-api.md) diff --git a/docs/ru/configuration.md b/docs/ru/configuration.md new file mode 100644 index 0000000..2a16704 --- /dev/null +++ b/docs/ru/configuration.md @@ -0,0 +1,99 @@ +# ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ + +ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ config-Ρ„Π°ΠΉΠ» описываСт ΠΎΠ΄ΠΈΠ½ нСзависимый спрайт. CLI Π½Π΅ ΠΈΡ‰Π΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ автоматичСски, поэтому всСгда ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ явно: + +```bash +npx --yes @gromlab/svg-sprites path/to/svg-sprite.config.json +``` + +## JSON + +JSON ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ локальной установки ΠΏΠ°ΠΊΠ΅Ρ‚Π°: + +```json +{ + "mode": "next@app/turbopack", + "name": "app", + "description": "ΠžΠ±Ρ‰ΠΈΠ΅ ΠΈΠΊΠΎΠ½ΠΊΠΈ прилоТСния", + "input": [ + "./icons", + "../../assets/icons/**/*.svg", + "!../../assets/icons/deprecated-*.svg" + ], + "transform": { + "removeSize": true, + "replaceColors": true, + "addTransition": true + }, + "generatedNotice": true +} +``` + +| ПолС | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ | НазначСниС | +|---|---|---| +| `mode` | НСт | Exact mode, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ framework ΠΈ сборщику | +| `name` | Kebab-case ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° модуля; для `svg-sprite` ΠΈ `svg-sprites` β€” ΠΈΠΌΠ΅Π½ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° | Имя спрайта; Π² modes с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Ρ‘Ρ‚ имя ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΈ Ρ‚ΠΈΠΏΠΎΠ² | +| `description` | НСт | ОписаниС для Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Viewer | +| `input` | `./icons` | ΠšΠ°Ρ‚Π°Π»ΠΎΠ³, SVG-Ρ„Π°ΠΉΠ», glob-шаблон ΠΈΠ»ΠΈ массив источников | +| `transform` | ВсС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ | Настройки ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ SVG | +| `generatedNotice` | `true` | Π’ΠΈΠ΄ прСдупрСТдСния Π² generated-Ρ„Π°ΠΉΠ»Π°Ρ… | + +ΠŸΡƒΡ‚ΠΈ ΠΈ glob-ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Π² `input` ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° config-Ρ„Π°ΠΉΠ»Π°. ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ с прСфиксом `!` ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ совпадСния. + +## JavaScript + +JavaScript-ΠΊΠΎΠ½Ρ„ΠΈΠ³ экспортируСт ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: + +```js +export default { + mode: 'react@vite', + name: 'icons', + input: './icons', +} +``` + +ΠŸΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ CLI ΠΏΡƒΡ‚ΡŒ ΠΊ `.js`-Ρ„Π°ΠΉΠ»Ρƒ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΊ JSON: + +```bash +npx --yes @gromlab/svg-sprites path/to/svg-sprite.config.js +``` + +## TypeScript + +Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° TypeScript установитС ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΊΠ°ΠΊ dev dependency: + +```bash +npm install --save-dev @gromlab/svg-sprites +``` + +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `defineSpriteConfig`: + +```ts +import { defineSpriteConfig } from '@gromlab/svg-sprites' + +export default defineSpriteConfig({ + mode: 'react@vite', + name: 'icons', + input: './icons', +}) +``` + +Или ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ `satisfies` с type-only ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠΌ: + +```ts +import type { SpriteConfig } from '@gromlab/svg-sprites' + +export default { + mode: 'react@vite', + name: 'icons', + input: './icons', +} satisfies SpriteConfig +``` + +CLI Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ `.ts`-ΠΊΠΎΠ½Ρ„ΠΈΠ³ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ: + +```bash +npx --yes @gromlab/svg-sprites path/to/svg-sprite.config.ts +``` + +ΠŸΠΎΠ»Π½Ρ‹ΠΉ список modes, CLI-Ρ„Π»Π°Π³ΠΎΠ², ΠΏΡ€Π°Π²ΠΈΠ» имСнования ΠΈ transform-ΠΎΠΏΡ†ΠΈΠΉ находится Π² [тСхничСском справочникС](reference/technical.md). diff --git a/docs/ru/guides/AGENTS.md b/docs/ru/guides/AGENTS.md new file mode 100644 index 0000000..472147f --- /dev/null +++ b/docs/ru/guides/AGENTS.md @@ -0,0 +1,78 @@ +# ΠŸΡ€Π°Π²ΠΈΠ»Π° Π³Π°ΠΉΠ΄ΠΎΠ² быстрого старта + +## ЦСль + +Π“Π°ΠΉΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ SVG-спрайт ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² своём ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. + +Π‘ΠΏΡ€Π°ΠΉΡ‚ являСтся Π³Π»Π°Π²Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сгСнСрированныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ срСдства Π΅Π³ΠΎ использования. + +## ΠžΠ±Π»Π°ΡΡ‚ΡŒ Π³Π°ΠΉΠ΄Π° + +ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π³Π°ΠΉΠ΄ посвящён ΠΎΠ΄Π½ΠΎΠΌΡƒ exact mode. + +Π’ Π³Π°ΠΉΠ΄ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ дСйствия ΠΈ особСнности, относящиСся ΠΊ этому mode. НСльзя ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… сборщиков, Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² ΠΈΠ»ΠΈ modes. + +ВсС тСхничСскиС утвСрТдСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΏΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ adapter. + +## Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° + +Π“Π°ΠΉΠ΄ состоит ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… основных частСй: + +1. ГСнСрация спрайта. +2. ИспользованиС спрайта. +3. Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ Ρ‡Π΅Ρ€Π΅Π· Viewer. + +ΠŸΠ΅Ρ€Π²Π°Ρ строка послС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это инструкция ΠΏΠΎ быстрому созданию SVG-спрайта ΠΈ для ΠΊΠ°ΠΊΠΎΠ³ΠΎ прилоТСния ΠΎΠ½Π° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π°. + +## ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ + +ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π³Π°ΠΉΠ΄Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сцСнарий. + +ΠŸΡƒΡ‚ΠΈ, ΠΈΠΌΠ΅Π½Π°, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹ ΠΈ названия сгСнСрированных API Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ ΠΈ фактичСскому Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ. + +Π’ΠΎ всСх Π³Π°ΠΉΠ΄Π°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ согласованныС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹: + +- исходныС SVG находятся Π² `assets/svg-icons`; +- спрайт создаётся Π² `assets/app-icons`; +- ΠΊΠΎΠ½Ρ„ΠΈΠ³ записываСтся Π² JSON; +- имя спрайта Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ β€” `app`. + +## Зависимости + +Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ явно ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ прСимущСство: для создания ΠΈ использования спрайта ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π΅ трСбуСтся Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² зависимости ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. + +Viewer описываСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ°ΠΊ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Установка ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° допускаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Viewer ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ способом, подходящим Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ mode. + +## Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ + +Π“Π°ΠΉΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΏΡƒΡ‚ΡŒ: + +- структуру ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°; +- ΠΊΠΎΠ½Ρ„ΠΈΠ³; +- ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ; +- Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄ запуском ΠΈ сборкой, Ссли ΠΎΠ½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°; +- ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠΊΠΎΠ½ΠΊΠΈ; +- Π±Π°Π·ΠΎΠ²ΡƒΡŽ настройку Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ Ρ†Π²Π΅Ρ‚ΠΎΠ²; +- ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Viewer. + +ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ mode Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π±Π΅Π· Π½ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. + +## ВСхничСский ΡˆΡƒΠΌ + +НС Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ устройство Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°, сгСнСрированных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ сборщика. + +НС Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ API, Ρ€Π΅Π΄ΠΊΠΈΠ΅ сцСнарии ΠΈ ограничСния, Π½Π΅ относящиСся ΠΊ быстрому старту. + +ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² reference-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. + +## Π‘Ρ‚ΠΈΠ»ΡŒ + +ΠŸΠΈΡΠ°Ρ‚ΡŒ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π° Π½Π΅ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. + +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅, прямыС ΠΈ практичСскиС Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ. + +Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΈΠ»ΠΈ Ρ†Π΅Π»ΡŒ шага, Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ дСйствиС. + +НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ΄Ρƒ, Ρ€Π΅ΠΊΠ»Π°ΠΌΠ½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ тСхничСскиС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ. + +НС Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ с пСрСчислСния сгСнСрированных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ особСнностСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. diff --git a/docs/ru/guides/next-app-turbopack.md b/docs/ru/guides/next-app-turbopack.md index b56f876..12d8d66 100644 --- a/docs/ru/guides/next-app-turbopack.md +++ b/docs/ru/guides/next-app-turbopack.md @@ -1,153 +1,108 @@ -# Next.js App Router с Turbopack +# SVG-спрайт для Next.js App Router с Turbopack -Π­Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ quick start для exact mode key `next@app/turbopack`: generated `IconsIcon` совмСстим с Server Components ΠΈ asset pipeline Turbopack. +Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎ быстрому созданию SVG-спрайта Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Next.js с App Router ΠΈ Turbopack. -## 1. ГСнСрация спрайта +## ГСнСрация спрайта -Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство: Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² `package.json`. `npx` Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ скачиваСт CLI, Π° generated production runtime Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `@gromlab/svg-sprites`. +Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ для спрайта. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `assets/app-icons`, Π° исходныС SVG находятся Π² `assets/svg-icons`. -```text -src/sprite/ -β”œβ”€β”€ icons/ -β”‚ β”œβ”€β”€ check.svg -β”‚ └── warning.svg -β”œβ”€β”€ index.ts -└── svg-sprite.config.ts -``` +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ `assets/app-icons/svg-sprite.config.json`: -ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ plain config: - -```ts -export default { - mode: 'next@app/turbopack', - name: 'icons', +```json +{ + "mode": "next@app/turbopack", + "name": "app", + "input": "../svg-icons/**/*.svg" } ``` -Если `input` Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, SVG Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ· `./icons` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°. ΠšΠΎΠ½Ρ„ΠΈΠ³ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ `.ts`, `.js` с `default export` ΠΈΠ»ΠΈ `.json`. +ΠŸΡƒΡ‚ΡŒ Π² `input` считаСтся ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠΈ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ. -```bash -npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts -``` - -Π’ CI зафиксируйтС Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `@gromlab/svg-sprites@1.1.5`. Mode ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Next Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ bundler: +Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² `package.json`. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈΠ· Git, поэтому `predev` ΠΈ `prebuild` ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ спрайт ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ запуском ΠΈ сборкой: ```json { "scripts": { - "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts", - "dev": "npm run sprites && next dev --turbopack", - "build": "npm run sprites && next build --turbopack", - "start": "next start", - "typecheck": "npm run sprites && tsc --noEmit" + "sprites": "npx --yes @gromlab/svg-sprites assets/app-icons/svg-sprite.config.json", + "predev": "npm run sprites", + "dev": "next dev --turbopack", + "prebuild": "npm run sprites", + "build": "next build --turbopack" } } ``` -НС добавляйтС ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ `predev`/`prebuild` ΠΈ явный `npm run sprites`. Generated `.svg-sprite` Π½Π΅ коммитится. Generated Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ `.gitignore`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Git ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Π•Π³ΠΎ `.d.ts` self-contained ΠΈ Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ generator package. +## ИспользованиС спрайта + +Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `name: "app"` создаёт React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `AppIcon`. + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° `assets/app-icons/index.ts`: ```ts -// src/sprite/index.ts export * from './.svg-sprite/index.js' ``` -Generated icon Π½Π΅ содСрТит `'use client'`, поэтому Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ прямо Π² Server Component: +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² Server Component: ```tsx // app/page.tsx -import { IconsIcon, iconsIconNames } from '../src/sprite' +import { AppIcon } from '../assets/app-icons' export default function Page() { return ( -
- - {iconsIconNames.length} ΠΈΠΊΠΎΠ½ΠΎΠΊ -
+ ) } ``` -Turbopack ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ generated `new URL('../sprite.svg', import.meta.url).href` ΠΈ выпускаСт внСшний hashed asset. НС добавляйтС Client Component boundary Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π΄ΠΈ `IconsIcon`. +Для `AppIcon` Π½Π΅ Π½ΡƒΠΆΠ΅Π½ `'use client'`. Turbopack сам добавляСт `sprite.svg` Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ сборку, поэтому ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² `public` Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. -## 2. Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ +## Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ -Viewer нСобязатСлСн ΠΈ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для debug/preview: +Viewer ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС ΠΈΠΊΠΎΠ½ΠΊΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС, позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ связанныС CSS-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Он Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ устанавливаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ: ```bash npm install --save-dev @gromlab/svg-sprites ``` -Viewer ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π΅Π½, поэтому создайтС для Π½Π΅Π³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Client Component: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Client Component `app/svg-sprite/SvgSpriteViewer.tsx`: ```tsx -// app/icons-debug/sprite-viewer.tsx 'use client' import { SpriteViewer } from '@gromlab/svg-sprites/react' const sources = [ - () => import('../../src/sprite/.svg-sprite/svg-sprite.manifest.js'), + () => import('../../assets/app-icons/.svg-sprite/svg-sprite.manifest.js'), ] as const -export function AppSpriteViewer() { +export function SvgSpriteViewer() { return } ``` -Server page ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эту boundary: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ `app/svg-sprite/page.tsx`: ```tsx -// app/icons-debug/page.tsx -import { AppSpriteViewer } from './sprite-viewer' +import { notFound } from 'next/navigation' -export default function IconsDebugPage() { - return +import { SvgSpriteViewer } from './SvgSpriteViewer' + +export default function SvgSpritePage() { + if (process.env.NODE_ENV !== 'development') notFound() + + return } ``` -Viewer Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² production icon runtime ΠΈ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ страницам с `IconsIcon`. - -## 3. Випизация ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° - -ПослС локальной установки package ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ helper: - -```ts -import { defineSpriteConfig } from '@gromlab/svg-sprites' - -export default defineSpriteConfig({ - mode: 'next@app/turbopack', - name: 'icons', -}) -``` - -Π’ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ ΠΈ type-only import `SpriteConfig` с `satisfies SpriteConfig`. - -Π‘Π΅Π· package Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ type Π² config: - -```ts -type LocalSpriteConfig = { - mode: 'next@app/turbopack' - name?: string - description?: string - input?: string | string[] - transform?: { - removeSize?: boolean - replaceColors?: boolean - addTransition?: boolean - } - generatedNotice?: boolean -} - -export default { - mode: 'next@app/turbopack', - name: 'icons', -} satisfies LocalSpriteConfig -``` - -Exact literal Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΎΡ‚ смСшивания App Router ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… bundler contracts. +ЗапуститС `npm run dev` ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ `/svg-sprite`. Π’ production ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ Π²Π΅Ρ€Π½Ρ‘Ρ‚ 404. diff --git a/docs/ru/guides/next-app-webpack.md b/docs/ru/guides/next-app-webpack.md index 40d10b0..493f202 100644 --- a/docs/ru/guides/next-app-webpack.md +++ b/docs/ru/guides/next-app-webpack.md @@ -1,151 +1,108 @@ -# Next.js App Router с Webpack +# SVG-спрайт для Next.js App Router с Webpack -Π­Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ quick start для exact mode key `next@app/webpack`: generated `IconsIcon` совмСстим с Server Components ΠΈ Webpack pipeline Next.js. +Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎ быстрому созданию SVG-спрайта Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Next.js с App Router ΠΈ Webpack. -## 1. ГСнСрация спрайта +## ГСнСрация спрайта -Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство: Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² `package.json`. `npx` Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ скачиваСт CLI, Π° generated production runtime Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `@gromlab/svg-sprites`. +Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ для спрайта. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `assets/app-icons`, Π° исходныС SVG находятся Π² `assets/svg-icons`. -```text -src/sprite/ -β”œβ”€β”€ icons/ -β”‚ β”œβ”€β”€ check.svg -β”‚ └── warning.svg -β”œβ”€β”€ index.ts -└── svg-sprite.config.ts -``` +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ `assets/app-icons/svg-sprite.config.json`: -ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ plain config: - -```ts -export default { - mode: 'next@app/webpack', - name: 'icons', +```json +{ + "mode": "next@app/webpack", + "name": "app", + "input": "../svg-icons/**/*.svg" } ``` -Если `input` Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, SVG Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ· `./icons` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°. Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ `.js` с `default export` ΠΈ `.json`. +ΠŸΡƒΡ‚ΡŒ Π² `input` считаСтся ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠΈ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ. -```bash -npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts -``` - -Π’ CI Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ `latest` Ρ‚ΠΎΡ‡Π½ΠΎΠΉ вСрсиСй, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `@gromlab/svg-sprites@1.1.5`. Exact Next commands для этого mode: +Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² `package.json`. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈΠ· Git, поэтому `predev` ΠΈ `prebuild` ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ спрайт ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ запуском ΠΈ сборкой: ```json { "scripts": { - "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts", - "dev": "npm run sprites && next dev --webpack", - "build": "npm run sprites && next build --webpack", - "start": "next start", - "typecheck": "npm run sprites && tsc --noEmit" + "sprites": "npx --yes @gromlab/svg-sprites assets/app-icons/svg-sprite.config.json", + "predev": "npm run sprites", + "dev": "next dev --webpack", + "prebuild": "npm run sprites", + "build": "next build --webpack" } } ``` -НС сочСтайтС явный `npm run sprites` с `predev` ΠΈΠ»ΠΈ `prebuild`. `.svg-sprite` generated ΠΈ Π½Π΅ коммитится. Generated Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ `.gitignore`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Git ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Generated declarations self-contained ΠΈ Π½Π΅ зависят ΠΎΡ‚ `@gromlab/svg-sprites`. +## ИспользованиС спрайта + +Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `name: "app"` создаёт React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `AppIcon`. + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° `assets/app-icons/index.ts`: ```ts -// src/sprite/index.ts export * from './.svg-sprite/index.js' ``` -Production usage Π² Server Component: +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² Server Component: ```tsx // app/page.tsx -import { IconsIcon, iconsIconNames } from '../src/sprite' +import { AppIcon } from '../assets/app-icons' export default function Page() { return ( -
- - {iconsIconNames.length} ΠΈΠΊΠΎΠ½ΠΎΠΊ -
+ ) } ``` -Generated component Π½Π΅ содСрТит `'use client'`. Next Webpack ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ `new URL('../sprite.svg', import.meta.url).href` ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ SVG asset; Π½Π΅ пСрСписывайтС этот URL ΠΈ Π½Π΅ пСрСноситС sprite Π² `public` Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. +Для `AppIcon` Π½Π΅ Π½ΡƒΠΆΠ΅Π½ `'use client'`. Next.js сам добавляСт `sprite.svg` Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ сборку, поэтому ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² `public` Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. -## 2. Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ +## Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ -Viewer нСобязатСлСн. Для debug/preview установитС package: +Viewer ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС ΠΈΠΊΠΎΠ½ΠΊΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС, позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ связанныС CSS-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Он Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ устанавливаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ: ```bash npm install --save-dev @gromlab/svg-sprites ``` -App Router Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Client Component boundary для Viewer: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Client Component `app/svg-sprite/SvgSpriteViewer.tsx`: ```tsx -// app/icons-debug/sprite-viewer.tsx 'use client' import { SpriteViewer } from '@gromlab/svg-sprites/react' const sources = [ - () => import('../../src/sprite/.svg-sprite/svg-sprite.manifest.js'), + () => import('../../assets/app-icons/.svg-sprite/svg-sprite.manifest.js'), ] as const -export function AppSpriteViewer() { +export function SvgSpriteViewer() { return } ``` +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ `app/svg-sprite/page.tsx`: + ```tsx -// app/icons-debug/page.tsx -import { AppSpriteViewer } from './sprite-viewer' +import { notFound } from 'next/navigation' -export default function IconsDebugPage() { - return +import { SvgSpriteViewer } from './SvgSpriteViewer' + +export default function SvgSpritePage() { + if (process.env.NODE_ENV !== 'development') notFound() + + return } ``` -БтатичСский loader позволяСт Webpack ΡΠ²ΡΠ·Π°Ρ‚ΡŒ manifest ΠΈ emitted SVG. Viewer Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² production runtime `IconsIcon`. - -## 3. Випизация ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° - -ΠŸΡ€ΠΈ локально установлСнном package ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ helper: - -```ts -import { defineSpriteConfig } from '@gromlab/svg-sprites' - -export default defineSpriteConfig({ - mode: 'next@app/webpack', - name: 'icons', -}) -``` - -Π”Ρ€ΡƒΠ³ΠΎΠΉ package-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: type-only import `SpriteConfig` ΠΈ `satisfies SpriteConfig`. - -Π‘Π΅Π· package Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ type прямо Π² config: - -```ts -type LocalSpriteConfig = { - mode: 'next@app/webpack' - name?: string - description?: string - input?: string | string[] - transform?: { - removeSize?: boolean - replaceColors?: boolean - addTransition?: boolean - } - generatedNotice?: boolean -} - -export default { - mode: 'next@app/webpack', - name: 'icons', -} satisfies LocalSpriteConfig -``` - -Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ exact literal ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Turbopack ΠΈΠ»ΠΈ Pages Router output. +ЗапуститС `npm run dev` ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ `/svg-sprite`. Π’ production ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ Π²Π΅Ρ€Π½Ρ‘Ρ‚ 404. diff --git a/docs/ru/guides/next-pages-turbopack.md b/docs/ru/guides/next-pages-turbopack.md index b3e104a..638c690 100644 --- a/docs/ru/guides/next-pages-turbopack.md +++ b/docs/ru/guides/next-pages-turbopack.md @@ -1,140 +1,98 @@ -# Next.js Pages Router с Turbopack +# SVG-спрайт для Next.js Pages Router с Turbopack -Π­Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ quick start для exact mode key `next@pages/turbopack`: generated `IconsIcon` Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈ SSR, SSG ΠΈ клиСнтских ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°Ρ… Pages Router. +Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎ быстрому созданию SVG-спрайта Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Next.js с Pages Router ΠΈ Turbopack. -## 1. ГСнСрация спрайта +## ГСнСрация спрайта -Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство: Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² `package.json`. `npx` Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ скачиваСт CLI, Π° generated production runtime Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `@gromlab/svg-sprites`. +Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ для спрайта. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `assets/app-icons`, Π° исходныС SVG находятся Π² `assets/svg-icons`. -```text -src/sprite/ -β”œβ”€β”€ icons/ -β”‚ β”œβ”€β”€ check.svg -β”‚ └── warning.svg -β”œβ”€β”€ index.ts -└── svg-sprite.config.ts -``` +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ `assets/app-icons/svg-sprite.config.json`: -ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ plain config: - -```ts -export default { - mode: 'next@pages/turbopack', - name: 'icons', +```json +{ + "mode": "next@pages/turbopack", + "name": "app", + "input": "../svg-icons/**/*.svg" } ``` -Если `input` Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, SVG Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ· `./icons` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°. ΠšΠΎΠ½Ρ„ΠΈΠ³ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ `.js` с `default export` ΠΈΠ»ΠΈ `.json`. +ΠŸΡƒΡ‚ΡŒ Π² `input` считаСтся ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠΈ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ. -```bash -npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts -``` - -Для CI зафиксируйтС Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `@gromlab/svg-sprites@1.1.5`. Exact commands Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Turbopack ΠΈ для dev, ΠΈ для production build: +Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² `package.json`. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈΠ· Git, поэтому `predev` ΠΈ `prebuild` ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ спрайт ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ запуском ΠΈ сборкой: ```json { "scripts": { - "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts", - "dev": "npm run sprites && next dev --turbopack", - "build": "npm run sprites && next build --turbopack", - "start": "next start", - "typecheck": "npm run sprites && tsc --noEmit" + "sprites": "npx --yes @gromlab/svg-sprites assets/app-icons/svg-sprite.config.json", + "predev": "npm run sprites", + "dev": "next dev --turbopack", + "prebuild": "npm run sprites", + "build": "next build --turbopack" } } ``` -НС добавляйтС `predev`/`prebuild`, Ссли scripts ΡƒΠΆΠ΅ явно Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ `npm run sprites`. Generated `.svg-sprite` Π½Π΅ коммитится. Generated Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ `.gitignore`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Git ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Generated `.d.ts` self-contained ΠΈ Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ generator package. +## ИспользованиС спрайта + +Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `name: "app"` создаёт React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `AppIcon`. + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° `assets/app-icons/index.ts`: ```ts -// src/sprite/index.ts export * from './.svg-sprite/index.js' ``` -Production usage Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ page: +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π° страницС: ```tsx // pages/index.tsx -import { IconsIcon, iconsIconNames } from '../src/sprite' +import { AppIcon } from '../assets/app-icons' export default function Page() { return ( -
- - {iconsIconNames.length} ΠΈΠΊΠΎΠ½ΠΎΠΊ -
+ ) } ``` -ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с `getServerSideProps`, `getStaticProps` ΠΈ client navigation. Turbopack Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ generated `new URL('../sprite.svg', import.meta.url).href` Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ hashed asset. +ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с SSR, SSG ΠΈ клиСнтскими ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°ΠΌΠΈ. Turbopack сам добавляСт `sprite.svg` Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ сборку, поэтому ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² `public` Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. -## 2. Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ +## Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ -Viewer нСобязатСлСн ΠΈ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для debug/preview: +Viewer ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС ΠΈΠΊΠΎΠ½ΠΊΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС, позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ связанныС CSS-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Он Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ устанавливаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ: ```bash npm install --save-dev @gromlab/svg-sprites ``` -Π’ Pages Router Viewer ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прямо Π² page, Π±Π΅Π· ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ App Router Client Component boundary: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ страницу `pages/svg-sprite.tsx`: ```tsx -// pages/icons-debug.tsx +import type { GetStaticProps } from 'next' import { SpriteViewer } from '@gromlab/svg-sprites/react' const sources = [ - () => import('../src/sprite/.svg-sprite/svg-sprite.manifest.js'), + () => import('../assets/app-icons/.svg-sprite/svg-sprite.manifest.js'), ] as const -export default function IconsDebugPage() { +export default function SvgSpritePage() { return } + +export const getStaticProps: GetStaticProps = () => + process.env.NODE_ENV === 'development' + ? { props: {} } + : { notFound: true } ``` -ΠžΡΡ‚Π°Π²Π»ΡΠΉΡ‚Π΅ эту page Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ debug-Ρ€Π°Π·Π΄Π΅Π»Π΅. Viewer Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² production icon runtime `IconsIcon`. - -## 3. Випизация ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° - -Если package установлСн локально, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ helper: - -```ts -import { defineSpriteConfig } from '@gromlab/svg-sprites' - -export default defineSpriteConfig({ - mode: 'next@pages/turbopack', - name: 'icons', -}) -``` - -ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°: type-only import `SpriteConfig` ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ `satisfies SpriteConfig`. - -Π‘Π΅Π· package Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ copy-paste type Π² config: - -```ts -type LocalSpriteConfig = { - mode: 'next@pages/turbopack' - name?: string - description?: string - input?: string | string[] - transform?: { - removeSize?: boolean - replaceColors?: boolean - addTransition?: boolean - } - generatedNotice?: boolean -} - -export default { - mode: 'next@pages/turbopack', - name: 'icons', -} satisfies LocalSpriteConfig -``` - -Exact literal Π½Π΅ позволяСт Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΡΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ Pages Router с App Router ΠΈΠ»ΠΈ Webpack output. +ЗапуститС `npm run dev` ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ `/svg-sprite`. Π’ production ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ Π²Π΅Ρ€Π½Ρ‘Ρ‚ 404. diff --git a/docs/ru/guides/next-pages-webpack.md b/docs/ru/guides/next-pages-webpack.md index 072b7a7..d98d63a 100644 --- a/docs/ru/guides/next-pages-webpack.md +++ b/docs/ru/guides/next-pages-webpack.md @@ -1,140 +1,98 @@ -# Next.js Pages Router с Webpack +# SVG-спрайт для Next.js Pages Router с Webpack -Π­Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ quick start для exact mode key `next@pages/webpack`: generated `IconsIcon` Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Pages Router ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ SVG Ρ‡Π΅Ρ€Π΅Π· Webpack pipeline Next.js. +Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎ быстрому созданию SVG-спрайта Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Next.js с Pages Router ΠΈ Webpack. -## 1. ГСнСрация спрайта +## ГСнСрация спрайта -Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство: Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² `package.json`. `npx` Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ скачиваСт CLI, Π° generated production runtime Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `@gromlab/svg-sprites`. +Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ для спрайта. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `assets/app-icons`, Π° исходныС SVG находятся Π² `assets/svg-icons`. -```text -src/sprite/ -β”œβ”€β”€ icons/ -β”‚ β”œβ”€β”€ check.svg -β”‚ └── warning.svg -β”œβ”€β”€ index.ts -└── svg-sprite.config.ts -``` +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ `assets/app-icons/svg-sprite.config.json`: -ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ plain config: - -```ts -export default { - mode: 'next@pages/webpack', - name: 'icons', +```json +{ + "mode": "next@pages/webpack", + "name": "app", + "input": "../svg-icons/**/*.svg" } ``` -Если `input` Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, SVG Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ· `./icons` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ `.ts`, `.js` с `default export` ΠΈ `.json` configs. +ΠŸΡƒΡ‚ΡŒ Π² `input` считаСтся ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠΈ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ. -```bash -npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts -``` - -Π’ CI Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ `latest` Π½Π° Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `@gromlab/svg-sprites@1.1.5`. Exact Next commands для Webpack: +Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² `package.json`. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈΠ· Git, поэтому `predev` ΠΈ `prebuild` ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ спрайт ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ запуском ΠΈ сборкой: ```json { "scripts": { - "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts", - "dev": "npm run sprites && next dev --webpack", - "build": "npm run sprites && next build --webpack", - "start": "next start", - "typecheck": "npm run sprites && tsc --noEmit" + "sprites": "npx --yes @gromlab/svg-sprites assets/app-icons/svg-sprite.config.json", + "predev": "npm run sprites", + "dev": "next dev --webpack", + "prebuild": "npm run sprites", + "build": "next build --webpack" } } ``` -НС Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠΉΡ‚Π΅ эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ‡Π΅Ρ€Π΅Π· `predev`, `prebuild` ΠΈΠ»ΠΈ `pretypecheck`. `.svg-sprite` generated ΠΈ Π½Π΅ коммитится. Generated Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ `.gitignore`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Git ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Generated declarations self-contained ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ `@gromlab/svg-sprites`. +## ИспользованиС спрайта + +Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `name: "app"` создаёт React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `AppIcon`. + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° `assets/app-icons/index.ts`: ```ts -// src/sprite/index.ts export * from './.svg-sprite/index.js' ``` -Production usage: +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π° страницС: ```tsx // pages/index.tsx -import { IconsIcon, iconsIconNames } from '../src/sprite' +import { AppIcon } from '../assets/app-icons' export default function Page() { return ( -
- - {iconsIconNames.length} ΠΈΠΊΠΎΠ½ΠΎΠΊ -
+ ) } ``` -ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ SSR, SSG ΠΈ клиСнтскиС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹. Next Webpack ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ generated `new URL('../sprite.svg', import.meta.url).href` Π²ΠΎ внСшний hashed asset; Π½Π΅ конструируйтС URL спрайта Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. +ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с SSR, SSG ΠΈ клиСнтскими ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°ΠΌΠΈ. Next.js сам добавляСт `sprite.svg` Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ сборку, поэтому ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² `public` Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. -## 2. Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ +## Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ -Viewer нСобязатСлСн. УстанавливайтС package Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для debug/preview: +Viewer ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС ΠΈΠΊΠΎΠ½ΠΊΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС, позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ связанныС CSS-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Он Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ устанавливаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ: ```bash npm install --save-dev @gromlab/svg-sprites ``` -Pages Router позволяСт Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Viewer нСпосрСдствСнно Π² page Π±Π΅Π· ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ App Router boundary: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ страницу `pages/svg-sprite.tsx`: ```tsx -// pages/icons-debug.tsx +import type { GetStaticProps } from 'next' import { SpriteViewer } from '@gromlab/svg-sprites/react' const sources = [ - () => import('../src/sprite/.svg-sprite/svg-sprite.manifest.js'), + () => import('../assets/app-icons/.svg-sprite/svg-sprite.manifest.js'), ] as const -export default function IconsDebugPage() { +export default function SvgSpritePage() { return } + +export const getStaticProps: GetStaticProps = () => + process.env.NODE_ENV === 'development' + ? { props: {} } + : { notFound: true } ``` -БтатичСский loader Π΄Π°Ρ‘Ρ‚ Webpack Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ manifest module ΠΈ связанный SVG asset. НС ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Viewer ΠΈΠ· production pages, Ссли preview Ρ‚Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ΅Π½; runtime `IconsIcon` ΠΎΡ‚ Π½Π΅Π³ΠΎ нСзависим. - -## 3. Випизация ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° - -ПослС локальной установки package доступСн helper: - -```ts -import { defineSpriteConfig } from '@gromlab/svg-sprites' - -export default defineSpriteConfig({ - mode: 'next@pages/webpack', - name: 'icons', -}) -``` - -Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ `satisfies SpriteConfig` с type-only ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠΌ `SpriteConfig`. - -Π‘Π΅Π· package Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ type прямо Π² config: - -```ts -type LocalSpriteConfig = { - mode: 'next@pages/webpack' - name?: string - description?: string - input?: string | string[] - transform?: { - removeSize?: boolean - replaceColors?: boolean - addTransition?: boolean - } - generatedNotice?: boolean -} - -export default { - mode: 'next@pages/webpack', - name: 'icons', -} satisfies LocalSpriteConfig -``` - -Π’Π°ΠΊΠΎΠΉ exact literal выявляСт ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ App Router ΠΈΠ»ΠΈ Turbopack Π΅Ρ‰Ρ‘ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ config. +ЗапуститС `npm run dev` ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ `/svg-sprite`. Π’ production ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ Π²Π΅Ρ€Π½Ρ‘Ρ‚ 404. diff --git a/docs/ru/guides/react-vite.md b/docs/ru/guides/react-vite.md index cedad15..320168c 100644 --- a/docs/ru/guides/react-vite.md +++ b/docs/ru/guides/react-vite.md @@ -1,141 +1,115 @@ -# React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для Vite +# SVG-спрайт для React Π½Π° Vite -Π­Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ quick start для exact mode key `react@vite`: Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ создаёт Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ `IconsIcon`, Π° Vite ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ SVG asset. +Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎ быстрому созданию SVG-спрайта Π² React-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π° Vite. -## 1. ГСнСрация спрайта +## ГСнСрация спрайта -Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство: Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² `package.json`. `npx` Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ скачиваСт CLI, Π° generated production runtime Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `@gromlab/svg-sprites`. +Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ для спрайта. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `assets/app-icons`, Π° исходныС SVG находятся Π² `assets/svg-icons`. -```text -src/sprite/ -β”œβ”€β”€ icons/ -β”‚ β”œβ”€β”€ check.svg -β”‚ └── warning.svg -β”œβ”€β”€ index.ts -└── svg-sprite.config.ts -``` +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ `assets/app-icons/svg-sprite.config.json`: -ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ plain config: - -```ts -export default { - mode: 'react@vite', - name: 'icons', +```json +{ + "mode": "react@vite", + "name": "app", + "input": "../svg-icons/**/*.svg" } ``` -Если `input` Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, SVG Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ· `./icons` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°. ВмСсто `.ts` ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `.js` с `default export` ΠΈΠ»ΠΈ `.json`. +ΠŸΡƒΡ‚ΡŒ Π² `input` считаСтся ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠΈ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ. -```bash -npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts -``` - -Π’ CI Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ `latest` Π½Π° Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `@gromlab/svg-sprites@1.1.5`. Exact Vite commands: +Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² `package.json`. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈΠ· Git, поэтому `predev` ΠΈ `prebuild` ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ спрайт ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ запуском ΠΈ сборкой: ```json { "scripts": { - "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts", - "dev": "npm run sprites && vite", - "build": "npm run sprites && tsc --noEmit && vite build", - "typecheck": "npm run sprites && tsc --noEmit" + "sprites": "npx --yes @gromlab/svg-sprites assets/app-icons/svg-sprite.config.json", + "predev": "npm run sprites", + "dev": "vite", + "prebuild": "npm run sprites", + "build": "tsc --noEmit && vite build" } } ``` -НС добавляйтС `predev`, `prebuild` ΠΈΠ»ΠΈ `pretypecheck`, Ссли ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ scripts ΡƒΠΆΠ΅ явно Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ `npm run sprites`. Generated `.svg-sprite` Π½Π΅ коммитится. Generated Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ `.gitignore`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Git ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Generated declarations self-contained: ΠΎΠ½ΠΈ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ manifest Π±Π΅Π· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° `@gromlab/svg-sprites`. +## ИспользованиС спрайта -ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ barrel Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ generated API: +Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `name: "app"` создаёт React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `AppIcon`. + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° `assets/app-icons/index.ts`: ```ts -// src/sprite/index.ts export * from './.svg-sprite/index.js' ``` -Production usage: +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ: ```tsx -import { IconsIcon, iconsIconNames } from './sprite' +import { AppIcon } from '../assets/app-icons' -export function SaveButton() { +export function SaveIcon() { return ( - + ) } - -console.log(iconsIconNames) ``` -Prop `icon` являСтся union ΠΈΠΌΡ‘Π½ исходных Ρ„Π°ΠΉΠ»ΠΎΠ². Vite автоматичСски ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ generated CSS Module ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ `sprite.svg?no-inline`; query Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ inline ΠΈ заставляСт Vite Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ hashed SVG asset. Если TypeScript Π½Π΅ Π·Π½Π°Π΅Ρ‚ Vite asset imports, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ `/// ` Π² `src/vite-env.d.ts`. +Бвойство `icon` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π° исходных SVG Π±Π΅Π· Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. ΠœΠΎΠ½ΠΎΡ…Ρ€ΠΎΠΌΠ½Π°Ρ ΠΈΠΊΠΎΠ½ΠΊΠ° наслСдуСт `color`, Π° Ρ†Π²Π΅Ρ‚Π° ΠΌΠ½ΠΎΠ³ΠΎΡ†Π²Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· `--icon-color-N`. -## 2. Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ +Vite сам ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ стили ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΈ добавляСт `sprite.svg` Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ сборку. -Viewer нСобязатСлСн ΠΈ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для debug/preview. УстановитС package ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ: +## Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ + +Viewer ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС ΠΈΠΊΠΎΠ½ΠΊΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС, позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ связанныС CSS-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Он Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ устанавливаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ: ```bash npm install --save-dev @gromlab/svg-sprites ``` -Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ React bridge со статичСским массивом loaders: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ `svg-sprite.html` Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: + +```html + + + + + Иконки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° + + + +
+ + + + + +``` + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ `src/svg-sprite-debug.tsx`: ```tsx +import { createRoot } from 'react-dom/client' import { SpriteViewer } from '@gromlab/svg-sprites/react' const sources = [ - () => import('./sprite/.svg-sprite/svg-sprite.manifest.js'), + () => import('../assets/app-icons/.svg-sprite/svg-sprite.manifest.js'), ] as const -export function IconsDebugPage() { - return -} +createRoot(document.getElementById('svg-sprite-viewer')!).render( + , +) ``` -Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π² `import()` Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° generated JS manifest. Π”Π΅Ρ€ΠΆΠΈΡ‚Π΅ страницу Π·Π° debug-ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠΌ; `SpriteViewer` Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² production runtime `IconsIcon`. +ЗапуститС `npm run dev` ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ `/svg-sprite.html`. -## 3. Випизация ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° - -Если package установлСн локально, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ helper: - -```ts -import { defineSpriteConfig } from '@gromlab/svg-sprites' - -export default defineSpriteConfig({ - mode: 'react@vite', - name: 'icons', -}) -``` - -Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ `SpriteConfig` Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ type ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ `satisfies SpriteConfig`. - -Π‘Π΅Π· package Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ type прямо Π² config: - -```ts -type LocalSpriteConfig = { - mode: 'react@vite' - name?: string - description?: string - input?: string | string[] - transform?: { - removeSize?: boolean - replaceColors?: boolean - addTransition?: boolean - } - generatedNotice?: boolean -} - -export default { - mode: 'react@vite', - name: 'icons', -} satisfies LocalSpriteConfig -``` - -Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ type провСряСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этот exact mode ΠΈ Π½Π΅ создаёт runtime-Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ. +Бтандартная production-сборка Vite ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ `index.html` ΠΈ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ страницу Viewer. diff --git a/docs/ru/guides/react-webpack.md b/docs/ru/guides/react-webpack.md index a7591a2..b265fc7 100644 --- a/docs/ru/guides/react-webpack.md +++ b/docs/ru/guides/react-webpack.md @@ -1,141 +1,126 @@ -# React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для Webpack 5 +# SVG-спрайт для React Π½Π° Webpack 5 -Π­Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ quick start для exact mode key `react@webpack`: generated `IconsIcon` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Webpack 5 Asset Modules ΠΈ CSS Modules. +Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎ быстрому созданию SVG-спрайта Π² React-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π° Webpack 5. -## 1. ГСнСрация спрайта +## ГСнСрация спрайта -Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство: Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² `package.json`. `npx` Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ скачиваСт CLI, Π° generated production runtime Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `@gromlab/svg-sprites`. +Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ для спрайта. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `assets/app-icons`, Π° исходныС SVG находятся Π² `assets/svg-icons`. -```text -src/sprite/ -β”œβ”€β”€ icons/ -β”‚ β”œβ”€β”€ check.svg -β”‚ └── warning.svg -β”œβ”€β”€ index.ts -└── svg-sprite.config.ts -``` +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ `assets/app-icons/svg-sprite.config.json`: -ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ plain config: - -```ts -export default { - mode: 'react@webpack', - name: 'icons', +```json +{ + "mode": "react@webpack", + "name": "app", + "input": "../svg-icons/**/*.svg" } ``` -Если `input` Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, SVG Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ· `./icons` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ `.ts`, `.js` с `default export` ΠΈ `.json` configs. +ΠŸΡƒΡ‚ΡŒ Π² `input` считаСтся ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠΈ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ. -```bash -npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts -``` - -Π’ CI Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ `latest` Π½Π° Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `@gromlab/svg-sprites@1.1.5`. Exact Webpack commands: +Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² `package.json`. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈΠ· Git, поэтому `predev` ΠΈ `prebuild` ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ спрайт ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ запуском ΠΈ сборкой: ```json { "scripts": { - "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts", - "dev": "npm run sprites && webpack serve --mode development", - "build": "npm run sprites && webpack --mode production", - "typecheck": "npm run sprites && tsc --noEmit" + "sprites": "npx --yes @gromlab/svg-sprites assets/app-icons/svg-sprite.config.json", + "predev": "npm run sprites", + "dev": "webpack serve --mode development", + "prebuild": "npm run sprites", + "build": "webpack --mode production" } } ``` -НС сочСтайтС эти явныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ с `predev`/`prebuild`: ΠΈΠ½Π°Ρ‡Π΅ гСнСрация задублируСтся. `.svg-sprite` Π½Π΅ коммитится. Generated Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ `.gitignore`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Git ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Generated `.d.ts` self-contained ΠΈ Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ generator package. +## ИспользованиС спрайта + +Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `name: "app"` создаёт React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `AppIcon`. + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° `assets/app-icons/index.ts`: ```ts -// src/sprite/index.ts export * from './.svg-sprite/index.js' ``` -Production usage: +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ: ```tsx -import { IconsIcon, iconsIconNames } from './sprite' +import { AppIcon } from '../assets/app-icons' -export function SaveButton() { +export function SaveIcon() { return ( - + ) } - -console.log(iconsIconNames) ``` -Generated component ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ URL Ρ‡Π΅Ρ€Π΅Π· `new URL('../sprite.svg', import.meta.url).href`. Webpack 5 Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ SVG ΠΊΠ°ΠΊ Asset Module. Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ generated `sprite.svg` ΠΈΠ· `@svgr/webpack`, inline/raw loaders ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±Ρ‰ΠΈΡ… SVG rules Π»ΠΈΠ±ΠΎ Π·Π°Π΄Π°ΠΉΡ‚Π΅ для Π½Π΅Π³ΠΎ `type: 'asset/resource'`. +Бвойство `icon` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π° исходных SVG Π±Π΅Π· Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. ΠœΠΎΠ½ΠΎΡ…Ρ€ΠΎΠΌΠ½Π°Ρ ΠΈΠΊΠΎΠ½ΠΊΠ° наслСдуСт `color`, Π° Ρ†Π²Π΅Ρ‚Π° ΠΌΠ½ΠΎΠ³ΠΎΡ†Π²Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· `--icon-color-N`. -ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `react-component.module.css`. Webpack config Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ `*.module.css` Ρ‡Π΅Ρ€Π΅Π· `css-loader` с CSS Modules ΠΈ `style-loader` ΠΈΠ»ΠΈ `MiniCssExtractPlugin`. Для TypeScript ΠΏΡ€ΠΈ нСобходимости Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ `declare module '*.module.css'`. +ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ CSS Modules. Если ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π΅Ρ‰Ρ‘ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ… с default export, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π² `webpack.config.js`: -## 2. Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ +```js +{ + test: /\.module\.css$/i, + use: [ + 'style-loader', + { + loader: 'css-loader', + options: { modules: { namedExport: false } }, + }, + ], +} +``` -Viewer нСобязатСлСн. УстанавливайтС package Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для debug/preview: +Webpack 5 сам добавляСт `sprite.svg` Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ сборку. + +## Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ + +Viewer ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС ΠΈΠΊΠΎΠ½ΠΊΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС, позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ связанныС CSS-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Он Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. + +УстановитС Viewer: ```bash npm install --save-dev @gromlab/svg-sprites ``` -Webpack Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ `import.meta.glob`; ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ статичСский loader: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ entry `src/svg-sprite-debug.tsx`: ```tsx +import { createRoot } from 'react-dom/client' import { SpriteViewer } from '@gromlab/svg-sprites/react' const sources = [ - () => import('./sprite/.svg-sprite/svg-sprite.manifest.js'), + () => import('../assets/app-icons/.svg-sprite/svg-sprite.manifest.js'), ] as const -export function IconsDebugPage() { - return -} +const container = document.createElement('div') +document.body.append(container) + +createRoot(container).render( + , +) ``` -Webpack создаст chunk manifest ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ Π΅Π³ΠΎ SVG Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΎΡ‚ ΠΆΠ΅ Asset Modules pipeline. Viewer Π΄Π΅Ρ€ΠΆΠΈΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² debug route; production `IconsIcon` ΠΎΡ‚ Π½Π΅Π³ΠΎ Π½Π΅ зависит. +Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ скрипт ΠΊ основному entry Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² development-Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ настройки `webpack.config.js`: -## 3. Випизация ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° - -Π‘ локально установлСнным package доступСн helper: - -```ts -import { defineSpriteConfig } from '@gromlab/svg-sprites' - -export default defineSpriteConfig({ - mode: 'react@webpack', - name: 'icons', +```js +export default (_env, argv) => ({ + // ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ настройки Webpack. + entry: [ + './src/main.tsx', + ...(argv.mode === 'development' ? ['./src/svg-sprite-debug.tsx'] : []), + ], }) ``` -ЭквивалСнтная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°: type-only import `SpriteConfig` ΠΈ `satisfies SpriteConfig`. - -Π‘Π΅Π· package ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ copy-paste type Π² config: - -```ts -type LocalSpriteConfig = { - mode: 'react@webpack' - name?: string - description?: string - input?: string | string[] - transform?: { - removeSize?: boolean - replaceColors?: boolean - addTransition?: boolean - } - generatedNotice?: boolean -} - -export default { - mode: 'react@webpack', - name: 'icons', -} satisfies LocalSpriteConfig -``` - -Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ literal Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ случайно Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Vite ΠΈΠ»ΠΈ Next mode. +ЗапуститС `npm run dev`. Viewer появится Π½Π° основной страницС прилоТСния ΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Ρ‘Ρ‚ Π² production-сборку. diff --git a/docs/ru/guides/standalone-vite.md b/docs/ru/guides/standalone-vite.md index 03e53fe..379db66 100644 --- a/docs/ru/guides/standalone-vite.md +++ b/docs/ru/guides/standalone-vite.md @@ -1,151 +1,114 @@ -# Нативный icon Web Component с Vite +# SVG-спрайт для Vite Π±Π΅Π· Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° -Π­Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ quick start для exact mode key `standalone@vite`: generated facade рСгистрируСт `` ΠΈ ΠΎΡ‚Π΄Π°Ρ‘Ρ‚ SVG Π² asset pipeline Vite. +Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎ быстрому созданию SVG-спрайта Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π° Vite Π±Π΅Π· Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°. -## 1. ГСнСрация спрайта +## ГСнСрация спрайта -Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство: Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² `package.json`. `npx` Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ скачиваСт CLI, Π° generated production runtime Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `@gromlab/svg-sprites`. +Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ для спрайта. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `assets/app-icons`, Π° исходныС SVG находятся Π² `assets/svg-icons`. -РСкомСндуСмая структура Π΄Π΅Ρ€ΠΆΠΈΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ ΠΈ ΠΈΠΊΠΎΠ½ΠΊΠΈ рядом: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ `assets/app-icons/svg-sprite.config.json`: -```text -src/sprite/ -β”œβ”€β”€ icons/ -β”‚ β”œβ”€β”€ check.svg -β”‚ └── warning.svg -β”œβ”€β”€ index.ts -└── svg-sprite.config.ts -``` - -ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ plain config: - -```ts -export default { - mode: 'standalone@vite', - name: 'icons', +```json +{ + "mode": "standalone@vite", + "name": "app", + "input": "../svg-icons/**/*.svg" } ``` -Если `input` Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, SVG Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ· `./icons` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°. ΠšΠΎΠ½Ρ„ΠΈΠ³ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ `.js` с `default export` ΠΈΠ»ΠΈ `.json`. +ΠŸΡƒΡ‚ΡŒ Π² `input` считаСтся ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠΈ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ. -```bash -npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts -``` - -Π’ CI Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ `latest` Π½Π° Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `@gromlab/svg-sprites@1.1.5`. Exact dev/build commands для Vite: +Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² `package.json`. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈΠ· Git, поэтому `predev` ΠΈ `prebuild` ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ спрайт ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ запуском ΠΈ сборкой: ```json { "scripts": { - "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts", - "dev": "npm run sprites && vite", - "build": "npm run sprites && vite build", - "typecheck": "npm run sprites && tsc --noEmit" + "sprites": "npx --yes @gromlab/svg-sprites assets/app-icons/svg-sprite.config.json", + "predev": "npm run sprites", + "dev": "vite", + "prebuild": "npm run sprites", + "build": "vite build" } } ``` -НС добавляйтС ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ `predev`/`prebuild` ΠΈ явный `npm run sprites` Π² этих scripts. `.svg-sprite` являСтся generated-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ ΠΈ Π½Π΅ коммитится. Generated Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ `.gitignore`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Git ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Generated `.d.ts` self-contained ΠΈ Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ `@gromlab/svg-sprites`. +## ИспользованиС спрайта -Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ facade Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ barrel: +Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `name: "app"` создаёт элСмСнт ``. + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° `assets/app-icons/index.ts`: ```ts -// src/sprite/index.ts export * from './.svg-sprite/index.js' ``` -Production entry рСгистрируСт native Web Component: +ЗарСгистрируйтС элСмСнт Π² `src/main.ts`: ```ts -import { defineIconsIconElement, iconsIconNames } from './sprite' +import { defineAppIconElement } from '../assets/app-icons' +import './style.css' -defineIconsIconElement() - -document.querySelector('#app')!.innerHTML = ` - -` - -console.log(iconsIconNames) +defineAppIconElement() ``` -Generated facade ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `sprite.svg?no-inline`: Vite автоматичСски выпускаСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ hashed SVG asset ΠΈ Π½Π΅ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² data URL. TypeScript-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΏΡ€ΠΈ нСобходимости Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ стандартныС Vite types: +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΠΊΠΎΠ½ΠΊΡƒ Π² HTML: -```ts -/// +```html + ``` -Π Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ `1em`, поэтому ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· `font-size`. Π¦Π²Π΅Ρ‚ задаётся Ρ‡Π΅Ρ€Π΅Π· `color` ΠΈ generated custom properties: +Π€Π°ΠΉΠ» `check.svg` доступСн ΠΊΠ°ΠΊ `icon="check"`. Π Π°Π·ΠΌΠ΅Ρ€ ΠΈ Ρ†Π²Π΅Ρ‚Π° Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· CSS: ```css -icons-icon { +app-icon { font-size: 24px; color: #334155; --icon-color-2: #f59e0b; } ``` -## 2. Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ +ΠœΠΎΠ½ΠΎΡ…Ρ€ΠΎΠΌΠ½Π°Ρ ΠΈΠΊΠΎΠ½ΠΊΠ° наслСдуСт `color`, Π° Ρ†Π²Π΅Ρ‚Π° ΠΌΠ½ΠΎΠ³ΠΎΡ†Π²Π΅Ρ‚Π½ΠΎΠΉ ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· `--icon-color-N`. НуТныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Viewer. -Viewer нСобязатСлСн ΠΈ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для debug/preview. УстановитС Π΅Π³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ: +Vite сам Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ `sprite.svg` Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ сборку. ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² `public` Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. + +## Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ + +Viewer ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС ΠΈΠΊΠΎΠ½ΠΊΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС, позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ связанныС CSS-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Он Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ устанавливаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ: ```bash npm install --save-dev @gromlab/svg-sprites ``` -ЗарСгистрируйтС Viewer ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ generated JS manifest Ρ‡Π΅Ρ€Π΅Π· свойство `sources`: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ `svg-sprite.html` Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: + +```html + + + + + Иконки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° + + + + + + + + + +``` + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ `src/svg-sprite-debug.ts`: ```ts import '@gromlab/svg-sprites/viewer/element' import type { SpriteViewerElement } from '@gromlab/svg-sprites/viewer' -import spriteManifest from './sprite/.svg-sprite/svg-sprite.manifest.js' - -document.querySelector('#app')!.insertAdjacentHTML( - 'beforeend', - '', -) +import spriteManifest from '../assets/app-icons/.svg-sprite/svg-sprite.manifest.js' const viewer = document.querySelector('gromlab-sprite-viewer')! -viewer.viewerTitle = 'Иконки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°' viewer.sources = [spriteManifest] ``` -РасполоТитС этот ΠΊΠΎΠ΄ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² debug entry ΠΈΠ»ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π΅. Viewer Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² production runtime ``. +ЗапуститС `npm run dev` ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ `/svg-sprite.html`. -## 3. Випизация ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° - -ΠŸΡ€ΠΈ локально установлСнном package ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ helper: - -```ts -import { defineSpriteConfig } from '@gromlab/svg-sprites' - -export default defineSpriteConfig({ - mode: 'standalone@vite', - name: 'icons', -}) -``` - -ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° с package: `import type { SpriteConfig }` ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ `satisfies SpriteConfig`. - -Π‘Π΅Π· package скопируйтС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ type прямо Π² config: - -```ts -type LocalSpriteConfig = { - mode: 'standalone@vite' - name?: string - description?: string - input?: string | string[] - transform?: { - removeSize?: boolean - replaceColors?: boolean - addTransition?: boolean - } - generatedNotice?: boolean -} - -export default { - mode: 'standalone@vite', - name: 'icons', -} satisfies LocalSpriteConfig -``` - -Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ type ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ `mode` ΠΎΠ΄Π½ΠΈΠΌ exact literal ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π²ΠΎ врСмя Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ. +Viewer Π½Π΅ трСбуСтся для Ρ€Π°Π±ΠΎΡ‚Ρ‹ `` ΠΈ Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ основному ΠΊΠΎΠ΄Ρƒ прилоТСния. diff --git a/docs/ru/guides/standalone-webpack.md b/docs/ru/guides/standalone-webpack.md index f60ca05..bc3bb31 100644 --- a/docs/ru/guides/standalone-webpack.md +++ b/docs/ru/guides/standalone-webpack.md @@ -1,145 +1,111 @@ -# Нативный icon Web Component с Webpack 5 +# SVG-спрайт для Webpack 5 Π±Π΅Π· Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° -Π­Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ quick start для exact mode key `standalone@webpack`: generated facade прСдоставляСт ``, Π° Webpack 5 ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ SVG Ρ‡Π΅Ρ€Π΅Π· Asset Modules. +Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎ быстрому созданию SVG-спрайта Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π° Webpack 5 Π±Π΅Π· Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°. -## 1. ГСнСрация спрайта +## ГСнСрация спрайта -Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство: Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² `package.json`. `npx` Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ скачиваСт CLI, Π° generated production runtime Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `@gromlab/svg-sprites`. +Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠ°ΠΏΠΊΡƒ для спрайта. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `assets/app-icons`, Π° исходныС SVG находятся Π² `assets/svg-icons`. -```text -src/sprite/ -β”œβ”€β”€ icons/ -β”‚ β”œβ”€β”€ check.svg -β”‚ └── warning.svg -β”œβ”€β”€ index.ts -└── svg-sprite.config.ts -``` +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ `assets/app-icons/svg-sprite.config.json`: -ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ config рядом с `icons/`: - -```ts -export default { - mode: 'standalone@webpack', - name: 'icons', +```json +{ + "mode": "standalone@webpack", + "name": "app", + "input": "../svg-icons/**/*.svg" } ``` -Если `input` Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, SVG Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ· `./icons` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ `.js` с `default export` ΠΈ `.json`. +ΠŸΡƒΡ‚ΡŒ Π² `input` считаСтся ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠΈ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ. -```bash -npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts -``` - -Для CI Π·Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `@gromlab/svg-sprites@1.1.5`. Exact Webpack commands: +Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π² `package.json`. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΈΠ· Git, поэтому `predev` ΠΈ `prebuild` ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ спрайт ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ запуском ΠΈ сборкой: ```json { "scripts": { - "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/sprite/svg-sprite.config.ts", - "dev": "npm run sprites && webpack serve --mode development", - "build": "npm run sprites && webpack --mode production", - "typecheck": "npm run sprites && tsc --noEmit" + "sprites": "npx --yes @gromlab/svg-sprites assets/app-icons/svg-sprite.config.json", + "predev": "npm run sprites", + "dev": "webpack serve --mode development", + "prebuild": "npm run sprites", + "build": "webpack --mode production" } } ``` -НС Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠΉΡ‚Π΅ запуск Ρ‡Π΅Ρ€Π΅Π· `predev`/`prebuild`, Ссли scripts ΡƒΠΆΠ΅ явно Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ `npm run sprites`. Generated `.svg-sprite` Π½Π΅ коммитится. Generated Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ `.gitignore`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Git ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Π•Π³ΠΎ declarations self-contained ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ `@gromlab/svg-sprites`. +## ИспользованиС спрайта + +Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `name: "app"` создаёт элСмСнт ``. + +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° `assets/app-icons/index.ts`: ```ts -// src/sprite/index.ts export * from './.svg-sprite/index.js' ``` -Production usage: +ЗарСгистрируйтС элСмСнт Π² основном entry прилоТСния: ```ts -import { defineIconsIconElement, iconsIconNames } from './sprite' +import { defineAppIconElement } from '../assets/app-icons' +import './style.css' -defineIconsIconElement() - -document.querySelector('#app')!.innerHTML = ` - -` - -console.log(iconsIconNames) +defineAppIconElement() ``` -Generated facade ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ `new URL('./sprite.svg', import.meta.url).href`. Webpack 5 Asset Modules Π²Ρ‹ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ asset; Π΅Π³ΠΎ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ URL ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ `output.publicPath` ΠΈ `assetModuleFilename`. +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΠΊΠΎΠ½ΠΊΡƒ Π² HTML: -Если ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ `@svgr/webpack`, `svg-inline-loader`, `raw-loader` ΠΈΠ»ΠΈ ΠΎΠ±Ρ‰ΠΈΠΉ SVG rule, ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ `src/sprite/.svg-sprite/sprite.svg` ΠΈΠ· этого ΠΏΡ€Π°Π²ΠΈΠ»Π°. Generated SVG Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ `asset/resource`, Π° Π½Π΅ ΠΊΠ°ΠΊ React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠ»ΠΈ inline source. +```html + +``` -Π Π°Π·ΠΌΠ΅Ρ€ Web Component ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ `1em`; управляйтС ΠΈΠΌ ΠΈ Ρ†Π²Π΅Ρ‚Π°ΠΌΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ CSS: +Π€Π°ΠΉΠ» `check.svg` доступСн ΠΊΠ°ΠΊ `icon="check"`. Π Π°Π·ΠΌΠ΅Ρ€ ΠΈ Ρ†Π²Π΅Ρ‚Π° Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· CSS: ```css -icons-icon { +app-icon { font-size: 24px; color: #334155; --icon-color-2: #f59e0b; } ``` -## 2. Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ +ΠœΠΎΠ½ΠΎΡ…Ρ€ΠΎΠΌΠ½Π°Ρ ΠΈΠΊΠΎΠ½ΠΊΠ° наслСдуСт `color`, Π° Ρ†Π²Π΅Ρ‚Π° ΠΌΠ½ΠΎΠ³ΠΎΡ†Π²Π΅Ρ‚Π½ΠΎΠΉ ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· `--icon-color-N`. НуТныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Viewer. -Viewer нСобязатСлСн. Для debug/preview установитС package ΠΊΠ°ΠΊ dev dependency: +Webpack 5 сам Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ `sprite.svg` Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ сборку. + +## Π”Π΅Π±Π°Π³ ΠΈ ΠΏΡ€Π΅Π²ΡŒΡŽ + +Viewer ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ всС ΠΈΠΊΠΎΠ½ΠΊΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ страницС, позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ связанныС CSS-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Он Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. + +УстановитС Viewer: ```bash npm install --save-dev @gromlab/svg-sprites ``` -ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ element entry ΠΈ generated JS manifest: +Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ entry `src/svg-sprite-debug.ts`: ```ts import '@gromlab/svg-sprites/viewer/element' import type { SpriteViewerElement } from '@gromlab/svg-sprites/viewer' -import spriteManifest from './sprite/.svg-sprite/svg-sprite.manifest.js' +import spriteManifest from '../assets/app-icons/.svg-sprite/svg-sprite.manifest.js' -document.querySelector('#app')!.insertAdjacentHTML( - 'beforeend', - '', -) - -const viewer = document.querySelector('gromlab-sprite-viewer')! +const viewer = document.createElement('gromlab-sprite-viewer') as SpriteViewerElement viewer.viewerTitle = 'Иконки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°' viewer.sources = [spriteManifest] +document.body.append(viewer) ``` -Webpack свяТСт manifest с Ρ‚Π΅ΠΌ ΠΆΠ΅ emitted SVG asset. ΠžΡΡ‚Π°Π²Π»ΡΠΉΡ‚Π΅ Viewer Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² debug entry: production `` ΠΎΡ‚ Π½Π΅Π³ΠΎ Π½Π΅ зависит. +Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ скрипт ΠΊ основному entry Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² development-Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ настройки `webpack.config.js`: -## 3. Випизация ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° - -ПослС локальной установки package ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ helper: - -```ts -import { defineSpriteConfig } from '@gromlab/svg-sprites' - -export default defineSpriteConfig({ - mode: 'standalone@webpack', - name: 'icons', +```js +export default (_env, argv) => ({ + // ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ настройки Webpack. + entry: [ + './src/main.ts', + ...(argv.mode === 'development' ? ['./src/svg-sprite-debug.ts'] : []), + ], }) ``` -Π›ΠΈΠ±ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ `SpriteConfig` ΠΊΠ°ΠΊ type ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ `satisfies SpriteConfig`. +ЗапуститС `npm run dev`. Viewer появится Π½Π° основной страницС прилоТСния. -Π‘Π΅Π· package Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ copy-paste type Π² сам config: - -```ts -type LocalSpriteConfig = { - mode: 'standalone@webpack' - name?: string - description?: string - input?: string | string[] - transform?: { - removeSize?: boolean - replaceColors?: boolean - addTransition?: boolean - } - generatedNotice?: boolean -} - -export default { - mode: 'standalone@webpack', - name: 'icons', -} satisfies LocalSpriteConfig -``` - -Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ сохраняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ exact mode Π±Π΅Π· runtime import ΠΈ Π±Π΅Π· записи generator package Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. +Viewer добавляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² development-сборку ΠΈ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² production. diff --git a/docs/ru/next-app.md b/docs/ru/next-app.md deleted file mode 100644 index 9b8acea..0000000 --- a/docs/ru/next-app.md +++ /dev/null @@ -1,4 +0,0 @@ -# Guides Next.js App Router ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ - -- [App Router + Turbopack](guides/next-app-turbopack.md) -- [App Router + Webpack](guides/next-app-webpack.md) diff --git a/docs/ru/next-pages.md b/docs/ru/next-pages.md deleted file mode 100644 index 07429da..0000000 --- a/docs/ru/next-pages.md +++ /dev/null @@ -1,4 +0,0 @@ -# Guides Next.js Pages Router ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ - -- [Pages Router + Turbopack](guides/next-pages-turbopack.md) -- [Pages Router + Webpack](guides/next-pages-webpack.md) diff --git a/docs/ru/programmatic-api.md b/docs/ru/programmatic-api.md deleted file mode 100644 index b5e68be..0000000 --- a/docs/ru/programmatic-api.md +++ /dev/null @@ -1,3 +0,0 @@ -# ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ API ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Ρ‘Π½ - -Canonical Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚: [ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ API](reference/programmatic-api.md). diff --git a/docs/ru/react-vite.md b/docs/ru/react-vite.md deleted file mode 100644 index 0a92e9b..0000000 --- a/docs/ru/react-vite.md +++ /dev/null @@ -1,3 +0,0 @@ -# Guide React + Vite ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Ρ‘Π½ - -Canonical guide: [React + Vite](guides/react-vite.md). diff --git a/docs/ru/react-webpack.md b/docs/ru/react-webpack.md deleted file mode 100644 index b47ded9..0000000 --- a/docs/ru/react-webpack.md +++ /dev/null @@ -1,3 +0,0 @@ -# Guide React + Webpack ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Ρ‘Π½ - -Canonical guide: [React + Webpack](guides/react-webpack.md). diff --git a/docs/ru/reference.md b/docs/ru/reference.md deleted file mode 100644 index caa74ab..0000000 --- a/docs/ru/reference.md +++ /dev/null @@ -1,3 +0,0 @@ -# ВСхничСский справочник ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Ρ‘Π½ - -Canonical Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚: [тСхничСский справочник](reference/technical.md). diff --git a/docs/ru/reference/programmatic-api.md b/docs/ru/reference/programmatic-api.md index 209c76f..3a644b2 100644 --- a/docs/ru/reference/programmatic-api.md +++ b/docs/ru/reference/programmatic-api.md @@ -14,6 +14,21 @@ const result = await generateSprite( ) ``` +Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ содСрТит имя ΠΈ mode спрайта, количСство ΠΈΠΊΠΎΠ½ΠΎΠΊ ΠΈ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ filesystem paths: + +```ts +result.name +result.mode +result.target +result.iconCount +result.rootDir +result.generatedDir +result.spritePath +result.manifestPath +``` + +Next.js modes Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ `router` ΠΈ `bundler`. + Для static standalone mode `result.spritePath` ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² build-скриптС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ SVG ΠΏΠΎ URL прилоТСния: @@ -29,7 +44,7 @@ await copyFile(result.spritePath, 'dist/app-icons/sprite.svg') `spritePath` являСтся filesystem path, Π° Π½Π΅ browser URL. Deployment-neutral JSON manifest доступСн Ρ‡Π΅Ρ€Π΅Π· `result.manifestPath` ΠΈ копируСтся нСзависимо ΠΎΡ‚ SVG. -ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ config-Ρ„Π°ΠΉΠ»Ρƒ с Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ `.ts`, `.js` ΠΈΠ»ΠΈ `.json`. ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ вмСсто Ρ„Π°ΠΉΠ»Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ config-less Ρ€Π΅ΠΆΠΈΠΌ: ΠΊΠΎΡ€Π½Π΅ΠΌ sprite-модуля становится этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. +ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ config-Ρ„Π°ΠΉΠ»Ρƒ с Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ `.ts`, `.js` ΠΈΠ»ΠΈ `.json`. ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ вмСсто Ρ„Π°ΠΉΠ»Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ config-less Ρ€Π΅ΠΆΠΈΠΌ: ΠΊΠΎΡ€Π½Π΅ΠΌ sprite-модуля становится этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ содСрТит Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ overrides ΠΈ всСгда ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ: @@ -107,13 +122,17 @@ await generateNextSprite('path/to/config.ts', { ```ts import { + isSpriteMode, loadSpriteConfig, resolveSpriteConfig, + resolveSpriteConfigSource, validateSpriteConfig, } from '@gromlab/svg-sprites' ``` +- `isSpriteMode(value)` провСряСт, являСтся Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ exact mode. - `loadSpriteConfig(file)` Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ явно ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ `.ts`, `.js` ΠΈΠ»ΠΈ `.json` Ρ„Π°ΠΉΠ». +- `resolveSpriteConfigSource(source)` Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ ΠΊΠ°ΠΊ config-Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ config-less ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. - `validateSpriteConfig(value)` выполняСт runtime-Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. - `resolveSpriteConfig(root, config, overrides)` ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ значСния, добавляСт defaults ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡƒΡ‚ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ `root`. @@ -138,6 +157,16 @@ import type { SpriteViewerElement } from '@gromlab/svg-sprites/viewer' Browser entry рСгистрируСт ``. Bare standalone Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ `dist/viewer-element.js` Π±Π΅Π· bundler. +Для Ρ€ΡƒΡ‡Π½ΠΎΠΉ рСгистрации ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ runtime Π±Π΅Π· auto-register entry: + +```ts +import { defineSpriteViewerElement } from '@gromlab/svg-sprites/viewer' + +defineSpriteViewerElement() +``` + +Π­Ρ‚ΠΎΡ‚ entry Ρ‚Π°ΠΊΠΆΠ΅ экспортируСт Ρ‚ΠΈΠΏΡ‹ `SpriteViewerElement`, `SpriteViewerManifest`, `SpriteViewerSource`, `SpriteViewerSources` ΠΈ связанныС Ρ‚ΠΈΠΏΡ‹ manifest ΠΈ loaders. + React bridge сохраняСт ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½Ρ‹ΠΉ API: ```tsx diff --git a/docs/ru/reference/technical.md b/docs/ru/reference/technical.md index 0122739..2ccbc54 100644 --- a/docs/ru/reference/technical.md +++ b/docs/ru/reference/technical.md @@ -2,6 +2,8 @@ [ИндСкс Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ](../README.md) +[ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ JSON, JavaScript ΠΈ TypeScript](../configuration.md) + Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ ΠΏΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, generated API ΠΈ повСдСнию `@gromlab/svg-sprites`. ΠŸΠΎΡˆΠ°Π³ΠΎΠ²ΡƒΡŽ установку смотритС Π² руководствС для вашСго стСка: - [Bare standalone](../guides/standalone.md) @@ -24,7 +26,7 @@ Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Π° dependency ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ЗапускайтС CLI Ρ‡Π΅Ρ€Π΅Π· `npx`: ```bash -npx --yes --package=@gromlab/svg-sprites@latest svg-sprites path/to/svg-sprite.config.ts +npx --yes @gromlab/svg-sprites path/to/svg-sprite.config.json ``` УстанавливайтС ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΊΠ°ΠΊ development dependency, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Π½ΡƒΠΆΠ½Ρ‹ @@ -36,7 +38,7 @@ npm install --save-dev @gromlab/svg-sprites ## CLI ΠΈ Ρ€Π΅ΠΆΠΈΠΌΡ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ -CLI ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡƒΡ‚ΡŒ: явно Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ config-Ρ„Π°ΠΉΠ» Π»ΠΈΠ±ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для config-less Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ: +Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ CLI ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡƒΡ‚ΡŒ: явно Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ config-Ρ„Π°ΠΉΠ» Π»ΠΈΠ±ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для config-less Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ: ```text svg-sprites [options] @@ -54,11 +56,11 @@ svg-sprites [options] | Next.js Pages Router + Turbopack | `next@pages/turbopack` | | Next.js Pages Router + Webpack 5 | `next@pages/webpack` | -Config-Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ любоС имя ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ `.ts`, `.js` ΠΈΠ»ΠΈ `.json`. CLI Π½Π΅ ΠΈΡ‰Π΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ ΠΏΠΎ соглашСнию: Ρ„Π°ΠΉΠ» Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ явно. Π’ руководствах ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΠΎΠ΅ имя `svg-sprite.config.ts`. +Config-Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ любоС имя ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ `.ts`, `.js` ΠΈΠ»ΠΈ `.json`. CLI Π½Π΅ ΠΈΡ‰Π΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ ΠΏΠΎ соглашСнию: Ρ„Π°ΠΉΠ» Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ явно. Π’ руководствах ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΠΎΠ΅ имя `svg-sprite.config.json`. Если ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, всС настройки бСрутся ΠΈΠ· CLI. Если ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ config-Ρ„Π°ΠΉΠ», CLI-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ значСния Ρ„Π°ΠΉΠ»Π°. ΠžΠ±Ρ‰ΠΈΠΉ порядок: `defaults β†’ config β†’ CLI`. -Доступны `--mode`, `--name`, `--description`, повторяСмый `--input `, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ°Ρ€Ρ‹ `--remove-size`/`--no-remove-size`, `--replace-colors`/`--no-replace-colors`, `--add-transition`/`--no-add-transition` ΠΈ `--generated-notice`/`--no-generated-notice`. ΠŸΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ transform-Ρ„Π»Π°Π³ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ поля, Π° хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ `--input` ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ замСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `input` ΠΈΠ· config. +`--help` ΠΈ `-h` выводят справку Π±Π΅Π· ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ. Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ доступны `--mode`, `--name`, `--description`, повторяСмый `--input `, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ°Ρ€Ρ‹ `--remove-size`/`--no-remove-size`, `--replace-colors`/`--no-replace-colors`, `--add-transition`/`--no-add-transition` ΠΈ `--generated-notice`/`--no-generated-notice`. ΠŸΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ transform-Ρ„Π»Π°Π³ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ поля, Π° хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ `--input` ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ замСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `input` ΠΈΠ· config. Π’ CLI Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ glob-ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ Π² ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ shell Π½Π΅ раскрыл ΠΈΡ… Π΄ΠΎ запуска Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°: @@ -96,7 +98,7 @@ export default defineSpriteConfig({ | ΠžΠΏΡ†ΠΈΡ | Π’ΠΈΠΏ | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ | НазначСниС | |---|---|---|---| | `mode` | `SpriteMode` | НСт | Π Π΅ΠΆΠΈΠΌ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ; ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· CLI/API | -| `name` | `string` | Выводится ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° | Имя спрайта, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΈ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² | +| `name` | `string` | Выводится ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° | Имя спрайта; Π² modes с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Ρ‘Ρ‚ имя ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΈ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² | | `description` | `string` | НСт | ОписаниС для Ρ‚ΠΈΠΏΠΎΠ² ΠΈ debug manifest | | `input` | `string \| string[]` | `./icons` | Папки, SVG-Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ glob-ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ°ΠΏΠΊΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° | | `transform` | `TransformOptions` | ВсС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ | Настройки ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ SVG | @@ -111,7 +113,7 @@ app β†’ AppIcon file-manager β†’ FileManagerIcon ``` -Если `name` Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Для ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ `svg-sprite` ΠΈΠ»ΠΈ `svg-sprites` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. +Если `name` Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ имя ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² kebab-case. Для ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ `svg-sprite` ΠΈΠ»ΠΈ `svg-sprites` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. ### Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ ΠΈΠΊΠΎΠ½ΠΎΠΊ @@ -141,7 +143,7 @@ file-manager β†’ FileManagerIcon ```text app-icons/ β”œβ”€β”€ .gitignore -β”œβ”€β”€ svg-sprite.config.ts +β”œβ”€β”€ svg-sprite.config.json β”œβ”€β”€ index.ts # Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ barrel └── .svg-sprite/ β”œβ”€β”€ index.js @@ -183,10 +185,10 @@ runtime asset ΠΈ deployment-neutral manifest data: generated Web Component Π±Π΅Π· Π²Π½Π΅ΡˆΠ½ΠΈΡ… runtime-зависимостСй. Bare `standalone` Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π½Π΅ создаёт JavaScript-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. -Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ пСрСзаписываСт ΠΈ удаляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ»Ρ‹ со своим marker. Если Π² managed-ΠΏΡƒΡ‚ΠΈ находится ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ„Π°ΠΉΠ», гСнСрация Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ошибкой. ΠšΠΎΡ€Π½Π΅Π²ΠΎΠΉ `index.ts` Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚; ΠΏΡ€ΠΈ нСобходимости создайтС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ barrel: +`.svg-sprite` ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ управляСтся Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ замСняСтся Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. Π›ΡŽΠ±Ρ‹Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Π² Π½Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ рядом, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ `index.ts`: ```ts -export * from './.svg-sprite' +export * from './.svg-sprite/index.js' ``` ## Standalone Web Component ΠΈ TypeScript @@ -307,7 +309,7 @@ folder open.svg β†’ icon="folder open" β†’ id="icon-" ## ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ спрайты -ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ создаёт нСзависимый ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Ρ‚ΠΈΠΏΡ‹, manifest ΠΈ SVG asset: +ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ создаёт нСзависимый mode-specific ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚. React ΠΈ Next.js ΡΠΎΠ·Π΄Π°ΡŽΡ‚ React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ Ρ‚ΠΈΠΏΡ‹, `standalone@vite` ΠΈ `standalone@webpack` β€” Web Component ΠΈ Ρ‚ΠΈΠΏΡ‹, Π° bare `standalone` β€” SVG ΠΈ JSON manifest: ```text app-icons β†’ AppIcon β†’ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΈΠΊΠΎΠ½ΠΊΠΈ @@ -353,7 +355,7 @@ Static HTML послС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ `.svg-sprite/sprite.svg` ΠΏΡ€ΠΈΠ»ΠΎ ``` -Standalone Vite/Webpack прСдоставляСт generated `getIconsIconHref()` ΠΈ mapping +Standalone Vite/Webpack прСдоставляСт generated `getAppIconHref()` ΠΈ mapping Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… IDs. НС конструируйтС fragment ΠΈΠ· нСбСзопасного ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Vite: @@ -602,7 +604,7 @@ Viewer ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π³Ρ€ΡƒΠΏΠΏΡ‹, поиск, `viewBox`, CSS-ΠΏΠ΅Ρ€Π΅ΠΌ ```json { "scripts": { - "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/ui/app-icons/svg-sprite.config.ts", + "sprites": "npx --yes @gromlab/svg-sprites src/ui/app-icons/svg-sprite.config.ts", "predev": "npm run sprites", "prebuild": "npm run sprites", "pretypecheck": "npm run sprites" @@ -610,22 +612,22 @@ Viewer ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π³Ρ€ΡƒΠΏΠΏΡ‹, поиск, `viewBox`, CSS-ΠΏΠ΅Ρ€Π΅ΠΌ } ``` -CI Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ generation script Π΄ΠΎ сборки ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ². Для воспроизводимости Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ `latest` Π½Π° Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ установка package Π½Π΅ Π½ΡƒΠΆΠ½Π°, Ссли CI Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Viewer, package-Ρ‚ΠΈΠΏΡ‹ config ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ API. +CI Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ generation script Π΄ΠΎ сборки ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ². Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ установка package Π½Π΅ Π½ΡƒΠΆΠ½Π°, Ссли CI Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Viewer, package-Ρ‚ΠΈΠΏΡ‹ config ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ API. -Bare `standalone` Π½Π΅ создаёт ΠΈ Π½Π΅ измСняСт `.gitignore`: ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ само Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ `.svg-sprite/`. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… modes Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ `.gitignore`. Он Ρ‚Π°ΠΊΠΆΠ΅ откаТСтся ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ„Π°ΠΉΠ» Π²Π½ΡƒΡ‚Ρ€ΠΈ `.svg-sprite`. ΠšΠΎΡ€Π½Π΅Π²ΠΎΠΉ `index.ts` остаётся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ generated API. +Bare `standalone` Π½Π΅ создаёт `.gitignore` ΠΈ сохраняСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ„Π°ΠΉΠ». Если послС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ mode остался управляСмый `.gitignore`, bare mode ΡƒΠ΄Π°Π»ΠΈΡ‚ Π΅Π³ΠΎ. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… modes Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ откаТСтся ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ `.gitignore` Π±Π΅Π· generated marker. ΠšΠΎΡ€Π½Π΅Π²ΠΎΠΉ `index.ts` остаётся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ generated API. ## Диагностика -- НСт `.svg-sprite/index.js`: запуститС generation script Π΄ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° generated-модуля. +- Для всСх modes, ΠΊΡ€ΠΎΠΌΠ΅ bare `standalone`: Ссли Π½Π΅Ρ‚ `.svg-sprite/index.js`, запуститС generation script Π΄ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° generated-модуля. - НС Π½Π°ΠΉΠ΄Π΅Π½ источник: ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ config-Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ sprite-модуля. - НС ΡƒΠΊΠ°Π·Π°Π½ mode: Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ `mode` Π² config Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ `--mode`. - Иконка отсутствуСт Π² Ρ‚ΠΈΠΏΠ΅: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ `input`, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ `.svg`, glob-ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ `**/*.svg` для Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΏΠ°ΠΏΠΎΠΊ. - ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΈΠΌΠ΅Π½ΠΈ: Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… SVG ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ basename; ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠΉΡ‚Π΅ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ». -- `Refusing to overwrite a user file`: Π² managed-ΠΏΡƒΡ‚ΠΈ находится Ρ„Π°ΠΉΠ» Π±Π΅Π· generated marker. +- `Refusing to overwrite a user file`: Π² ΠΊΠΎΡ€Π½Π΅ sprite-модуля находится ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ `.gitignore`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ. - Иконка Π½Π΅ мСняСт Ρ†Π²Π΅Ρ‚: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `` ΠΈΠ»ΠΈ generated-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ `replaceColors`. - Webpack Π²Ρ‹Π΄Π°Ρ‘Ρ‚ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ URL: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Asset Modules, `output.publicPath` ΠΈ SVG loaders. - Static sprite Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 404: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ post-generation copy ΠΈΠ»ΠΈ server alias ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°ΠΉΡ‚Π΅ filesystem `spritePath` Π² HTML. -- Viewer Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ спрайт: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ `.svg-sprite/svg-sprite.manifest.js` ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Π΄ΠΎ запуска прилоТСния. +- Viewer Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ спрайт: для bundler modes ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ ΠΊ `.svg-sprite/svg-sprite.manifest.js`; для bare `standalone` β€” URL ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… `svg-sprite.manifest.json` ΠΈ `sprite.svg`. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Π΄ΠΎ запуска прилоТСния. - Build ΠΈ mode Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ target, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ фактичСскому сборщику. Для собствСнного orchestration ΠΈ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ компиляции смотритС [ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ API](programmatic-api.md). diff --git a/skills/README.md b/skills/README.md index eaefff2..f963c3c 100644 --- a/skills/README.md +++ b/skills/README.md @@ -1,31 +1,25 @@ # AI skills -Π˜ΡΡ…ΠΎΠ΄Π½ΠΈΠΊΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ контСкста английского ΠΈ русского skills находятся Π² `skills/svg-sprites/src/{en,ru}/`. ΠšΠ°Π½ΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ exact-mode guides находятся Π² `docs/{en,ru}/guides/` ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ skill Π±Π΅Π· измСнСния. Π“ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ пСрСносимыС Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² `skills/artifacts/`, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Git ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ZIP Π²ΠΎ врСмя release workflow. +Π˜ΡΡ…ΠΎΠ΄Π½ΠΈΠΊΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ контСкста английского ΠΈ русского skills находятся Π² `skills/svg-sprites/src/{en,ru}/`. Π“ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ пСрСносимыС Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² `skills/artifacts/`, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Git ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ZIP Π²ΠΎ врСмя release workflow. -ОбС языковыС вСрсии ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ структуру: +Русский skill Ρ…Ρ€Π°Π½ΠΈΡ‚ вСсь ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ контСкст Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅: ```text -src// +src/ru/ β”œβ”€β”€ SKILL.md -β”œβ”€β”€ core/ -β”‚ β”œβ”€β”€ 00-package-overview.md -β”‚ β”œβ”€β”€ 10-mode-selection.md -β”‚ β”œβ”€β”€ 20-project-inspection.md -β”‚ β”œβ”€β”€ 30-react-next-setup.md -β”‚ β”œβ”€β”€ 40-generated-contract.md -β”‚ β”œβ”€β”€ 50-usage-and-colors.md -β”‚ β”œβ”€β”€ 60-verification.md -β”‚ └── 70-diagnostics.md └── references/ - β”œβ”€β”€ programmatic-api.md └── complex-svg.md ``` -`core/` содСрТит ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ знания, раскрываСмыС прямо Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ `SKILL.md`. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ `references/` содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ agent-specific ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹. Π”Π΅Π²ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· `docs//guides/` ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² `references/guides/`; английский artifact ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ английскиС guides, русский Ρ‚ΠΎΠ»ΡŒΠΊΠΎ русскиС. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π½Π°Π±ΠΎΡ€ mode guides ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ `references/upstream/` Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ. +`src/ru/SKILL.md` содСрТит знания ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс Π°Π³Π΅Π½Ρ‚Π°. Exact-mode настройка бСрётся ΠΈΠ· canonical guides, Π° Π½Π΅ дублируСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ source-Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. + +Русский artifact Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ `README_RU.md` ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈΠ· `docs/ru/`. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ рСдакторский `guides/AGENTS.md`, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ `guides/README.md` ΠΈ `reference/README.md` Π½Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Π€Π°ΠΉΠ»Ρ‹ находятся Π² `references/README_RU.md` ΠΈ `references/docs/ru/`. Agent-specific `complex-svg.md` остаётся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ reference. + +Английский source ΠΏΠΎΠΊΠ° сохраняСт ΡΠΎΡΡ‚Π°Π²Π½ΡƒΡŽ структуру с `core/`, Π° artifact β€” английскиС exact-mode guides ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ `programmatic-api.md`/`complex-svg.md`. Π•Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π½Π° Π΅Π΄ΠΈΠ½Ρ‹ΠΉ `SKILL.md` ΠΈ ΠΏΠΎΠ»Π½ΡƒΡŽ canonical-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ выполняСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. ## ΠšΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡ Markdown -Π’ любой собираСмый Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹: +Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ сохраняСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Markdown includes для английского skill ΠΈ Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²: ```md diff --git a/skills/svg-sprites/build.mjs b/skills/svg-sprites/build.mjs index 6b421d9..00e8715 100644 --- a/skills/svg-sprites/build.mjs +++ b/skills/svg-sprites/build.mjs @@ -137,7 +137,13 @@ function expandCopies(config) { assertSafeRelativePath(entry.toDirectory) const sourceDirectory = path.resolve(skillDir, entry.fromDirectory) const extensions = entry.extensions ?? [] - for (const relativePath of listDirectoryFiles(sourceDirectory, extensions)) { + const sourceFiles = listDirectoryFiles(sourceDirectory, extensions) + const excluded = new Set((entry.exclude ?? []).map((relativePath) => { + assertSafeRelativePath(relativePath) + return relativePath.replaceAll('\\', '/') + })) + for (const relativePath of sourceFiles) { + if (excluded.has(relativePath)) continue copies.push({ from: path.join(sourceDirectory, relativePath), to: path.posix.join(entry.toDirectory, relativePath), diff --git a/skills/svg-sprites/skill.config.mjs b/skills/svg-sprites/skill.config.mjs index 642c338..c48ee2e 100644 --- a/skills/svg-sprites/skill.config.mjs +++ b/skills/svg-sprites/skill.config.mjs @@ -1,7 +1,12 @@ -const agentReferences = [ - 'programmatic-api.md', - 'complex-svg.md', -] +const agentReferences = { + en: [ + 'programmatic-api.md', + 'complex-svg.md', + ], + ru: [ + 'complex-svg.md', + ], +} const guideFiles = [ 'standalone.md', @@ -18,7 +23,7 @@ const guideFiles = [ function documents(language) { return [ { entry: `src/${language}/SKILL.md`, to: 'SKILL.md', skill: true }, - ...agentReferences.map((file) => ({ + ...agentReferences[language].map((file) => ({ entry: `src/${language}/references/${file}`, to: `references/${file}`, })), @@ -32,6 +37,20 @@ function guides(language) { })) } +const russianDocumentation = [ + { from: '../../README_RU.md', to: 'references/README_RU.md' }, + { + fromDirectory: '../../docs/ru', + toDirectory: 'references/docs/ru', + extensions: ['.md'], + exclude: [ + 'guides/AGENTS.md', + 'guides/README.md', + 'reference/README.md', + ], + }, +] + export default [ { name: 'svg-sprites', @@ -43,10 +62,10 @@ export default [ }, { name: 'svg-sprites-ru', - description: 'Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ настройкС, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ диагностикС @gromlab/svg-sprites. Π’Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹: @gromlab/svg-sprites, svg-sprite.config.ts, defineSpriteConfig, generateSprite, standalone, standalone@vite, standalone@webpack, react@vite, react@webpack, next@app, next@pages, SpriteConfig.input, --input, SpriteViewer ΠΈ --icon-color-N. НЕ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ для самописных SVG-спрайтов, inline SVG, favicon, растровых ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, icon fonts ΠΈΠ»ΠΈ Π²Ρ‹Π±ΠΎΡ€Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠΊΠΎΠ½ΠΎΠΊ.', + description: 'Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ настройкС, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ диагностикС @gromlab/svg-sprites. Π’Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹: @gromlab/svg-sprites, svg-sprite.config.json, svg-sprite.config.ts, defineSpriteConfig, generateSprite, standalone, standalone@vite, standalone@webpack, react@vite, react@webpack, next@app, next@pages, SpriteConfig.input, --input, SpriteViewer ΠΈ --icon-color-N. НЕ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ для самописных SVG-спрайтов, inline SVG, favicon, растровых ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, icon fonts ΠΈΠ»ΠΈ Π²Ρ‹Π±ΠΎΡ€Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠΊΠΎΠ½ΠΎΠΊ.', output: '../artifacts/svg-sprites-ru', maxSkillBytes: 48_000, documents: documents('ru'), - copy: guides('ru'), + copy: russianDocumentation, }, ] diff --git a/skills/svg-sprites/src/ru/SKILL.md b/skills/svg-sprites/src/ru/SKILL.md index ffe0ca6..955a3ff 100644 --- a/skills/svg-sprites/src/ru/SKILL.md +++ b/skills/svg-sprites/src/ru/SKILL.md @@ -1,19 +1,282 @@ # @gromlab/svg-sprites - - - - - - - - +## Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ -## Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊΠΈ ΠΏΠΎ нСобходимости +`@gromlab/svg-sprites` β€” CLI-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ SVG-спрайтов для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… SVG-Ρ„Π°ΠΉΠ»ΠΎΠ². ΠŸΠ°ΠΊΠ΅Ρ‚ Π½Π΅ содСрТит собствСнного Π½Π°Π±ΠΎΡ€Π° ΠΈΠΊΠΎΠ½ΠΎΠΊ: ΠΎΠ½ собираСт SVG ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²ΠΎ внСшний sprite asset, создаёт Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Web Component для standalone bundler modes ΠΈ React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для React/Next.js. -- Для статичСской ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉ [bare standalone](./references/guides/standalone.md). Для vanilla-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ со сборщиком ΠΎΡ‚ΠΊΡ€ΠΎΠΉ [standalone + Vite](./references/guides/standalone-vite.md) ΠΈΠ»ΠΈ [standalone + Webpack](./references/guides/standalone-webpack.md). -- Для React ΠΎΡ‚ΠΊΡ€ΠΎΠΉ exact guide для [Vite](./references/guides/react-vite.md) ΠΈΠ»ΠΈ [Webpack](./references/guides/react-webpack.md). -- Для Next.js App Router ΠΎΡ‚ΠΊΡ€ΠΎΠΉ exact guide для [Turbopack](./references/guides/next-app-turbopack.md) ΠΈΠ»ΠΈ [Webpack](./references/guides/next-app-webpack.md). -- Для Next.js Pages Router ΠΎΡ‚ΠΊΡ€ΠΎΠΉ exact guide для [Turbopack](./references/guides/next-pages-turbopack.md) ΠΈΠ»ΠΈ [Webpack](./references/guides/next-pages-webpack.md). -- Для Π²Ρ‹Π·ΠΎΠ²Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈΠ· Node.js ΠΎΡ‚ΠΊΡ€ΠΎΠΉ [ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ API](./references/programmatic-api.md). -- Для gradients, filters, `url(#...)`, нСстандартных Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с `viewBox` ΠΎΡ‚ΠΊΡ€ΠΎΠΉ [слоТныС SVG](./references/complex-svg.md). +ΠŸΠ°ΠΊΠ΅Ρ‚ рассчитан Π½Π° нСсколько нСзависимых спрайтов Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ явно Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ config-Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ config-less ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ описываСт ΠΎΠ΄ΠΈΠ½ спрайт ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ собствСнныС: + +- SVG asset; +- mode-specific manifest data; +- для bundler modes β€” Ρ‚ΠΈΠΏΡ‹ ΠΈΠΌΡ‘Π½ ΠΈ production entry `.svg-sprite/index.js`; +- для `standalone@vite`/`standalone@webpack` β€” Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Web Component с явной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ рСгистрации; +- Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для React/Next.js β€” React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚; +- для bare `standalone` β€” deployment-neutral JSON manifest Π±Π΅Π· ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ URL. + +ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΈ располоТСниС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² опрСдСляСт ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. НапримСр, `name: 'file-manager'` создаёт `FileManagerIcon`, `FileManagerIconName` ΠΈ `fileManagerIconNames`, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с `name: 'navigation'` создаст ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ `NavigationIcon`. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ API ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… спрайтов, Π° Π½Π΅ фиксированныС экспорты ΠΏΠ°ΠΊΠ΅Ρ‚Π°. + +Generated production runtime ΠΈ declarations Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ `@gromlab/svg-sprites`. ГСнСрация Ρ‡Π΅Ρ€Π΅Π· `npx --yes @gromlab/svg-sprites ` Π½Π΅ добавляСт package Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Устанавливай Π΅Π³ΠΎ ΠΊΠ°ΠΊ development dependency Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Viewer, package-Ρ‚ΠΈΠΏΠΎΠ² config ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ API. + +## Π’Ρ‹Π±ΠΎΡ€ Ρ€Π΅ΠΆΠΈΠΌΠ° + +Π’Ρ‹Π±Π΅Ρ€ΠΈ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ mode key: + +| ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ | Mode key | +|---|---| +| Static HTML / собствСнная публикация | `standalone` | +| Standalone + Vite | `standalone@vite` | +| Standalone + Webpack 5 | `standalone@webpack` | +| React + Vite | `react@vite` | +| React + Webpack 5 | `react@webpack` | +| Next.js App Router + Turbopack | `next@app/turbopack` | +| Next.js App Router + Webpack 5 | `next@app/webpack` | +| Next.js Pages Router + Turbopack | `next@pages/turbopack` | +| Next.js Pages Router + Webpack 5 | `next@pages/webpack` | + +Mode задаётся Π² config, CLI ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ API. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ примСнСния: `defaults β†’ config β†’ CLI/API overrides`. ПослС объСдинСния mode обязатСлСн. + +`name` нСобязатСлСн. Если ΠΎΠ½ Π½Π΅ Π·Π°Π΄Π°Π½, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ имя ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° sprite-модуля Π² kebab-case; для ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² `svg-sprite` ΠΈ `svg-sprites` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Π―Π²Π½ΠΎΠ΅ `name` Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠΆΠ΅ Π±Ρ‹Ρ‚ΡŒ записано Π² kebab-case ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с латинской Π±ΡƒΠΊΠ²Ρ‹. + +CLI ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡƒΡ‚ΡŒ. ΠŸΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ `.ts`, `.js` ΠΈΠ»ΠΈ `.json` Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ этот ΠΊΠΎΠ½Ρ„ΠΈΠ³ нСзависимо ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ. ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ config-less Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΈ настройки ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ„Π»Π°Π³Π°ΠΌΠΈ CLI. + +```json +{ + "scripts": { + "sprite:": "npx --yes @gromlab/svg-sprites ", + "sprite::cli": "npx --yes @gromlab/svg-sprites --mode " + } +} +``` + +ГСнСрация Ρ‡Π΅Ρ€Π΅Π· `npx` Π½Π΅ добавляСт package Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹Π΅ `react`, `next@app`, `next@pages`, `standalone@` ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΉ `legacy`. Bare `standalone` Π²Ρ‹Π±ΠΈΡ€Π°ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ само ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ SVG; для Vite/Webpack ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»Π½Ρ‹ΠΉ key. Для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… спрайтов создай ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ config-Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. + +## Π˜Π½ΡΠΏΠ΅ΠΊΡ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° + +Π”ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ установи фактичСский ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: + +1. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ `package.json`, lock-Ρ„Π°ΠΉΠ» ΠΈ workspace-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ; ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ framework, bundler ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. +2. Найди config-Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ `svg-sprites` ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹ generated-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Имя ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅; ориСнтируйся Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ CLI ΠΏΡƒΡ‚ΡŒ ΠΈ поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. +3. Для React ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ Vite ΠΈΠ»ΠΈ Webpack 5 ΠΏΠΎ scripts ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³Ρƒ. Для Next.js ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ App/Pages Router ΠΈ сборщик Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… `dev`/`build` ΠΊΠΎΠΌΠ°Π½Π΄. +4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ `predev`, `prebuild`, `pretypecheck` ΠΈ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ scripts. НС пСрСзаписывай ΠΈΡ…. +5. Для Π½ΠΎΠ²ΠΎΠ³ΠΎ спрайта Π²Ρ‹Π±Π΅Ρ€ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½Π΅ навязывая ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ слой ΠΈΠ»ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ прилоТСния. +6. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒ TypeScript ΠΈ alias-настройки. Для package subpath exports Π½ΡƒΠΆΠ΅Π½ TypeScript 5+ с `moduleResolution: 'bundler'`, `'node16'` ΠΈΠ»ΠΈ `'nodenext'`. + +ВсС input-ΠΏΡƒΡ‚ΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, содСрТащСго явно ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ config-Ρ„Π°ΠΉΠ»; Π² config-less Ρ€Π΅ΠΆΠΈΠΌΠ΅ β€” ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠΉ `input` ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚: + +- `input?: string | string[]` ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ `./icons`; +- каТдая строка Π·Π°Π΄Π°Ρ‘Ρ‚ ΠΏΠ°ΠΏΠΊΡƒ, Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ SVG-Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ glob; +- ΠΏΠ°ΠΏΠΊΠ° сканируСтся плоско; Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ явным recursive glob, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `./icons/**/*.svg`; +- массив ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ positive-источники, Π° элСмСнт с прСфиксом `!` ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ свои совпадСния ΠΈΠ· ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π½Π°Π±ΠΎΡ€Π°; +- ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ positive-источник Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒΡΡ хотя Π±Ρ‹ Π² ΠΎΠ΄ΠΈΠ½ SVG, поэтому ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ΠΈΠ»ΠΈ пустая ΠΏΠ°ΠΏΠΊΠ°, glob Π±Π΅Π· совпадСний, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π½Π΅ ΠΊ SVG ΡΠ²Π»ΡΡŽΡ‚ΡΡ ошибкой; +- Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ; +- Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ basename ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‚, Π΄Π°ΠΆΠ΅ Ссли ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… источников. + +НС ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉ ΠΎΠ±Ρ‰ΠΈΠΉ SVG Π² нСсколько ΠΏΠ°ΠΏΠΎΠΊ: добавь Π΅Π³ΠΎ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΈΠ»ΠΈ подходящий glob Π² `input` ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ спрайта. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ `**/*.svg` Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ рСкурсивного Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. + +## Настройка ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ + +НС воспроизводи настройку mode ΠΏΠΎ памяти. ПослС инспСкции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²Ρ‹Π±Π΅Ρ€ΠΈ ΠΎΠ΄ΠΈΠ½ exact mode ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» ΠΈΠ· `references/docs/ru/guides/`. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ guide ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, Π·Π°Ρ‚Π΅ΠΌ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΠΉ Π΅Π³ΠΎ ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ структурС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. + +Π Π°Π±ΠΎΡ‚Π°ΠΉ Π² Ρ‚Π°ΠΊΠΎΠΌ порядкС: + +1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ исходных SVG ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΎΠ΄Π½ΠΎΠ³ΠΎ sprite-модуля. Один config создаёт ΠΎΠ΄ΠΈΠ½ нСзависимый спрайт; для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π½ΡƒΠΆΠ½Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ config-Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ `name`. +2. Π‘Π²Π΅Ρ€ΡŒ framework, router ΠΈ bundler с exact mode. Для Next.js провСряй Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ `dev` ΠΈ `build` scripts, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ `next.config.*`. +3. ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉ JSON-ΠΊΠΎΠ½Ρ„ΠΈΠ³, Ссли ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ package-Ρ‚ΠΈΠΏΡ‹ config. TypeScript-ΠΊΠΎΠ½Ρ„ΠΈΠ³ Ρ‚Π°ΠΊΠΆΠ΅ загруТаСтся Ρ‡Π΅Ρ€Π΅Π· CLI, Π½ΠΎ установка package Π½ΡƒΠΆΠ½Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ `defineSpriteConfig` ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΡ‹. +4. Π Π°Π·Ρ€Π΅ΡˆΠ°ΠΉ всС `input` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° config-Ρ„Π°ΠΉΠ»Π°. НС мСняй структуру SVG Π±Π΅Π· нСобходимости: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅, Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», glob ΠΈΠ»ΠΈ массив этих источников. +5. Π”ΠΎΠ±Π°Π²ΡŒ sprite-ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ с явным ΠΏΡƒΡ‚Ρ‘ΠΌ ΠΊ config. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ `dev`, `build`, `typecheck` ΠΈ lifecycle hooks; встрой Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ процСсса, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ `.svg-sprite`. +6. НС запускай ΠΎΠ΄Π½Ρƒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Π΄Π²Π°ΠΆΠ΄Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ `predev` ΠΈ `npm run sprites && ...`. Для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… спрайтов создай ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ ΠΎΠ΄ΠΈΠ½ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ script. +7. Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ sprite-модуля, создай ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ `index.ts` рядом с `.svg-sprite`; Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΡŒ generated-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. +8. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Π΄ΠΎ typecheck ΠΈΠ»ΠΈ запуска прилоТСния, Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒ mode-specific output ΠΈ фактичСский ΠΈΠΌΠΏΠΎΡ€Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. + +НС добавляй Viewer автоматичСски. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΠΉ Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ запросу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½Π° Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π°Π±ΠΎΡ€Π°, Ρ†Π²Π΅Ρ‚ΠΎΠ² Π»ΠΈΠ±ΠΎ слоТных SVG. Бпособ изоляции Viewer ΠΎΡ‚ production Π±Π΅Ρ€ΠΈ ΠΈΠ· exact guide: Vite, Webpack, App Router ΠΈ Pages Router ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹. + +НС ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉ snippets ΠΌΠ΅ΠΆΠ΄Ρƒ exact modes Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΌ API. Π Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ asset URL, generated-Ρ„Π°ΠΉΠ»Ρ‹, CSS handling, router boundary ΠΈ способ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ debug-инструмСнтов. + +## ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ generated-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° + +ПослС Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ React/Next-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄: + +```text +svg-sprite/ +β”œβ”€β”€ icons/ # ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ исходники +β”œβ”€β”€ svg-sprite.config.json # Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΠΎΠ΅ имя ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° +β”œβ”€β”€ index.ts # Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ barrel +β”œβ”€β”€ .gitignore # управляСт Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ +└── .svg-sprite/ + β”œβ”€β”€ index.js + β”œβ”€β”€ index.d.ts + β”œβ”€β”€ icon-data.js + β”œβ”€β”€ icon-data.d.ts + β”œβ”€β”€ sprite.svg + β”œβ”€β”€ svg-sprite.manifest.js + β”œβ”€β”€ svg-sprite.manifest.d.ts + └── react/ + β”œβ”€β”€ react-component.js + β”œβ”€β”€ react-component.d.ts + └── react-component.module.css +``` + +Standalone Π½Π΅ создаёт `react/`. Bare `standalone` Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ `sprite.svg` ΠΈ `svg-sprite.manifest.json`; `standalone@vite`/`standalone@webpack` Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ `index.*`, `icon-data.*` ΠΈ resolved manifest. Π˜Ρ… `index.*` Ρ‚Π°ΠΊΠΆΠ΅ содСрТит Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ generated Web Component; bare `standalone` Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ JS runtime ΠΈ Π½Π΅ создаёт `.gitignore`. + +Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉ исходныС SVG, config-Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ `index.ts`. НС измСняй Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ содСрТимоС `.svg-sprite`: повторная гСнСрация Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚. Π’ΠΎ всСх modes, ΠΊΡ€ΠΎΠΌΠ΅ bare `standalone`, generated `.gitignore` Ρ‚Π°ΠΊΠΆΠ΅ находится ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈΠ· корня sprite-модуля создай barrel: + +```ts +export * from './.svg-sprite/index.js' +``` + +Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²Π»Π°Π΄Π΅Π΅Ρ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ `.svg-sprite` ΠΈ замСняСт Π΅Π³ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС. Никогда Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΠΉ Ρ‚ΡƒΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹. Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ‚Π°ΠΊΠΆΠ΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ `.gitignore`, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ mode Π΅Π³ΠΎ создаёт. Bare `standalone` сохраняСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ `.gitignore`, Π½ΠΎ удаляСт управляСмый `.gitignore`, ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΉΡΡ послС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ mode. Generated-ΠΏΡƒΡ‚ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ symlink. + +Π’ React/Next modes Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ `index.js` экспортируСт ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠ· `react/react-component.js` ΠΈ readonly-массив ΠΈΠΌΡ‘Π½, Π° `index.d.ts` добавляСт props/style-Ρ‚ΠΈΠΏΡ‹ ΠΈ union ΠΈΠΌΠ΅Π½ΠΈ. Standalone bundler modes ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ Web Component helpers ΠΈ Ρ‚ΠΈΠΏΡ‹ Π±Π΅Π· `react/`; bare `standalone` Π½Π΅ создаёт facade. Manifest declarations bundler modes ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ Ρ‚ΠΈΠΏΡ‹ локально ΠΈ Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ generator package. Manifest содСрТит mode, target, список ΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠΊΠΎΠ½ΠΎΠΊ для debug-инструмСнтов; bundler manifest Ρ‚Π°ΠΊΠΆΠ΅ содСрТит URL ΠΈ Π½Π΅ импортируСтся production-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ. + +Π’ bundler modes спрайт остаётся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ asset, Π° SVG path-Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² JavaScript. Content hash зависит ΠΎΡ‚ настроСк сборщика. Bare `standalone` создаёт Ρ„Π°ΠΉΠ» с фиксированным ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ само опрСдСляСт Π΅Π³ΠΎ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ΅ имя ΠΈ вСрсионированиС: + +- `react@vite` Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ статичСский ΠΈΠΌΠΏΠΎΡ€Ρ‚ `sprite.svg?no-inline`, Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΡŽΡ‰ΠΈΠΉ Vite inline; +- `standalone@vite` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Vite asset-ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΈ экспортируСт href helper ΠΈ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Web Component Π±Π΅Π· React; +- `standalone@webpack` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Webpack Asset Modules ΠΈ экспортируСт Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ mode-local Web Component Π±Π΅Π· React; +- React Webpack 5 ΠΈ всС Next modes ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ asset Ρ‡Π΅Ρ€Π΅Π· `new URL(..., import.meta.url).href`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ сборщик; +- кастомный Webpack SVG loader Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ generated `sprite.svg`; +- Π² Next mode generated-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π΅ содСрТит `'use client'` ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Server Components, SSR ΠΈ SSG; Π½Π΅ добавляй ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π΄ΠΈ ΠΈΠΊΠΎΠ½ΠΊΠΈ; +- ΠΊΠΎΠΌΠ°Π½Π΄Π° сборки Next ΠΈ mode key Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ: Turbopack с `.../turbopack`, Webpack с `.../webpack`. + +Для bundler modes Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΠΉ generated sprite Π² `public` ΠΈ Π½Π΅ пСрСписывай URL Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Для bare `standalone` Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΠΉ managed original: ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ явно ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² deploy output ΠΈ само ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ URL ΠΈ очистку ΠΊΠΎΠΏΠΈΠΈ. ΠŸΡ€ΠΈ смСнС mode ΠΏΠ΅Ρ€Π΅Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠΉ спрайт с Π½ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΠ»Π½Ρ‹ΠΌ key. + +## ИспользованиС, Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΈ Ρ†Π²Π΅Ρ‚Π° + +Имя ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° зависит ΠΎΡ‚ `name` ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ спрайта. Π’ `standalone@vite` ΠΈ `standalone@webpack` Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `name: 'file-manager'` создаёт tag `` ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `defineFileManagerIconElement()`: + +```ts +import { defineFileManagerIconElement } from './svg-sprite' + +defineFileManagerIconElement() +``` + +```html + +``` + +Нативный элСмСнт Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ runtime-зависимостСй, сам Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ generated ID ΠΈ `viewBox`, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ URL Ρ‡Π΅Ρ€Π΅Π· bundler ΠΈ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ `` Π² Shadow DOM. Π•Π³ΠΎ property `icon` Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ union ΠΈΠΌΡ‘Π½, Π½ΠΎ строковыС HTML attributes ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² runtime. Π Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ `1em Γ— 1em`; мСняй Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· CSS Π½Π° host. Bare `standalone` Web Component Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚. + +Π’ React/Next.js Ρ‚ΠΎΡ‚ ΠΆΠ΅ `name: 'file-manager'` создаёт React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `FileManagerIcon`. Для `name: 'navigation'` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ сгСнСрированный `NavigationIcon`. + +Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠ· корня ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° спрайта. `width` ΠΈ `height` Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹: Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ CSS-классом. + +```tsx +import { FileManagerIcon } from './svg-sprite' + +export const OpenButton = () => ( + ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ + +) +``` + +```css +.icon { + width: 24px; + height: 24px; + color: #4b5563; +} +``` + +`icon` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° исходных Ρ„Π°ΠΉΠ»ΠΎΠ² Π±Π΅Π· `.svg`; нСизвСстноС имя являСтся ошибкой TypeScript. Для нСбСзопасных SVG ID ΠΈΠΌΡ‘Π½ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ΅ имя, Π½ΠΎ создаёт Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ hash ID, поэтому Π½Π΅ собирай fragment URL ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. + +По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ `` ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ стандартныС SVG attributes: Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ `width`/`height`, `className`, `style`, `role`, `aria-*` ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ. Π‘ `wrapped={true}` ΠΊΠΎΡ€Π½Π΅ΠΌ становится ``, props относятся ΠΊ span, Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ SVG Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ wrapper. + +Generated-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ сСмантику Π·Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π½Π΅ добавляСт `title`. Для Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉ `aria-hidden="true"`; для ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ смысловой ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉ `role="img"` ΠΈ доступноС имя Ρ‡Π΅Ρ€Π΅Π· `aria-label`. НС Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΠΉ имя, Ссли сосСдний тСкст ΡƒΠΆΠ΅ ΠΎΠ·Π²ΡƒΡ‡ΠΈΠ²Π°Π΅Ρ‚ дСйствиС. Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΠΉ Π½Π° `button` ΠΈΠ»ΠΈ `a`, Π° Π½Π΅ Π½Π° самой ΠΈΠΊΠΎΠ½ΠΊΠ΅. + +Врансформации `removeSize`, `replaceColors` ΠΈ `addTransition` Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Для ΠΌΠΎΠ½ΠΎΡ…Ρ€ΠΎΠΌΠ½ΠΎΠΉ ΠΈΠΊΠΎΠ½ΠΊΠΈ СдинствСнный Ρ†Π²Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ fallback `currentColor`, поэтому управляй CSS-свойством `color`. Для ΠΌΠ½ΠΎΠ³ΠΎΡ†Π²Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°ΠΉ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ custom properties: + +```tsx + +``` + +АвтозамСна рассчитана Π½Π° `fill`/`stroke` attributes ΠΈ inline `style`. ЗначСния `none`, `transparent`, `inherit`, `unset`, `initial` Π½Π΅ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ. CSS-классы ΠΈ внСшниС stylesheets, gradients, patterns, filters ΠΈ `url(#...)` провСряй Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ страницы Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‡Π΅Ρ€Π΅Π· ``, Π½ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ°ΡŽΡ‚ Π²ΠΎ внСшний Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈ `` ΠΈΠ»ΠΈ `background-image`; CSS mask оставляСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΡ†Π²Π΅Ρ‚Π½Ρ‹ΠΉ силуэт. + +`SpriteViewer` нСобязатСлСн. Установи `@gromlab/svg-sprites` ΠΊΠ°ΠΊ development dependency, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Π½ΡƒΠΆΠ΅Π½ Viewer. Он ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ manifests ΠΈΠ»ΠΈ статичСски ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠΌΡ‹Π΅ loaders, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ поиск, Ρ‚Π΅ΠΌΡ‹, Ρ†Π²Π΅Ρ‚Π° ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, Π½ΠΎ production-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΎΡ‚ Π½Π΅Π³ΠΎ Π½Π΅ зависят. + +ΠŸΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Viewer ΠΎΡ‚ΠΊΡ€ΠΎΠΉ exact guide. Vite ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ HTML entry, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Webpack β€” development-only entry, Next.js β€” debug route, Π° App Router Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Client Component boundary. НС пСрСноси способ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ modes. + +## ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° + +ПослС измСнСния ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° ΠΈΠ»ΠΈ SVG Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ: + +1. Запусти Ρ‚ΠΎΡ‡Π½ΡƒΡŽ sprite-ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ. ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ с ΠΊΠΎΠ΄ΠΎΠΌ `0` ΠΈ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ имя, число ΠΈΠΊΠΎΠ½ΠΎΠΊ, mode ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ `.svg-sprite`. +2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒ output Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ exact mode: + - bare `standalone` создаёт `sprite.svg` ΠΈ `svg-sprite.manifest.json`; + - `standalone@vite` ΠΈ `standalone@webpack` Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ `index.*`, `icon-data.*` ΠΈ JS manifest, Π½ΠΎ Π½Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ `react/`; + - React ΠΈ Next.js modes Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ `react/react-component.js`, declaration ΠΈ CSS Module. +3. Для modes с public facade ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒ `.svg-sprite/index.js`, сосСдний `index.d.ts`, список ΠΈΠΌΡ‘Π½ ΠΈ фактичСский ΠΈΠΌΠΏΠΎΡ€Ρ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ barrel. +4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒ manifest: mode ΠΈ target Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ adapter, Π° список ΠΈΠΊΠΎΠ½ΠΎΠΊ β€” исходным SVG. Π’ bundler modes URL Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ mode-specific способом; bare JSON manifest Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π½Π΅ содСрТит ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ `spriteUrl`. +5. Запусти ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ typecheck ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ссли mode создаёт Ρ‚ΠΈΠΏΡ‹ ΠΈΠ»ΠΈ измСнился ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ TypeScript-ΠΊΠΎΠ΄. +6. Запусти ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ прилоТСния, Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚ΡƒΡŽ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ: `dev`, build ΠΈΠ»ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. + +НС запускай ΠΏΠΎΠ»Π½ΡƒΡŽ production-сборку Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π΄ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠΊΠΎΠ½ΠΊΠΈ. Она Π½ΡƒΠΆΠ½Π°, Ссли мСнялся bundler target, router, Webpack loader, asset URL, deployment path ΠΈΠ»ΠΈ диагностируСтся production-only ошибка. + +Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, Network ΠΈ accessibility tree выполняй Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ прилоТСния ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹Ρ… инструмСнтов. Если Ρ‚Π°ΠΊΠΈΡ… инструмСнтов Π½Π΅Ρ‚, Π½Π΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΠΉ, Ρ‡Ρ‚ΠΎ Ρ†Π²Π΅Ρ‚Π°, Ρ‚Π΅ΠΌΡ‹, Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ HTTP-ΠΎΡ‚Π²Π΅Ρ‚ asset ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Ρ‹; явно ΡƒΠΊΠ°ΠΆΠΈ Π½Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ. + +Viewer ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ для слоТных Ρ†Π²Π΅Ρ‚ΠΎΠ², transforms ΠΈ массовой Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. НС добавляй debug route Ρ€Π°Π΄ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ спрайта. + +## Диагностика + +Π‘ΠΎΠΏΠΎΡΡ‚Π°Π²ΡŒ симптом с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ ΠΈ исправляй ΠΏΠ΅Ρ€Π²ΠΎΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ: + +| Π‘ΠΈΠΌΠΏΡ‚ΠΎΠΌ | ВСроятная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° | ДСйствиС | +|---|---|---| +| `Missing sprite config file or module directory` | НС ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ | ΠŸΠ΅Ρ€Π΅Π΄Π°ΠΉ ΠΎΠ΄ΠΈΠ½ config-Ρ„Π°ΠΉΠ» Π»ΠΈΠ±ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для config-less запуска. | +| `Expected one config file or module directory` | ΠŸΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ нСсколько ΠΏΡƒΡ‚Π΅ΠΉ | Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ спрайт ΠΈ объСдини scripts. | +| `Sprite mode is required` | Mode отсутствуСт ΠΈ Π² config, ΠΈ Π² CLI | Π”ΠΎΠ±Π°Π²ΡŒ `mode` Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉ ΠΏΠΎΠ»Π½Ρ‹ΠΉ `--mode`. | +| `Unsupported sprite config extension` | ΠŸΠ΅Ρ€Π΅Π΄Π°Π½ Ρ„Π°ΠΉΠ» Π½Π΅ `.ts`, `.js` ΠΈΠ»ΠΈ `.json` | Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ config-Ρ„Π°ΠΉΠ»Π°. | +| Positive input-источник Π½Π΅ Π½Π°ΡˆΡ‘Π» SVG | Папка отсутствуСт ΠΈΠ»ΠΈ пуста, glob Π½Π΅ совпал Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ отсутствуСт ΠΈΠ»ΠΈ Π²Π΅Π΄Ρ‘Ρ‚ Π½Π΅ ΠΊ SVG | Π Π°Π·Ρ€Π΅ΡˆΠΈ источник ΠΎΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° ΠΈ ΠΈΡΠΏΡ€Π°Π²ΡŒ `input`; ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ positive-элСмСнт Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π°Ρ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ SVG. | +| Иконки ΠΈΠ· ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΠΈ Π½Π΅ появились | ΠžΡ‚ ΠΏΠ°ΠΏΠΊΠΈ оТидалось рСкурсивноС сканированиС | Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ явный glob, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `./icons/**/*.svg`; ΠΏΠ°ΠΏΠΊΠΈ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ плоско. | +| Π˜ΡΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Π°Ρ ΠΈΠΊΠΎΠ½ΠΊΠ° всё Π΅Ρ‰Ρ‘ присутствуСт | Π£ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅Ρ‚ прСфикса `!`, ΠΎΠ½ΠΎ находится Π½Π΅ Π² массивС `input` ΠΈΠ»ΠΈ считаСтся Π½Π΅ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° | Π”ΠΎΠ±Π°Π²ΡŒ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ `!`-элСмСнт ΠΈ считай Π΅Π³ΠΎ ΠΎΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°. | +| CLI Π²Ρ‹Π±Ρ€Π°Π» Π½Π΅ всС источники | НСсколько источников помСстили Π² ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `--input` ΠΈΠ»ΠΈ пропустили option | ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈ `--input ` ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ источника ΠΈΠ»ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. | +| ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΈΠ»ΠΈ SVG ID | Π”Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π° ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ basename Π»ΠΈΠ±ΠΎ hash-ID столкнулся с ΠΈΠΌΠ΅Π½Π΅ΠΌ | ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠΉ ΠΎΠ΄ΠΈΠ½ исходный SVG; Π½Π΅ Π²Ρ‹Π±ΠΈΡ€Π°ΠΉ Ρ„Π°ΠΉΠ» нСявно. | +| `Refusing to overwrite a user file` | Π’ ΠΊΠΎΡ€Π½Π΅ sprite-модуля ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ `.gitignore`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ mode Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ | НС пСрСзаписывай Ρ„Π°ΠΉΠ»: Π²Ρ‹Π±Π΅Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ sprite-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈΠ»ΠΈ согласуй пСрСнос ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ `.gitignore`. | +| НСт `.svg-sprite/index.js` ΠΈΠ»ΠΈ имя отсутствуСт Π² autocomplete | Для bare `standalone` это ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎ; Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… modes гСнСрация Π½Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Π»Π°ΡΡŒ, barrel Π½Π΅Π²Π΅Ρ€Π΅Π½ Π»ΠΈΠ±ΠΎ type server Π΄Π΅Ρ€ΠΆΠΈΡ‚ старый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ | Π‘Π²Π΅Ρ€ΡŒ exact mode, запусти sprite-ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒ `export * from './.svg-sprite/index.js'`, Π·Π°Ρ‚Π΅ΠΌ typecheck; ΠΏΡ€ΠΈ нСобходимости пСрСзапусти TypeScript server. | +| SVG Π½Π΅ загруТаСтся ΠΈΠ»ΠΈ URL Π½Π΅Π²Π΅Ρ€Π΅Π½ | Mode Π½Π΅ совпадаСт со сборщиком, Π½Π΅Π²Π΅Ρ€Π΅Π½ Webpack `publicPath` Π»ΠΈΠ±ΠΎ кастомный loader ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΠ» asset | Π‘Π²Π΅Ρ€ΡŒ mode ΠΈ build-ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒ Asset Modules/`publicPath`, ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈ generated SVG ΠΈΠ· нСсовмСстимого loader. | +| Next build расходится ΠΌΠ΅ΠΆΠ΄Ρƒ SSR ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ | ΠœΠΎΠ΄ΡƒΠ»ΡŒ сгСнСрирован для Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ bundler/router ΠΈΠ»ΠΈ URL пСрСписан Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ | Π’Π΅Ρ€Π½ΠΈ generated `new URL(...)`, Π²Ρ‹Π±Π΅Ρ€ΠΈ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Next mode ΠΈ ΠΏΠ΅Ρ€Π΅Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠΉ. | +| `color` Π½Π΅ мСняСт ΠΌΠ½ΠΎΠ³ΠΎΡ†Π²Π΅Ρ‚Π½ΡƒΡŽ ΠΈΠΊΠΎΠ½ΠΊΡƒ | Π£ ΠΈΠΊΠΎΠ½ΠΊΠΈ нСсколько ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ ΠΎΠ½Π° ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Ρ‡Π΅Ρ€Π΅Π· ``/CSS background | Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ ``/`` ΠΈ Π½ΡƒΠΆΠ½Ρ‹Π΅ `--icon-color-N`. | +| Gradient/filter выглядит Π½Π΅Π²Π΅Ρ€Π½ΠΎ | АвтозамСна Ρ†Π²Π΅Ρ‚ΠΎΠ² Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ слоТныС paint servers | Π˜Π·ΡƒΡ‡ΠΈ generated SVG; ΠΏΡ€ΠΈ нСобходимости ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈ `replaceColors` для спрайта ΠΈΠ»ΠΈ упрости источник. | +| Viewer пуст | Manifest Π½Π΅ создан, loader Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ сборщиком ΠΈΠ»ΠΈ Π½Π΅Π²Π΅Ρ€Π½Π° Client Component boundary | Π‘Π½Π°Ρ‡Π°Π»Π° сгСнСрируй спрайт, Π·Π°Ρ‚Π΅ΠΌ ΡΠ²Π΅Ρ€ΡŒ manifest import ΠΈ способ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ с exact guide; Π² App Router ΠΎΡΡ‚Π°Π²ΡŒ `'use client'` Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ Viewer. | + +ΠŸΡ€ΠΈ нСизвСстной ошибкС зафиксируй ΠΏΠΎΠ»Π½ΡƒΡŽ CLI-ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, mode, ΠΏΡƒΡ‚ΡŒ ΠΊ config-Ρ„Π°ΠΉΠ»Ρƒ ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ stack/error message. Π—Π°Ρ‚Π΅ΠΌ минимально воспроизвСди ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ спрайтС, Π½Π΅ удаляя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ управляСмый `.gitignore`. + +## ΠšΠ°Ρ€Ρ‚Π° reference-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ + +References ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ собранного skill. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹, относящиСся ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π·Π°Π΄Π°Ρ‡Π΅, Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ exact-mode guide обязатСлСн. + +### ΠžΠ±Π·ΠΎΡ€ + +- [README ΠΏΠ°ΠΊΠ΅Ρ‚Π°](./references/README_RU.md) β€” возмоТности, основной React/Next.js сцСнарий ΠΈ ссылки Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ. + +### ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ + +- [ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ](./references/docs/ru/configuration.md) β€” JSON, JavaScript, TypeScript, поля config, `input` ΠΈ запуск CLI. + +### Exact-mode guides + +- [`standalone`](./references/docs/ru/guides/standalone.md) β€” static HTML ΠΈ собствСнная публикация SVG. +- [`standalone@vite`](./references/docs/ru/guides/standalone-vite.md) β€” vanilla-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с Vite ΠΈ Web Component. +- [`standalone@webpack`](./references/docs/ru/guides/standalone-webpack.md) β€” vanilla-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с Webpack 5 ΠΈ Web Component. +- [`react@vite`](./references/docs/ru/guides/react-vite.md) β€” React с Vite. +- [`react@webpack`](./references/docs/ru/guides/react-webpack.md) β€” React с Webpack 5. +- [`next@app/turbopack`](./references/docs/ru/guides/next-app-turbopack.md) β€” Next.js App Router с Turbopack. +- [`next@app/webpack`](./references/docs/ru/guides/next-app-webpack.md) β€” Next.js App Router с Webpack. +- [`next@pages/turbopack`](./references/docs/ru/guides/next-pages-turbopack.md) β€” Next.js Pages Router с Turbopack. +- [`next@pages/webpack`](./references/docs/ru/guides/next-pages-webpack.md) β€” Next.js Pages Router с Webpack. + +### ВСхничСскиС справочники + +- [ВСхничСский справочник](./references/docs/ru/reference/technical.md) β€” requirements, CLI, naming, generated API, assets, transforms, Ρ†Π²Π΅Ρ‚Π°, Viewer, Git, CI ΠΈ диагностика. +- [ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ API](./references/docs/ru/reference/programmatic-api.md) β€” `generateSprite`, overrides, config API, compiler ΠΈ Viewer runtime. + +### Agent-specific reference + +- [Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ SVG](./references/complex-svg.md) β€” gradients, patterns, filters, masks, `url(#...)`, `viewBox`, fragment IDs ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Π°Ρ диагностика. diff --git a/skills/svg-sprites/src/ru/core/00-package-overview.md b/skills/svg-sprites/src/ru/core/00-package-overview.md deleted file mode 100644 index ffa5f06..0000000 --- a/skills/svg-sprites/src/ru/core/00-package-overview.md +++ /dev/null @@ -1,16 +0,0 @@ -## Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ - -`@gromlab/svg-sprites` β€” CLI-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ SVG-спрайтов для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… SVG-Ρ„Π°ΠΉΠ»ΠΎΠ². ΠŸΠ°ΠΊΠ΅Ρ‚ Π½Π΅ содСрТит собствСнного Π½Π°Π±ΠΎΡ€Π° ΠΈΠΊΠΎΠ½ΠΎΠΊ: ΠΎΠ½ собираСт SVG ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²ΠΎ внСшний sprite asset, создаёт Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Web Component для standalone bundler modes ΠΈ React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для React/Next.js. - -ΠŸΠ°ΠΊΠ΅Ρ‚ рассчитан Π½Π° нСсколько нСзависимых спрайтов Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ явно Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ config-Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ config-less ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ описываСт ΠΎΠ΄ΠΈΠ½ спрайт ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ собствСнныС: - -- SVG asset; -- mode-specific manifest data; -- для bundler modes β€” Ρ‚ΠΈΠΏΡ‹ ΠΈΠΌΡ‘Π½ ΠΈ production entry `.svg-sprite/index.js`; -- для `standalone@vite`/`standalone@webpack` β€” Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Web Component с явной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ рСгистрации; -- Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для React/Next.js β€” React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚; -- для bare `standalone` β€” deployment-neutral JSON manifest Π±Π΅Π· ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ URL. - -ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΈ располоТСниС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² опрСдСляСт ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. НапримСр, `name: 'file-manager'` создаёт `FileManagerIcon`, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с `name: 'navigation'` создаст ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ `NavigationIcon`. ИмСна `FileManagerIcon` ΠΈ `fileManagerIconNames` Π½ΠΈΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ API ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… спрайтов, Π° Π½Π΅ фиксированными экспортами ΠΏΠ°ΠΊΠ΅Ρ‚Π°. - -Generated production runtime ΠΈ declarations Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ `@gromlab/svg-sprites`. ГСнСрация Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· `npx --package` с зафиксированной вСрсиСй Π±Π΅Π· добавлСния package Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Устанавливай Π΅Π³ΠΎ ΠΊΠ°ΠΊ development dependency Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Viewer, package-Ρ‚ΠΈΠΏΠΎΠ² config ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ API. diff --git a/skills/svg-sprites/src/ru/core/10-mode-selection.md b/skills/svg-sprites/src/ru/core/10-mode-selection.md deleted file mode 100644 index 1791654..0000000 --- a/skills/svg-sprites/src/ru/core/10-mode-selection.md +++ /dev/null @@ -1,30 +0,0 @@ -## Π’Ρ‹Π±ΠΎΡ€ Ρ€Π΅ΠΆΠΈΠΌΠ° - -Π’Ρ‹Π±Π΅Ρ€ΠΈ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ mode key: - -| ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ | Mode key | -|---|---| -| Static HTML / собствСнная публикация | `standalone` | -| Standalone + Vite | `standalone@vite` | -| Standalone + Webpack 5 | `standalone@webpack` | -| React + Vite | `react@vite` | -| React + Webpack 5 | `react@webpack` | -| Next.js App Router + Turbopack | `next@app/turbopack` | -| Next.js App Router + Webpack 5 | `next@app/webpack` | -| Next.js Pages Router + Turbopack | `next@pages/turbopack` | -| Next.js Pages Router + Webpack 5 | `next@pages/webpack` | - -Mode задаётся Π² config, CLI ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ API. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ примСнСния: `defaults β†’ config β†’ CLI/API overrides`. ПослС объСдинСния mode обязатСлСн. - -CLI ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡƒΡ‚ΡŒ. ΠŸΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ `.ts`, `.js` ΠΈΠ»ΠΈ `.json` Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ этот ΠΊΠΎΠ½Ρ„ΠΈΠ³ нСзависимо ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ. ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ config-less Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΈ настройки ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ„Π»Π°Π³Π°ΠΌΠΈ CLI. - -```json -{ - "scripts": { - "sprite:": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites ", - "sprite::cli": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites --mode " - } -} -``` - -ГСнСрация Ρ‡Π΅Ρ€Π΅Π· `npx` Π½Π΅ добавляСт package Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π’ CI ΡƒΠΊΠ°ΠΆΠΈ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ вмСсто `latest`. НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹Π΅ `react`, `next@app`, `next@pages`, `standalone@` ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΉ `legacy`. Bare `standalone` Π²Ρ‹Π±ΠΈΡ€Π°ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ само ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅Ρ‚ SVG; для Vite/Webpack ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»Π½Ρ‹ΠΉ key. Для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… спрайтов создай ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ config-Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. diff --git a/skills/svg-sprites/src/ru/core/20-project-inspection.md b/skills/svg-sprites/src/ru/core/20-project-inspection.md deleted file mode 100644 index 9cfaecd..0000000 --- a/skills/svg-sprites/src/ru/core/20-project-inspection.md +++ /dev/null @@ -1,22 +0,0 @@ -## Π˜Π½ΡΠΏΠ΅ΠΊΡ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° - -Π”ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ установи фактичСский ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: - -1. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ `package.json`, lock-Ρ„Π°ΠΉΠ» ΠΈ workspace-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ; ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ framework, bundler ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. -2. Найди config-Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ `svg-sprites` ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹ generated-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Имя ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ΅; ориСнтируйся Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ CLI ΠΏΡƒΡ‚ΡŒ ΠΈ поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. -3. Для React ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ Vite ΠΈΠ»ΠΈ Webpack 5 ΠΏΠΎ scripts ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³Ρƒ. Для Next.js ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ App/Pages Router ΠΈ сборщик Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… `dev`/`build` ΠΊΠΎΠΌΠ°Π½Π΄. -4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ `predev`, `prebuild`, `pretypecheck` ΠΈ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ scripts. НС пСрСзаписывай ΠΈΡ…. -5. Для Π½ΠΎΠ²ΠΎΠ³ΠΎ спрайта Π²Ρ‹Π±Π΅Ρ€ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½Π΅ навязывая ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ слой ΠΈΠ»ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ прилоТСния. -6. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒ TypeScript ΠΈ alias-настройки. Для package subpath exports Π½ΡƒΠΆΠ΅Π½ TypeScript 5+ с `moduleResolution: 'bundler'`, `'node16'` ΠΈΠ»ΠΈ `'nodenext'`. - -ВсС input-ΠΏΡƒΡ‚ΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, содСрТащСго явно ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ config-Ρ„Π°ΠΉΠ»; Π² config-less Ρ€Π΅ΠΆΠΈΠΌΠ΅ β€” ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠΉ `input` ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚: - -- `input?: string | string[]` ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ `./icons`; -- каТдая строка Π·Π°Π΄Π°Ρ‘Ρ‚ ΠΏΠ°ΠΏΠΊΡƒ, Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ SVG-Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ glob; -- ΠΏΠ°ΠΏΠΊΠ° сканируСтся плоско; Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ явным recursive glob, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `./icons/**/*.svg`; -- массив ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ positive-источники, Π° элСмСнт с прСфиксом `!` ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ свои совпадСния ΠΈΠ· ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π½Π°Π±ΠΎΡ€Π°; -- ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ positive-источник Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒΡΡ хотя Π±Ρ‹ Π² ΠΎΠ΄ΠΈΠ½ SVG, поэтому ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ΠΈΠ»ΠΈ пустая ΠΏΠ°ΠΏΠΊΠ°, glob Π±Π΅Π· совпадСний, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π½Π΅ ΠΊ SVG ΡΠ²Π»ΡΡŽΡ‚ΡΡ ошибкой; -- Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ; -- Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ basename ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‚, Π΄Π°ΠΆΠ΅ Ссли ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… источников. - -НС ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉ ΠΎΠ±Ρ‰ΠΈΠΉ SVG Π² нСсколько ΠΏΠ°ΠΏΠΎΠΊ: добавь Π΅Π³ΠΎ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΈΠ»ΠΈ подходящий glob Π² `input` ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ спрайта. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ `**/*.svg` Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ рСкурсивного Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. diff --git a/skills/svg-sprites/src/ru/core/30-react-next-setup.md b/skills/svg-sprites/src/ru/core/30-react-next-setup.md deleted file mode 100644 index 30b1714..0000000 --- a/skills/svg-sprites/src/ru/core/30-react-next-setup.md +++ /dev/null @@ -1,63 +0,0 @@ -## Настройка React ΠΈΠ»ΠΈ Next.js - -Π’Ρ‹Π±Π΅Ρ€ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ спрайта. Он ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ рядом с feature, Π² ΠΎΠ±Ρ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΈΠΊΠΎΠ½ΠΎΠΊ ΠΈΠ»ΠΈ Π² любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС, принятом Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ структура являСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ: - -```text -src/ui/file-manager/svg-sprite/ -β”œβ”€β”€ icons/ -β”‚ β”œβ”€β”€ check.svg -β”‚ └── folder.svg -└── svg-sprite.config.ts -``` - -Один `svg-sprite.config.ts` создаёт ΠΎΠ΄ΠΈΠ½ нСзависимый спрайт. Для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π²Ρ‹Π±Π΅Ρ€ΠΈ нСсколько ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ Π΄Π°ΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ `name`. - -Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Начни с plain config Π±Π΅Π· package -import: - -```ts -export default { - mode: 'react@vite', - name: 'file-manager', - description: 'Иконки Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°', - input: ['./icons', '../../shared/icons/close.svg'], -} -``` - -`input` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΏΠ°ΠΏΠΊΡƒ, Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ SVG-Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ glob Π»ΠΈΠ±ΠΎ массив, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰ΠΈΠΉ эти источники. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ массива с прСфиксом `!` ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ совпадСния. Папки ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ плоско; для рСкурсии Π½ΡƒΠΆΠ΅Π½ явный glob `**/*.svg`. Если `input` Π½Π΅ Π·Π°Π΄Π°Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `./icons`. ВсС ΠΏΡƒΡ‚ΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ positive-источник Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΉΡ‚ΠΈ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ SVG. - -ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ² для React ΠΈ Next.js; отличаСтся ΠΏΠΎΠ»Π½Ρ‹ΠΉ `mode`. Устанавливай package Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Viewer, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ API ΠΈΠ»ΠΈ package-Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ config. Π’ exact guides Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ copy-paste type для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π±Π΅Π· package. - -`name` Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с латинской Π±ΡƒΠΊΠ²Ρ‹ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π² kebab-case; ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° `file-manager` Π±ΡƒΠ΄ΡƒΡ‚ созданы `FileManagerIcon`, `FileManagerIconName` ΠΈ `fileManagerIconNames`. Π”Ρ€ΡƒΠ³ΠΎΠΉ спрайт ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ собствСнныС ΠΈΠΌΠ΅Π½Π°. Если `name` Π½Π΅ Π·Π°Π΄Π°Π½, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. - -Π”ΠΎΠ±Π°Π²ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ с Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ mode key ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡƒΡ‚Ρ‘ΠΌ: - -```json -{ - "scripts": { - "sprite:file-manager": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/ui/file-manager/svg-sprite/svg-sprite.config.ts", - "sprites": "npm run sprite:file-manager" - } -} -``` - -Для Next.js ΡƒΠΊΠ°ΠΆΠΈ Π² config ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ `next@app/turbopack`. Для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… спрайтов добавь ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ `sprite:` Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ config-Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΈ ΠΈΡ… ΠΈΠ· `sprites`. - -Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ источники Ρ‡Π΅Ρ€Π΅Π· CLI, повторяй `--input `; значСния ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ массивный ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ с `!`: - -```bash -npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/ui/file-manager/svg-sprite/svg-sprite.config.ts \ - --input ./icons \ - --input '../../shared/icons/**/*.svg' \ - --input '!../../shared/icons/legacy-*.svg' -``` - -Generated-Ρ„Π°ΠΉΠ»Ρ‹ Π² `.svg-sprite` ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΈΠ· Git, поэтому запускай `sprites` Π΄ΠΎ процСссов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Ρ‚ΠΈΠΏΡ‹ ΠΈΠ»ΠΈ asset. Если ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΡ€Π΅Π½ΡŒ sprite-модуля, создай ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ `index.ts` с `export * from './.svg-sprite'`. Generated declarations self-contained ΠΈ Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ generator package. - -Запускай Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· `predev`/`prebuild`/`pretypecheck`, Π»ΠΈΠ±ΠΎ явно Π²Π½ΡƒΡ‚Ρ€ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄. НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ ΠΎΠ±Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ для ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΈΠ½Π°Ρ‡Π΅ гСнСрация выполнится Π΄Π²Π°ΠΆΠ΄Ρ‹. Бохраняй ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ Π½Π΅ создавай Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ΄Π½ΠΎΠΈΠΌΡ‘Π½Π½Ρ‹ΠΉ JSON key. - -Запусти ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ: - -```bash -npm run sprites -``` diff --git a/skills/svg-sprites/src/ru/core/40-generated-contract.md b/skills/svg-sprites/src/ru/core/40-generated-contract.md deleted file mode 100644 index 5561bfe..0000000 --- a/skills/svg-sprites/src/ru/core/40-generated-contract.md +++ /dev/null @@ -1,51 +0,0 @@ -## ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ generated-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° - -ПослС Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ React/Next-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄: - -```text -svg-sprite/ -β”œβ”€β”€ icons/ # ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ исходники -β”œβ”€β”€ svg-sprite.config.ts # Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΠΎΠ΅ имя ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° -β”œβ”€β”€ index.ts # Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ barrel -β”œβ”€β”€ .gitignore # управляСт Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ -└── .svg-sprite/ - β”œβ”€β”€ index.js - β”œβ”€β”€ index.d.ts - β”œβ”€β”€ icon-data.js - β”œβ”€β”€ icon-data.d.ts - β”œβ”€β”€ sprite.svg - β”œβ”€β”€ svg-sprite.manifest.js - β”œβ”€β”€ svg-sprite.manifest.d.ts - └── react/ - β”œβ”€β”€ react-component.js - β”œβ”€β”€ react-component.d.ts - └── react-component.module.css -``` - -Standalone Π½Π΅ создаёт `react/`. Bare `standalone` Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ `sprite.svg` ΠΈ -`svg-sprite.manifest.json`; `standalone@vite`/`standalone@webpack` Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ -Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ `index.*`, `icon-data.*` ΠΈ resolved manifest. Π˜Ρ… `index.*` Ρ‚Π°ΠΊΠΆΠ΅ -содСрТит Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ generated Web Component; bare `standalone` Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ JS runtime, -Π½Π΅ создаёт ΠΈ Π½Π΅ измСняСт `.gitignore`. - -Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉ исходныС SVG, config-Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ `index.ts`. НС измСняй Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ содСрТимоС `.svg-sprite`: повторная гСнСрация Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚. Π’ΠΎ всСх modes, ΠΊΡ€ΠΎΠΌΠ΅ bare `standalone`, generated `.gitignore` Ρ‚Π°ΠΊΠΆΠ΅ находится ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΈΠ· корня sprite-модуля создай barrel: - -```ts -export * from './.svg-sprite' -``` - -Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π²Π»Π°Π΄Π΅Π΅Ρ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ `.svg-sprite` ΠΈ замСняСт Π΅Π³ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС. Никогда Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΠΉ Ρ‚ΡƒΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹. Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ‚Π°ΠΊΠΆΠ΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ `.gitignore`, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ mode Π΅Π³ΠΎ создаёт; bare `standalone` оставляСт ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ `.gitignore` Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Generated-ΠΏΡƒΡ‚ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ symlink. - -Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ `index.js` экспортируСт ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠ· `react/react-component.js` ΠΈ readonly-массив ΠΈΠΌΡ‘Π½; сосСдний `index.d.ts` добавляСт props/style-Ρ‚ΠΈΠΏΡ‹ ΠΈ union ΠΈΠΌΠ΅Π½ΠΈ. Manifest declarations bundler modes ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ Ρ‚ΠΈΠΏΡ‹ локально ΠΈ Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ generator package. Manifest содСрТит mode, URL, target, список ΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠΊΠΎΠ½ΠΎΠΊ для debug-инструмСнтов ΠΈ Π½Π΅ импортируСтся production-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ. - -Π‘ΠΏΡ€Π°ΠΉΡ‚ остаётся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ asset с content hash; SVG path-Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² JavaScript: - -- `react@vite` Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ статичСский ΠΈΠΌΠΏΠΎΡ€Ρ‚ `sprite.svg?no-inline`, Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΡŽΡ‰ΠΈΠΉ Vite inline; -- `standalone@vite` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Vite asset-ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΈ экспортируСт href helper ΠΈ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Web Component Π±Π΅Π· React; -- `standalone@webpack` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Webpack Asset Modules ΠΈ экспортируСт Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ mode-local Web Component Π±Π΅Π· React; -- React Webpack 5 ΠΈ всС Next modes Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ `new URL('./sprite.svg', import.meta.url).href`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Asset Modules ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ сборщика; -- кастомный Webpack SVG loader Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ generated `sprite.svg`; -- Π² Next mode generated-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π΅ содСрТит `'use client'` ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Server Components, SSR ΠΈ SSG; Π½Π΅ добавляй ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π΄ΠΈ ΠΈΠΊΠΎΠ½ΠΊΠΈ; -- ΠΊΠΎΠΌΠ°Π½Π΄Π° сборки Next ΠΈ mode key Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ: Turbopack с `.../turbopack`, Webpack с `.../webpack`. - -Для bundler modes Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΠΉ generated sprite Π² `public` ΠΈ Π½Π΅ пСрСписывай URL Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Для bare `standalone` Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΠΉ managed original: ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ явно ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² deploy output ΠΈ само ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ URL ΠΈ очистку ΠΊΠΎΠΏΠΈΠΈ. ΠŸΡ€ΠΈ смСнС mode ΠΏΠ΅Ρ€Π΅Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠΉ спрайт с Π½ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΠ»Π½Ρ‹ΠΌ key. diff --git a/skills/svg-sprites/src/ru/core/50-usage-and-colors.md b/skills/svg-sprites/src/ru/core/50-usage-and-colors.md deleted file mode 100644 index 39d712e..0000000 --- a/skills/svg-sprites/src/ru/core/50-usage-and-colors.md +++ /dev/null @@ -1,87 +0,0 @@ -## ИспользованиС, Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΈ Ρ†Π²Π΅Ρ‚Π° - -Имя ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° зависит ΠΎΡ‚ `name` ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ спрайта. Π’ `standalone@vite` ΠΈ `standalone@webpack` Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `name: 'file-manager'` создаёт tag `` ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `defineFileManagerIconElement()`: - -```ts -import { defineFileManagerIconElement } from './svg-sprite' - -defineFileManagerIconElement() -``` - -```html - -``` - -Нативный элСмСнт Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ runtime-зависимостСй, сам Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ generated ID ΠΈ `viewBox`, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ URL Ρ‡Π΅Ρ€Π΅Π· bundler ΠΈ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ `` Π² Shadow DOM. Π•Π³ΠΎ property `icon` Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ union ΠΈΠΌΡ‘Π½, Π½ΠΎ строковыС HTML attributes ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² runtime. Π Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ `1em Γ— 1em`; мСняй Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· CSS Π½Π° host. Bare `standalone` Web Component Π½Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚. - -Π’ React/Next.js Ρ‚ΠΎΡ‚ ΠΆΠ΅ `name: 'file-manager'` создаёт React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `FileManagerIcon`. Для `name: 'navigation'` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ сгСнСрированный `NavigationIcon`. - -Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠ· корня ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° спрайта. `width` ΠΈ `height` Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹: Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ CSS-классом. - -```tsx -import { FileManagerIcon } from './svg-sprite' - -export const OpenButton = () => ( - ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ - -) -``` - -```css -.icon { - width: 24px; - height: 24px; - color: #4b5563; -} -``` - -`icon` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° исходных Ρ„Π°ΠΉΠ»ΠΎΠ² Π±Π΅Π· `.svg`; нСизвСстноС имя являСтся ошибкой TypeScript. Для нСбСзопасных SVG ID ΠΈΠΌΡ‘Π½ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ΅ имя, Π½ΠΎ создаёт Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ hash ID, поэтому Π½Π΅ собирай fragment URL ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. - -По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ `` ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ стандартныС SVG attributes: Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ `width`/`height`, `className`, `style`, `role`, `aria-*` ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ. Π‘ `wrapped={true}` ΠΊΠΎΡ€Π½Π΅ΠΌ становится ``, props относятся ΠΊ span, Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ SVG Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ wrapper. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Ρ†Π²Π΅Ρ‚Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ классом: - -```tsx -