Files
webawesome/docs/components/icon.md
2020-12-22 09:40:11 -05:00

6.2 KiB

Icon

[component-header:sl-icon]

Icons are symbols that can be used to represent various options within an application.

Shoelace comes bundled with over 1,200 icons courtesy of the Bootstrap Icons project. If you prefer, you can also register custom icon libraries.

Click or tap on an icon below to copy its name and use it like this.

<sl-icon name="icon-name-here"></sl-icon>
Outlined Filled All icons

Examples

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="exclamation-triangle"></sl-icon>
  <sl-icon name="archive"></sl-icon>
  <sl-icon name="battery-charging"></sl-icon>
  <sl-icon name="bell"></sl-icon>
  <sl-icon name="clock"></sl-icon>
  <sl-icon name="download"></sl-icon>
  <sl-icon name="file-earmark"></sl-icon>
  <sl-icon name="flag"></sl-icon>
  <sl-icon name="heart"></sl-icon>
  <sl-icon name="image"></sl-icon>
  <sl-icon name="lightning"></sl-icon>
  <sl-icon name="mic"></sl-icon>
  <sl-icon name="search"></sl-icon>
  <sl-icon name="star"></sl-icon>
  <sl-icon name="trash"></sl-icon>
  <sl-icon name="x-circle"></sl-icon>
</div>

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="/assets/images/shoe.svg" style="font-size: 8rem;"></sl-icon>
<script> fetch('/dist/shoelace/icons/icons.json') .then(res => res.json()) .then(icons => { const container = document.querySelector('.icon-search'); const input = container.querySelector('sl-input'); const select = container.querySelector('sl-select'); const copyInput = container.querySelector('.icon-copy-input'); const loader = container.querySelector('.icon-loader'); const list = container.querySelector('.icon-list'); const queue = []; // Generate icons icons.map(i => { const item = document.createElement('div'); item.classList.add('icon-list-item'); item.setAttribute('data-name', i.name); item.setAttribute('data-terms', [i.name, i.title, ...(i.tags || []), ...(i.categories || [])].join(' ')); item.innerHTML = ` `; const tooltip = document.createElement('sl-tooltip'); tooltip.content = i.name; tooltip.appendChild(item); list.appendChild(tooltip); item.addEventListener('click', () => { copyInput.value = i.name; copyInput.select(); document.execCommand('copy'); tooltip.content = 'Copied!'; setTimeout(() => tooltip.content = i.name, 1000); }); }); // Filter as the user types input.addEventListener('sl-input', () => { [...list.querySelectorAll('.icon-list-item')].map(item => { const filter = input.value.toLowerCase(); if (filter === '') { item.hidden = false; } else { const terms = item.getAttribute('data-terms').toLowerCase(); item.hidden = terms.indexOf(filter) < 0; } }); }); // Sort by type and remember preference const iconType = localStorage.getItem('sl-icon:type') || 'outline'; select.value = iconType; list.setAttribute('data-type', select.value); select.addEventListener('sl-change', () => { list.setAttribute('data-type', select.value); localStorage.setItem('sl-icon:type', select.value); }); }); </script> <style> .icon-search { border: solid 1px var(--sl-panel-border-color); border-radius: var(--sl-border-radius-medium); padding: var(--sl-spacing-medium); } .icon-search-controls { display: flex; } .icon-search-controls sl-input { flex: 1 1 auto; } .icon-search-controls sl-select { width: 10rem; flex: 0 0 auto; margin-left: 1rem; } .icon-loader { display: flex; align-items: center; justify-content: center; min-height: 30vh; } .icon-list { display: grid; grid-template-columns: repeat(12, 1fr); position: relative; margin-top: 1rem; } .icon-loader[hidden], .icon-list[hidden] { display: none; } .icon-list-item { display: inline-flex; align-items: center; justify-content: center; border-radius: var(--sl-border-radius-circle); font-size: 24px; width: 2em; height: 2em; margin: 0 auto; cursor: copy; transition: var(--sl-transition-medium) all; } .icon-list-item:hover { background-color: var(--sl-color-primary-50); color: var(--sl-color-primary-500); } .sl-theme-dark .icon-list-item:hover { background-color: var(--sl-color-primary-900); } .icon-list[data-type="outline"] .icon-list-item[data-name$="-fill"] { display: none; } .icon-list[data-type="fill"] .icon-list-item:not([data-name$="-fill"]) { display: none; } .icon-copy-input { position: absolute; opacity: 0; pointer-events: none; } @media screen and (max-width: 1000px) { .icon-list { grid-template-columns: repeat(8, 1fr); } .icon-list-item { font-size: 20px; } } @media screen and (max-width: 500px) { .icon-list { grid-template-columns: repeat(4, 1fr); } } </style>

[component-metadata:sl-icon]