Propriedades customizadas e CSS moderno

Você escolhe um azul da marca, digita em quarenta regras diferentes e envia o site. Um mês depois o marketing quer um azul ligeiramente diferente. Agora você está vasculhando todas as folhas de estilo, esperando pegar os quarenta e não perder os dois que foram escritos com letra maiúscula. Propriedades customizadas resolvem isto: você nomeia a cor uma vez, usa o nome em todo lugar, e muda em um único lugar. Esse hábito é o começo de tematização, design tokens e folhas de estilo que sobrevivem a um redesenho.
Declarando e usando uma variável
Uma propriedade customizada é um valor que você dá um nome para poder reutilizar. Você escreve o nome com dois traços na frente, define para um valor, e depois o lê com var():
:root {
--color-brand: #2563eb; /* declare o valor uma vez, sob um nome */
}
.button {
background: var(--color-brand); /* leia aqui */
}
.link {
color: var(--color-brand); /* e aqui, mesmo valor */
}--color-brand é o nome (os dois traços são obrigatórios), e var(--color-brand) é como você o usa. Declarar em :root (que é o elemento <html>, o topo da página) torna o nome disponível em todos os lugares. Mude a única linha em :root e cada regra que a lê se atualiza.
--color-brand, depois leia com var(--color-brand). Coloque em :root para que toda a página possa usá-la. Mude a única linha e cada regra que lê o nome se atualiza com ela. Elas em cascata e herdam
Se você usou variáveis em outra linguagem, essa próxima parte é a surpresa: uma propriedade customizada não é fixa. Ela segue as mesmas regras que qualquer outra propriedade CSS, o que significa que ela herda para elementos filhos, e você pode dar a ela um valor diferente em um lugar sem tocar no resto.
:root {
--color-text: #1f2937; /* o padrão para a página inteira */
}
.callout {
--color-text: #92400e; /* um valor diferente, apenas dentro de .callout */
color: var(--color-text);
}
p {
color: var(--color-text); /* cinza escuro normalmente, âmbar dentro de um callout */
}O mesmo var(--color-text) fornece cinza escuro na maioria dos parágrafos mas âmbar dentro de um callout, porque o callout definiu seu próprio valor. Isto é o que torna a tematização possível, e você viu a cascata por trás disso em como CSS funciona.
var(--color-text) pode ser cinza na maioria dos parágrafos e âmbar dentro de um callout. Redefina o nome em um container e tudo dentro dele pega o novo valor. Fallbacks e calc()
var() pode receber um segundo valor, usado apenas se a propriedade customizada nunca foi definida. Este é o fallback, e mantém uma regra funcionando mesmo quando um token está faltando:
.card {
gap: var(--gap, 1rem); /* use --gap se existir, caso contrário 1rem */
}Você também pode fazer matemática com uma propriedade customizada usando calc(). Se você tem um valor de espaçamento base, você pode construir um maior a partir dele em vez de hard-coding um segundo número:
:root {
--space-md: 16px;
}
.section {
padding: calc(var(--space-md) * 2); /* 32px, derivado da base */
}Derivar valores dessa forma significa uma mudança para --space-md se propaga através de tudo construído em cima dele.
var(--gap, 1rem) usa o token se existir e cai de volta para 1rem se não, então uma regra continua funcionando quando um valor está faltando. E calc() permite a você construir valores a partir de um token, como calc(var(--space-md) * 2) para o dobro do espaçamento base. Mude a base e tudo construído nela segue. Tematização
Porque uma propriedade customizada pode ser redefinida mais abaixo na árvore, você pode construir um tema escuro mudando os tokens sob uma classe, e deixar cada regra de componente sozinha:
:root {
--color-bg: #ffffff;
--color-text: #1f2937;
}
.theme-dark {
--color-bg: #0f172a; /* mesmos nomes, novos valores */
--color-text: #e2e8f0;
}
body {
background: var(--color-bg);
color: var(--color-text);
}Adicione class="theme-dark" à página e cada regra que lê --color-bg ou --color-text muda para os valores escuros. Você nunca tocou na regra body, ou em nenhum componente, para fazer a troca de tema. Esse é o retorno de nomear suas cores como tokens em vez de escrever os códigos hex diretamente.
.theme-dark. Defina class="theme-dark" e cada regra lendo esses tokens muda, sem editar um único componente. É por isso que você nomeia suas cores como tokens em vez de digitar o código hex direto em cada regra. 
