O que está entre os elementos comunica tanto quanto os elementos

Apostila completa de Layout, Grade e Espaçamento

Layout é organizar o espaço para que o olho saiba onde olhar, o que pertence a quê e por onde seguir. Esta apostila cobre a percepção (Gestalt), os princípios de alinhamento e proximidade, a escala de espaçamento em base 4/8, sistemas de grade, hierarquia e composição, layout na web com Flexbox e Grid, responsivo com container queries e espaço fluido, telas densas de aplicação, e como tudo isso vira tokens e primitivas num design system.

10 módulosGestalt · C.R.A.P.Grade · base 4/8Flexbox · Grid · container queriesPrimitivas de layoutExercícios com gabarito
MÓDULO 01 · BÁSICO

O espaço como material e a Gestalt

Objetivo: enxergar o espaço em branco como um elemento de design ativo e conhecer as leis de percepção (Gestalt) que explicam por que um layout "funciona" ou "confunde".

1.1 O espaço em branco não é sobra

Iniciantes tratam o espaço vazio como área a preencher; profissionais o usam como ferramenta. O espaço agrupa (o que está perto pertence junto), separa (o que está longe é outra coisa), enfatiza (dar ar em volta de um elemento o destaca) e dá ritmo (a repetição de intervalos cria previsibilidade). Layout ruim quase nunca é falta de elementos — é falta de espaço distribuído com intenção.

💡 A regra que organiza a apostila

Distância comunica relação. Se dois elementos se relacionam, aproxime-os e afaste-os do resto; se não se relacionam, separe-os claramente. Metade dos problemas de layout se resolve ajustando o que está perto de quê — antes de mexer em cor, borda ou tamanho.

1.2 As leis da Gestalt

LeiO que dizUso em layout
Proximidadeelementos próximos são vistos como um grupoa alavanca nº 1 de agrupamento — rótulo junto do campo, não do campo de cima
Similaridadeelementos parecidos (forma, cor, tamanho) são vistos como relacionadoscards do mesmo tipo com o mesmo estilo; ações primárias todas iguais
Continuidadeo olho segue linhas e curvasalinhamento cria "trilhos" invisíveis que guiam a leitura
Fechamentocompletamos formas incompletasum card pode ser sugerido por espaçamento e um leve fundo, sem borda fechada
Figura-fundoseparamos o objeto (figura) do fundocontraste e espaço definem o que "está na frente"; ambiguidade cansa
Região comumo que está dentro de uma mesma área delimitada é um grupoum painel/fundo agrupa mais fortemente que só proximidade
Destino comumo que se move junto pertence juntoitens que aparecem/somem juntos numa transição

1.3 A ordem de força do agrupamento

Quando quiser dizer "estes elementos são um grupo", as ferramentas, da mais forte para a mais fraca: região comum (um fundo/painel) > proximidade (espaço) > similaridade (estilo compartilhado) > alinhamento. Combine-as com parcimônia — usar as quatro ao mesmo tempo para o mesmo grupo é redundante e pesado. Muitas vezes proximidade sozinha basta.

💼 Mercado de trabalho

Perguntas de abertura: "O que é espaço em branco e para que serve?" (agrupar, separar, enfatizar, dar ritmo — não é sobra), "Cite leis da Gestalt e como você as usa" (proximidade para agrupar, similaridade para relacionar, região comum para grupos fortes), "Como você agruparia um rótulo e seu campo sem usar borda?" (proximidade: mais espaço acima do rótulo que entre rótulo e campo).

✏️ Exercício 1 — Leia o layout

Abra um formulário qualquer (checkout, cadastro) e identifique: (a) dois lugares onde a proximidade está errada (rótulo mais perto do campo errado, botão colado no conteúdo de outro grupo); (b) onde a similaridade está ajudando; (c) se há "região comum" (painéis) e se ela agrupa o que deveria.

Gabarito (modelo): "(a) O rótulo 'E-mail' está a igual distância do campo de cima e do de baixo — ambíguo; e o botão 'Aplicar cupom' está colado no campo de endereço, sugerindo que pertence a ele. (b) Todos os campos têm a mesma altura e estilo → lidos como uma série. (c) Há um painel cinza em volta do resumo do pedido (região comum) que o separa bem do formulário; mas os campos de entrega e de pagamento estão no mesmo painel sem subdivisão, então parecem um grupo só." Correções: aumentar o espaço acima de cada rótulo; separar o botão de cupom; subdividir entrega/pagamento com espaço ou subpainéis.

MÓDULO 02 · BÁSICO

Alinhamento, proximidade, repetição, contraste

Objetivo: os quatro princípios que resolvem a maioria dos layouts (C.R.A.P.) e como aplicá-los com disciplina.

2.1 Alinhamento

2.2 Proximidade

Já vista no Módulo 1: o espaço dentro de um grupo deve ser menor que o espaço entre grupos. Um erro clássico é o espaçamento uniforme — tudo com a mesma margem — que apaga a estrutura. Defina pelo menos três níveis: dentro do componente, entre componentes de um grupo, entre grupos/seções.

2.3 Repetição

2.4 Contraste

💡 O teste dos "trilhos"

Passe linhas verticais e horizontais imaginárias (ou reais, no Figma) pelas bordas dos elementos. Quantos alinhamentos distintos existem na tela? Se forem muitos e quase-coincidentes (uma borda a 16px, outra a 19px, outra a 22px), há bagunça. Bons layouts têm poucos eixos de alinhamento, e quase tudo se encaixa neles.

💼 Mercado de trabalho

Perguntas: "O que é o princípio C.R.A.P.?" (Contraste, Repetição, Alinhamento, Proximidade), "Por que espaçamento uniforme é ruim?" (apaga o agrupamento; precisa de níveis), "Qual a diferença entre alinhamento óptico e matemático?", "Como você cria hierarquia com layout, sem cor?" (escala + espaço + posição).

✏️ Exercício 2 — Aplique os quatro

Você recebe um card de produto "empilhado a olho": imagem, título, descrição, preço, botão, tudo com 12px de margem entre si e o texto centralizado. Reescreva a especificação de layout aplicando C.R.A.P.

Gabarito (uma boa resposta): Alinhamento: tudo à esquerda (um eixo forte), preço e botão podendo compartilhar uma linha de base. Proximidade: título colado à descrição (4–8px), esse bloco separado da imagem (16px) e do bloco preço+botão (16–24px) — três níveis, não um. Repetição: usar degraus da escala (4/8/16/24), o mesmo card replicado na grade com o mesmo gutter. Contraste: título bem maior/mais pesado que a descrição; botão com peso claro; o preço com destaque de tamanho. Resultado: hierarquia legível de relance, sem depender de centralização nem de bordas.

MÓDULO 03 · BÁSICO

A escala de espaçamento

Objetivo: adotar uma escala de espaço em base 4/8, entender densidade, e os quatro tipos de espaçamento (inset, stack, inline, grid).

3.1 Por que uma escala

Se cada margem é escolhida na hora (13px aqui, 18px ali, 7px acolá), o resultado é inconsistente e impossível de manter. Uma escala — um conjunto pequeno de valores permitidos — força repetição, acelera decisões ("o próximo degrau, não +1px") e cria harmonia.

3.2 Base 4 e base 8

--space-0: 0;
--space-1: 0.25rem;  /* 4  */
--space-2: 0.5rem;   /* 8  */
--space-3: 0.75rem;  /* 12 */
--space-4: 1rem;     /* 16 */
--space-5: 1.5rem;   /* 24 */
--space-6: 2rem;     /* 32 */
--space-7: 3rem;     /* 48 */
--space-8: 4rem;     /* 64 */
--space-9: 6rem;     /* 96 */

Use rem para o espaço acompanhar a preferência de tamanho de fonte do usuário e o zoom (volta ao reflow da WCAG — Módulo 7).

3.3 Os quatro tipos de espaçamento

TipoO que éEm CSS
Inseto "respiro" interno de um contêiner (o padding de um card, de um botão)padding
Stackespaço vertical entre elementos empilhadosmargin-block ou gap num flex column
Inlineespaço horizontal entre elementos numa linha (ícone e rótulo, chips)gap num flex row
Grido gutter entre colunas/linhas de uma gradegap no grid

Pensar nesses nomes ajuda a nomear tokens de espaçamento por uso quando necessário (--inset-card, --stack-section) e a padronizar componentes.

3.4 gap > margens

3.5 Densidade

A mesma escala pode ter modos de densidade (confortável / compacto) trocando o passo base — útil em tabelas e ferramentas onde caber mais dados importa. Faça isso via token (--density: 1 → multiplica os espaços), não reescrevendo componentes.

⚠️ Erros de espaçamento comuns

Espaçamento uniforme (sem níveis) que apaga o agrupamento. Valores fora da escala ("só mais 2px") que se multiplicam pelo projeto. Margens no filho e padding no pai empilhando espaço imprevisível. margin vertical sofrendo collapse e o layout "pulando". Espaço em px fixo que não escala com o zoom. Densidade tratada como CSS ad-hoc em vez de token.

💼 Mercado de trabalho

Perguntas: "Por que base 8?" (divisível, casa com densidades, poucos degraus úteis), "gap ou margin, e por quê?" (gap: sem margem sobrando, sem collapse, componentes recombináveis), "O que é margin collapse?", "Como você suportaria um modo compacto?" (token de densidade multiplicando a escala).

✏️ Exercício 3 — Defina a escala e aplique

(a) Escreva uma escala de 8 degraus em rem a partir de base 8. (b) Para um card com imagem, título, texto e rodapé de ações, atribua um degrau a: inset do card, stack título↔texto, stack texto↔rodapé, inline entre os dois botões do rodapé. (c) Justifique por que o stack título↔texto é menor que texto↔rodapé.

Gabarito (uma boa resposta): (a) 0 / .25 / .5 / .75 / 1 / 1.5 / 2 / 3 rem. (b) inset do card = 1.5rem (24); título↔texto = .5rem (8) — mesmo grupo; texto↔rodapé = 1.5rem (24) — separa o conteúdo das ações; inline entre botões = .75rem (12). (c) título e texto são o mesmo bloco de conteúdo (proximidade forte); o rodapé de ações é outro grupo funcional, então precisa de mais espaço para não parecer parte do texto.

MÓDULO 04 · INTERMEDIÁRIO

Sistemas de grade

Objetivo: montar e usar uma grade (colunas, gutter, margem), conhecer a de 12 colunas e a grade modular, e saber quando a grade ajuda e quando engessa.

4.1 Anatomia de uma grade de colunas

4.2 A grade de 12 colunas (e alternativas)

4.3 Grade modular e baseline

4.4 Quando a grade ajuda — e quando atrapalha

A grade ajudaA grade atrapalha
Páginas com muitos blocos heterogêneos (marketing, editorial, catálogo)Uma única coluna de leitura — aí o que importa é a medida (Tipografia), não colunas
Manter alinhamento entre seções muito diferentesForçar um componente pequeno a "encaixar em 12 colunas" quando ele só precisa de max-width
Coordenar trabalho de várias pessoas (contrato visual)Tratar a grade como lei e impedir o quebrar deliberado (full-bleed, sobreposição)

4.5 Quebrar a grade de propósito

Elementos full-bleed (sangram até a borda), imagens que ultrapassam uma coluna, sobreposições — quebras controladas dão energia e destaque. A diferença entre "quebrou a grade" e "não tem grade" é intenção: você sabe qual regra está quebrando e por quê.

💼 Mercado de trabalho

Perguntas: "Anatomia de uma grade?" (colunas, gutter, margem, módulo, largura máx.), "Por que 12 colunas?" (divisibilidade), "Quando você não usaria grade de colunas?" (coluna única de leitura — usar medida), "Ainda faz sentido um grid framework?" (raramente; display: grid nativo).

✏️ Exercício 4 — Projete a grade

Para um site com home de marketing, um blog (artigos) e um painel de conta: defina a grade de cada um (número de colunas por breakpoint, gutter, margem, largura máxima) e diga onde a grade de colunas não deve mandar.

Gabarito (uma boa resposta): Home de marketing: 4 col (mobile) → 8 (tablet) → 12 (desktop), gutter 24px, margem 16→32px, largura máx. 1200–1280px; blocos ocupam 12/6/4 col. Blog: a página usa a grade para o cabeçalho e rodapé, mas o corpo do artigo ignora colunas e usa max-width: ~68ch centralizado (medida manda). Painel de conta: grade de 12 (desktop) com um sidebar fixo (ex.: 3 col) + conteúdo (9 col); em telas menores vira 1 coluna com o menu recolhido. Full-bleed permitido para heros e faixas, deliberadamente.

MÓDULO 05 · INTERMEDIÁRIO

Hierarquia visual e composição

Objetivo: dirigir o olhar — ponto focal, fluxo de leitura, peso visual, agrupamento — e compor telas que se leem na ordem certa.

5.1 Peso visual

Cada elemento "puxa" o olhar com uma força que depende de tamanho, contraste, cor, densidade, isolamento (espaço em volta) e posição. Compor é equilibrar esses pesos: um título grande de um lado pede algo que o contrabalance do outro, ou muito espaço.

5.2 Ponto focal e ordem de leitura

5.3 Agrupamento e "chunking"

5.4 Densidade da informação

Não existe "densidade certa" universal: um dashboard de operações quer alta densidade (comparar muitos números de relance); uma landing quer baixa (uma ideia por vez). Escolha conscientemente e seja consistente. Alta densidade exige alinhamento impecável e uma escala de espaçamento pequena e disciplinada (Módulo 8).

5.5 Simetria, assimetria e tensão

💡 O teste de esguelha

Afaste-se da tela ou desfoque os olhos (ou aplique um blur no Figma). O que ainda salta? Deveria ser o ponto de entrada. A ordem em que os borrões chamam atenção é a ordem de leitura real — se ela não bate com a intenção, ajuste peso e espaço, não conteúdo.

💼 Mercado de trabalho

Perguntas: "Como você cria um ponto focal?" (maior contraste de peso: tamanho + isolamento + posição), "O que são os padrões Z e F?", "Como decidir a densidade de uma tela?" (pela tarefa: comparar muitos dados vs absorver uma ideia), "Por que a ordem visual deve bater com a ordem no DOM?" (teclado, leitor de tela, coerência).

✏️ Exercício 5 — Redirija o olhar

Uma tela de detalhe de pedido tem: número do pedido pequeno no topo, um bloco enorme de itens no centro, o status (o que o usuário mais quer saber) discreto no canto, e três botões de ação com o mesmo peso. Descreva as mudanças de composição para que a ordem de leitura seja: status → itens → ações secundárias.

Gabarito (uma boa resposta): promover o status a ponto de entrada — maior, com espaço isolando-o, no topo à esquerda (zona forte), talvez com um selo. A lista de itens vira o segundo bloco, com título e a densidade adequada, mas sem competir em peso com o status. As ações: definir uma primária (peso claro) e rebaixar as outras duas a secundárias (menos peso), agrupadas e separadas do conteúdo por espaço. Conferir no teste de esguelha se o status realmente salta primeiro, depois os itens, depois a ação primária.

MÓDULO 06 · INTERMEDIÁRIO

Layout na web: Flexbox e Grid

Objetivo: dominar o fluxo normal, Flexbox e CSS Grid — quando usar cada um, alinhamento e distribuição, e os padrões que cobrem 90% dos casos.

6.1 O fluxo normal

Antes de qualquer sistema: blocos empilham verticalmente, inline flui horizontalmente, o texto quebra sozinho. Muita coisa não precisa de flex nem grid — só de max-width, margin e um bom gap via "flow". Não alcance o Grid para empilhar três parágrafos.

6.2 Flexbox — para uma dimensão

.cluster{
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-3);
  align-items: center;          /* eixo cruzado */
  justify-content: flex-start;  /* eixo principal */
}
.barra{
  display: flex;
  justify-content: space-between;  /* título à esquerda, ações à direita */
  align-items: center;
  gap: var(--space-4);
}
.item-que-estica{ flex: 1; }        /* cresce e encolhe */
.item-fixo{ flex: 0 0 auto; }

6.3 CSS Grid — para duas dimensões

.layout{
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: var(--space-5);
}
.conteudo{ grid-column: 1 / 9; }
.aside{ grid-column: 9 / 13; }

/* grade responsiva sem media query: quantas colunas couberem, mín. 16rem */
.cards{
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
  gap: var(--space-5);
}

/* áreas nomeadas — o layout "desenhado" no CSS */
.app{
  display: grid;
  grid-template-columns: 240px 1fr;
  grid-template-rows: auto 1fr auto;
  grid-template-areas:
    "sidebar header"
    "sidebar main"
    "sidebar footer";
}
.app > header{ grid-area: header; }

6.4 Alinhamento (vale para os dois)

PropriedadeO quê
justify-contentdistribui as faixas no eixo inline (space-between, center…)
align-contentidem no eixo block (quando há espaço sobrando)
justify-items / align-itemsalinha cada item dentro da sua célula/linha
justify-self / align-selfsobrescreve para um item específico
place-content / place-itemsatalho para os dois eixos (place-items: center centraliza de verdade)

6.5 Padrões que resolvem quase tudo

⚠️ Erros de Flex/Grid

Usar Grid para tudo (inclusive uma linha de botões — é Flex). flex em vez de gap para espaçar (margens sobrando). Esquecer minmax(0, 1fr) e ver uma tabela estourar o layout. height: 100vh em mobile (a barra do navegador — use dvh). Aninhar cinco flex containers quando um Grid resolveria. Media queries por "tamanho de dispositivo" em vez de por onde o conteúdo quebra (Módulo 7).

💼 Mercado de trabalho

Perguntas de front-end: "Flexbox ou Grid — como você decide?" (uma dimensão vs duas), "Como fazer uma grade de cards responsiva sem media query?" (repeat(auto-fit, minmax(...))), "O que fr faz e por que minmax(0,1fr)?", "Diferença entre align-items e align-content?", "Como centralizar um elemento?" (display:grid; place-items:center).

✏️ Exercício 6 — Escolha a ferramenta

Para cada caso, diga Flexbox, Grid ou fluxo normal, e por quê: (a) empilhar título, parágrafo e botão num card; (b) uma barra com logo à esquerda e menu à direita; (c) o esqueleto app com sidebar + header + main + footer; (d) uma galeria de imagens que se reorganiza conforme a largura; (e) uma linha de chips que quebra; (f) um formulário onde todos os rótulos alinham numa coluna e os campos noutra.

Gabarito: (a) fluxo normal + "flow" (margin/gap) — é só empilhar. (b) Flexbox, justify-content: space-between — uma dimensão. (c) Grid com grid-template-areas — duas dimensões, esqueleto. (d) Grid com repeat(auto-fit, minmax(...)) — reflow em 2D sem media query. (e) Flexbox com flex-wrap: wrap e gap — cluster de uma dimensão. (f) Grid de 2 colunas (auto 1fr) — alinhar rótulos e campos entre linhas exige 2D.

MÓDULO 07 · AVANÇADO

Responsivo de verdade

Objetivo: mobile-first, breakpoints ditados pelo conteúdo, container queries, espaço fluido com clamp(), layouts intrínsecos e as funções min()/max()/clamp().

7.1 Mobile-first e breakpoints por conteúdo

7.2 Container queries

Media query pergunta o tamanho da viewport; container query pergunta o tamanho do contêiner do componente. Isso torna um componente verdadeiramente reutilizável: o mesmo card se adapta se está numa sidebar estreita ou numa área ampla, sem saber onde a página o colocou.

.card-wrap{ container-type: inline-size; container-name: card; }

.card{ display: grid; gap: var(--space-3); }
@container card (min-width: 28rem){
  .card{ grid-template-columns: 12rem 1fr; }   /* vira horizontal quando o CONTÊINER é largo */
}

7.3 Espaço e tamanho fluidos

/* interpola entre um mínimo e um máximo conforme a viewport, com trava */
--space-fluid-l: clamp(2rem, 1rem + 4vw, 4rem);
section{ padding-block: var(--space-fluid-l); }

h1{ font-size: clamp(1.75rem, 1.2rem + 2.5vw, 3rem); }

.container{
  width: min(100% - 2rem, 75rem);   /* 75rem, mas nunca encostando na borda */
  margin-inline: auto;
}

7.4 Layouts intrínsecos

Em vez de "em 768px, mude para 2 colunas", deixe o layout reagir ao conteúdo e ao espaço: flex-wrap com flex-basis, grid com auto-fit/minmax, a "Sidebar" e o "Switcher" do Módulo 6. Menos media queries, menos telas para testar, menos quebras.

7.5 Unidades de viewport e safe areas

7.6 Reflow (WCAG 1.4.10)

A 320px de largura equivalente (ou 400% de zoom), o conteúdo não pode exigir rolagem horizontal — deve refluir para uma coluna. Layouts intrínsecos e rem em tudo já entregam isso quase de graça. Tabelas largas são a exceção legítima (podem rolar dentro de um contêiner). Ver Acessibilidade Digital & WCAG.

💼 Mercado de trabalho

Perguntas: "Como você decide onde colocar um breakpoint?" (onde o conteúdo quebra, não tamanhos de device), "Media query vs container query?", "O que clamp() resolve e por que rem nos limites?", "Por que 100vh dá problema no mobile?" (dvh), "O que é o critério de reflow da WCAG?".

✏️ Exercício 7 — Menos media queries

Um layout tem 5 media queries: 360, 480, 768, 1024, 1440px, cada uma reorganizando uma grade de cards e ajustando paddings de seção. Proponha como reduzir para no máximo uma, usando técnicas deste módulo.

Gabarito (uma boa resposta): a grade de cards vira grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)) — some todas as media queries dela. Os paddings de seção viram clamp(1.5rem, 1rem + 4vw, 4rem) — some as queries de padding. O container vira width: min(100% - 2rem, 75rem); margin-inline: auto. Componentes internos que mudam de orientação usam container queries, não a viewport. Resta, talvez, uma media query para uma mudança estrutural real (ex.: sidebar de navegação que vira drawer) — e só.

MÓDULO 08 · AVANÇADO

Ritmo, densidade e telas de aplicação

Objetivo: compor telas densas de produto (tabelas, dashboards, editores) — modos de densidade, ritmo vertical, sticky/scroll e as armadilhas de layout de app.

8.1 Densidade como decisão de sistema

8.2 Ritmo vertical

8.3 Tabelas e grades de dados

8.4 Layout de aplicação: esqueleto e regiões

8.5 Alturas, overflow e o "z-index war"

💡 Skeleton com a métrica certa

Um estado de carregamento só ajuda se ocupar exatamente o espaço do conteúdo que vai chegar (mesma altura de linha, mesmo número de linhas aproximado, mesma grade). Skeleton "genérico" que depois é substituído por algo de outro tamanho causa layout shift — o oposto do que ele deveria evitar.

💼 Mercado de trabalho

Perguntas (product/design systems): "Como você suporta densidade compacta?" (token que multiplica a escala; sem fork de componente), "Como fazer uma tabela grande sem quebrar a página?" (scroll no contêiner, header sticky, reflow preservado), "Como você organiza z-index?" (escala tokenizada + top-layer), "Por que o skeleton precisa ter a métrica do conteúdo?".

✏️ Exercício 8 — Especifique a tela densa

Projete o layout de um painel de "pedidos" com: navegação lateral, uma toolbar de filtros, uma tabela de 8 colunas com muitas linhas, e um painel de detalhe que abre à direita ao clicar numa linha. Descreva o esqueleto (grid), o comportamento de scroll, o que é sticky, os modos de densidade e o estado de carregamento.

Gabarito (uma boa resposta): Grid grid-template-columns: 240px 1fr auto (sidebar / conteúdo / painel de detalhe que tem largura 0 ou ~360px). Sidebar com scroll próprio. Conteúdo: toolbar de filtros sticky top:0; a tabela rola dentro de um contêiner com overflow:auto, <thead> sticky, primeira coluna (nº do pedido) sticky à esquerda; a página em si não rola horizontalmente (reflow ok). Painel de detalhe: entra por container query/estado, empurra ou sobrepõe conforme a largura disponível; em telas estreitas vira tela cheia. Densidade: token --density confortável (linha 48px) / compacto (linha 34px) multiplicando insets. Carregamento: skeleton de linhas com a altura exata da linha e ~10–15 linhas; toolbar e header já renderizados.

MÓDULO 09 · MUITO AVANÇADO

Layout num design system

Objetivo: transformar espaçamento, grade e breakpoints em tokens; oferecer primitivas de layout reutilizáveis; e manter Figma e código em sincronia.

9.1 Tokens de espaçamento, grade e breakpoint

:root{
  /* espaço — escala única, base 4/8 */
  --space-1:.25rem; --space-2:.5rem; --space-3:.75rem; --space-4:1rem;
  --space-5:1.5rem; --space-6:2rem; --space-7:3rem; --space-8:4rem; --space-9:6rem;

  /* espaço fluido para respiros de seção */
  --space-section: clamp(3rem, 2rem + 6vw, 8rem);

  /* grade */
  --grid-columns: 12;
  --grid-gutter: var(--space-5);
  --grid-margin: clamp(1rem, 5vw, 3rem);
  --content-max: 75rem;

  /* raios, para consistência de "forma" */
  --radius-1:.25rem; --radius-2:.5rem; --radius-3:1rem; --radius-pill:999px;

  /* z-index tokenizado */
  --z-dropdown:1000; --z-sticky:1100; --z-modal:2000; --z-toast:3000;
}
/* breakpoints como custom media (via PostCSS) ou apenas documentados */
/* --bp-sm: 30rem; --bp-md: 48rem; --bp-lg: 64rem; --bp-xl: 80rem; */

9.2 Primitivas de layout

Em vez de cada tela reinventar flex/grid, ofereça um punhado de componentes de layout sem estilo visual, só de composição:

PrimitivaFaz
Stackempilha filhos com gap de um token
Clusteragrupa itens que quebram linha, com gap e alinhamento
Gridauto-fit/minmax ou N colunas com gutter-token
Sidebarfaixa fixa + área fluida que colapsa
Covercentra um conteúdo com header/footer opcionais
Frameimpõe aspect-ratio a mídia
Center / Containermax-width + margin-inline:auto + margem lateral

Essas primitivas (a ideia vem do Every Layout) tornam telas novas rápidas de montar e consistentes por construção. Elas consomem os tokens; as telas consomem as primitivas.

9.3 Figma ↔ código

9.4 Documentação e governança

💡 O sinal de um bom sistema de layout

Duas pessoas montam a mesma tela, separadamente, e o espaçamento sai igual — porque escolheram degraus da mesma escala e as mesmas primitivas. Se cada uma "sentiu" as margens, faltam tokens e primitivas. Um sistema de layout bom remove decisões de pixel do dia a dia.

💼 Mercado de trabalho

Perguntas (design systems / front-end sénior): "Como você tokeniza espaçamento e grade?" (escala única em rem, gutter/margem/max como tokens, z-index tokenizado), "O que são primitivas de layout e por que usá-las?" (Stack/Cluster/Grid/Sidebar… — consistência por construção), "Como manter Figma e código alinhados no layout?" (Auto Layout = Flex, mesmos valores, layout grids espelhando tokens), "Como você impede espaçamento ad-hoc?" (lint).

✏️ Exercício 9 — Esboce o sistema de layout

Para um design system novo, especifique: (a) a escala de espaçamento (valores e quantos degraus); (b) 3 tokens de grade e 1 de espaço fluido; (c) 4 primitivas de layout que você entregaria primeiro e o que cada uma resolve; (d) 2 regras de lint.

Gabarito (uma boa resposta): (a) 9–10 degraus: 0, .25, .5, .75, 1, 1.5, 2, 3, 4, 6 rem (base 4/8, crescendo mais rápido no fim). (b) --grid-columns: 12, --grid-gutter: var(--space-5), --content-max: 75rem; fluido: --space-section: clamp(3rem, 2rem + 6vw, 8rem). (c) Stack (empilhar com gap-token — 90% dos casos), Cluster (grupos de botões/tags), Grid (auto-fit para cards e N-col para o esqueleto), Container/Center (largura máx. + margem). (d) proibir margin/padding com valor fora da escala; proibir z-index numérico literal fora dos tokens.

MÓDULO 10 · CARREIRA

Mercado de trabalho: roadmap, entrevistas e portfólio

Objetivo: converter o conteúdo dos módulos em contratação — onde layout pesa, um plano de estudo, um banco de perguntas com respostas e projetos que geram entrevista.

10.1 Onde layout pesa

10.2 Roadmap de estudo (6–8 semanas)

SemanasFocoPrática
1Gestalt e C.R.A.P. (Módulos 1–2)Auditar 5 telas: apontar proximidade errada, eixos de alinhamento, agrupamento
2Escala de espaçamento (Módulo 3)Refazer um card e um formulário usando só uma escala base 8, com 3 níveis de proximidade
3Grades (Módulo 4)Projetar a grade de 3 tipos de página; marcar onde a grade não deve mandar
4Hierarquia e composição (Módulo 5)Redirigir a ordem de leitura de 2 telas; validar com o teste de esguelha
5Flexbox e Grid (Módulo 6)Implementar os "Every Layout": Stack, Cluster, Sidebar, Switcher, Cover, Grid auto-fit
6Responsivo (Módulo 7)Pegar um layout com 5 media queries e reduzir para 1 com auto-fit, clamp e container queries
7Telas densas e sistema (Módulos 8–9)Montar um painel com tabela sticky + painel de detalhe + modos de densidade; tokenizar
8PortfólioEscrever os estudos de caso com o raciocínio (grade, escala, decisões de composição); publicar

10.3 Banco de perguntas de entrevista (com a resposta que aprova)

Júnior/pleno — "Como o espaço em branco organiza um layout?"

Agrupando (proximidade), separando, enfatizando (isolamento) e dando ritmo (intervalos previsíveis). A regra prática: o espaço dentro de um grupo deve ser menor que o espaço entre grupos — e é preciso ter pelo menos três níveis de espaçamento, não um uniforme.

Pleno — "Por que uma escala de espaçamento, e por que base 8?"

Uma escala força repetição e consistência, acelera decisões e evita a bagunça de valores ad-hoc. Base 8 divide bem (2/4), casa com densidades de tela e dá poucos degraus úteis; base 4 entra para ajustes finos. Valores em rem para escalar com o zoom.

Pleno/front-end — "Flexbox ou Grid?"

Flexbox para uma dimensão (uma linha OU uma coluna de itens que você distribui/alinha: toolbars, clusters, headers). Grid para duas dimensões ao mesmo tempo (esqueleto de página, galerias, formulários de rótulos alinhados, dashboards). Fluxo normal + "flow" quando é só empilhar. gap nos dois, em vez de margens entre itens.

Pleno/front-end — "Grade de cards responsiva sem media query?"

display: grid; grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); gap: var(--space-5); — o navegador coloca quantas colunas couberem, cada uma com no mínimo 16rem, e distribui o resto. Reflow automático, zero breakpoints.

Sénior — "Media query vs container query?"

Media query responde ao tamanho da viewport; container query responde ao tamanho do contêiner do componente. Container queries tornam um componente reutilizável de verdade — o mesmo card se adapta numa sidebar estreita ou numa área ampla sem saber onde foi colocado. Menos acoplamento entre componente e página.

Sénior — "Como reduzir a quantidade de breakpoints?"

Layouts intrínsecos: auto-fit/minmax para grades, flex-wrap + flex-basis para clusters, clamp() para espaço e tipografia fluidos, min()/max() para larguras e paddings, container queries para componentes. Sobram só os breakpoints de mudança estrutural real (ex.: nav vira drawer). Breakpoints ditados pelo conteúdo quebrando, não por tamanhos de dispositivo.

Sénior — "Como você garante consistência de layout num time grande?"

Tokens de espaçamento/grade/z-index (componentes usam só tokens), primitivas de layout (Stack/Cluster/Grid/Sidebar…), Figma com Auto Layout e layout grids espelhando os mesmos valores, uma página de documentação de layout, e lint proibindo espaçamento e z-index ad-hoc.

Armadilha — "É só ir posicionando até ficar bom"

Sem uma escala e eixos de alinhamento definidos, "até ficar bom" produz inconsistência que ninguém consegue manter nem replicar. Layout profissional é sistema: poucos valores de espaço, poucos eixos, primitivas reutilizáveis — e então o "olho" entra só no ajuste fino.

10.4 Projetos de portfólio que geram entrevista

  1. Kit de primitivas de layout (âncora): Stack, Cluster, Grid, Sidebar, Cover, Center implementadas com tokens, documentadas, com exemplos de composição — o "esqueleto" de um design system.
  2. Redesign de espaçamento: pegue uma UI real inconsistente, aplique uma escala base 8 e três níveis de proximidade; antes/depois com a grade sobreposta.
  3. Menos media queries: um layout responsivo reescrito de N breakpoints para 1, com o raciocínio (auto-fit, clamp, container queries) e telas comparadas.
  4. Painel denso: uma tela de aplicação com tabela sticky, painel de detalhe, modos de densidade e estados (vazio/carregando/erro) — mostra layout de produto de verdade.
  5. Estudo de composição: a mesma tela em 3 hierarquias diferentes (mudando só peso e espaço), com o teste de esguelha de cada uma.

10.5 Fontes para continuar

🏁 Síntese final da apostila

Quatro ideias sustentam o layout: (1) distância comunica relação — proximidade e espaço em branco são a alavanca principal, antes de cor ou borda; (2) poucos eixos de alinhamento e uma escala de espaçamento (base 4/8, em rem) transformam "a olho" em sistema; (3) Flexbox para uma dimensão, Grid para duas, e layouts intrínsecos (auto-fit, clamp, container queries) no lugar de dezenas de media queries; (4) num sistema, tokens + primitivas de layout removem decisões de pixel e fazem telas novas nascerem consistentes.