O que é consistência visual (e por que um mini design system resolve)
Consistência visual é a capacidade do app “parecer e se comportar do mesmo jeito” em todas as telas: mesmas cores para os mesmos significados, mesmos tamanhos de texto para os mesmos níveis de informação, mesmos espaçamentos para relações semelhantes e componentes com aparência/estados previsíveis. Para um time pequeno (ou uma pessoa), o problema não é falta de criatividade: é a multiplicação de pequenas decisões repetidas (um azul ligeiramente diferente aqui, um padding diferente ali) que vira retrabalho e inconsistência.
Um mini design system é um conjunto enxuto de decisões reutilizáveis: tokens (valores base como cores, tipografia e espaçamento), estilos de componentes (botões, campos, cards etc.), regras de uso (quando e como aplicar) e um processo simples de revisão para evitar duplicações. A meta é reduzir variação desnecessária sem criar burocracia.
Princípio prático: decisões viram tokens
Em vez de escolher valores “no olho” em cada tela, você escolhe uma vez e referencia sempre. Isso vale para:
- Cores (papéis semânticos e variações)
- Tipografia (estilos nomeados)
- Espaçamentos (escala curta e consistente)
- Raios, bordas, sombras (se aplicável)
- Ícones e ilustrações (estilo e regras de uso)
Tokens: nomear por intenção, não por aparência
Evite nomes como blue500 em tudo. Prefira nomes que expressem o papel: primary, surface, textPrimary, danger. Isso permite trocar a cor real depois sem refatorar telas.
// Exemplo de tokens (estrutura conceitual, não depende de framework) colors: { primary: "#2F6BFF", onPrimary: "#FFFFFF", surface: "#FFFFFF", onSurface: "#111827", muted: "#6B7280", border: "#E5E7EB", success: "#16A34A", warning: "#F59E0B", danger: "#DC2626" }, typography: { title: { size: 20, weight: 700, lineHeight: 28 }, subtitle: { size: 16, weight: 600, lineHeight: 24 }, body: { size: 14, weight: 400, lineHeight: 20 }, caption: { size: 12, weight: 400, lineHeight: 16 } }, spacing: { xs: 4, sm: 8, md: 12, lg: 16, xl: 24, xxl: 32 }, radius: { sm: 8, md: 12, lg: 16 }Passo a passo: criando um mini design system em 60–90 minutos
Passo 1 — Defina o “escopo mínimo” (para não virar projeto paralelo)
Liste o que você realmente usa no app hoje (ou no MVP):
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
- 2–3 superfícies (fundo, cards, modais)
- 1 cor primária + estados (sucesso/alerta/erro)
- 4 estilos tipográficos nomeados
- 6–8 valores de espaçamento
- 5–8 componentes mais frequentes (ex.: botão, campo, card, lista, chip, badge, top bar)
Regra: se algo aparece em 3+ telas, merece token/estilo padronizado.
Passo 2 — Congele uma paleta por papéis (semântica)
Em vez de criar dezenas de tons, defina papéis e variações essenciais:
- Brand/Primary: cor principal de ação
- Surface: fundo e cartões
- Text: texto principal e secundário
- Border/Divider: separadores
- Feedback: sucesso, alerta, erro
Crie também uma regra simples de uso: “Primary só para ações principais e elementos interativos; Danger só para ações destrutivas; texto secundário usa muted”.
Passo 3 — Padronize estilos tipográficos por função
Você já tem uma escala tipográfica definida em capítulos anteriores; aqui o foco é transformar em estilos nomeados para uso consistente. Exemplo de mapeamento:
| Estilo | Uso | Regras rápidas |
|---|---|---|
title | Título de tela | 1 por tela; evita quebra em 3+ linhas |
subtitle | Seções e cards | Usar para agrupar conteúdo |
body | Texto padrão | Para descrições e labels longas |
caption | Ajuda/metadata | Não usar para informações críticas |
Regra anti-inconsistência: não crie “body2”, “body3” sem um motivo claro. Se surgiu necessidade, revise o sistema (não a tela).
Passo 4 — Crie uma escala de espaçamento curta e obrigatória
Espaçamento é onde nascem muitas variações invisíveis. Defina uma escala (por exemplo, múltiplos de 4 ou 8) e proíba valores fora dela.
- Use
xs/sm/md/lg/xlpara margens internas/externas - Defina padrões: padding de card, espaçamento entre itens de lista, margem de seção
Exemplo de regras de uso:
- Padding de card:
lg - Espaço entre título e conteúdo:
sm - Espaço entre seções:
xl - Altura mínima de área clicável: use o componente, não “ajuste no padding”
Passo 5 — Padronize componentes com variantes e estados
Você não precisa documentar todos os componentes do mundo. Comece pelos que mais se repetem e defina:
- Variantes (ex.: botão primário/segundário/terciário)
- Tamanhos (ex.: padrão e compacto)
- Estados (normal, pressionado, desabilitado, loading, foco)
- Regras de conteúdo (texto, ícone, alinhamento)
Exemplo: especificação enxuta de Botão
| Item | Decisão |
|---|---|
| Variantes | primary, secondary, ghost, danger |
| Tamanhos | md (padrão), sm (listas/áreas densas) |
| Padding | Horizontal lg, vertical md |
| Raio | md |
| Ícone | Opcional à esquerda; tamanho consistente; gap sm |
| Loading | Substitui ícone por spinner; mantém largura |
Regra anti-duplicação: se alguém precisar de “um botão quase igual”, a pergunta é: isso é uma nova variante oficial ou um uso incorreto do botão existente?
Passo 6 — Defina estilo de ícones e ilustrações (para não misturar linguagens)
Mesmo com bons componentes, misturar ícones/ilustrações de estilos diferentes quebra a unidade visual. Defina um “contrato”:
- Ícones: preenchido ou contorno (escolha 1), espessura consistente, cantos coerentes, tamanho padrão (ex.: 20/24), alinhamento vertical com texto.
- Cores: ícone segue
onSurfacepor padrão; usaprimaryapenas para ação/ênfase. - Ilustrações: se usar, defina paleta limitada, nível de detalhe e quando aparecem (ex.: apenas estados vazios e onboarding).
Regra prática: não misture ícones “outline” com “filled” na mesma barra de navegação ou lista de ações.
Documentação mínima: uma página que evita 80% do caos
Você não precisa de um portal complexo. Uma única página (documento ou arquivo no repositório) já resolve, desde que seja fácil de achar e atualizar. Estrutura sugerida:
1) Paleta
- Tokens de cor (nome + valor)
- Regras de uso (o que é permitido/proibido)
- Exemplos: “links usam
primary”, “erro usadanger+ texto explicativo”
2) Escala tipográfica
- Estilos nomeados (
title,subtitle,body,caption) - Onde usar cada um
- Regras: evitar criar novos estilos sem revisão
3) Escala de espaçamento
- Lista de tokens (
xs…xxl) - Padrões recomendados (card, lista, seção)
- Regra: não usar valores fora da escala
4) Componentes padrão e estados
- Para cada componente: variantes, tamanhos, estados e exemplos de uso
- Links/âncoras para arquivos de design ou snippets de código (se existirem)
5) Regras rápidas (checklist)
- Não inventar nova cor fora dos tokens
- Não inventar novo tamanho de fonte fora dos estilos
- Não usar espaçamento “quebrado” (ex.: 10, 14) fora da escala
- Se um componente não atende, propor variante oficial
Processo leve de revisão: como evitar componentes duplicados e inconsistências
O objetivo é detectar divergências cedo, antes de virar “cada tela com seu kit”. Um processo simples:
1) Regra do “antes de criar, procure”
Antes de criar um componente novo, faça uma busca rápida (no design e no código) por:
- Nome do componente (ex.: “Card”, “ListItem”, “Button”)
- Função (ex.: “linha de configuração”, “item de lista com ícone”)
Se já existe algo parecido, adapte por variante/props em vez de duplicar.
2) Revisão semanal de consistência (15–30 min)
Separe um momento fixo (ou a cada sprint) para revisar:
- Novas telas: estão usando tokens e componentes padrão?
- Novos componentes: são realmente necessários?
- Variações surgidas: viraram variantes oficiais ou são exceções?
Saída da revisão: uma lista curta de ações, por exemplo “unificar dois cards”, “criar variante compacta do ListItem”, “remover cor fora da paleta”.
3) Critérios objetivos para aceitar uma nova variante
Use critérios simples para não virar debate infinito:
- Repetição: aparece em 3+ lugares ou está previsto que aparecerá?
- Diferença funcional: muda comportamento/estado, não só estética?
- Compatibilidade: não quebra padrões de espaçamento/tipografia?
4) “Mapa de componentes” para detectar duplicatas
Mantenha uma tabela curta na documentação com os componentes existentes e suas variantes. Isso ajuda a perceber quando alguém está prestes a criar “Button2”.
| Componente | Variantes | Onde usar | Observações |
|---|---|---|---|
| Button | primary, secondary, ghost, danger | Ações | Loading mantém largura |
| TextField | default, withIcon | Formulários | Erro abaixo do campo |
| Card | default, clickable | Listas, detalhes | Padding padrão = lg |
Dica de implementação para devs: centralize tokens e evite “números mágicos”
Mesmo sem framework específico, a ideia é a mesma: tokens em um único lugar e uso por referência. Exemplos de práticas:
- Arquivo único de tokens (ex.:
tokens.jsonoutheme.ts) - Componentes recebem variantes por parâmetro (ex.:
variant="primary") - Evitar
#2F6BFFe16espalhados no código; usarcolors.primaryespacing.lg
// Exemplo conceitual de uso (pseudo-código) Button({ variant: "primary", size: "md" }) Text({ style: "subtitle" }) Container({ padding: spacing.lg, background: colors.surface })