Vérifier la portée des propriétés personnalisées CSS
Une propriété CSS personnalisée est disponible sur l’élément où elle est déclarée puis, sauf interruption de l’héritage, sur ses descendants.
Lancer gratuitement
Cet outil compare le sélecteur qui définit une variable à celui qui l’utilise. Il valide les deux chaînes, gère les listes de sélecteurs et indique si chaque branche d’utilisation est structurellement couverte par une branche de définition. Vous pouvez ainsi repérer une cause fréquente de jetons de design manquants avant d’examiner les styles calculés dans le navigateur.
Indiquez les points de définition et d’utilisation
Saisissez dans le champ de définition le sélecteur de la règle qui déclare la propriété personnalisée, puis dans le champ d’utilisation celui de la règle qui appelle <code>var()</code>. Par exemple, un jeton défini sur <code>.theme-dark .card</code> est disponible pour <code>.theme-dark .card > .title</code>, car le titre est sélectionné sous la carte qui reçoit la déclaration. Une définition sur <code>:root</code> est considérée comme globale puisque l’élément racine est un ancêtre du contenu du document. Les deux champs acceptent des listes séparées par des virgules. L’outil évalue chaque branche d’utilisation séparément et exige qu’elles soient toutes couvertes pour produire une réponse globale vraie. Il précise également la branche de définition associée à chaque utilisation couverte, ce qui facilite l’audit d’une longue liste. Cette vérification porte sur la relation entre les sélecteurs : vous n’avez pas à coller une feuille de style, un bloc de déclarations, le nom de la propriété ni sa valeur. Avec uniquement les deux sélecteurs concernés, le résultat reste centré sur la portée de la cascade, indépendamment de l’ordre des sources et de la syntaxe des valeurs.
Interprétez la décision de portée structurelle
L’outil modélise la partie de la disponibilité d’une propriété personnalisée qui peut être déduite des seuls sélecteurs. Il détermine si le sélecteur de définition peut désigner le même élément que le sélecteur d’utilisation, ou l’un de ses ancêtres. Les exigences composées sont respectées : une définition sur <code>.card.featured</code> n’est pas supposée couvrir une utilisation qui ne mentionne que <code>.card</code>. Les combinateurs d’enfant doivent rester des combinateurs d’enfant, tandis qu’une relation de descendance peut traverser des composés supplémentaires dans le sélecteur d’utilisation. Les listes constituent des alternatives côté définition et des obligations côté utilisation. Cette méthode volontairement prudente évite d’affirmer qu’une variable est disponible lorsque la relation n’apparaît pas dans le texte. Les conditions d’exécution peuvent toujours modifier la cascade réelle. L’ordre des sources, les règles conditionnelles, les limites du Shadow DOM, les styles en ligne, les couches, la spécificité, les réinitialisations explicites et l’arbre réel du document ne font pas partie de cette entrée. Considérez un résultat vrai comme une confirmation de l’inclusion structurelle et consultez les styles calculés du navigateur pour établir la valeur finale dans un document rendu précis.
Corrigez les entrées ambiguës grâce aux erreurs de validation
Chaque sélecteur est analysé avant la comparaison. Une branche vide dans une liste, des crochets ou parenthèses non appariés, un combinateur inachevé, une ponctuation de déclaration, un jeton de classe, d’ID ou de pseudo-sélecteur incomplet, ainsi que toute autre forme incorrecte provoquent une erreur d’entrée plutôt qu’une réponse approximative. La distinction est utile en automatisation : faux signifie que les sélecteurs fournis sont valides mais que l’utilisation demandée n’est pas couverte structurellement ; une erreur signifie qu’aucune conclusion n’a été établie. Ne placez que des sélecteurs dans les champs. N’ajoutez ni accolades, ni points-virgules, ni déclaration de propriété personnalisée, ni règle CSS complète. Les caractères échappés, valeurs d’attribut entre guillemets, sélecteurs d’attribut et pseudo-classes fonctionnelles restent groupés pendant la segmentation, afin que leurs virgules et combinateurs ne soient pas pris pour une syntaxe de premier niveau. L’algorithme est déterministe, n’effectue aucune requête réseau et impose une longueur maximale fixe. Vous pouvez donc l’intégrer à une étape de lint, à une revue de modifications ou à un script de migration de jetons avec un résultat reproductible. Si un sélecteur relationnel avancé dépend d’un DOM actif, interprétez prudemment une absence de couverture et vérifiez-la dans le balisage cible.
Cas d’usage
Auditer les jetons de thème
Vérifiez que les sélecteurs de composants utilisant des variables de thème restent sous le sélecteur qui active ce thème.
Examiner les refactorisations
Détectez lorsqu’un sélecteur de composant renommé ou déplacé ne conserve plus le préfixe structurel propriétaire de ses propriétés personnalisées.
Valider la documentation des jetons
Contrôlez les exemples de sélecteurs d’un système de design afin que les usages documentés respectent la portée de définition annoncée.
Questions fréquentes
Que signifie un résultat vrai ?
Chaque branche valide du sélecteur d’utilisation est structurellement identique ou subordonnée à au moins une branche du sélecteur de définition.
L’outil examine-t-il mon HTML ou les styles calculés ?
Non. Il compare seulement les sélecteurs ; l’état du document, l’ordre des sources, les couches, le Shadow DOM et les substitutions explicites sont exclus.
Comment les listes de sélecteurs sont-elles traitées ?
Les branches de définition sont des alternatives. Chaque branche d’utilisation séparée par une virgule doit correspondre à au moins une branche de définition.
Pourquoi ai-je reçu une erreur d’entrée plutôt que faux ?
Au moins un sélecteur était syntaxiquement incorrect. Faux est réservé aux sélecteurs valides qui ne présentent pas la relation de portée requise.
Une définition sur :root couvre-t-elle tous les usages ?
Oui. L’outil considère :root, html et le sélecteur universel comme des portées de définition globales.
Quel est le prix d’une requête API ?
Chaque requête API coûte $0.002. La version pour navigateur s’exécute localement sans requête API.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre 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)Exemple de requête
{
"definition_selector": ".theme-dark .card",
"usage_selector": ".theme-dark .card > .title"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.css_custom_property_scope_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
timeout_sec | 30 |
max_crawl_pages | 25 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |