Supercharge your icons ⚡️
npm install @neodx/svgSupercharge your icons ⚡️
> We're working on the new documentation, please, visit neodx.pages.dev to see the latest version.
- TypeScript support out of box - generated types and information about your sprites
- Built-in integrated plugins for all major bundlers: vite, webpack, rollup, esbuild, etc.
- Optional grouping by folders
- Optimization with svgo
- Automatically reset colors
``shell`npm
npm install -D @neodx/svgyarn
yarn add -D @neodx/svgpnpm
pnpm add -D @neodx/svg
We're highly recommended to start with our "Getting started" guide.
> For better understanding and to access the latest version, please visit our documentation.
Our plugins are built upon unplugin
and provide a consistent interface and working principle across all multiple bundlers and frameworks.
For instance, here's an example of vite plugin with some options:
`typescript
import svg from '@neodx/svg/vite';
export default defineConfig({
plugins: [
svg({
root: 'assets',
output: 'public'
})
]
});
`
It will search for all SVG files in assets folder, group them by folders, optimize them with svgo,currentColor
reset all colors to and generate sprites in public folder.
For more details, see our Step-by-step guide.
Automate your icons and forget about colors management issues.
#### The problem
When we're working with SVG icons, we always need to control icon colors from our CSS.
Well-known approach is to use currentColor inside SVG and set color property in CSS.
However, usually, we have different issues with this approach, for example:
- Icons are automatically generated, and we can't control their content
- Icons are not generated, but we don't want to manually edit them (for example, we're using some external library)
- We have a lot of icons, and we don't want to manually edit them
- We have different SVG assets: flags, logos, etc. and we want to control their colors separately
#### The solution
To solve these issues, we're providing a powerful color reset mechanism (resetColors option, enabled by default):
- Automatically detects all colors in all forms (thx colord) from SVG content
- Enabled by default to reset all colors (you can disable it with resetColors: false)
- Multiple configurations for different colors strategies
- Granular control with colors and files filters
> Check out our documentation for more details.
> Note: If you used definitions or experimentalRuntime options before, you need to update your configuration, see Migration guide.
By default, you will get the following sprites in your output:
`diff`
public/
+ sprite-foo.svg
+ sprite-bar.svg
But this is not very good for caching, because if you change any of the SVG files,
the sprite filename won't be updated, which could result in an infinite cache.
To solve this issue and achieve content-based hashes in filenames, you need to take three steps:
1. Provide the fileName option with a hash variable (e.g. fileName: "{name}.{hash:8}.svg")metadata
2. Configure the option to get additional information about the file path by sprite name during runtimeIcon
3. Update your component (or whatever you use) to support the new runtime information
`typescript
// vite.config.ts
export default defineConfig({
plugins: [
svg({
root: 'assets',
output: 'public/sprites',
fileName: '{name}.{hash:8}.svg',
metadata: {
path: 'src/sprite.gen.ts',
runtime: {
// generate runtime metadata (path and other information) for each sprite
size: true, // will add width and height propertiesviewBox
viewBox: true // will add property`
}
}
})
]
});
In the result, you will get the following sprites in your output:
`diff`
/
├── assets
│ ├── common
│ │ ├── left.svg
│ │ └── right.svg
│ └── actions
│ └── close.svg
├── public
+ └── sprites
+ ├── common.12ghS6Uj.svg
+ └── actions.1A34ks78.svg
└── src
+ └── sprite.gen.ts
To learn how to use it,
check out our "Writing an Icon component" guide or detailed basic tutorials:
- Group and hash sprites
- Generate metadata
It's a simplified tutorial, for detailed one check our "Getting started" guide.
Our example stack details:
- vitereact
- typescript
- tailwindcss
-
We'll be working with the following icons in our project:
`diff`
/
├── assets
│ ├── common
│ │ ├── left.svg
| | ... other icons
│ │ └── right.svg
│ └── actions
│ ... other icons
│ └── close.svg
We want to generate separate sprites for each folder and use them in our React components.
`typescript
import { defineConfig } from 'vite';
import svg from '@neodx/svg/vite';
import react from '@vitejs/plugin-react';
import tsconfigPaths from 'vite-tsconfig-paths';
export default defineConfig({
plugins: [
react(),
tsconfigPaths(),
svg({
root: 'assets',
group: true,
output: 'public/sprites',
metadata: 'src/shared/ui/icon/sprite.gen.ts'
})
]
});
`
Now let's run vite (or vite build) and see what we have:
`diff`
/
├── assets
│ ├── common
│ │ ├── left.svg
│ │ └── right.svg
│ └── actions
│ └── close.svg
├── public
+ └── sprites
+ ├── common.svg
+ └── actions.svg
└── src
└── shared
└── ui
└── icon
+ └── sprite.gen.ts
Now you could visit our "Writing an Icon component" guide to learn how to use it.
- Getting started
- Group and hash sprites
- Generate metadata
- Writing an Icon component
- Working with multicolored icons
Now metadata is stable
and covered under one metadata option.
`diff``
svg({
- definitions: 'src/shared/ui/icon/sprite.gen.ts',
- experimentalRuntime: true,
+ metadata: {
+ path: 'src/shared/ui/icon/sprite.gen.ts',
+ runtime: {
+ size: true,
+ viewBox: true,
+ }
+ }
});