{"version":3,"file":"ColorAnimation.min.mjs","names":[],"sources":["../../../../src/util/animation/ColorAnimation.ts"],"sourcesContent":["import { Color } from '../../color/Color';\nimport type { TRGBAColorSource } from '../../color/typedefs';\nimport { halfPI } from '../../constants';\nimport { capValue } from '../misc/capValue';\nimport { AnimationBase } from './AnimationBase';\nimport type {\n  ColorAnimationOptions,\n  TEasingFunction,\n  TOnAnimationChangeCallback,\n} from './types';\n\nconst defaultColorEasing: TEasingFunction = (\n  timeElapsed,\n  startValue,\n  byValue,\n  duration,\n) => {\n  const durationProgress = 1 - Math.cos((timeElapsed / duration) * halfPI);\n  return startValue + byValue * durationProgress;\n};\n\nconst wrapColorCallback = <R>(\n  callback?: TOnAnimationChangeCallback<string, R>,\n) =>\n  callback &&\n  ((rgba: TRGBAColorSource, valueProgress: number, durationProgress: number) =>\n    callback(new Color(rgba).toRgba(), valueProgress, durationProgress));\n\nexport class ColorAnimation extends AnimationBase<TRGBAColorSource> {\n  constructor({\n    startValue,\n    endValue,\n    easing = defaultColorEasing,\n    onChange,\n    onComplete,\n    abort,\n    ...options\n  }: ColorAnimationOptions) {\n    const startColor = new Color(startValue).getSource();\n    const endColor = new Color(endValue).getSource();\n    super({\n      ...options,\n      startValue: startColor,\n      byValue: endColor.map(\n        (value, i) => value - startColor[i],\n      ) as TRGBAColorSource,\n      easing,\n      onChange: wrapColorCallback(onChange),\n      onComplete: wrapColorCallback(onComplete),\n      abort: wrapColorCallback(abort),\n    });\n  }\n  protected calculate(timeElapsed: number) {\n    const [r, g, b, a] = this.startValue.map((value, i) =>\n      this.easing(timeElapsed, value, this.byValue[i], this.duration, i),\n    ) as TRGBAColorSource;\n    const value = [\n      ...[r, g, b].map(Math.round),\n      capValue(0, a, 1),\n    ] as TRGBAColorSource;\n    return {\n      value,\n      valueProgress:\n        // to correctly calculate the change ratio we must find a changed value\n        value\n          .map((p, i) =>\n            this.byValue[i] !== 0\n              ? Math.abs((p - this.startValue[i]) / this.byValue[i])\n              : 0,\n          )\n          .find((p) => p !== 0) || 0,\n    };\n  }\n}\n"],"mappings":"+MAWA,MAAM,GACJ,EACA,EACA,EACA,IAGO,EAAa,GADK,EAAI,KAAK,IAAK,EAAc,EAAY,EAAA,EAI7D,EACJ,GAEA,KACE,EAAwB,EAAuB,IAC/C,EAAS,IAAI,EAAM,EAAA,CAAM,QAAA,CAAU,EAAe,EAAA,EAEtD,IAAa,EAAb,cAAoC,CAAA,CAClC,YAAA,CAAY,WACV,EAAA,SACA,EAAA,OACA,EAAS,EAAA,SACT,EAAA,WACA,EAAA,MACA,EAAA,GACG,GAAA,CAEH,IAAM,EAAa,IAAI,EAAM,EAAA,CAAY,WAAA,CACnC,EAAW,IAAI,EAAM,EAAA,CAAU,WAAA,CACrC,MAAM,CAAA,GACD,EACH,WAAY,EACZ,QAAS,EAAS,KACf,EAAO,IAAM,EAAQ,EAAW,GAAA,CAEnC,OAAA,EACA,SAAU,EAAkB,EAAA,CAC5B,WAAY,EAAkB,EAAA,CAC9B,MAAO,EAAkB,EAAA,CAAA,CAAA,CAG7B,UAAoB,EAAA,CAClB,GAAA,CAAO,EAAG,EAAG,EAAG,GAAK,KAAK,WAAW,KAAK,EAAO,IAC/C,KAAK,OAAO,EAAa,EAAO,KAAK,QAAQ,GAAI,KAAK,SAAU,EAAA,CAAA,CAE5D,EAAQ,CAAA,GACT,CAAC,EAAG,EAAG,EAAA,CAAG,IAAI,KAAK,MAAA,CACtB,EAAS,EAAG,EAAG,EAAA,CAAA,CAEjB,MAAO,CACL,MAAA,EACA,cAEE,EACG,KAAK,EAAG,IACP,KAAK,QAAQ,KAAO,EAEhB,EADA,KAAK,KAAK,EAAI,KAAK,WAAW,IAAM,KAAK,QAAQ,GAAA,CACjD,CAEL,KAAM,GAAM,IAAM,EAAN,EAAY,EAAA,GAAA,OAAA,KAAA"}