StyleProvider
Provedor que define o estilo, o modo de cor e a cor da marca de tudo o que está dentro dele. Coloque um na raiz do app e aninhe outros para criar ilhas com outra cara, como um card escuro ou a marca de um cliente.
Instalação
Configure o Camaleo uma vez (Instalação) e importe a folha de estilo de cada estilo que você renderiza, inclusive nas ilhas. Um estilo sem o CSS dele cai nos valores padrão.
import { StyleProvider, useStyleScope, PortalScope, Portal, STYLE_NAMES } from "@camaleo/react";Para a página inteira, um Server Component pode espalhar styleScopeProps({ styleName, mode, brand }) no <html>: os mesmos atributos, sem código no cliente. Veja em Instalação o CSS e as fontes.
Anatomia
O StyleProvider renderiza uma <div> com data-style, data-mode e os tokens da marca como variáveis inline. Cada elemento [data-style] redeclara todos os tokens e pinta o próprio fundo, a cor do texto e a fonte, então uma ilha aninhada começa do zero em vez de herdar o estilo do pai. Já o modo e a marca descem pela árvore até uma ilha definir os seus.
Os popups (Menu, Select, Popover, Dialog, Drawer…) são renderizados no <body>, fora de qualquer provider. Eles envolvem o conteúdo num elemento portal-scope que copia o escopo do provider de onde foram abertos.
Exemplos
Cada prévia já fica dentro de um StyleProvider: o que a barra acima controla. Estes exemplos aninham um segundo, para você ver a ilha ao lado da página em volta.
A Carta de Domingo
Cinco histórias sobre a cidade, escolhidas pelos nossos editores e entregues às 7h.
Estilo do espaço: minimal.
Todos os estilos lado a lado
Clique num quadro. Um seletor de tema mostra cada opção na própria ilha, e as pessoas veem o estilo antes de escolher. O modo e a marca continuam vindo da página.
Fatura nº 1042
Vence em 15/11/2026
Trocar de estilo em tempo de execução
Escolha um estilo e ligue o switch. Props novas só trocam atributos: nada é remontado e o estado lá dentro continua.
Padaria Sol
Fermentação natural e doces, Rua das Flores, 12
Clínica Vida
Médicos de família, Av. Paulista, 480
Uma marca por cliente
Defina só brand para dar a cada cliente a cor dele. Passe o estilo da página com useStyleScope(), porque styleName não é herdado.
Popups mantêm o estilo da ilha
Abra o menu. Ele é renderizado no <body> e mesmo assim mantém o estilo, o modo e a marca da ilha, porque todo popup reaplica o escopo de onde foi aberto.
Seu próprio portal
Clique em Pagar. O Portal move o conteúdo para outro nó e mantém o estilo da ilha; use-o, ou envolva o seu createPortal em PortalScope.
- Estilo
minimal- Modo
light- Marca
#3fa34d
Ler o escopo atual
useStyleScope() devolve as props do provider mais próximo. Use para repassar o estilo, ou para colorir um gráfico ou canvas que não lê CSS.
Cores de marca difíceis continuam legíveis
Amarelo, lima clara, quase preto: a escala da marca escolhe texto preto ou branco para cada tom, então os rótulos mantêm pelo menos 4,5:1 em qualquer estilo e modo.
Em contexto
São pedaços inteiros de interface para copiar, com uma ilha dentro do estilo que você escolheu.
Aparência
Vale para a sua conta em todos os dispositivos.
Seu 2026 em números
Obrigado por um ótimo ano. Veja o que a sua loja fez desde janeiro.
Clínica Vida
Escolha um horário para quinta-feira, 12/11.
Boas práticas
Bom dia, Ana. Você tem 3 pedidos para enviar hoje.
Novidades de outubro
Reembolso em lote, busca mais rápida e modo escuro nas faturas.
Um painel de novidades, uma campanha ou um widget incorporado podem ter identidade própria. O resto da página fica com um estilo só.
Três campos em três estilos parecem quebrados, e as pessoas deixam de confiar no formulário.
Mude para o plano Equipe e convide até 20 pessoas.
styleName={useStyleScope()?.["data-style"]} com mode="dark" dá um card escuro no estilo da própria página.
Mude para o plano Equipe e convide até 20 pessoas.
Sem styleName, a ilha volta para minimal. Troque o estilo na barra acima: este card nunca muda.
Props
minimal. Importe também a folha de estilo dele (@camaleo/styles/<nome>.css).light, dark ou system. Omita para herdar o modo do escopo pai (a raiz segue o sistema).Todas as props de <div> passam adiante; style é mesclado com as variáveis da marca. useStyleScope() devolve { "data-style", "data-mode"?, style? }, ou null fora de um provider. PortalScope recebe só children. Portal recebe children e container (padrão document.body). styleScopeProps(opções) devolve os mesmos atributos para um Server Component.
Styling hooks
O provider é a fonte dos tokens que todo componente lê. Use os atributos dele para mudar um estilo, ou defina um token numa ilha para mudar só aquela seção.
Atributos
Tokens que ele lê
/* controles mais arredondados, só no estilo glass */
[data-style="glass"] {
--cml-radius-control: 14px;
}
/* uma superfície mais suave numa ilha */
.central-de-ajuda[data-style] {
--cml-surface: light-dark(var(--cml-brand-50), var(--cml-brand-950));
}Acessibilidade
- Sem mode, a raiz segue prefers-color-scheme só com CSS (color-scheme e light-dark()), então não há piscada nem script antes da hidratação.
- Texto, anel de foco e bordas de controle passam no WCAG 2.2 AA nos 13 estilos, claro e escuro, com qualquer cor de marca. A biblioteca testa isso na CI.
- Cores forçadas (alto contraste do Windows) substituem o estilo: os componentes mantêm uma borda transparente e um outline no foco, então continuam visíveis.
- Movimento reduzido acalma as transições de todos os estilos, e transparência reduzida deixa o glass opaco. Os dois vêm do sistema, também em cada ilha.