{"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    velocity: 0.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    maxDamping: 1,\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\nfunction findSpring({\n    duration = springDefaults.duration,\n    bounce = springDefaults.bounce,\n    velocity = springDefaults.velocity,\n    mass = springDefaults.mass,\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    let dampingRatio = 1 - bounce\n\n    /**\n     * Restrict dampingRatio and duration to within acceptable ranges.\n     */\n    dampingRatio = clamp(\n        springDefaults.minDamping,\n        springDefaults.maxDamping,\n        dampingRatio\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 a = exponentialDecay - velocity\n            const b = calcAngularFreq(undampedFreq, dampingRatio)\n            const c = Math.exp(-delta)\n            return safeMin - (a / b) * c\n        }\n\n        derivative = (undampedFreq) => {\n            const exponentialDecay = undampedFreq * dampingRatio\n            const delta = exponentialDecay * duration\n            const d = delta * velocity + velocity\n            const e =\n                Math.pow(dampingRatio, 2) * Math.pow(undampedFreq, 2) * duration\n            const f = Math.exp(-delta)\n            const g = calcAngularFreq(Math.pow(undampedFreq, 2), dampingRatio)\n            const factor = -envelope(undampedFreq) + safeMin > 0 ? -1 : 1\n            return (factor * ((d - e) * f)) / g\n        }\n    } else {\n        /**\n         * Critically-damped spring\n         */\n        envelope = (undampedFreq) => {\n            const a = Math.exp(-undampedFreq * duration)\n            const b = (undampedFreq - velocity) * duration + 1\n            return -safeMin + a * b\n        }\n\n        derivative = (undampedFreq) => {\n            const a = Math.exp(-undampedFreq * duration)\n            const b = (velocity - undampedFreq) * (duration * duration)\n            return a * b\n        }\n    }\n\n    const initialGuess = 5 / duration\n    const undampedFreq = approximateRoot(envelope, derivative, initialGuess)\n\n    duration = secondsToMilliseconds(duration)\n    if (isNaN(undampedFreq)) {\n        return {\n            stiffness: springDefaults.stiffness,\n            damping: springDefaults.damping,\n            duration,\n        }\n    } else {\n        const stiffness = Math.pow(undampedFreq, 2) * mass\n        return {\n            stiffness,\n            damping: dampingRatio * 2 * Math.sqrt(mass * stiffness),\n            duration,\n        }\n    }\n}\n\nconst durationKeys = [\"duration\", \"bounce\"]\nconst physicsKeys = [\"stiffness\", \"damping\", \"mass\"]\n\nfunction isSpringType(options: SpringOptions, keys: string[]) {\n    return keys.some((key) => (options as any)[key] !== undefined)\n}\n\nfunction getSpringOptions(options: SpringOptions) {\n    let springOptions = {\n        velocity: springDefaults.velocity,\n        stiffness: springDefaults.stiffness,\n        damping: springDefaults.damping,\n        mass: springDefaults.mass,\n        isResolvedFromDuration: false,\n        ...options,\n    }\n    // stiffness/damping/mass overrides duration/bounce\n    if (\n        !isSpringType(options, physicsKeys) &&\n        isSpringType(options, durationKeys)\n    ) {\n        // Time-defined springs should ignore inherited velocity.\n        // Velocity from interrupted animations can cause findSpring()\n        // to compute wildly different spring parameters, leading to\n        // massive oscillation on small-range animations.\n        springOptions.velocity = 0\n\n        if (options.visualDuration) {\n            const visualDuration = options.visualDuration\n            const root = (2 * Math.PI) / (visualDuration * 1.2)\n            const stiffness = root * root\n            const damping =\n                2 *\n                clamp(0.05, 1, 1 - (options.bounce || 0)) *\n                Math.sqrt(stiffness)\n\n            springOptions = {\n                ...springOptions,\n                mass: springDefaults.mass,\n                stiffness,\n                damping,\n            }\n        } else {\n            const derived = findSpring({ ...options, velocity: 0 })\n\n            springOptions = {\n                ...springOptions,\n                ...derived,\n                mass: springDefaults.mass,\n            }\n            springOptions.isResolvedFromDuration = true\n        }\n    }\n\n    return springOptions\n}\n\nfunction spring(\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    let { restSpeed, restDelta } = options\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        velocity,\n        isResolvedFromDuration,\n    } = getSpringOptions({\n        ...options,\n        velocity: -millisecondsToSeconds(options.velocity || 0),\n    })\n\n    const initialVelocity = velocity || 0.0\n    const dampingRatio = damping / (2 * Math.sqrt(stiffness * mass))\n\n    const initialDelta = target - origin\n    const undampedAngularFreq = millisecondsToSeconds(\n        Math.sqrt(stiffness / mass)\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 emprically based on what strikes a good\n     * ratio between feeling good and finishing as soon as changes are imperceptible.\n     */\n    const isGranularScale = Math.abs(initialDelta) < 5\n    restSpeed ||= isGranularScale\n        ? springDefaults.restSpeed.granular\n        : springDefaults.restSpeed.default\n    restDelta ||= isGranularScale\n        ? springDefaults.restDelta.granular\n        : springDefaults.restDelta.default\n\n    let resolveSpring: (v: number) => number\n    let resolveVelocity: (t: number) => number\n\n    // Underdamped coefficients, hoisted for use in the inlined next() hot path\n    let angularFreq: number\n    let A: number\n    let sinCoeff: number\n    let cosCoeff: number\n\n    if (dampingRatio < 1) {\n        angularFreq = calcAngularFreq(undampedAngularFreq, dampingRatio)\n\n        A =\n            (initialVelocity +\n                dampingRatio * undampedAngularFreq * initialDelta) /\n            angularFreq\n\n        // Underdamped spring\n        resolveSpring = (t: number) => {\n            const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t)\n\n            return (\n                target -\n                envelope *\n                    (A * Math.sin(angularFreq * t) +\n                        initialDelta * Math.cos(angularFreq * t))\n            )\n        }\n\n        // Analytical derivative of underdamped spring (px/ms)\n        sinCoeff =\n            dampingRatio * undampedAngularFreq * A + initialDelta * angularFreq\n        cosCoeff =\n            dampingRatio * undampedAngularFreq * initialDelta - A * angularFreq\n        resolveVelocity = (t: number) => {\n            const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t)\n            return envelope *\n                (sinCoeff * Math.sin(angularFreq * t) +\n                    cosCoeff * Math.cos(angularFreq * t))\n        }\n    } else if (dampingRatio === 1) {\n        // Critically damped spring\n        resolveSpring = (t: number) =>\n            target -\n            Math.exp(-undampedAngularFreq * t) *\n                (initialDelta +\n                    (initialVelocity + undampedAngularFreq * initialDelta) * t)\n\n        // Analytical derivative of critically damped spring (px/ms)\n        const C = initialVelocity + undampedAngularFreq * initialDelta\n        resolveVelocity = (t: number) =>\n            Math.exp(-undampedAngularFreq * t) *\n                (undampedAngularFreq * C * t - initialVelocity)\n    } else {\n        // Overdamped spring\n        const dampedAngularFreq =\n            undampedAngularFreq * Math.sqrt(dampingRatio * dampingRatio - 1)\n\n        resolveSpring = (t: number) => {\n            const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t)\n\n            // When performing sinh or cosh values can hit Infinity so we cap them here\n            const freqForT = Math.min(dampedAngularFreq * t, 300)\n\n            return (\n                target -\n                (envelope *\n                    ((initialVelocity +\n                        dampingRatio * undampedAngularFreq * initialDelta) *\n                        Math.sinh(freqForT) +\n                        dampedAngularFreq *\n                            initialDelta *\n                            Math.cosh(freqForT))) /\n                    dampedAngularFreq\n            )\n        }\n\n        // Analytical derivative of overdamped spring (px/ms)\n        const P =\n            (initialVelocity +\n                dampingRatio * undampedAngularFreq * initialDelta) /\n            dampedAngularFreq\n        const sinhCoeff =\n            dampingRatio * undampedAngularFreq * P - initialDelta * dampedAngularFreq\n        const coshCoeff =\n            dampingRatio * undampedAngularFreq * initialDelta - P * dampedAngularFreq\n        resolveVelocity = (t: number) => {\n            const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t)\n            const freqForT = Math.min(dampedAngularFreq * t, 300)\n            return envelope *\n                (sinhCoeff * Math.sinh(freqForT) +\n                    coshCoeff * Math.cosh(freqForT))\n        }\n    }\n\n    const generator = {\n        calculatedDuration: isResolvedFromDuration ? duration || null : null,\n        velocity: (t: number) => secondsToMilliseconds(resolveVelocity(t)),\n        next: (t: number) => {\n            /**\n             * For underdamped physics springs we need both position and\n             * velocity each tick. Compute shared trig values once to avoid\n             * duplicate Math.exp/sin/cos calls on the hot path.\n             */\n            if (!isResolvedFromDuration && dampingRatio < 1) {\n                const envelope = Math.exp(\n                    -dampingRatio * undampedAngularFreq * t\n                )\n                const sin = Math.sin(angularFreq * t)\n                const cos = Math.cos(angularFreq * t)\n\n                const current =\n                    target -\n                    envelope *\n                        (A * sin + initialDelta * cos)\n                const currentVelocity = secondsToMilliseconds(\n                    envelope *\n                        (sinCoeff * sin + cosCoeff * cos)\n                )\n\n                state.done =\n                    Math.abs(currentVelocity) <= restSpeed! &&\n                    Math.abs(target - current) <= restDelta!\n                state.value = state.done ? target : current\n\n                return state\n            }\n\n            const current = resolveSpring(t)\n\n            if (!isResolvedFromDuration) {\n                const currentVelocity = secondsToMilliseconds(\n                    resolveVelocity(t)\n                )\n                state.done =\n                    Math.abs(currentVelocity) <= restSpeed! &&\n                    Math.abs(target - current) <= restDelta!\n            } else {\n                state.done = t >= duration!\n            }\n\n            state.value = state.done ? target : current\n\n            return state\n        },\n        toString: () => {\n            const calculatedDuration = Math.min(\n                calcGeneratorDuration(generator),\n                maxGeneratorDuration\n            )\n\n            const easing = generateLinearEasing(\n                (progress: number) =>\n                    generator.next(calculatedDuration * progress).value,\n                calculatedDuration,\n                30\n            )\n\n            return calculatedDuration + \"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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"}