Top Related Projects
Universal icon framework. One syntax for FontAwesome, Material Design Icons, DashIcons, Feather Icons, EmojiOne, Noto Emoji and many other open source icon sets (over 150 icon sets and 200k icons). SVG framework, React, Vue and Svelte components!
A set of over 5500 free MIT-licensed high-quality SVG icons for you to use in your web projects.
Simply beautiful open-source icons
A scalable set of icons handcrafted with <3 by GitHub
The iconic SVG, font, and CSS toolkit
Premium hand-crafted icons built by Ionic, for Ionic apps and web apps everywhere ๐
Quick Overview
Unplugin-icons is a unified icon loader for popular icon sets, designed to work with various build tools and frameworks. It allows developers to easily use icons from multiple sources in their projects without the need for manual imports or additional configuration.
Pros
- Supports a wide range of icon sets and custom icons
- Works with multiple build tools (Vite, Webpack, Rollup, esbuild)
- On-demand icon loading for improved performance
- Easy integration with popular frameworks (Vue, React, Svelte)
Cons
- Requires additional setup compared to using icon fonts
- May increase build complexity for simple projects
- Limited customization options for some icon sets
- Potential performance impact if not used carefully with large icon sets
Code Examples
- Basic usage in Vue 3:
<template>
<IconMdiAccount />
</template>
<script setup>
import { IconMdiAccount } from '~icons'
</script>
- Custom icon component with props:
<template>
<Icon name="mdi:account" :size="24" color="red" />
</template>
<script setup>
import { Icon } from '~icons'
</script>
- Using icons in React:
import { IconMdiAccount } from '~icons'
function MyComponent() {
return (
<div>
<IconMdiAccount />
</div>
)
}
Getting Started
- Install the package:
npm i -D @iconify/json unplugin-icons
- Add the plugin to your build tool configuration (e.g., Vite):
// vite.config.js
import Icons from 'unplugin-icons/vite'
export default {
plugins: [
Icons({
compiler: 'vue3',
autoInstall: true,
}),
],
}
- Use icons in your components:
<template>
<IconMdiAccount />
</template>
<script setup>
import { IconMdiAccount } from '~icons'
</script>
Competitor Comparisons
Universal icon framework. One syntax for FontAwesome, Material Design Icons, DashIcons, Feather Icons, EmojiOne, Noto Emoji and many other open source icon sets (over 150 icon sets and 200k icons). SVG framework, React, Vue and Svelte components!
Pros of Iconify
- Larger icon set with over 100,000 icons from various collections
- Framework-agnostic, can be used with any JavaScript framework or vanilla JS
- Offers both SVG framework and icon components for popular frameworks
Cons of Iconify
- Requires additional setup and configuration compared to Unplugin Icons
- May have a larger bundle size due to the extensive icon library
- Less integrated with build tools, requiring manual import of icons
Code Comparison
Iconify:
import { Icon } from '@iconify/react';
function MyComponent() {
return <Icon icon="mdi-light:home" />;
}
Unplugin Icons:
import HomeIcon from '~icons/mdi-light/home';
function MyComponent() {
return <HomeIcon />;
}
Key Differences
- Unplugin Icons focuses on integrating with build tools for automatic imports
- Iconify provides a more extensive icon library but requires manual imports
- Unplugin Icons offers a simpler setup process for supported frameworks
- Iconify provides more flexibility for use across different environments
Both projects aim to simplify icon usage in web development, but they approach the problem from different angles. The choice between them depends on specific project requirements and developer preferences.
A set of over 5500 free MIT-licensed high-quality SVG icons for you to use in your web projects.
Pros of Tabler Icons
- Large collection of over 3,200 open-source SVG icons
- Consistent design style across all icons
- Easy to use and customize with CSS
Cons of Tabler Icons
- Limited to a single icon set
- Requires manual import and usage in projects
Code Comparison
Tabler Icons usage:
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-user" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<circle cx="12" cy="7" r="4" />
<path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2" />
</svg>
Unplugin Icons usage:
<template>
<IconCustom icon="mdi:home" />
</template>
Summary
Tabler Icons provides a comprehensive set of SVG icons with a consistent design, while Unplugin Icons offers a more flexible approach by supporting multiple icon sets and providing an easier integration with various frameworks. Tabler Icons requires manual implementation, whereas Unplugin Icons simplifies the process with its plugin system and component-based usage.
Simply beautiful open-source icons
Pros of Feather
- Simple and lightweight icon set with a consistent design style
- Easy to use and integrate directly into HTML or CSS
- Provides SVG and JavaScript versions for flexibility
Cons of Feather
- Limited to a fixed set of icons (currently 287)
- Requires manual updates to get new icons
- Less customization options compared to Unplugin Icons
Code Comparison
Feather:
<i data-feather="circle"></i>
<script>
feather.replace()
</script>
Unplugin Icons:
<template>
<IconCircle />
</template>
<script>
import { IconCircle } from '@iconify/vue'
</script>
Key Differences
Feather is a standalone icon library with a specific set of icons, while Unplugin Icons is a plugin that provides access to multiple icon sets, including Feather. Unplugin Icons offers more flexibility and customization options, such as on-demand icon loading and tree-shaking. However, Feather's simplicity and lightweight nature make it a good choice for projects that only need a basic set of icons.
Unplugin Icons supports various frameworks and build tools, making it more versatile for different development environments. It also allows for easier icon management and updates through the Iconify ecosystem. On the other hand, Feather's straightforward implementation might be preferable for smaller projects or developers who prefer a more direct approach to icon usage.
A scalable set of icons handcrafted with <3 by GitHub
Pros of Octicons
- Comprehensive set of GitHub-specific icons
- Maintained by GitHub, ensuring consistency with their design system
- Available in multiple formats (SVG, PNG, font)
Cons of Octicons
- Limited to GitHub's icon set, less versatile for general-purpose use
- Requires manual import and management in projects
- May have a larger bundle size if using the entire icon set
Code Comparison
Octicons usage:
import { MarkGithubIcon } from '@primer/octicons-react'
function App() {
return <MarkGithubIcon size={24} />
}
Unplugin Icons usage:
function App() {
return <i-mdi-github />
}
Unplugin Icons offers a more streamlined approach, automatically importing icons on-demand without explicit imports. It supports multiple icon sets and provides a unified syntax for using icons across different frameworks.
Octicons is ideal for projects closely aligned with GitHub's design language, while Unplugin Icons offers greater flexibility and ease of use for a wide range of icon sets and project types.
The iconic SVG, font, and CSS toolkit
Pros of Font-Awesome
- Extensive library of pre-designed icons
- Well-established and widely recognized in the web development community
- Supports both CSS and JavaScript implementations
Cons of Font-Awesome
- Larger file size, potentially impacting page load times
- Limited customization options for individual icons
- Requires including the entire icon set, even if only a few icons are used
Code Comparison
Font-Awesome (CSS implementation):
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
<i class="fas fa-user"></i>
unplugin-icons:
<script setup>
import IconUser from '~icons/fa/user'
</script>
<template>
<IconUser />
</template>
Key Differences
unplugin-icons offers:
- On-demand icon loading, reducing bundle size
- Integration with various icon sets beyond Font Awesome
- Tree-shaking support for better performance optimization
Font-Awesome provides:
- A consistent and familiar icon set across many websites
- Easy implementation with CSS classes
- Regular updates and additions to the icon library
Both tools serve different needs, with unplugin-icons focusing on flexibility and performance, while Font-Awesome offers a comprehensive, ready-to-use icon solution.
Premium hand-crafted icons built by Ionic, for Ionic apps and web apps everywhere ๐
Pros of Ionicons
- Comprehensive set of pre-designed icons
- Easy integration with Ionic Framework
- Supports multiple file formats (SVG, WebFont, PNG)
Cons of Ionicons
- Limited to a specific icon set
- Requires manual updates for new icons
- Larger bundle size when using the entire icon set
Code Comparison
Ionicons usage:
<ion-icon name="heart"></ion-icon>
Unplugin Icons usage:
<template>
<IconMdiHeart />
</template>
Key Differences
Unplugin Icons offers:
- On-demand icon loading from multiple icon sets
- Automatic tree-shaking for unused icons
- Integration with various build tools and frameworks
Ionicons provides:
- A curated set of icons designed specifically for mobile apps
- Consistent styling across all icons
- Built-in support for iOS and Material Design styles
Use Case Considerations
Choose Ionicons when:
- Developing Ionic Framework applications
- Needing a cohesive, pre-designed icon set
Choose Unplugin Icons when:
- Requiring icons from multiple sources
- Optimizing for minimal bundle size
- Working with various frontend frameworks and build tools
Both solutions offer easy integration, but Unplugin Icons provides more flexibility in icon selection and optimization, while Ionicons excels in providing a unified design language for mobile applications.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
unplugin-icons
Access thousands of icons as components on-demand universally.
Features
- รฐยยย Universal
- รฐยยคยน Any icon sets - ~150 popular sets with over 200,000 icons, logos, emojis, etc. Powered by Iconify.
- รฐยยยฆ Major build tools - Vite, Webpack, Rollup, Nuxt, etc. Powered by unplugin.
- รฐยยย Major frameworks - Vanilla, Web Components, React, Vue 3, Vue 2, Solid, Svelte, and more. Contribute.
- รฐยยยฑ 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 - load your custom icons to get universal integrations at ease.
- รฐยยยฒ Auto Importing - Use icons as components directly in your template.
- รฐยยฆยพ TypeScript support.
- รฐยยย Browse Icons
ย ย ย รฐยยยก Story behind this tool: Journey with Icons Continues - a blog post by Anthonyย ย ย |
vite-plugin-icons
has been renamed tounplugin-icons
, see the migration guide
Usage
Import icons names with the convention ~icons/{collection}/{icon}
and use them directly as components. Auto importing is also possible.
React
import IconAccessibility from '~icons/carbon/accessibility'
import IconAccountBox from '~icons/mdi/account-box'
function App() {
return (
<div>
<IconAccessibility />
<IconAccountBox style={{ fontSize: '2em', color: 'red' }} />
</div>
)
}
Vue
<script setup>
import IconAccessibility from '~icons/carbon/accessibility'
import IconAccountBox from '~icons/mdi/account-box'
</script>
<template>
<icon-accessibility/>
<icon-account-box style="font-size: 2em; color: red"/>
</template>
Install
Plugin
npm i -D unplugin-icons
Icons Data
We use Iconify as the icons data source (supports 100+ iconsets).
You have two ways to install them:
Install Full Collection
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, you can do:
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.
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
).
Examples
You can play online with the examples in this repo in StackBlitz, see playgrounds page.
Fork any of the online examples and reproduce the issue you're facing, then share the link with us.
Configuration
Build Tools
Vite
// vite.config.ts
import Icons from 'unplugin-icons/vite'
export default defineConfig({
plugins: [
Icons({ /* options */ }),
],
})
Rollup
// rollup.config.js
import Icons from 'unplugin-icons/rollup'
export default {
plugins: [
Icons({ /* options */ }),
],
}
Webpack
// webpack.config.js
module.exports = {
/* ... */
plugins: [
require('unplugin-icons/webpack').default({ /* options */ }),
],
}
Nuxt
Nuxt 2 and Nuxt Bridge
// nuxt.config.js
export default {
buildModules: [
['unplugin-icons/nuxt', { /* options */ }],
],
}
Nuxt 3
// nuxt.config.js
export default defineNuxtConfig({
modules: [
['unplugin-icons/nuxt', { /* options */ }]
],
})
Or work with unplugin-vue-components resolvers
import ViteComponents from 'unplugin-vue-components/vite'
import IconsResolver from 'unplugin-icons/resolver'
// nuxt.config.ts
export default defineNuxtConfig({
modules: [
'unplugin-icons/nuxt',
],
vite: {
plugins: [
ViteComponents({
resolvers: [
IconsResolver({/* options */}),
],
}),
],
},
})
See the Nuxt example for a working example project.
Vue CLI
// vue.config.js
module.exports = {
configureWebpack: {
plugins: [
require('unplugin-icons/webpack').default({ /* options */ }),
],
},
}
You can also rename the Vue configuration file to vue.config.mjs
and use static import syntax (you should use latest @vue/cli-service ^5.0.8
):
// vue.config.mjs
import Icons from 'unplugin-icons/webpack'
export default {
configureWebpack: {
plugins: [
Icons({ /* options */ }),
],
},
}
SvelteKit
The unplugin-icons
plugin should be configured in the vite.config.js
configuration file:
// 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.
See the SvelteKit example for a working example project.
Svelte + Vite
Svelte support requires the @sveltejs/vite-plugin-svelte
plugin:
npm i -D @sveltejs/vite-plugin-svelte
The unplugin-icons
plugin should be configured in the vite.config.js
configuration file:
// 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.
See the Svelte + Vite example for a working example project.
Next.js
The unplugin-icons
plugin should be configured on next.config.js
configuration file:
// next.config.js
/** @type {import('next').NextConfig} */
module.exports = {
reactStrictMode: true,
webpack(config) {
config.plugins.push(
require('unplugin-icons/webpack').default({
compiler: 'jsx',
jsx: 'react'
})
)
return config
},
}
You can also rename the Next configuration file to next.config.mjs
and use static import syntax:
// next.config.mjs
import Icons from 'unplugin-icons/webpack'
/** @type {import('next').NextConfig} */
export default {
reactStrictMode: true,
webpack(config) {
config.plugins.push(
Icons({
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:
import IconArrowRight from '~icons/dashicons/arrow-right.jsx';
// ^-- write `.jsx` to avoid
// https://github.com/antfu/unplugin-icons/issues/103
// ...some code later
<IconArrowRight />
See the Next.js example for a working example project.
esbuild
// esbuild.config.js
import { build } from 'esbuild'
import Icons from 'unplugin-icons/esbuild'
build({
/* ... */
plugins: [
Icons({
/* options */
}),
],
})
Astro
// astro.config.mjs
import { defineConfig } from 'astro/config'
import Icons from 'unplugin-icons/vite'
// https://astro.build/config
export default defineConfig({
vite: {
plugins: [
Icons({
compiler: 'astro',
}),
],
},
})
See the Astro example for a working example project.
Astro + Vue
Required @astrojs/vue installed.
// astro.config.mjs
import { defineConfig } from 'astro/config'
import Vue from '@astrojs/vue'
import Icons from 'unplugin-icons/vite'
// https://astro.build/config
export default defineConfig({
integrations: [
Vue(),
],
vite: {
plugins: [
Icons({
compiler: 'vue3',
}),
],
},
})
See the Astro + Vue example for a working example project.
Frameworks
Vue 3 / Vue 2.7+
Vue 3 / Vue 2.7+ support requires peer dependency @vue/compiler-sfc
:
npm i -D @vue/compiler-sfc
Icons({ compiler: 'vue3' })
Type Declarations
// tsconfig.json
{
"compilerOptions": {
"types": [
"unplugin-icons/types/vue",
]
}
}
See the Vue 3 example for a working example project.
Vue 2 (only for versions < 2.7)
Vue 2 support requires peer dependency vue-template-compiler
:
npm i -D vue-template-compiler
Icons({ compiler: 'vue2' })
Type Declarations
// tsconfig.json
{
"compilerOptions": {
"types": [
"unplugin-icons/types/vue",
]
}
}
See the Vue 2 example for a working example project.
React
JSX support requires peer dependency @svgr/core
and its plugin @svgr/plugin-jsx
:
npm i -D @svgr/core @svgr/plugin-jsx
Icons({ compiler: 'jsx', jsx: 'react' })
Type Declarations
// tsconfig.json
{
"compilerOptions": {
"types": [
"unplugin-icons/types/react",
]
}
}
See the React example for a working example project.
Preact
JSX support requires peer dependency @svgr/core
and its plugin @svgr/plugin-jsx
:
npm i -D @svgr/core @svgr/plugin-jsx
Icons({ compiler: 'jsx', jsx: 'preact' })
Type Declarations
// tsconfig.json
{
"compilerOptions": {
"types": [
"unplugin-icons/types/preact",
]
}
}
See the Preact example for a working example project.
Solid
Icons({ compiler: 'solid' })
Type Declarations
// tsconfig.json
{
"compilerOptions": {
"types": [
"unplugin-icons/types/solid",
]
}
}
See the Solid example for a working example project.
Svelte
Icons({ compiler: 'svelte' })
Type Declarations
For SvelteKit, in the src/app.d.ts
file:
import 'unplugin-icons/types/svelte'
For Svelte + Vite, in the src/vite-env.d.ts
file:
/// <reference types="svelte" />
/// <reference types="vite/client" />
/// <reference types="unplugin-icons/types/svelte" />
If you're still using Svelte 3, replace the reference to use Svelte 3:
/// <reference types="svelte" />
/// <reference types="vite/client" />
/// <reference types="unplugin-icons/types/svelte3" />
See the Svelte example for a working example project.
Astro
Type Declarations
// tsconfig.json
{
"compilerOptions": {
"types": [
"unplugin-icons/types/astro",
]
}
}
See the Astro example for a working example project.
Astro + Vue
Only the Vue type declarations are required:
// tsconfig.json
{
"compilerOptions": {
"types": [
"unplugin-icons/types/vue"
]
}
}
See the Astro + Vue example for a working example project.
Qwik
Qwik support requires peer dependency @svgx/core
:
npm i -D @svgx/core
Icons({ compiler: 'qwik' })
Alternatively, you can use jsx
compiler, requires peer dependency @svgr/core
and its plugin @svgr/plugin-jsx
:
npm i -D @svgr/core @svgr/plugin-jsx
Icons({ compiler: 'jsx', jsx: 'qwik' })
Type Declarations
// tsconfig.json
{
"compilerOptions": {
"types": [
"unplugin-icons/types/qwik",
]
}
}
See the Qwik example for a working example project.
Use RAW compiler from query params
From v0.13.2
you can also use raw
compiler to access the svg
icon and use it on your html templates, just add raw
to the icon query param.
For example, using vue3
:
<script setup lang='ts'>
import RawMdiAlarmOff from '~icons/mdi/alarm-off?raw&width=4em&height=4em'
import RawMdiAlarmOff2 from '~icons/mdi/alarm-off?raw&width=1em&height=1em'
</script>
<template>
<!-- raw example -->
<pre>
import RawMdiAlarmOff from '~icons/mdi/alarm-off?raw&width=4em&height=4em'
{{ RawMdiAlarmOff }}
import RawMdiAlarmOff2 from '~icons/mdi/alarm-off?raw&width=1em&height=1em'
{{ RawMdiAlarmOff2 }}
</pre>
<!-- svg example -->
<span v-html="RawMdiAlarmOff" />
<span v-html="RawMdiAlarmOff2" />
</template>
Custom Icons
From v0.11
, you can now load your own icons!
From v0.13
you can also provide a transform callback to FileSystemIconLoader
.
import { promises as fs } from 'node:fs'
// loader helpers
import { FileSystemIconLoader } from 'unplugin-icons/loaders'
Icons({
customCollections: {
// key as the collection name
'my-icons': {
account: '<svg><!-- ... --></svg>',
// load your custom icon lazily
settings: () => fs.readFile('./path/to/my-icon.svg', 'utf-8'),
/* ... */
},
'my-other-icons': async (iconName) => {
// your custom loader here. Do whatever you want.
// for example, fetch from a remote server:
return await fetch(`https://example.com/icons/${iconName}.svg`).then(res => res.text())
},
// a helper to load icons from the file system
// files under `./assets/icons` with `.svg` extension will be loaded as it's file name
// you can also provide a transform callback to change each icon (optional)
'my-yet-other-icons': FileSystemIconLoader(
'./assets/icons',
svg => svg.replace(/^<svg /, '<svg fill="currentColor" '),
),
},
})
Then use as
import IconAccount from '~icons/my-icons/account'
import IconFoo from '~icons/my-other-icons/foo'
import IconBar from '~icons/my-yet-other-icons/bar'
รฐยยยก SVG Authoring Tips:
- To make your icons color adaptable, set
fill="currentColor"
orstroke="currentColor"
in your SVG.- Leave the
height
andwidth
unspecified, we will set them for you.
Use with Resolver
When using resolvers for auto-importing, you will need to tell it your custom collection names:
IconResolver({
customCollections: [
'my-icons',
'my-other-icons',
'my-yet-other-icons',
],
})
See the Vue 3 + Vite example.
Use Custom External Collection Packages
From version v0.18.3
you can use other packages to load icons from others authors.
WARNING: external packages must include icons.json
file with the icons
data in IconifyJSON
format, which can be exported with Iconify Tools. Check Exporting icon set as JSON package for more details.
For example, you can use an-awesome-collection
or @my-awesome-collections/some-collection
to load your custom or third party icons:
// loader helpers
import { ExternalPackageIconLoader } from 'unplugin-icons/loaders'
Icons({ customCollections: ExternalPackageIconLoader('my-awesome-collection') })
When using with resolvers for auto-importing, remember you will need to tell it your custom collection names:
IconResolver({
customCollections: [
'my-awesome-collection',
],
})
You can also combine it with FileSystemIconLoader
or with other custom icon loaders:
// loader helpers
import { ExternalPackageIconLoader, FileSystemIconLoader } from 'unplugin-icons/loaders'
Icons({
customCollections: {
...ExternalPackageIconLoader('an-awesome-collection'),
...ExternalPackageIconLoader('@my-awesome-collections/some-collection'),
...ExternalPackageIconLoader('@my-awesome-collections/some-other-collection'),
'my-yet-other-icons': FileSystemIconLoader(
'./assets/icons',
svg => svg.replace(/^<svg /, '<svg fill="currentColor" '),
),
},
})
See the Vue 3 + Vite example.
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:
import { promises as fs } from 'node:fs'
// loader helpers
import { FileSystemIconLoader } from 'unplugin-icons/loaders'
Icons({
customCollections: {
// key as the collection name
'my-icons': {
account: '<svg><!-- ... --></svg>',
// load your custom icon lazily
settings: () => fs.readFile('./path/to/my-icon.svg', 'utf-8'),
/* ... */
},
'my-other-icons': async (iconName) => {
// your custom loader here. Do whatever you want.
// for example, fetch from a remote server:
return await fetch(`https://example.com/icons/${iconName}.svg`).then(res => res.text())
},
// a helper to load icons from the file system
// files under `./assets/icons` with `.svg` extension will be loaded as it's file name
// you can also provide a transform callback to change each icon (optional)
'my-yet-other-icons': FileSystemIconLoader(
'./assets/icons',
svg => svg.replace(/^<svg /, '<svg fill="currentColor" '),
),
},
iconCustomizer(collection, icon, props) {
// customize all icons in this collection
if (collection === 'my-other-icons') {
props.width = '4em'
props.height = '4em'
}
// customize this icon in this collection
if (collection === 'my-icons' && icon === 'account') {
props.width = '6em'
props.height = '6em'
}
// customize this @iconify icon in this collection
if (collection === 'mdi' && icon === 'account') {
props.width = '2em'
props.height = '2em'
}
},
})
or you can use query
params to apply to individual icons:
<script setup lang='ts'>
import MdiAlarmOff from 'virtual:icons/mdi/alarm-off?width=4em&height=4em'
import MdiAlarmOff2 from 'virtual:icons/mdi/alarm-off?width=1em&height=1em'
</script>
<template>
<!-- width=4em and height=4em -->
<mdi-alarm-off />
<!-- width=4em and height=4em -->
<MdiAlarmOff />
<!-- width=1em and height=1em -->
<MdiAlarmOff2 />
</template>
See src/App.vue
component and vite.config.ts
configuration on vite-vue3
example project.
Global Custom Icon Transformation
From version 0.14.2
, when loading your custom icons, you can transform them, for example adding fill
attribute with currentColor
:
Icons({
customCollections: {
// key as the collection name
'my-icons': {
account: '<svg><!-- ... --></svg>',
/* ... */
},
},
transform(svg, collection, icon) {
// apply fill to this icon on this collection
if (collection === 'my-icons' && icon === 'account')
return svg.replace(/^<svg /, '<svg fill="currentColor" ')
return svg
},
})
Advanced Custom Icon Set Cleanup
When using this plugin with your custom icons, consider using a cleanup process similar to that done by Iconify for any icons sets. All the tools you need are available in Iconify Tools.
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 article from Iconify for more details.
Migrate from vite-plugin-icons
package.json
{
"devDependencies": {
- "vite-plugin-icons": "*",
+ "unplugin-icons": "^0.7.0",
}
}
vite.config.json
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
- 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:
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
Vue 2 & 3
Use with unplugin-vue-components
For example in Vite:
// 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.
<template>
<i-carbon-accessibility/>
<i-mdi-account-box style="font-size: 2em; color: red"/>
</template>
React & Solid
Use with unplugin-auto-import
For example in Vite:
// vite.config.js
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'
import AutoImport from 'unplugin-auto-import/vite'
export default {
plugins: [
/* ... */
AutoImport({
resolvers: [
IconsResolver({
prefix: 'Icon',
extension: 'jsx',
}),
],
}),
Icons({
compiler: 'jsx', // or 'solid'
}),
],
}
Then you can use any icons with the prefix Icon
as you want without explicit importing. Type declarations will be generated on the fly.
export function Component() {
return (
<div>
<IconCarbonApps />
<IconMdiAccountBox style="font-size: 2em; color: red" />
</div>
)
}
Name Conversion
When using component resolver, you have to follow the name conversion for icons to be properly inferred.
{prefix}-{collection}-{icon}
The collection
field follows Iconify's collection IDs.
By default, the prefix is set to i
while you can customize via config
IconsResolver({
prefix: 'icon', // <--
})
<template>
<icon-mdi-account />
</template>
Non-prefix mode is also supported
IconsResolver({
prefix: false, // <--
// this is optional, default enabling all the collections supported by Iconify
enabledCollections: ['mdi'],
})
<template>
<mdi-account />
</template>
Collection Aliases
When using component resolver, you have to use the name of the collection that can be long or redundant: for example,
when using icon-park
collection you need to use it like this <icon-icon-park-abnormal />
.
You can add an alias for any collection to the IconResolver
plugin:
IconsResolver({
alias: {
park: 'icon-park',
fas: 'fa-solid',
// ...
}
})
You can use the alias or the collection name, the plugin will resolve both.
Following with the example and configuring the plugin with previous alias
entry, you can now use
<icon-park-abnormal />
or <icon-icon-park-abnormal />
.
Sponsors
This project is part of my Sponsor Program
License
MIT License รยฉ 2020-PRESENT Anthony Fu
Top Related Projects
Universal icon framework. One syntax for FontAwesome, Material Design Icons, DashIcons, Feather Icons, EmojiOne, Noto Emoji and many other open source icon sets (over 150 icon sets and 200k icons). SVG framework, React, Vue and Svelte components!
A set of over 5500 free MIT-licensed high-quality SVG icons for you to use in your web projects.
Simply beautiful open-source icons
A scalable set of icons handcrafted with <3 by GitHub
The iconic SVG, font, and CSS toolkit
Premium hand-crafted icons built by Ionic, for Ionic apps and web apps everywhere ๐
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot