Motion
Movimiento restringido y funcional. Cada animación justifica qué mejora.
El movimiento solo entra si acompaña lo que se cuenta. El tono es preciso, no elástico: no se anima el texto ni se usan parallax, spring o skeletons.
Capas
| Capa | Qué | Cómo |
| 1. Smooth scroll | Scroll global suavizado | Lenis en todas las páginas |
| 2. Entrada escalonada | Fade-in al cargar | .fade-entry, delay aleatorio 50-200ms, 0.4s ease-out |
| 3. Scroll reveal | Elementos al entrar en viewport | Intersection Observer + CSS |
| 4. Interacciones | Hover, estados, modal | CSS transitions por componente |
Duración y easing
| Interacción | Duración | Easing |
| Hover en links/botones | 0.2s | ease |
| NavPill show/hide | 0.3s | ease-out |
| BentoGrid body reveal | 0.3s | ease-out |
| Modal open | 0.3s | ease-out |
| Modal close | 0.2s | ease-in |
Lo que no se anima
- Prosa palabra por palabra o línea por línea. Bloques completos.
- Parallax. Nunca. En ningún elemento.
- Animaciones de carga (skeletons, shimmers). Sitio estático.
- Spring physics. El tono es preciso, no elástico.
Stack permitido
| Librería | Uso | Carga |
| Lenis | Smooth scroll | Todas las páginas |
| CSS transitions | Hover, estados, reveals | Nativo |
| Intersection Observer | Scroll reveal trigger | API nativa |
| GSAP | Solo coordinación de timeline | Por componente, nunca global |