Reveal
motion/reveal.tsxLa bibliothèque d'animations du projet, et la démonstration de chaque famille. Durées, courbes, décalages et distances viennent tous de src/styles/motion.css — aucune valeur n'est écrite dans un composant.
| Token | Valeur | Usage |
|---|---|---|
| Entrée | 420ms · ease-out | Reveal, Stagger, TextReveal |
| Survol | 160ms · ease-out | Boutons, liens, cartes |
| Overlay | 240ms · ease-out | Modale, tiroir, popover |
| Transition de page | 240ms · ease-out | Opacité + 8px, sans sortie |
| Stagger | 40 / 70 / 120ms | Serré, standard, ample |
| Course | 8 / 16 / 28px | Au-delà, cela lit comme un reflux de layout |
motion/reveal.tsxmotion/stagger.tsxmotion/text-reveal.tsxChaque fragment monte sous un masque. La phrase reste lisible avant, pendant et après l'animation.
motion/magnetic.tsxmotion/tilt-card.tsxCarte inclinée
Le ressort revient au repos à la sortie du pointeur.
motion/cursor-follow.tsxLe halo suit le pointeur à l'intérieur de ce cadre, et seulement ici.
motion/parallax.tsxFaites défiler la page
sections/horizontal-rail.tsxLe scroll reste au navigateur
La section est épinglée par position: sticky. La molette, le clavier et le geste tactile gardent leur comportement système ; rien n'intercepte le défilement.
Motion lit, il ne pilote pas
useScroll rapporte la progression dans la piste. Elle sert à faire varier l'opacité des étapes, pas à déplacer la page.
La piste reste courte
Sa hauteur est calculée sur le nombre d'étapes. Une section épinglée plus longue que quelques écrans donne l'impression que la page est bloquée.
Le contrôle le plus important de cette page, et le seul dont l'échec est invisible en démonstration.
Toutes les transitions, tous les décalages, tous les stagger. m.css met les durées à 0,01ms et les distances à 0px en un seul endroit.
L'état final. Un composant ne rend jamais une version raccourcie de son animation : il rend le résultat.
npm run verify charge la page avec reducedMotion: reduce et échoue si un titre reste sous une opacité de 0,9.