Ir para o conteúdo principal
WBC - GovBR-DS
Copiar página como Markdown para IA

Icon

Componente estável e recomendada para novos projetos.
Anatomia, uso, comportamento visual e recomendações conceituais são mantidos pelo Padrão Digital de Governo. Esta página documenta a implementação Web Components e sua API executável.

Visão Geral

O componente br-icon fornece uma maneira flexível e dinâmica de incorporar ícones nas aplicações. Ele aceita arquivos de imagem da aplicação por URL, SVG inline e conteúdo via slot. Nomes Iconify por iconName continuam disponíveis somente para compatibilidade legada.

Com opções para especificar a altura e largura, adicionar classes CSS personalizadas, e definir como o ícone deve ser rotacionado ou espelhado, o br-icon oferece aos desenvolvedores as ferramentas necessárias para integrar ícones de forma consistente com o estilo e design de suas aplicações, melhorando a experiência do usuário e a clareza das interfaces.

Exemplo(s)

Imagem ou URL (src)

Desktop (100%)
Tablet - 768px
iPhone (iOS) - 390x844
Android - 360x800
Compartilhar URL
Mudar fundo
Abrir no StackBlitz
Tela cheia
HTML
Controles
JS
CSS
Console
Angular (Somente leitura)
React (Somente leitura)
Vue (Somente leitura)
Acessibilidade
Expandir controles e código

SVG inline (svg)

Desktop (100%)
Tablet - 768px
iPhone (iOS) - 390x844
Android - 360x800
Compartilhar URL
Mudar fundo
Abrir no StackBlitz
Tela cheia
HTML
Controles
JS
CSS
Console
Angular (Somente leitura)
React (Somente leitura)
Vue (Somente leitura)
Acessibilidade
Expandir controles e código

Slot padrão

Desktop (100%)
Tablet - 768px
iPhone (iOS) - 390x844
Android - 360x800
Compartilhar URL
Mudar fundo
Abrir no StackBlitz
Tela cheia
HTML
Controles
JS
CSS
Console
Angular (Somente leitura)
React (Somente leitura)
Vue (Somente leitura)
Acessibilidade
Expandir controles e código

Iconify: compatibilidade legada e migração

O componente br-icon mantém suporte à biblioteca Iconify por compatibilidade, por meio da propriedade iconName e do atributo HTML correspondente icon-name.

Essa API está depreciada. Para novos desenvolvimentos, o ícone deve pertencer à aplicação consumidora: use src para um asset local/URL controlado, svg para SVG inline ou o slot para conteúdo já disponível no projeto.

O módulo iconify-icon é carregado sob demanda somente quando o fallback Iconify é necessário. Os ícones padrão renderizados pelo br-icon continuam disponíveis offline como SVG nativo e não carregam essa dependência adicional.

Essa prioridade reduz acoplamento a terceiros, evita requisições inesperadas à rede/CDN, facilita CSP e uso offline, e torna a versão do asset reproduzível junto com a aplicação.


Por que Iconify deixou de ser a opção prioritária

Ao avaliar o uso do Iconify no br-icon, é importante considerar os seguintes prós e contras:

AspectoVantagensRiscos e Desvantagens
CatálogoCatálogo amplo de coleções e nomes de ícones padronizados (Font Awesome, Material Design Icons, etc.).Aumenta o acoplamento do componente a uma biblioteca de terceiros específica (iconify-icon).
CustomizaçãoCompatibilidade nativa com atributos de rotação (rotate), espelhamento (flip) e alinhamento (is-inline).O carregamento assíncrono dos SVGs sob demanda pode causar variações no tempo de renderização e pequenas oscilações de layout (Cumulative Layout Shift).
PrototipaçãoAPI simples para prototipação e uso rápido: basta declarar a propriedade iconName ou o atributo icon-name.Pode gerar falhas visuais ou ícones não renderizados se a rede falhar, se a coleção for alterada ou se o cache for limpo.
Segurança & RedePode ser configurado para usar coleções registradas localmente.Pode depender de requisições de rede para a CDN pública (https://api.iconify.design), exigindo atenção à CSP e configuração adicional para uso offline.

⚡ Integração com iconify-icon e a propriedade lazy

Internamente, a renderização do Iconify utiliza o componente web oficial <iconify-icon>.

Otimização de Renderização (noobserver)

Por padrão, o componente <iconify-icon> utiliza um IntersectionObserver interno para adiar o carregamento e renderização do ícone até que ele entre no viewport (comportamento lazy-load).

No br-icon, para mitigar problemas de oscilações visuais de layout, o comportamento padrão foi alterado para carregamento imediato. A propriedade lazy controla isso da seguinte forma:

  • Padrão / lazy={false}: O componente insere a propriedade noobserver no <iconify-icon>, desabilitando o observer e renderizando o ícone imediatamente.
  • lazy={true}: Ativa o observer nativo do Iconify, realizando o carregamento preguiçoso do ícone. Recomendado apenas para páginas com muitos ícones posicionados fora da tela inicial.

[!WARNING] Com src, lazy={true} usa o carregamento nativo do navegador (loading="lazy") para o <img>. SVG inline (svg) e conteúdo em slot já estão disponíveis no DOM e não possuem carregamento externo para adiar. No fallback Iconify, lazy continua controlando o observer do Iconify.


🔒 Soluções de Uso Offline e CSP (Content Security Policy)

Se o seu projeto é executado em ambientes restritos (intranets governamentais sem internet) ou com CSP rígido que bloqueia conexões externas, existem estratégias para permitir o funcionamento offline dos ícones:

1. Pré-registro de Ícones pelo Usuário (addIcon / addCollection)

Você pode importar as APIs do iconify-icon no ponto de entrada/bootstrap da sua aplicação (ex: index.js) e registrar os ícones necessários em memória:

import { addIcon, addCollection } from 'iconify-icon';

// Registrar um ícone individual: https://iconify.design/docs/iconify-icon/add-icon.html

addIcon('fa6-solid:search', {
body: '<path fill="currentColor" d="M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0s208 93.1 208 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"/>',
width: 512,
height: 512,
});

// Registrar uma coleção completa: https://iconify.design/docs/iconify-icon/add-collection.html
addCollection({
prefix: 'custom',
icons: {
home: {
body: '<path d="M10 20v-6h4v6h5v-8h3L12 3L2 12h3v8h5z" fill="currentColor"/>',
},
},
width: 24,
height: 24,
});

2. Direcionar para uma API auto-hospedada (addAPIProvider)

Se sua organização hospeda uma instância própria da API do Iconify:

import { addAPIProvider } from 'iconify-icon';

addAPIProvider('', {
resources: ['https://iconify.sua-organizacao.gov.br'],
});

Para mais detalhes, consulte a documentação do addAPIProvider.

[!NOTE] Se optar por buscar os ícones via rede da CDN padrão, sua política de segurança (CSP) deve conter a seguinte permissão: Content-Security-Policy: connect-src 'self' https://api.iconify.design;


🚀 Guia de Migração para as APIs Recomendadas

Para remover a dependência de CDNs externas e garantir o máximo desempenho dos ícones, migre os seus componentes conforme os exemplos abaixo:

Opção A: Caminho por arquivo local ou URL (src)

Use quando os arquivos SVG residem na sua pasta de assets ou sob uma URL pública controlada por você.

<!-- Modo Iconify -->
<br-icon icon-name="fa6-solid:magnifying-glass"></br-icon>

<!-- Recomendado: asset local controlado pela aplicação -->
<br-icon src="/assets/icons/magnifying-glass.svg"></br-icon>

Opção B: SVG Inline (svg)

Use para injetar a string estruturada do SVG diretamente no DOM Shadow do componente, evitando qualquer requisição HTTP externa para o ícone.

<!-- Recomendado (Nativo via svg) -->
<br-icon
svg='<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z" fill="currentColor"/></svg>'
></br-icon>

Opção C: Injeção por Slot Padrão (Slot)

Perfeito para integrar bibliotecas externas carregadas globalmente (como Font Awesome via tags <i>), ícones de frameworks ou customizações complexas de marcação HTML.

<!-- Recomendado (Nativo via slot) -->
<br-icon>
<i class="fa-solid fa-magnifying-glass" aria-hidden="true"></i>
</br-icon>

📏 Dimensionamento, Alinhamento e Estilos

Ao utilizar src, svg ou slots sem definir width e height, o br-icon usa os valores padrão de 16px de largura e 16px de altura. As props width e height continuam independentes e podem receber qualquer unidade CSS válida.

Se o conteúdo injetado via slot padrão precisar ser redimensionado internamente de forma isolada, aplique as seguintes variáveis CSS customizadas no elemento injetado:

  • --br-icon-slotted-width
  • --br-icon-slotted-height
  • --br-icon-slotted-font-size

🔀 Ordem Automática de Renderização (source="auto")

Caso mais de um método de inclusão seja configurado simultaneamente, o br-icon decidirá o que exibir baseando-se no valor da propriedade source (que por padrão é 'auto'). No modo 'auto', a ordem de prioridade é:

  1. Slot Padrão (se houver elementos ou texto no slot).
  2. SVG Inline (propriedade svg).
  3. Caminho de imagem/URL da aplicação (propriedade src).
  4. Iconify legado (propriedade iconName; atributo icon-name em HTML).

Para desativar a priorização automática e impor uma origem fixa, especifique: source="slot", source="svg", source="image" ou source="iconify".

Propriedades

cssClasses

Atributocss-classes
DescriçãoPermite adicionar classes CSS adicionais ao ícone.
Use esta propriedade para aplicar estilos personalizados ao ícone, além dos estilos padrão.
Tipostring
Valor padrão---

customId

Atributocustom-id
DescriçãoIdentificador único do componente.
Quando omitido, um valor é gerado automaticamente.

> Padrão: valor único gerado por generateUniqueId().
Tipostring
Valor padrãogenerateUniqueId()

flip

Atributoflip
DescriçãoDefine o tipo de espelhamento do ícone.
Tipo"horizontal" | "vertical"
Valor padrão---

focusable

Atributofocusable
DescriçãoTorna o ícone focável. Quando informada, tem precedência sobre isFocusable.
Tipoboolean
Valor padrão---

height

Atributoheight
DescriçãoDefine a altura do ícone. Pode ser especificada em qualquer unidade CSS válida, como pixels (px), ems (em), rems (rem), etc.
O valor padrão é '16'. O tamanho pode ser sobrescrito independentemente da largura.
Tipostring
Valor padrão'16'

iconName Componente mantido por compatibilidade; prefira a alternativa indicada na documentação.

Atributoicon-name
DepreciaçãoUse src, svg ou o slot padrão.
Descrição
Tipostring
Valor padrão---

inline

Atributoinline
DescriçãoRenderiza o ícone inline. Quando informada, tem precedência sobre isInline.
Tipoboolean
Valor padrão---

isFocusable Componente mantido por compatibilidade; prefira a alternativa indicada na documentação.

Atributois-focusable
DepreciaçãoUse focusable.
Descrição
Tipoboolean
Valor padrãofalse

isInline Componente mantido por compatibilidade; prefira a alternativa indicada na documentação.

Atributois-inline
DepreciaçãoUse inline.
Descrição
Tipoboolean
Valor padrãofalse

label

Atributolabel
DescriçãoTexto alternativo para ícones informativos. Sem label, o ícone é decorativo.
Tipostring
Valor padrão---

lazy

Atributolazy
DescriçãoControla o comportamento de carregamento do ícone.

Comportamento:
- Padrão (propriedade não definida): carregamento imediato aplicando noobserver para evitar problemas de layout shift
- lazy={true}: ativa o carregamento tardio nativo para imagens em src e o observer do Iconify no fallback legado
- lazy={false}: carregamento imediato

Nota: O padrão foi alterado para carregamento imediato para resolver problemas de deslocamento de layout
que ocorriam quando ícones eram carregados depois do conteúdo inicial.

SVG inline e conteúdo em slot não precisam de carregamento tardio, pois já estão disponíveis no DOM.
Tipoboolean
Valor padrão---

rotate

Atributorotate
DescriçãoDefine o ângulo de rotação do ícone.
Tipo"180deg" | "270deg" | "90deg"
Valor padrão---

source

Atributosource
DescriçãoDefine explicitamente a origem do ícone.
Quando auto, o componente prioriza slot, SVG inline e imagem por URL.
Iconify fica apenas como fallback de compatibilidade quando nenhuma fonte própria foi informada.
Tipo"auto" | "iconify" | "image" | "slot" | "svg"
Valor padrão'auto'

src

Atributosrc
DescriçãoURL ou caminho local para um arquivo de imagem que será usado como ícone.
O caminho é resolvido pelo navegador no contexto da aplicação consumidora,
portanto pode ser relativo (./assets/icone.svg), absoluto (/assets/icone.svg)
ou uma URL completa.
Aceita SVG, PNG, WebP e outros formatos suportados pelo elemento img.
Tipostring
Valor padrão---

svg

Atributosvg
DescriçãoConteúdo SVG inline a ser renderizado como ícone.

Use apenas SVGs confiáveis e sanitizados pela aplicação.
Tipostring
Valor padrão---

width

Atributowidth
DescriçãoDefine a largura do ícone. Pode ser especificada em qualquer unidade CSS válida, como pixels (px), ems (em), rems (rem), etc.
O valor padrão é '16'. A largura pode ser sobrescrita independentemente da altura.
Tipostring
Valor padrão'16'

Migração de <br-icon-base> para <br-icon> (1.x → 2.x)

Na branch 1.x, o componente era registrado como br-icon-base e recebia o nome do ícone e da família. Na 2.x, o elemento público é br-icon, com fontes de ícone declaradas pela aplicação.

Propriedades

API 1.xAPI 2.xAção na migração
labelInforme uma descrição para ícones que não sejam decorativos.
br-icon-basebr-iconAtualize o nome do elemento.
classNamecssClassesRenomeie quando precisar aplicar classes.
familyNameRemova e configure a fonte no src/SVG ou na integração de ícones da aplicação.
iconNamesrc, svg ou slotPrefira uma fonte explícita; iconName existe como compatibilidade legada.

Exemplo

1.x:

<br-icon-base icon-name="search" family-name="fas"></br-icon-base>

2.x:

<br-icon src="/icons/search.svg" label="Pesquisar"></br-icon>

CSS Shadow Parts

NomeDescrição
"icon"Elemento interno que representa o ícone renderizado.
"image"Elemento img interno quando src é usado.
"slot"Elemento interno que recebe conteúdo via slot.
"svg"Elemento interno que recebe SVG inline quando svg é usado.

Dependências

Usado por

Gráfico