{"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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"}