Verificar o escopo de propriedades personalizadas CSS
Uma propriedade CSS personalizada fica disponível no elemento em que foi declarada e, se a herança não for interrompida, nos descendentes desse elemento.
Executar grátis
Este verificador compara o seletor que define uma variável com aquele que a utiliza. Ele valida os dois textos, aceita listas de seletores e informa se cada ramo de uso está estruturalmente coberto por algum ramo de definição. Assim, você pode encontrar uma causa comum de tokens de design ausentes antes de depurar estilos computados no navegador.
Informe os pontos de definição e de uso
Digite no campo de definição o seletor da regra que declara a propriedade personalizada e, no campo de uso, o seletor da regra que chama <code>var()</code>. Por exemplo, um token definido em <code>.theme-dark .card</code> está disponível para um uso em <code>.theme-dark .card > .title</code>, pois o título é selecionado abaixo do cartão que recebe a declaração. Uma definição em <code>:root</code> é considerada global porque o elemento raiz é ancestral do conteúdo do documento. Os dois campos podem conter listas de seletores separadas por vírgulas. O verificador avalia cada ramo de uso separadamente e exige que todos estejam cobertos para que a resposta geral seja verdadeira. Ele também informa qual ramo de definição correspondeu a cada uso coberto, facilitando a auditoria de listas extensas. Este é um teste de relação entre seletores; você não precisa colar uma folha de estilos, um bloco de declarações, o nome da propriedade ou seu valor. Ao fornecer somente os dois seletores relevantes, o resultado permanece concentrado no escopo da cascata, sem misturar ordem de origem ou sintaxe do valor.
Entenda a decisão de escopo estrutural
O verificador representa a parte da disponibilidade de uma propriedade personalizada que pode ser determinada apenas pelos seletores. Ele pergunta se o seletor de definição pode identificar o mesmo elemento identificado pelo seletor de uso ou um ancestral dele. Requisitos compostos são respeitados: uma definição em <code>.card.featured</code> não é considerada suficiente para um uso que menciona somente <code>.card</code>. Combinadores de filho precisam continuar como combinadores de filho, enquanto uma relação de descendência pode atravessar compostos adicionais no seletor de uso. Listas de seletores funcionam como alternativas no lado da definição e como obrigações no lado do uso. Essa abordagem intencionalmente conservadora evita afirmar que uma variável está disponível quando a relação não aparece no texto dos seletores. Fatos de execução ainda podem mudar a cascata real. Ordem de origem, regras condicionais, limites de Shadow DOM, estilos inline, camadas, especificidade, redefinições explícitas e a árvore real do documento ficam fora da entrada de dois seletores. Considere um resultado verdadeiro como confirmação de contenção estrutural e consulte os estilos computados do navegador quando precisar comprovar o valor final em um documento renderizado específico.
Use erros de validação para corrigir entradas ambíguas
Cada seletor é analisado antes da comparação. Ramos vazios em listas, colchetes ou parênteses sem fechamento, combinadores incompletos, pontuação de declarações, tokens incompletos de classe, ID ou pseudoseletor e outras formas inválidas geram um erro de entrada, em vez de um palpite. Essa diferença é relevante na automação: falso indica que os seletores fornecidos são válidos, mas o uso solicitado não está estruturalmente coberto; um erro indica que nenhuma conclusão sobre o escopo foi produzida. Mantenha apenas seletores nos campos. Não inclua chaves, ponto e vírgula, uma declaração de propriedade personalizada nem uma regra CSS inteira. Caracteres escapados, valores de atributo entre aspas, seletores de atributo e pseudoclasses funcionais permanecem agrupados durante a tokenização, para que vírgulas e combinadores internos não sejam confundidos com sintaxe de nível superior. O algoritmo é determinístico, não faz solicitações de rede e aplica um limite fixo ao tamanho da entrada. Portanto, você pode usá-lo em uma etapa de lint, em uma revisão de alterações ou em um script de migração de tokens e obter o mesmo resultado para o mesmo par. Se seletores relacionais avançados expressarem fatos que só um DOM ativo resolve, interprete com cautela um resultado sem cobertura e confira-o no markup de destino.
Casos de uso
Auditar tokens de tema
Confirme que seletores de componentes que usam variáveis de tema continuam abaixo do seletor que ativa o tema.
Revisar refatorações de componentes
Detecte quando um seletor de componente renomeado ou movido deixa de manter o prefixo estrutural proprietário das propriedades personalizadas.
Validar a documentação de tokens
Verifique exemplos de seletores em um design system para manter os usos documentados coerentes com o escopo de definição informado.
Perguntas frequentes
O que significa um resultado verdadeiro?
Cada ramo válido do seletor de uso é estruturalmente igual ou inferior a pelo menos um ramo do seletor de definição.
A ferramenta inspeciona meu HTML ou os estilos computados?
Não. Ela compara somente seletores; estado do documento, ordem de origem, camadas, Shadow DOM e substituições explícitas ficam fora do resultado.
Como as listas de seletores são tratadas?
Os ramos de definição são alternativas. Cada ramo de uso separado por vírgulas deve corresponder a pelo menos um ramo de definição para que o resultado geral seja verdadeiro.
Por que recebi um erro de entrada em vez de falso?
Pelo menos um seletor tinha sintaxe inválida. Falso é reservado para seletores válidos que não demonstram a relação de escopo necessária.
Uma definição em :root cobre todos os usos?
Sim. O verificador considera :root, html e o seletor universal como escopos de definição globais.
Quanto custa a solicitação de API?
Cada solicitação de API custa US$ 0,002. A versão para navegador é executada localmente, sem uma solicitação de API.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/web/css-custom-property-scope-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"definition_selector":".theme-dark .card","usage_selector":".theme-dark .card > .title"}'const res = await fetch("https://api.kit.forhosting.com/web/css-custom-property-scope-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"definition_selector": ".theme-dark .card",
"usage_selector": ".theme-dark .card > .title"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/css-custom-property-scope-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"definition_selector": ".theme-dark .card",
"usage_selector": ".theme-dark .card > .title"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/css-custom-property-scope-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"definition_selector":".theme-dark .card","usage_selector":".theme-dark .card > .title"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"definition_selector":".theme-dark .card","usage_selector":".theme-dark .card > .title"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/css-custom-property-scope-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"definition_selector": ".theme-dark .card",
"usage_selector": ".theme-dark .card > .title"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.css_custom_property_scope_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
timeout_sec | 30 |
max_crawl_pages | 25 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |