Skip to content

Components

Astro Icon’s main API is an Icon component that automatically inlines an <svg> directly in your markup.

Icon

You can use the Icon component by importing it from astro-icon/components and rendering it as a normal Astro Component.

---
import { Icon } from 'astro-icon/components'
---
<!-- Embed the contents of the `/src/icons/logo.svg` file -->
<Icon name="logo" />

Because astro-icon is powered by Astro, this component only renders on the server to static HTML. It has no runtime footprint.

Props

The Icon component accepts the following properties:

interface Props extends HTMLAttributes<"svg"> {
/** The name of the icon to include */
name: string;
/** Shorthand for including a <title>{props.title}</title> element in the SVG */
title?: string;
/** Shorthand for setting width and height */
size?: number;
width?: number;
height?: number;
}

The Icon also accepts any global HTML attributes and aria attributes. They will be forwarded to the rendered <svg> element.

Automatically optimized sprites

Because Astro controls the entire rendering lifecycle for a given Request, astro-icon is able to automatically optimize repeated references to the same icon on a page.

The approach uses a novel take on the more traditional SVG Sprite system that leverages a single <svg> sprite for your entire site. The first time the Icon component is included on a page, it defines a sprite <symbol> with a unique ID and immediately renders that symbol with the <use> element. If the same icon is referenced again, Icon will render only a <use> element, reducing the overall size of your HTML document by referencing the existing <symbol>.

---
import { Icon } from 'astro-icon/components'
---
<Icon name="logo" />
<!-- First usage generates the following HTML -->
<svg data-icon="logo">
<symbol id="ai:uniqueid"><!-- contents of /src/icons/logo.svg --></symbol>
<use xlink:href="#ai:uniqueid"></use>
</svg>
<Icon name="logo" />
<!-- Additional usage generates the following HTML -->
<svg data-icon="logo">
<use xlink:href="#ai:uniqueid"></use>
</svg>

Usage with Framework Components

The <Icon /> component, like any other Astro component, cannot be used directly in UI framework components.

But, you can pass the static content generated by <Icon /> to a framework component inside a .astro file as children or using a named <slot/>:

---
import ReactComponent from './ReactComponent.jsx'
import { Icon } from "astro-icon/components"
---
<ReactComponent>
<Icon name="logo" />
</ReactComponent>