Apostila completa de Iconografia & Sistemas de Ícones
Ícones são a linguagem visual mais condensada de uma interface. Esta apostila cobre a anatomia e o grid, os estilos (linha, sólido, cor), como desenhar um ícone da metáfora ao vetor, o ajuste óptico que faz uma família parecer coerente, o SVG e a acessibilidade no código, os sistemas de ícone com tokens e pipeline, os ícones em movimento, e a governança em escala — com o olho no que produtos e design systems pedem.
O que é um ícone e para que serve
Objetivo: separar ícone de ilustração, logo e pictograma; entender as funções reais de um ícone; e enterrar o mito de que "ícone é universal".
1.1 Ícone, ilustração, logo, pictograma
| Termo | O que é | Escala típica |
|---|---|---|
| Ícone (de UI) | símbolo funcional pequeno que representa uma ação, objeto ou conceito numa interface | 16–48px |
| Pictograma | ícone de sinalização/ambiente, geralmente isolado e maior (banheiro, saída) | de placa |
| Ilustração (spot) | imagem com estilo e narrativa; explica, dá afeto, ocupa espaço | média/grande |
| Logo / símbolo de marca | identifica uma entidade; carrega significado depositado pelo uso | qualquer |
Um ícone de "lixeira" pode aparecer em 200 telas; um logo aparece em uma marca. Ícone é vocabulário; logo é nome próprio. Ver a apostila Logótipos & Lettering.
1.2 Para que serve um ícone
- Acelerar o reconhecimento de uma função já conhecida (o "🔍" para busca).
- Economizar espaço onde o rótulo não cabe (barra de ferramentas, mobile).
- Ancorar visualmente um item numa lista, um tipo de conteúdo, um status.
- Dar personalidade e ritmo visual (com parcimônia).
1.3 O mito do ícone universal
Pouquíssimos ícones são realmente entendidos sem aprendizado: lupa (busca), casa (início), engrenagem (configurações), X (fechar), setas. A maioria — o disquete de "salvar", o "hambúrguer", os três pontinhos, o coração vs estrela vs marcador — é convenção aprendida, e varia por plataforma, cultura e faixa etária. Um ícone ambíguo sem rótulo é uma adivinhação.
Ícone + rótulo, sempre que couber. O ícone acelera o reconhecimento para quem já sabe; o rótulo garante para quem não sabe e para leitores de tela. Ícone sozinho só quando (a) o significado é comprovadamente universal, (b) o espaço é crítico, e (c) há sempre um tooltip/nome acessível. Testar com usuários é a única forma de saber se um ícone "fala".
1.4 Quando NÃO usar um ícone
- Quando não existe uma metáfora clara (muitos conceitos abstratos não têm) — um rótulo é melhor que um ícone que ninguém entende.
- Quando o ícone só "decora" e compete com a informação.
- Quando cada item de uma lista ganha um ícone diferente e o conjunto vira ruído — ícone ajuda a distinguir tipos, não a enfeitar linhas.
Perguntas de abertura: "Qual a diferença entre ícone e ilustração?" (função e escala vs narrativa e afeto), "Ícones são universais?" (quase nenhum; a maioria é convenção aprendida — daí ícone + rótulo), "Quando você usaria um ícone sem texto?" (significado comprovado + espaço crítico + nome acessível sempre).
✏️ Exercício 1 — Ícone, rótulo ou os dois
Para cada item de UI, decida ícone só, rótulo só, ou os dois — e justifique: (a) o botão "fechar" de um modal; (b) uma ação "Exportar para CSV" num menu; (c) os itens de uma navegação principal (Início, Pedidos, Relatórios, Config.); (d) o status de um pedido numa tabela (pago/pendente/cancelado).
Gabarito (uma boa resposta): (a) ícone só (X é universal) + aria-label="Fechar". (b) rótulo (com um ícone de apoio opcional) — "exportar para CSV" não tem metáfora clara e o menu tem espaço. (c) ícone + rótulo — navegação principal se beneficia do reconhecimento rápido e do ensino; em mobile pode colapsar para ícone + rótulo pequeno, nunca só ícone para itens ambíguos como "Relatórios". (d) ícone/forma + rótulo + cor — status não pode depender só de cor (daltonismo; ver Cor e Acessibilidade Digital & WCAG); um selo com texto e um ícone de apoio.
Anatomia e grid do ícone
Objetivo: entender o canvas, a live area, o padding, as keyline shapes e o grid de pixels — o andaime que faz uma família de ícones parecer do mesmo tamanho.
2.1 Canvas, live area e trim
- Canvas / artboard: a caixa total do ícone (ex.: 24×24). É o
viewBoxdo SVG. - Padding / margem de segurança: uma faixa em volta que o desenho normalmente não toca (ex.: 2px num grid de 24) — dá respiro e evita cortes ao alinhar com texto.
- Live area: a área central onde o ícone vive (ex.: 20×20 dentro de 24).
- Trim/bounding box: a caixa real do desenho — varia por ícone; é o que o ajuste óptico equaliza (Módulo 5).
2.2 Keyline shapes
Um conjunto de formas de referência — quadrado, círculo, retângulo em pé, retângulo deitado — cada uma com uma área visual equivalente (não a mesma medida). Você encaixa cada ícone na keyline que melhor lhe serve: um ícone "quadrado" (câmera) usa o quadrado; um "redondo" (relógio) usa o círculo, que é um pouco maior para compensar o overshoot (ver Logótipos & Lettering, Módulo 5). É isso que faz uma câmera e um relógio parecerem do mesmo tamanho na barra.
2.3 O grid de pixels
- Ícones de UI são vistos em tamanhos pequenos e fixos: alinhar os traços ao grid de pixels evita bordas borradas (anti-aliasing indesejado).
- Desenhe no tamanho-alvo (ou num múltiplo exato): um ícone pensado em 24 e usado em 24 fica nítido; o mesmo desenho escalado para 19px fica mole.
- Traços em número inteiro de pixels (1, 1.5, 2), posicionados em coordenadas inteiras (ou em .5 para traços de largura ímpar centrados).
2.4 Densidades / a escala de tamanhos
| Tamanho | Uso típico | Nível de detalhe |
|---|---|---|
| 16px | inline com texto, densidade alta, árvores | mínimo — só a silhueta essencial |
| 20–24px | o padrão de UI (botões, menus, listas) | a metáfora clara, poucos detalhes |
| 32–40px | estados vazios pequenos, destaques | mais detalhe possível |
| 48px+ | onboarding, marketing, ilustrativo | caminho para ilustração |
Famílias sérias entregam desenhos otimizados por tamanho (o de 16 não é o de 24 encolhido) — é o "optical size" da tipografia aplicado a ícone.
Perguntas: "O que são keyline shapes e por que existem?" (formas de referência de área visual equivalente — igualam o tamanho percebido entre ícones redondos e quadrados), "Por que desenhar no tamanho-alvo?" (nitidez no grid de pixels), "O ícone de 16 é o de 24 reduzido?" (não — o ideal é um desenho por tamanho, com menos detalhe nos pequenos).
✏️ Exercício 2 — Monte o grid
Especifique o sistema de grid para uma família de ícones de UI: canvas, padding, live area, keyline shapes (com proporções relativas), largura de traço, e a escala de tamanhos. Explique por que o círculo da keyline é maior que o quadrado.
Gabarito (uma boa resposta): canvas 24×24; padding 2px em todos os lados; live area 20×20. Keyline shapes dentro da live area: quadrado ~18×18; círculo ~Ø20 (maior para overshoot — um círculo de 18 pareceria menor que o quadrado de 18); retângulo em pé ~14×20; retângulo deitado ~20×14. Traço: 2px (1.5px numa variante "small" para 16px), cantos com raio consistente (ex.: 2px), terminais e junções padronizados. Escala: 16 / 20 / 24 / 32 / 48, com o desenho de 16 simplificado (menos nós, sem detalhes internos). O círculo é maior porque uma forma redonda com o mesmo diâmetro que o lado do quadrado ocupa menos "massa" visual e parece menor — o overshoot compensa.
Estilo: linha, sólido, cor
Objetivo: escolher entre line, solid, duotone e flat colorido; padronizar traço, cantos e nível de detalhe; e conhecer as famílias públicas.
3.1 Os estilos
| Estilo | Como é | Bom para |
|---|---|---|
| Line / outline / stroke | contorno de traço uniforme, interior vazado | UI leve e neutra; o padrão hoje (Feather, Lucide, Heroicons outline) |
| Solid / filled | formas preenchidas, sem (ou pouco) traço | estado ativo/selecionado, tamanhos muito pequenos, mais peso e contraste |
| Duotone | uma forma base clara + detalhes em cor cheia | hierarquia interna, um toque de marca sem colorir tudo |
| Flat colorido / 3D | múltiplas cores, às vezes profundidade | marketing, onboarding, app icons — raramente UI funcional |
Padrão comum: line para o repouso, solid para o estado ativo (a mesma metáfora, dois pesos) — como a tab bar do iOS.
3.2 Os parâmetros que definem a família
- Largura de traço (stroke): um valor (1.5 ou 2px em 24). É a decisão de estilo mais visível.
- Terminação (line cap): reta (
butt), arredondada (round) ou quadrada (square) — escolha uma. - Junção (line join):
miter(canto vivo),round,bevel— coerência. - Raio de canto: uma unidade (0 = geométrico duro; 2px = amigável; grande = "bolha").
- Ângulos: restringir a 0/45/90 (e talvez 30/60) — nada de ângulos avulsos.
- Nível de detalhe / densidade: quantos elementos por ícone; menos é mais legível em pequeno.
- Metáfora: a mesma ideia representada do mesmo jeito em toda a família (um "documento" é sempre a mesma folha).
3.3 Famílias públicas de referência
- Lucide (fork mantido do Feather): line, 24px, traço 2px, cantos redondos — ótimo default open source.
- Phosphor: 6 pesos (thin → fill, incluindo duotone), muito grande.
- Material Symbols (Google): variável — eixos weight, fill, grade, optical size.
- SF Symbols (Apple): integrado ao sistema, pesos alinhados à fonte, só para plataformas Apple.
- Heroicons (Tailwind): outline + solid + mini; Tabler: enorme, line; Radix Icons: 15px, minimalistas.
- Para escolher: estilo alinhado à marca, cobertura de conceitos, licença (a maioria é MIT/OFL/Apache — confira), formato (SVG, componentes), e se tem pesos/variantes.
Perguntas: "Line ou solid?" (line para repouso/UI neutra; solid para ativo, pequeno, mais peso — comum usar os dois), "Que parâmetros definem uma família de ícones?" (traço, cap, join, raio, ângulos, detalhe, metáfora consistente), "Quando você usaria uma lib pronta vs desenhar?" (lib para o comum; desenhar para o específico da marca e para preencher lacunas — Módulo 9).
✏️ Exercício 3 — Especifique o estilo
Para um produto financeiro sério (confiável, moderno, denso), especifique o estilo da família de ícones: line ou solid (e onde cada um), traço, cap/join, raio, ângulos, e uma família open source que serviria de base.
Gabarito (uma boa resposta): line como padrão (leve, não compete com números), solid para estado selecionado na navegação. Traço 2px em 24 (1.5px na variante 20). Cap round ou butt — round suaviza sem infantilizar; join round. Raio de canto pequeno (~2px) — moderno sem "bolha". Ângulos 0/45/90. Base: Lucide ou Heroicons outline (estilo sóbrio, cobertura ampla, licença permissiva), estendida com ícones próprios para conceitos do domínio (fatura, conciliação, split de pagamento) no mesmo grid e traço.
Desenhar um ícone
Objetivo: da metáfora ao vetor — simplificar, alinhar ao grid, usar booleanas e curvas limpas, e testar em tamanho real.
4.1 Da ideia à forma
- Escolha a metáfora certa: a mais convencional para a função (não a mais criativa). Veja como 5 famílias resolvem aquele conceito antes de inventar.
- Reduza ao essencial: o que, removido, faz o ícone deixar de ser reconhecível? Tudo além disso é ruído.
- Uma metáfora por ícone: "compartilhar por e-mail" não é um envelope + uma seta + um @ — escolha.
4.2 Construção no vetor
- Trabalhe no grid do Módulo 2, com snapping ligado.
- Formas primitivas + booleanas: construa a partir de retângulos, círculos e linhas, unindo/subtraindo — mais preciso e regular que desenhar tudo com a Pen. Ver a apostila Adobe Illustrator.
- Traço vs contorno: desenhe com stroke para iterar (fácil mudar a espessura); ao final, expanda o traço em forma (outline stroke) para o SVG de produção — assim o ícone escala sem o traço engrossar/afinar de forma indesejada e aceita
fill. - Curvas limpas: poucos nós, alças ortogonais nos extremos (mesma disciplina de Logótipos & Lettering, Módulo 4).
- Ângulos consistentes: diagonais sempre a 45° (ou o ângulo que a família adotou).
4.3 Encaixe óptico no grid
- Traços colados nos pixels: um traço de 2px vive entre linhas inteiras da grade; um de 1px, centrado em .5.
- Formas simétricas de verdade (espelhe, não desenhe os dois lados).
- Elementos que "encostam" na borda da live area por decisão (o ícone parece maior) vs elementos com respiro — coerência dentro da família.
4.4 Testar
- Veja o ícone em 16, 20 e 24px reais, em preto sobre branco e branco sobre preto, ao lado de texto.
- Coloque-o na grade com os vizinhos da família — é aí que se vê inconsistência de peso e tamanho (Módulo 5).
- Mostre para alguém sem contexto: "o que este ícone faz?".
Auto-trace de um clipart. Traços em pixels fracionários (0.7, 1.3) → borrão. Detalhe demais para 16px. Metáforas misturadas. Nós redundantes nas curvas. Traço não expandido no SVG final (escala mal, não aceita currentColor em fill). Ícone que só funciona porque está grande na tela do designer. Diagonais em ângulos aleatórios. "Quase simétrico".
Perguntas: "Como você desenha um ícone novo?" (metáfora convencional → reduzir ao essencial → primitivas + booleanas no grid → expandir traço → testar em tamanho real e na família), "Stroke ou fill no SVG final?" (expandir o traço em forma para produção), "Como você garante nitidez?" (desenhar no tamanho-alvo, traços em pixels inteiros).
✏️ Exercício 4 — Do conceito ao vetor
Desenhe (de verdade) três ícones para uma mesma família: "notificações", "favorito" e "filtrar". Documente para cada: a metáfora escolhida (e uma alternativa descartada), o traço/raio/ângulos, e um problema que apareceu em 16px.
Gabarito (critérios): metáforas convencionais (sino para notificações — não um alto-falante; estrela ou coração para favorito, escolhido e usado de forma consistente; funil para filtrar — não três linhas que se confundem com "menu"). Os três devem compartilhar traço (ex.: 2px), cap/join, raio e ângulos (45°). Problemas típicos em 16px: o badalo do sino somindo; as pontas da estrela empastando (abrir os ângulos, engrossar as contraformas); o funil virando um triângulo ilegível (simplificar para 2–3 traços). Todos testados em preto/branco e na grade com os vizinhos.
Ajuste óptico e consistência da família
Objetivo: fazer todos os ícones da família parecerem do mesmo tamanho e peso — porque a medida igual não produz aparência igual.
5.1 Peso visual uniforme
- Um ícone com muitos traços (um calendário com grade) parece mais escuro/pesado que um com poucos (uma gota). Compense: menos densidade interna, ou traço levemente mais fino nos "cheios".
- Um ícone solid tem muito mais massa que um line do mesmo tamanho — por isso a variante solid de uma família às vezes é um pouco menor na live area.
- O olho compara a quantidade de preto na caixa. O alvo é: em uma grade da família inteira, nenhum ícone "salta" por ser mais pesado ou mais leve.
5.2 Tamanho percebido
- Formas redondas e pontudas precisam de overshoot: o círculo do relógio ultrapassa levemente a live area para parecer do tamanho do quadrado da câmera.
- Ícones horizontais (uma seta deitada) podem precisar ser um pouco mais largos, e os verticais um pouco mais altos, do que a keyline sugere, para "encher o olho" igual.
- Uma forma isolada e magra (um raio, uma pena) pode ser ampliada além da keyline para não parecer perdida na caixa.
5.3 Junções, contraformas e detalhes
- Onde traços se cruzam, a massa acumula e escurece — afine perto da junção (ver Logótipos & Lettering, Módulo 5).
- Contraformas pequenas fecham em tamanho reduzido — abra-as (o buraco da chave, a janela da casa).
- Detalhes com menos de ~1.5px somem em 16px — remova ou funda com o traço principal.
5.4 Alinhamento e o teste da família
- Alinhamento vertical consistente ao lado do texto: defina onde o centro óptico do ícone cai em relação à linha de base / caixa do texto e repita.
- O teste definitivo: monte todos os ícones da família numa grade única, em tamanho pequeno. Escaneie com o olho meio fechado. O que pular de peso ou de tamanho precisa de ajuste. Refaça até a grade "vibrar" uniforme.
Se você desenhar todos os ícones exatamente 20×20, a família vai parecer irregular — o círculo pequeno, a seta magra perdida, o calendário pesado. Consistência de ícone é um trabalho de ajuste óptico ícone a ícone contra a família inteira, não de encaixar tudo na mesma caixa. É a diferença entre um set "de estagiário" e um set "de sistema".
Perguntas: "Como você garante que uma família de ícones parece consistente?" (ajuste óptico ícone a ícone contra a família: peso visual, overshoot, junções, alinhamento; o teste da grade completa), "Por que a variante solid às vezes é menor?" (mais massa → mesmo tamanho percebido), "O que fazer com um ícone que tem muitos traços internos?" (reduzir densidade ou afinar o traço).
✏️ Exercício 5 — Equalize a família
Você tem 8 ícones desenhados todos em 20×20 exatos: alguns parecem grandes, outros pequenos, um (o "configurações", uma engrenagem) parece pesado. Liste os ajustes ópticos que você faria, ícone por tipo.
Gabarito (uma boa resposta): ícones redondos (relógio, alvo): aplicar overshoot, ampliar ~1–2px além da live area. Ícones magros/isolados (raio, seta): ampliar para preencher melhor a caixa. Ícones horizontais/verticais: esticar levemente no eixo curto da percepção. A engrenagem: reduzir o número de dentes, afinar o traço em ~0.25px em relação ao resto, abrir a contraforma central — ela concentra muito preto. Todos: rever junções (afinar cruzamentos), conferir alinhamento vertical com texto. Validar montando a grade dos 8 e escaneando com o olho meio fechado; iterar.
Ícone no código: SVG e acessibilidade
Objetivo: entender o SVG de um ícone, otimizá-lo, escolher a forma de servir (inline, sprite, componente), e torná-lo acessível.
6.1 Anatomia do SVG de um ícone
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2"
stroke-linecap="round" stroke-linejoin="round">
<path d="M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2m3 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"/>
<path d="M10 11v6M14 11v6"/>
</svg>
viewBoxé o sistema de coordenadas — o que dá a escalabilidade.width/heightsão só o tamanho padrão.stroke="currentColor"(oufill="currentColor"): o ícone herda acolordo CSS — um só arquivo serve todas as cores e temas.- Style line:
fill="none" stroke="currentColor". Style solid:fill="currentColor"e sem stroke. - Para produção, o traço geralmente é expandido em
<path>preenchido — mais previsível ao escalar e permitefill.
6.2 Otimização
- SVGO (ou svgomg): remove metadados, comentários, atributos redundantes, achata transforms, arredonda coordenadas. Um ícone otimizado tem tipicamente 200–600 bytes.
- Mantenha
viewBox; removawidth/heightfixos se for controlar por CSS; preservecurrentColor. - Não deixe
<title>/IDs que o pipeline de a11y precisa serem removidos sem querer.
6.3 Como servir os ícones
| Método | Como | Trade-off |
|---|---|---|
| Inline SVG | o <svg> direto no HTML/JSX | estiliza tudo, anima, acessível; infla o DOM se repetido muito |
Sprite <symbol> + <use> | um arquivo com todos os ícones; <use href="#icon-trash"> | um request, cacheável, sem inflar o DOM; um pouco mais de setup |
| SVG-as-component | cada ícone é um componente (SVGR no React etc.) | DX ótima, tree-shaking, props; parte do bundle JS |
<img> / background | SVG como arquivo de imagem | cacheável e simples; não herda currentColor, não anima peças |
| Ícone-fonte (glyphs) | uma fonte onde cada caractere é um ícone | legado — problemas de a11y, rendering, FOUT, alinhamento; evite em projeto novo |
Recomendação atual: SVG-as-component em apps com framework (só o que se usa entra no bundle) ou sprite em sites — nunca ícone-fonte novo.
6.4 Acessibilidade
- Ícone decorativo (ao lado de um rótulo que já diz tudo): esconda dos leitores de tela —
aria-hidden="true"(ourole="presentation"). - Ícone que carrega sentido sozinho (botão só-ícone): o controle precisa de nome acessível —
<button aria-label="Excluir">. O SVG em si pode terrole="img"+<title>Excluir</title>(comaria-labelledby), mas o nome no botão é o que importa. - Alvo de toque ≥ 24px (WCAG 2.2) / ~44px (móvel) — o ícone pode ter 20px, mas a área clicável não.
- Contraste: ícone que transmite informação essencial ≥ 3:1 com o fundo (WCAG 1.4.11). Ver Acessibilidade Digital & WCAG.
- Não só cor: um ícone que muda só de cor entre estados falha para daltônicos — mude a forma também.
6.5 Alinhar ícone com texto
.icon{
width: 1em; height: 1em; /* escala com o font-size do contexto */
fill: currentColor; /* ou stroke */
vertical-align: -0.125em; /* ajuste fino à linha de base */
flex: none; /* não deixa o ícone encolher num flex */
}
Perguntas de front-end: "Como você serve ícones num app moderno?" (SVG-as-component com tree-shaking, ou sprite; nunca ícone-fonte novo), "O que currentColor resolve?" (um arquivo, todas as cores/temas), "Como um botão só-ícone fica acessível?" (aria-label no botão; ícone aria-hidden), "Ícone decorativo vs semântico — o que muda no markup?".
✏️ Exercício 6 — Markup correto
Escreva o markup acessível para: (a) um botão "Adicionar aos favoritos" que é só um ícone de coração; (b) um item de lista "Fatura de março" com um ícone de PDF à esquerda (o texto já diz que é uma fatura); (c) um badge de status "Erro" com um ícone de triângulo. Explique a decisão de a11y em cada.
Gabarito (uma boa resposta): (a) <button type="button" aria-label="Adicionar aos favoritos" aria-pressed="false"><svg aria-hidden="true" …></svg></button> — o nome vive no botão; o ícone é escondido; aria-pressed comunica o estado toggle; e o coração cheio vs vazado (forma, não só cor) marca o estado. (b) <svg aria-hidden="true"> — o ícone de PDF é decorativo porque "Fatura de março" já informa; se o formato importa, adicione um texto "PDF" visível ou <span class="sr-only">PDF</span>. (c) o badge tem texto "Erro" visível → o ícone é aria-hidden; o sentido vem do texto + forma do triângulo, não só do vermelho; contraste do texto e do ícone ≥ 4.5:1 / 3:1 com o fundo do badge.
Sistemas de ícone e tokens
Objetivo: nomear, versionar e distribuir uma biblioteca de ícones — variantes, ícones variáveis, pipeline do Figma ao pacote, e a integração com o design system.
7.1 Nomenclatura
- Nome pela coisa, não pelo uso:
trash, nãodelete-button;magnifying-glass/search, nãofind-orders. O mesmo ícone serve muitos usos. - Aliases para sinônimos comuns (
bin→trash) ajudam a busca e evitam duplicatas. - kebab-case, categorias ou prefixos (
arrow-,file-,brand-), e um padrão para variantes:chevron-down,chevron-down-filled,chevron-down-16. - Um índice pesquisável com tags/keywords é parte do produto (quem procura "remover" precisa achar "trash").
7.2 Variantes
| Eixo | Valores típicos | Por quê |
|---|---|---|
| Tamanho | 16 / 20 / 24 (desenhos otimizados) | nitidez e detalhe por contexto |
| Estilo/peso | line / solid (às vezes thin, bold, duotone) | repouso vs ativo; densidade |
| Direção | up/down/left/right | setas, chevrons — gerar por rotação quando possível |
7.3 Ícones variáveis
Material Symbols e SF Symbols são fontes/ícones variáveis: eixos de weight (casando com o peso do texto), fill (0→1 entre line e solid), grade (ajuste fino de peso para dark mode, como o GRAD da tipografia) e optical size. Um arquivo, um espectro contínuo — menos assets, e o ícone "acompanha" a tipografia. Ver a apostila Tipografia, Módulo 7.
7.4 O pipeline
Figma (página de ícones, 1 component por ícone, no grid) │ plugin de export / API ▼ SVGs crus ──► SVGO (config do projeto) ──► validação │ (viewBox? currentColor? 1 cor? nome válido?) ▼ gerar saídas: • pacote SVG + sprite • componentes React/Vue/Web Components (SVGR) • índice pesquisável (JSON: nome, tags, categorias) ▼ publicar @empresa/icons@x.y.z (SemVer + changelog)
- Roda no CI a cada PR de ícone; a revisão inclui checagem visual (o ícone na grade da família) e de a11y (1 cor, sem texto embutido).
- Produtos consomem o pacote versionado, não copiam SVGs.
- Versionamento: adicionar ícone = minor; renomear/remover ou mudar a metáfora de um existente = major (com alias/codemod).
7.5 Integração com o design system
- Tamanhos de ícone como tokens (
--icon-size-sm/md/lg) alinhados à escala tipográfica. - A cor do ícone vem de tokens semânticos (
--color-icon,--color-icon-muted), nunca hard-coded — viacurrentColorherdando ou variável. - Os componentes do DS (Button, MenuItem, Alert) recebem ícones por prop
icone cuidam de tamanho/cor/espaçamento. Ver Design Systems & Design Tokens. - Paridade Figma ↔ código: os nomes dos componentes de ícone no Figma == os nomes no pacote.
Perguntas: "Como você nomeia ícones numa biblioteca?" (pela coisa, não pelo uso; aliases; índice com tags), "Como é o pipeline de uma biblioteca de ícones?" (Figma → export → SVGO → validação → SVG/sprite/componentes/índice → pacote versionado no CI), "O que é um ícone variável?" (eixos weight/fill/grade/opsz — Material/SF Symbols), "Como o ícone se integra ao design system?" (tokens de tamanho e cor; componentes recebem por prop).
✏️ Exercício 7 — Desenhe a biblioteca
Especifique a biblioteca de ícones de um produto: (a) a regra de nomes + 3 exemplos com aliases; (b) os eixos de variante que você suportaria; (c) o pipeline em 5 passos; (d) a política de versionamento com 2 exemplos.
Gabarito (uma boa resposta): (a) kebab-case, nome pela coisa, categorias por prefixo: trash (alias bin, delete), arrow-right (alias next), file-pdf (alias document-pdf). Índice JSON com keywords em PT e EN. (b) tamanho (16/20/24, desenhos otimizados), estilo (line/solid), direção (gerada por rotação para setas/chevrons). (c) Figma (1 component/ícone no grid 24) → export via plugin → SVGO com config do repo → validação (viewBox 0 0 24 24, currentColor, 1 path/cor, nome no padrão, sem <text>) → build (sprite + componentes SVGR + índice) e publish @empresa/icons. (d) adicionar qr-code → minor 1.4.0; renomear cog para settings (mantendo cog como alias por 1 ciclo, depois removendo) → major 2.0.0 com nota de migração.
Ícones em movimento e estados
Objetivo: animar ícones com propósito — micro-interações, morphs, ícones de estado — e as técnicas (CSS, SVG, Lottie) e limites (reduced motion).
8.1 Quando animar um ícone
- Feedback de ação: o coração que "pulsa" ao favoritar, o check que se desenha ao concluir.
- Mudança de estado: hambúrguer ↔ X, play ↔ pause, chevron que rota ao expandir.
- Progresso: spinner, barra circular, upload.
- Atenção pontual: o sino que balança quando chega notificação (com muita parcimônia).
- Não anime ícones estáticos de navegação/lista sem motivo — vira ruído e custo.
8.2 Técnicas
| Técnica | Bom para | Notas |
|---|---|---|
| CSS transition/animation sobre SVG inline | rotação, escala, opacidade, stroke-dashoffset (desenhar traço), troca de d simples | leve, sem dependência; anime transform/opacity para performance |
| SVG SMIL / Web Animations API | animar atributos SVG, timelines no JS | WAAPI é o caminho moderno; SMIL tem suporte irregular |
| Morph de path (Flubber, GSAP MorphSVG) | transformar um ícone em outro suavemente | precisa de paths compatíveis (mesmo nº de pontos) ou de interpolador |
| Lottie (Bodymovin) | animações complexas feitas no After Effects | arquivo JSON + runtime; ótimo para onboarding/estado vazio; pesa mais |
| Rive | state machines interativas, ícones que respondem a input | runtime próprio; poderoso para micro-interação com estados |
8.3 Princípios
- Curto: 120–300ms para micro-interação; a animação não pode atrasar a tarefa.
- Easing com desaceleração no fim (ease-out); nada linear.
- Significado: o movimento deve reforçar o que aconteceu (o check "confirma", o X "cancela") — decoração pura envelhece rápido.
- Consistência: mesma duração/easing para a mesma classe de interação em todo o produto (motion tokens — ver a futura apostila de Motion de Interface).
8.4 prefers-reduced-motion
@media (prefers-reduced-motion: reduce){
.icon-animate{ animation: none; transition: none; }
/* troque o "desenhar o check" por ele já aparecendo */
}
- Ofereça a versão estática equivalente — o estado final sem a transição.
- Nunca faça um ícone piscar mais de 3×/s (risco de convulsão — WCAG 2.3.1).
Perguntas: "Quando animar um ícone?" (feedback, mudança de estado, progresso — não decoração de itens estáticos), "CSS, Lottie ou Rive?" (CSS para micro-interações simples; Lottie para complexo/AE; Rive para interativo com estados), "Como você respeita reduced motion?" (versão estática equivalente; sem flash), "Que duração para uma micro-interação?" (~120–300ms, ease-out).
✏️ Exercício 8 — Especifique 3 animações
Para (a) um botão "curtir" (coração), (b) um menu que abre (hambúrguer → X), (c) um botão de "salvar" que processa e conclui — descreva a animação (o que se move, duração, easing), a técnica, e o comportamento com prefers-reduced-motion.
Gabarito (uma boa resposta): (a) coração: escala rápida 1→1.2→1 (~200ms, ease-out) + preenchimento (line→solid) + talvez um "burst" de partículas opcional; CSS transform/opacity sobre SVG inline; com reduced motion, só troca line→solid instantâneo. (b) hambúrguer→X: as três linhas rotacionam/transladam para formar o X (~250ms, ease-in-out); CSS transform em cada <line> (ou morph de path); com reduced motion, troca direta de ícone. (c) salvar: ícone de disquete/seta → spinner girando enquanto processa → check que se "desenha" via stroke-dashoffset ao concluir (~300ms) → volta ao repouso após 1s; CSS + estado no componente; com reduced motion, spinner vira um texto "Salvando…" e o check aparece pronto. Todos: duração curta, ease-out no fim, mesma linguagem de motion do resto do produto.
Governança, escala e cobertura
Objetivo: dimensionar o "core set", evitar duplicatas, rodar auditorias, lidar com múltiplas plataformas e i18n, e decidir entre lib open source e desenho próprio.
9.1 Quantos ícones um produto precisa
- O core set de um produto costuma ter 60–150 ícones — navegação, ações CRUD, status, formatos de arquivo, mídia, setas, social. Bibliotecas gerais têm milhares; você usa uma fração.
- Cada ícone novo é custo: desenho, revisão, versões, manutenção, peso. Adicione com critério.
- Um conceito, um ícone. "Editar" é sempre o lápis, em toda a UI — não lápis aqui e caneta ali.
9.2 Duplicatas e sinônimos
- Sem governança, a biblioteca acumula três "usuário", dois "download", quatro setas quase iguais.
- Prevenção: um índice pesquisável com aliases, um dono da biblioteca, e a regra de propor antes de adicionar (Módulo 7).
- Auditoria periódica: ícones órfãos (não usados em nenhum produto — via scanner de código) e ícones fora do padrão (grid/traço divergente).
9.3 Múltiplas plataformas
- iOS tem convenções próprias (SF Symbols, que casam com a tipografia do sistema e trazem milhares de símbolos "de graça"); Android gravita para Material Symbols. Forçar o mesmo set em todas as plataformas pode parecer "estrangeiro".
- Estratégia comum: um set de marca compartilhado para os ícones específicos do produto + os símbolos do sistema para o que é convencional em cada plataforma.
- Web: total controle, mas cuide do bundle (tree-shaking; não importe a lib inteira).
9.4 Internacionalização
- RTL: ícones direcionais (setas, "responder", "próximo", barra de progresso, alguns "desfazer") devem espelhar em árabe/hebraico; ícones não-direcionais (relógio, lupa) não. Marque quais viram.
- Metáforas culturais: a "casinha" de início, o polegar para cima, gestos de mão, o cifrão
$para "dinheiro", a coruja para "sabedoria" — nem sempre viajam. Prefira formas neutras + rótulo. - Ícones não substituem tradução: não coloque texto dentro do ícone.
9.5 Comprar/usar vs desenhar
| Use uma lib open source quando | Desenhe quando |
|---|---|
| o estilo dela serve à marca; a cobertura cobre 90%+ do core set; a licença permite (checar) | a marca precisa de um estilo próprio; há muitos conceitos de domínio sem ícone pronto; consistência total importa |
| time pequeno, sem icon designer | o set é pequeno e definido, e você tem quem desenhe e mantenha |
| abordagem: adote a lib e estenda no mesmo grid/traço para as lacunas | abordagem: defina o sistema (Módulos 2–3) e produza contra ele |
Perguntas: "Quantos ícones um produto precisa?" (60–150 no core; libs têm milhares, você usa uma fração), "Como você evita duplicatas numa biblioteca?" (índice + aliases + dono + propor antes; auditoria de órfãos e fora-do-padrão), "iOS, Android e web usam o mesmo set?" (set de marca + símbolos do sistema por plataforma), "Quais ícones espelham em RTL?" (os direcionais; não os simétricos/neutros), "Usar Lucide ou desenhar?" (adotar + estender se o estilo serve; desenhar se a marca pede estilo próprio).
✏️ Exercício 9 — Estratégia de ícones
Uma startup tem web + apps iOS e Android, time de design pequeno, e ~40 telas. Recomende a estratégia de ícones: lib ou desenho, como cobrir as três plataformas, governança mínima, e o que fazer com 12 conceitos de domínio (ex.: "conciliação", "split de pagamento") que nenhuma lib tem.
Gabarito (uma boa resposta): adotar uma lib open source de estilo sóbrio (Lucide/Heroicons) como base na web e Android; no iOS, usar SF Symbols para o que é convencional (economiza muito) e trazer os ícones de marca só onde precisa de identidade. Governança mínima: um dono da biblioteca, um arquivo Figma único com os ícones no grid da lib (24, traço 2px), um índice com aliases, e a regra "proponha antes de adicionar". Os 12 conceitos de domínio: desenhar no mesmo grid e traço da lib base (para se fundirem à família), revisados na grade completa, versionados no pacote @startup/icons. Auditar a cada trimestre por órfãos e divergências. Marcar quais dos direcionais espelham em RTL (se houver plano de i18n).
Mercado de trabalho: roadmap, entrevistas e portfólio
Objetivo: converter o conteúdo dos módulos em contratação — onde a habilidade é usada, um plano de estudo, um banco de perguntas e projetos que geram entrevista.
10.1 Onde iconografia pesa
- Icon designer (raro como cargo isolado; comum em foundries de ícones e times de sistema grandes).
- Design systems designer / engineer: manter a biblioteca, o pipeline, os tokens, a governança.
- Product / UI designer: escolher e estender uma lib, desenhar ícones de domínio, garantir consistência e a11y.
- Brand designer: o estilo de ícone como parte da identidade (ver Branding, Logótipos & Lettering).
- Front-end / design technologist: a entrega (SVG, sprite, componentes), performance e acessibilidade.
10.2 Roadmap de estudo (5–7 semanas)
| Semanas | Foco | Prática |
|---|---|---|
| 1 | Função, mitos, grid e keyline shapes (Módulos 1–2) | Auditar 3 apps: listar seus ícones, quais funcionam sem rótulo, o grid aparente |
| 2 | Estilo e desenho (Módulos 3–4) | Definir um sistema (grid, traço, cantos, ângulos) e desenhar 12 ícones nele |
| 3 | Ajuste óptico (Módulo 5) | Equalizar os 12 na grade completa; documentar cada ajuste |
| 4 | SVG e acessibilidade (Módulo 6) | Otimizar com SVGO; montar sprite + componentes; markup acessível de 3 casos |
| 5 | Sistema e tokens (Módulo 7) | Nomear a biblioteca, criar o índice pesquisável, esboçar o pipeline e o versionamento |
| 6 | Movimento e governança (Módulos 8–9) | Animar 3 ícones (CSS/Lottie); escrever a política de contribuição e i18n/RTL |
| 7 | Portfólio | Publicar o set com o estudo de caso (grid, decisões, ajustes, entrega) |
10.3 Banco de perguntas (com a resposta que aprova)
Júnior/pleno — "Ícones são universais?"
Quase nenhum. Lupa, casa, engrenagem, X e setas são amplamente entendidos; o resto é convenção aprendida e varia por plataforma, cultura e idade. Por isso a regra é ícone + rótulo, com ícone sozinho só quando o significado é comprovado, o espaço é crítico e há sempre um nome acessível.
Pleno — "O que são keyline shapes e por que existem?"
Formas de referência (quadrado, círculo, retângulos) com área visual equivalente — não a mesma medida. Cada ícone se encaixa na que lhe serve. Existem porque um círculo e um quadrado do mesmo tamanho medido parecem tamanhos diferentes; a keyline (com overshoot no círculo) faz a família parecer uniforme.
Pleno — "Como você garante consistência numa família de ícones?"
Um sistema fixo (grid, traço, cap/join, raio, ângulos, metáfora) + ajuste óptico ícone a ícone contra a família: peso visual uniforme (compensar ícones "cheios"), overshoot em redondos, afinar junções, alinhamento vertical com texto. O teste é montar todos numa grade pequena e escanear com o olho meio fechado — o que "salta" se ajusta.
Pleno/front-end — "Como você serve ícones e por que não ícone-fonte?"
SVG-as-component (tree-shaking, só o que se usa) em apps com framework, ou sprite <symbol>/<use> em sites. currentColor para herdar cor/tema. Ícone-fonte é legado: problemas de acessibilidade (lido como caractere), de rendering, FOUT, e alinhamento frágil.
Pleno — "Ícone decorativo vs semântico no markup?"
Decorativo (ao lado de um rótulo que já diz tudo): aria-hidden="true". Semântico/sozinho (botão só-ícone): o controle recebe aria-label; o ícone continua aria-hidden. Alvo de toque ≥ 24px, contraste ≥ 3:1 se carrega informação, e não depender só da cor entre estados.
Sénior — "Como você estrutura uma biblioteca de ícones?"
Nomes pela coisa (não pelo uso) + aliases + índice pesquisável com keywords; variantes por tamanho/estilo/direção; pipeline Figma → export → SVGO → validação → SVG/sprite/componentes/índice → pacote SemVer no CI (add = minor; renome/remoção = major com alias/codemod); tokens de tamanho e cor integrados ao design system; paridade de nomes Figma ↔ código.
Sénior — "iOS, Android e web devem usar o mesmo set?"
Não necessariamente. Um set de marca compartilhado para os ícones específicos do produto + os símbolos do sistema (SF Symbols no iOS, Material no Android) para o que é convencional em cada plataforma — assim a UI parece nativa. Na web, controle total, mas com atenção ao bundle.
Armadilha — "Pego 300 ícones de uma lib e pronto"
Você usa 60–150; o resto é peso e ruído se importado inteiro. E uma lib genérica não cobre os conceitos de domínio nem casa 100% com a marca. O certo é adotar uma lib de estilo compatível, importar só o que usa (tree-shaking), e estender no mesmo grid/traço para as lacunas — com governança para não acumular duplicatas.
10.4 Projetos de portfólio que geram entrevista
- Um set coeso de 24–36 ícones (âncora): um sistema documentado (grid, keyline shapes, traço, ângulos), os ícones equalizados na grade, e o antes/depois de 3 ajustes ópticos.
- Um ícone do conceito ao SVG: um estudo de caso de um único ícone difícil — as metáforas testadas, os esboços, o encaixe no grid, o ajuste óptico, o SVG otimizado e o markup acessível.
- Biblioteca com pipeline: um repo com SVGs → SVGO → sprite + componentes + índice pesquisável, publicado como pacote, com README de nomenclatura e versionamento.
- Estudo de acessibilidade e i18n: os mesmos ícones com markup decorativo vs semântico, estados que não dependem de cor, e o mapa de quais espelham em RTL.
- Contribuição real para uma lib open source (Lucide, Tabler, Phosphor) — um ou dois ícones aceitos, seguindo as guidelines delas.
10.5 Fontes para continuar
- Livros: The Icon Handbook (Jon Hicks); The Anatomy of Type/Thinking with Type para a disciplina de forma; catálogos como Symbol (Angus Hyland) e o AIGA/DOT Pictograms.
- Guidelines: Material Symbols / Material Design — Iconography; Apple HIG — SF Symbols; as seções de iconografia de Carbon (IBM), Polaris (Shopify), Atlassian.
- Bibliotecas para estudar o código: Lucide, Phosphor, Tabler, Radix Icons, Heroicons (repos + contribution guidelines).
- Ferramentas: SVGO / SVGOMG, SVGR, Nucleo, IcoMoon, Lottie / LottieFiles, Rive; The Noun Project e Streamline como referência de cobertura.
- Nesta trilha: Design Systems & Design Tokens, Logótipos & Lettering, Tipografia, Cor, Layout, Grade & Espaçamento; e Acessibilidade Digital & WCAG, Adobe Illustrator, Figma, CSS Avançado: Animações & SVG.
Cinco ideias sustentam a iconografia: (1) ícone é vocabulário funcional, quase nunca universal — ícone + rótulo por padrão; (2) um grid com keyline shapes e um estilo fixo (traço, cantos, ângulos, metáfora) são o andaime; (3) consistência é ajuste óptico ícone a ícone contra a família, não medida igual; (4) no código, SVG com currentColor, servido como componente ou sprite, com acessibilidade explícita — nunca ícone-fonte novo; (5) em escala, é uma biblioteca versionada com pipeline, nomes e governança, integrada ao design system.