import type { Transition, Variants } from "framer-motion"; /** * ease-out-expo. Un solo easing en toda la landing: es lo que produce la * sensación de que los elementos "pesan algo y frenan solos", y mezclar curvas * es exactamente lo que hace que una landing se sienta improvisada. */ export const EASE_EXPO = [0.16, 1, 0.3, 1] as const; export const baseTransition: Transition = { duration: 0.7, ease: EASE_EXPO }; /** * Reveal vertical. `reduced` colapsa el estado inicial al final: NO acorta la * transición, la elimina. Si `hidden` dejara `opacity: 0` cuando el usuario pide * menos movimiento, el contenido quedaría invisible para siempre porque la * animación que lo revela nunca se dispara. */ export function revealUp(reduced: boolean, distance = 24): Variants { return { hidden: reduced ? { opacity: 1, y: 0 } : { opacity: 0, y: distance }, show: { opacity: 1, y: 0, transition: baseTransition }, }; } /** Contenedor que escalona a sus hijos. Con movimiento reducido, stagger 0. */ export function revealStagger(reduced: boolean, stagger = 0.08): Variants { return { hidden: {}, show: { transition: { staggerChildren: reduced ? 0 : stagger } }, }; } /** * Props de viewport compartidas para `whileInView`. Una sola pasada (`once`), con * margen negativo para que el reveal arranque cuando la sección ya entró de * verdad y no en el instante en que su borde roza la pantalla. */ export const inView = { once: true, margin: "-12% 0px -12% 0px" } as const;