Composants
Organisation
Section intitulée « Organisation »src/components/ ui/ primitives partagées (button, input, badge, dialog, table, …) layout/ coquille applicative (app-shell, client-shell, navbars, …)Les écrans d’une feature vivent dans features/<module>/components/
(voir src/features/README.md), les composants génériques et réutilisables
dans src/components/.
- Ne pas réécrire une primitive : composer avec les composants de
components/ui(propsclassNameviacnde#/lib/utils). - Un composant de layout n’embarque pas de logique métier — il reçoit ses
données par props ou hooks d’état (
useAuth). - L’accessibilité est de base :
Labellié à l’input viahtmlFor/id,aria-labelsur les contrôles icônes,role="alert"sur les erreurs globales de formulaire. - Les textes utilisateur sont en français, écrits en dur dans le composant (pas de couche de traduction).
Accents (Tailwind)
Section intitulée « Accents (Tailwind) »- Classes utilitaires Tailwind 4 + variables CSS définies dans
styles.css(.border,bg-card,text-muted-foreground,text-destructive, …). - Éviter les couleurs hexadécimales en dur : utiliser les tokens du thème.
- Statuts :
<Badge variant="success|warning|info|danger|neutral">(components/ui/badge.tsx) — plus debg-[#hex] text-white. - En-têtes de page, tableaux, modales, états vides : primitives
page-header,table,dialog,empty-statedanscomponents/ui/. - Système complet : Design system.
À ne pas faire
Section intitulée « À ne pas faire »- ❌ Copier/coller un composant de
ui/pour le modifier à la volée dans une feature. - ❌ Générer un composant « fourre-tout » (props
any, toutes responsabilités). - ❌ Afficher des données sans état de chargement/erreur (patterns Query).
