KoderKoder.ai
TarifsEntrepriseÉducationPour les investisseurs
Se connecterCommencer

Produit

TarifsEntreprisePour les investisseurs

Ressources

Contactez-nousSupportÉducationBlog

Légal

Politique de confidentialitéConditions d’utilisationSécuritéPolitique d’utilisation acceptableSignaler un abus

Réseaux sociaux

LinkedInTwitter
Koder.ai
Langue

© 2026 Koder.ai. Tous droits réservés.

Accueil›Blog›UI cohérente dans les apps React grâce aux design tokens et aux règles
11 déc. 2025·7 min

UI cohérente dans les apps React grâce aux design tokens et aux règles

Apprenez à utiliser des design tokens et des règles de composants pour que les écrans React générés par l'IA respectent l'espacement, la typographie et le comportement des formulaires.

Pourquoi les écrans React générés paraissent souvent incohérents

L'incohérence UI apparaît généralement dans de petits détails qui semblent décalés quand on navigue. Une page a un padding généreux, une autre semble resserrée. Les titres changent de taille, les boutons changent de forme et de couleur, et un même champ peut se comporter différemment selon l'écran.

La plupart du temps, la dérive vient de quelques basiques :

  • Espacement : padding, gaps, et rythme des sections qui varient
  • Typographie : tailles de police, graisses et hauteurs de ligne instables
  • Composants : boutons, cartes, bordures et ombres qui changent légèrement
  • Formulaires : timing de validation, placement des erreurs et états désactivés différents

C'est courant quand les écrans sont générés à partir de prompts séparés. Chaque prompt est effectivement un nouveau départ, donc le modèle devine les décisions manquantes. Même « utiliser un style moderne » laisse des centaines de petits choix : gaps de 8px vs 12px, texte corps 14px vs 16px, quand afficher les erreurs, à quoi ressemble un bouton primaire.

Vous pouvez nettoyer manuellement deux ou trois pages, mais ça ne scale pas. Vous finissez à courir après des ajustements CSS ponctuels, copier des styles entre fichiers, et retoucher des formulaires. Les règles sont dans votre tête, pas dans le projet.

Imaginez générer un écran de connexion aujourd'hui et un écran de profil demain. Si l'un affiche les erreurs seulement au submit et l'autre au blur, les utilisateurs le remarquent. Si la hauteur du bouton primaire change entre les écrans, l'application donne l'impression d'être assemblée à la main.

La cohérence devient la norme quand chaque écran suit le même système partagé : des design tokens (espacement, typographie, couleur) plus un petit ensemble de règles de composants et de formulaires.

Design tokens en termes simples

Les design tokens sont de simples valeurs nommées que vous réutilisez dans l'UI. Au lieu de demander un « padding confortable » sur chaque écran, vous utilisez un token comme space-4. Au lieu de « légèrement arrondi », vous utilisez radius-md. Le nom reste stable même si vous changez plus tard ce qu'il représente.

Les tokens sont l'ensemble des décisions que vous voulez voir partagées par tous les écrans. Ils éliminent le goût et les suppositions, ce qui cause exactement la dérive quand vous générez ou construisez de nouvelles pages.

Les tokens typiques couvrent l'espacement, la typographie, les couleurs, la forme et un petit nombre de niveaux d'élévation. Le gain est pratique : un en-tête utilise toujours la même taille, une carte utilise toujours le même padding, et un bouton primaire garde la même couleur et le même rayon.

Quoi tokeniser vs garder flexible ?

Tokenisez les choses qui affectent le ressenti global du produit : l'échelle d'espacement, les tailles et hauteurs de ligne de police, les couleurs de base (texte, fond, primaire, danger, bordure) et un petit ensemble de rayons.

Gardez flexibles les choix guidés par le contenu, comme la longueur du texte, quelle icône utiliser, ou si une section a besoin de deux ou trois cartes.

Quand vous générez des écrans (y compris avec des outils comme Koder.ai), fournir un petit ensemble de tokens en amont réduit la part de devinettes et rend la sortie nettement plus cohérente.

Choisir un jeu de tokens petit mais complet

Un jeu de tokens est juste un petit menu de valeurs autorisées. Plus il est petit, mieux c'est, car il laisse moins de place aux choix aléatoires, mais il doit couvrir les basiques qui rendent les écrans incohérents.

Commencez par l'espacement. Choisissez une seule échelle et utilisez-la partout pour le padding, les gaps et la mise en page. Un ensemble comme 4, 8, 12, 16, 24, 32 couvre la plupart des UI. Si un design demande 10px ou 18px, arrondissez au token le plus proche au lieu d'introduire de nouveaux nombres.

Puis définissez des valeurs typographiques par défaut pour que les titres et le texte corps cessent de dériver. Vous n'avez pas besoin d'un énorme système typographique. Vous avez besoin d'étapes claires et répétables.

Un ensemble compact et utilisable sans devenir verbeux :

  • Espacement : 4, 8, 12, 16, 24, 32
  • Typo : une taille de corps, deux tailles de titres, une hauteur de ligne pour le corps, une pour les titres
  • Couleurs : text-primary, text-muted, bg, surface, border, accent
  • Rayon : deux valeurs (par exemple 4 et 12)
  • Élévation : none, small, medium (trois niveaux max)

L'accessibilité appartient aussi au système. Définissez un style d'outline au focus (couleur, épaisseur, offset) pour que les utilisateurs clavier aient des états de focus cohérents. Fixez une cible tactile minimale (par exemple 44x44) pour le mobile. Limitez les couleurs de texte à un petit ensemble fiable pour garder un contraste prévisible.

Si les boutons semblent parfois écrasés, c'est souvent parce qu'un écran a utilisé padding 10 et un autre 12. Avec des tokens, vous pouvez dire : « Buttons utilisent paddingY=8, paddingX=16, radius=12, token d'outline au focus, min height 44. » Une fois ces nombres fixés, le générateur arrête d'improviser.

Règles de composants qui alignent tous les écrans

Les tokens fixent les nombres. Les règles de composants fixent les habitudes.

Choisissez un petit ensemble de composants centraux et traitez-les comme les seuls blocs de construction pour les écrans. Gardez-les sobres et réutilisables : Button, Input, Select, Checkbox, Card. Vous pouvez ajouter TextArea et Modal, mais ils doivent suivre le même système (labels, espacement, états).

Ensuite, limitez les variantes et définissez quand elles sont autorisées. Par exemple : Button a primary, secondary et danger. Primary est pour l'action principale de l'écran (souvent une seule). Secondary est pour annuler ou les actions à faible priorité. Danger est seulement pour les actions destructrices comme supprimer. Si une variante ne se justifie pas, par défaut utilisez la secondary.

Les règles d'espacement empêchent la dérive subtile. Définissez des valeurs par défaut à l'intérieur des composants : padding du Button, hauteur de l'Input, gap label-champ, gap standard entre champs empilés. Ajoutez quelques règles de layout aussi : les Cards ont un padding interne fixe et un espacement header/body cohérent ; les Modals utilisent les mêmes pas de largeur et l'alignement du footer.

Enfin, rendez les états non négociables car c'est là que les UIs commencent souvent à paraître aléatoires :

  • Loading : désactiver le contrôle, afficher un spinner, garder la largeur stable
  • Disabled : contraste réduit, mais ne pas supprimer entièrement les styles hover/focus
  • Empty states : message court plus une action claire
  • Validation : les erreurs apparaissent sous les champs et ne provoquent pas de gros sauts de layout

Quand vous générez un écran riche en formulaires comme « Create project », ces règles empêchent des tailles de boutons mélangées, des positions d'étiquette changeantes, ou une « carte spéciale » unique à une page.

Règles de comportement des formulaires : les détails qui dérivent souvent

Créez votre écran de référence
Transformez vos tokens et règles de formulaire en un prompt réutilisable et générez des pages cohérentes plus vite.
Générer l'écran

Même avec des visuels stables, beaucoup de plaintes « ça sonne bizarre » viennent du comportement des formulaires. Si chaque écran gère labels, erreurs et focus différemment, les utilisateurs le ressentent comme de l'incohérence.

Choisissez un seul pattern de formulaire et utilisez-le partout : label, marqueur optionnel/obligatoire, helper text, puis texte d'erreur. Gardez aussi la formulation cohérente (par exemple, labels en casse phrase, helper text court, et messages d'erreur qui commencent par un verbe).

Les règles qui évitent la plupart des dérives :

  • Les labels toujours au-dessus des champs (pas en placeholder), marqueur requis sur le label
  • Le helper text toujours sous le champ, même taille et couleur, jamais utilisé pour les erreurs
  • Timing de validation : afficher les erreurs après le blur ou le submit, les effacer au changement
  • Placement des erreurs : une ligne d'erreur directement sous le champ, alignée avec le helper text
  • Comportement au focus : l'ordre Tab suit la disposition visuelle ; Enter soumet seulement sur le dernier champ ou quand le bouton primaire est focalisé

Verrouillez les dimensions et la mise en page pour que les écrans ne « respirent » pas différemment. Définissez une hauteur d'input unique, une hauteur de bouton unique et une largeur de champ par défaut. Sur desktop, alignez les champs sur une grille cohérente et empilez les labels au-dessus des inputs. Sur mobile, rendez les champs en pleine largeur et évitez les formulaires sur deux colonnes sauf si c'est vraiment nécessaire.

Un exemple simple : un écran « Create project » pourrait avoir Name, Region et Description. Même si Region est un select, traitez-le comme n'importe quel autre champ : même hauteur, même position d'étiquette, même ligne d'erreur. Si l'utilisateur soumet sans Name, le focus se déplace sur Name, l'erreur apparaît en dessous, et la mise en page reste stable.

Si vous générez des écrans dans Koder.ai, mettez ces règles de formulaire dans votre prompt une seule fois et réutilisez-les à travers les fonctionnalités pour que chaque nouveau formulaire se comporte de la même manière sans retouches répétées.

Comment exprimer tokens et règles dans votre prompt

Traitez votre prompt comme un petit contrat UI. Gardez-le court, précis et réutilisable pour que chaque nouvel écran s'aligne sur le même espacement, typographie, composants et comportements.

Un pattern pratique est de coller une petite spécification UI en haut de votre requête, puis décrire l'écran en langage simple.

Un modèle de prompt compact

UI SPEC (apply to every screen)
Tokens:
- Spacing: 4, 8, 12, 16, 24, 32
- Radius: 8
- Typography: H1 24/32, H2 18/26, Body 14/20
- Colors: text, muted, bg, primary, danger (no custom hex)

Components (must use): PageShell, Section, Card, Button, Input, Select, TextArea, FormRow, HelperText, Toast

Layout rules:
- Page padding: 24 desktop, 16 mobile
- Section spacing: 24
- Card padding: 16
- Grid: 12 cols desktop, 4 cols mobile, gap 16

Do:
- Reuse components and tokens only
- Keep labels above inputs, helper text below

Do not:
- Invent new spacing values, font sizes, or one-off CSS
- Mix different button heights or input styles

If a new component is needed:
- Extend an existing component pattern and document it in the output
- Do not create new visual styles outside tokens

Après la spécification, ajoutez quelques checks d'acceptation qui attrapent la dérive tôt :

  • « Use only the tokens above; no inline styles. »
  • « All forms must use FormRow and show errors the same way. »
  • « If you must add a component, base it on Card plus existing typography. »

Si vous utilisez un générateur basé sur chat, gardez cette spec stable entre les requêtes. La changer à chaque fois va à l'encontre de l'objectif.

Un workflow qui maintient la cohérence des écrans

Écrivez le contrat UI avant de générer quoi que ce soit : un petit jeu de tokens (espacement, typo, couleurs, rayons, ombres) plus un inventaire court de composants (Button, Input, Select, Card, Modal, Table, Toast). Si un token ou un composant manque, le modèle en inventera un et votre UI dérivera.

Créez ensuite un écran de référence qui exerce les règles. Une page riche en formulaires est un bon test car elle inclut en-têtes, helper text, erreurs de validation, boutons primaire et secondaire, et un toast de succès. Traitez cet écran comme la baseline.

Ensuite, construisez de nouveaux écrans en composant ce que vous avez déjà défini. Ne demandez pas un « nouveau style ». Demandez la même Card, la même échelle d'espacement, les mêmes pas typographiques et le même pattern de champs.

Un workflow simple :

  • Confirmer tokens et règles de composants, puis les geler pour la fonctionnalité
  • Générer un écran de référence et ajuster la spec jusqu'à satisfaction
  • Construire de nouveaux écrans en réutilisant les composants, pas en restylant
  • Reviser pour cohérence, puis changer les règles (tokens/composants), pas des pixels individuels
  • Sauvegarder la spec comme snippet réutilisable pour la fonctionnalité suivante

Si un écran « Search users » finit avec un espacement plus serré que la référence, ne corrigez pas avec des marges manuelles. Mettez à jour les tokens d'espacement ou la règle de padding de Card une fois, puis régénérez.

Si vous travaillez dans Koder.ai, snapshots et rollback peuvent aider : verrouillez une baseline, expérimentez sereinement et revenez rapidement en arrière si un changement commence à introduire de la dérive.

Erreurs communes à éviter

Réutilisez un petit ensemble de composants
Générez Button, Input, Card et les patterns de layout une fois, puis composez chaque écran à partir d'eux.
Commencer à construire

La façon la plus rapide de perdre la cohérence est de traiter tokens et règles comme des suggestions. De petites exceptions se multiplient sur de nouveaux écrans.

Un piège fréquent est de changer l'échelle d'espacement en cours de projet. Les premiers écrans utilisent 8, 16, 24. Un nouvel écran introduit 10 et 18 « parce que ça rend mieux ». La dérive est alors autorisée, et les anciens écrans ne sont jamais mis à jour.

Une autre source de dérive est de laisser le générateur inventer de nouveaux styles de composants. Si vous ne dites pas « seules ces variantes de boutons existent », il peut créer un nouveau radius ou un padding d'input différent sur un écran.

Les états sont un autre oubli fréquent. Loading, empty et error states changent souvent l'espacement et le comportement. Si vous les ajoutez à la fin, vous obtenez généralement des patterns bâclés qui ne correspondent pas au reste.

Surveillez aussi le mauvais type de spécificité : « rendre moderne avec des ombres douces » est vague, tandis que des règles de comportement comme « les erreurs s'affichent sous le champ », « les boutons désactivés gardent les styles de focus », et « Enter soumet seulement sur le dernier champ » sont concrètes et répétables.

Si vous voulez un bloc de garde-fous léger à coller dans des prompts, gardez-le court :

  • Utilisez la même échelle d'espacement et les tokens typographiques existants ; n'inventez pas de nouvelles valeurs
  • N'utilisez que les composants et variantes approuvés
  • Incluez loading, empty et error states en utilisant les mêmes tokens
  • Spécifiez les comportements (validation, ordre de focus, submit, disabled) aussi clairement que les visuels

Checklist rapide de cohérence avant d'accepter un écran

Avant de merger un écran généré, faites un scan de deux minutes.

Commencez par l'espacement. Cherchez des valeurs aléatoires comme 13px ou des marges ponctuelles ajoutées « juste pour que ça rentre ». Si vous utilisez des tokens, chaque gap doit provenir de l'ensemble approuvé, y compris les gutters, le padding des cartes et l'espacement entre champs.

Puis vérifiez la typographie par rapport à votre échelle. Les titres doivent décroître de manière prévisible. Le texte corps ne doit pas changer de taille entre des sections similaires. La hauteur de ligne compte aussi, surtout sur des écrans denses comme les pages de paramètres.

Scannez ensuite les boutons. Variantes et tailles doivent suivre vos règles : primary pour l'action principale, secondary pour les actions moins importantes, danger uniquement lorsqu'il s'agit vraiment de supprimer. Hauteur du bouton, placement d'icône et style du libellé doivent correspondre.

Pour les formulaires, la cohérence tient surtout à la structure. Les labels restent au même endroit, les indicateurs requis suivent une règle, helper text et erreurs ne se concurrencent pas, et les erreurs apparaissent au même endroit.

Une checklist courte :

  • Espacement : uniquement des valeurs de tokens (pas de nombres aléatoires)
  • Typographie : respecte l'échelle (y compris hauteur de ligne)
  • Boutons : mêmes variantes et tailles
  • Formulaires : une seule structure pour label/helper/erreur
  • États : hover, focus, disabled, loading, empty

Enfin, faites un rapide test mobile. Réduisez la largeur et confirmez que le layout s'adapte sans inventer de nouvelles tailles de police ou d'espacement.

Exemple : générer une petite feature React sans dérive de style

Planifiez la spécification d'abord
Confirmez une fois les tokens, composants et règles de validation avant de générer l'UI.
Ouvrir la planification

Imaginez un simple onboarding : trois écrans (Profile, Preferences, Confirm), plus une page Settings plus tard. Vous voulez que chaque écran semble venir du même designer, même s'ils ont été générés séparément.

Avant de générer quoi que ce soit, fournissez un petit jeu de tokens et quelques règles de composants :

TOKENS
- spacing: xs=4, sm=8, md=12, lg=16, xl=24
- radius: sm=8, md=12
- type: body=14/20, title=20/28, label=12/16
- layout: pageMax=960, sectionGap=24, fieldGap=12

COMPONENT RULES
- Page: max width=pageMax, padding=xl, sectionGap between blocks
- Card: padding=lg, radius=md
- Field: label above, helper below, fieldGap between fields
- Button row: primary on right, gap=sm
- Errors: shown under field, same copy style, no alerts

Générez ensuite « Profile » et « Preferences » séparément. Comme les deux écrans doivent utiliser Page, Card, Field et Button row tels que définis, ils arrivent avec les mêmes marges, l'espacement des labels et le positionnement des boutons. L'étape Confirm tient toujours, même si elle contient plus de texte en lecture seule.

Le comportement des formulaires est l'endroit où la dérive s'infiltre souvent, donc définissez-le une fois et réutilisez : submit désactivé tant que c'est invalide, erreurs inline seulement après blur ou submit, Enter soumet seulement à la dernière étape, et le bouton Back ne supprime jamais les valeurs déjà saisies.

Quand vous avez besoin d'un nouvel élément UI, ne laissez pas le modèle improviser. Ajoutez une seule règle, puis régénérez en pensant la réutilisation :

  • ProgressStepper : height=32, spacing=md, current step bold, completed steps clickable

Prochaines étapes : rendre la cohérence par défaut

Transformez tokens et règles en une spécification réutilisable que vous utilisez réellement. Si elle est trop longue pour être collée, elle ne sera pas suivie.

Une spec pratique inclut généralement : votre table de tokens (espacement, typo, rayons, couleurs), un petit ensemble de règles de composants (boutons, inputs, cartes, titres), des règles de comportement des formulaires (timing de validation, erreurs, disabled/loading), des defaults de layout (padding page, max width, espacement de section), et une courte liste « ne jamais faire » (marges aléatoires, tailles de police ad hoc).

Faites ensuite une habitude : mettez à jour la spec d'abord, pas les pixels individuels.

Si vous utilisez Koder.ai (koder.ai), le planning mode est un bon endroit pour redire et confirmer la spec avant de générer l'UI. Quand vous voulez tester des alternatives, snapshots et rollback vous aident à explorer sans perdre une baseline stable.

FAQ

Pourquoi les écrans React générés paraissent-ils incohérents même si je demande un « style moderne » ?

Parce que chaque requête pour un écran est une nouvelle instance. Si vous ne fournissez pas un système partagé, le générateur comble les détails manquants en devinant : espacement, tailles de police, padding des boutons, ombres et comportement des formulaires. De petites différences s'accumulent donc entre les pages.

Qu'est-ce que les design tokens en termes simples, et en quoi aident-ils ?

Les design tokens sont des valeurs nommées et réutilisables pour des éléments comme l'espacement, les tailles de police, les couleurs et les rayons de bordure.

Au lieu de demander un “padding confortable”, vous utilisez quelque chose comme space-md. Le nom reste stable et chaque écran réutilise les mêmes décisions pour éviter la dérive de l'interface.

Quel est un bon jeu de tokens « petit mais complet » pour commencer ?

Commencez petit et couvrez uniquement ce qui provoque une dérive visible :

  • Espacement : 4, 8, 12, 16, 24, 32
  • Typographie : 1 taille de corps + 2 tailles de titres + hauteurs de ligne fixes
  • Couleurs : text, muted, bg, surface, border, primary, danger
  • Rayon : 2 valeurs (par exemple 8 et 12)
  • Élévation : none, small, medium

Si vous avez besoin d’une nouvelle valeur, arrondissez-la au token le plus proche au lieu d’inventer 10px ou 18px.

Comment écrire un prompt qui garde la cohérence entre les écrans générés ?

Placez un petit bloc de spécification UI en haut de chaque requête et traitez-le comme un contrat :

  • Énumérez les tokens (espacement/typo/couleurs/rayon)
  • Listez les composants autorisés (Button, Input, Card, etc.)
  • Ajoutez des règles strictes (pas de nouvelles valeurs d'espacement, pas de CSS ad hoc)

Décrivez ensuite l'écran. L'important est de garder cette spécification identique entre les écrans.

Quelles règles de composants empêchent le plus la dérive UI ?

Les tokens définissent les nombres ; les règles de composants définissent les habitudes. Règles utiles :

  • Button : hauteur fixe, padding fixe et peu de variantes (primary/secondary/danger)
  • Inputs : une seule hauteur, espacement d'étiquette cohérent, style de bordure/focus uniforme
  • Cards : padding fixe et espacement prévisible header/body
  • Layout : padding page standard et espacement de section

Règle par défaut : si une variante n'est pas justifiable, revenir à la variante standard.

Quel est le meilleur comportement par défaut pour le timing de validation et le placement des erreurs ?

Choisissez un seul schéma et appliquez-le partout :

  • L'étiquette toujours au-dessus du champ (ne pas utiliser le placeholder comme label)
  • Le texte d'aide toujours sous le champ (ne sert jamais d’erreur)
  • Une seule ligne d’erreur directement sous le champ
  • Afficher les erreurs après le blur ou le submit, et les mettre à jour/effacer lors du changement

Cela évite la situation courante où un écran valide au blur et un autre seulement au submit, ce que les utilisateurs remarquent.

Quels états UI dois-je standardiser pour éviter d'avoir des écrans qui semblent aléatoires ?

Définissez quelques règles d'état non négociables :

  • Loading : désactiver le contrôle, afficher un spinner, garder la largeur stable
  • Disabled : contraste réduit, mais conserver le focus comportement
  • Empty state : message court + une action claire
  • Erreurs : inline sous le champ ; éviter les gros sauts de layout

Si vous ne spécifiez pas les états, chaque écran a tendance à inventer ses propres patterns.

Que faire lorsqu'un écran nécessite un nouveau composant qui n'est pas dans ma liste ?

Ne laissez pas le générateur improviser le style. Ajoutez le composant en tant qu’extension documentée d’un pattern existant :

  • Basez le nouveau composant sur les tokens actuels et un conteneur familier (souvent Card)
  • Définissez sa taille, son espacement et ses états en utilisant les tokens existants
  • Ajoutez-le à la liste des composants approuvés pour les écrans futurs

Si vous ne pouvez pas le décrire avec des tokens, c'est probablement trop personnalisé et cela provoquera de la dérive.

Quel workflow garde la cohérence quand je génère des écrans sur plusieurs sessions ?

Créez un écran de référence qui met le système à l’épreuve (une page riche en formulaires est idéale), puis réutilisez la même spécification pour chaque nouvel écran.

Dans Koder.ai, utilisez planning mode pour redéclarer et confirmer la spécification avant de générer, et servez-vous des snapshots et rollback pour conserver une baseline stable pendant les expérimentations.

Quelle est une checklist rapide pour repérer l'incohérence avant de fusionner un écran généré ?

Faites un scan rapide avant d'accepter l'écran généré :

  • L'espacement utilise uniquement les valeurs de tokens (pas de nombres aléatoires)
  • La typographie respecte l'échelle (y compris la hauteur de ligne)
  • Les boutons suivent les mêmes variantes et tailles
  • Les formulaires respectent une structure unique (label/texte d'aide/erreur)
  • Les états existent : hover, focus, disabled, loading, empty

Si quelque chose cloche, mettez à jour la spécification/tokens et régénérez — ne corrigez pas avec des marges ad hoc.

Sommaire
Pourquoi les écrans React générés paraissent souvent incohérentsDesign tokens en termes simplesChoisir un jeu de tokens petit mais completRègles de composants qui alignent tous les écransRègles de comportement des formulaires : les détails qui dérivent souventComment exprimer tokens et règles dans votre promptUn workflow qui maintient la cohérence des écransErreurs communes à éviterChecklist rapide de cohérence avant d'accepter un écranExemple : générer une petite feature React sans dérive de styleProchaines étapes : rendre la cohérence par défautFAQ
Partager