Quand je transforme un prototype Figma en composant React réutilisable, j'essaie de ne jamais sauter d'étapes. Trop souvent la précipitation mène à des composants fragiles, difficiles à tester ou à maintenir. Voici ma checklist pratique — structurée, testable et focalisée sur la performance — que j'utilise pour garder mes composants propres, cohérents et prêts à être partagés entre projets.
Audit du design dans Figma : ce que je vérifie en premier
Avant d'ouvrir VS Code, je passe systématiquement par une revue du prototype. Les décisions prises ici déterminent la structure et l'API du composant.
- Consistance visuelle : vérifiez les tokens (couleurs, typographies, espacements). Sont-ils centralisés dans des styles Figma ?
- Variantes : existe-t-il des états (hover, active, disabled), des tailles ou des variantes (primary/secondary) ?
- Composants imbriqués : le design est-il composé d'éléments réutilisables (icon, badge) ?
- Comportement interactif : transitions, micro-interactions, aspiration au motion (durée, easing) ?
- Accessibilité visuelle : contraste, taille de police minimale, focus states visibles ?
Définir l'API du composant
Sur la base du design, je définis une API claire qui facilitera la réutilisation :
- Props essentielles : children, className, id, onClick (ou handlers), disabled, size, variant.
- Composition vs héritage : est-ce que le composant doit accepter des slots (children) ou des props spécifiques (label, icon) ?
- Contrats typescript (si utilisé) : typage strict pour props optionnelles et required.
Structure et organisation des fichiers
Je crée une arborescence légère mais cohérente pour chaque composant. Exemple :
| Fichier | Contenu |
|---|---|
| Button/index.tsx | Composant principal + export |
| Button/Button.styles.ts | Styles (styled-components / emotion / css module) |
| Button/Button.test.tsx | Tests unitaires et accessibilité |
| Button/Button.stories.tsx | Storybook : exemples et variantes |
| Button/README.md | Usage, props et notes |
Je privilégie des dossiers isolés pour faciliter le publishing (paquets, mono-repo) et la réutilisation.
Implémentation : structure DOM et accessibilité
Lors du rendu, je réfléchis en HTML sémantique et en accessibilité :
- Éléments sémantiques : button, nav, header, main selon le cas — j'évite d'utiliser un div pour tout.
- Attributs ARIA : role, aria-pressed, aria-hidden, aria-label si besoin.
- Focus management : visible, logique et testable au clavier.
- Keyboard support : Enter/Space pour boutons, Esc pour modals, gestion des tabIndex.
Style : tokens, theming et options d’intégration
Le choix d’implementation dépend du projet, mais je veille à rendre le composant adaptable :
- Utiliser des tokens : spacing, couleurs, typographies viennent de variables (CSS variables, theme provider).
- Choix technique : CSS Modules / Tailwind / styled-components / emotion — documenter l’approche.
- ClassName override : accepter className et style pour permettre des overrides limités.
- Variants via props : mappe les variants design directement sur des classes ou des styles.
State et logique : garder le composant pur et testable
Je sépare toujours la logique d'UI (stateless) de la logique métier/stateful :
- Composant contrôlé vs non contrôlé : exposer onChange et value pour la version contrôlée si pertinent.
- Hooks séparés : extraire la logique réutilisable dans un hook (useButton, useToggle).
- Effets limités : éviter d'avoir des effets secondaires non testés dans le composant.
Tests : couverture, régression visuelle et accessibilité
Je pense tests dès le début. Mon trio gagnant :
- Unit tests : React Testing Library + Jest — interactions, rendu conditionnel, props.
- Visual regression : Chromatic / Percy — snapshots visuels pour détecter des régressions CSS.
- Accessibilité : axe-core (jest-axe) ou @axe-core/react — vérifier absence de violations majeures.
Checklist de tests habituels :
- Rendu par défaut et pour chaque variante
- Réactivité aux props (disabled, onClick appelé, aria attributes)
- Keyboard navigation et focus
- Tests visuels sur états hover/focus/active
Performance : ce que je surveille
Un composant réutilisable doit être léger et ne pas provoquer de re-render inutile :
- Memoization : React.memo pour composants pure functional, useCallback/useMemo pour handlers et calculs.
- Tree-shaking friendly : exports nommés pour permettre au bundleur d'éliminer le code mort.
- Chargement conditionnel : lazy() + Suspense pour composants lourds (rich editors, charts).
- Images et icônes : préférer SVGs en sprite/inline, optimiser les assets et utiliser srcset si nécessaire.
- CSS : éviter les sélecteurs coûteux, privilégier classes simples et variables CSS.
Documentation et Storybook
Je documente systématiquement pour faciliter l’adoption :
- Stories : toutes les variantes, states interactifs et exemples d’intégration (controlled/uncontrolled).
- README : props, exemples d’usage, limitations connues.
- Changelog : garder une trace des breaking changes si partagé en paquet.
CI/CD et qualité
Avant de merger, j’automatise quelques checks :
- Linting (ESLint + stylelint)
- Tests unitaires et coverage minimal
- Build check (typecheck TypeScript, bundle size warning)
- Visual regression via Chromatic CI
Checklist condensée — points actionnables
- Revue Figma : tokens, variantes, states
- Définir l’API : props, composition, types
- Organiser les fichiers : composant, styles, tests, stories, README
- HTML sémantique + aria + keyboard
- Styles via tokens + className override
- Séparer logique et UI (hooks)
- Tests : unit, visuel, accessibilité
- Optimiser : memo, lazy, assets
- Documenter : Storybook, README
- Automatiser : lint, tests, chromatic, typecheck
Pour finir, une petite astuce que j'applique souvent : créer d'abord une "dumb" version du composant — purement structure et styles — puis itérer en ajoutant logique et optimisations. Ça me permet de valider visuellement l'intégration avec Storybook et d'avoir une base propre pour les tests. Si tu veux, je peux te fournir un template minimal (TypeScript + React + Storybook + jest) qui suit exactement cette checklist.