Créer une déclaration CSS @font-face depuis des polices
Créez une déclaration CSS @font-face complète sans vérifier sans cesse la ponctuation, les guillemets ou l’ordre des descripteurs.
Lancer gratuitement
Indiquez la famille, un ou plusieurs fichiers de police avec leur format, ainsi que la graisse et le style. Le résultat est déterministe, prêt à copier et respecte votre ordre afin que les formats modernes précèdent les fichiers de repli.
Décrivez les fichiers dans l’ordre où le navigateur doit les essayer
Commencez par le nom public de la famille que vous utiliserez dans la propriété font-family de votre application. Ajoutez ensuite chaque source sous forme d’un enregistrement distinct comprenant un chemin et une indication de format. L’ordre compte : le navigateur parcourt la liste src de gauche à droite et retient la première ressource compatible. Il est courant de placer un fichier WOFF2 compact avant un fichier WOFF de repli. Le générateur conserve strictement cet ordre ; il ne trie pas, ne déduit rien, ne télécharge et n’inspecte aucun fichier. Les chemins peuvent être relatifs, comme /fonts/newsreader.woff2, ou être des URL complètes. La valeur format devient une indication CSS explicite et doit donc correspondre au fichier réel. Les guillemets et barres obliques inverses sont échappés dans les chaînes CSS. Les valeurs vides et les caractères susceptibles de rompre un descripteur sont refusés, plutôt que de produire une règle qui semble correcte mais échoue dans la feuille de style. Une source au minimum est indispensable, car une règle @font-face sans src exploitable ne peut charger aucune police.
Faites correspondre la graisse et le style au fichier
Les descripteurs font-weight et font-style indiquent au navigateur les demandes auxquelles cette face peut répondre. Ils doivent décrire les données du fichier, et non un rendu visuel que le navigateur devrait synthétiser. Pour une police statique normale, la graisse 400 et le style normal sont habituels. Un fichier italique conserve généralement la même graisse avec italic, tandis qu’un gras peut employer 700. Une police variable peut accepter une plage telle que 100 900 si le fichier contient réellement cet axe. Le générateur accepte du texte CSS au lieu de limiter ces champs à quelques choix, ce qui autorise les valeurs classiques et la syntaxe valide des polices variables. Il retire les espaces extérieurs et rejette les retours à la ligne, accolades et points-virgules qui permettraient de sortir du descripteur. Il ne vérifie pas si le fichier binaire contient la graisse ou le style déclaré. Créez une règle distincte pour chaque face statique et conservez le même nom de famille pour les fichiers apparentés. Le mécanisme normal de sélection CSS choisira alors la bonne face sans modifier les déclarations de tout votre site.
Copiez le résultat ou intégrez-le à votre chaîne de construction
La sortie contient une règle CSS mise en forme, ainsi que la famille normalisée, le nombre de sources, la graisse et le style. Copiez la valeur css dans une feuille de style avant les sélecteurs qui utilisent la famille, ou appelez le service depuis un script qui assemble vos ressources typographiques. La règle produite se limite à la famille, aux sources, à la graisse et au style. Elle ne devine pas les propriétés facultatives font-display, unicode-range, size-adjust, ascent-override, descent-override ou les réglages de fonctionnalités, car ces choix dépendent de votre stratégie de chargement, de la couverture des glyphes et des métriques. Ajoutez-les ensuite si nécessaire. L’outil n’effectue aucune requête réseau et ne vérifie pas qu’un chemin répond ; testez donc la feuille finale dans les navigateurs pris en charge et surveillez le panneau réseau pour repérer une ressource absente ou un type MIME incorrect. La sérialisation déterministe facilite les projets partagés : une même entrée produit toujours la même sortie, la priorité reste vérifiable et une liste vide échoue immédiatement. L’usage dans le navigateur est gratuit ; une requête automatisée par API coûte $0.002.
Cas d’usage
Enregistrer une famille web
Transformez des chemins WOFF2 et WOFF en règle prête à copier avec des formats explicites.
Déclarer les variantes statiques
Produisez des règles cohérentes pour les faces normales, italiques, grasses et grasses italiques.
Automatiser les feuilles de style
Créez des déclarations déterministes depuis les métadonnées des ressources pendant la construction.
Questions fréquentes
Que se passe-t-il si je ne fournis aucun fichier ?
La requête échoue pour entrée incorrecte, car une déclaration @font-face exploitable exige au moins une source.
L’outil vérifie-t-il que le fichier existe ?
Non. Il n’effectue aucune requête réseau et se contente de valider et sérialiser vos valeurs.
Quelle source faut-il placer en premier ?
Placez d’abord votre format moderne préféré, généralement WOFF2, puis les formats de repli nécessaires.
Puis-je déclarer une plage de graisse variable ?
Oui. font_weight accepte un texte tel que 100 900, sans caractères capables de rompre la règle.
Ajoute-t-il font-display ou unicode-range ?
Non. Il génère uniquement famille, sources, graisse et style ; les politiques facultatives restent sous votre contrôle.
Combien coûte l’utilisation de l’API ?
Chaque requête API applique le prix de base affiché sous la forme $0.002 ; l’outil dans le navigateur est gratuit.
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/font-face-declaration-build \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"font_family":"Inter","sources":[{"path":"/fonts/inter-regular.woff2","format":"woff2"},{"path":"/fonts/inter-regular.woff","format":"woff"}],"font_weight":"400","font_style":"normal"}'const res = await fetch("https://api.kit.forhosting.com/web/font-face-declaration-build", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"font_family": "Inter",
"sources": [
{
"path": "/fonts/inter-regular.woff2",
"format": "woff2"
},
{
"path": "/fonts/inter-regular.woff",
"format": "woff"
}
],
"font_weight": "400",
"font_style": "normal"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/font-face-declaration-build",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"font_family": "Inter",
"sources": [
{
"path": "/fonts/inter-regular.woff2",
"format": "woff2"
},
{
"path": "/fonts/inter-regular.woff",
"format": "woff"
}
],
"font_weight": "400",
"font_style": "normal"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/font-face-declaration-build", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"font_family":"Inter","sources":[{"path":"/fonts/inter-regular.woff2","format":"woff2"},{"path":"/fonts/inter-regular.woff","format":"woff"}],"font_weight":"400","font_style":"normal"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"font_family":"Inter","sources":[{"path":"/fonts/inter-regular.woff2","format":"woff2"},{"path":"/fonts/inter-regular.woff","format":"woff"}],"font_weight":"400","font_style":"normal"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/font-face-declaration-build", 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
{
"font_family": "Inter",
"sources": [
{
"path": "/fonts/inter-regular.woff2",
"format": "woff2"
},
{
"path": "/fonts/inter-regular.woff",
"format": "woff"
}
],
"font_weight": "400",
"font_style": "normal"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.font_face_declaration_build",
"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. |