Matrice de contraste des couleurs
Une palette peut sembler cohérente tout en contenant des combinaisons qui rendent le texte difficile, voire impossible à lire.
Lancer gratuitement
Cette matrice calcule la luminance relative WCAG 2 de chaque couleur hexadécimale fournie, compare toutes les couleurs entre elles et renvoie les résultats dans une matrice carrée stable. Les designers, développeurs et spécialistes de l’accessibilité peuvent examiner en une fois toute la palette d’un système de conception, au lieu de tester chaque paire séparément. Les entrées sont validées, les couleurs normalisées et le résultat déterministe convient aux audits automatisés comme aux rapports versionnés.
Lisez la matrice sans perdre le repère des couleurs
Envoyez une liste de deux à cent couleurs hexadécimales. Les formes à trois ou six chiffres sont acceptées, avec ou sans dièse initial, et chaque valeur valide est normalisée en code à six chiffres minuscules. La réponse conserve l’ordre des couleurs et attribue un indice à chacune. Les lignes et colonnes suivent exactement cet ordre : la valeur de la deuxième ligne et de la cinquième colonne décrit donc le contraste entre les couleurs d’indices deux et cinq. La diagonale vaut toujours 1, puisqu’une couleur ne contraste pas avec elle-même, et la matrice est symétrique, car inverser le premier plan et l’arrière-plan ne change pas le rapport WCAG. Chaque rapport affiché est arrondi à deux décimales et chaque luminance à six. Les doublons restent des positions distinctes, ce qui facilite l’audit de jetons partageant une valeur mais remplissant des rôles sémantiques différents. Cette organisation permet d’afficher facilement un tableau, de conserver une preuve d’audit ou de comparer des versions.
Comprenez le calcul et les seuils WCAG
Le calcul suit la méthode de luminance relative WCAG 2 pour les couleurs sRGB. Chaque canal rouge, vert et bleu est converti de sa valeur sRGB encodée en lumière linéaire, puis combiné avec les coefficients standard. Pour chaque paire, la luminance la plus claire augmentée de 0.05 est divisée par la plus sombre augmentée de 0.05, ce qui donne un rapport de 1 à 21. La réponse rappelle les seuils WCAG : 4.5 pour le texte normal AA, 7 pour le texte normal AAA, 3 pour le grand texte AA et 4.5 pour le grand texte AAA. Comparez chaque cellule au seuil adapté au contenu et à la typographie réels. Un rapport ne suffit pas à déclarer toute une interface accessible : la taille et la graisse de police, les états interactifs, les éléments non textuels et le contexte comptent aussi. L’outil fournit donc des preuves numériques plutôt qu’un verdict global, afin que votre audit applique la bonne règle à chaque association prévue sans confondre une valeur arrondie avec une garantie générale.
Exploitez un résultat déterministe dans vos audits
Une matrice complète est particulièrement utile lorsque le contrôle de palette doit être reproductible. Conservez un ordre documenté, par exemple les tons neutres puis les jetons de marque, d’état et d’accent, et archivez la matrice avec la version du système de conception. Un contrôle d’intégration continue peut comparer certaines cellules aux seuils requis, tandis qu’une personne chargée de la revue parcourt le tableau complet pour repérer des associations faibles inattendues. Comme l’algorithme n’utilise ni réseau, ni hasard, ni heure courante, ni style du navigateur, ni estimation de profil colorimétrique, une entrée JSON identique produit une sortie JSON identique. Les listes invalides, les palettes hors limites et les codes hexadécimaux incorrects sont refusés avec un indice explicite. La limite de cent couleurs borne la matrice quadratique à dix mille cellules. Gérez transparence et composition avant l’appel : les couleurs alpha sont refusées, car leur rendu dépend du fond. Convertissez aussi noms, HSL, valeurs à gamut étendu et objets d’outils de conception en hex sRGB opaque pour obtenir une base explicite et reproductible.
Cas d’usage
Auditer les jetons de conception
Générez une matrice indexée pour les jetons de marque, surface, texte, bordure et état avant de publier une version du système de conception.
Contrôler une migration de thème
Comparez les matrices des anciennes et nouvelles palettes pour détecter les associations dont le contraste a diminué pendant la refonte.
Automatiser la revue d’accessibilité
Transmettez des rapports stables aux règles d’intégration continue qui imposent le seuil WCAG adapté aux paires de jetons approuvées.
Questions fréquentes
Quel est le prix d’une requête ?
Le tarif de base de l’API est de $0.002 par requête.
Quels formats de couleur sont acceptés ?
Les couleurs hexadécimales sRGB opaques à trois ou six chiffres sont acceptées, avec ou sans dièse initial. Alpha, noms, HSL et gamut étendu sont refusés.
Comment les lignes et colonnes correspondent-elles aux couleurs ?
Les deux axes suivent l’ordre d’entrée. Chaque couleur renvoyée porte son indice et matrix[row][column] contient le rapport des deux couleurs indexées.
Pourquoi chaque valeur diagonale vaut-elle 1 ?
Une couleur comparée à elle-même possède une luminance identique ; la formule de contraste WCAG produit donc toujours un rapport de 1.
Un rapport prouve-t-il qu’une conception est accessible ?
Non. Il fournit la preuve de contraste employée par les contrôles WCAG, mais l’accessibilité dépend aussi de la typographie, des états, du contenu et du bon usage de chaque paire.
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/color/palette-contrast-matrix \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"colors":["#ffffff","#111827","#2563eb","#facc15"]}'const res = await fetch("https://api.kit.forhosting.com/color/palette-contrast-matrix", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"colors": [
"#ffffff",
"#111827",
"#2563eb",
"#facc15"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/color/palette-contrast-matrix",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"colors": [
"#ffffff",
"#111827",
"#2563eb",
"#facc15"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/color/palette-contrast-matrix", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"colors":["#ffffff","#111827","#2563eb","#facc15"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"colors":["#ffffff","#111827","#2563eb","#facc15"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/color/palette-contrast-matrix", 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
{
"colors": [
"#ffffff",
"#111827",
"#2563eb",
"#facc15"
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "color.palette_contrast_matrix",
"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
max_items | 100 |
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. |