{"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 springGenerator(\n    optionsOrVisualDuration:\n        | ValueAnimationOptions<number>\n        | number = springDefaults.visualDuration,\n    bounce = springDefaults.bounce\n): KeyframeGenerator<number> {\n    const options =\n        typeof optionsOrVisualDuration !== \"object\"\n            ? ({\n                  visualDuration: optionsOrVisualDuration,\n                  keyframes: [0, 1],\n                  bounce,\n              } as ValueAnimationOptions<number>)\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<number> = { 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\nconst spring = /* @__PURE__ */ Object.assign(springGenerator, {\n    applyToOptions: (options: Transition) => {\n        const generatorOptions = createGeneratorEasing(\n            options as any,\n            100,\n            springGenerator\n        )\n\n        options.ease = generatorOptions.ease\n        options.duration = secondsToMilliseconds(generatorOptions.duration)\n        options.type = \"keyframes\"\n        return options\n    },\n})\n\nexport { spring }\n"],"names":[],"mappings":"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"}