Apostila completa de Tipografia: fontes, escala e hierarquia
Tipografia é a disciplina de dar forma ao texto para que ele seja lido, compreendido e sentido do jeito certo. Esta apostila cobre a anatomia da letra, as classificações de tipos, como escolher e parear fontes, escala e hierarquia, tipografia na web com CSS, fontes variáveis e recursos OpenType, acessibilidade e internacionalização, e como montar um sistema tipográfico com tokens — sempre com o olho no que estúdios e produtos pedem de designers e front-ends.
O que é tipografia e por que importa
Objetivo: entender o que a tipografia faz por um texto, separar os termos que todo mundo confunde (fonte, tipo, família, glifo) e ver onde ela aparece no trabalho.
1.1 Tipografia é a voz do texto
Duas páginas com as mesmas palavras podem comunicar coisas opostas: uma parece um contrato intimidador, a outra um convite. A diferença é tipografia — a escolha das fontes, o tamanho, o espaço entre linhas e letras, a largura da coluna, a hierarquia entre título e corpo. O leitor raramente percebe a tipografia conscientemente; ele percebe se o texto é fácil, confiável, agradável — e isso é resultado de decisões.
Para quem projeta interfaces, o peso é ainda maior: a maior parte de qualquer aplicativo é texto. Botões, rótulos, mensagens de erro, tabelas, menus. Acertar a tipografia é acertar a maior superfície do produto.
Tipografia boa é invisível quando deve e expressiva quando pode. No corpo de texto longo, o objetivo é sumir: nada deve atrapalhar a leitura. Em títulos, marca e chamadas, a tipografia pode (e deve) ter personalidade. Saber em que registro você está é metade das decisões.
1.2 Fonte, tipo, família, glifo: os termos
| Termo | O que é | Exemplo |
|---|---|---|
| Tipo / typeface | O design das letras — a ideia, o desenho | Helvetica, Georgia, Inter |
| Fonte / font | Uma instância concreta desse design: um arquivo, um peso, um estilo | Inter Bold Italic 16px; Inter-Bold.woff2 |
| Família / family | O conjunto de fontes que formam um tipo: pesos, itálicos, larguras | Inter Thin → Black + itálicos |
| Glifo / glyph | A forma visual de um caractere (ou de vários juntos) | o desenho do "a"; a ligadura "fi" |
| Caractere / character | A unidade abstrata de texto (Unicode), independente da forma | U+0061 LATIN SMALL LETTER A |
| Peso / weight | A espessura do traço | Regular (400), Bold (700) |
| Estilo / style | Variação dentro da família | Italic, Condensed, SmallCaps |
Na conversa do dia a dia "fonte" e "tipo" viram sinônimos e ninguém morre por isso — mas em contexto técnico (CSS, licenciamento, foundries) a distinção importa: você licencia um tipo e carrega arquivos de fonte.
1.3 Legibilidade × leiturabilidade
- Legibilidade (legibility): quanto uma letra é distinta de outra — propriedade do desenho do tipo. Um "I" maiúsculo, um "l" minúsculo e um "1" que se confundem = baixa legibilidade.
- Leiturabilidade (readability): quão confortável é ler um bloco de texto — propriedade da composição: tamanho, entrelinha, medida da linha, contraste, espaçamento.
Um tipo muito legível pode ser mal composto (linha de 200 caracteres, entrelinha apertada) e ficar cansativo. Os dois trabalham juntos.
1.4 Onde a tipografia aparece no trabalho
- Interface / produto: a escala de texto de um design system, tabelas e formulários, densidade, responsividade.
- Editorial / conteúdo: artigos, documentação, e-books — leitura longa, hierarquia rica.
- Branding: a fonte da marca, o logotipo, a personalidade. Ver a apostila Branding.
- Dados e visualização: rótulos de eixo, números tabulares, legendas. Ver DataVis Avançada.
- Motion / vídeo: legendas, títulos animados, lower-thirds.
Tipografia é a habilidade que mais separa um portfólio "ok" de um "contrata já". Perguntas de abertura: "Qual a diferença entre fonte e tipo?", "O que é legibilidade vs leiturabilidade?", "Como você escolheria a fonte de um produto?" (módulo 4). Demonstrar que você pensa no leitor e no contexto de uso, e não em "qual fonte é bonita", já sinaliza maturidade.
✏️ Exercício 1 — Termos no lugar certo
Classifique cada item como tipo, fonte, família, glifo ou caractere: (a) "Roboto"; (b) o arquivo Roboto-MediumItalic.ttf; (c) o desenho da ligadura "ff"; (d) "A letra à com crase"; (e) o conjunto Roboto Thin/Light/Regular/Medium/Bold/Black com seus itálicos.
Gabarito: (a) tipo (o design); (b) fonte (instância concreta: peso Medium, estilo Italic, formato TTF); (c) glifo (forma visual, aqui de dois caracteres juntos); (d) caractere (a unidade abstrata "à", U+00E0 — independente de como é desenhada); (e) família (todas as fontes que compõem o tipo).
Anatomia da letra
Objetivo: aprender o vocabulário das partes da letra e das linhas de referência — porque é isso que permite descrever, comparar e escolher tipos com precisão.
2.1 As linhas de referência
| Linha | O que marca |
|---|---|
| Baseline | A linha sobre a qual as letras "se apoiam". É a referência do CSS vertical-align e da métrica da fonte. |
| x-height | Altura das minúsculas sem ascendente (o "x"). A medida mais importante para leitura em tela: x-height alto = letras mais "cheias" no mesmo corpo. |
| Cap height | Altura das maiúsculas. Costuma ser menor que a dos ascendentes. |
| Ascender line | Topo das hastes que sobem (b, d, h, k, l). |
| Descender line | Base das hastes que descem (g, j, p, q, y). |
| Mean line / midline | Topo da x-height. |
A soma ascendente + x-height + descendente (mais um respiro) é o corpo — historicamente o bloco de metal, hoje a métrica que o font-size escala. Por isso dois tipos no mesmo font-size podem parecer tamanhos diferentes: o que você percebe é a x-height.
2.2 Partes da letra
- Haste (stem): o traço vertical principal.
- Serifa (serif): o "pezinho" nas extremidades das hastes (nos tipos serifados).
- Terminal: o fim de um traço que não tem serifa.
- Bojo (bowl): a curva fechada que forma um espaço interno (o "o", a barriga do "b").
- Contraforma (counter): o espaço branco dentro ou parcialmente cercado pela letra (dentro do "o", do "e", do "n").
- Ombro (shoulder): a curva que sai da haste (no "h", "m", "n").
- Braço / perna: traços que saem para fora (o braço do "E", a perna do "R").
- Ápice / vértice (apex/vertex): onde dois traços se encontram no topo ("A") ou na base ("V").
- Espinha (spine): a curva central do "S".
- Orelha (ear): a pequena projeção no "g".
- Gota (teardrop) / esfera (ball terminal): o arremate arredondado (no "a", "c", "f" de muitos tipos).
- Aperture: o quanto uma contraforma aberta se comunica com o exterior (a abertura do "c", "e", "s"). Aberturas amplas ajudam a legibilidade em corpos pequenos.
2.3 Contraste e eixo
- Contraste: a diferença entre os traços grossos e finos da letra. Alto contraste (Didot, Bodoni) = elegante mas frágil em corpo pequeno e tela. Baixo/nenhum contraste (a maioria das grotescas) = robusto.
- Eixo / stress: a inclinação da modulação — imagine uma caneta de ponta larga desenhando o "o". Eixo humanista (inclinado, como a mão) vs eixo vertical (racional, moderno).
- Modulação: como a espessura varia ao longo do traço curvo.
2.4 O espaço entre as letras
- Sidebearing: o espaço embutido à esquerda e à direita de cada glifo pelo designer da fonte.
- Kerning: ajuste fino do espaço entre pares específicos problemáticos ("AV", "To", "Yo") — vem em tabelas dentro da fonte.
- Tracking / letter-spacing: ajuste uniforme do espaço em um trecho — decisão sua na composição.
Ao comparar fontes para corpo de texto em tela, ignore o nome e olhe a x-height e a abertura. Tipos como Inter, Source Sans, IBM Plex e Georgia têm x-height generoso e aberturas amplas — por isso "seguram" bem em 14–16px. Um tipo lindo com x-height baixo vai exigir um font-size maior para a mesma legibilidade, e aí a comparação muda.
✏️ Exercício 2 — Descreva a letra
Sem usar o nome da fonte, descreva o "a" minúsculo de duas fontes que você tenha à mão (ex.: a do sistema e uma do Google Fonts) usando: número de andares (um ou dois), bojo, contraforma, abertura, contraste, presença de serifa/gota. Depois diga qual das duas você usaria para uma tabela de dados densa e por quê.
Gabarito (modelo de resposta): "A fonte X tem 'a' de dois andares, bojo fechado, contraforma pequena, abertura estreita, contraste baixo, terminal reto — compacta. A fonte Y tem 'a' de dois andares, contraforma ampla, abertura larga, gota no terminal — mais legível em corpo pequeno." Para tabela densa: a de abertura mais ampla e x-height mais alto, com numerais tabulares disponíveis (módulo 7), porque a leitura é de relance e em corpo reduzido.
Classificação de tipos
Objetivo: reconhecer as grandes categorias de tipos, o que cada uma comunica e onde funciona — para escolher com intenção e conversar com outros designers.
3.1 Serifadas
| Subgrupo | Marcas visuais | Humor / uso | Exemplos |
|---|---|---|---|
| Humanista / old-style | Eixo inclinado, contraste moderado, serifas em cunha | Caloroso, orgânico; leitura longa, livros | Garamond, Sabon, Georgia |
| Transicional | Eixo quase vertical, contraste maior, serifas mais retas | Neutro, institucional | Times New Roman, Baskerville |
| Moderna / didone | Eixo vertical, contraste extremo, serifas finas e retas | Elegante, "moda", editorial de luxo; frágil em corpo pequeno | Didot, Bodoni |
| Slab / egípcia | Serifas grossas, retangulares, pouco contraste | Firme, "máquina", chamadas e branding | Rockwell, Roboto Slab, Zilla |
3.2 Sans-serif (sem serifa)
| Subgrupo | Marcas visuais | Humor / uso | Exemplos |
|---|---|---|---|
| Grotesca | Início do sans; leve irregularidade, aberturas fechadas | Industrial, honesta | Franklin Gothic, Akzidenz |
| Neo-grotesca | Muito neutra, uniforme, aberturas fechadas | "Sem voz", corporativa, sinalização | Helvetica, Arial, Inter |
| Humanista | Proporções caligráficas, aberturas amplas, contraste sutil | Amigável, muito legível em UI | Frutiger, Segoe UI, Source Sans, Open Sans |
| Geométrica | Construída de círculos e retas; "o" quase circular | Moderna, clean, um tanto fria; ótima para títulos | Futura, Century Gothic, Poppins, Montserrat |
3.3 As outras categorias
- Monoespaçada: todo glifo ocupa a mesma largura. Código, dados alinhados, "técnico". Ex.: JetBrains Mono, IBM Plex Mono, Courier.
- Script: imita escrita à mão ou caligrafia. Formal (casamento) ou casual. Nunca em caixa alta, nunca em bloco longo.
- Display / decorativa: feita para tamanhos grandes e uso curto — pôsteres, capas, títulos. Personalidade forte, legibilidade sacrificada.
- Blackletter / gótica: a "letra medieval". Jornais históricos, metal, cerveja. Ilegível em bloco para o leitor moderno.
3.4 As classificações formais (e por que são só um guia)
Existem sistemas — Vox-ATypI, o do British Standards, o do Bringhurst por época histórica. Eles ajudam a estudar e a nomear, mas tipos reais misturam características ("humanista com detalhes geométricos"), e categorias novas surgem. Use os rótulos para comunicar ("preciso de uma humanista sans com x-height alto") — não os trate como gavetas rígidas.
3.5 Superfamílias
Alguns projetos entregam serif + sans + mono (às vezes slab) com o mesmo esqueleto: mesmas proporções, x-height, pesos. São ouro para sistemas, porque combinam por construção. Ex.: IBM Plex (Sans/Serif/Mono/Condensed), Source (Sans/Serif/Code), Roboto (Sans/Serif/Slab/Mono), Recursive, Fira.
Perguntas: "Que tipo de fonte você usaria para um app financeiro sério?" (neo-grotesca ou humanista sans, numerais tabulares — nunca uma display), "Diferença entre uma sans geométrica e uma humanista?" (construção por círculos vs proporções caligráficas; humanista lê melhor em texto corrido), "O que é uma superfamília e por que ela ajuda num design system?". Saber nomear o que você vê é o que diferencia numa conversa de portfólio.
✏️ Exercício 3 — Classifique e justifique
Para cada cenário, nomeie a categoria (e subgrupo) que você escolheria e uma que você evitaria: (a) o corpo de texto de um site de notícias; (b) o título de uma capa de revista de moda; (c) os rótulos de um dashboard de métricas; (d) a marca de uma cafeteria artesanal.
Gabarito (uma boa resposta): (a) serifada humanista/transicional ou humanista sans de x-height alto para leitura longa; evitar didone (contraste frágil) e display. (b) didone (Didot/Bodoni) ou uma display com personalidade; evitar monoespaçada. (c) humanista ou neo-grotesca sans com numerais tabulares; evitar script e slab pesado. (d) pode ousar — uma serifada humanista, uma script bem-feita ou uma geométrica com ajustes; evitar Arial/Helvetica "de fábrica", que não diz nada de marca.
Escolha e pareamento de fontes
Objetivo: escolher uma fonte por critérios objetivos (não por gosto), combinar duas sem conflito, e saber onde encontrá-las e como avaliar qualidade e licença.
4.1 Critérios para escolher uma fonte
| Critério | Pergunta a fazer |
|---|---|
| Propósito | É para corpo longo, para UI, para títulos, para dados? Cada um pede coisas diferentes. |
| Legibilidade em corpo pequeno | x-height alto? aberturas amplas? formas distintas (I / l / 1, O / 0)? |
| Número de pesos e estilos | Tem itálico de verdade (não oblíquo sintético)? Pesos suficientes para hierarquia (mín. Regular, Medium/SemiBold, Bold)? |
| Cobertura de caracteres | Acentos do português, aspas curvas, travessão, símbolos de moeda, os idiomas que você precisa? |
| Recursos OpenType | Numerais tabulares e old-style? Ligaturas? Small caps reais? (Módulo 7) |
| Hinting e qualidade em tela | Renderiza limpo em Windows/baixa densidade? Foi desenhada para tela ou é uma digitalização de tipo de metal? |
| Licença | Uso web permitido? Limite de pageviews? Pode empacotar num app? Custo? (4.5) |
| Peso do arquivo | Quantos KB por peso em WOFF2? Tem versão variável? (Módulo 6–7) |
4.2 Quantas fontes usar
A resposta segura é uma família bem explorada. Uma superfamília, ou uma sans com muitos pesos, resolve título + corpo + rótulo + código com variações de peso, tamanho e caixa. Duas famílias (uma para display, uma para texto) é o próximo passo. Três ou mais exige justificativa e um sistema muito claro — na dúvida, não.
4.3 Princípios de pareamento
- Contraste, não conflito. As duas fontes devem ser claramente diferentes (senão parece erro), mas não brigar. O par clássico: uma serifada para título + uma sans para corpo, ou vice-versa.
- Compartilhar algo. Boas duplas têm um elo: mesma época, x-height parecido, mesmo "humor", ou o mesmo designer/foundry. Superfamílias já vêm com esse elo.
- Papéis distintos. Defina o que cada fonte faz (display / texto / UI / código) e não misture.
- Teste no conteúdo real. Cole texto de verdade, nos tamanhos de verdade, no fundo de verdade, no dispositivo de verdade — não no site da foundry com "Lorem" em corpo 72.
Pares que quase sempre funcionam
- Uma superfamília inteira (IBM Plex, Source, Recursive).
- Serifada humanista + humanista sans do mesmo período (ex.: uma Garald + uma Frutiger-like).
- Uma geométrica com caráter para títulos + uma humanista sans neutra para corpo.
- Uma única sans variável, usando
opsz/peso para diferenciar (Módulo 7).
4.4 Fontes de sistema e a "system font stack"
Usar as fontes já instaladas no dispositivo do usuário: zero download, zero CLS, aparência "nativa". O custo é menos controle e inconsistência entre plataformas.
/* stack de fontes de sistema — sans neutra em cada SO */ font-family: -apple-system, BlinkMacSystemFont, /* macOS / iOS (San Francisco) */ "Segoe UI", /* Windows */ Roboto, /* Android / ChromeOS */ "Helvetica Neue", Arial, /* fallback antigo */ "Noto Sans", /* Linux */ sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; /* emoji coloridos */
4.5 Onde achar e como avaliar licença
- Google Fonts: grátis, open source (OFL), self-hostável, ótima base. Qualidade variável — prefira as famílias mantidas (Inter, Roboto, Source, IBM Plex, Noto, Lora, Libre …).
- Foundries independentes (Klim, Grilli Type, Dinamo, Pangram Pangram, Displaay, ABC Dinamo): qualidade alta, personalidade, licença paga — normalmente por uso (desktop, web por pageviews, app, broadcast) e perpétua para a versão.
- Adobe Fonts: incluso na assinatura; ativação por CSS ou sync; leia os termos de web/app.
- Avaliar qualidade: teste os acentos do português, os numerais, o itálico (é desenhado ou inclinado?), o comportamento em 13–16px no Windows, e o tamanho do WOFF2.
Usar uma fonte "achada na internet" (pirata) num projeto de cliente — risco jurídico real. Assumir que "de graça para pessoal" vale para comercial. Ignorar o limite de pageviews de uma webfont paga. Escolher pela amostra em corpo 100 e descobrir que em 15px o contraste some. Usar itálico e negrito sintéticos (o browser inclina/engorda na força) quando a família tem os arquivos reais — fica pior e "amador".
Perguntas: "Como você escolhe a fonte de um produto?" (critérios objetivos: propósito, x-height, pesos, cobertura, licença, peso — não "gosto"), "Como parear duas fontes?" (contraste sem conflito, compartilhar um elo, papéis distintos, testar no real), "Prós e contras de usar system fonts?", "Como funciona o licenciamento de webfonts?". Ter um par bem justificado no portfólio, com o raciocínio escrito, vale muito.
✏️ Exercício 4 — Escolha e pareie
Você vai projetar um blog técnico com artigos longos, blocos de código e uma home com um título grande de marca. Proponha: (a) quantas famílias; (b) qual papel para cada uma; (c) dois candidatos concretos (do Google Fonts) e por quê; (d) o que você testaria antes de fechar.
Gabarito (uma boa resposta): (a) duas famílias + uma mono. (b) uma sans humanista para corpo e UI, uma display/serif com caráter para o título de marca, uma monoespaçada para código. (c) ex.: Source Sans 3 (x-height alto, muitos pesos, itálico real, ótimo em 16px) para corpo; Fraunces ou Lora para o título (contraste e personalidade, com opsz no caso da Fraunces); JetBrains Mono ou IBM Plex Mono para código (formas distintas I/l/1, ligaturas opcionais). (d) testar acentos PT-BR, numerais no corpo do artigo, o par título+corpo lado a lado, render no Windows, peso total em WOFF2, e o código em 13–14px.
Escala, hierarquia e ritmo
Objetivo: definir tamanho de corpo, medida e entrelinha certos; construir uma escala tipográfica; e criar hierarquia com o mínimo de recursos.
5.1 O corpo de texto e a medida
- Tamanho: na web, 16px é o mínimo sensato para corpo (é o default dos browsers por um bom motivo). Leitura confortável hoje vive entre 16 e 20px; documentação e artigos longos costumam ir a 18–20.
- Medida (measure) = comprimento da linha: o alvo é 45–75 caracteres por linha (incluindo espaços); ~66 é o ideal clássico. Em CSS,
max-width: 65chno container de texto resolve. Linha longa demais faz o olho "perder o caminho de volta"; curta demais quebra o ritmo.
5.2 Entrelinha (line-height)
- Corpo: 1.4 a 1.6 (sem unidade no CSS, para herdar proporcionalmente). Texto menor e linhas mais longas pedem mais entrelinha.
- Títulos grandes: 1.0 a 1.25 — quanto maior o texto, mais apertada a entrelinha.
- Regra prática:
line-heightemeasureandam juntos — se a linha é longa, aumente a entrelinha.
5.3 A escala tipográfica modular
Em vez de tamanhos aleatórios, escolha uma razão e multiplique a partir do corpo. Assim os tamanhos se relacionam e a página tem harmonia.
| Razão | Nome | Sensação |
|---|---|---|
| 1.125 | Segunda maior | Sutil — bom para UI densa |
| 1.200 | Terça menor | Equilibrada — padrão seguro para produto |
| 1.250 | Terça maior | Contraste claro — sites de conteúdo |
| 1.333 | Quarta perfeita | Editorial, expressiva |
| 1.500 / 1.618 | Quinta / áurea | Muito dramática — landing pages, pouca densidade |
/* escala com razão 1.25 a partir de 16px, arredondada */ --text-xs: 0.64rem; /* 10.24 → ~10px (evite para leitura) */ --text-sm: 0.8rem; /* 12.8 → 13px legendas, rótulos */ --text-base: 1rem; /* 16px corpo */ --text-lg: 1.25rem; /* 20px subtítulo / lead */ --text-xl: 1.563rem; /* 25px h3 */ --text-2xl: 1.953rem; /* 31px h2 */ --text-3xl: 2.441rem; /* 39px h1 */ --text-4xl: 3.052rem; /* 49px display */
Você não precisa usar todos os degraus, e pode "quebrar" a escala no display (títulos gigantes muitas vezes são escolhidos a olho). Mas ter a escala evita a bagunça de 15 tamanhos quase-iguais.
5.4 Hierarquia: os recursos e a disciplina
Você tem seis alavancas para dizer "isto é mais importante que aquilo":
- Tamanho — o mais óbvio, mas o que mais infla a página se abusado.
- Peso — Regular vs SemiBold vs Bold. Muitas vezes basta peso, sem mexer no tamanho.
- Cor / contraste — texto secundário em cinza (respeitando contraste mínimo — Módulo 8).
- Espaçamento — espaço antes de um título vale mais que espaço depois; espaço agrupa e separa.
- Família / estilo — itálico, uma segunda fonte, caixa alta.
- Caixa — versalete, caixa alta com tracking para overlines.
Para cada nível de hierarquia, mude uma ou duas propriedades — não todas. "Título = maior + mais pesado" já basta. "Maior + mais pesado + outra fonte + caixa alta + colorido + com borda" é ruído. Menos contraste, mais claramente aplicado, lê melhor.
5.5 Ritmo vertical e espaçamento
- Escala de espaçamento baseada em 4 ou 8px (4, 8, 12, 16, 24, 32, 48, 64) — os mesmos degraus para margens entre blocos de texto.
- Espaço de parágrafo: ou um
margin-bottom(~0.75–1× a entrelinha) ou recuo de primeira linha — nunca os dois. - Baseline grid (avançado): alinhar todas as linhas de base a uma grade fixa (ex.: 4px). Lindo no impresso; na web é trabalhoso e opcional — priorize entrelinha e espaçamento consistentes.
5.6 Tracking (letter-spacing)
- Títulos grandes: tracking levemente negativo (−0.01 a −0.03em) — em corpos grandes as letras parecem soltas.
- Corpo: zero. Confie no espaçamento da fonte.
- Caixa alta e versalete: tracking positivo (+0.05 a +0.12em) — maiúsculas foram desenhadas com menos ar entre si.
- Texto muito pequeno (10–11px, legendas): um leve positivo ajuda.
Perguntas: "Qual a medida ideal de uma linha de texto e por quê?" (45–75 caracteres; max-width em ch), "Como você define a entrelinha?" (1.4–1.6 no corpo, mais apertada em título; cresce com a medida), "O que é uma escala tipográfica modular?", "Como criar hierarquia sem só aumentar a fonte?" (peso, cor, espaço — duas alavancas por nível).
✏️ Exercício 5 — Monte a hierarquia
Defina uma escala e a hierarquia para: um artigo com H1, H2, H3, corpo, citação em bloco, legenda de imagem e "tempo de leitura" (metadado). Para cada um dê tamanho (em rem), peso, cor (papel) e o espaço antes. Use razão 1.25 a partir de 16px.
Gabarito (uma boa resposta): corpo 1rem/1.6, peso 400, cor primária, max-width: 68ch. H1 2.441rem, peso 700, entrelinha 1.15, tracking −0.02em, espaço antes grande. H2 1.953rem, peso 700, espaço antes 2.5rem. H3 1.563rem, peso 600, espaço antes 2rem. Citação: 1.125rem, itálico ou peso 400 com borda à esquerda, cor levemente suave, recuo. Legenda: 0.8rem, peso 400, cor secundária (contraste ≥ 4.5:1), espaço acima pequeno. "Tempo de leitura": 0.8rem, caixa alta, tracking +0.08em, peso 600, cor secundária. Só tamanho+peso+cor+espaço — sem trocar de fonte.
Tipografia na tela (CSS)
Objetivo: dominar as propriedades e unidades que controlam texto na web, carregar fontes sem prejudicar a performance, e evitar o layout shift da troca de fonte.
6.1 Unidades
| Unidade | É relativa a | Use para |
|---|---|---|
px | nada (pixel de referência) | bordas, detalhes; evite em font-size (não respeita a preferência do usuário) |
rem | o font-size da raiz (html) | tamanhos de fonte e espaçamento — escala com a preferência do usuário |
em | o font-size do próprio elemento | letter-spacing, margin proporcional ao texto local, ícones ao lado de texto |
ch | a largura do "0" da fonte atual | max-width de coluna de texto (a medida) |
% / sem unidade | o pai (%) / o próprio font-size (line-height) | line-height sem unidade (herda proporcional) |
clamp(), vw | a viewport | tipografia fluida (6.2) |
6.2 Propriedades essenciais
body{
font-family: "Inter", system-ui, sans-serif;
font-size: 1rem;
line-height: 1.6; /* sem unidade */
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
}
h1{
font-size: clamp(2rem, 1.4rem + 3vw, 3rem); /* fluida: min, preferida, max */
line-height: 1.1;
letter-spacing: -0.02em;
text-wrap: balance; /* equilibra as linhas de um título curto */
}
p{
max-width: 65ch; /* a medida */
text-wrap: pretty; /* evita "viúvas" na última linha */
hyphens: auto; /* precisa de lang no HTML */
}
.uppercase-label{
text-transform: uppercase;
letter-spacing: 0.08em;
font-weight: 600;
}
line-heightsem unidade —1.6, não160%nem26px— para que elementos filhos herdem a proporção certa.text-wrap: balance(títulos) epretty(parágrafos) — suporte crescente; degradam bem.hyphens: autosó funciona com o atributolangcorreto no HTML (ver Módulo 8).- Evite
text-align: justifysem hifenização — cria "rios" de espaço branco.
6.3 A system font stack e o system-ui
A palavra-chave system-ui resolve para a fonte de interface do SO. É prática, mas tem armadilhas (em alguns sistemas cai numa fonte sem os caracteres de certos idiomas). O padrão robusto continua sendo a stack explícita do Módulo 4, opcionalmente com system-ui no começo.
6.4 Carregando webfonts: @font-face
@font-face{
font-family: "Inter";
src: url("/fonts/Inter-Roman.var.woff2") format("woff2-variations");
font-weight: 100 900; /* range: é uma fonte variável */
font-style: normal;
font-display: swap; /* mostra o fallback já, troca quando a fonte chega */
unicode-range: U+0000-00FF, U+0131, U+2000-206F; /* subset latino */
}
font-display | Comportamento | Quando |
|---|---|---|
swap | fallback imediato → troca ao carregar (pode causar "flash") | corpo de texto — conteúdo visível já |
optional | fallback; só usa a webfont se ela chegar quase instantânea (senão, nesta visita, fica no fallback) | quando zero layout shift importa mais que a fonte |
fallback | meio-termo: janela curtíssima de "invisível", depois fallback, troca se chegar logo | equilíbrio |
block | texto invisível até a fonte (ou ~3s) | quase nunca — ruim para percepção |
6.5 Performance e o layout shift da fonte
- Formato: só WOFF2 (compressão melhor; suporte universal hoje). Não sirva TTF/OTF/WOFF1 na web.
- Self-host > CDN de terceiros: menos conexões, sem dependência externa, e privacidade (o Google Fonts via CSS externo já não dá cache compartilhado entre sites de qualquer forma).
- Preload das fontes críticas (o peso do corpo):
<link rel="preload" as="font" type="font/woff2" crossorigin href="/fonts/Inter-Roman.var.woff2">. - Subset: remova glifos que você não usa (idiomas, símbolos) — pode cortar 50–80% do arquivo. Ferramentas:
glyphhanger,fonttools/pyftsubset. - FOUT (Flash of Unstyled Text — vê o fallback, depois troca) é preferível a FOIT (Flash of Invisible Text).
swapdá FOUT. - CLS (Cumulative Layout Shift): quando a webfont tem métricas diferentes do fallback, o texto "pula" ao trocar. Reduza casando o fallback com
size-adjust,ascent-override,descent-overrideeline-gap-overridenum@font-facede fallback — ou use as "f-mods" que ferramentas (Fontaine, next/font, Fontsource) geram automaticamente.
/* fallback ajustado para casar com a métrica da webfont e não "pular" */ @font-face{ font-family: "Inter-fallback"; src: local("Arial"); size-adjust: 107%; ascent-override: 90%; descent-override: 22%; line-gap-override: 0%; } body{ font-family: "Inter", "Inter-fallback", sans-serif; }
6.6 Recursos de fonte via CSS
.tabela-numeros{ font-variant-numeric: tabular-nums; } /* números alinham em colunas */
.preco-antigo{ font-variant-numeric: oldstyle-nums; }
.titulo{ font-feature-settings: "liga" 1, "dlig" 1; } /* ligaturas */
.sigla{ font-variant-caps: all-small-caps; }
.fracao{ font-variant-numeric: diagonal-fractions; }
Prefira as propriedades de alto nível (font-variant-*) quando existirem; caia para font-feature-settings para recursos específicos (ss01, cv05, salt). Detalhe no Módulo 7.
font-size em px fixo (ignora quem aumentou a fonte do navegador); line-height com unidade; servir TTF de 400KB; nenhum font-display (FOIT de segundos em conexão ruim); webfont sem preload e sem fallback casado → CLS alto no Lighthouse; @import de Google Fonts no CSS (bloqueia a renderização em cascata); usar negrito sintético porque só se carregou o peso 400.
Perguntas de front-end: "px, em ou rem para font-size — e por quê?" (rem: respeita a preferência do usuário e escala), "O que é FOUT vs FOIT e como você controla?" (font-display), "Como reduzir o CLS causado por webfonts?" (preload + fallback com size-adjust/overrides), "Como você serviria fontes hoje?" (WOFF2, self-host, subset, preload do peso crítico, variável se possível). text-wrap: balance/pretty e tabular-nums são pontos de "esse aí acompanha a plataforma".
✏️ Exercício 6 — Escreva o carregamento de fontes
Escreva o CSS + o HTML de <head> para carregar uma fonte variável self-hospedada (peso 100–900, romana e itálica) para o corpo, com o mínimo de layout shift e sem bloquear a renderização. Liste também 3 coisas que você mediria depois.
Gabarito (uma boa resposta): dois @font-face (normal e italic) apontando para .woff2 com font-weight: 100 900, font-display: swap, unicode-range do subset; um @font-face de fallback com size-adjust/ascent-override casando a métrica; font-family: "Minha", "Minha-fallback", system-ui, sans-serif. No <head>: <link rel="preload" as="font" type="font/woff2" crossorigin href="…roman.woff2"> (só a romana, que é a crítica). Medir depois: CLS e LCP no Lighthouse/Web Vitals; o tamanho transferido das fontes; se há FOIT em "Slow 3G"; se o negrito/itálico usados existem nos arquivos (nada sintético).
Fontes variáveis e OpenType
Objetivo: usar fontes variáveis (um arquivo, muitos pesos/larguras/tamanhos ópticos) e os recursos OpenType que separam tipografia caprichada de "só escolhi a fonte".
7.1 O que é uma fonte variável
Uma fonte variável guarda, em um arquivo, um espaço contínuo de variações ao longo de eixos. Em vez de baixar Regular + Medium + SemiBold + Bold + itálicos (6–12 arquivos), você baixa um e interpola qualquer valor.
| Eixo | Tag | O que faz |
|---|---|---|
| Weight | wght | espessura, 1–1000 (400 = regular, 700 = bold) |
| Width | wdth | largura condensada ↔ expandida (%) |
| Optical size | opsz | ajusta o desenho para o tamanho de uso (7.2) |
| Slant | slnt | inclinação em graus (oblíquo) |
| Italic | ital | 0 ↔ 1: troca para as formas itálicas de verdade (a, g diferentes) |
| Grade | GRAD | engorda o traço sem mudar a largura — útil para dark mode e para "aumentar peso sem reflow" |
| (custom) | ex. CASL, MONO, CRSV | eixos próprios do designer (casual, monoespaçamento, cursividade…) |
Eixos registrados vêm em minúsculas (wght), eixos customizados em maiúsculas (GRAD).
7.2 Optical sizing (opsz) — o eixo subestimado
Tipos de metal tinham desenhos diferentes para cada tamanho: os pequenos ("texto") com mais contraste baixo, x-height alto, espaçamento folgado, serifas robustas; os grandes ("display") com contraste alto e detalhes finos. Fontes digitais perderam isso — opsz traz de volta.
h1{ font-optical-sizing: auto; } /* o browser liga opsz ao font-size — ligado por padrão em fontes com o eixo */
.ajuste-manual{ font-variation-settings: "opsz" 8; } /* força o desenho "texto pequeno" */
7.3 CSS de fontes variáveis
@font-face{
font-family: "Recursive";
src: url("/fonts/Recursive.woff2") format("woff2");
font-weight: 300 1000;
font-stretch: 75% 125%; /* o range do eixo wdth */
}
.botao{ font-weight: 560; } /* qualquer valor, não só 400/700 */
.condensado{ font-stretch: 85%; }
.grau-dark{ font-variation-settings: "GRAD" 40; } /* eixos sem propriedade dedicada */
font-variation-settings não herda como você esperaEle é tudo-ou-nada: ao redefini-lo num filho, você precisa repetir todos os eixos que quer manter, senão eles voltam ao default. Prefira as propriedades de alto nível (font-weight, font-stretch, font-optical-sizing) e reserve font-variation-settings para eixos sem equivalente. Se usar muito, defina os eixos como custom properties e componha.
7.4 Ganho e trade-offs
- A favor: um arquivo em vez de muitos; qualquer peso/largura; transições suaves (com
prefers-reduced-motion!);opszautomático;GRADpara dark mode. - Contra: o arquivo único é maior que um peso estático (mas menor que 4–5 juntos); se você só usa 2 pesos, dois estáticos subsetados podem pesar menos. Faça a conta com o subset real.
- Regra prática: usa 3+ pesos, ou larguras, ou quer
opsz/GRAD→ variável. Usa exatamente Regular + Bold → dois estáticos podem bastar.
7.5 Recursos OpenType
| Recurso | Tag(s) | Para que serve |
|---|---|---|
| Ligaturas padrão | liga | "fi", "fl" — junta formas que colidiriam. Ligado por padrão; desligue em monoespaçada. |
| Ligaturas discricionárias | dlig | "ct", "st" decorativas — só para display. |
| Numerais tabulares / proporcionais | tnum / pnum | tabulares: mesma largura, alinham em coluna (tabelas, dados, timers). proporcionais: espaçados para texto corrido. |
| Numerais lining / old-style | lnum / onum | lining: altura das maiúsculas (UI, tabelas). old-style: com ascendentes/descendentes, "convivem" com minúsculas no texto. |
| Frações | frac | transforma "1/2" em ½ bem desenhado. |
| Ordinais / sobrescrito | ordn, sups, subs | 1º, 2ª, notas, fórmulas. |
| Versalete (small caps) | smcp, c2sc | maiúsculas na altura da x-height — para siglas em meio ao texto sem "gritar". |
| Alternativas estilísticas | salt, ss01–ss20, cv01– | trocar o "a", o "g", o "1" com serifa etc. — a fonte documenta quais. Ex.: Inter cv05, cv11. |
| Swashes | swsh | terminais floreados — display, convites. |
table td.num{ font-variant-numeric: tabular-nums lining-nums; }
article p{ font-variant-numeric: oldstyle-nums proportional-nums; }
abbr{ font-variant-caps: all-small-caps; letter-spacing: .04em; }
.recipe{ font-variant-numeric: diagonal-fractions; }
.inter-tweaks{ font-feature-settings: "cv05" 1, "cv11" 1, "ss03" 1; } /* g de andar único, 1 sem serifa… */
7.6 Animar eixos — com parcimônia
Dá para animar font-weight / font-variation-settings (hover num link que "engorda", peso que responde ao scroll). Efeito bonito e caro em atenção. Sempre envolva em @media (prefers-reduced-motion: reduce) e mantenha sutil; nunca anime o corpo de texto que a pessoa está lendo.
Numa mesma fonte variável você pode: usar GRAD (não wght) para engrossar o texto ~30–40 unidades no dark mode — telas claras sobre fundo escuro parecem mais finas ("irradiação"), e GRAD compensa sem mudar a largura, então nada reflui. Combine com font-optical-sizing: auto e uma escala fluida (Módulo 5–6) e a tipografia se ajusta a tamanho, tema e viewport sem você manter dezenas de arquivos.
Perguntas: "O que é uma fonte variável e quando vale a pena?" (eixos; vale com 3+ pesos, larguras, opsz/GRAD), "O que é optical sizing?", "Como alinhar números numa tabela?" (font-variant-numeric: tabular-nums), "Diferença entre numerais lining e old-style?", "Por que font-variation-settings te surpreende na herança?" (é tudo-ou-nada). Mostrar tabular-nums numa tabela de dados e cvXX ajustando um "g" é sinal de cuidado.
✏️ Exercício 7 — Recursos no lugar certo
Para cada caso, diga qual recurso/propriedade OpenType você usaria: (a) uma tabela financeira onde os valores precisam alinhar; (b) as datas "1º de maio" num texto; (c) a sigla "NASA" no meio de um parágrafo, sem que ela domine visualmente; (d) a fração "3/4" numa receita; (e) o corpo de um artigo literário onde os números devem "fluir" com o texto; (f) desligar as ligaduras num trecho de código.
Gabarito: (a) font-variant-numeric: tabular-nums lining-nums. (b) ordn (font-variant-position/font-feature-settings:"ordn") para o "º". (c) font-variant-caps: all-small-caps + leve letter-spacing. (d) font-variant-numeric: diagonal-fractions (ou "frac"). (e) font-variant-numeric: oldstyle-nums proportional-nums. (f) font-variant-ligatures: none (ou font-feature-settings: "liga" 0, "clig" 0).
Tipografia acessível e internacional
Objetivo: compor texto que funciona para quem amplia a página, usa leitor de tela, tem baixa visão ou dislexia — e para idiomas e sistemas de escrita além do português.
8.1 O que a WCAG exige do texto
| Critério | Em resumo |
|---|---|
| 1.4.4 Resize text | o texto pode ser ampliado a 200% sem perda de conteúdo ou função (não desative o zoom; use rem). |
| 1.4.10 Reflow | a 320px de largura equivalente, o conteúdo não exige rolagem horizontal — a coluna de texto reflui. |
| 1.4.3 / 1.4.6 Contraste | texto normal ≥ 4.5:1 (AA) ou 7:1 (AAA); texto "grande" (≥ 24px, ou ≥ 18.66px bold) ≥ 3:1. Vale para o texto secundário em cinza também. |
| 1.4.12 Text spacing | a página não pode quebrar se o usuário forçar: line-height ≥ 1.5× o tamanho; espaço entre parágrafos ≥ 2×; letter-spacing ≥ 0.12em; word-spacing ≥ 0.16em. |
| 1.4.8 Visual presentation (AAA) | medida ≤ 80 caracteres; não justificado; entrelinha ≥ 1.5; cores de texto/fundo ajustáveis. |
Os números da WCAG podem ser revisados entre versões — confira sempre a versão vigente ao auditar. A apostila Acessibilidade Digital & WCAG cobre o resto (foco, ARIA, testes com leitor de tela).
8.2 Práticas de leiturabilidade acessível
- Não use caixa alta em blocos — some a forma das palavras (o "contorno" que lemos de relance) e leitores de tela podem soletrar. Caixa alta só em rótulos curtos, com
text-transform(mantém o texto real no DOM). - Não justifique sem hifenização — os "rios" de espaço atrapalham, sobretudo dislexia. Na dúvida, alinhe à esquerda.
- Medida controlada (Módulo 5) — linha longa é barreira cognitiva.
- Itálico só em trechos curtos; para blocos longos (citações), prefira outro recurso.
- Sublinhado = link. Não sublinhe texto comum para dar ênfase (use peso).
- Contraste do texto "suave": o cinza-claro de legendas e placeholders frequentemente falha o 4.5:1 — teste.
8.3 Dislexia: o que ajuda de verdade
Fontes vendidas "para dislexia" têm evidência científica fraca de que melhoram a leitura. O que a pesquisa apoia:
- Espaçamento generoso entre letras, palavras e linhas.
- x-height alto e formas de letra distintas (que o "b", "d", "p", "q" não sejam espelhos idênticos).
- Texto alinhado à esquerda, medida curta, parágrafos curtos.
- Deixar o usuário ajustar fonte, tamanho e espaçamento (respeitar as preferências do SO/navegador).
Ou seja: boa tipografia geral já é boa tipografia para dislexia. Ofereça a opção de fonte alternativa se quiser, mas não a imponha.
8.4 Formas ambíguas
Onde o leitor não pode adivinhar pelo contexto — senhas, códigos de verificação, identificadores, trechos de código, dados — a fonte precisa distinguir sem esforço:
- I maiúsculo × l minúsculo × 1 × |
- O × 0 (zero com corte ou ponto?)
- rn × m, vv × w, 5 × S, 8 × B
Fontes desenhadas para isso: JetBrains Mono, IBM Plex Mono, Source Code Pro, Inconsolata, e várias sans de UI têm um ssXX/cvXX que ativa o "l" com cauda e o "0" pontilhado. Para código e senhas, prefira monoespaçada.
8.5 Internacionalização
langno HTML —<html lang="pt-BR">elangem trechos de outro idioma. Controla hifenização, quebra de linha, aspas, e a voz do leitor de tela.- Cobertura de glifos — a fonte tem os acentos e caracteres de todos os idiomas do produto? Para amplitude, a família Noto ("no tofu" — sem os quadradinhos □) cobre praticamente todos os scripts.
- Scripts não-latinos: CJK (chinês/japonês/coreano) — fontes enormes, quase sempre subset por página; sem itálico, ênfase por outros meios. Árabe/hebraico — RTL (
dir="rtl"), letras que mudam de forma conforme a posição. Devanágari, tailandês — marcas acima/abaixo, entrelinha maior. - Expansão de texto: do inglês para alemão/português o texto cresce 20–35% — o layout não pode quebrar. Nunca fixe largura de botão pelo texto de um só idioma.
- Números e datas: separador decimal (vírgula em pt-BR), agrupamento de milhar, formato de data — localize; não formate à mão.
8.6 Números em dados
- Tabelas, extratos, dashboards, cronômetros →
tabular-numssempre, senão as colunas "dançam". - Alinhe números à direita (ou pelo separador decimal) para comparar magnitudes.
- Ver a apostila DataVis Avançada para rótulos de eixo e legendas.
Bloquear o zoom com user-scalable=no na meta viewport (falha WCAG direto). Texto dentro de imagem (não escala, não é lido, não traduz). "Ícone-fonte" sem rótulo acessível. Placeholder cinza-claro fazendo as vezes de label. Layout que estoura quando o usuário aumenta o letter-spacing. Caixa alta via conteúdo real (<h1>TÍTULO</h1>) em vez de text-transform.
Perguntas: "Que critérios da WCAG envolvem texto?" (resize 200%, reflow, contraste 4.5:1, text-spacing 1.4.12), "Fontes para dislexia funcionam?" (evidência fraca; o que ajuda é espaçamento, x-height, formas distintas, deixar ajustar), "Como você garante que I, l e 1 não se confundem num campo de senha?", "O que muda na tipografia ao suportar árabe ou japonês?" (RTL, formas contextuais, sem itálico, subsetting pesado). Pensar em i18n desde o layout é sinal de senioridade.
✏️ Exercício 8 — Auditoria rápida
Um componente mostra: título em <h2> com text-transform: uppercase e font-size: 22px; corpo em 14px/line-height: 18px; legenda #9aa0a6 sobre branco; um "código de convite" em Arial; botões com width: 120px. Aponte os problemas e as correções.
Gabarito: (1) font-size em px → use rem (resize/preferência). (2) line-height: 18px com unidade e < 1.5× → use line-height: 1.5 sem unidade (1.4.12). (3) corpo 14px é pequeno para leitura → 16px base. (4) legenda #9aa0a6 em branco ≈ 2.6:1 → falha 4.5:1; escureça para ~#5f6368. (5) "uppercase" ok se via text-transform (está) — mas confirme que não é conteúdo real e que não é um bloco longo. (6) código de convite em Arial → I/l/1/O/0 ambíguos; use monoespaçada com formas distintas. (7) botão width: 120px fixo → quebra em idiomas mais longos e com letter-spacing do usuário; use min-width + padding.
Sistema tipográfico e tokens
Objetivo: transformar decisões soltas em um sistema — papéis de texto, tokens, nomenclatura, fluid type e governança — que escala para um produto inteiro e vários times.
9.1 De estilos soltos a papéis
Um sistema não lista "tamanhos" — lista papéis (o que o texto faz), e cada papel amarra família + tamanho + peso + entrelinha + tracking + cor.
| Papel | Uso |
|---|---|
display | números/frases de impacto numa landing; raríssimo em produto |
heading-1…4 (ou xl/lg/md/sm) | títulos de página e seção |
title / subtitle | títulos de card, de modal, de grupo |
body / body-strong / body-sm | texto corrido e suas variações |
label | rótulos de formulário, de botão, de aba |
caption / helper | textos auxiliares, mensagens de campo |
overline | rótulo curto em caixa alta acima de um título |
code | trechos monoespaçados inline e em bloco |
9.2 Tokens de tipografia
Três camadas, como em cor:
/* 1. PRIMITIVOS — os valores crus, sem significado de uso */ --font-sans: "Inter", "Inter-fallback", system-ui, sans-serif; --font-mono: "JetBrains Mono", ui-monospace, monospace; --font-serif: "Lora", Georgia, serif; --weight-regular: 400; --weight-medium: 500; --weight-semibold: 600; --weight-bold: 700; --size-100: 0.75rem; --size-200: 0.875rem; --size-300: 1rem; --size-400: 1.125rem; --size-500: 1.25rem; --size-600: 1.5rem; --size-700: 1.875rem; --size-800: 2.25rem; --size-900: 3rem; --leading-tight: 1.15; --leading-snug: 1.35; --leading-normal: 1.55; --tracking-tight: -0.02em; --tracking-normal: 0; --tracking-wide: 0.08em; /* 2. SEMÂNTICOS — um papel, composto dos primitivos */ --text-body-font: var(--font-sans); --text-body-size: var(--size-300); --text-body-leading: var(--leading-normal); --text-body-weight: var(--weight-regular); --text-heading-1-size: var(--size-800); --text-heading-1-leading: var(--leading-tight); --text-heading-1-weight: var(--weight-bold); --text-heading-1-tracking: var(--tracking-tight);
/* 3. USO — uma classe/utilitário por papel (ou o shorthand `font`) */
.text-body{
font: var(--text-body-weight) var(--text-body-size)/var(--text-body-leading) var(--text-body-font);
}
.text-heading-1{
font: var(--text-heading-1-weight) var(--text-heading-1-size)/var(--text-heading-1-leading) var(--font-sans);
letter-spacing: var(--text-heading-1-tracking);
}
9.3 Nomenclatura: semântica × escala
- Escala (
size-500,text-lg): flexível, mas não diz onde usar; o time inventa hierarquia sozinho. - Semântica (
text-body,heading-2): guia o uso, mas exige manutenção quando os papéis mudam. - O padrão maduro: primitivos por escala + semânticos por papel apontando para eles. Componentes consomem só os semânticos.
9.4 Fluid type no sistema
- Use
clamp(min, preferida, max)só nos papéis grandes (display, heading-1/2). Corpo e rótulos ficam fixos — fluidez no corpo prejudica a previsibilidade da medida. - Defina o
mine omaxpensando nos breakpoints reais; teste que a 320px nada fica pequeno demais e a 1440px nada fica gigante. - Garanta que o texto ainda escala com o zoom do usuário —
clamp()comremnos limites, não sóvw.
9.5 Onde os tokens vivem
- CSS custom properties — a fonte da verdade em runtime; permite tema e dark mode (trocar
--weight/GRAD). - Tailwind —
theme.fontSize,fontfamily,fontWeight,lineHeight,letterSpacingno config; idealmente lendo das custom properties. - Figma — text styles (e variables para os primitivos) espelhando exatamente os mesmos nomes e valores. Divergência entre Figma e código é a fonte nº 1 de retrabalho.
- Style Dictionary (ou Tokens Studio) — descreve os tokens uma vez em JSON e gera CSS, Tailwind, iOS, Android, Figma. Vale quando há mais de uma plataforma.
- Ver a apostila Design Systems & Design Tokens desta trilha para a arquitetura de tokens completa.
9.6 Governança e o specimen
- Uma página de specimen viva: cada papel renderizado com texto real, em claro e escuro, com do's & don'ts.
- Regra de quem adiciona um papel novo (quase nunca) e por que — a pressão é sempre por "mais um tamanho".
- Lint: proibir
font-size/font-weight"mágicos" no código de produto (só tokens); checar contraste dos pares texto/fundo no CI.
9.7 Respeitar a plataforma e o usuário
- iOS Dynamic Type / Android font scale: em apps nativos, amarre os papéis aos estilos de texto do sistema para herdar a preferência de tamanho do usuário.
- Na web: nunca
pxemfont-size; teste com a fonte do navegador aumentada; respeiteprefers-reduced-motion(eixos animados) eprefers-contrast.
Peça a duas pessoas do time para maquetar a mesma tela sem se falarem. Se a tipografia sai igual — mesmos papéis, mesmos tamanhos — o sistema funciona. Se cada uma inventou uma hierarquia, faltam papéis claros ou sobra escala demais. Um sistema tipográfico é bom quando tira decisões da mesa, não quando oferece mais opções.
Perguntas de design systems / front-end sênior: "Como você estrutura os tokens de tipografia?" (primitivos por escala → semânticos por papel → componentes só consomem semânticos), "Semântico ou por escala na nomenclatura?" (os dois, em camadas), "Como manter Figma e código em sincronia?" (mesmos nomes/valores; Style Dictionary como fonte única), "Quando usar fluid type?" (só nos papéis grandes, com rem nos limites). Ter um mini-sistema com specimen no portfólio é forte.
✏️ Exercício 9 — Desenhe a escala de um design system
Para um produto SaaS (web app denso + site de marketing), especifique: (a) as famílias e seus papéis; (b) a razão da escala e 6–8 degraus com valores em rem; (c) 6 papéis semânticos com família/tamanho/peso/entrelinha/tracking; (d) quais papéis são fluidos; (e) duas regras de governança.
Gabarito (uma boa resposta): (a) uma sans humanista variável para tudo (app + marketing) + uma mono para código; opcional uma serif display só no marketing. (b) razão 1.2, degraus 0.75 / 0.875 / 1 / 1.125 / 1.25 / 1.5 / 1.875 / 2.25 rem (+ um 3rem "display" escolhido a olho). (c) body sans/1rem/400/1.55/0; body-sm sans/0.875/400/1.5/0; label sans/0.875/600/1.3/0.01em; heading-2 sans/1.5/700/1.2/−0.015em; heading-1 sans/2.25/700/1.15/−0.02em; overline sans/0.75/600/1.3/0.08em caixa alta; code mono/0.875/400/1.5. (d) só heading-1, heading-2 e o display do marketing, com clamp() em rem. (e) nada de font-size literal em componentes (lint), e todo papel novo precisa de aprovação + entrada no specimen em claro/escuro.
Mercado de trabalho: roadmap, entrevistas e portfólio
Objetivo: converter o conteúdo dos módulos anteriores em contratação — onde a tipografia pesa, um plano de estudo, um banco de perguntas com respostas e projetos que geram entrevista.
10.1 Onde tipografia pesa
- Product / UI designer: a escala de texto do produto, densidade, tabelas e formulários, responsividade — avaliado em todo teste de portfólio.
- Design systems: tokens de tipografia, specimen, sincronia Figma↔código, governança.
- Brand / identidade: escolha e (às vezes) customização da fonte da marca, logotipo, guidelines. Ver Branding.
- Front-end / UI engineer: carregamento de fontes, performance (CLS/LCP),
@font-face, variable fonts, acessibilidade do texto. - Editorial / motion / DataViz: leitura longa, legendas, rótulos, números tabulares.
10.2 Roadmap de estudo (6–8 semanas)
| Semanas | Foco | Prática |
|---|---|---|
| 1 | Anatomia e classificação (Módulos 2–3) | Pegar 10 sites/apps que você admira e nomear cada fonte por categoria e por que funciona |
| 2 | Escolha e pareamento (Módulo 4) | Montar 3 pares justificados por escrito; testar no conteúdo real, no Windows e no celular |
| 3 | Escala, medida, hierarquia (Módulo 5) | Redesenhar a hierarquia de um artigo real com uma escala modular; antes/depois |
| 4 | Tipografia web: unidades, propriedades, carregamento (Módulo 6) | Implementar o artigo da semana 3 em HTML/CSS com rem, ch, clamp(), @font-face, preload |
| 5 | Variable fonts e OpenType (Módulo 7) | Trocar por uma variável; usar opsz, tabular-nums numa tabela, ajustar 2 cvXX |
| 6 | Acessibilidade e i18n (Módulo 8) | Auditar o projeto com Lighthouse + zoom 200% + teste de text-spacing; simular alemão/árabe |
| 7 | Sistema e tokens (Módulo 9) | Extrair um mini design system tipográfico: primitivos, semânticos, specimen em claro/escuro |
| 8 | Portfólio | Escrever os estudos de caso com o raciocínio (não só telas bonitas); publicar |
10.3 Banco de perguntas de entrevista (com a resposta que aprova)
Júnior/pleno — "Qual a diferença entre fonte e tipo (typeface)?"
Tipo é o design das letras (a ideia — "Helvetica"). Fonte é uma instância concreta desse design: um peso, um estilo, um arquivo/tamanho ("Helvetica Bold 12pt", Helvetica-Bold.woff2). Você licencia um tipo e carrega arquivos de fonte. Família é o conjunto de fontes que formam o tipo.
Pleno — "Como você escolhe a fonte de um produto?"
Por critérios objetivos, não gosto: propósito (corpo longo? UI? dados?), legibilidade em corpo pequeno (x-height, aberturas, formas distintas I/l/1/O/0), número de pesos e itálico real, cobertura de caracteres para os idiomas do produto, recursos OpenType (tabular-nums), qualidade de render no Windows, licença de web/app e peso do WOFF2. Depois testo no conteúdo e nos tamanhos reais, no device real.
Pleno — "Qual a medida ideal de uma linha e a entrelinha do corpo?"
Medida: 45–75 caracteres por linha (~66 ideal); em CSS max-width: 65ch. Entrelinha do corpo: 1.4–1.6, sem unidade, crescendo quando a linha é mais longa ou o texto menor. Títulos grandes: entrelinha mais apertada (1.1–1.25) e tracking levemente negativo.
Pleno/front-end — "px, em ou rem para font-size?"
rem: escala com o font-size da raiz e respeita a preferência de tamanho do usuário no navegador. px em font-size ignora essa preferência (problema de acessibilidade). em é útil para letter-spacing e margens proporcionais ao texto local, mas acumula em elementos aninhados. line-height sem unidade.
Pleno/front-end — "FOUT vs FOIT, e como controlar?"
FOIT = Flash of Invisible Text (o texto some até a fonte carregar); FOUT = Flash of Unstyled Text (mostra o fallback e troca). FOUT é preferível — o conteúdo é legível na hora. Controle com font-display: swap (FOUT) para corpo, optional quando zero shift importa mais. Reduza o "pulo" da troca com preload da fonte crítica e um @font-face de fallback com size-adjust/ascent-override.
Sénior — "Quando usar uma fonte variável?"
Quando você usa 3+ pesos, ou precisa de larguras, ou quer opsz (optical sizing) / GRAD (peso sem reflow, útil no dark mode). Um arquivo variável pesa menos que 4–5 estáticos, mas mais que um único estático — se você só usa Regular + Bold, dois estáticos subsetados podem pesar menos. Faça a conta com o subset real.
Sénior — "Como você garante alinhamento de números numa tabela financeira?"
font-variant-numeric: tabular-nums lining-nums (todos os dígitos com a mesma largura, alinham em coluna), alinhamento à direita ou pelo separador decimal, e uma fonte que tenha o recurso. Sem tabular-nums as colunas "dançam" a cada dígito diferente.
Sénior — "Fontes 'para dislexia' funcionam?"
A evidência de que fontes específicas melhoram a leitura de pessoas disléxicas é fraca. O que a pesquisa apoia: espaçamento generoso (letra, palavra, linha), x-height alto, formas de letra distintas (b/d/p/q não idênticos espelhados), alinhamento à esquerda, medida curta, e principalmente deixar o usuário ajustar fonte/tamanho/espaçamento. Boa tipografia geral já cobre isso.
Armadilha — "É só escolher uma fonte bonita"
Tipografia é composição, não seleção: a mesma fonte fica ótima ou ilegível conforme tamanho, medida, entrelinha, hierarquia, contraste e carregamento. E "bonita numa amostra em corpo 72" não prediz "legível em 14px no Windows". A escolha é ~20% do trabalho; os 80% são escala, hierarquia, ritmo e implementação.
10.4 Projetos de portfólio que geram entrevista
- Type specimen interativo (âncora): uma página que apresenta uma família — pesos,
opsz, recursos OpenType, pares, a escala — com texto real e controles. Mostra domínio de anatomia, OpenType e CSS. - Redesign de hierarquia: pegue um artigo/tela real com hierarquia fraca e refaça com uma escala modular; publique o antes/depois com o raciocínio de cada decisão.
- Sistema tipográfico completo: primitivos + semânticos + specimen em claro/escuro + página de governança, implementado em CSS custom properties e espelhado em Figma text styles.
- Estudo de pareamento: 4–5 duplas de fontes para contextos diferentes, cada uma com o elo que as une e o teste no conteúdo real.
- Refactor de performance de fontes: um site real; antes/depois de CLS e bytes transferidos após WOFF2 + subset + preload + fallback casado + variável. Números do Lighthouse.
10.5 Fontes para continuar
- Livros: Thinking with Type (Ellen Lupton); The Elements of Typographic Style (Robert Bringhurst); Flexible Typesetting (Tim Brown); On Web Typography / Web Typography (Richard Rutter).
- Web: Butterick's Practical Typography (practicaltypography.com); Google Fonts Knowledge; Material Design e Apple HIG (seções de tipografia); MDN sobre
font-*e@font-face. - Referência visual: Fonts In Use, Typewolf, Type Specimens.
- Ferramentas: Utopia (fluid type), Modularscale, Fontsource / next-font (self-host + f-mods), Wakamai Fondue (inspecionar recursos de uma fonte), Fontaine/Glyphhanger (fallback e subset).
- Nesta trilha: Cor, Layout, Grade & Espaçamento, Design Systems & Design Tokens; e as apostilas CSS, CSS Avançado, Acessibilidade Digital & WCAG e Branding.
Quatro ideias sustentam a tipografia: (1) é composição, não seleção — tamanho, medida, entrelinha e hierarquia importam mais que o nome da fonte; (2) x-height, abertura e formas distintas são o que se lê em tela — olhe isso, não a amostra em corpo grande; (3) hierarquia com duas alavancas por nível (tamanho + peso, ou peso + cor) — menos contraste, mais claro; (4) na web, a implementação é metade do trabalho: rem, ch, clamp(), WOFF2 + subset + preload, fallback casado, tabular-nums e acessibilidade. Um sistema de tokens transforma tudo isso em decisões que o time não precisa refazer.