Access thousands of icons as components **on-demand** universally.
### Features
- 🌏 Universal
- 🤹 **Any** icon sets - 100+ popular sets with over 10,000 icons, logos, emojis, etc. Powered by [Iconify](https://github.com/iconify/iconify).
- 📦 **Major** build tools - Vite, Webpack, Rollup, Nuxt, etc. Powered by [unplugin](https://github.com/unjs/unplugin).
- 🪜 **Major** frameworks - Vanilla, Web Components, React, Vue 3, Vue 2, Solid, Svelte, and more. [Contribute](./src/core/compiles).
- 🍱 **Any** combinations of them!
- ☁️ On-demand - Only bundle the icons you really use, while having all the options.
- 🖨 SSR / SSG friendly - Ship the icons with your page, no more FOUC.
- 🌈 Stylable - Change size, color, or even add animations as you would with styles and classes.
- 📥 [Custom icons](#custom-icons) - load your custom icons to get universal integrations at ease.
- 📲 [Auto Importing](#auto-importing) - Use icons as components directly in your template.
- 🦾 TypeScript support.
- 🔍 [Browse Icons](https://icones.js.org/)
<table><td><br>
💡 **Story behind this tool**: [Journey with Icons Continues](https://antfu.me/posts/journey-with-icons-continues) - a blog post by Anthony
</td></table>
> **`vite-plugin-icons` has been renamed to `unplugin-icons`**, see the [migration guide](#migrate-from-vite-plugin-icons)
## Usage
Import icons names with the convention `~icons/{collection}/{icon}` and use them directly as components. [Auto importing is also possible](#auto-importing).
###### React
```jsx
import IconAccessibility from '~icons/carbon/accessibility'
import IconAccountBox from '~icons/mdi/account-box'
We use [Iconify](https://iconify.design/) as the icons data source (supports 100+ iconsets).
You have two ways to install them:
###### Install Full Collection
```bash
npm i -D @iconify/json
```
`@iconify/json` (~120MB) includes all the iconsets from Iconify so you can install once and use any of them as you want (only the icons you actually use will be bundle into the production build).
###### Install by Icon Set
If you only want to use a few of the icon sets and don't want to download the entire collection, you can also install them individually with `@iconify-json/[collection-id]`.
For example, to install [Material Design Icons](https://icon-sets.iconify.design/mdi/), you can do:
```bash
npm i -D @iconify-json/mdi
```
To boost your workflow, it's also possible to let `unplugin-icons` handle that installation by enabling the `autoInstall` option.
```ts
Icons({
// experimental
autoInstall: true,
})
```
It will install the icon set when you import them. The right package manager will be auto-detected (`npm`, `yarn` or `pnpm`).
The `unplugin-icons` plugin should be configured in the `vite.config.js` configuration file:
```ts
// vite.config.js
import { defineConfig } from 'vite'
import { sveltekit } from '@sveltejs/kit/vite'
import Icons from 'unplugin-icons/vite'
export default defineConfig({
plugins: [
sveltekit(),
Icons({
compiler: 'svelte',
})
]
})
```
Check instructions in the `Frameworks -> Svelte` section below if you faced module import errors.
<br></details>
<details>
<summary>Svelte + Vite</summary><br>
Svelte support requires the `@sveltejs/vite-plugin-svelte` plugin:
```shell
npm i -D @sveltejs/vite-plugin-svelte
```
The `unplugin-icons` plugin should be configured in the `vite.config.js` configuration file:
```ts
// vite.config.js
import { defineConfig } from 'vite'
import { svelte } from '@sveltejs/vite-plugin-svelte'
import Icons from 'unplugin-icons/vite'
export default defineConfig({
plugins: [
svelte(),
Icons({
compiler: 'svelte',
}),
],
})
```
Check instructions in the `Frameworks -> Svelte` section below if you faced module import errors.
<br></details>
<details>
<summary>Next.js</summary><br>
The `unplugin-icons` plugin should be configured on `next.config.js` configuration file:
```js
/** @type {import('next').NextConfig} */
module.exports = {
reactStrictMode: true,
webpack(config) {
config.plugins.push(
require('unplugin-icons/webpack')({
compiler: 'jsx',
jsx: 'react',
}),
)
return config
},
}
```
Check instructions in the `Frameworks -> React` section below if you faced module import errors.
⚠️ **Warning:** to import an icon is necessary to explicitly add the `.jsx` extension to the import path, so that Next.js knows how to load it, by example:
<!-- eslint-skip -->
```ts
import IconArrowRight from '~icons/dashicons/arrow-right.jsx';
import IconBar from '~icons/my-yet-other-icons/bar'
```
> 💡 SVG Authoring Tips:
> - To make your icons color adaptable, set `fill="currentColor"` or `stroke="currentColor"` in your SVG.
> - Leave the `height` and `width` unspecified, we will set them for you.
### Use with Resolver
When using with resolvers for auto-importing, you will need to tell it your custom collection names:
```ts
IconResolver({
customCollections: [
'my-icons',
'my-other-icons',
'my-yet-other-icons',
],
})
```
See the [Vue 3 + Vite example](./examples/vite-vue3/vite.config.ts).
## Icon customizer
From `v0.13` you can also customize each icon using `iconCustomizer` configuration option or using query params when importing them.
The `query` param will take precedence over `iconCustomizer` and `iconCustomizer` over `configuration`.
The `iconCustomizer` and `query` params will be applied to any collection, that is, for each icon from `custom` loader, `inlined` on `customCollections` or from `@iconify`.
For example, you can configure `iconCustomizer` to change all icons for a collection or individual icons on a collection:
When using this plugin with your custom icons, consider using a cleanup process similar to that done by [Iconify](https://iconify.design/) for any icons sets. All the tools you need are available in [Iconify Tools](https://docs.iconify.design/tools/tools2/).
You can check this repo, using `unplugin-icons` on a `SvelteKit` project: https://github.com/iconify/tools/tree/main/%40iconify-demo/unplugin-svelte.
Read [Cleaning up icons](https://docs.iconify.design/articles/cleaning-up-icons/) article from [Iconify](https://iconify.design/) for more details.
## Migrate from `vite-plugin-icons`
`package.json`
```diff
{
"devDependencies": {
- "vite-plugin-icons": "*",
+ "unplugin-icons": "^0.7.0",
}
}
```
`vite.config.json`
```diff
import Components from 'unplugin-vue-components/vite'
- import Icons, { ViteIconsResolver } from 'vite-plugin-icons'
+ import Icons from 'unplugin-icons/vite'
+ import IconsResolver from 'unplugin-icons/resolver'
export default {
plugins: [
Vue(),
Components({
resolvers: [
IconsResolver()
],
}),
Icons(),
],
}
```
`*` - imports usage
```diff
- import IconComponent from 'virtual:vite-icons/collection/name'
+ import IconComponent from '~icons/collection/name'
```
> You can still use `virtual:icons` prefix in Vite if you prefer, but it's not yet supported in Webpack, we are unifying it as a workaround in the docs.
## Options
You can set default styling for all icons.
The following config shows the default values of each option:
```ts
Icons({
scale: 1.2, // Scale of icons against 1em
defaultStyle: '', // Style apply to icons
defaultClass: '', // Class names apply to icons
compiler: null, // 'vue2', 'vue3', 'jsx'
jsx: 'react', // 'react' or 'preact'
})
```
## Auto Importing
<details>
<summary>Vue 2 & 3</summary><br>
Use with [`unplugin-vue-components`](https://github.com/antfu/unplugin-vue-components)
For example in Vite:
```js
// vite.config.js
import Vue from '@vitejs/plugin-vue'
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'
import Components from 'unplugin-vue-components/vite'
export default {
plugins: [
Vue(),
Components({
resolvers: [
IconsResolver(),
],
}),
Icons(),
],
}
```
Then you can use any icons as you want without explicit importing. Only the used icons will be bundled.