{"version":3,"file":"find.mjs","sources":["../../../../../src/animation/generators/spring/find.ts"],"sourcesContent":["import {\n    clamp,\n    millisecondsToSeconds,\n    secondsToMilliseconds,\n    warning,\n} from \"motion-utils\"\nimport { SpringOptions } from \"../../types\"\nimport { springDefaults } from \"./defaults\"\n\n/**\n * This is ported from the Framer implementation of duration-based spring resolution.\n */\n\ntype Resolver = (num: number) => number\n\nconst safeMin = 0.001\n\nexport function findSpring({\n    duration = springDefaults.duration,\n    bounce = springDefaults.bounce,\n    velocity = springDefaults.velocity,\n    mass = springDefaults.mass,\n}: SpringOptions) {\n    let envelope: Resolver\n    let derivative: Resolver\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 rootIterations = 12\nfunction approximateRoot(\n    envelope: Resolver,\n    derivative: Resolver,\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\nexport function calcAngularFreq(undampedFreq: number, dampingRatio: number) {\n    return undampedFreq * Math.sqrt(1 - dampingRatio * dampingRatio)\n}\n"],"names":[],"mappings":"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"}