| 1 | import type { TargetAndTransition, Transition, Variants } from "framer-motion"; |
| 2 | |
| 3 | export const springs = { |
| 4 | snappy: { type: "spring", stiffness: 580, damping: 32, mass: 0.8 }, |
| 5 | natural: { type: "spring", stiffness: 320, damping: 28, mass: 1.0 }, |
| 6 | entrance: { type: "spring", stiffness: 240, damping: 18, mass: 1.2 }, |
| 7 | sheet: { type: "spring", stiffness: 280, damping: 34, mass: 1.0 }, |
| 8 | stagger: { type: "spring", stiffness: 480, damping: 30, mass: 0.6 }, |
| 9 | } satisfies Record<string, Transition>; |
| 10 | |
| 11 | export const dropCardVariants = { |
| 12 | initial: { opacity: 0, y: -16, scale: 0.96 }, |
| 13 | animate: { opacity: 1, y: 0, scale: 1, transition: springs.entrance }, |
| 14 | exit: { opacity: 0, x: 24, scale: 0.92, transition: { duration: 0.18 } }, |
| 15 | } satisfies Variants; |
| 16 | |
| 17 | export const flashAccentKeyframes = { |
| 18 | boxShadow: [ |
| 19 | "0 0 0 0 oklch(0.78 0.16 184 / 0)", |
| 20 | "0 0 0 4px oklch(0.78 0.16 184 / 0.5)", |
| 21 | "0 0 0 0 oklch(0.78 0.16 184 / 0)", |
| 22 | ], |
| 23 | transition: { duration: 1.6, ease: "easeOut", times: [0, 0.2, 1] }, |
| 24 | } satisfies TargetAndTransition; |
| 25 | |
| 26 | export const staggerContainer = { |
| 27 | initial: {}, |
| 28 | animate: { transition: { staggerChildren: 0.04, delayChildren: 0.02 } }, |
| 29 | } satisfies Variants; |
| 30 | |
| 31 | export const fadeUpItem = { |
| 32 | initial: { opacity: 0, y: 12 }, |
| 33 | animate: { opacity: 1, y: 0, transition: springs.stagger }, |
| 34 | } satisfies Variants; |