UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 8.83 kB
{"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":";;;;;;AAYA,MAAMA,YAAY,GAAGA,MAAM,KAAK,CAAA;AAEzB,MAAeC,aAAa,CAEjC;AA8BA;AACF;AACA;;AAEE;AACF;AACA;;EAGEC,WAAWA,CAAAC,IAAA,EAWkB;IAAA,IAXjB;MACVC,UAAU;MACVC,OAAO;AACPC,MAAAA,QAAQ,GAAG,GAAG;AACdC,MAAAA,KAAK,GAAG,CAAC;AACTC,MAAAA,MAAM,GAAGC,aAAa;AACtBC,MAAAA,OAAO,GAAGC,IAAI;AACdC,MAAAA,QAAQ,GAAGD,IAAI;AACfE,MAAAA,UAAU,GAAGF,IAAI;AACjBG,MAAAA,KAAK,GAAGd,YAAY;AACpBe,MAAAA,MAAAA;AACwB,KAAC,GAAAZ,IAAA,CAAA;AApC3B;AACF;AACA;AACA;AAHEa,IAAAA,eAAA,iBAMiC,SAAS,CAAA,CAAA;AAC1C;AACF;AACA;AACA;AAHEA,IAAAA,eAAA,2BAImB,CAAC,CAAA,CAAA;AACpB;AACF;AACA;AAFEA,IAAAA,eAAA,wBAGgB,CAAC,CAAA,CAAA;IAsBf,IAAI,CAACC,IAAI,GAAG,IAAI,CAACA,IAAI,CAACC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEhC,IAAI,CAACZ,QAAQ,GAAGA,QAAQ,CAAA;IACxB,IAAI,CAACC,KAAK,GAAGA,KAAK,CAAA;IAClB,IAAI,CAACC,MAAM,GAAGA,MAAM,CAAA;IACpB,IAAI,CAACW,QAAQ,GAAGT,OAAO,CAAA;IACvB,IAAI,CAACU,SAAS,GAAGR,QAAQ,CAAA;IACzB,IAAI,CAACS,WAAW,GAAGR,UAAU,CAAA;IAC7B,IAAI,CAACS,MAAM,GAAGR,KAAK,CAAA;IACnB,IAAI,CAACC,MAAM,GAAGA,MAAM,CAAA;IAEpB,IAAI,CAACX,UAAU,GAAGA,UAAU,CAAA;IAC5B,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAA;AACtB,IAAA,IAAI,CAACkB,KAAK,GAAG,IAAI,CAACnB,UAAU,CAAA;AAC5B,IAAA,IAAI,CAACoB,QAAQ,GAAGC,MAAM,CAACC,MAAM,CAAC,IAAI,CAACC,SAAS,CAAC,IAAI,CAACrB,QAAQ,CAAC,CAACiB,KAAK,CAAC,CAAA;AACpE,GAAA;EAEA,IAAIK,KAAKA,GAAG;IACV,OAAO,IAAI,CAACC,MAAM,CAAA;AACpB,GAAA;AAEAC,EAAAA,MAAMA,GAAG;IACP,OAAO,IAAI,CAACD,MAAM,KAAK,SAAS,IAAI,IAAI,CAACA,MAAM,KAAK,WAAW,CAAA;AACjE,GAAA;;AAEA;AACF;AACA;AACA;AACA;;AAMEE,EAAAA,KAAKA,GAAG;IACN,MAAMC,SAA+B,GAAIC,SAAS,IAAK;AACrD,MAAA,IAAI,IAAI,CAACJ,MAAM,KAAK,SAAS,EAAE,OAAA;MAC/B,IAAI,CAACK,SAAS,GAAGD,SAAS,IAAI,CAAC,IAAIE,IAAI,EAAE,CAAA;MACzC,IAAI,CAACN,MAAM,GAAG,SAAS,CAAA;MACvB,IAAI,CAACV,QAAQ,EAAE,CAAA;AACf,MAAA,IAAI,CAACF,IAAI,CAAC,IAAI,CAACiB,SAAS,CAAC,CAAA;KAC1B,CAAA;IAED,IAAI,CAACE,QAAQ,EAAE,CAAA;;AAEf;AACA;AACA,IAAA,IAAI,IAAI,CAAC7B,KAAK,GAAG,CAAC,EAAE;MAClB8B,UAAU,CAAC,MAAMC,gBAAgB,CAACN,SAAS,CAAC,EAAE,IAAI,CAACzB,KAAK,CAAC,CAAA;AAC3D,KAAC,MAAM;MACL+B,gBAAgB,CAACN,SAAS,CAAC,CAAA;AAC7B,KAAA;AACF,GAAA;EAEQf,IAAIA,CAACsB,CAAS,EAAE;AACtB,IAAA,MAAMC,UAAU,GAAG,CAACD,CAAC,IAAI,CAAC,IAAIJ,IAAI,EAAE,IAAI,IAAI,CAACD,SAAS,CAAA;IACtD,MAAMO,eAAe,GAAGC,IAAI,CAACC,GAAG,CAACH,UAAU,EAAE,IAAI,CAAClC,QAAQ,CAAC,CAAA;AAC3D,IAAA,IAAI,CAACsC,gBAAgB,GAAGH,eAAe,GAAG,IAAI,CAACnC,QAAQ,CAAA;IACvD,MAAM;MAAEiB,KAAK;AAAEsB,MAAAA,aAAAA;AAAc,KAAC,GAAG,IAAI,CAAClB,SAAS,CAACc,eAAe,CAAC,CAAA;IAChE,IAAI,CAAClB,KAAK,GAAGE,MAAM,CAACC,MAAM,CAACH,KAAK,CAAC,CAAA;IACjC,IAAI,CAACsB,aAAa,GAAGA,aAAa,CAAA;AAElC,IAAA,IAAI,IAAI,CAAChB,MAAM,KAAK,SAAS,EAAE;AAC7B,MAAA,OAAA;AACF,KAAC,MAAM,IACL,IAAI,CAACP,MAAM,CAAC,IAAI,CAACC,KAAK,EAAE,IAAI,CAACsB,aAAa,EAAE,IAAI,CAACD,gBAAgB,CAAC,EAClE;MACA,IAAI,CAACf,MAAM,GAAG,SAAS,CAAA;MACvB,IAAI,CAACiB,UAAU,EAAE,CAAA;AACnB,KAAC,MAAM,IAAIN,UAAU,IAAI,IAAI,CAAClC,QAAQ,EAAE;AACtC,MAAA,IAAI,CAACsC,gBAAgB,GAAG,IAAI,CAACC,aAAa,GAAG,CAAC,CAAA;AAC9C,MAAA,IAAI,CAACzB,SAAS,CAAC,IAAI,CAACI,QAAQ,EAAE,IAAI,CAACqB,aAAa,EAAE,IAAI,CAACD,gBAAgB,CAAC,CAAA;MACxE,IAAI,CAACf,MAAM,GAAG,WAAW,CAAA;AACzB,MAAA,IAAI,CAACR,WAAW,CACd,IAAI,CAACG,QAAQ,EACb,IAAI,CAACqB,aAAa,EAClB,IAAI,CAACD,gBACP,CAAC,CAAA;MACD,IAAI,CAACE,UAAU,EAAE,CAAA;AACnB,KAAC,MAAM;AACL,MAAA,IAAI,CAAC1B,SAAS,CAAC,IAAI,CAACG,KAAK,EAAE,IAAI,CAACsB,aAAa,EAAE,IAAI,CAACD,gBAAgB,CAAC,CAAA;AACrEN,MAAAA,gBAAgB,CAAC,IAAI,CAACrB,IAAI,CAAC,CAAA;AAC7B,KAAA;AACF,GAAA;AAEQmB,EAAAA,QAAQA,GAAG;AACjBW,IAAAA,iBAAiB,CAACC,IAAI,CAAC,IAAgC,CAAC,CAAA;AAC1D,GAAA;AAEQF,EAAAA,UAAUA,GAAG;AACnBC,IAAAA,iBAAiB,CAACE,MAAM,CAAC,IAAgC,CAAC,CAAA;AAC5D,GAAA;AAEAnC,EAAAA,KAAKA,GAAG;IACN,IAAI,CAACe,MAAM,GAAG,SAAS,CAAA;IACvB,IAAI,CAACiB,UAAU,EAAE,CAAA;AACnB,GAAA;AACF;;;;"}