UNPKG

@humanspeak/svelte-motion

Version:

Framer Motion for Svelte 5. Declarative motion.<tag> components with AnimatePresence exit animations, gestures (hover, tap, drag, focus, in-view), variants, FLIP layout animations, shared-layout transitions, spring physics, and scroll-linked motion values

30 lines (29 loc) 1.74 kB
/** * Derives boundary spring/inertia parameters from drag context. * * Behavior * - If `elastic` is truthy (> 0), use Framer-like defaults: `bounceStiffness=200`, `bounceDamping=40`. * - If falsy (`0`/`false`/`undefined`), use extremely large values to overdamp (no visible bounce). * - Applies overrides from `transition` (if provided) and maps `timeConstant` (seconds) → `timeConstantMs` (milliseconds). * * @param {number|undefined} elastic Elasticity value from drag context (`dragElastic`). * Values > 0 indicate elastic overdrag; `0`/`false` disables it. * @param {{ bounceStiffness?: number; bounceDamping?: number; timeConstant?: number; restDelta?: number; restSpeed?: number }=} transition * Optional transition overrides (typically from `dragTransition`). * - `timeConstant` is expressed in seconds and internally converted to milliseconds. * @returns {BoundaryPhysics} Fully resolved physics parameters for inertia and boundary spring. */ export const deriveBoundaryPhysics = (elastic, transition) => { const truthyElastic = typeof elastic === 'number' ? elastic > 0 : !!elastic; let bounceStiffness = truthyElastic ? 200 : 1_000_000; let bounceDamping = truthyElastic ? 40 : 10_000_000; if (transition?.bounceStiffness != null) bounceStiffness = transition.bounceStiffness; if (transition?.bounceDamping != null) bounceDamping = transition.bounceDamping; const timeConstantSec = transition?.timeConstant ?? 0.75; const timeConstantMs = Math.max(1, timeConstantSec * 1000); const restDelta = transition?.restDelta ?? 1; const restSpeed = transition?.restSpeed ?? 10; return { timeConstantMs, restDelta, restSpeed, bounceStiffness, bounceDamping }; };