Tutoriels

La classe Tailwind qui disparaît sans erreur

Une échelle typographique maison et une fusion de classes qui l'ignore : le HTML livré perd la classe, et rien ne le signale.

AvancéArticle4 étapes

La panne se présente ainsi : le composant reçoit className="text-body-sm text-foreground", et le HTML construit ne porte que text-foreground. Aucune erreur, aucun avertissement, un texte à la taille par défaut là où la maquette en demandait une autre.

1. Comprendre qui supprime la classe

tailwind-merge désambiguïse les classes en conflit : entre px-2 et px-4, la dernière gagne. Pour trancher, il faut classer chaque classe dans un groupe — et il ne connaît que les groupes de Tailwind. Une échelle maison déclarée en @theme lui est inconnue : text-body-sm est rangé avec les couleurs de texte, donc jugé en conflit avec text-foreground, donc supprimé.

2. Reproduire la panne dans un test, pas dans un navigateur

La fonction cn est pure. Le test qui l’attrape tient en une ligne — expect(cn("text-body-sm", "text-foreground")) — et ne demande ni build ni DOM. Cherchée dans le navigateur, la même panne se présente comme « un style qui ne s’applique pas », et on soupçonne d’abord la feuille de style.

3. Déclarer les échelles maison

extendTailwindMerge accepte les groupes du thème : espacements, tailles de texte, rayons. Chaque valeur déclarée là est reconnue comme telle, et cesse d’être confondue avec une couleur.

4. Empêcher la dérive entre deux fichiers

La liste passée à extendTailwindMerge doit refléter le bloc @theme de la feuille de style. Rien dans l’outillage ne les tient ensemble : ajouter un token sans l’inscrire ici ramène exactement la même panne, silencieuse au même endroit. Un commentaire à chaque extrémité, et un test par groupe, sont ce qui rend l’oubli visible.

Agir

Thème sombreFixer l'apparence du sitesetTheme({theme:"dark"})
Thème clairFixer l'apparence du sitesetTheme({theme:"light"})
Thème du systèmeSuivre à nouveau la préférence du systèmesetTheme({theme:"system"})
Passer le site en anglaisEnglishsetLocale({locale:"en"})
Labs — ProduitFiltrer les Labs par typefilterLabs({type:"Produit"})
Labs — PrototypeFiltrer les Labs par typefilterLabs({type:"Prototype"})
Labs — RechercheFiltrer les Labs par typefilterLabs({type:"Recherche"})
Labs — Réinitialiser les filtresRetirer tous les filtres des LabsfilterLabs({reset:true})
Journal — IngénierieFiltrer le Journal par catégoriefilterJournal({category:"Ingénierie"})
Journal — SécuritéFiltrer le Journal par catégoriefilterJournal({category:"Sécurité"})
Journal — Agent-NativeFiltrer le Journal par catégoriefilterJournal({category:"Agent-Native"})
Journal — StudioFiltrer le Journal par catégoriefilterJournal({category:"Studio"})
Journal — Réinitialiser les filtresRetirer tous les filtres du JournalfilterJournal({reset:true})
Tutoriels — DébutantFiltrer les tutoriels par niveaufilterTutorials({level:"Débutant"})
Tutoriels — IntermédiaireFiltrer les tutoriels par niveaufilterTutorials({level:"Intermédiaire"})
Tutoriels — AvancéFiltrer les tutoriels par niveaufilterTutorials({level:"Avancé"})
Tutoriels — Réinitialiser les filtresRetirer tous les filtres des tutorielsfilterTutorials({reset:true})

Services

DiscoveryCadrer le produit avant d'écrire la première ligne, pour que le budget serve à construire et pas à corriger.openService({service:"discovery"})
Design produitUne interface qui se tient, portée par un design system que vos développeurs peuvent faire vivre sans nous.openService({service:"design"})
Développement webUne application web rapide et tenue dans le temps, avec les tests et la chaîne de livraison qui vont avec.openService({service:"web"})
Développement mobileUne application iOS et Android depuis une seule base de code, publiée sur les deux stores.openService({service:"mobile"})
Infrastructure & sécuritéUne infrastructure décrite en code, et un accès Zero Trust qui ne repose pas sur un SMS.openService({service:"infrastructure"})
Maintenance & évolutionUn produit qui reste à jour, surveillé et corrigé, avec quelqu'un qui répond quand ça casse.openService({service:"maintenance"})
Conseil Architecture Agent-NativeRendre un produit existant pilotable par un agent, sans le réécrire — et sans lui ouvrir plus qu'il ne faut.openService({service:"agent-native"})

Naviguer

YorroStudio d'ingénierie produit à Abidjan et Paris. On conçoit, on code, on livre.navigate({page:"home"})
ServicesConstruire un produit de bout en bout, ou conseiller une équipe sur son architecture agent-native.navigate({page:"services"})
LabsCe que le studio a construit : produits, prototypes et recherches, avec leur avancement réel.navigate({page:"labs"})
TutorielsDes guides pas-à-pas tirés de vrais projets, réunis en parcours par sujet.navigate({page:"tutorials"})
JournalLes notes et les prises de position du studio.navigate({page:"journal"})
ContactDécrivez votre projet ; on répond avec un cadrage, pas avec un devis type.navigate({page:"contact"})
À proposQui tient le studio, comment il travaille, et ce qu'il refuse de faire.navigate({page:"about"})
↑↓ naviguer↵ exécuteréchap fermerActions unifiées