THIS IS A FORK OF THE ORIGINAL ASTRO ICON COMPONENT
A straight-forward Icon
component for Astro.
npm i astro-icon
# or
yarn add astro-icon
astro-icon
automatically includes all of the most common icon packs, powered by Iconify!
To browse supported icons, check the official Icon Sets reference or visit Icônes.
Icon will inline the SVG directly in your HTML.
---
import { Icon } from 'astro-icon'
---
<!-- Automatically fetches and inlines Material Design Icon's "account" SVG -->
<Icon pack="mdi" name="account" />
<!-- Equivalent shorthand -->
<Icon name="mdi:account" />
Sprite will reference the SVG from a spritesheet via <use>
.
---
import { Sprite } from 'astro-icon'
---
<!-- Required ONCE per page as a parent of any <Sprite> components! Creates `<symbol>` for each icon -->
<!-- Can also be included in your Layout component! -->
<Sprite.Provider>
<!-- Automatically fetches and inlines Material Design Icon's "account" SVG -->
<Sprite pack="mdi" name="account" />
<!-- Equivalent shorthand -->
<Sprite name="mdi:account" />
</Sprite.Provider>
You may also create Local Icon Packs.
By default, astro-icon
supports custom local svg
icons. They are optimized with svgo
automatically with no extra build step. See "A Pretty Good SVG Icon System" from CSS Tricks.
- Create a directory inside of
src/
namedicons/
. - Add each desired icon as an individual
.svg
file tosrc/icons/
- Reference a specific icon file using the
name
prop.
Icon will inline the SVG directly in your HTML.
---
import { Icon } from 'astro-icon';
---
<!-- Loads the SVG in `/src/icons/filename.svg` -->
<Icon name="filename" />
Sprite will reference the SVG from a spritesheet via <use>
.
---
import { Sprite } from 'astro-icon';
---
<!-- Required ONCE per page as a parent of any <Sprite> components! Creates `<symbol>` for each icon -->
<!-- Can also be included in your Layout component! -->
<Sprite.Provider>
<!-- Uses the sprite from `/src/icons/filename.svg` -->
<Sprite name="filename" />
</Sprite.Provider>
astro-icon
supports custom local icon packs. These are also referenced with the pack
and/or name
props.
- Create a directory inside of
src/
namedicons/
. - Inside that directory, create a JS/TS file with your
pack
name inside of that directory, egsrc/icons/my-pack.ts
- Export a
default
function that takes an icon name and returns a svg string. Utilize thecreateIconPack
utility to handle most common situations.
If using a package from NPM, eg. heroicons
, the icon pack file would resemble the following:
import { createIconPack } from "astro-icon/pack";
// Resolves `heroicons` dependency and reads SVG files from the `heroicons/outline` directory
export default createIconPack({ package: "heroicons", dir: "outline" });
If using an icon set from a remote server, the icon pack file would resemble the following:
import { createIconPack } from "astro-icon/pack";
// Resolves `name` from a remote server, like GitHub! Notice that the `dir` option is not required
export default createIconPack({
url: "https://raw.githubusercontent.com/radix-ui/icons/master/packages/radix-icons/icons/",
});
If you have custom constraints, you can always create the resolver yourself. Export a default
function that resolves the name
argument to an SVG string.
import { loadMyPackSvg } from "my-pack";
export default async (name: string): Promise<string> => {
const svgString = await loadMyPackSvg(name);
return svgString;
};
Styling your astro-icon
is straightforward. Any styles can be targeted to the [astro-icon]
attribute selector. If you want to target a specific icon, you may target it by name using [astro-icon="filename"]
.
---
import { Icon } from 'astro-icon';
---
<style lang="css">
[astro-icon] {
color: blue;
/* OR */
fill: blue;
}
[astro-icon="annotation"] {
color: red;
/* OR */
fill: red;
}
</style>
<Icon name="adjustment" /> <!-- will be blue -->
<Icon name="annotation" /> <!-- will be red -->
<!-- Example using Tailwind to apply color -->
<Icon name="annotation" class="text-red-500" /> <!-- will be red-500 -->
<Icon>
and <Sprite>
share the same interface.
The name
prop references a specific icon. It is required.
The optimize
prop is a boolean. Defaults to true
. In the future it will control svgo
options.
Both components also accepts any global HTML attributes and aria
attributes. They will be forwarded to the rendered <svg>
element.
The customFill
prop takes a string and is not required. If you want to pass a custom fill
color to the <path>
element in the <svg>
, you can use the customFill
prop. This can be useful for icons that have multiple colors or gradients.
---
import { Icon } from "astro-icon";
---
<!-- You can pass in anything that the normal fill attribute would accept -->
<Icon customFill="#1DA1F2" class="bigIcon" pack="mdi" name="twitter" />
<!-- To do a gradient, you have to include another svg element with the gradient and reference that is the Icons customFill -->
<Icon customFill="url('#rg')" class="bigIcon" pack="mdi" name="instagram" />
<!-- The gradient svg for the example -->
<svg width="0" height="0">
<radialGradient id="rg" r="150%" cx="30%" cy="107%">
<stop stop-color="#fdf497" offset="0"></stop>
<stop stop-color="#fdf497" offset="0.05"></stop>
<stop stop-color="#fd5949" offset="0.45"></stop>
<stop stop-color="#d6249f" offset="0.6"></stop>
<stop stop-color="#285AEB" offset="0.9"></stop>
</radialGradient>
</svg>
See the Props.ts
file for more details.
When an icon is not found, Icon
uses a fallback icon of a black box. This is likely either a typo on the name
prop or a missing svg file in the src/icons
folder.