Ui ux

Escopo: transversal. Aplica-se a qualquer linguagem ou stack do projeto.

Interface é o contrato entre o sistema e o usuário. Cada decisão de espaçamento, cor, hierarquia e estado comunica algo. Quando essas decisões são inconsistentes, o usuário trabalha mais para entender o que o sistema oferece.

Conceitos fundamentais

ConceitoO que é
Padding (preenchimento interno)Espaço entre o conteúdo e a borda de um container
Token (valor nomeado do sistema de design)Variável semântica que representa um valor de design (cor, espaçamento, tipografia)
Viewport (área visível da tela)Porção da tela disponível para renderização no momento
WCAG (Web Content Accessibility Guidelines, Diretrizes de Acessibilidade para Conteúdo Web)Padrão internacional de acessibilidade para conteúdo web, com níveis A, AA e AAA
ARIA (Accessible Rich Internet Applications, Aplicações de Internet Ricas Acessíveis)Atributos HTML que complementam a semântica nativa para padrões complexos de UI
Skeleton (esqueleto de carregamento)Placeholder visual que representa o formato do conteúdo enquanto os dados carregam
Toast (notificação temporária)Mensagem de feedback exibida brevemente na interface, sem interromper o fluxo do usuário

Densidade Visual e Respiro

Interfaces com excesso de elementos competindo por atenção cansam o olho e aumentam o tempo de decisão. Respiro (o espaço entre elementos) é a estrutura que guia a leitura.

A regra central é agrupamento semântico: elementos relacionados ficam próximos, grupos distintos têm espaço entre eles. O olho lê a interface como parágrafos antes de ler as palavras.

Anti-patternEfeitoSolução
Texto colado na borda do containerSensação de sufocamentoPadding (preenchimento interno) consistente
Todos os elementos com o mesmo peso visualNenhuma hierarquia claraTamanho, cor e espaçamento para criar níveis
Espaçamento inconsistente entre seçõesInterface parece montada por partesSistema de espaçamento em escala fixo
Informação densa sem quebra visualCansativo de lerGrupos de no máximo 2-3 linhas com respiro entre eles

Sistema de Espaçamento

Espaçamentos arbitrários (margin: 13px, padding: 7px) criam inconsistência visual acumulada. Um sistema de espaçamento define uma escala com valores fixos que se repetem de forma consistente em toda a interface.

Escala típica baseada em múltiplos de 4:

TokenValorUso comum
space-14pxEspaço interno mínimo (ícone + label)
space-28pxPadding de componentes compactos
space-312pxGap entre elementos dentro de um grupo
space-416pxPadding padrão de cards e seções
space-624pxSeparação entre grupos distintos
space-832pxSeparação entre seções maiores
space-1248pxSeparação entre blocos de página

Usar tokens (valores nomeados do sistema de design) em vez de valores livres garante que qualquer ajuste de escala se propague de forma consistente. A interface respira no mesmo ritmo em qualquer viewport (área visível da tela).

Hierarquia Tipográfica

Texto sem hierarquia não orienta a leitura. O usuário precisa de âncoras visuais para identificar o que é título, o que é descrição, o que é detalhe.

Três níveis são suficientes para a maioria dos contextos:

NívelPapelCaracterísticas
PrimárioTítulo da seção ou ação principalTamanho maior, peso alto, cor de maior contraste
SecundárioSubtítulo, rótulo de campo, nome de itemTamanho médio, peso regular
TerciárioMetadado, data, hint (dica), legendaTamanho menor, cor mais suave

Evitar mais de três níveis tipográficos na mesma tela: a hierarquia colapsa, tudo parece especial, nada parece importante.

Temas Claro e Escuro

Temas requerem paletas re-otimizadas para cada contexto, não apenas inversão de cores. Superfícies, sombras, opacidade e contraste se comportam de forma diferente em cada fundo.

A regra prática é usar variáveis semânticas em vez de valores fixos:

AbordagemProblema
color: #1a1a1a direto no componenteNão muda com o tema
color: var(--text-primary) com valores por temaFunciona nos dois modos
--text-primary        → texto de maior hierarquia
--text-secondary      → texto de apoio
--surface-base        → fundo da página
--surface-elevated    → fundo de cards e modais
--border-subtle       → bordas de separação
--interactive-default → cor de botões e links

Para o detalhamento de OKLCH, harmonias, escala tonal de 11 paradas, hierarquia de superfícies, WCAG 1.4.3 e estratégias específicas de light/dark, consulte color-theory.md.

Acessibilidade

Acessibilidade garante que a interface funciona para todos os usuários, incluindo quem usa leitores de tela, navega pelo teclado ou tem deficiência visual.

Contraste

Texto e elementos interativos precisam de contraste suficiente contra o fundo. A regra prática: se precisar apertar os olhos para ler no mockup (protótipo visual), vai falhar em produção.

Todo elemento interativo (botão, link, campo, modal) deve ser acessível via Tab e ativável via Enter ou Space. A ordem de foco deve seguir a ordem visual da página.

Foco visível é obrigatório. Nunca remover o outline (contorno) de foco sem substituí-lo por algo equivalente ou melhor.

Semântica HTML

Elementos HTML (HyperText Markup Language, Linguagem de Marcação de Hipertexto) semânticos comunicam estrutura para leitores de tela:

EvitarUsar
<div> com click handler<button>
<div> para título<h1>–<h6>
<div> para lista<ul>/<ol>/<li>
<img> sem alt<img alt="descrição">

Leitor de tela lê o que o HTML diz, não o que a tela mostra. Um <div> com visual de botão é invisível para quem usa tecnologia assistiva.

ARIA

ARIA (Accessible Rich Internet Applications, Aplicações de Internet Ricas Acessíveis) complementa a semântica nativa para padrões complexos: menus, tooltips (dicas flutuantes), modais, comboboxes (campos de seleção combinados).

A regra de uso é simples: ARIA é o último recurso. Preferir elemento HTML semântico nativo antes de qualquer atributo ARIA. ARIA mal usado é pior que nenhum ARIA.

Estados e Feedback

Cada ação do usuário precisa de resposta visível:

EstadoComo comunicar
LoadingSpinner (ícone giratório de carregamento) ou skeleton (esqueleto de carregamento) com aria-busy
Erro de formulárioMensagem inline (integrada ao elemento) associada ao campo via aria-describedby
SucessoToast (notificação temporária) ou inline com contraste e ícone
Campo desabilitadoCombinar visual de desabilitado com atributo disabled

Estados de Interface

Toda tela tem variações de estado além do estado feliz. Projetar apenas o estado com dados é projetar metade da interface.

EstadoQuando ocorre
EmptySem dados: primeiro uso ou filtro sem resultado
LoadingDados sendo carregados
ErrorFalha na operação, com mensagem e ação de recuperação
PartialDados carregados com erro em parte deles
SuccessOperação concluída, com feedback temporário

Estado empty bem projetado orienta o usuário para a próxima ação. Estado de erro bem projetado diz o que aconteceu e o que fazer. Tela em branco e mensagem técnica indicam estados sem tratamento.

Desenvolvido por @thiagocajadev · Fork baseado no repositório pmndrs/docs · Poimandres.