{"version":3,"file":"spring.mjs","sources":["../../../../src/animation/generators/spring.ts"],"sourcesContent":["import {\n clamp,\n millisecondsToSeconds,\n secondsToMilliseconds,\n warning,\n} from \"motion-utils\"\nimport {\n AnimationState,\n KeyframeGenerator,\n SpringOptions,\n Transition,\n ValueAnimationOptions,\n} from \"../types\"\nimport { generateLinearEasing } from \"../waapi/utils/linear\"\nimport {\n calcGeneratorDuration,\n maxGeneratorDuration,\n} from \"./utils/calc-duration\"\nimport { createGeneratorEasing } from \"./utils/create-generator-easing\"\n\nconst springDefaults = {\n // Default spring physics\n stiffness: 100,\n damping: 10,\n mass: 1.0,\n\n // Default duration/bounce-based options\n duration: 800, // in ms\n bounce: 0.3,\n visualDuration: 0.3, // in seconds\n\n // Rest thresholds\n restSpeed: {\n granular: 0.01,\n default: 2,\n },\n restDelta: {\n granular: 0.005,\n default: 0.5,\n },\n\n // Limits\n minDuration: 0.01, // in seconds\n maxDuration: 10.0, // in seconds\n minDamping: 0.05,\n}\n\n/**\n * Maps bounce to a damping ratio as SwiftUI does: 0 is critically damped, and\n * it approaches undamped towards 1 and infinitely overdamped towards -1. Both\n * ends are limited so the spring still moves and settles.\n */\nconst bounceToDampingRatio = (bounce: number) =>\n bounce < 0\n ? 1 / Math.max(1 + bounce, springDefaults.minDamping)\n : Math.max(1 - bounce, springDefaults.minDamping)\n\n/**\n * Scales an overdamped spring's undamped frequency so that, at its defining\n * time, it has as far left to go as the critically damped spring that's\n * criticalFreqTime radians in by then. A negative bounce then changes the\n * shape of the curve, not when it arrives. 1 at a damping ratio of 1, so\n * there's no jump at a bounce of 0.\n *\n * Solved by Newton on the remaining distance (times fast - slow), which is\n * convex from criticalFreqTime onwards. criticalFreqTime is always below the\n * answer, so it converges from below without overshooting.\n */\nfunction overdampedFreqScale(dampingRatio: number, criticalFreqTime: number) {\n if (!(dampingRatio > 1)) return 1\n\n const root = Math.sqrt(dampingRatio * dampingRatio - 1)\n const slow = dampingRatio - root\n const fast = dampingRatio + root\n const target =\n 2 * root * Math.exp(-criticalFreqTime) * (1 + criticalFreqTime)\n\n return (\n approximateRoot(\n (freqTime) =>\n fast * Math.exp(-slow * freqTime) -\n slow * Math.exp(-fast * freqTime) -\n target,\n (freqTime) =>\n Math.exp(-fast * freqTime) - Math.exp(-slow * freqTime),\n criticalFreqTime\n ) / criticalFreqTime\n )\n}\n\nfunction calcAngularFreq(undampedFreq: number, dampingRatio: number) {\n return undampedFreq * Math.sqrt(1 - dampingRatio * dampingRatio)\n}\n\nconst rootIterations = 12\nfunction approximateRoot(\n envelope: (num: number) => number,\n derivative: (num: number) => number,\n initialGuess: number\n): number {\n let result = initialGuess\n for (let i = 1; i < rootIterations; i++) {\n result = result - envelope(result) / derivative(result)\n }\n return result\n}\n\n/**\n * This is ported from the Framer implementation of duration-based spring resolution.\n */\nconst safeMin = 0.001\n\n/**\n * Assumes zero initial velocity and the default mass: time-defined springs\n * ignore inherited velocity and only resolve without valid physics. Returns\n * NaN physics when the root search doesn't converge.\n */\nfunction findSpring({\n duration = springDefaults.duration,\n bounce = springDefaults.bounce,\n}: SpringOptions) {\n let envelope: (num: number) => number\n let derivative: (num: number) => number\n\n warning(\n duration <= secondsToMilliseconds(springDefaults.maxDuration),\n \"Spring duration must be 10 seconds or less\",\n \"spring-duration-limit\"\n )\n\n const dampingRatio = bounceToDampingRatio(bounce)\n\n duration = clamp(\n springDefaults.minDuration,\n springDefaults.maxDuration,\n millisecondsToSeconds(duration)\n )\n\n if (dampingRatio < 1) {\n /**\n * Underdamped spring\n */\n envelope = (undampedFreq) => {\n const exponentialDecay = undampedFreq * dampingRatio\n const delta = exponentialDecay * duration\n const b = calcAngularFreq(undampedFreq, dampingRatio)\n const c = Math.exp(-delta)\n return safeMin - (exponentialDecay / b) * c\n }\n\n derivative = (undampedFreq) => {\n const exponentialDecay = undampedFreq * dampingRatio\n const delta = exponentialDecay * duration\n const e =\n dampingRatio *\n dampingRatio *\n undampedFreq *\n undampedFreq *\n duration\n const f = Math.exp(-delta)\n const g = calcAngularFreq(undampedFreq * undampedFreq, dampingRatio)\n const factor = -envelope(undampedFreq) + safeMin > 0 ? -1 : 1\n return (factor * -e * f) / g\n }\n } else {\n /**\n * Critically-damped spring. Overdamped springs reuse this root,\n * scaled below.\n */\n envelope = (undampedFreq) => {\n const a = Math.exp(-undampedFreq * duration)\n const b = undampedFreq * duration + 1\n return -safeMin + a * b\n }\n\n derivative = (undampedFreq) => {\n const a = Math.exp(-undampedFreq * duration)\n const b = -undampedFreq * (duration * duration)\n return a * b\n }\n }\n\n const initialGuess = 5 / duration\n const criticalFreq = approximateRoot(envelope, derivative, initialGuess)\n const undampedFreq =\n criticalFreq *\n overdampedFreqScale(dampingRatio, criticalFreq * duration)\n const stiffness = undampedFreq * undampedFreq\n\n return {\n stiffness,\n damping: dampingRatio * 2 * Math.sqrt(stiffness),\n duration: secondsToMilliseconds(duration),\n }\n}\n\n/**\n * Spring physics must be finite. stiffness and mass are also divisors so must\n * be positive, whereas a damping of 0 is a valid, perpetually oscillating\n * spring. Relational rather than Number.isFinite so numeric strings still\n * coerce.\n */\nconst isValidPhysics = (value: number | undefined, canBeZero?: boolean) =>\n (canBeZero ? value! >= 0 : value! > 0) && value! < Infinity\n\n/**\n * Returns value if it's usable spring physics, otherwise undefined so callers\n * fall back to the default. An explicit `undefined`, e.g. from a forwarded\n * optional prop, must fall back too. Invalid physics would otherwise resolve\n * to NaN spring values that never report done.\n */\nfunction resolvePhysics(value: number | undefined, canBeZero?: boolean) {\n if (isValidPhysics(value, canBeZero)) return value\n\n if (process.env.NODE_ENV !== \"production\") {\n warning(\n value === undefined,\n \"Spring stiffness and mass must be positive, damping 0 or greater\",\n \"spring-invalid-physics\"\n )\n }\n\n return undefined\n}\n\nfunction getSpringOptions(options: SpringOptions) {\n /**\n * Resolve physics before choosing between physics- and duration-based\n * resolution, so an invalid stiffness doesn't also silently discard a\n * valid duration/bounce.\n */\n const validStiffness = resolvePhysics(options.stiffness)\n const validDamping = resolvePhysics(options.damping, true)\n const validMass = resolvePhysics(options.mass)\n\n const springOptions = {\n ...options,\n stiffness: validStiffness ?? springDefaults.stiffness,\n damping: validDamping ?? springDefaults.damping,\n mass: validMass ?? springDefaults.mass,\n isResolvedFromDuration: false,\n // stiffness/damping/mass overrides duration/bounce\n isTimeDefined:\n (validStiffness ?? validDamping ?? validMass) === undefined &&\n (options.duration !== undefined || options.bounce !== undefined),\n }\n\n if (springOptions.isTimeDefined) {\n if (options.visualDuration) {\n const dampingRatio = bounceToDampingRatio(options.bounce || 0)\n const root =\n ((2 * Math.PI) / (options.visualDuration * 1.2)) *\n overdampedFreqScale(dampingRatio, (2 * Math.PI) / 1.2)\n springOptions.stiffness = root * root\n springOptions.damping =\n 2 * dampingRatio * Math.sqrt(springOptions.stiffness)\n } else {\n Object.assign(springOptions, findSpring(springOptions))\n springOptions.isResolvedFromDuration = true\n }\n\n /**\n * Time options can degenerate: a NaN bounce gives a NaN damping, an\n * infinite visualDuration a 0 stiffness, and findSpring NaN for both\n * when it doesn't converge. Replace the two together, so the\n * relationship duration resolution establishes between them is never\n * left half-overwritten.\n */\n if (\n !isValidPhysics(springOptions.stiffness) ||\n !isValidPhysics(springOptions.damping, true)\n ) {\n springOptions.stiffness = springDefaults.stiffness\n springOptions.damping = springDefaults.damping\n }\n }\n\n return springOptions\n}\n\nfunction spring(\n optionsOrVisualDuration:\n | ValueAnimationOptions\n | number = springDefaults.visualDuration,\n bounce = springDefaults.bounce\n): KeyframeGenerator {\n const options =\n typeof optionsOrVisualDuration !== \"object\"\n ? ({\n visualDuration: optionsOrVisualDuration,\n keyframes: [0, 1],\n bounce,\n } as ValueAnimationOptions)\n : optionsOrVisualDuration\n\n const origin = options.keyframes[0]\n const target = options.keyframes[options.keyframes.length - 1]\n\n /**\n * This is the Iterator-spec return value. We ensure it's mutable rather than using a generator\n * to reduce GC during animation.\n */\n const state: AnimationState = { done: false, value: origin }\n\n const {\n stiffness,\n damping,\n mass,\n duration,\n isResolvedFromDuration,\n isTimeDefined,\n } = getSpringOptions({ ...options })\n\n /**\n * Time-defined springs ignore inherited velocity. Velocity from\n * interrupted animations causes massive oscillation on small-range\n * animations.\n */\n const inheritVelocity = (velocity: number) =>\n isTimeDefined ? 0 : -millisecondsToSeconds(velocity)\n\n const dampingRatio = damping / (2 * Math.sqrt(stiffness * mass))\n const undampedAngularFreq = millisecondsToSeconds(\n Math.sqrt(stiffness / mass)\n )\n const decay = dampingRatio * undampedAngularFreq\n\n /**\n * Everything that changes when the spring is retargeted: written by\n * retarget() and update(), read by the resolvers. Grouped on one object,\n * like the coefficients (c) below. Writing doubles to object fields\n * measured marginally faster than to captured let variables in optimised\n * code; neither allocates, so this is a grouping choice, not a GC one.\n */\n const s = {\n target,\n delta: target - origin,\n velocity: inheritVelocity(options.velocity || 0) || 0,\n restSpeed: 0,\n restDelta: 0,\n }\n\n /**\n * If we're working on a granular scale, use smaller defaults for determining\n * when the spring is finished.\n *\n * These defaults have been selected empirically based on what strikes a good\n * ratio between feeling good and finishing as soon as changes are imperceptible.\n */\n const setRestThresholds = () => {\n const isGranularScale = Math.abs(s.delta) < 5\n s.restSpeed =\n options.restSpeed ||\n (isGranularScale\n ? springDefaults.restSpeed.granular\n : springDefaults.restSpeed.default)\n s.restDelta =\n options.restDelta ||\n (isGranularScale\n ? springDefaults.restDelta.granular\n : springDefaults.restDelta.default)\n }\n setRestThresholds()\n\n let resolveSpring: (v: number) => number\n let resolveVelocity: (t: number) => number\n\n /**\n * Derives the coefficients that depend on origin, target and initial\n * velocity. Called once now and again whenever the spring is retargeted.\n */\n let update: VoidFunction\n\n if (dampingRatio < 1) {\n const angularFreq = calcAngularFreq(undampedAngularFreq, dampingRatio)\n\n /**\n * A is the position coefficient, sinC/cosC the coefficients of the\n * analytical derivative (px/ms). The exp/sin/cos terms depend only\n * on t, so they're memoized by t independently of the target: a\n * spring retargeted every frame samples the same t each frame and\n * skips the transcendentals entirely.\n */\n const c = { A: 0, sinC: 0, cosC: 0, t: -1, env: 0, sin: 0, cos: 0 }\n\n update = () => {\n c.A = (s.velocity + decay * s.delta) / angularFreq\n c.sinC = decay * c.A + s.delta * angularFreq\n c.cosC = decay * s.delta - c.A * angularFreq\n }\n\n const sample = (t: number) => {\n if (t !== c.t) {\n c.t = t\n c.env = Math.exp(-decay * t)\n c.sin = Math.sin(angularFreq * t)\n c.cos = Math.cos(angularFreq * t)\n }\n }\n\n // Underdamped spring\n resolveSpring = (t: number) => {\n sample(t)\n return s.target - c.env * (c.A * c.sin + s.delta * c.cos)\n }\n\n resolveVelocity = (t: number) => {\n sample(t)\n return c.env * (c.sinC * c.sin + c.cosC * c.cos)\n }\n } else if (dampingRatio === 1) {\n // Critically damped spring\n resolveSpring = (t: number) =>\n s.target -\n Math.exp(-undampedAngularFreq * t) *\n (s.delta + (s.velocity + undampedAngularFreq * s.delta) * t)\n\n // Analytical derivative of critically damped spring (px/ms)\n const c = { C: 0 }\n update = () => {\n c.C = s.velocity + undampedAngularFreq * s.delta\n }\n resolveVelocity = (t: number) =>\n Math.exp(-undampedAngularFreq * t) *\n (undampedAngularFreq * c.C * t - s.velocity)\n } else {\n /**\n * Overdamped spring: the sum of a slow and a fast decaying\n * exponential, so no term can overflow however heavily it's damped.\n */\n const dampedAngularFreq =\n undampedAngularFreq * Math.sqrt(dampingRatio * dampingRatio - 1)\n const slow = decay - dampedAngularFreq\n const fast = decay + dampedAngularFreq\n\n /**\n * Physics-defined springs keep a non-physical limit: once\n * dampedAngularFreq * t passes 300, both terms decay at the damping\n * rate. Heavily overdamped drag springs (dragElastic: 0,\n * dragTransition) rely on this to settle almost at once rather than\n * creep at stiffness / damping. Negative bounce needs the exact\n * curve, so time-defined springs are exempt.\n */\n const limit = isTimeDefined ? Infinity : 300 / dampedAngularFreq\n const decayAt = (rate: number, t: number) =>\n Math.exp(\n t > limit ? -rate * limit - decay * (t - limit) : -rate * t\n )\n\n const c = { S: 0, F: 0 }\n update = () => {\n const P = (s.velocity + decay * s.delta) / dampedAngularFreq\n c.S = (s.delta + P) / 2\n c.F = (s.delta - P) / 2\n }\n\n resolveSpring = (t: number) =>\n s.target - c.S * decayAt(slow, t) - c.F * decayAt(fast, t)\n\n // Analytical derivative of overdamped spring (px/ms)\n resolveVelocity = (t: number) =>\n slow * c.S * decayAt(slow, t) + fast * c.F * decayAt(fast, t)\n }\n\n update()\n\n const calculatedDuration = isResolvedFromDuration ? duration || null : null\n\n const generator = {\n calculatedDuration,\n /**\n * Aim the spring at a new target from its current position and\n * velocity, reusing the resolved physics and closures.\n */\n retarget: (keyframes: number[], newVelocity: number) => {\n s.target = keyframes[keyframes.length - 1]\n s.delta = s.target - keyframes[0]\n s.velocity = inheritVelocity(newVelocity)\n // Default thresholds depend on the scale of the new delta\n if (!(options.restSpeed && options.restDelta)) setRestThresholds()\n // Invalidate any duration lazily cached by JSAnimation\n generator.calculatedDuration = calculatedDuration\n state.done = false\n update()\n },\n velocity: (t: number) => secondsToMilliseconds(resolveVelocity(t)),\n next: (t: number) => {\n const current = resolveSpring(t)\n\n if (!isResolvedFromDuration) {\n const currentVelocity = secondsToMilliseconds(\n resolveVelocity(t)\n )\n state.done =\n Math.abs(currentVelocity) <= s.restSpeed &&\n Math.abs(s.target - current) <= s.restDelta\n } else {\n state.done = t >= duration!\n }\n\n state.value = state.done ? s.target : current\n\n return state\n },\n toString: () => {\n const easingDuration = Math.min(\n calcGeneratorDuration(generator),\n maxGeneratorDuration\n )\n\n const easing = generateLinearEasing(\n (progress: number) =>\n generator.next(easingDuration * progress).value,\n easingDuration,\n 30\n )\n\n return easingDuration + \"ms \" + easing\n },\n toTransition: () => {},\n }\n\n return generator\n}\n\nspring.applyToOptions = (options: Transition) => {\n const generatorOptions = createGeneratorEasing(options as any, 100, spring)\n\n options.ease = generatorOptions.ease\n options.duration = secondsToMilliseconds(generatorOptions.duration)\n options.type = \"keyframes\"\n return options\n}\n\nexport { spring }\n"],"names":[],"mappings":"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"}