Pular para o conteúdo
Ícones

Fundações

Ícones

Lucide, outline puro, traço de 2px, cor herdada do texto. Duotone foi testado e rejeitado — não repropor. Ícone é informativo: se não agrega informação, sai. E emoji nunca substitui ícone.
lucide-reactstroke 2size-3.5 · 4 · 5 · 6

Tamanhos

Quatro medidas. O ícone acompanha o tamanho do texto ao lado, nunca o tamanho do contêiner.
size-3.514 · botão xs, chip, dot ao lado de 12px
size-416 · botão, menu, campo, tabela
size-520 · sidebar, rail, banner
size-624 · selo circular de vazio e de erro
size-3.5 (14) denso · size-4 (16) padrão · size-5 (20) nav · size-6 (24) selo de vazio
o tamanho vem do botão, não da tag
// O Button injeta o tamanho quando o ícone não traz um:
[&_svg:not([class*='size-'])]:size-4      // padrão
size="xs" → [&_svg:not([class*='size-'])]:size-3.5

// Por isso o uso normal é simplesmente:
<Button><Plus /> Novo paciente</Button>

// E o override, quando existe, é explícito:
<Button><Plus className="size-5" /> Grande</Button>
DetalheRegra
TraçostrokeWidth 2 (o default do Lucide). 1.8 só no selo de vazio, onde o ícone é grande e o traço 2 fica pesado.
Corherda de currentColor. Ícone secundário: text-fg-subtle.
Encolhimentoshrink-0 sempre que estiver num flex — senão o ícone amassa antes do texto.
Cliquepointer-events-none quando é decorativo dentro de um alvo (a lupa do campo de busca).
Acessibilidadeo Lucide já marca aria-hidden. O nome acessível vem do texto ao lado ou do aria-label do botão.

O vocabulário fixo

Cada domínio tem UM ícone, e ele não muda entre telas. Trocar o ícone da Agenda numa tela específica é o mesmo que trocar o nome dela ali.

Navegação principal

Hoje
Agenda
Atendimento
Assistente
Números
Cadastros
Clínica
Ajustes
src/components/app-shell.tsx — a sidebar do app

Rail da Clínica

  • Dados da clínica
  • Horários & regras
  • Equipe
  • Serviços
  • Modelos de contrato
  • Custos da clínica
  • Insumos
  • Conhecimento
/ajustes/* — o tenant: cadastro, preço, custo, conhecimento

Rail da Conta

  • Perfil
  • Aparência
  • Privacidade
  • Segurança
  • Senha
/configuracoes/* — a pessoa: o que segue você entre clínicas

A assinatura de IA

Sparkles em roxo acompanha qualquer coisa que veio do agente. É o par visual da cor — juntos, dizem “isto não foi você que escreveu”.
Sugestão do agente Responder com IA Escrever convites
o selo, a ação e o botão — os três lugares onde o Sparkles aparece

O Bot é outra coisa: ele nomeia a TELA do assistente na navegação (a configuração dele), enquanto o Sparkles marca o CONTEÚDO que ele gerou. Um é endereço, o outro é procedência.

Regras

Curtas, e todas já custaram uma discussão.

Sim

Agenda

Cadastros

Outline, traço 2, tamanho igual ao texto, cor herdada, ícone que diz o que a coisa é.

Não

📅 Agenda

Cadastros

Emoji não é ícone (muda de desenho por sistema operacional e não herda cor). Ícone preenchido, colorido e maior que o texto vira mancha decorativa.

RegraDetalhe
Um ícone por conceitoSe dois lugares mostram a mesma coisa, mostram o mesmo ícone. Se mostram coisas diferentes, os ícones não podem ser parecidos.
Ícone sozinho pede aria-labelBotão só de ícone (kebab, fechar, recolher) sem rótulo visível: aria-label obrigatório, e no rail o rótulo vira sr-only + title.
Nada de biblioteca paralelaSó Lucide. Precisou de um desenho que não existe lá? Isso é uma peça de marca (SVG próprio, como o glifo do WhatsApp), não um ícone novo.
Duotone: rejeitadoTestado e recusado — não repropor. O outline é o que faz o ícone conviver com texto de qualquer peso.
Ícone não substitui rótuloNuma lista de ações, o texto manda; o ícone acelera o reconhecimento. Menu só de ícones vira adivinhação.

NotaEmoji tem UM lugar legítimo

O seletor de emoji do produto (reação a mensagem, apelido de sala) — ali o emoji é conteúdo do usuário, não elemento de interface. Em botão, menu, status ou navegação, nunca.