Verifica dell'ambito delle proprietà personalizzate CSS
Una proprietà CSS personalizzata è disponibile sull’elemento in cui viene dichiarata e, salvo interruzioni dell’ereditarietà, sui suoi discendenti.
Esegui gratis nel browser
Questo strumento confronta il selettore che definisce una variabile con quello che la utilizza. Convalida entrambe le stringhe, gestisce gli elenchi di selettori e indica se ogni ramo di utilizzo è strutturalmente coperto da almeno un ramo di definizione. Il risultato consente di individuare una causa frequente di token di design mancanti prima di esaminare gli stili calcolati nel browser.
Indichi i punti di definizione e utilizzo
Inserisca nel campo di definizione il selettore della regola che dichiara la proprietà personalizzata, quindi nel campo di utilizzo quello della regola che richiama <code>var()</code>. Per esempio, un token definito su <code>.theme-dark .card</code> è disponibile per un utilizzo su <code>.theme-dark .card > .title</code>, perché il titolo viene selezionato sotto la scheda che riceve la dichiarazione. Una definizione su <code>:root</code> è considerata globale, poiché l’elemento radice è un antenato del contenuto del documento. Entrambi i campi accettano elenchi di selettori separati da virgole. Lo strumento valuta ogni ramo di utilizzo separatamente e richiede che tutti siano coperti affinché la risposta complessiva sia vera. Indica inoltre quale ramo di definizione corrisponde a ciascun utilizzo coperto, semplificando la verifica di elenchi lunghi. Questa analisi riguarda la relazione tra selettori: non occorre incollare un foglio di stile, un blocco di dichiarazioni, il nome della proprietà o il relativo valore. Fornendo solo i due selettori pertinenti, il risultato resta concentrato sull’ambito della cascata anziché sull’ordine del codice sorgente o sulla sintassi del valore.
Interpreti la decisione sull’ambito strutturale
Lo strumento modella la parte della disponibilità di una proprietà personalizzata che può essere determinata dai soli selettori. Verifica se il selettore di definizione può identificare lo stesso elemento individuato dal selettore di utilizzo oppure un suo antenato. I requisiti composti vengono rispettati: non si presume che una definizione su <code>.card.featured</code> copra un utilizzo che menziona soltanto <code>.card</code>. I combinatori di figlio devono rimanere tali, mentre una relazione di discendenza può attraversare composti aggiuntivi nel selettore di utilizzo. Gli elenchi funzionano come alternative sul lato della definizione e come obblighi sul lato dell’utilizzo. Questo criterio volutamente prudente evita di dichiarare disponibile una variabile quando la relazione non è visibile nel testo. Le condizioni di esecuzione possono comunque modificare la cascata reale. L’ordine del codice, le regole condizionali, i confini dello Shadow DOM, gli stili inline, i livelli, la specificità, i ripristini espliciti e l’albero effettivo del documento non rientrano nell’input. Consideri un risultato vero come conferma del contenimento strutturale e consulti gli stili calcolati del browser quando deve dimostrare il valore finale in uno specifico documento renderizzato.
Corregga gli input ambigui tramite gli errori di convalida
Ogni selettore viene analizzato prima del confronto. Rami vuoti negli elenchi, parentesi quadre o tonde non bilanciate, combinatori incompleti, punteggiatura propria delle dichiarazioni, token incompleti di classe, ID o pseudoselettore e altre forme errate producono un errore di input anziché un risultato ipotetico. La distinzione è importante nell’automazione: falso significa che i selettori forniti sono validi, ma l’utilizzo richiesto non è strutturalmente coperto; un errore indica che non è stata tratta alcuna conclusione sull’ambito. Nei campi inserisca soltanto selettori. Non includa parentesi graffe, punti e virgola, dichiarazioni di proprietà personalizzate o intere regole CSS. Caratteri con escape, valori di attributo tra virgolette, selettori di attributo e pseudoclassi funzionali restano raggruppati durante la tokenizzazione, affinché virgole e combinatori interni non siano scambiati per sintassi di primo livello. L’algoritmo è deterministico, non effettua richieste di rete e applica un limite fisso alla lunghezza dell’input. Può quindi usarlo in una fase di lint, in una revisione delle modifiche o in uno script di migrazione dei token, ottenendo sempre lo stesso risultato per la stessa coppia. Se selettori relazionali avanzati dipendono da un DOM attivo, interpreti prudentemente un risultato non coperto e lo verifichi sul markup di destinazione.
Casi d'uso
Controllare i token del tema
Confermi che i selettori dei componenti che usano variabili del tema restino sotto il selettore che attiva il tema.
Esaminare il refactoring dei componenti
Rilevi quando un selettore rinominato o spostato non conserva più il prefisso strutturale proprietario delle proprietà personalizzate.
Convalidare la documentazione dei token
Controlli gli esempi di selettori in un design system affinché gli utilizzi documentati rispettino l’ambito dichiarato.
Domande frequenti
Che cosa indica un risultato vero?
Ogni ramo valido del selettore di utilizzo è strutturalmente uguale o subordinato ad almeno un ramo del selettore di definizione.
Vengono esaminati il mio HTML o gli stili calcolati?
No. Vengono confrontati solo i selettori; stato del documento, ordine del codice, livelli, Shadow DOM e sostituzioni esplicite sono esclusi.
Come vengono gestiti gli elenchi di selettori?
I rami di definizione sono alternative. Ogni ramo di utilizzo separato da virgole deve corrispondere ad almeno un ramo di definizione.
Perché ho ricevuto un errore di input anziché falso?
Almeno un selettore aveva una sintassi errata. Falso è riservato ai selettori validi che non mostrano la relazione di ambito richiesta.
Una definizione su :root copre tutti gli utilizzi?
Sì. Lo strumento considera :root, html e il selettore universale come ambiti di definizione globali.
Quanto costa una richiesta API?
Ogni richiesta API costa $0.002. La versione per browser viene eseguita localmente senza una richiesta API.
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo 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)Esempio di richiesta
{
"definition_selector": ".theme-dark .card",
"usage_selector": ".theme-dark .card > .title"
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.css_custom_property_scope_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Limiti
timeout_sec | 30 |
max_crawl_pages | 25 |
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |