'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var utils = require('@motionone/utils'); var defaults = require('./defaults.cjs.js'); var utils$1 = require('./utils.cjs.js'); var hasReachedTarget = require('../utils/has-reached-target.cjs.js'); var velocity = require('../utils/velocity.cjs.js'); const spring = ({ stiffness = defaults.defaults.stiffness, damping = defaults.defaults.damping, mass = defaults.defaults.mass, from = 0, to = 1, velocity: velocity$1 = 0.0, restSpeed, restDistance, } = {}) => { velocity$1 = velocity$1 ? utils.time.s(velocity$1) : 0.0; const state = { done: false, hasReachedTarget: false, current: from, target: to, }; const initialDelta = to - from; const undampedAngularFreq = Math.sqrt(stiffness / mass) / 1000; const dampingRatio = utils$1.calcDampingRatio(stiffness, damping, mass); const isGranularScale = Math.abs(initialDelta) < 5; restSpeed || (restSpeed = isGranularScale ? 0.01 : 2); restDistance || (restDistance = isGranularScale ? 0.005 : 0.5); let resolveSpring; if (dampingRatio < 1) { const angularFreq = undampedAngularFreq * Math.sqrt(1 - dampingRatio * dampingRatio); // Underdamped spring (bouncy) resolveSpring = (t) => to - Math.exp(-dampingRatio * undampedAngularFreq * t) * (((-velocity$1 + dampingRatio * undampedAngularFreq * initialDelta) / angularFreq) * Math.sin(angularFreq * t) + initialDelta * Math.cos(angularFreq * t)); } else { // Critically damped spring resolveSpring = (t) => { return (to - Math.exp(-undampedAngularFreq * t) * (initialDelta + (-velocity$1 + undampedAngularFreq * initialDelta) * t)); }; } return (t) => { state.current = resolveSpring(t); const currentVelocity = t === 0 ? velocity$1 : velocity.calcGeneratorVelocity(resolveSpring, t, state.current); const isBelowVelocityThreshold = Math.abs(currentVelocity) <= restSpeed; const isBelowDisplacementThreshold = Math.abs(to - state.current) <= restDistance; state.done = isBelowVelocityThreshold && isBelowDisplacementThreshold; state.hasReachedTarget = hasReachedTarget.hasReachedTarget(from, to, state.current); return state; }; }; exports.spring = spring;