@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
JavaScript
/**
* 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 };
};