Princípios de Design para Engenheiros de Software: O Guia Completo
title: “Princípios de Design para Engenheiros de Software: O Guia Completo” description: “Domine os fundamentos de design visual para construir interfaces melhores. Psicologia da Gestalt, tipografia, teoria das cores, sistemas de espaçamento, princípios de animação e lições de lendas do design como Dieter Rams. Inclui estudos de caso de 16 produtos excepcionais.” date: 2026-01-14 updated: 2026-01-17T13:30:00 author: Blake Crosley category: Design & Development tags: [Design, UI, UX, Typography, Color Theory, Gestalt, Animation, CSS, SwiftUI] url_slugs: - design-principles-software-engineers-complete-guide-2026 - visual-design-fundamentals-developers
Princípios de Design para Engenheiros de Software: O Guia Completo
Atualizado em 17 de janeiro de 2026
Atualização de Janeiro de 2026: Este guia consolida princípios atemporais de design com padrões modernos de implementação para desenvolvimento web e iOS. Ele abrange psicologia da Gestalt, sistemas tipográficos, teoria das cores, hierarquia visual, espaçamento e animação—além de lições de Dieter Rams. Veja Estudos de Design para análises aprofundadas de 16 produtos excepcionais.
Passei anos estudando design enquanto construía software, absorvendo princípios de lendas como Dieter Rams e dissecando interfaces de produtos como Linear, Stripe e Raycast. Este guia destila esse entendimento na referência abrangente que eu gostaria que existisse quando comecei a me preocupar com a aparência e a sensação do meu software.
Design não é decoração. É comunicação. Cada pixel comunica função, hierarquia e significado. A diferença entre um software que parece amador e um software que parece profissional está em entender esses princípios e aplicá-los consistentemente.
Este guia assume que você já sabe escrever código. Ele ensina você a ver—a entender por que algumas interfaces parecem sem esforço enquanto outras parecem caóticas, e mais importante, como construir as primeiras.
Sumário
Parte 1: Fundamentos
- Psicologia da Gestalt
- Tipografia
- Teoria das Cores
- Hierarquia Visual
- Espaçamento e Ritmo
- Princípios de Animação
Parte 2: Filosofia de Design
Parte 3: Implementação
Parte 4: Referência
Psicologia da Gestalt
“O todo é diferente da soma de suas partes.” — Kurt Koffka
A psicologia da Gestalt, desenvolvida na Alemanha dos anos 1920, explica como os humanos percebem informações visuais. O cérebro não vê pixels individuais—ele organiza elementos em padrões significativos. Domine esses princípios para controlar como os usuários percebem suas interfaces.
Proximidade
Elementos próximos são percebidos como um grupo.
Este é o princípio da Gestalt mais poderoso no design de UI. O espaço comunica relacionamento mais do que qualquer outra propriedade visual.
ERRADO (espaçamento igual = sem agrupamento):
┌─────────────────┐
│ Label │
│ │
│ Campo de Input │
│ │
│ Label │
│ │
│ Campo de Input │
└─────────────────┘
CERTO (espaçamento desigual = grupos claros):
┌─────────────────┐
│ Label │
│ Campo de Input │ ← Apertado (4px) - relacionados
│ │
│ │ ← Amplo (24px) - separando grupos
│ Label │
│ Campo de Input │ ← Apertado (4px) - relacionados
└─────────────────┘
Implementação CSS:
.form-group {
margin-bottom: 24px; /* Entre grupos: amplo */
}
.form-group label {
margin-bottom: 4px; /* Label para input: apertado */
display: block;
}
Implementação SwiftUI:
VStack(alignment: .leading, spacing: 4) { // Apertado dentro do grupo
Text("Email")
.font(.caption)
.foregroundStyle(.secondary)
TextField("[email protected]", text: $email)
.textFieldStyle(.roundedBorder)
}
.padding(.bottom, 24) // Amplo entre grupos
Similaridade
Elementos que compartilham características visuais parecem relacionados.
Quando elementos têm a mesma aparência, os usuários assumem que funcionam da mesma forma. É por isso que sistemas de design usam estilos consistentes de botões, tratamentos de cards e tipografia.
Exemplo de Navegação:
┌───────────────────────────────────┐
│ [Dashboard] [Projetos] [Config] │ ← Mesmo estilo = mesma função
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │Card │ │Card │ │Card │ │ ← Mesmo estilo = mesmo tipo de conteúdo
│ └─────┘ └─────┘ └─────┘ │
│ │
│ [+ Novo Projeto] │ ← Estilo diferente = função diferente
└───────────────────────────────────┘
Figura-Fundo
O conteúdo deve se separar claramente do fundo.
O cérebro precisa distinguir a “figura” (no que focar) do “fundo” (o plano de fundo). Relações figura-fundo ruins criam confusão visual.
Técnicas: - Contraste (figura clara em fundo escuro, ou vice-versa) - Sombras (elevar a figura acima do fundo) - Bordas (delinear as bordas da figura) - Desfoque (desfocar o fundo, nitidez na figura)
/* Relação figura-fundo forte */
.card {
background: var(--color-surface); /* Figura */
border-radius: 12px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1); /* Elevação */
}
.modal-overlay {
background: rgba(0, 0, 0, 0.5); /* Escurecer o fundo */
backdrop-filter: blur(4px); /* Desfocar o fundo */
}
Região Comum
Elementos dentro de uma fronteira são percebidos como agrupados.
Encerrar elementos dentro de um container visual (card, caixa, área com borda) sinaliza que eles pertencem juntos.
Continuidade
O olho segue caminhos, linhas e curvas.
Use alinhamento e fluxo visual para guiar a atenção através da sua interface.
CONTINUIDADE NO ALINHAMENTO:
┌────────────────────────────────┐
│ Logo [Nav] [Nav] [Nav] │ ← Alinhados no eixo horizontal
├────────────────────────────────┤
│ │
│ Título │
│ ───────────────────────────── │ ← O olho segue a margem esquerda
│ Texto do parágrafo continua │
│ ao longo da mesma borda │
│ │
│ [Ação Principal] │ ← Ainda na borda esquerda
└────────────────────────────────┘
Fechamento
O cérebro completa formas incompletas.
Os usuários não precisam de cada pixel desenhado—eles completarão mentalmente formas familiares. Isso permite designs mais minimalistas e elegantes.
/* Scroll horizontal com card parcial (fechamento) */
.card-carousel {
display: flex;
gap: 16px;
overflow-x: auto;
padding-right: 48px; /* Mostrar card parcial = dica de scroll */
}
.card-carousel .card {
flex: 0 0 280px; /* Largura fixa, parcialmente visível */
}
Referência Rápida da Gestalt
| Princípio | Regra | Uso Principal |
|---|---|---|
| Proximidade | Relacionados = perto, não relacionados = longe | Campos de formulário, seções de conteúdo |
| Similaridade | Mesma aparência = mesma função | Botões, cards, navegação |
| Figura-Fundo | Separação clara de camadas | Cards, modais, overlays |
| Região Comum | Fronteiras agrupam conteúdo | Seções de configurações, cards de usuário |
| Continuidade | Seguir linhas e alinhamento | Timelines, fluxo de leitura |
| Fechamento | Cérebro completa formas | Ícones, dicas de scroll, skeletons |
Tipografia
“Tipografia é a arte de dar à linguagem humana uma forma visual durável.” — Robert Bringhurst
A tipografia é a base do design de interfaces. O texto comunica funcionalidade, hierarquia e marca. Uma tipografia ruim torna as interfaces mais difíceis de usar; uma tipografia excelente é invisível—simplesmente funciona.
Escala Tipográfica
Uma escala consistente cria harmonia visual. Use uma proporção matemática.
A Escala 1.25 (Recomendada para UI):
:root {
/* Base: 16px (1rem) */
--text-xs: 0.64rem; /* 10.24px - use com moderação */
--text-sm: 0.8rem; /* 12.8px - legendas, labels */
--text-base: 1rem; /* 16px - texto do corpo */
--text-lg: 1.25rem; /* 20px - texto de destaque */
--text-xl: 1.563rem; /* 25px - h4 */
--text-2xl: 1.953rem; /* 31.25px - h3 */
--text-3xl: 2.441rem; /* 39px - h2 */
--text-4xl: 3.052rem; /* 48.8px - h1 */
}
Altura de Linha (Entrelinha)
A altura de linha afeta dramaticamente a legibilidade. Diferentes conteúdos precisam de diferentes entrelinhas.
| Tipo de Conteúdo | Altura de Linha | Por quê |
|---|---|---|
| Títulos | 1.1 - 1.2 | Compacto, negrito, curto |
| Texto de UI | 1.3 - 1.4 | Labels, botões |
| Texto do Corpo | 1.5 - 1.7 | Parágrafos legíveis |
| Leitura Longa | 1.7 - 2.0 | Artigos, documentação |
Comprimento da Linha (Medida)
O comprimento ideal da linha previne fadiga ocular e melhora a compreensão de leitura.
- Ideal: 45-75 caracteres por linha
- Alvo: 50-65 caracteres
- Máximo absoluto: 85 caracteres
p {
max-width: 65ch; /* unidade ch = largura do caractere '0' */
}
.article-body {
max-width: 70ch;
margin: 0 auto;
}
Seleção de Fontes
Fontes do sistema primeiro. Elas carregam instantaneamente, combinam com a plataforma e são otimizadas para telas.
:root {
--font-sans: system-ui, -apple-system, BlinkMacSystemFont,
'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
--font-mono: ui-monospace, 'SF Mono', 'Cascadia Code',
'JetBrains Mono', Consolas, monospace;
}
Use fontes personalizadas para: - Diferenciação de marca (sites de marketing) - Sensação editorial/publicação - Intenção de design específica não alcançável com fontes do sistema
Peso da Fonte para Hierarquia
Use o peso para estabelecer hierarquia, não apenas o tamanho.
h1 { font-weight: 700; } /* Negrito */
h2 { font-weight: 600; } /* Seminegrito */
h3 { font-weight: 600; } /* Seminegrito */
.lead { font-weight: 500; } /* Médio */
p { font-weight: 400; } /* Regular */
.meta { font-weight: 400; color: var(--text-muted); }
Referência Rápida de Tipografia
| Propriedade | Texto do Corpo | Títulos | Labels de UI |
|---|---|---|---|
| Tamanho | 16-18px | 24-48px | 12-14px |
| Peso | 400 | 600-700 | 500 |
| Altura de Linha | 1.5-1.7 | 1.1-1.2 | 1.3-1.4 |
| Comprimento da Linha | 45-75ch | N/A | N/A |
| Alinhamento | Esquerda | Centro OK | Esquerda |
Teoria das Cores
“A cor é um poder que influencia diretamente a alma.” — Wassily Kandinsky
A cor comunica mais rápido que palavras. Ela estabelece o clima, guia a atenção, sinaliza significado e constrói reconhecimento de marca.
A Regra 60-30-10
A distribuição de cores mais confiável para interfaces equilibradas.
┌──────────────────────────────────────────┐
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│ 60% - Dominante (Fundo)
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░│ 30% - Secundária (Cards, seções)
│░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░│
│░░░░░▓▓▓▓▓▓▓▓▓▓▓▓██████▓▓▓▓▓▓▓▓▓▓░░░░░░░░│ 10% - Destaque (Botões, links)
└──────────────────────────────────────────┘
Construindo uma Paleta de Cores
Toda interface precisa destas cores semânticas:
:root {
/* Marca */
--color-primary: hsl(220, 80%, 50%);
--color-primary-hover: hsl(220, 80%, 45%);
/* Semânticas */
--color-success: hsl(142, 76%, 36%); /* Verde - positivo */
--color-warning: hsl(38, 92%, 50%); /* Âmbar - cautela */
--color-error: hsl(0, 84%, 60%); /* Vermelho - perigo */
/* Neutros */
--color-background: hsl(0, 0%, 100%);
--color-surface: hsl(220, 14%, 96%);
--color-border: hsl(220, 13%, 91%);
/* Texto */
--color-text: hsl(220, 13%, 13%);
--color-text-secondary: hsl(220, 9%, 46%);
--color-text-muted: hsl(220, 9%, 64%);
}
Psicologia das Cores
| Cor | Psicologia | Uso em UI |
|---|---|---|
| Azul | Confiança, estabilidade, calma | Finanças, tecnologia, corporativo |
| Verde | Crescimento, natureza, sucesso | Saúde, ecologia, estados positivos |
| Vermelho | Energia, urgência, perigo | Alertas, promoções, erros |
| Laranja | Calor, entusiasmo | CTAs, marcas descontraídas |
| Amarelo | Otimismo, cautela | Avisos, destaques |
| Roxo | Luxo, criatividade | Produtos premium |
Contraste para Acessibilidade
| Nível | Texto Normal | Texto Grande | Componentes de UI |
|---|---|---|---|
| AA | 4.5:1 | 3:1 | 3:1 |
| AAA | 7:1 | 4.5:1 | N/A |
Ferramentas: WebAIM Contrast Checker, seletor de cores do Chrome DevTools
Hierarquia Visual
“Design é o embaixador silencioso da sua marca.” — Paul Rand
A hierarquia visual controla o que os usuários veem primeiro, segundo e terceiro. Sem hierarquia clara, os usuários precisam se esforçar para encontrar informações. Com ela, as interfaces parecem sem esforço.
As Seis Ferramentas da Hierarquia
1. Tamanho — Elementos maiores atraem atenção primeiro
.hero-title { font-size: 3rem; } /* Dominante */
.section-title { font-size: 1.5rem; } /* Secundário */
.body-text { font-size: 1rem; } /* Base */
2. Peso — Negrito salta para frente, leve recua
h1 { font-weight: 700; }
.lead { font-weight: 500; }
p { font-weight: 400; }
3. Cor e Contraste — Alto contraste = atenção
.title { color: var(--color-text); } /* Quase preto */
.meta { color: var(--color-text-muted); } /* Cinza */
4. Posição — Posições-chave importam
PADRÃO F (páginas de conteúdo): PADRÃO Z (landing pages):
████████████████████████ 1 ──────────────────► 2
████████ ↘
████ ↘
██ ↘
3 ──────────────────► 4
5. Espaço em Branco — Isolamento cria importância
.hero { padding: 120px 48px; } /* Espaço generoso */
.data-table { padding: 12px; } /* Conteúdo denso */
6. Profundidade e Elevação — Elementos que se destacam exigem atenção
:root {
--shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
--shadow-md: 0 4px 6px rgba(0,0,0,0.1);
--shadow-lg: 0 10px 15px rgba(0,0,0,0.1);
}
.card { box-shadow: var(--shadow-sm); }
.card:hover { box-shadow: var(--shadow-md); }
.modal { box-shadow: var(--shadow-lg); }
O Teste do Olhar Semicerrado
Semicerre os olhos para o seu design. Ainda consegue ver a hierarquia? Se sim, ela é forte.
Espaçamento e Ritmo
“O espaço em branco é como o ar: é necessário para o design respirar.” — Wojciech Zieliński
O espaçamento é a estrutura invisível do design. Espaçamento consistente cria ritmo visual—a sensação de que os elementos pertencem juntos em um sistema coerente.
O Grid de 8px
O grid de 8px é o padrão da indústria porque: - Divide uniformemente (8, 16, 24, 32, 40, 48…) - Funciona com densidades de tela comuns (1x, 1.5x, 2x, 3x) - Cria ritmo consistente sem cálculos
:root {
--space-1: 4px; /* Apertado: espaços entre ícones */
--space-2: 8px; /* Compacto: elementos inline */
--space-3: 12px; /* Justo: campos de formulário */
--space-4: 16px; /* Padrão: maioria dos espaços */
--space-6: 24px; /* Espaçoso: padding de cards */
--space-8: 32px; /* Espaços entre seções */
--space-12: 48px; /* Seções principais */
--space-16: 64px; /* Seções de página */
--space-20: 80px; /* Espaçamento de hero */
}
Espaçamento Interno vs Externo
Interno (padding): Espaço dentro de um elemento Externo (margin): Espaço entre elementos
Regra: O espaçamento interno deve ser tipicamente maior que o espaçamento externo dentro de grupos relacionados.
.card {
padding: 24px; /* Interno: espaçoso */
margin-bottom: 16px; /* Externo: menor que o padding */
}
Padrões de Espaçamento de Componentes
Cards:
.card { padding: 24px; border-radius: 12px; }
.card-header { margin-bottom: 16px; }
.card-title { margin-bottom: 4px; } /* Justo ao subtítulo */
Botões:
.btn { padding: 12px 24px; border-radius: 8px; }
.btn--sm { padding: 8px 16px; }
.btn--lg { padding: 16px 32px; }
.btn-group { display: flex; gap: 12px; }
Formulários:
.form-row { margin-bottom: 24px; }
.form-label { margin-bottom: 4px; }
.form-help { margin-top: 4px; }
.form-actions { margin-top: 32px; display: flex; gap: 12px; }
Referência Rápida de Espaçamento
| Contexto | Espaçamento Recomendado |
|---|---|
| Ícone para texto | 4-8px |
| Label para input | 4px |
| Entre grupos de formulário | 24px |
| Padding de card | 20-24px |
| Espaço entre cards | 16-24px |
| Padding de seção (mobile) | 48-64px |
| Padding de seção (desktop) | 80-96px |
| Padding de botão (h/v) | 24px / 12px |
Princípios de Animação
“Animação não é a arte de desenhos que se movem, mas a arte de movimentos que são desenhados.” — Norman McLaren
A animação dá vida às interfaces. Bem feita, ela guia a atenção, comunica estado e cria conexão emocional. Mal feita, frustra e distrai.
O Princípio Central
A animação deve parecer inevitável, não decorativa.
Boa animação: 1. Comunica algo que o design estático não consegue 2. Reduz a carga cognitiva mostrando relacionamentos 3. Parece natural e esperada 4. Desaparece da consciência
Má animação: 1. Existe apenas porque “parece legal” 2. Atrasa o usuário 3. Chama atenção para si mesma 4. Cria ansiedade ou impaciência
Princípios-Chave para UI
1. Antecipação — Prepare os usuários para o que vem a seguir.
.button {
transition: transform 0.1s ease-out;
}
.button:active {
transform: scale(0.97); /* Leve pressão antes da ação */
}
2. Continuidade — Deixe o movimento completar naturalmente com assentamento tipo mola.
.panel {
transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}
withAnimation(.spring(response: 0.4, dampingFraction: 0.7)) {
isOpen = true
}
3. Ease-In, Ease-Out — Nada na natureza se move em velocidade constante.
| Curva | Quando Usar | Característica |
|---|---|---|
ease-out |
Elementos entrando | Início rápido, parada suave |
ease-in |
Elementos saindo | Início suave, saída rápida |
ease-in-out |
Mudanças de estado | Suave do início ao fim |
linear |
Indicadores de carregamento | Contínuo, mecânico |
4. Encenação — Direcione a atenção para o que importa. Apenas uma coisa deve se mover por vez, a menos que coreografado como grupo.
5. Escalonamento — Elementos devem chegar em sequência, não todos de uma vez.
.list-item {
animation: fadeSlideIn 0.3s ease-out both;
}
.list-item:nth-child(1) { animation-delay: 0ms; }
.list-item:nth-child(2) { animation-delay: 50ms; }
.list-item:nth-child(3) { animation-delay: 100ms; }
.list-item:nth-child(4) { animation-delay: 150ms; }
@keyframes fadeSlideIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
Diretrizes de Timing
| Duração | Caso de Uso | Sensação |
|---|---|---|
| 50-100ms | Micro-interações (hover, pressionar) | Feedback instantâneo |
| 150-200ms | Mudanças de estado simples (alternar, selecionar) | Ágil |
| 250-350ms | Transições médias (deslizar painel, virar card) | Suave |
| 400-500ms | Movimentos grandes (transições de página, modais) | Deliberado |
Performance: A Regra de Ouro
Anime apenas transform e opacity — estes são acelerados por GPU e não disparam layout.
/* RUIM: Animando layout */
.panel { transition: left 0.3s, width 0.3s; }
/* BOM: Usando transform */
.panel { transition: transform 0.3s; }
Quando NÃO Animar
-
Usuário tem
prefers-reduced-motionhabilitadocss @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } } -
Animação não adiciona informação — spinners gratuitos, elementos quicando
- Usuários estão com pressa — estados de erro, validação de formulário, resultados de busca
- Animação atrasaria ações repetidas — atalhos de teclado devem ignorar animação
Referência Rápida de Animação
:root {
/* Durações */
--duration-instant: 0.1s;
--duration-fast: 0.15s;
--duration-normal: 0.25s;
--duration-slow: 0.4s;
/* Easings */
--ease-out: cubic-bezier(0.0, 0.0, 0.58, 1.0);
--ease-in: cubic-bezier(0.42, 0.0, 1.0, 1.0);
--ease-in-out: cubic-bezier(0.42, 0.0, 0.58, 1.0);
--ease-out-back: cubic-bezier(0.34, 1.56, 0.64, 1);
}
Dieter Rams: Dez Princípios
“Menos, mas melhor.” — Dieter Rams
Dieter Rams é o designer industrial mais influente do século XX. Como chefe de design na Braun de 1961-1995, ele criou produtos que permanecem atemporais décadas depois. Seu trabalho inspirou diretamente a linguagem de design da Apple.
Os Dez Princípios do Bom Design
1. Bom design é inovador Não copie. Combine tecnologia avançada com design inovador.
2. Bom design torna um produto útil Todo elemento deve servir a um propósito. A forma segue a função.
3. Bom design é estético A beleza não é superficial—é essencial. Produtos que usamos diariamente afetam nosso bem-estar.
4. Bom design torna um produto compreensível Usuários não devem precisar de instruções. A interface ensina a si mesma.
5. Bom design é discreto O design deve apoiar, não sobrecarregar. O conteúdo do usuário é a estrela, não sua UI.
/* Intrusivo: UI compete com conteúdo */
.editor {
background: linear-gradient(135deg, purple, blue);
border: 3px dashed gold;
}
/* Discreto: UI recua, conteúdo brilha */
.editor {
background: var(--color-background);
border: 1px solid var(--color-border);
}
6. Bom design é honesto Não use dark patterns. Não prometa demais. Seja transparente sobre limitações.
7. Bom design é duradouro Evite tendências que envelhecerão rapidamente. Clássico sobre modismo.
MODISMO (vai envelhecer): ATEMPORAL:
- Glassmorphism extremo - Tipografia limpa
- Cores neon, efeitos glitch - Elevação sutil
- Gradientes agressivos - Paleta neutra com destaque pensado
8. Bom design é minucioso até o último detalhe Nada deve ser arbitrário. Estados de carregamento, estados vazios, estados de erro—tudo projetado.
9. Bom design é ambientalmente consciente Performance é ambiental. Respeite a atenção do usuário. Código eficiente.
10. Bom design é o mínimo de design possível Remova tudo que não é necessário. O melhor design é invisível.
Padrões Web 2025
O design web moderno utiliza recursos nativos do CSS que eliminam a necessidade de JavaScript em muitos casos.
Container Queries
Dimensione componentes com base em seu contêiner, não na viewport.
.card-grid {
container-type: inline-size;
container-name: card-grid;
}
.card {
display: grid;
gap: 16px;
padding: 20px;
}
@container card-grid (min-width: 400px) {
.card {
grid-template-columns: auto 1fr;
}
}
@container card-grid (min-width: 600px) {
.card {
padding: 32px;
gap: 24px;
}
}
O Seletor :has()
Seleção de elemento pai com base nos filhos—anteriormente impossível sem JavaScript.
/* Card com imagem recebe padding diferente */
.card:has(img) {
padding: 0;
}
.card:has(img) .card-content {
padding: 20px;
}
/* Grupo de formulário com erro */
.form-group:has(.input:invalid) .form-label {
color: var(--color-error);
}
/* Destacar navegação quando estiver na página */
.nav-item:has(a[aria-current="page"]) {
background: var(--color-surface);
}
CSS Nesting
Aninhamento nativo sem pré-processadores.
.card {
background: var(--color-surface);
border-radius: 12px;
padding: 24px;
& .card-title {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 8px;
}
& .card-body {
color: var(--color-text-secondary);
line-height: 1.6;
}
&:hover {
box-shadow: var(--shadow-md);
}
@media (min-width: 768px) {
padding: 32px;
}
}
Integração com HTMX
Interatividade orientada pelo servidor sem frameworks JavaScript pesados.
<!-- Carregar conteúdo ao clicar -->
<button hx-get="/api/more-items"
hx-target="#item-list"
hx-swap="beforeend"
hx-indicator="#loading">
Load More
</button>
<!-- Formulário com validação inline -->
<form hx-post="/api/contact"
hx-target="#form-response"
hx-swap="outerHTML">
<input type="email" name="email"
hx-post="/api/validate-email"
hx-trigger="blur"
hx-target="next .error" />
<span class="error"></span>
</form>
Sistema de Design Tokens
Um sistema de tokens completo para consistência em toda sua aplicação.
:root {
/* Cores */
--color-text: #1a1a1a;
--color-text-secondary: #666666;
--color-text-muted: #999999;
--color-background: #ffffff;
--color-surface: #f8f9fa;
--color-surface-elevated: #ffffff;
--color-border: #e5e7eb;
--color-primary: #3b82f6;
--color-primary-hover: #2563eb;
--color-success: #10b981;
--color-warning: #f59e0b;
--color-error: #ef4444;
/* Tipografia */
--font-sans: system-ui, -apple-system, sans-serif;
--font-mono: "SF Mono", Consolas, monospace;
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-lg: 1.125rem;
--text-xl: 1.25rem;
--text-2xl: 1.5rem;
--text-3xl: 2rem;
--leading-tight: 1.25;
--leading-normal: 1.5;
--leading-relaxed: 1.75;
/* Espaçamento (base 8px) */
--space-1: 0.25rem; /* 4px */
--space-2: 0.5rem; /* 8px */
--space-3: 0.75rem; /* 12px */
--space-4: 1rem; /* 16px */
--space-6: 1.5rem; /* 24px */
--space-8: 2rem; /* 32px */
--space-12: 3rem; /* 48px */
--space-16: 4rem; /* 64px */
/* Bordas */
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-full: 9999px;
/* Sombras */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07);
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
/* Transições */
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
--duration-fast: 100ms;
--duration-normal: 200ms;
}
Modo Escuro Bem Feito
Não apenas inverta—redesenhe para contextos escuros.
@media (prefers-color-scheme: dark) {
:root {
/* Neutros */
--color-background: hsl(220, 13%, 10%);
--color-surface: hsl(220, 13%, 15%);
--color-surface-elevated: hsl(220, 13%, 18%);
--color-border: hsl(220, 13%, 23%);
/* Texto (invertido) */
--color-text: hsl(220, 9%, 93%);
--color-text-secondary: hsl(220, 9%, 70%);
--color-text-muted: hsl(220, 9%, 55%);
/* Ajustar saturação para modo escuro */
--color-primary: hsl(220, 80%, 60%);
--color-success: hsl(142, 70%, 45%);
--color-error: hsl(0, 80%, 65%);
/* Sombras no modo escuro precisam de ajuste */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
}
}
Princípios do modo escuro: - Reduza a saturação em superfícies grandes - Aumente a luminosidade das cores de destaque - Fortaleça as sombras (elas precisam de mais contraste) - Projete o modo escuro intencionalmente, não como algo secundário
Fluxos de Extração do Figma
Transformar arquivos de design em código de produção requer extração sistemática de design tokens—cores, tipografia, espaçamento e efeitos que definem sua linguagem de design.
Exportação de Variáveis do Figma
O recurso nativo de Variáveis do Figma fornece o caminho de extração mais limpo:
Passos de Exportação:
1. Abra o arquivo do Figma → painel de Variáveis Locais
2. Clique no menu da coleção → “Export to JSON”
3. Salve como figma-variables.json
Estrutura JSON dos Tokens:
{
"colors": {
"primitive": {
"blue-500": { "value": "#3b82f6", "type": "color" },
"blue-600": { "value": "#2563eb", "type": "color" }
},
"semantic": {
"primary": { "value": "{colors.primitive.blue-500}", "type": "color" },
"primary-hover": { "value": "{colors.primitive.blue-600}", "type": "color" }
}
},
"spacing": {
"1": { "value": "4px", "type": "spacing" },
"2": { "value": "8px", "type": "spacing" },
"4": { "value": "16px", "type": "spacing" }
}
}
Transformação de Token para CSS
Propriedades Personalizadas CSS:
:root {
/* Cores primitivas (valores diretos) */
--color-blue-50: #eff6ff;
--color-blue-100: #dbeafe;
--color-blue-500: #3b82f6;
--color-blue-600: #2563eb;
--color-blue-900: #1e3a8a;
/* Cores semânticas (referenciam primitivas) */
--color-primary: var(--color-blue-500);
--color-primary-hover: var(--color-blue-600);
--color-background: var(--color-white);
--color-surface: var(--color-gray-50);
/* Espaçamento (grid de 8px) */
--space-1: 0.25rem; /* 4px */
--space-2: 0.5rem; /* 8px */
--space-4: 1rem; /* 16px */
--space-6: 1.5rem; /* 24px */
--space-8: 2rem; /* 32px */
/* Tipografia */
--font-size-sm: 0.875rem;
--font-size-base: 1rem;
--font-size-lg: 1.125rem;
--line-height-tight: 1.25;
--line-height-normal: 1.5;
/* Efeitos */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07);
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
}
Tokens do Modo Escuro:
@media (prefers-color-scheme: dark) {
:root {
--color-background: var(--color-gray-900);
--color-surface: var(--color-gray-800);
--color-text: var(--color-gray-100);
--color-text-secondary: var(--color-gray-400);
/* Sombras ajustadas para modo escuro */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
}
}
Transformação de Token para SwiftUI
Extensão de Cores:
import SwiftUI
extension Color {
// MARK: - Cores Primitivas
static let blue50 = Color(hex: "eff6ff")
static let blue500 = Color(hex: "3b82f6")
static let blue600 = Color(hex: "2563eb")
// MARK: - Cores Semânticas
static let brandPrimary = Color.blue500
static let brandPrimaryHover = Color.blue600
// MARK: - Cores de Superfície
static let surfaceBackground = Color(light: .white, dark: Color(hex: "0f172a"))
static let surfaceElevated = Color(light: Color(hex: "f8fafc"), dark: Color(hex: "1e293b"))
}
extension Color {
init(hex: String) {
// Implementação padrão de parsing hexadecimal
}
init(light: Color, dark: Color) {
self.init(UIColor { traits in
traits.userInterfaceStyle == .dark ? UIColor(dark) : UIColor(light)
})
}
}
Constantes de Espaçamento:
enum Spacing {
static let xs: CGFloat = 4 // --space-1
static let sm: CGFloat = 8 // --space-2
static let md: CGFloat = 16 // --space-4
static let lg: CGFloat = 24 // --space-6
static let xl: CGFloat = 32 // --space-8
}
// Uso
VStack(spacing: Spacing.md) {
// ...
}
.padding(Spacing.lg)
Checklist de Handoff para Designers
O que Designers Devem Exportar:
| Tipo de Ativo | Formato | Observações |
|---|---|---|
| Cores | JSON de Variáveis | Incluir modos claro + escuro |
| Tipografia | Exportação de estilos | Fonte, tamanho, peso, altura de linha |
| Espaçamento | JSON de Variáveis | Unidade base documentada |
| Ícones | SVG | Contornados, cor única |
| Imagens | PNG @2x/@3x ou WebP | Com compressão |
| Componentes | Links do Figma | Para referência durante implementação |
Critérios de Quality Gate:
- [ ] Todas as cores definidas como variáveis (sem hex hardcoded)
- [ ] Tipografia usa estilos de texto definidos
- [ ] Espaçamento segue sistema de grid (base 8px)
- [ ] Variantes de modo escuro fornecidas
- [ ] Estados interativos documentados (hover, active, disabled)
- [ ] Breakpoints responsivos anotados
- [ ] Requisitos de acessibilidade anotados (razões de contraste)
O Desenvolvedor Recebe:
- Arquivos de tokens (JSON/CSS/Swift dependendo da plataforma)
- Especificações de componentes com medidas
- Exportações de assets nos formatos necessários
- Documentação de interação (estados, animações)
- Anotações de acessibilidade
Tabelas de Referência Rápida
Princípios da Gestalt
| Princípio | Regra | Uso |
|---|---|---|
| Proximidade | Relacionado = próximo | Formulários, seções |
| Similaridade | Mesma aparência = mesma função | Botões, cards |
| Figura-Fundo | Separação clara de camadas | Modais, cards |
| Continuidade | Seguir linhas | Timelines, alinhamento |
| Fechamento | Cérebro completa formas | Ícones, dicas de scroll |
Tipografia
| Elemento | Tamanho | Peso | Altura de Linha |
|---|---|---|---|
| Corpo | 16px | 400 | 1.5-1.7 |
| Títulos | 24-48px | 600-700 | 1.1-1.2 |
| Labels de UI | 12-14px | 500 | 1.3-1.4 |
| Legendas | 12px | 400 | 1.4 |
Papéis das Cores
| Papel | Modo Claro | Modo Escuro |
|---|---|---|
| Background | #ffffff | #0f172a |
| Surface | #f4f5f7 | #1e293b |
| Border | #e4e6ea | #334155 |
| Text | #1a1a2e | #f1f5f9 |
| Text Muted | #6b7280 | #94a3b8 |
| Primary | #3b82f6 | #60a5fa |
| Success | #22c55e | #4ade80 |
| Error | #ef4444 | #f87171 |
Escala de Espaçamento
| Token | Valor | Uso |
|---|---|---|
| –space-1 | 4px | Espaços entre ícones |
| –space-2 | 8px | Elementos inline |
| –space-4 | 16px | Espaços padrão |
| –space-6 | 24px | Padding de cards |
| –space-8 | 32px | Espaços entre seções |
| –space-16 | 64px | Seções de página |
Checklist de Design
Antes de entregar qualquer interface, verifique:
Gestalt
- [ ] Elementos relacionados estão mais próximos que os não relacionados (Proximidade)
- [ ] Funções similares têm estilos similares (Similaridade)
- [ ] Separação clara entre primeiro plano e fundo (Figura-Fundo)
- [ ] O olho flui naturalmente pelo layout (Continuidade)
Tipografia
- [ ] Tamanho base da fonte é pelo menos 16px
- [ ] Altura de linha é 1.5+ para texto do corpo
- [ ] Comprimento da linha está abaixo de 75 caracteres
- [ ] Hierarquia é clara (3 níveis distinguíveis)
- [ ] Escala consistente usada em todo o projeto
Cor
- [ ] Todo texto passa no contraste 4.5:1 (WCAG AA)
- [ ] Cor não é o único indicador (ícones/labels também)
- [ ] Modo escuro projetado intencionalmente
- [ ] Distribuição 60-30-10 seguida
Hierarquia Visual
- [ ] É possível identificar o elemento #1 mais importante
- [ ] O olho flui na ordem pretendida
- [ ] Um CTA claro por seção
- [ ] Escala tipográfica consistente
Espaçamento
- [ ] Todo espaçamento usa escala definida (sem números mágicos)
- [ ] Cards/componentes têm padding consistente
- [ ] Espaçamento mobile é confortável
- [ ] Alinhamento de grid é consistente (base 8px)
Verificação Dieter Rams
- [ ] Algo pode ser removido?
- [ ] Cada elemento serve uma função?
- [ ] Isso pareceria datado em 5 anos?
- [ ] Projetei todos os estados?
Recursos
Livros: - As Little Design as Possible de Sophie Lovell (Dieter Rams) - The Elements of Typographic Style de Robert Bringhurst
Ferramentas: - WebAIM Contrast Checker - Type Scale Generator - Figma Tokens Studio — Gerenciamento de design tokens
Design Systems: - Apple HIG - Material Design 3 - Radix UI - shadcn/ui
Estudos de Design
Análises aprofundadas de 16 produtos excepcionais, documentando padrões e princípios que vale a pena adotar.
Ferramentas para Desenvolvedores
| Produto | Contribuição Principal |
|---|---|
| Figma | Presença multiplayer, painéis contextuais |
| Warp | Terminal baseado em blocos, ponte CLI-GUI |
| Framer | Design responsivo visual, controles de propriedades |
| Vercel | Excelência em dark mode, status ambiente |
| Linear | UI otimista, fluxo de trabalho keyboard-first |
| Raycast | Sistema de extensões, ações rápidas |
iOS Nativo (Vencedores do Apple Design Award)
| Produto | Contribuição Principal |
|---|---|
| Flighty | 15 estados inteligentes, Live Activities, visualização de dados |
| Halide | Ativação inteligente, controles por gestos |
| Bear | Tipografia em primeiro lugar, tags inline |
| Craft | Cross-platform nativo, páginas aninhadas |
| Things | Datas adiadas, padrões de entrada rápida |
Produtividade e IA
| Produto | Contribuição Principal |
|---|---|
| Superhuman | Regra dos 100ms, treinamento de command palette, onboarding prático |
| Perplexity | IA com citações em destaque, fases de streaming |
| Notion | Sistema de blocos, slash commands |
| Arc | Spaces, split view, barra de comandos |
| Stripe | Excelência em documentação, design de API |
Este guia cresce com a prática. Princípios de design são atemporais, mas sua aplicação evolui com a tecnologia e o conhecimento.