{"version":3,"sources":["../../src/use-spring-value/index.ts"],"sourcesContent":["import { useRef } from 'react'\nimport { useLatest } from '../use-latest'\nimport { useRafLoop } from '../use-raf-loop'\nimport { useSafeState } from '../use-safe-state'\nimport { useStableFn } from '../use-stable-fn'\n\nimport type { Pausable } from '../use-pausable'\nimport type { UseRafLoopCallbackArgs } from '../use-raf-loop'\n\nexport interface UseSpringValueConfig {\n  /**\n   * The stiffness of the spring.\n   */\n  stiffness?: number\n  /**\n   * The damping of the spring.\n   */\n  damping?: number\n  /**\n   * The mass of the spring.\n   */\n  mass?: number\n  /**\n   * The precision of the spring.\n   */\n  immediate?: boolean\n  /**\n   * The precision of the spring.\n   */\n  precision?: number\n}\n\nexport interface UseSpringValueReturns extends Pausable {\n  /**\n   * The current value of the spring.\n   */\n  value: number\n  /**\n   * Restart the spring.\n   */\n  restart(): void\n}\n\n/**\n * A React Hook that returns a **spring value**.\n *\n * Spring Value: A dynamic value that simulate a spring physics changed with time.\n */\nexport function useSpringValue(start: number, end: number, config: UseSpringValueConfig = {}): UseSpringValueReturns {\n  const { stiffness = 220, damping = 50, mass = 1, precision = 0.01, immediate = true } = config\n\n  const [value, setValue] = useSafeState(start)\n  const velocityRef = useRef(0)\n  const latest = useLatest({ value, start, precision, stiffness, damping, mass, end })\n\n  const animate = useStableFn(({ delta }: UseRafLoopCallbackArgs) => {\n    const { stiffness, damping, value, precision, mass, end } = latest.current\n\n    const displacement = end - value\n    const springForce = displacement * stiffness\n    const dampingForce = -damping * velocityRef.current\n    const acceleration = (springForce + dampingForce) / mass\n\n    velocityRef.current += acceleration * (delta / 1000)\n    latest.current.value += velocityRef.current * (delta / 1000)\n\n    setValue(latest.current.value)\n\n    const shouldStop = Math.abs(displacement) < precision && Math.abs(velocityRef.current) < precision\n\n    if (shouldStop) {\n      setValue(end)\n      controls.pause()\n    }\n  })\n\n  const controls = useRafLoop(animate, { immediate })\n\n  const restart = useStableFn(() => {\n    controls.pause()\n    velocityRef.current = 0\n    setValue(latest.current.start)\n    controls.resume()\n  })\n\n  return { value, restart, ...controls }\n}\n"],"names":["useSpringValue","start","end","config","stiffness","damping","mass","precision","immediate","useSafeState","value","setValue","velocityRef","useRef","latest","useLatest","animate","useStableFn","delta","current","displacement","springForce","dampingForce","acceleration","shouldStop","Math","abs","controls","pause","useRafLoop","restart","resume"],"mappings":";;;;+BAgDgBA;;;eAAAA;;;qBAhDO;yBACG;0BACC;4BACE;2BACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CrB,SAASA,eAAeC,KAAa,EAAEC,GAAW;QAAEC,SAAAA,iEAA+B,CAAC;IACzF,wBAAwFA,OAAhFC,WAAAA,2CAAY,2CAAoED,OAA/DE,SAAAA,uCAAU,qCAAqDF,OAAjDG,MAAAA,iCAAO,sCAA0CH,OAAvCI,WAAAA,2CAAY,8CAA2BJ,OAArBK,WAAAA,2CAAY;IAE/E,IAA0BC,iCAAAA,IAAAA,0BAAY,EAACR,YAAhCS,QAAmBD,kBAAZE,WAAYF;IAC1B,IAAMG,cAAcC,IAAAA,aAAM,EAAC;IAC3B,IAAMC,SAASC,IAAAA,oBAAS,EAAC;QAAEL,OAAAA;QAAOT,OAAAA;QAAOM,WAAAA;QAAWH,WAAAA;QAAWC,SAAAA;QAASC,MAAAA;QAAMJ,KAAAA;IAAI;IAElF,IAAMc,UAAUC,IAAAA,wBAAW,EAAC;YAAGC,cAAAA;QAC7B,IAA4DJ,kBAAAA,OAAOK,OAAO,EAAlEf,YAAoDU,gBAApDV,WAAWC,UAAyCS,gBAAzCT,SAASK,QAAgCI,gBAAhCJ,OAAOH,YAAyBO,gBAAzBP,WAAWD,OAAcQ,gBAAdR,MAAMJ,QAAQY,gBAARZ;QAEpD,IAAMkB,eAAelB,QAAMQ;QAC3B,IAAMW,cAAcD,eAAehB;QACnC,IAAMkB,eAAe,CAACjB,UAAUO,YAAYO,OAAO;QACnD,IAAMI,eAAe,AAACF,CAAAA,cAAcC,YAAW,IAAKhB;QAEpDM,YAAYO,OAAO,IAAII,eAAgBL,CAAAA,QAAQ,IAAG;QAClDJ,OAAOK,OAAO,CAACT,KAAK,IAAIE,YAAYO,OAAO,GAAID,CAAAA,QAAQ,IAAG;QAE1DP,SAASG,OAAOK,OAAO,CAACT,KAAK;QAE7B,IAAMc,aAAaC,KAAKC,GAAG,CAACN,gBAAgBb,aAAakB,KAAKC,GAAG,CAACd,YAAYO,OAAO,IAAIZ;QAEzF,IAAIiB,YAAY;YACdb,SAAST;YACTyB,SAASC,KAAK;QAChB;IACF;IAEA,IAAMD,WAAWE,IAAAA,sBAAU,EAACb,SAAS;QAAER,WAAAA;IAAU;IAEjD,IAAMsB,UAAUb,IAAAA,wBAAW,EAAC;QAC1BU,SAASC,KAAK;QACdhB,YAAYO,OAAO,GAAG;QACtBR,SAASG,OAAOK,OAAO,CAAClB,KAAK;QAC7B0B,SAASI,MAAM;IACjB;IAEA,OAAO;QAAErB,OAAAA;QAAOoB,SAAAA;OAAYH;AAC9B"}