{"version":3,"file":"AnimationBase.mjs","sources":["../../../../src/util/animation/AnimationBase.ts"],"sourcesContent":["import { noop } from '../../constants';\nimport { requestAnimFrame } from './AnimationFrameProvider';\nimport { runningAnimations } from './AnimationRegistry';\nimport { defaultEasing } from './easing';\nimport type {\n  AnimationState,\n  TAbortCallback,\n  TBaseAnimationOptions,\n  TEasingFunction,\n  TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultAbort = () => false;\n\nexport abstract class AnimationBase<\n  T extends number | number[] = number | number[],\n> {\n  declare readonly startValue: T;\n  declare readonly endValue: T;\n  declare readonly duration: number;\n  declare readonly delay: number;\n\n  protected declare readonly byValue: T;\n  protected declare readonly easing: TEasingFunction<T>;\n\n  private declare readonly _onStart: VoidFunction;\n  private declare readonly _onChange: TOnAnimationChangeCallback<T, void>;\n  private declare readonly _onComplete: TOnAnimationChangeCallback<T, void>;\n  private declare readonly _abort: TAbortCallback<T>;\n\n  /**\n   * Used to register the animation to a target object\n   * so that it can be cancelled within the object context\n   */\n  declare readonly target?: unknown;\n\n  private _state: AnimationState = 'pending';\n  /**\n   * Time %, or the ratio of `timeElapsed / duration`\n   * @see tick\n   */\n  durationProgress = 0;\n  /**\n   * Value %, or the ratio of `(currentValue - startValue) / (endValue - startValue)`\n   */\n  valueProgress = 0;\n  /**\n   * Current value\n   */\n  declare value: T;\n  /**\n   * Animation start time ms\n   */\n  private declare startTime: number;\n\n  constructor({\n    startValue,\n    byValue,\n    duration = 500,\n    delay = 0,\n    easing = defaultEasing,\n    onStart = noop,\n    onChange = noop,\n    onComplete = noop,\n    abort = defaultAbort,\n    target,\n  }: TBaseAnimationOptions<T>) {\n    this.tick = this.tick.bind(this);\n\n    this.duration = duration;\n    this.delay = delay;\n    this.easing = easing;\n    this._onStart = onStart;\n    this._onChange = onChange;\n    this._onComplete = onComplete;\n    this._abort = abort;\n    this.target = target;\n\n    this.startValue = startValue;\n    this.byValue = byValue;\n    this.value = this.startValue;\n    this.endValue = Object.freeze(this.calculate(this.duration).value);\n  }\n\n  get state() {\n    return this._state;\n  }\n\n  isDone() {\n    return this._state === 'aborted' || this._state === 'completed';\n  }\n\n  /**\n   * Calculate the current value based on the easing parameters\n   * @param timeElapsed in ms\n   * @protected\n   */\n  protected abstract calculate(timeElapsed: number): {\n    value: T;\n    valueProgress: number;\n  };\n\n  start() {\n    const firstTick: FrameRequestCallback = (timestamp) => {\n      if (this._state !== 'pending') return;\n      this.startTime = timestamp || +new Date();\n      this._state = 'running';\n      this._onStart();\n      this.tick(this.startTime);\n    };\n\n    this.register();\n\n    // setTimeout(cb, 0) will run cb on the next frame, causing a delay\n    // we don't want that\n    if (this.delay > 0) {\n      setTimeout(() => requestAnimFrame(firstTick), this.delay);\n    } else {\n      requestAnimFrame(firstTick);\n    }\n  }\n\n  private tick(t: number) {\n    const durationMs = (t || +new Date()) - this.startTime;\n    const boundDurationMs = Math.min(durationMs, this.duration);\n    this.durationProgress = boundDurationMs / this.duration;\n    const { value, valueProgress } = this.calculate(boundDurationMs);\n    this.value = Object.freeze(value);\n    this.valueProgress = valueProgress;\n\n    if (this._state === 'aborted') {\n      return;\n    } else if (\n      this._abort(this.value, this.valueProgress, this.durationProgress)\n    ) {\n      this._state = 'aborted';\n      this.unregister();\n    } else if (durationMs >= this.duration) {\n      this.durationProgress = this.valueProgress = 1;\n      this._onChange(this.endValue, this.valueProgress, this.durationProgress);\n      this._state = 'completed';\n      this._onComplete(\n        this.endValue,\n        this.valueProgress,\n        this.durationProgress,\n      );\n      this.unregister();\n    } else {\n      this._onChange(this.value, this.valueProgress, this.durationProgress);\n      requestAnimFrame(this.tick);\n    }\n  }\n\n  private register() {\n    runningAnimations.push(this as unknown as AnimationBase);\n  }\n\n  private unregister() {\n    runningAnimations.remove(this as unknown as AnimationBase);\n  }\n\n  abort() {\n    this._state = 'aborted';\n    this.unregister();\n  }\n}\n"],"names":["defaultAbort","AnimationBase","constructor","_ref","startValue","byValue","duration","delay","easing","defaultEasing","onStart","noop","onChange","onComplete","abort","target","_defineProperty","tick","bind","_onStart","_onChange","_onComplete","_abort","value","endValue","Object","freeze","calculate","state","_state","isDone","start","firstTick","timestamp","startTime","Date","register","setTimeout","requestAnimFrame","t","durationMs","boundDurationMs","Math","min","durationProgress","valueProgress","unregister","runningAnimations","push","remove"],"mappings":"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"}