A cor não existe no objeto — existe no olho e no cérebro de quem olha

Apostila completa de Cor: paleta, contraste e sistemas

Cor é a decisão de design com maior impacto emocional e o maior potencial de excluir gente. Esta apostila cobre como a percepção funciona, os modelos e espaços de cor (RGB, HSL, OKLCH, CMYK, gamutes), teoria e harmonias, como construir uma paleta de verdade com escalas perceptualmente uniformes, acessibilidade e daltonismo, cor em CSS e em tokens, e três aprofundamentos por meio — produto digital, jogos e tempo real, animação e filme.

10 módulosRGB · HSL · OKLCH · CMYKPaleta · escalas de tomWCAG · daltonismoWeb · Jogos · AnimaçãoExercícios com gabarito
MÓDULO 01 · BÁSICO

O que é cor e como a enxergamos

Objetivo: entender que cor é percepção (não uma propriedade fixa do objeto), separar cor de luz de cor de pigmento, e conhecer as três dimensões com que toda cor é descrita.

1.1 Cor é percepção

Um objeto "vermelho" apenas reflete certos comprimentos de onda e absorve o resto; a luz que o ilumina, o ambiente ao redor e o sistema visual de quem observa completam a equação. A mesma tinta parece uma cor ao meio-dia e outra sob lâmpada quente. O mesmo cinza parece mais claro sobre preto e mais escuro sobre branco (contraste simultâneo). Isso não é curiosidade acadêmica: significa que você nunca controla a cor final — controla probabilidades, e projeta com margem.

💡 A regra que organiza a apostila

Projete a cor pela relação, não pelo valor isolado. "Este azul" importa menos do que "este azul contra aquele fundo, ao lado daquele texto, para aquela pessoa, naquela tela". Contraste, hierarquia e acessibilidade são relações; é nelas que a cor acerta ou erra.

1.2 Cor aditiva × subtrativa

Aditiva (luz)Subtrativa (pigmento)
PrimáriasVermelho, Verde, Azul (RGB)Ciano, Magenta, Amarelo (CMY) + Preto (K)
Somar tudo dáBrancoPreto (na teoria; marrom-lama na prática)
Onde viveTelas, projetores, LEDsImpressão, tinta, pintura
ImplicaçãoO que você desenha na tela é luz emitida — mais luz = mais claroMais tinta = mais escuro; o papel é o "branco"

Quase todo trabalho desta apostila é aditivo (telas). CMYK aparece no Módulo 2 para quando o projeto também vai para papel.

1.3 As três dimensões de qualquer cor

Esses três eixos são a base de HSL, HSB, Lab/LCh e OKLCH (Módulo 2). Dominar "vou baixar a saturação e subir a luminosidade" em vez de caçar um hexadecimal é o pulo do gato.

1.4 Onde a cor decide um projeto

💼 Mercado de trabalho

Perguntas de abertura: "Por que a mesma cor parece diferente em contextos diferentes?" (contraste simultâneo; luz; adaptação do olho), "Diferença entre cor aditiva e subtrativa?", "Quais são as três dimensões de uma cor?" (matiz, saturação/croma, luminosidade). Falar em relação e percepção, não em "gosto de azul", já sinaliza maturidade.

✏️ Exercício 1 — Descreva em três eixos

Pegue quatro cores de um site ou app que você usa e descreva cada uma só em palavras: matiz aproximado, saturação (baixa/média/alta), luminosidade (escura/média/clara). Depois diga qual é a cor de ação (botão principal) e por que ela "salta" — em termos dos três eixos e do fundo.

Gabarito (modelo): "Fundo: matiz neutro levemente azulado, saturação baixíssima, luminosidade muito clara. Texto: neutro, saturação ~0, luminosidade escura. Ação: matiz ~230° (azul), saturação alta, luminosidade média. A ação salta porque é a única com saturação alta e porque sua luminosidade contrasta fortemente com o fundo claro — é a relação (saturação isolada + contraste de luminosidade), não o tom em si."

MÓDULO 02 · BÁSICO

Modelos e espaços de cor

Objetivo: saber o que cada modelo representa, por que HSL engana, por que OKLCH é o padrão moderno para UI, e o que é gamut (sRGB, P3, Rec.2020).

2.1 RGB e HEX

2.2 HSL e HSB/HSV

Reorganizam o RGB nos três eixos intuitivos (matiz, saturação, luminosidade/brilho). Ótimos para ajustar uma cor. O problema: não são perceptualmente uniformes — hsl(60 100% 50%) (amarelo) e hsl(240 100% 50%) (azul) têm a mesma "lightness" no modelo mas o amarelo parece muito mais claro. Fazer uma escala de tons variando só o L de HSL produz degraus irregulares e matizes que "derivam".

2.3 Lab e LCh

CIELAB foi desenhado para que distâncias iguais no espaço correspondam a diferenças percebidas iguais. LCh é a versão em coordenadas polares (Lightness, Chroma, hue) — os mesmos três eixos intuitivos, mas perceptualmente honestos. Base do ΔE (delta E), a métrica de "quão diferentes são duas cores".

2.4 OKLab / OKLCH — o modelo moderno para UI

/* mesma luminosidade e croma percebidos — três matizes que "combinam" de peso */
--blue:   oklch(62% 0.17 254);
--green:  oklch(62% 0.17 150);
--red:    oklch(62% 0.17 27);

/* uma escala de tons: só o L muda, em passos regulares */
--gray-100: oklch(97% 0.005 260);
--gray-300: oklch(88% 0.010 260);
--gray-500: oklch(64% 0.015 260);
--gray-700: oklch(45% 0.015 260);
--gray-900: oklch(22% 0.012 260);

2.5 CMYK, cor de processo e spot

2.6 Gamut: sRGB, Display P3, Rec.709/2020

GamutCobreOnde
sRGBo "mínimo comum" da web há 25 anosmaioria dos monitores; assuma-o como base
Display P3~25% mais cores que sRGB (verdes/vermelhos mais vívidos)telas Apple recentes, muitos celulares e monitores novos
Rec.709~sRGBvídeo HD / broadcast (Módulo 9)
Rec.2020bem maior, base do HDRvídeo UHD/HDR; poucos monitores cobrem 100%
Adobe RGBmaior que sRGB nos ciano-verdesfotografia, pré-impressão

Fora do gamut (out of gamut): uma cor que o dispositivo não consegue mostrar — ela é "recortada" (clipping) para a mais próxima que cabe. Em CSS, oklch() pode descrever cores fora do sRGB; use @media (color-gamut: p3) para servir a versão vívida só a quem a exibe, com fallback em sRGB.

💡 Regra prática de modelo

Raciocine e gere paletas em OKLCH. Entregue tokens em oklch() (com fallback hex/rgb para navegadores antigos). Use HSL só para tweaks rápidos, sabendo que ele mente sobre luminosidade. Guarde CMYK/Pantone só se houver impressão. Trabalhe o documento em sRGB por padrão e trate P3 como aprimoramento progressivo.

💼 Mercado de trabalho

Perguntas: "Por que uma escala de tons feita variando o L de HSL fica irregular?" (HSL não é perceptualmente uniforme), "O que OKLCH resolve?", "O que é gamut e o que acontece com uma cor fora dele?" (clipping), "Diferença entre cor de processo e cor spot?". Citar oklch() e @media (color-gamut) mostra que você acompanha o CSS atual.

✏️ Exercício 2 — Traduza e compare

(a) Explique, para um colega, por que hsl(55 100% 50%) e hsl(250 100% 50%) não parecem ter o mesmo brilho apesar do "50%". (b) Escreva três cores em oklch() — um azul, um verde, um laranja — que tenham o mesmo peso visual. (c) Diga o que fazer para que um vermelho vívido de P3 não apareça "lavado" em quem só tem sRGB.

Gabarito: (a) o "L" do HSL é uma média dos canais RGB, não a luminosidade percebida; o olho é muito mais sensível ao verde/amarelo, então o amarelo em "50%" parece claro e o azul parece escuro. (b) ex.: oklch(65% 0.16 250), oklch(65% 0.16 150), oklch(65% 0.16 60) — mesmo L e C, só o H muda. (c) definir a cor com oklch() e um fallback sRGB antes, ou usar @media (color-gamut: p3) / @supports para só entregar a versão P3 a quem a exibe; o fallback sRGB será a cor "recortada" mais próxima, propositalmente escolhida.

MÓDULO 03 · BÁSICO

Teoria da cor e harmonias

Objetivo: usar a roda cromática e os esquemas clássicos como ponto de partida, entender os tipos de contraste, e a proporção 60-30-10 — sem tratar "regras" como lei.

3.1 A roda cromática

A roda tradicional de artista usa primárias RYB (vermelho, amarelo, azul) — é um modelo histórico, não físico, mas continua útil para pensar relações (o que é oposto, o que é vizinho). Ferramentas digitais geralmente usam a roda HSL/HSB (matiz em 360°). Para gerar paletas, prefira raciocinar em graus de matiz num espaço uniforme (OKLCH).

3.2 Esquemas de harmonia

EsquemaComoSensação / uso
Monocromáticoum matiz, variando saturação e luminosidadecoeso, calmo, sofisticado; fácil de acertar
Análogo2–4 matizes vizinhos (ex.: azul, azul-esverdeado, verde)harmônico, natural; escolha um dominante
Complementardois matizes opostos (ex.: azul + laranja)alto contraste, vibrante; um domina, o outro é acento
Complementar divididoum matiz + os dois vizinhos do seu opostocontraste com menos tensão que o complementar puro
Tríadetrês matizes equidistantes (120°)equilibrado e animado; difícil sem um dominante claro
Tetrádica / retângulodois pares complementaresrico, mas fácil de virar bagunça — muito cuidado com proporção

3.3 Os contrastes (Itten)

3.4 "Regras" são ponto de partida

Esquemas de harmonia ajudam a não travar diante da roda, mas os melhores sistemas de cor reais quebram esquemas o tempo todo: um análogo com um acento complementar, um "quase-monocromático" com um neutro temperado. Use os nomes para comunicar e para começar; julgue pelo resultado no contexto.

3.5 A proporção 60-30-10

Um ponto de partida para distribuir: 60% cor dominante (geralmente um neutro/superfície), 30% secundária, 10% acento (a cor de ação, o destaque). Impede o erro clássico de dar peso igual a tudo — o que apaga a hierarquia. Em UI, "60%" quase sempre é branco/cinza.

💼 Mercado de trabalho

Perguntas: "Como você criaria uma paleta a partir de uma cor de marca?" (monocromático/análogo para o sistema + um acento; Módulo 4), "Qual contraste importa para legibilidade?" (claro-escuro / luminosidade), "O que é a regra 60-30-10?", "Por que um cinza parece colorido sobre um fundo saturado?" (contraste simultâneo).

✏️ Exercício 3 — Do matiz ao esquema

Sua cor de marca é um verde-azulado (~175°). Proponha: (a) um esquema para o sistema de UI e por quê; (b) a cor de acento para ações e alertas; (c) como você aplicaria 60-30-10 numa tela de dashboard.

Gabarito (uma boa resposta): (a) quase-monocromático/análogo: neutros temperados com um leve viés do matiz da marca + o verde-azulado como cor de identidade — coeso e deixa espaço para semânticas. (b) para ação, um azul mais puro (não a cor de marca, para a ação não competir com a identidade) ou o próprio matiz da marca em L/C bem definidos; para alerta/erro, um vermelho-alaranjado (~25°), quente e oposto o suficiente para saltar; sucesso num verde mais amarelado (~145°) distinto do matiz da marca. (c) 60% superfícies (branco/cinza-100/200), 30% componentes e bordas (cinza-300/500 + a cor de marca em áreas de navegação), 10% ações e destaques (o acento + as semânticas), sempre checando contraste.

MÓDULO 04 · INTERMEDIÁRIO

Construir uma paleta

Objetivo: um método repetível — âncora, suporte, neutros, semânticas — e escalas de tom perceptualmente uniformes, nomeadas para escalar.

4.1 O método

  1. Âncora: a cor de identidade (da marca) ou a cor de ação. Uma só.
  2. Suporte: 0–2 matizes que acompanham a âncora (análogos, ou um complementar de acento).
  3. Neutros: a escada de cinzas — o esqueleto de qualquer UI (4.2).
  4. Semânticas: sucesso, aviso, erro, informação — matizes com significado convencional, distintos entre si e do resto.
  5. Escalas de tom: cada cor vira uma rampa de ~10 degraus (4.3).

4.2 Neutros: cinzas temperados e a escada

4.3 Escalas de tom (50–950)

Gere cada rampa em OKLCH, variando principalmente o L em passos perceptualmente regulares, com o croma subindo em direção ao meio da rampa (onde a cor "aguenta" mais saturação) e caindo nas pontas. Mantenha o H quase constante — pequenas correções de matiz podem compensar o Bezold–Brücke (o matiz parece deslocar com a luminosidade).

/* rampa "brand blue" — L desce, C faz um arco, H ~constante */
--blue-50:  oklch(97% 0.02 250);
--blue-100: oklch(93% 0.05 250);
--blue-200: oklch(87% 0.09 250);
--blue-300: oklch(80% 0.13 250);
--blue-400: oklch(72% 0.16 252);
--blue-500: oklch(64% 0.17 254);   /* o "tom base" */
--blue-600: oklch(56% 0.16 255);
--blue-700: oklch(47% 0.13 256);
--blue-800: oklch(39% 0.10 257);
--blue-900: oklch(30% 0.07 258);
--blue-950: oklch(22% 0.05 260);

Um alvo prático: cada degrau deve ter contraste suficiente com o vizinho para ser distinguível, e a rampa deve conter pelo menos um tom que passe 4.5:1 sobre branco (para texto) e um que passe sobre preto.

4.4 Quantas cores

A paleta mínima viável: 1 neutro (rampa) + 1 ação + 3–4 semânticas. Muitos produtos maduros vivem nisso. Cada matiz novo é mais um eixo para manter consistente, testar em dark mode e validar em contraste — adicione só com motivo.

4.5 Nomear: papel × valor

/* PRIMITIVO — por valor/escala, sem significado de uso */
--blue-500: oklch(64% 0.17 254);
--gray-700: oklch(45% 0.015 260);

/* SEMÂNTICO — por papel; aponta para um primitivo e troca no dark mode */
--color-action:        var(--blue-500);
--color-text:          var(--gray-900);
--color-text-muted:    var(--gray-600);
--color-surface:       white;
--color-border:        var(--gray-200);
--color-danger:        var(--red-600);

Componentes consomem só os semânticos. Trocar o tema = trocar a camada semântica, não caçar hexadecimais pelo código.

4.6 Ferramentas e validação

💡 O teste da escala de cinza

Tire a saturação da sua paleta inteira. Se em preto-e-branco você ainda distingue os degraus da rampa e a hierarquia da tela continua legível, a base está sólida — a cor está somando, não carregando. Se some tudo, você está dependendo de matiz para comunicar o que deveria vir de luminosidade.

💼 Mercado de trabalho

Perguntas: "Como você constrói a paleta de um produto do zero?" (âncora → suporte → neutros → semânticas → rampas), "Como gerar uma escala de tons consistente?" (OKLCH, L regular, C em arco, H quase fixo), "Por que usar cinza temperado em vez de cinza puro?", "Semântico ou por escala ao nomear?" (as duas camadas). Ter uma paleta com rampas OKLCH e contrastes documentados no portfólio é forte.

✏️ Exercício 4 — Gere a paleta

Para um app de finanças pessoais, especifique: (a) a cor âncora e se ela é de marca ou de ação; (b) a escada de neutros (matiz e croma que você usaria); (c) as 4 semânticas; (d) para a rampa da âncora, os valores OKLCH aproximados de 3 degraus (claro, base, escuro) e qual passa 4.5:1 sobre branco.

Gabarito (uma boa resposta): (a) um azul-esverdeado de confiança como marca, e um azul mais puro separado para ação (para número negativo/positivo não brigar com a marca). (b) neutros temperados: H ≈ 250, C ≈ 0.008–0.015, rampa 50→950 com L de ~98% a ~20%. (c) sucesso/entrada de dinheiro oklch(~60% 0.15 150); erro/gasto acima do orçamento oklch(~55% 0.18 25); aviso oklch(~75% 0.15 80); info = a cor de ação. (d) âncora: claro oklch(93% 0.05 200), base oklch(64% 0.13 200), escuro oklch(42% 0.10 205) — o degrau escuro (~42% L) passa 4.5:1 sobre branco; o base costuma passar 3:1 (texto grande) mas não 4.5:1, então texto pequeno usa o escuro.

MÓDULO 05 · INTERMEDIÁRIO

Cor acessível

Objetivo: garantir contraste suficiente, nunca depender só da cor, e projetar para os ~300 milhões de pessoas com alguma deficiência de visão de cores.

5.1 Contraste de texto (WCAG)

SituaçãoAAAAA
Texto normal (< 24px, ou < 18.66px bold)4.5:17:1
Texto grande (≥ 24px, ou ≥ 18.66px bold)3:14.5:1
Componentes de UI e gráficos essenciais (borda de input, ícone que carrega sentido)3:1 (1.4.11)

5.2 Não depender só da cor (1.4.1)

Nenhuma informação pode ser transmitida apenas por cor. "Campos em vermelho são obrigatórios", "linha verde subiu, vermelha caiu", "status pela cor da bolinha" — todos falham para quem não distingue os matizes. Acrescente ícone, texto, forma, padrão ou posição. A cor reforça; não carrega sozinha.

5.3 Deficiências de visão de cores

TipoO que mudaPrevalência (aprox.)
Deuteranomalia / -nopiaverde reduzido/ausente — confunde vermelho↔verde↔marroma mais comum; ~6% dos homens
Protanomalia / -nopiavermelho reduzido/ausente; vermelhos parecem escuros~2% dos homens
Tritanomalia / -nopiaazul-amarelo afetadorara
Acromatopsiapouca ou nenhuma percepção de matizmuito rara

No total, cerca de 1 em 12 homens e 1 em 200 mulheres. O par vermelho/verde é o campo minado — evite usá-lo como única distinção (semáforos de status, gráficos).

5.4 Como testar

5.5 Modo escuro, alto contraste e preferências

5.6 Cor, cultura e significado

Associações de cor (vermelho = perigo ou sorte? branco = pureza ou luto?) variam entre culturas e contextos. Convenções de UI são mais estáveis (vermelho = erro/destrutivo, verde = sucesso), mas não universais — não presuma. Em produto global, apoie o significado com texto e ícone (volta ao 5.2).

⚠️ Erros de cor que reprovam em auditoria

Texto cinza-claro (placeholder, legenda, "menos importante") abaixo de 4.5:1. Link distinguido do texto só pela cor, sem sublinhado. Erro de formulário só pela borda vermelha. Gráfico com 6 categorias em matizes de saturação e luminosidade parecidas. Estado (online/ocupado/ausente) só pela cor da bolinha. Botão colorido com texto branco que não alcança 4.5:1. Desativar o modo de alto contraste do sistema com !important.

💼 Mercado de trabalho

Perguntas: "Quais são os limites de contraste da WCAG?" (4.5:1 normal, 3:1 grande e componentes), "O que significa 'não usar só a cor'?", "Como você testa uma paleta para daltonismo?" (simular + escala de cinza + luminosidade entre categorias), "Ratio vs APCA?". Mostrar um gráfico ou um sistema de status que funciona em deuteranopia é um diferencial concreto.

✏️ Exercício 5 — Conserte o componente

Um app mostra transações: valor em verde para entradas, vermelho para saídas; o único indicador é a cor. Legendas em #B0B0B0 sobre branco. Um selo "Pendente" em amarelo-claro com texto branco. Aponte os problemas e as correções.

Gabarito: (1) verde/vermelho como única distinção → falha 1.4.1 e é o par pior para daltonismo; adicione sinal +/, o rótulo "Entrada/Saída", ou posição/ícone; garanta que os dois tons diferem em luminosidade. (2) #B0B0B0 em branco ≈ 1.9:1 → muito abaixo de 4.5:1; escureça para ~#595959. (3) selo amarelo-claro + texto branco → contraste ínfimo; use texto escuro sobre o amarelo (e cheque 4.5:1) ou um amarelo mais escuro com texto branco; acrescente um ícone de relógio para não depender da cor.

MÓDULO 06 · INTERMEDIÁRIO

Cor em código (CSS e tokens)

Objetivo: dominar as sintaxes de cor do CSS moderno (oklch(), color-mix(), relative color), estruturar tokens, e lidar com transparência e gradientes sem sujeira.

6.1 Sintaxes de cor

color: #1E90FF;
color: rgb(30 144 255 / 0.8);          /* sintaxe moderna, sem vírgulas, alpha com / */
color: hsl(210 100% 56%);
color: oklch(64% 0.17 254);            /* perceptual — prefira para tokens */
color: oklch(64% 0.17 254 / 0.15);     /* com alpha */
color: color(display-p3 0.2 0.56 1);   /* cor fora do sRGB */

/* relative color syntax: derivar de outra cor */
--brand: oklch(64% 0.17 254);
--brand-hover: oklch(from var(--brand) calc(l - 0.08) c h);
--brand-tint:  oklch(from var(--brand) 0.97 0.03 h);

/* color-mix: misturar duas cores num espaço escolhido */
--brand-muted: color-mix(in oklch, var(--brand) 30%, white);
--overlay:     color-mix(in srgb, black 60%, transparent);

6.2 Palavras-chave úteis

6.3 Tokens de cor: as três camadas

/* 1. PRIMITIVOS — a paleta crua */
:root{
  --blue-500: oklch(64% 0.17 254);
  --gray-50:  oklch(98% 0.005 260);
  --gray-900: oklch(22% 0.012 260);
  --red-600:  oklch(55% 0.18 25);
}
/* 2. SEMÂNTICOS — papéis; a única camada que os componentes usam */
:root{
  --color-surface:     var(--gray-50);
  --color-text:        var(--gray-900);
  --color-action:      var(--blue-500);
  --color-danger:      var(--red-600);
  --color-border:      color-mix(in oklch, var(--color-text) 12%, transparent);
}
/* 3. DARK MODE — redefine só os semânticos */
@media (prefers-color-scheme: dark){
  :root{
    --color-surface: oklch(20% 0.01 260);
    --color-text:    oklch(95% 0.005 260);
    --color-action:  oklch(72% 0.15 254);   /* mais claro e menos saturado no escuro */
  }
}

6.4 Transparência e camadas

6.5 Gradientes

background: linear-gradient(in oklch, var(--blue-500), var(--teal-500));
/* interpolar em oklch/oklab evita o "cinza morto" no meio de dois matizes */
background: conic-gradient(from 90deg, ...);
background: radial-gradient(circle at 30% 20%, ...);

6.6 P3 como aprimoramento progressivo

.cta{ background: #0A66FF; }                 /* fallback sRGB */
@supports (color: oklch(0% 0 0)){
  .cta{ background: oklch(60% 0.20 258); }   /* pode "vazar" para P3 onde houver */
}
@media (color-gamut: p3){
  .cta{ background: color(display-p3 0.13 0.4 1); }
}
💡 Deixe o CSS derivar

Guarde poucos primitivos e derive o resto com oklch(from …) e color-mix(): hover = base −8% de L; borda = texto a 12% de alpha; disabled = texto a 38%. Menos tokens crus para manter, e as relações ficam explícitas no código em vez de escondidas em dezenas de hexadecimais.

💼 Mercado de trabalho

Perguntas de front-end: "Como você estrutura tokens de cor?" (primitivos → semânticos → componentes só usam semânticos; dark mode troca a camada semântica), "O que color-mix() e a relative color syntax resolvem?", "Por que interpolar gradiente em oklch?", "Como servir cores P3 sem quebrar sRGB?" (@supports / @media (color-gamut) + fallback).

✏️ Exercício 6 — Escreva o núcleo de tokens

Escreva o CSS de: 4 primitivos (ação, neutro claro, neutro escuro, perigo em oklch()); 6 semânticos (surface, text, text-muted, action, action-hover derivado, border derivada); e o bloco de dark mode redefinindo só os semânticos necessários. Explique como um componente de botão consumiria isso.

Gabarito (uma boa resposta): primitivos --blue-500, --gray-50, --gray-900, --red-600 em oklch(). Semânticos: --color-surface: var(--gray-50); --color-text: var(--gray-900); --color-text-muted: color-mix(in oklch, var(--color-text) 62%, var(--color-surface)); --color-action: var(--blue-500); --color-action-hover: oklch(from var(--color-action) calc(l - 0.08) c h); --color-border: color-mix(in oklch, var(--color-text) 12%, transparent). Dark: redefinir --color-surface, --color-text e --color-action (mais claro, C menor); os derivados se recalculam sozinhos. O botão usa background: var(--color-action), :hovervar(--color-action-hover), texto branco só se passar 4.5:1 (senão usar --color-text).

MÓDULO 07 · AVANÇADO

Cor para produto digital e web

Objetivo: o sistema de cor de uma aplicação — superfícies, elevação, estados, foco — cor de marca vs cor de UI, dados dentro do produto, modo escuro de verdade e theming.

7.1 O sistema de cor de um produto

PapelNotas
Superfícies (background, card, popover)a base neutra; a elevação se dá por diferença sutil de luminosidade e por sombra
Texto (primário, secundário, desabilitado, sobre cor)cada nível com contraste alvo; "sobre cor" tem par próprio validado
Bordas e divisoresgeralmente texto a baixo alpha; ≥ 3:1 quando delimitam um controle
Ação (primária, secundária, destrutiva, link)a cor de mais peso; destrutiva sempre com confirmação textual também
Estados (hover, active, focus, selected, disabled)derivados por regra (±L, alpha), não cores novas à mão
Focoanel visível, ≥ 3:1 com o fundo adjacente, não removível; use :focus-visible
Semânticas (success/warning/danger/info)cada uma com rampa própria: fundo suave, borda, texto, ícone

7.2 Cor em visualização de dados dentro do produto

7.3 Cor de marca × cor de UI

A cor da marca nem sempre pode ser a cor de ação: se a marca é um vermelho, ele colide com "erro/destrutivo"; se é um amarelo, não alcança contraste como fundo de botão com texto branco. Solução comum: a marca vive na navegação, no logo, em áreas de identidade; a ação é uma cor derivada ou vizinha, escolhida por contraste e por não colidir com as semânticas.

7.4 Modo escuro de verdade

7.5 Theming e white-label

Um produto que precisa vestir a marca de cada cliente: exponha uma cor de marca como entrada e derive a paleta inteira (rampa via OKLCH, semânticas, estados) por função — em vez de pedir 40 valores ao cliente. Fixe as semânticas de status (não deixe o cliente tornar o "erro" verde). Valide contraste automaticamente para qualquer cor de entrada e ajuste (ex.: forçar o texto sobre a cor de marca a preto ou branco conforme o L dela).

7.6 Governança

💼 Mercado de trabalho

Perguntas de product/design systems: "Como você faz um modo escuro que não é só inverter?" (superfícies escuras temperadas, elevação por luz, destaque com +L −C, revalidar contraste), "A cor de marca pode ser a cor de ação?" (nem sempre — colisão com semânticas e contraste), "Como suportar white-label sem caos?" (uma entrada → paleta derivada + semânticas fixas + validação de contraste), "Como cor de dados difere de cor de UI?".

✏️ Exercício 7 — Do claro para o escuro

Você tem no claro: surface branco, texto gray-900, ação oklch(60% 0.19 258) com texto branco (passa 4.5:1), borda gray-200. Descreva as mudanças para o modo escuro, item a item, e o que você reverificaria.

Gabarito (uma boa resposta): surface → oklch(~20% 0.01 260) (não #000); superfícies elevadas → ~24–28% L. Texto → oklch(~95% 0.005 260), não branco puro; texto secundário mais claro que no claro, revalidado. Ação → subir L para ~72% e baixar C para ~0.14 (oklch(72% 0.14 258)); reverificar se o texto sobre ela deve virar escuro em vez de branco. Borda → texto a ~14–18% de alpha (mais visível que no claro). Sombras → trocar por borda/again por luminosidade de superfície. Reverificar: todos os pares texto/superfície, texto-sobre-ação, anel de foco, e a paleta de dados (que também muda no escuro).

MÓDULO 08 · AVANÇADO

Cor para jogos e tempo real

Objetivo: entender o fluxo de cor linear, valores de albedo plausíveis para PBR, HDR e tonemapping, color grading no engine, e a legibilidade de cor no gameplay.

8.1 O fluxo linear (linear vs sRGB)

8.2 PBR e valores de albedo

8.3 HDR, exposição e tonemapping

8.4 Color grading no engine

8.5 Legibilidade de gameplay

8.6 Paleta e mood

⚠️ Armadilhas de cor em tempo real

Normal/roughness maps importados como sRGB (iluminação errada). Albedo com preto/branco puro ou com sombra pintada. Comparar o look com tonemapping desligado. Grading tão forte que o gameplay-critical some (loot que vira parte do cenário). Time vermelho vs time verde sem opção acessível. HUD testado só numa cena clara. "Ficou lindo no meu monitor" sem checar em SDR/HDR e em telas baratas.

💼 Mercado de trabalho

Perguntas (technical artist / game): "Por que iluminar em espaço linear?", "Que texturas não são sRGB?" (normal, roughness, metallic, AO), "O que o tonemapping faz e qual operador você usaria?" (ACES/AgX e por quê), "Como garantir que o loot é sempre visível?" (reservar cor + silhueta + grading que preserva o gameplay-critical), "Como fazer um modo daltônico de verdade?".

✏️ Exercício 8 — Diagnóstico e plano de cor

(a) Um objeto metálico no jogo aparece "chapado" e escuro sob qualquer luz. Cite duas causas de cor prováveis. (b) Playtesters daltônicos não distinguem aliados de inimigos (marcados por contorno vermelho/verde). Proponha a correção. (c) O jogo tem um bioma de deserto e um de floresta que parecem iguais de humor. O que você ajusta sem tocar nos assets?

Gabarito: (a) o normal/roughness map pode estar como sRGB (iluminação errada), ou o material está tratando o metal como dielétrico — metal precisa de metallic alto e a cor vindo do specular/reflectância, não do albedo difuso; albedo difuso de metal é ~0. (b) não usar vermelho/verde como única pista: pares seguros configuráveis (ex.: azul/laranja), ícones/formas diferentes por afiliação, e opção de daltonismo nas configurações; testar em deuteranopia. (c) temperatura e cor da luz (key quente e fill fria no deserto; verde-frio filtrado pela copa na floresta), fog colorido, e volumes de grading distintos (saturação, split toning, curvas) com key colors próprias — mais concept/color key para a equipe.

MÓDULO 09 · MUITO AVANÇADO

Cor para animação, motion e filme

Objetivo: escrever a jornada emocional em cor (color script), manter continuidade entre planos, trabalhar paleta limitada, e entender grading, espaços de vídeo e entrega.

9.1 Color script

Um color script é uma sequência de pequenos quadros (miniaturas pintadas) que mapeia a temperatura emocional da história ao longo do tempo — antes de animar. Usado em longas de animação para garantir que a cor "conta a história": o momento de esperança é quente e claro, o fundo do poço é dessaturado e frio, o clímax volta a saturar. É uma partitura de cor da narrativa inteira, vista de uma vez.

9.2 Paleta por sequência e continuidade

9.3 Paleta limitada em 2D

9.4 Grading, espaços de vídeo e scopes

EspaçoUso
Rec.709 / sRGB (gamma ~2.4)entrega HD, web, broadcast SDR — o alvo padrão
Rec.2020 + PQ/HLGHDR (UHD, streaming HDR) — muito mais brilho e gamut
ACESpipeline de cor cena-referida para produção; entra tudo, converte, entrega em vários alvos de forma consistente

9.5 Motion graphics e web

9.6 Entrega: "por que ficou diferente no player"

🔬 Aprofundamento — o mesmo princípio em três meios

Color script (animação), color key por nível (jogo) e a paleta semântica de um produto (web) são a mesma ideia: decidir antes, em relação, o que cada cor significa ao longo da experiência — e depois manter a coerência. A ferramenta muda (miniaturas pintadas, volumes de post-process, tokens em OKLCH), a disciplina não.

💼 Mercado de trabalho

Perguntas: "O que é um color script e para que serve?", "Como manter continuidade de cor entre planos?", "Por que as sombras numa paleta 2D não são só a base escurecida?", "Rec.709, Rec.2020, ACES — o que é o quê?", "Por que confiar em scopes e não no monitor?", "Como um vídeo 'fica diferente' de um player para outro?" (tags de espaço de cor e range).

✏️ Exercício 9 — Color script curto

Um curta de 3 atos: (1) rotina confortável, (2) perda e isolamento, (3) reconstrução. Descreva a paleta-chave de cada ato (dominante, acento, neutros, saturação, temperatura) e como você faria a transição entre eles. Depois cite um cuidado de acessibilidade se esse curta virar peça de motion para a web.

Gabarito (uma boa resposta): Ato 1: dominante quente-clara (âmbar/creme), acento verde suave, neutros mornos, saturação média-alta, temperatura quente. Ato 2: dominante fria e dessaturada (azul-acinzentado), acento mínimo, neutros frios, saturação baixa, luminosidade geral mais baixa — a cor "esvazia". Ato 3: a saturação e o calor voltam gradualmente, mas com uma paleta um pouco diferente da do Ato 1 (não é "voltar ao começo", é um novo equilíbrio) — talvez um acento novo. Transições: graduais ao longo de vários planos, acompanhando os beats; um plano-ponte com iluminação ambígua entre atos. Acessibilidade na web: nenhuma piscada > 3×/s, honrar prefers-reduced-motion com uma versão de transições suaves, e garantir que qualquer texto sobreposto mantém 4.5:1 durante toda a animação, não só nos extremos.

MÓDULO 10 · CARREIRA

Mercado de trabalho: roadmap, entrevistas e portfólio

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

10.1 Onde cor pesa

10.2 Roadmap de estudo (6–8 semanas)

SemanasFocoPrática
1Percepção, modelos, gamut (Módulos 1–2)Recriar 5 paletas de apps que você admira em oklch(); ver cada uma em cinza
2Teoria e harmonias (Módulo 3)Gerar 4 paletas com esquemas diferentes a partir da mesma âncora; aplicar 60-30-10
3Construir paleta: rampas e tokens (Módulo 4)Criar uma paleta de produto: neutros temperados + ação + 4 semânticas, rampas 50–950 em OKLCH
4Acessibilidade (Módulo 5)Auditar a paleta: contraste de cada par, simulação de daltonismo, teste da escala de cinza
5Cor em CSS e tokens (Módulo 6)Implementar os tokens (primitivos → semânticos), color-mix/relative color para derivados, dark mode
6Produto: sistema, dark mode, theming (Módulo 7)Fazer o dark mode "de verdade" da UI da semana 3; montar um white-label a partir de 1 cor
7Um aprofundamento à escolha: jogos (Módulo 8) ou animação (Módulo 9)Jogo: um color key + grading de bioma no Unity. Animação: um color script de 12 quadros
8PortfólioEscrever os estudos de caso com o raciocínio e os números de contraste; publicar

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

Júnior/pleno — "Quais são as três dimensões de uma cor?"

Matiz (hue — que cor é), saturação/croma (quão pura ou acinzentada) e luminosidade (lightness/value — quão clara ou escura). São os eixos de HSL, LCh e OKLCH. Raciocinar nesses eixos ("baixar croma, subir L") é mais produtivo que caçar hexadecimais.

Pleno — "Por que não fazer uma escala de tons variando o L de HSL?"

Porque HSL não é perceptualmente uniforme: o mesmo "L" parece mais claro no amarelo que no azul, e o matiz "deriva" ao mudar a luminosidade. Os degraus saem irregulares. Em OKLCH, variar o L dá passos visualmente regulares e o matiz se mantém.

Pleno — "Como você constrói a paleta de um produto?"

Âncora (marca ou ação) → 0–2 cores de suporte → escada de neutros (temperados, não cinza puro) → semânticas (success/warning/danger/info) → cada cor vira uma rampa 50–950 gerada em OKLCH (L regular, croma em arco, matiz quase fixo). Nomear em duas camadas: primitivos por escala, semânticos por papel; componentes usam só os semânticos. Validar contraste e daltonismo, documentar em specimen.

Pleno — "Quais os limites de contraste da WCAG e onde eles se aplicam?"

Texto normal 4.5:1 (AA) / 7:1 (AAA); texto grande (≥ 24px ou ≥ 18.66px bold) 3:1 / 4.5:1; componentes de UI e gráficos essenciais 3:1. Aplica-se também a texto secundário em cinza, placeholders, links, e texto dentro de botões coloridos. O ratio atual tem limitações; APCA (WCAG 3, rascunho) é o sucessor perceptual.

Pleno/sénior — "Como fazer um modo escuro que não seja só inverter?"

Superfícies em cinza muito escuro temperado (não #000); elevação por mais luz, não menos; cores de destaque com L maior e croma menor (senão "brilham"); texto a ~90–95% de L, não branco puro; sombras substituídas por diferença de luminosidade e borda; e revalidar todos os contrastes — eles não se transferem do tema claro. Na prática: redefinir só a camada de tokens semânticos.

Sénior — "A cor da marca pode ser a cor de ação da UI?"

Nem sempre. Se a marca é vermelha, colide com "erro/destrutivo"; se é amarela, não alcança contraste como fundo de botão com texto branco. Solução comum: a marca vive no logo/navegação/áreas de identidade e a cor de ação é uma vizinha derivada, escolhida por contraste e por não colidir com as semânticas de status.

Sénior / technical artist — "Por que iluminar em espaço linear e que texturas não são sRGB?"

Somar e multiplicar luz só é fisicamente correto em linear; por isso o engine converte o albedo (que é sRGB) para linear antes de iluminar e reaplica a curva no fim, após o tonemapping. Não são sRGB: normal map, roughness, metallic, ambient occlusion, height — são dados, e devem ser importados como "linear/non-color", senão a iluminação sai errada.

Armadilha — "Escolhi cores bonitas, tá pronto"

Cor é relação e sistema: sem rampas consistentes, contraste validado, comportamento em dark mode, teste de daltonismo e tokens, "cores bonitas" viram dívida. E "bonito no meu monitor" ignora gamut, calibração e o modo de alto contraste do usuário.

10.4 Projetos de portfólio que geram entrevista

  1. Sistema de cor de produto (âncora): paleta completa com rampas OKLCH, tokens em 3 camadas, dark mode real, specimen com todos os contrastes, e um texto explicando cada decisão.
  2. Redesign de acessibilidade: pegue um produto real com problemas de contraste/daltonismo e refaça a cor; mostre antes/depois com números e simulações.
  3. White-label a partir de uma cor: um gerador que recebe uma cor de marca e deriva a paleta inteira + semânticas, com validação de contraste automática.
  4. Paleta de dados acessível: conjuntos categórico, sequencial e divergente que funcionam em deuteranopia e em cinza, aplicados a gráficos reais.
  5. Um aprofundamento: um color script de um curta (12–20 quadros com o raciocínio emocional) ou um color key + grading de dois biomas de um jogo, com antes/depois.

10.5 Fontes para continuar

🏁 Síntese final da apostila

Cinco ideias sustentam a cor: (1) é percepção e relação — projete o par, não o valor isolado; (2) raciocine em OKLCH — luminosidade honesta, rampas regulares, matizes que combinam de peso; (3) acessibilidade não é opcional — contraste, nunca só a cor, e teste de daltonismo; (4) tokens em camadas transformam a paleta num sistema que o dark mode e o theming só reconfiguram; (5) em qualquer meio — web, jogo ou filme — a disciplina é a mesma: decidir antes, em relação, o que cada cor significa, e manter a coerência.