From 275b663934eee4df04a876ca034e11a08f1a7049 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 15 Feb 2026 20:56:29 +0200 Subject: [PATCH] feat: add shared motion config with spring presets and variants --- src/lib/motion.ts | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/lib/motion.ts diff --git a/src/lib/motion.ts b/src/lib/motion.ts new file mode 100644 index 0000000..cfddce5 --- /dev/null +++ b/src/lib/motion.ts @@ -0,0 +1,67 @@ +import type { Transition, Variants } from "framer-motion"; + +// --- Spring presets --- + +export const springs = { + bouncy: { type: "spring", stiffness: 400, damping: 15, mass: 0.8 } as Transition, + snappy: { type: "spring", stiffness: 500, damping: 20 } as Transition, + gentle: { type: "spring", stiffness: 200, damping: 20 } as Transition, + wobbly: { type: "spring", stiffness: 300, damping: 10 } as Transition, +}; + +// --- Reusable variants --- + +export const fadeSlideUp: Variants = { + hidden: { opacity: 0, y: 12 }, + visible: { opacity: 1, y: 0 }, + exit: { opacity: 0, y: -8 }, +}; + +export const fadeSlideDown: Variants = { + hidden: { opacity: 0, y: -12 }, + visible: { opacity: 1, y: 0 }, + exit: { opacity: 0, y: 8 }, +}; + +export const fadeSlideLeft: Variants = { + hidden: { opacity: 0, x: 40 }, + visible: { opacity: 1, x: 0 }, + exit: { opacity: 0, x: -40 }, +}; + +export const fadeSlideRight: Variants = { + hidden: { opacity: 0, x: -40 }, + visible: { opacity: 1, x: 0 }, + exit: { opacity: 0, x: 40 }, +}; + +export const scaleIn: Variants = { + hidden: { opacity: 0, scale: 0.9 }, + visible: { opacity: 1, scale: 1 }, + exit: { opacity: 0, scale: 0.95 }, +}; + +// --- Stagger container --- + +export function staggerContainer(staggerDelay = 0.04): Variants { + return { + hidden: {}, + visible: { + transition: { + staggerChildren: staggerDelay, + }, + }, + }; +} + +// --- Micro-interaction presets --- + +export const microInteraction = { + hover: { scale: 1.05 }, + tap: { scale: 0.95 }, +}; + +export const subtleHover = { + hover: { scale: 1.02 }, + tap: { scale: 0.98 }, +};