Icon
<sl-icon> | SlIcon
            Icons are symbols that can be used to represent various options within an application.
FontAwesome icons
You can find FontAwesome icons here
            If no name prefix is applied to the name attribute, the regular icon variant is used. Regular
            icons can also be used via the ‘far-’ prefix.
          
To use a ‘solid’ icon, prefix the name with fas-.
To use a brand icon, prefix the name with fab-.
To use a light icon, prefix the name with fal-.
To keep the size of deployments to a minimum, we only include the icons that are needed. To add an icon that is not already included, copy the SVG file from the ZIP file in the root folder of this repository into the corresponding `src/icons/fontawesome/svgs/{solid/light/regular/brands}` folder.
Icons from the solid, regular, light and brands categories are available for inclusion. To add other variants, it will be necessary to modify `src/register-font-awesome.js` and define a new prefix for that variant.
<p><sl-icon title='gear' name="gear"></sl-icon> gear</p> <p><sl-icon title='far-gear' name="far-gear"></sl-icon> far-gear</p> <p><sl-icon title='fal-gear' name="fal-gear"></sl-icon> fal-gear</p> <p><sl-icon title='fas-circle-check' name="fas-circle-check"></sl-icon> fas-circle-check</p> <p><sl-icon title='fab-github' name="fab-github"></sl-icon> fab-github</p>
Examples
Colors
            Icons inherit their color from the current text color. Thus, you can set the color property on
            the <sl-icon> element or an ancestor to change the color.
          
<div style="color: #4a90e2;"> <sl-icon name="triangle"></sl-icon> <sl-icon name="bell"></sl-icon> </div> <div style="color: #9013fe;"> <sl-icon name="clock"></sl-icon> <sl-icon name="cloud"></sl-icon> </div> <div style="color: #417505;"> <sl-icon name="flag"></sl-icon> <sl-icon name="heart"></sl-icon> </div> <div style="color: #f5a623;"> <sl-icon name="star"></sl-icon> <sl-icon name="trash"></sl-icon> </div>
Sizing
            Icons are sized relative to the current font size. To change their size, set the
            font-size property on the icon itself or on a parent element as shown below.
          
<div style="font-size: 32px;"> <sl-icon name="bell"></sl-icon> <sl-icon name="clock"></sl-icon> <sl-icon name="cloud"></sl-icon> <sl-icon name="download"></sl-icon> </div>
Labels
For non-decorative icons, use the label attribute to announce it to assistive devices.
<sl-icon name="star" label="Add to favorites"></sl-icon>
Custom Icons
            Custom icons can be loaded individually with the src attribute. Only SVGs on a local or
            CORS-enabled endpoint are supported. If you’re using more than one custom icon, it might make sense to
            register a custom icon library.
          
<sl-icon src="https://shoelace.style/assets/images/shoe.svg" style="font-size: 8rem;"></sl-icon>
Icon Libraries
            You can register additional icons to use with the <sl-icon> component through icon
            libraries. Icon files can exist locally or on a CORS-enabled endpoint (e.g. a CDN). There is no limit to how
            many icon libraries you can register and there is no cost associated with registering them, as individual
            icons are only requested when they’re used.
          
            Shoelace ships with two built-in icon libraries, default and system. The
            default icon library contains all of the icons in the
            Bootstrap Icons project. The system icon library contains only
            a small subset of icons that are used internally by Shoelace components.
          
            To register an additional icon library, use the registerIconLibrary() function that’s exported
            from utilities/icon-library.js. At a minimum, you must provide a name and a resolver function.
            The resolver function translates an icon name to a URL where the corresponding SVG file exists. Refer to the
            examples below to better understand how it works.
          
            If necessary, a mutator function can be used to mutate the SVG element before rendering. This is necessary
            for some libraries due to the many possible ways SVGs are crafted. For example, icons should ideally inherit
            the current text color via currentColor, so you may need to apply
            fill="currentColor or stroke="currentColor" to the SVG element using this
            function.
          
Here’s an example that registers an icon library located in the /assets/icons directory.
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('my-icons', { resolver: name => `/assets/icons/${name}.svg`, mutator: svg => svg.setAttribute('fill', 'currentColor') }); </script>
            To display an icon, set the library and name attributes of an
            <sl-icon> element.
          
<!-- This will show the icon located at /assets/icons/smile.svg --> <sl-icon library="my-icons" name="smile"></sl-icon>
If an icon is used before registration occurs, it will be empty initially but shown when registered.
The following examples demonstrate how to register a number of popular, open source icon libraries via CDN. Feel free to adapt the code as you see fit to use your own origin or naming conventions.
Boxicons
            This will register the
            Boxicons
            library using the jsDelivr CDN. This library has three variations: regular (bx-*), solid
            (bxs-*), and logos (bxl-*). A mutator function is required to set the SVG’s
            fill to currentColor.
          
Icons in this library are licensed under the Creative Commons 4.0 License.
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('boxicons', { resolver: name => { let folder = 'regular'; if (name.substring(0, 4) === 'bxs-') folder = 'solid'; if (name.substring(0, 4) === 'bxl-') folder = 'logos'; return `https://cdn.jsdelivr.net/npm/boxicons@2.0.5/svg/${folder}/${name}.svg`; }, mutator: svg => svg.setAttribute('fill', 'currentColor') }); </script> <div style="font-size: 24px;"> <sl-icon library="boxicons" name="bx-bot"></sl-icon> <sl-icon library="boxicons" name="bx-cookie"></sl-icon> <sl-icon library="boxicons" name="bx-joystick"></sl-icon> <sl-icon library="boxicons" name="bx-save"></sl-icon> <sl-icon library="boxicons" name="bx-server"></sl-icon> <sl-icon library="boxicons" name="bx-wine"></sl-icon> <br /> <sl-icon library="boxicons" name="bxs-bot"></sl-icon> <sl-icon library="boxicons" name="bxs-cookie"></sl-icon> <sl-icon library="boxicons" name="bxs-joystick"></sl-icon> <sl-icon library="boxicons" name="bxs-save"></sl-icon> <sl-icon library="boxicons" name="bxs-server"></sl-icon> <sl-icon library="boxicons" name="bxs-wine"></sl-icon> <br /> <sl-icon library="boxicons" name="bxl-apple"></sl-icon> <sl-icon library="boxicons" name="bxl-chrome"></sl-icon> <sl-icon library="boxicons" name="bxl-edge"></sl-icon> <sl-icon library="boxicons" name="bxl-firefox"></sl-icon> <sl-icon library="boxicons" name="bxl-opera"></sl-icon> <sl-icon library="boxicons" name="bxl-microsoft"></sl-icon> </div>
Lucide
This will register the Lucide icon library using the jsDelivr CDN. This project is a community-maintained fork of the popular Feather icon library.
Icons in this library are licensed under the MIT License.
<div style="font-size: 24px;"> <sl-icon library="lucide" name="feather"></sl-icon> <sl-icon library="lucide" name="pie-chart"></sl-icon> <sl-icon library="lucide" name="settings"></sl-icon> <sl-icon library="lucide" name="map-pin"></sl-icon> <sl-icon library="lucide" name="printer"></sl-icon> <sl-icon library="lucide" name="shopping-cart"></sl-icon> </div> <script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('lucide', { resolver: name => `https://cdn.jsdelivr.net/npm/lucide-static@0.16.29/icons/${name}.svg` }); </script>
Heroicons
This will register the Heroicons library using the jsDelivr CDN.
Icons in this library are licensed under the MIT License.
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('heroicons', { resolver: name => `https://cdn.jsdelivr.net/npm/heroicons@2.0.1/24/outline/${name}.svg` }); </script> <div style="font-size: 24px;"> <sl-icon library="heroicons" name="chat-bubble-left"></sl-icon> <sl-icon library="heroicons" name="cloud"></sl-icon> <sl-icon library="heroicons" name="cog"></sl-icon> <sl-icon library="heroicons" name="document-text"></sl-icon> <sl-icon library="heroicons" name="gift"></sl-icon> <sl-icon library="heroicons" name="speaker-wave"></sl-icon> </div>
Iconoir
This will register the Iconoir library using the jsDelivr CDN.
Icons in this library are licensed under the MIT License.
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('iconoir', { resolver: name => `https://cdn.jsdelivr.net/gh/lucaburgio/iconoir@latest/icons/${name}.svg` }); </script> <div style="font-size: 24px;"> <sl-icon library="iconoir" name="check-circled-outline"></sl-icon> <sl-icon library="iconoir" name="drawer"></sl-icon> <sl-icon library="iconoir" name="keyframes"></sl-icon> <sl-icon library="iconoir" name="headset-help"></sl-icon> <sl-icon library="iconoir" name="color-picker"></sl-icon> <sl-icon library="iconoir" name="wifi"></sl-icon> </div>
Ionicons
            This will register the
            Ionicons
            library using the jsDelivr CDN. This library has three variations: outline (default), filled
            (*-filled), and sharp (*-sharp). A mutator function is required to polyfill a
            handful of styles we’re not including.
          
Icons in this library are licensed under the MIT License.
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('ionicons', { resolver: name => `https://cdn.jsdelivr.net/npm/ionicons@5.1.2/dist/ionicons/svg/${name}.svg`, mutator: svg => { svg.setAttribute('fill', 'currentColor'); svg.setAttribute('stroke', 'currentColor'); [...svg.querySelectorAll('.ionicon-fill-none')].map(el => el.setAttribute('fill', 'none')); [...svg.querySelectorAll('.ionicon-stroke-width')].map(el => el.setAttribute('stroke-width', '32px')); } }); </script> <div style="font-size: 24px;"> <sl-icon library="ionicons" name="alarm"></sl-icon> <sl-icon library="ionicons" name="american-football"></sl-icon> <sl-icon library="ionicons" name="bug"></sl-icon> <sl-icon library="ionicons" name="chatbubble"></sl-icon> <sl-icon library="ionicons" name="settings"></sl-icon> <sl-icon library="ionicons" name="warning"></sl-icon> <br /> <sl-icon library="ionicons" name="alarm-outline"></sl-icon> <sl-icon library="ionicons" name="american-football-outline"></sl-icon> <sl-icon library="ionicons" name="bug-outline"></sl-icon> <sl-icon library="ionicons" name="chatbubble-outline"></sl-icon> <sl-icon library="ionicons" name="settings-outline"></sl-icon> <sl-icon library="ionicons" name="warning-outline"></sl-icon> <br /> <sl-icon library="ionicons" name="alarm-sharp"></sl-icon> <sl-icon library="ionicons" name="american-football-sharp"></sl-icon> <sl-icon library="ionicons" name="bug-sharp"></sl-icon> <sl-icon library="ionicons" name="chatbubble-sharp"></sl-icon> <sl-icon library="ionicons" name="settings-sharp"></sl-icon> <sl-icon library="ionicons" name="warning-sharp"></sl-icon> </div>
Jam Icons
            This will register the
            Jam Icons
            library using the jsDelivr CDN. This library has two variations: regular (default) and filled
            (*-f). A mutator function is required to set the SVG’s fill to
            currentColor.
          
Icons in this library are licensed under the MIT License.
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('jam', { resolver: name => `https://cdn.jsdelivr.net/npm/jam-icons@2.0.0/svg/${name}.svg`, mutator: svg => svg.setAttribute('fill', 'currentColor') }); </script> <div style="font-size: 24px;"> <sl-icon library="jam" name="calendar"></sl-icon> <sl-icon library="jam" name="camera"></sl-icon> <sl-icon library="jam" name="filter"></sl-icon> <sl-icon library="jam" name="leaf"></sl-icon> <sl-icon library="jam" name="picture"></sl-icon> <sl-icon library="jam" name="set-square"></sl-icon> <br /> <sl-icon library="jam" name="calendar-f"></sl-icon> <sl-icon library="jam" name="camera-f"></sl-icon> <sl-icon library="jam" name="filter-f"></sl-icon> <sl-icon library="jam" name="leaf-f"></sl-icon> <sl-icon library="jam" name="picture-f"></sl-icon> <sl-icon library="jam" name="set-square-f"></sl-icon> </div>
Material Icons
            This will register the
            Material Icons
            library using the jsDelivr CDN. This library has three variations: outline (default), round
            (*_round), and sharp (*_sharp). A mutator function is required to set the SVG’s
            fill to currentColor.
          
Icons in this library are licensed under the Apache 2.0 License.
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('material', { resolver: name => { const match = name.match(/^(.*?)(_(round|sharp))?$/); return `https://cdn.jsdelivr.net/npm/@material-icons/svg@1.0.5/svg/${match[1]}/${match[3] || 'outline'}.svg`; }, mutator: svg => svg.setAttribute('fill', 'currentColor') }); </script> <div style="font-size: 24px;"> <sl-icon library="material" name="notifications"></sl-icon> <sl-icon library="material" name="email"></sl-icon> <sl-icon library="material" name="delete"></sl-icon> <sl-icon library="material" name="volume_up"></sl-icon> <sl-icon library="material" name="settings"></sl-icon> <sl-icon library="material" name="shopping_basket"></sl-icon> <br /> <sl-icon library="material" name="notifications_round"></sl-icon> <sl-icon library="material" name="email_round"></sl-icon> <sl-icon library="material" name="delete_round"></sl-icon> <sl-icon library="material" name="volume_up_round"></sl-icon> <sl-icon library="material" name="settings_round"></sl-icon> <sl-icon library="material" name="shopping_basket_round"></sl-icon> <br /> <sl-icon library="material" name="notifications_sharp"></sl-icon> <sl-icon library="material" name="email_sharp"></sl-icon> <sl-icon library="material" name="delete_sharp"></sl-icon> <sl-icon library="material" name="volume_up_sharp"></sl-icon> <sl-icon library="material" name="settings_sharp"></sl-icon> <sl-icon library="material" name="shopping_basket_sharp"></sl-icon> </div>
Remix Icon
            This will register the
            Remix Icon
            library using the jsDelivr CDN. This library groups icons by categories, so the name must include the
            category and icon separated by a slash, as well as the -line or -fill suffix as
            needed. A mutator function is required to set the SVG’s fill to currentColor.
          
Icons in this library are licensed under the Apache 2.0 License.
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('remixicon', { resolver: name => { const match = name.match(/^(.*?)\/(.*?)?$/); match[1] = match[1].charAt(0).toUpperCase() + match[1].slice(1); return `https://cdn.jsdelivr.net/npm/remixicon@2.5.0/icons/${match[1]}/${match[2]}.svg`; }, mutator: svg => svg.setAttribute('fill', 'currentColor') }); </script> <div style="font-size: 24px;"> <sl-icon library="remixicon" name="business/cloud-line"></sl-icon> <sl-icon library="remixicon" name="design/brush-line"></sl-icon> <sl-icon library="remixicon" name="business/pie-chart-line"></sl-icon> <sl-icon library="remixicon" name="development/bug-line"></sl-icon> <sl-icon library="remixicon" name="media/image-line"></sl-icon> <sl-icon library="remixicon" name="system/alert-line"></sl-icon> <br /> <sl-icon library="remixicon" name="business/cloud-fill"></sl-icon> <sl-icon library="remixicon" name="design/brush-fill"></sl-icon> <sl-icon library="remixicon" name="business/pie-chart-fill"></sl-icon> <sl-icon library="remixicon" name="development/bug-fill"></sl-icon> <sl-icon library="remixicon" name="media/image-fill"></sl-icon> <sl-icon library="remixicon" name="system/alert-fill"></sl-icon> </div>
Tabler Icons
This will register the Tabler Icons library using the jsDelivr CDN. This library features over 1,950 open source icons.
Icons in this library are licensed under the MIT License.
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('tabler', { resolver: name => `https://cdn.jsdelivr.net/npm/@tabler/icons@1.68.0/icons/${name}.svg` }); </script> <div style="font-size: 24px;"> <sl-icon library="tabler" name="alert-triangle"></sl-icon> <sl-icon library="tabler" name="arrow-back"></sl-icon> <sl-icon library="tabler" name="at"></sl-icon> <sl-icon library="tabler" name="ball-baseball"></sl-icon> <sl-icon library="tabler" name="cake"></sl-icon> <sl-icon library="tabler" name="files"></sl-icon> <br /> <sl-icon library="tabler" name="keyboard"></sl-icon> <sl-icon library="tabler" name="moon"></sl-icon> <sl-icon library="tabler" name="pig"></sl-icon> <sl-icon library="tabler" name="printer"></sl-icon> <sl-icon library="tabler" name="ship"></sl-icon> <sl-icon library="tabler" name="toilet-paper"></sl-icon> </div>
Unicons
            This will register the
            Unicons
            library using the jsDelivr CDN. This library has two variations: line (default) and solid
            (*-s). A mutator function is required to set the SVG’s fill to
            currentColor.
          
Icons in this library are licensed under the Apache 2.0 License. Some of the icons that appear on the Unicons website, particularly many of the solid variations, require a license and are therefore not available in the CDN.
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('unicons', { resolver: name => { const match = name.match(/^(.*?)(-s)?$/); return `https://cdn.jsdelivr.net/npm/@iconscout/unicons@3.0.3/svg/${match[2] === '-s' ? 'solid' : 'line'}/${ match[1] }.svg`; }, mutator: svg => svg.setAttribute('fill', 'currentColor') }); </script> <div style="font-size: 24px;"> <sl-icon library="unicons" name="clock"></sl-icon> <sl-icon library="unicons" name="graph-bar"></sl-icon> <sl-icon library="unicons" name="padlock"></sl-icon> <sl-icon library="unicons" name="polygon"></sl-icon> <sl-icon library="unicons" name="rocket"></sl-icon> <sl-icon library="unicons" name="star"></sl-icon> <br /> <sl-icon library="unicons" name="clock-s"></sl-icon> <sl-icon library="unicons" name="graph-bar-s"></sl-icon> <sl-icon library="unicons" name="padlock-s"></sl-icon> <sl-icon library="unicons" name="polygon-s"></sl-icon> <sl-icon library="unicons" name="rocket-s"></sl-icon> <sl-icon library="unicons" name="star-s"></sl-icon> </div>
Customizing the Default Library
            The default icon library contains over 1,300 icons courtesy of the
            Bootstrap Icons
            project. These are the icons that display when you use <sl-icon> without the
            library attribute. If you prefer to have these icons resolve elsewhere or to a different icon
            library, register an icon library using the default name and a custom resolver.
          
This example will load the same set of icons from the jsDelivr CDN instead of your local assets folder.
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('default', { resolver: name => `https://cdn.jsdelivr.net/npm/bootstrap-icons@1.0.0/icons/${name}.svg` }); </script>
Customize the default library to use SVG sprites
To improve performance you can use a SVG sprites to avoid multiple trips for each SVG. The browser will load the sprite sheet once and then you reference the particular SVG within the sprite sheet using hash selector.
As always, make sure to benchmark these changes. When using HTTP/2, it may in fact be more bandwidth-friendly to use multiple small requests instead of 1 large sprite sheet.
When using sprite sheets, the sl-load and sl-error events will not fire.
              For security reasons, browsers may apply the same-origin policy on <use> elements
              located in the <sl-icon> shadow DOM and may refuse to load a cross-origin URL. There is
              currently no defined way to set a cross-origin policy for <use> elements. For this
              reason, sprite sheets should only be used if you’re self-hosting them.
            
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('sprite', { resolver: name => `/assets/images/sprite.svg#${name}`, mutator: svg => svg.setAttribute('fill', 'currentColor'), spriteSheet: true }); </script> <div style="font-size: 24px;"> <sl-icon library="sprite" name="clock"></sl-icon> <sl-icon library="sprite" name="speedometer"></sl-icon> </div>
Customizing the System Library
The system library contains only the icons used internally by Shoelace components. Unlike the default icon library, the system library does not rely on physical assets. Instead, its icons are hard-coded as data URIs into the resolver to ensure their availability.
            If you want to change the icons Shoelace uses internally, you can register an icon library using the
            system name and a custom resolver. If you choose to do this, it’s your responsibility to
            provide all of the icons that are required by components. You can reference
            src/components/library.system.ts for a complete list of system icons used by Shoelace.
          
<script type="module"> import { registerIconLibrary } from '/dist/utilities/icon-library.js'; registerIconLibrary('system', { resolver: name => `/path/to/custom/icons/${name}.svg` }); </script>
Properties
| Name | Description | Reflects | Type | Default | 
|---|---|---|---|---|
| name | The name of the icon to draw. Available names depend on the icon library being used. |  | string | undefined | - | 
| src | An external URL of an SVG file. Be sure you trust the content you are including, as it will be executed as code and can result in XSS attacks. | string | undefined | - | |
| label | An alternate description to use for assistive devices. If omitted, the icon will be considered presentational and ignored by assistive devices. | string | '' | |
| library | The name of a registered custom icon library. |  | string | 'default' | 
| updateComplete | A read-only promise that resolves when the component has finished updating. | 
Learn more about attributes and properties.
Events
| Name | React Event | Description | Event Detail | 
|---|---|---|---|
| sl-load |  | Emitted when the icon has loaded. When using spriteSheet: truethis will not emit. | - | 
| sl-error |  | Emitted when the icon fails to load due to an error. When using spriteSheet: truethis
                    will not emit. | - | 
Learn more about events.
Parts
| Name | Description | 
|---|---|
| svg | The internal SVG element. | 
| use | The | 
Learn more about customizing CSS parts.