Files
svg-sprites/docs/en/guides/standalone-vite.md
2026-07-14 16:11:39 +03:00

4.1 KiB

Standalone Vite SVG Sprite Quick Start

This guide targets the exact mode key standalone@vite: a native generated Web Component with Vite-managed SVG assets.

1. Generate the sprite

No package installation and no package.json dependency are needed. npx downloads the CLI temporarily, and generated runtime does not import @gromlab/svg-sprites.

Keep the config and source icons together:

src/ui/icons/
├── icons/
│   ├── check.svg
│   └── folder.svg
└── svg-sprite.config.ts

Use a plain default object export with no package import:

// src/ui/icons/svg-sprite.config.ts
export default {
  mode: 'standalone@vite',
  name: 'icons',
}

When input is omitted, SVG files are read from ./icons relative to the config. A .js config with a default export and a .json config are also supported. Generate once directly with:

npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/ui/icons/svg-sprite.config.ts

Use the exact Vite dev/build commands and generate once per invocation:

{
  "scripts": {
    "sprites": "npx --yes --package=@gromlab/svg-sprites@latest svg-sprites src/ui/icons/svg-sprite.config.ts",
    "dev": "npm run sprites && vite",
    "build": "npm run sprites && vite build"
  }
}

Do not add predev or prebuild hooks to these scripts; that would run generation twice. In CI, replace latest with an exact package version.

Generation creates a local .gitignore; commit that file once, but do not commit .svg-sprite/. The generated JavaScript and declarations live together, and the declarations are self-contained: they do not require @gromlab/svg-sprites.

Production usage

Register the generated element once, then use <icons-icon>:

// src/main.ts
import {
  defineIconsIconElement,
  iconsIconNames,
} from './ui/icons/.svg-sprite/index.js'

defineIconsIconElement()
console.log('Available icons:', iconsIconNames)
<icons-icon icon="check" role="img" aria-label="Complete"></icons-icon>

The host is 1em by 1em, so font-size controls its default size. Transformed colors use currentColor and custom properties such as --icon-color-1:

icons-icon {
  font-size: 24px;
  color: #2563eb;
  --icon-color-2: #dbeafe;
}

Vite handles the generated sprite.svg?no-inline import automatically and emits a separate asset. If your own TypeScript source imports Vite query assets, include Vite's ambient types:

{
  "compilerOptions": {
    "types": ["vite/client"]
  }
}

2. Debug and preview

This section is optional. Only users who need the Viewer or icon previews should install:

npm install --save-dev @gromlab/svg-sprites

Register the Viewer element, import its type, and assign the generated JavaScript manifest to sources:

import '@gromlab/svg-sprites/viewer/element'
import type { SpriteViewerElement } from '@gromlab/svg-sprites/viewer'
import spriteManifest from './ui/icons/.svg-sprite/svg-sprite.manifest.js'

document.querySelector<HTMLDivElement>('#debug')!.innerHTML = `
  <gromlab-sprite-viewer viewer-title="Project icons"></gromlab-sprite-viewer>
`

const viewer = document.querySelector<SpriteViewerElement>('gromlab-sprite-viewer')!
viewer.sources = [spriteManifest]

Keep this code on a debug route or in an internal tool. Viewer is not part of the production icon runtime.

3. Type the config

Choose one of these two paths.

With a local package installation

After installing the package locally, use the helper:

import { defineSpriteConfig } from '@gromlab/svg-sprites'

export default defineSpriteConfig({
  mode: 'standalone@vite',
  name: 'icons',
})

You can alternatively import type SpriteConfig and apply satisfies SpriteConfig.

Without the package

Copy a mode-specific type directly into the config:

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