Comprobar el alcance de propiedades personalizadas CSS
Una propiedad CSS personalizada está disponible en el elemento donde se declara y, salvo que se interrumpa la herencia, en sus descendientes.
Ejecutar — gratis
Este comprobador compara el selector que define una variable con el selector que la utiliza. Valida ambas cadenas, admite listas de selectores e indica si cada rama de uso está cubierta estructuralmente por alguna rama de definición. El resultado permite detectar tokens de diseño ausentes antes de depurar estilos calculados en el navegador.
Indique los puntos de definición y uso
Introduzca en el campo de definición el selector de la regla que declara la propiedad personalizada y, en el campo de uso, el selector de la regla que llama a <code>var()</code>. Por ejemplo, un token definido en <code>.theme-dark .card</code> está disponible para un uso en <code>.theme-dark .card > .title</code>, porque el título se selecciona bajo la tarjeta que recibe la declaración. Una definición en <code>:root</code> se considera global, ya que el elemento raíz es antecesor del contenido del documento. Ambos campos admiten listas de selectores separadas por comas. El comprobador evalúa por separado cada rama de uso y exige que todas estén cubiertas para que la respuesta general sea verdadera. Además, indica qué rama de definición coincide con cada uso cubierto, lo que simplifica la revisión de listas largas. Esta prueba estudia la relación entre selectores; no hace falta pegar una hoja de estilos, un bloque de declaraciones, el nombre de la propiedad ni su valor. Al proporcionar solo los dos selectores pertinentes, el resultado se centra en el alcance de la cascada y no en el orden de origen o la sintaxis del valor.
Interprete la decisión de alcance estructural
El comprobador modela la parte de la disponibilidad de una propiedad personalizada que puede deducirse únicamente de los selectores. Determina si el selector de definición puede identificar el mismo elemento que el selector de uso o uno de sus antecesores. Se respetan los requisitos compuestos: no se presupone que una definición en <code>.card.featured</code> cubra un uso que solo menciona <code>.card</code>. Los combinadores de hijo deben conservar esa relación, mientras que una relación de descendiente puede abarcar compuestos adicionales en el selector de uso. Las listas actúan como alternativas en la definición y como obligaciones en el uso. Este criterio deliberadamente prudente evita afirmar que una variable está disponible cuando la relación no aparece en el texto de los selectores. Los datos de ejecución todavía pueden alterar la cascada real. El orden de origen, las reglas condicionales, los límites de Shadow DOM, los estilos en línea, las capas, la especificidad, los restablecimientos explícitos y el árbol real del documento quedan fuera de esta entrada de dos selectores. Considere un resultado verdadero como confirmación de contención estructural y consulte los estilos calculados del navegador para demostrar el valor final en un documento renderizado concreto.
Corrija entradas ambiguas mediante los errores de validación
Cada selector se analiza antes de compararlo. Las ramas vacías de una lista, los corchetes o paréntesis sin pareja, los combinadores incompletos, la puntuación propia de declaraciones, los tokens de clase, ID o pseudoselector incompletos y otras formas incorrectas producen un error de entrada en vez de un resultado supuesto. Esta diferencia es importante en la automatización: falso significa que los selectores proporcionados son válidos pero el uso solicitado no está cubierto estructuralmente; un error significa que no se ha llegado a ninguna conclusión. Mantenga en los campos únicamente selectores. No incluya llaves, puntos y coma, una declaración de propiedad personalizada ni una regla CSS completa. Los caracteres escapados, los valores de atributo entre comillas, los selectores de atributo y las pseudoclases funcionales se mantienen agrupados durante la tokenización para que sus comas y combinadores no se confundan con sintaxis de nivel superior. El algoritmo es determinista, no solicita recursos de red y aplica un límite fijo de longitud. Puede incorporarlo a una fase de lint, una revisión de cambios o una migración de tokens y obtener siempre el mismo resultado para el mismo par. Si un selector relacional avanzado depende de un DOM activo, interprete con cautela un resultado no cubierto y contrástelo con el marcado de destino.
Qué puede hacer con ella
Auditar tokens de tema
Confirme que los selectores de componentes que usan variables de tema permanecen bajo el selector que activa dicho tema.
Revisar refactorizaciones de componentes
Detecte cuándo un selector de componente renombrado o trasladado deja de conservar el prefijo estructural propietario de sus propiedades personalizadas.
Validar documentación de tokens
Compruebe ejemplos de selectores en un sistema de diseño para que los usos documentados concuerden con el alcance de definición indicado.
Preguntas frecuentes
¿Qué significa un resultado verdadero?
Cada rama válida del selector de uso es estructuralmente igual o inferior a una rama del selector de definición.
¿Se inspeccionan mi HTML o los estilos calculados?
No. Solo se comparan selectores; el estado del documento, el orden de origen, las capas, Shadow DOM y las sustituciones explícitas quedan fuera del resultado.
¿Cómo se procesan las listas de selectores?
Las ramas de definición son alternativas. Cada rama de uso separada por comas debe coincidir con al menos una rama de definición para que el resultado general sea verdadero.
¿Por qué recibí un error de entrada en lugar de falso?
Al menos un selector tenía una sintaxis incorrecta. Falso se reserva para selectores válidos que no muestran la relación de alcance requerida.
¿Una definición en :root cubre todos los usos?
Sí. El comprobador considera :root, html y el selector universal como alcances de definición globales.
¿Cuánto cuesta la solicitud API?
Cada solicitud API cuesta $0.002. La versión del navegador se ejecuta localmente sin realizar una solicitud API.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
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)Ejemplo de solicitud
{
"definition_selector": ".theme-dark .card",
"usage_selector": ".theme-dark .card > .title"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.css_custom_property_scope_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
timeout_sec | 30 |
max_crawl_pages | 25 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |