SW Core
SW Core / CSS / Motor de cor

Motor de cor CSS

Um nome (ou um número) vira a marca inteira — botão, link, borda, fundo, card — e a noite muda só a luz, nunca a cor. <html sw-cor="azul">.

O que é

Com o atributo sw-cor, você escolhe uma cor e o SW Core monta o resto sozinho: a cor dos botões, o texto na cor da marca, as bordas, o brilho, o degradê, o link e até um leve tom da marca no fundo e nos cards. Serve uma cor pronta por nome (sw-cor="azul", "pink", "dourado"…) ou qualquer cor por número, de 0 a 360 (--sw-h), que é o que o painel de um cliente guarda no banco. Cada cliente ganha identidade própria sem escrever CSS nenhum.

É só CSS. O número --sw-h é a posição da cor numa roda (0 = vermelho, 120 = verde, 250 = azul, 330 = rosa…). O motor usa um formato de cor moderno (oklch) que separa a luz da cor: no tema claro ele só troca a luz, então dia e noite têm a mesma cor, só mais clara ou mais escura, e o texto continua legível em qualquer cor. É opcional: sem sw-cor nada muda no seu site. Vale no <html> (site inteiro) ou num bloco (só aquele pedaço). As cores de aviso (sucesso, erro, alerta, info) ficam fixas de propósito: verde é sempre "deu certo".

Quando usar

  • Site de cliente com a cor dele: <html sw-cor="pink"> e pronto.
  • Sistema com vários clientes (SWSIS, AcheMe): o painel salva um número (0–360) e a página aplica no <html>.
  • Uma seção de outra cor (área "Infantil" laranja num site azul): <section sw-cor="laranja">.
  • Pré-visualizar a cor antes de salvar, no painel: troque o atributo ou o número por JavaScript.
  • Marca mais sóbria ou mais viva sem trocar a cor: sw-cor-intensidade.

Comece aqui

  1. 1

    Coloque o SW Core no <head>. O motor de cor já vem dentro (versão 2.1.0 ou mais nova).

    <link rel="stylesheet" href="swcore/swcore.min.css">
  2. 2

    Coloque sw-cor com o nome da cor no <html>. O site inteiro muda. (O quadro mostra o mesmo atributo num bloco.)

    Ver serviçosNovo
    <html lang="pt-BR" sw-cor="azul">
  3. 3

    Quer um tom exato? Ligue o motor com sw-cor sem nome e diga o número da cor no seu CSS.

    <html lang="pt-BR" sw-cor>
    
    <style>
      html[sw-cor] { --sw-h: 330; }   /* 0 a 360 — aqui, um rosa */
    </style>

Todas as variações

Cada quadro abaixo é o componente de verdade, rodando. O código embaixo é exatamente o que está no quadro: copie e cole.

1. As 17 cores prontas

Nome da cor no atributo. Cores vizinhas na roda têm intensidade bem diferente para nunca parecerem a mesma. sw-cor sem nome = esmeralda.

Vermelho
sw-cor="vermelho" <div sw-cor="vermelho" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Vermelho</span> </div>
Laranja
sw-cor="laranja" <div sw-cor="laranja" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Laranja</span> </div>
Âmbar
sw-cor="ambar" <div sw-cor="ambar" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Âmbar</span> </div>
Bronze
sw-cor="bronze" <div sw-cor="bronze" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Bronze</span> </div>
Dourado
sw-cor="dourado" <div sw-cor="dourado" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Dourado</span> </div>
Lima
sw-cor="lima" <div sw-cor="lima" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Lima</span> </div>
Esmeralda (padrão)
sw-cor="esmeralda" <div sw-cor="esmeralda" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Esmeralda (padrão)</span> </div>
Petróleo
sw-cor="petroleo" <div sw-cor="petroleo" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Petróleo</span> </div>
Ciano
sw-cor="ciano" <div sw-cor="ciano" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Ciano</span> </div>
Azul
sw-cor="azul" <div sw-cor="azul" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Azul</span> </div>
Marinho
sw-cor="marinho" <div sw-cor="marinho" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Marinho</span> </div>
Lavanda
sw-cor="lavanda" <div sw-cor="lavanda" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Lavanda</span> </div>
Roxo
sw-cor="roxo" <div sw-cor="roxo" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Roxo</span> </div>
Magenta
sw-cor="magenta" <div sw-cor="magenta" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Magenta</span> </div>
Nude
sw-cor="nude" <div sw-cor="nude" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Nude</span> </div>
Pink
sw-cor="pink" <div sw-cor="pink" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Pink</span> </div>
Grafite
sw-cor="grafite" <div sw-cor="grafite" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Grafite</span> </div>

2. Qualquer cor por número (--sw-h)

Arraste: o número de 0 a 360 é a cor. É exatamente isso que um painel de cliente salva no banco.

--sw-h: 250
LinkNovo
--sw-h de 0 a 360 (aqui trocado ao vivo por JavaScript)
<div sw-cor="azul" class="p-g r-m flx f-cl gap-m">
  <input type="range" sw-rng min="0" max="360" value="250" aria-label="Matiz da cor" oninput="var b=this.closest('[sw-cor]');b.style.setProperty('--sw-h',this.value);b.style.setProperty('--_pct',(this.value/3.6)+'%');this.nextElementSibling.textContent='--sw-h: '+this.value">
  <span class="t-pri sw-f4">--sw-h: 250</span>
  <div class="flx gap-m alc f-wr">
    <button sw-btn="pri">Agendar</button>
    <button sw-btn="pri out">Ver fotos</button>
    <a href="#">Link</a>
    <span sw-badge="pri">Novo</span>
  </div>
</div>

3. Quanto a marca tinge o fundo (sw-cor-fundo)

Controla o "tom da marca" no fundo, nos cards, nas bordas e no texto suave. leve é o padrão.

Neutro
Revisão completa · 2h
sw-cor-fundo="neutro" — cinza puro <div sw-cor="azul" sw-cor-fundo="neutro" class="p-m r-m flx f-cl gap-p w-fl"> <strong class="t-txt">Neutro</strong> <div class="bg-sur bd p-p r-p t-p">Revisão completa · 2h</div> <button sw-btn="pri">Orçamento</button> </div>
Leve
Revisão completa · 2h
sw-cor-fundo="leve" — padrão <div sw-cor="azul" sw-cor-fundo="leve" class="p-m r-m flx f-cl gap-p w-fl"> <strong class="t-txt">Leve</strong> <div class="bg-sur bd p-p r-p t-p">Revisão completa · 2h</div> <button sw-btn="pri">Orçamento</button> </div>
Médio
Revisão completa · 2h
sw-cor-fundo="medio" <div sw-cor="azul" sw-cor-fundo="medio" class="p-m r-m flx f-cl gap-p w-fl"> <strong class="t-txt">Médio</strong> <div class="bg-sur bd p-p r-p t-p">Revisão completa · 2h</div> <button sw-btn="pri">Orçamento</button> </div>
Forte
Revisão completa · 2h
sw-cor-fundo="forte" — bem tingido <div sw-cor="azul" sw-cor-fundo="forte" class="p-m r-m flx f-cl gap-p w-fl"> <strong class="t-txt">Forte</strong> <div class="bg-sur bd p-p r-p t-p">Revisão completa · 2h</div> <button sw-btn="pri">Orçamento</button> </div>

4. Quão viva é a cor (sw-cor-intensidade)

A mesma cor, mais discreta ou mais forte. Vale por cima da intensidade da cor pronta.

Sóbrio
sw-cor-intensidade="sobrio" <div sw-cor="laranja" sw-cor-intensidade="sobrio" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Sóbrio</span> </div>
Normal
sw-cor-intensidade="normal" <div sw-cor="laranja" sw-cor-intensidade="normal" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Normal</span> </div>
Vivo
sw-cor-intensidade="vivo" <div sw-cor="laranja" sw-cor-intensidade="vivo" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Vivo</span> </div>

5. Dia e noite com a mesma cor

O tema troca só a luz. Num bloco, sw-theme junto de sw-cor força um tema só ali (útil para faixa clara numa página escura).

Noite
sw-theme="dark" — noite <div sw-cor="pink" sw-theme="dark" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Noite</span> </div>
Dia
sw-theme="light" — dia <div sw-cor="pink" sw-theme="light" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Dia</span> </div>
Noite
sw-theme="dark" — noite <div sw-cor="petroleo" sw-theme="dark" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Noite</span> </div>
Dia
sw-theme="light" — dia <div sw-cor="petroleo" sw-theme="light" class="p-m r-m flx f-cl gap-p alc w-fl"> <button sw-btn="pri">Agendar</button> <span class="t-pri t-p">Dia</span> </div>

6. Tudo que segue a cor

Um bloco com vários componentes: todos mudam com o sw-cor, sem nenhuma classe a mais.

Studio de Pilates

Fundo, card, borda, texto e link tingidos pela marca.

Vagas abertasTom suaveBorda
Card dentro do bloco (superfície e borda com tom da marca)
sw-cor="roxo" num bloco
<section sw-cor="roxo">
  <strong class="t-pri t-h4">Studio de Pilates</strong>
  <p>Fundo, card, borda, texto e <a href="/sobre">link</a> tingidos pela marca.</p>
  <button sw-btn="pri">Aula experimental</button>
  <button sw-btn="pri ghost">Horários</button>
  <span sw-badge="pri">Vagas abertas</span>
  <span class="bg-pri-soft t-pri">Tom suave</span>
  <span class="bd-2 bd-pri">Borda</span>
  <div class="bg-sur bd">Card dentro do bloco</div>
</section>

Tabela de opções

PalavraO que fazExemplo
Ligar o motor
sw-corLiga o motor. Sem valor = esmeralda. No <html> muda o site todo; num bloco, só ele (e o bloco ganha fundo e cor de texto).<html sw-cor>
sw-cor="nome"Cor pronta: vermelho · laranja · ambar · bronze · dourado · lima · esmeralda · petroleo · ciano · azul · marinho · lavanda · roxo · magenta · nude · pink · grafite.<html sw-cor="pink">
Ajuste por nome
sw-cor-fundo="neutro"Fundo, cards e bordas sem tom da marca (cinza).
sw-cor-fundo="leve"Tom bem leve — padrão.
sw-cor-fundo="medio"Tom médio.
sw-cor-fundo="forte"Fundo bem tingido.<html sw-cor="azul" sw-cor-fundo="forte">
sw-cor-intensidade="sobrio"Cor discreta.
sw-cor-intensidade="normal"Cor média.
sw-cor-intensidade="vivo"Cor forte.<html sw-cor="laranja" sw-cor-intensidade="vivo">
Ajuste por número (no seu CSS)
--sw-hA cor: 0 a 360. Ex.: 0 vermelho · 60 laranja · 125 lima · 162 esmeralda · 210 ciano · 250 azul · 310 roxo · 330 magenta.html[sw-cor] { --sw-h: 330; }
--sw-cIntensidade: de .025 (quase cinza) a .23 (bem viva). Padrão .17.html[sw-cor] { --sw-c: .12; }
--sw-tintTom da marca no fundo: 0 (cinza) a .06 (forte). Padrão .016.html[sw-cor] { --sw-tint: .035; }
Tema
sw-theme="light" | "dark" (no bloco com sw-cor)Força o tema só naquele bloco.<section sw-cor="pink" sw-theme="light">
O que ele gera (variáveis de sempre)
--sw-pri · --sw-pri-txt · --sw-pri-glow · --sw-pri-bd · --sw-grad-pri · --sw-sha-priCor da marca, texto, brilho, contorno, degradê e sombra colorida.
--sw-bg · --sw-bg- · --sw-sur · --sw-sur-hover · --sw-borFundo, fundo +1, card, card em foco, borda — com tom da marca.
--sw-txt · --sw-txt-mut · --sw-txt-invTextos.
--sw-link … --sw-hover_Cores de link e de mouse em cima.
--sw-neu-1 … --sw-neu-12Escala de cinzas tingida pela marca.

Receitas prontas — usos reais

Situações que aparecem em quase todo site. Copie a que servir.

Cor do cliente vinda do banco (PHP) Referência
<!-- o painel salvou um número de 0 a 360 em $cliente['cor'] -->
<html lang="pt-BR" sw-cor>
<head>
  <link rel="stylesheet" href="swcore/swcore.min.css">
  <style>html[sw-cor] { --sw-h: <?= (int) $cliente['cor'] ?>; }</style>
</head>
Uma seção com outra cor Ao vivo
Área kidsFesta infantil completa

Buffet, decoração e monitores. Tudo num lugar só.

<section sw-cor="laranja">
  <span class="t-pp t-upp ls-ww t-pri fw6">Área kids</span>
  <strong class="t-txt t-gg">Festa infantil completa</strong>
  <p>Buffet, decoração e monitores. Tudo num lugar só.</p>
  <button sw-btn="pri">Pedir orçamento</button>
</section>
Painel: escolher a cor e ver na hora Ao vivo
Prévia do site do cliente
<!-- cada botão fica dentro de um <span sw-cor> para aparecer na própria cor -->
<span sw-cor="vermelho" class="p-pp r-p"><button sw-btn="pri p" data-cor="vermelho">Vermelho</button></span>
<span sw-cor="dourado" class="p-pp r-p"><button sw-btn="pri p" data-cor="dourado">Dourado</button></span>
<span sw-cor="azul" class="p-pp r-p"><button sw-btn="pri p" data-cor="azul">Azul</button></span>
<!-- … -->

<div id="previa" sw-cor="esmeralda" class="p-m r-m bd">
  Prévia do site do cliente <button sw-btn="pri">Agendar</button>
</div>

<script>
  const previa = document.getElementById('previa');
  document.querySelectorAll('[data-cor]').forEach((b) => {
    b.addEventListener('click', () => previa.setAttribute('sw-cor', b.dataset.cor));
  });
  // com número livre: previa.style.setProperty('--sw-h', 330);
</script>
Cor por categoria (cada card com a sua) Ao vivo
Hortifruti

Entrega no mesmo dia.

Beleza

Salões perto de você.

Pets

Banho e tosa.

<div class="l l-3 gap-m">
  <div sw-cor="lima" class="p-m r-m bd"><strong class="t-pri">Hortifruti</strong><p>Entrega no mesmo dia.</p></div>
  <div sw-cor="magenta" class="p-m r-m bd"><strong class="t-pri">Beleza</strong><p>Salões perto de você.</p></div>
  <div sw-cor="ciano" class="p-m r-m bd"><strong class="t-pri">Pets</strong><p>Banho e tosa.</p></div>
</div>

API (JavaScript)

el.setAttribute("sw-cor", "azul")
Troca para uma cor pronta, ao vivo.
el.style.setProperty("--sw-h", 330)
Troca para qualquer cor pelo número, ao vivo (pré-visualização no painel).
SW.Day.set("light" | "dark") / SW.Day.toggle()
O tema continua igual: agora só troca a luz.

Precisa de quê

  • swcore.min.css 2.1.0 ou mais novo.
  • swcore.min.js — só para o botão de trocar tema (SW.Day) e para os exemplos com JavaScript.

Cuidados — erros comuns

  • Sem sw-cor o --sw-h não faz nada: o número só vale com o motor ligado (<html sw-cor>).
  • Escreva o nome sem acento: ambar, petroleo, medio, sobrio. Com acento o SW Core não reconhece.
  • Para dar a cor pelo seu CSS, use html[sw-cor] { --sw-h: … } (ou .sua-classe[sw-cor] num bloco). Só :root { --sw-h: … } perde para o padrão do motor.
  • Um bloco com sw-cor ganha fundo próprio (o fundo da marca). Se não quiser o fundo, aplique o motor no <html> em vez do bloco.
  • Colocar sw-cor direto num botão dá ao botão também o fundo e a cor de letra de "bloco". Para mostrar um botão numa cor, envolva-o: <span sw-cor="azul"><button sw-btn="pri">…</button></span>.
  • Não misture com --sw-pri trocado na mão: com o motor ligado, quem manda na cor principal é o --sw-h.

O que ele não faz

  • A cor secundária (--sw-sec) e as de aviso (sucesso, erro, alerta, info) não seguem a cor — de propósito.
  • Num bloco interno, mudam cor, fundo, card, borda, texto e link; os grupos tonais antigos (sw-bg--, sw-bl*, Tsw-color*, sw-border*) continuam seguindo a cor do <html>.