Fundações
Cor da agenda
A receita
| Campo | O que ele faz |
|---|---|
| matiz | O ângulo OKLCH. É o NOME da cor — mexer nele troca Rubi por outra coisa. |
| croma | Multiplica a saturação da receita do tema. É o que deixa existir marrom, musgo e cinza numa paleta que, no resto, é de cor cheia. |
| luz | Desloca a luminância desta cor em pontos percentuais, sobre a base do tema. É a peça que separa as cores DEPOIS do lavado. |
| texto | Claro ou escuro por cor. Só o tema claro usa a distinção; nos três escuros o texto claro serve nas 24. |
Como a cor chega no cartão
estiloDaCor devolve as quatro medidas como variáveis CSS, e o cartão as veste por style inline. A conta acontece no consumidor, nunca no token.
.evt {
background: oklch(
calc(var(--evt-fundo-l) + var(--evt-dl, 0%))
calc(var(--evt-fundo-c) * var(--evt-k, 1)) var(--evt-h)
);
}Armadilha já pagaO calc mora no consumidor, não no token
calc() com --evt-dl lá em cima, junto dos tokens do tema, resolve contra a raiz — onde a variável não existe. Sai sempre a base do tema, sem erro e sem aviso. A conta tem que acontecer no elemento que recebeu o style. Mesma armadilha vale pro --evt-tx do texto.As 24, vivas, passadas e canceladas
A mesma paleta nos temas escuros
Graphite · data-theme="graphite"
Forest · data-theme="forest"
Slate · data-theme="slate"
O cartão passado
O chip deles não fica transparente: mede opacity: 1 e troca o preenchimento por uma versão pastel do mesmo pigmento. Medido no Pavão: futuro rgb(3,155,229), passado rgb(179,225,247), e 0,30 × 3 + 0,70 × 255 = 179 fecha nos três canais.
| Camada | Regra |
|---|---|
| Fundo | 30% do pigmento sobre a superfície do tema, sólido |
| Primeira linha | A tinta cheia do tema — o nome continua legível |
| Segunda linha | A mesma tinta a 50% — a linha de apoio recua |
NuncaNunca resolver isso com opacity
opacity, duas camadas a 30% empilham em 51% e um cartão vaza no outro. Camada sólida também impede as linhas de meia hora e o pontilhado da grade de atravessarem o cartão por dentro. Pousar sobre a superfície do tema, e não sobre branco fixo, é o que mantém a receita nos cinco temas: no escuro o pastel escurece junto.O cartão cancelado
Medido no print do evento recusado do Google: o cartão perde o preenchimento, fica com o papel da tela e desenha traço, nome e risco na MESMA tinta, todos em rgb(144,207,179) sobre branco. É cor sólida, não transparência — a mesma regra do cartão passado.
| Camada | Regra |
|---|---|
| Fundo | A superfície do tema, sem pigmento nenhum |
| Traço | 1px da tinta lavada, por dentro (outline com recuo de 1px) |
| Texto e risco | A mesma tinta do traço |
| Tarja do profissional | Tinta CHEIA, por cima — é ela que ainda diz de quem era o horário |
.evt-vazado {
--evt-vazado-tinta: oklch(
calc(var(--evt-fundo-l) + var(--evt-dl, 0%) + var(--evt-vazado-dl))
calc(var(--evt-fundo-c) * var(--evt-k, 1) * var(--evt-vazado-c))
var(--evt-h)
);
background: var(--surface);
color: var(--evt-vazado-tinta);
outline: 1px solid var(--evt-vazado-tinta);
outline-offset: -1px;
}| Tema | Deslocamento | Contraste da tinta nas 24 | Mediana |
|---|---|---|---|
| Claro e azure | +15% de luz, croma × 0,5 | 1,35 a 2,67 | 1,76 |
| Graphite, Forest, Slate | +12% de luz, croma × 0,5 | 2,01 a 4,65 | 3,36 |
NotaO contraste baixo aqui é a decisão, não a falha
--evt-vazado-dl, e essa é conversa com ele — não conserto de passagem.Armadilha já pagaO traço apaga o anel de foco se ninguém devolver
.evt-vazado mora fora de qualquer camada e o evt-fio é utility: regra sem camada vence utility mesmo com especificidade menor, então o outline do vazado engoliria também o :focus-visible do fio. O anel é redeclarado dentro da própria regra.A medida que decide se a paleta está boa
A régua é a separação real entre as cores no estado lavado dividida pelo teto teórico daquela quantidade de cores. O teto sai de empacotar N cores no espaço inteiro com contraste mínimo de 4,5.
| Paleta | ΔE mínimo | Teto | Taxa | Pares colididos |
|---|---|---|---|---|
| Google · 12 cores | 5,70 | 11,70 | 49% | 0 pares |
| Agenda até 27/08 · 24 cores | 2,70 | 8,66 | 31% | 12 pares |
| Agenda hoje · 24 cores | 4,40 | 8,66 | 51% | 5 pares |
Empata com o Google carregando o dobro de nomes. O zero absoluto deles não é alcançável aqui: vinte e quatro matizes não cabem no mesmo círculo com a folga de doze.
NotaNão existe regra de luminância do Google pra copiar
luz e croma daqui saíram de otimização com duas travas: contraste mínimo em todos os temas, e ΔE ≤ 10 contra a cor anterior, pra nenhuma deixar de ser ela mesma.Contraste do texto no cartão vivo
| Tema | Até 27/08 | Hoje |
|---|---|---|
| Claro e azure | 3,01 a 3,62 | 2,18 a 8,17 |
| Graphite | 8,44 a 10,82 | 4,68 a 11,07 |
| Forest | 8,44 a 10,82 | 4,68 a 11,07 |
| Slate | 8,44 a 10,82 | 4,68 a 11,07 |
Nos três temas escuros o texto claro serve nas 24 e a faixa é confortável. No tema claro ela vai de 2,18 a 8,17, porque 22 das 24 escrevem branco por escolha: sete passam AA, oito ficam só em AA-large e nove caem abaixo de 3,0, sendo a Esmeralda a pior.
NotaPor que não está "errado"
Armadilha já pagaMexeu em luz ou croma, volta a conversa
lib/agenda/cores.test.ts: se aquele teste cair, a pergunta não é qual valor é o certo, é quem mudou e se falou com ele.