Skip to content

Iconografia

Biblioteca — Lucide Angular

O SystemClinic usa exclusivamente a biblioteca Lucide (lucide-angular) para todos os ícones da interface. Nenhuma outra biblioteca de ícones deve ser adicionada.

Lucide foi escolhida por:

  • Design coerente (stroke uniforme de 2 px, viewBox 24×24)
  • Tree-shakeable (só os ícones importados vão para o bundle)
  • Licença ISC (permissiva)
  • Sem dependência de fonte (SVG inline via componente Angular)

Versão em uso: lucide-angular@0.446 — veja o package.json do projeto.

Instalação e Uso

typescript
// app.config.ts
import {
  LucideAngularModule,
  LayoutDashboard,
  Users,
  Calendar,
} from "lucide-angular";

export const appConfig: ApplicationConfig = {
  providers: [
    importProvidersFrom(
      LucideAngularModule.pick({ LayoutDashboard, Users, Calendar }),
    ),
  ],
};
html
<!-- Template -->
<lucide-icon name="layout-dashboard" [size]="20" [strokeWidth]="2" />

Sempre use .pick() — nunca importe o módulo inteiro (LucideAngularModule.forRoot(icons)), pois inclui todos os ~1500 ícones no bundle.

Tamanhos Padrão

ContextoTamanhoStroke Width
Ícone em botão primário16 px2
Ícone em botão ghost / outline16 px2
Ícone em input (leading/trailing)16 px1.5
Ícone de navegação lateral20 px2
Ícone decorativo em card20 px2
Ícone de estado (empty state)48 px1.5
Ícone de ilustração64 px1.5

Nunca use tamanhos intermediários não tabelados (ex.: 18 px, 22 px). A consistência visual depende de poucos tamanhos definidos.

Cor dos Ícones

Ícones herdam a cor do texto (currentColor) por padrão. Use as classes de cor do design system:

ContextoClasse Tailwind
Ícone de ação primáriatext-brand-600
Ícone de conteúdo (neutro)text-neutral-500
Ícone inativo / disabledtext-neutral-300
Ícone de sucessotext-success-600
Ícone de errotext-error-600
Ícone de avisotext-warning-600
Ícone em fundo escurotext-neutral-100

Ícones Mapeados por Módulo

Esta tabela evita inconsistências entre telas diferentes — use o ícone mapeado, não escolha um diferente por preferência pessoal.

MóduloÍcone LucideNome no código
Dashboardlayout-dashboardLayoutDashboard
AgendamentoscalendarCalendar
PacientesusersUsers
Prontuáriofile-textFileText
FinanceirobanknoteBanknote
Relatóriosbar-chart-2BarChart2
EstoquepackagePackage
ConfiguraçõessettingsSettings

Ações Comuns

AçãoÍconeNome
Adicionar / NovoplusPlus
EditarpencilPencil
Excluirtrash-2Trash2
SalvarsaveSave
CancelarxX
Fechar modalxX
BuscarsearchSearch
FiltrarfilterFilter
ExportardownloadDownload
ImportaruploadUpload
CopiarcopyCopy
VisualizareyeEye
Ocultareye-offEyeOff
ImprimirprinterPrinter
Compartilharshare-2Share2
Ordenararrow-up-downArrowUpDown
Atualizarrefresh-cwRefreshCw

Estados e Feedback

EstadoÍconeNome
Sucesso / Concluídocheck-circle-2CheckCircle2
Errox-circleXCircle
Avisoalert-triangleAlertTriangle
InformaçãoinfoInfo
Carregandoloader-2Loader2
Vazio (empty state)inboxInbox
BloqueadolockLock

Status de Agendamento

StatusÍconeCor
Agendadoclocktext-info-500
Confirmadochecktext-brand-600
Em atendimentoactivitytext-warning-500
Concluídocheck-circle-2text-success-600
Canceladox-circletext-error-600
No-showuser-xtext-neutral-400

Regras de Acessibilidade

  • Ícones decorativos (que acompanham texto): aria-hidden="true" no elemento <lucide-icon>
  • Ícones que são o único conteúdo de um botão: o botão precisa de aria-label descritivo
  • Ícones de estado (sem texto acompanhante): adicionar <span class="sr-only">Concluído</span> junto
html
<!-- Correto — ícone decorativo -->
<button>
  <lucide-icon name="plus" aria-hidden="true" />
  Novo Agendamento
</button>

<!-- Correto — botão ícone com aria-label -->
<button aria-label="Excluir paciente João Silva">
  <lucide-icon name="trash-2" aria-hidden="true" />
</button>

<!-- Errado — ícone de estado sem alternativa textual -->
<lucide-icon name="check-circle-2" />

O que não fazer

  • Usar dois ícones diferentes para a mesma ação em telas distintas
  • Misturar Lucide com ícones de outra biblioteca (mesmo que seja para um módulo isolado)
  • Usar ícones com stroke-width diferente de 2 em elementos de navegação
  • Escalar ícones com CSS transform: scale() — use o atributo [size]
  • Criar SVGs inline customizados sem aprovação do design lead

Desenvolvido com ❤️ pela equipe FastGivr.