@ue-too/animate 0.9.5 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js.map CHANGED
@@ -2,10 +2,10 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/animatable-attribute.ts", "../src/composite-animation.ts"],
4
4
  "sourcesContent": [
5
- "import { PointCal, Point } from \"@ue-too/math\";\n\nexport type Keyframe<T> = {\n percentage: number; // from 0 to 1;\n value: T;\n easingFn?: (percentage: number) => number;\n}\n\nexport interface AnimatableAttributeHelper<T> {\n lerp(ratio: number, start: Keyframe<T>, end: Keyframe<T>): T;\n}\n\nexport const pointHelperFunctions: AnimatableAttributeHelper<Point> = {\n lerp: (ratio: number, start: Keyframe<Point>, end: Keyframe<Point>): Point => {\n const inbetweenRatio = (ratio - start.percentage) / (end.percentage - start.percentage);\n let transformed = inbetweenRatio;\n if(start.easingFn){\n transformed = start.easingFn(inbetweenRatio);\n }\n const res = PointCal.addVector(start.value, PointCal.multiplyVectorByScalar(PointCal.subVector(end.value, start.value), transformed));\n return res;\n }\n};\n\nexport class PointAnimationHelper implements AnimatableAttributeHelper<Point> {\n\n constructor(){\n\n }\n\n lerp(ratio: number, start: Keyframe<Point>, end: Keyframe<Point>): Point {\n const inbetweenRatio = (ratio - start.percentage) / (end.percentage - start.percentage);\n let transformed = inbetweenRatio;\n if(start.easingFn){\n transformed = start.easingFn(inbetweenRatio);\n }\n const res = PointCal.addVector(start.value, PointCal.multiplyVectorByScalar(PointCal.subVector(end.value, start.value), transformed));\n return res;\n }\n\n}\n\nexport const numberHelperFunctions: AnimatableAttributeHelper<number> = {\n lerp: (ratio: number, start: Keyframe<number>, end: Keyframe<number>): number => {\n const inbetweenRatio = (ratio - start.percentage) / (end.percentage - start.percentage);\n let transformed = inbetweenRatio;\n if(start.easingFn){\n transformed = start.easingFn(inbetweenRatio);\n }\n const res = start.value + transformed * (end.value - start.value);\n return res;\n }\n}\n\nexport class NumberAnimationHelper implements AnimatableAttributeHelper<number>{\n\n constructor(){\n\n }\n\n lerp(ratio: number, start: Keyframe<number>, end: Keyframe<number>): number {\n const inbetweenRatio = (ratio - start.percentage) / (end.percentage - start.percentage);\n let transformed = inbetweenRatio;\n if(start.easingFn){\n transformed = start.easingFn(inbetweenRatio);\n }\n const res = start.value + transformed * (end.value - start.value);\n return res;\n }\n}\n\nexport const stringHelperFunctions: AnimatableAttributeHelper<string> = {\n lerp: (ratio: number, start: Keyframe<string>, end: Keyframe<string>): string => {\n const percentageScale = (ratio - start.percentage) / (end.percentage - start.percentage)\n // if percentageScale is negative that means it's before the start value just return start value \n // if percentageScale is more than 1 that means it's after the end value just return the end value\n // if percentageScale is less than 0.5 return the start value else return the end value\n return percentageScale < 0 || percentageScale < 0.5 ? start.value : end.value;\n }\n}\n\nexport class StringAnimationHelper implements AnimatableAttributeHelper<string>{\n constructor(){\n\n }\n \n lerp(ratio: number, start: Keyframe<string>, end: Keyframe<string>): string {\n const percentageScale = (ratio - start.percentage) / (end.percentage - start.percentage)\n // if percentageScale is negative that means it's before the start value just return start value \n // if percentageScale is more than 1 that means it's after the end value just return the end value\n // if percentageScale is less than 0.5 return the start value else return the end value\n return percentageScale < 0 || percentageScale < 0.5 ? start.value : end.value;\n }\n}\n\nexport const integerHelperFunctions: AnimatableAttributeHelper<number> = {\n lerp: (ratio: number, start: Keyframe<number>, end: Keyframe<number>): number => {\n const percentageScale = (ratio - start.percentage) / (end.percentage - start.percentage)\n // if percentageScale is negative that means it's before the start value just return start value \n // if percentageScale is more than 1 that means it's after the end value just return the end value\n // if percentageScale is less than 0.5 return the start value else return the end value\n return percentageScale < 0 || percentageScale < 0.5 ? start.value : end.value;\n }\n}\n\nexport class IntegerAnimationHelper implements AnimatableAttributeHelper<number>{\n constructor(){\n\n }\n\n lerp(ratio: number, start: Keyframe<number>, end: Keyframe<number>): number {\n const percentageScale = (ratio - start.percentage) / (end.percentage - start.percentage)\n // if percentageScale is negative that means it's before the start value just return start value \n // if percentageScale is more than 1 that means it's after the end value just return the end value\n // if percentageScale is less than 0.5 return the start value else return the end value\n return percentageScale < 0 || percentageScale < 0.5 ? start.value : end.value;\n }\n}\n\nexport type RGB = {r: number, g: number, b: number};\n\nexport const rgbHelperFunctions: AnimatableAttributeHelper<RGB> = {\n lerp: (ratio: number, start: Keyframe<RGB>, end: Keyframe<RGB>): RGB => {\n const res = {\n r: start.value.r + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.r - start.value.r),\n g: start.value.g + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.g - start.value.g),\n b: start.value.b + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.b - start.value.b),\n }\n return res;\n }\n}\n\nexport class RGBAnimationHelper implements AnimatableAttributeHelper<RGB> {\n constructor(){\n\n }\n\n lerp(ratio: number, start: Keyframe<RGB>, end: Keyframe<RGB>): RGB {\n const res = {\n r: start.value.r + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.r - start.value.r),\n g: start.value.g + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.g - start.value.g),\n b: start.value.b + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.b - start.value.b),\n }\n return res;\n }\n}\n",
6
- "import { AnimatableAttributeHelper, Keyframe } from \"./animatable-attribute\";\n\n\nexport const linear = (percentage: number) => {\n return percentage;\n}\n\nexport interface Animator{\n loops: boolean;\n duration: number;\n delay: number;\n drag: number;\n nonCascadingDuration(newDuration: number): void;\n start(): void;\n stop(): void;\n pause(): void;\n resume(): void;\n animate(deltaTime: number): void;\n setUp(): void;\n resetAnimationState(): void;\n tearDown(): void;\n setParent(parent: AnimatorContainer): void;\n detachParent(): void;\n toggleReverse(reverse: boolean): void;\n onEnd(callback: Function): UnSubscribe;\n onStart(callback: Function): UnSubscribe;\n clearOnStart(): void;\n clearOnEnd(): void;\n maxLoopCount: number | undefined;\n playing: boolean;\n}\n\nexport type UnSubscribe = () => void;\n\nexport interface AnimatorContainer {\n updateDuration(): void;\n checkCyclicChildren(): boolean;\n containsAnimation(animationInInterest: Animator): boolean;\n}\n\nexport class CompositeAnimation implements Animator, AnimatorContainer{\n\n private animations: Map<string, {animator: Animator, startTime?: number}>;\n private localTime: number;\n private _duration: number;\n private onGoing: boolean;\n private loop: boolean;\n private playedTime: number;\n private setUpFn: Function;\n private tearDownFn: Function;\n private _dragTime: number;\n private _delayTime: number;\n private parent: AnimatorContainer | undefined;\n private _maxLoopCount: number | undefined;\n\n private endCallbacks: Function[] = [];\n private startCallbacks: Function[] = [];\n\n private reverse: boolean;\n\n constructor(animations: Map<string, {animator: Animator, startTime?: number}> = new Map(), loop: boolean = false, parent: AnimatorContainer | undefined = undefined, setupFn: Function = ()=>{}, tearDownFn: Function = ()=>{}){\n this.animations = animations;\n this._duration = 0;\n this.calculateDuration();\n this.localTime = -1;\n this.onGoing = false;\n this.loop = loop;\n this.setUpFn = setupFn;\n this.tearDownFn = tearDownFn;\n this._delayTime = 0;\n this._dragTime = 0;\n this.parent = parent;\n this.animations.forEach((animation) => {\n animation.animator.setParent(this);\n });\n this.reverse = false;\n this.playedTime = 0;\n }\n\n toggleReverse(reverse: boolean){\n if(this.reverse == reverse){\n return;\n }\n this.reverse = reverse;\n this.animations.forEach((animation) => {\n animation.animator.toggleReverse(reverse);\n });\n }\n \n setParent(parent: AnimatorContainer){\n this.parent = parent;\n }\n\n detachParent(){\n this.parent = undefined;\n }\n\n animate(deltaTime: number): void {\n if(!this.onGoing || this.localTime > this._duration + this._delayTime + this._dragTime || this.localTime < 0 || this.animations.size == 0){\n return;\n }\n this.localTime += deltaTime;\n if (this.localTime - deltaTime <= 0 && deltaTime > 0){\n // console.log(\"composite animation start\");\n this.startCallbacks.forEach((callback) => {\n queueMicrotask(()=>{callback()});\n });\n }\n this.animateChildren(deltaTime);\n this.checkTerminalAndLoop();\n }\n\n checkTerminalAndLoop(){\n if(this.localTime >= this._duration + this._delayTime + this._dragTime){\n // console.log(\"composite animation end\");\n this.playedTime += 1;\n this.endCallbacks.forEach((callback) => {\n queueMicrotask(()=>{callback()});\n });\n if(!this.loops || (this.maxLoopCount != undefined && this.playedTime >= this.maxLoopCount)){\n // this.onGoing = false;\n this.stop();\n } else {\n // if loop is true and current loop is not the last loop, then prepare to start the animations again\n // this.onGoing = true;\n // this.localTime = 0;\n // this.animations.forEach((animation) => {\n // if(animation.animator.loops){\n // animation.animator.startAnimation();\n // }\n // });\n this.start();\n }\n }\n }\n\n animateChildren(deltaTime: number){\n const prevLocalTime = this.localTime - deltaTime;\n if(this.localTime < this._delayTime){\n return;\n }\n this.animations.forEach((animation, name: string) => {\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n if(!this.childShouldAnimate(animation, prevLocalTime)){\n this.wrapUpAnimator({animator: animation.animator, startTime: animation.startTime, name: name}, prevLocalTime);\n return;\n }\n if(prevLocalTime - this._delayTime < animation.startTime){\n animation.animator.animate(this.localTime - this._delayTime - animation.startTime);\n } else {\n animation.animator.animate(deltaTime);\n }\n });\n }\n\n childShouldAnimate(animation: {animator: Animator, startTime?: number}, prevLocalTime: number): boolean{\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n if(this.localTime - this._delayTime >= animation.startTime && this.localTime - this._delayTime <= animation.startTime + animation.animator.duration){\n return true;\n }\n return false;\n }\n\n wrapUpAnimator(animation: {animator: Animator, startTime?: number, name: string}, prevLocalTime: number){\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n if(this.localTime - this._delayTime > animation.startTime + animation.animator.duration && prevLocalTime - this._delayTime < animation.startTime + animation.animator.duration){\n // console.log(\"wrap up\", animation.name);\n // console.log(\"time remaining\", animation.startTime + animation.animator.duration - (prevLocalTime - this._delayTime));\n \n animation.animator.animate(animation.startTime + animation.animator.duration - (prevLocalTime - this._delayTime));\n }\n }\n\n pause(): void {\n this.onGoing = false;\n this.animations.forEach((animation) => {\n animation.animator.pause();\n });\n }\n\n resume(): void {\n this.onGoing = true;\n this.animations.forEach((animation) => {\n animation.animator.resume();\n });\n }\n\n start(): void {\n this.onGoing = true;\n this.setUp();\n this.localTime = 0;\n this.animations.forEach((animation) => {\n animation.animator.start();\n });\n }\n\n stop(): void {\n this.onGoing = false;\n this.playedTime = 0;\n this.localTime = this._duration + 0.1;\n this.animations.forEach((animation) => {\n animation.animator.stop();\n });\n this.tearDown();\n }\n\n get duration(): number {\n return this._duration + this._delayTime + this._dragTime;\n }\n\n set duration(duration: number) {\n if(duration < 0){\n return;\n }\n const originalDuration = this._duration + this._delayTime + this._dragTime;\n const scale = duration / originalDuration;\n const newDelayTime = this._delayTime * scale;\n const newDragTime = this._dragTime * scale;\n this._delayTime = newDelayTime;\n this._dragTime = newDragTime;\n this.animations.forEach((animation)=>{\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n animation.startTime *= scale;\n const newDuration = animation.animator.duration * scale;\n animation.animator.nonCascadingDuration(newDuration);\n });\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n nonCascadingDuration(newDuration: number): void {\n if(newDuration < 0){\n return;\n }\n const originalDuration = this._duration + this._delayTime + this._dragTime;\n const scale = newDuration / originalDuration;\n const newDelayTime = this._delayTime * scale;\n const newDragTime = this._dragTime * scale;\n this._delayTime = newDelayTime;\n this._dragTime = newDragTime;\n this.animations.forEach((animation)=>{\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n animation.startTime *= scale;\n const newDuration = animation.animator.duration * scale;\n animation.animator.nonCascadingDuration(newDuration);\n });\n this.calculateDuration();\n }\n\n resetAnimationState(): void {\n this.onGoing = false;\n this.animations.forEach((animation) => {\n animation.animator.resetAnimationState();\n });\n }\n\n getTrueDuration(): number{\n return this._duration;\n }\n\n setUp(): void {\n this.setUpFn();\n this.animations.forEach((animation) => {\n animation.animator.setUp();\n });\n }\n\n tearDown(): void {\n this.tearDownFn();\n this.animations.forEach((animation) => {\n animation.animator.tearDown();\n }); \n }\n\n addAnimation(name: string, animation: Animator, startTime: number = 0, endCallback: Function = ()=>{}){\n if(this.animations.has(name)){\n return;\n }\n if(this.parent !== undefined && this.parent.containsAnimation(animation)){\n return;\n }\n this.animations.set(name, {animator: animation, startTime: startTime});\n animation.setParent(this);\n if(this.localTime > startTime){\n animation.animate(this.localTime - startTime);\n }\n const endTime = startTime + animation.duration;\n this._duration = Math.max(this._duration, endTime);\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n addAnimationAfter(name: string, animation: Animator, afterName: string, delay: number = 0){\n let afterAnimation = this.animations.get(afterName);\n if(afterAnimation == undefined){\n return;\n }\n if(afterAnimation.startTime == undefined){\n afterAnimation.startTime = 0;\n }\n let startTime = afterAnimation.startTime + afterAnimation.animator.duration;\n startTime += delay;\n this.addAnimation(name, animation, startTime);\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n addAnimationAdmist(name: string, animation: Animator, admistName: string, delay: number){\n let admistAnimation = this.animations.get(admistName);\n if(admistAnimation == undefined){\n return;\n }\n if(admistAnimation.startTime == undefined){\n admistAnimation.startTime = 0;\n }\n let startTime = admistAnimation.startTime + delay;\n this.addAnimation(name, animation, startTime);\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n addAnimationBefore(name: string, animation: Animator, beforeName: string, aheadTime: number = 0){\n let beforeAnimation = this.animations.get(beforeName);\n if(beforeAnimation == undefined){\n return;\n }\n if(beforeAnimation.startTime == undefined){\n beforeAnimation.startTime = 0;\n }\n let startTime = beforeAnimation.startTime;\n startTime -= aheadTime;\n this.addAnimation(name, animation, startTime);\n if (startTime < 0){\n const pushOver = 0 - startTime;\n this.animations.forEach((animation) => {\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n animation.startTime += pushOver;\n });\n }\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n removeAnimation(name: string){\n let animation = this.animations.get(name);\n let deleted = this.animations.delete(name);\n if(deleted){\n if(animation != undefined){\n animation.animator.detachParent();\n }\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n }\n\n set delay(delayTime: number){\n this._delayTime = delayTime;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n get delay(): number{\n return this._delayTime;\n }\n\n set drag(dragTime: number){\n this._dragTime = dragTime;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n get drag(): number {\n return this._dragTime;\n }\n\n removeDelay(){\n this._delayTime = 0;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n removeDrag(){\n this._dragTime = 0;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n updateDuration(): void {\n if(this.checkCyclicChildren()){\n return;\n }\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n calculateDuration(){\n this._duration = 0;\n this.animations.forEach((animation)=>{\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n const endTime = animation.startTime + animation.animator.duration;\n this._duration = Math.max(this._duration, endTime);\n });\n }\n \n get loops(): boolean {\n return this.loop;\n }\n\n set loops(loop: boolean) {\n this.loop = loop;\n }\n\n checkCyclicChildren(): boolean {\n const allChildren: Animator[] = [];\n allChildren.push(this);\n const visited = new Set<Animator>();\n while(allChildren.length > 0){\n const current = allChildren.pop();\n if(current == undefined){\n continue;\n }\n if(visited.has(current)){\n return true;\n }\n visited.add(current);\n if(current instanceof CompositeAnimation){\n current.animations.forEach((animation) => {\n allChildren.push(animation.animator);\n });\n }\n }\n return false;\n }\n\n forceToggleLoop(loop: boolean){\n this.loop = true;\n this.animations.forEach((animation) => {\n animation.animator.loops = true;\n });\n }\n\n containsAnimation(animationInInterest: Animator): boolean {\n if(this.parent !== undefined){\n return this.parent.containsAnimation(animationInInterest);\n }\n const allChildren: Animator[] = [];\n allChildren.push(this);\n const visited = new Set<Animator>();\n while(allChildren.length > 0){\n const current = allChildren.pop();\n if(current == undefined){\n continue;\n }\n if(current == animationInInterest){\n return true;\n }\n if(visited.has(current)){\n continue;\n }\n visited.add(current);\n if(current instanceof CompositeAnimation){\n current.animations.forEach((animation) => {\n allChildren.push(animation.animator);\n });\n }\n }\n return false;\n }\n\n onEnd(callback: Function): UnSubscribe{\n this.endCallbacks.push(callback);\n return ()=>{\n this.endCallbacks = this.endCallbacks.filter((cb) => cb != callback);\n }\n }\n\n onStart(callback: Function): UnSubscribe{\n this.startCallbacks.push(callback);\n return ()=>{\n this.startCallbacks = this.startCallbacks.filter((cb) => cb != callback);\n }\n }\n\n clearOnEnd(): void {\n this.endCallbacks = [];\n }\n\n clearOnStart(): void {\n this.startCallbacks = [];\n }\n\n get playing(): boolean {\n return this.onGoing;\n }\n\n get maxLoopCount(): number | undefined {\n return this._maxLoopCount;\n }\n\n set maxLoopCount(maxLoopCount: number | undefined) {\n this._maxLoopCount = maxLoopCount;\n }\n}\n\nexport class Animation<T> implements Animator{\n\n private localTime: number; // local time starting from 0 up til duration\n private _duration: number;\n private keyframes: Keyframe<T>[];\n private animatableAttributeHelper: AnimatableAttributeHelper<T>;\n private applyAnimationValue: (value: T) => void;\n private easeFn: (percentage: number) => number;\n private onGoing: boolean;\n private currentKeyframeIndex: number;\n private loop: boolean;\n private playedTime: number;\n private setUpFn: Function;\n private tearDownFn: Function;\n private parent: AnimatorContainer | undefined;\n private delayTime: number = 0;\n private dragTime: number = 0;\n\n private reverse: boolean = false;\n private endCallbacks: Function[] = [];\n private startCallbacks: Function[] = [];\n private startAfterDelayCallbacks: Function[] = [];\n\n private zeroPercentageValue: T;\n private _maxLoopCount: number | undefined;\n private _fillMode: 'none' | 'forwards' | 'backwards' | 'both' = 'none';\n\n constructor(keyFrames: Keyframe<T>[], applyAnimationValue: (value: T) => void, animatableAttributeHelper: AnimatableAttributeHelper<T>, duration: number = 1000, loop: boolean = false, parent: AnimatorContainer | undefined = undefined, setUpFn: Function = ()=>{}, tearDownFn: Function = ()=>{}, easeFn: (percentage: number) => number = linear){\n this._duration = duration;\n this.keyframes = keyFrames;\n this.animatableAttributeHelper = animatableAttributeHelper;\n this.applyAnimationValue = applyAnimationValue;\n this.easeFn = easeFn;\n this.onGoing = false;\n this.localTime = duration + 0.1;\n this.currentKeyframeIndex = 0;\n this.loop = loop;\n this.setUpFn = setUpFn;\n this.tearDownFn = tearDownFn;\n this.parent = parent;\n this.playedTime = 0;\n this.zeroPercentageValue = this.findValue(0, keyFrames, animatableAttributeHelper);\n }\n\n toggleReverse(reverse: boolean): void{\n this.reverse = reverse;\n }\n\n start(): void{\n this.localTime = 0;\n this.currentKeyframeIndex = 0;\n this.onGoing = true;\n // this.applyAnimationValue(this.zeroPercentageValue);\n this.setUp();\n }\n\n stop(): void{\n this.onGoing = false;\n this.localTime = this._duration + this.dragTime + this.delayTime + 0.1;\n this.playedTime = 0;\n this.tearDown();\n }\n\n pause(): void{\n this.onGoing = false;\n }\n\n resume(){\n this.onGoing = true;\n }\n\n get playing(): boolean {\n return this.onGoing;\n }\n\n animate(deltaTime: number){\n if(this.onGoing != true || this.localTime < 0) {\n return;\n }\n if(deltaTime == 0){\n return;\n }\n this.localTime += deltaTime;\n // console.log(\"--------------------\");\n // console.log(\"local time\", this.localTime);\n // console.log(\"delta time\", deltaTime);\n if(this.localTime - deltaTime <= 0 && deltaTime > 0){\n // console.log(\"--------------------\");\n // console.log(\"current localtime\", this.localTime);\n // console.log(\"current delta time\", deltaTime);\n // console.log(\"previous local time\", this.localTime - deltaTime);\n // console.log(\"animation start\");\n // console.log(`the animation has been played ${this.playedTime} times`);\n // console.log(`the animation is now playing for the ${this.playedTime + 1} time`);\n this.startCallbacks.forEach((callback) => {\n queueMicrotask(()=>{callback()});\n });\n }\n if(this.localTime >= this.delayTime && (this.localTime <= this.delayTime + this._duration + this.dragTime || this.localTime - deltaTime <= this.delayTime + this._duration + this.dragTime)){\n // console.log(\"local time\", this.localTime);\n // console.log(\"duration\", this.duration);\n // console.log(\"local time would trigger end\", this.localTime >= this._duration + this.delayTime + this.dragTime);\n // console.log(\"delta time\", deltaTime);\n if(this.localTime - deltaTime <= this.delayTime && this.delayTime !== 0 && deltaTime > 0){\n this.startAfterDelayCallbacks.forEach((callback) => {\n queueMicrotask(()=>{callback()});\n });\n this.applyAnimationValue(this.zeroPercentageValue);\n }\n let localTimePercentage = (this.localTime - this.delayTime) / (this._duration);\n let targetPercentage = this.easeFn(localTimePercentage);\n if (localTimePercentage > 1){\n targetPercentage = this.easeFn(1);\n }\n let value: T;\n // console.log(\"currentKeyframeIndex\", this.currentKeyframeIndex, \"length\", this.keyFrames.length);\n if(this.currentKeyframeIndex < this.keyframes.length && this.currentKeyframeIndex >= 0 && (this.reverse ? 1 - this.keyframes[this.currentKeyframeIndex].percentage == targetPercentage : this.keyframes[this.currentKeyframeIndex].percentage == targetPercentage) ){\n value = this.keyframes[this.currentKeyframeIndex].value;\n } else {\n value = this.findValue(targetPercentage, this.keyframes, this.animatableAttributeHelper);\n }\n if(this.reverse){\n while(this.currentKeyframeIndex >= 0 && 1 - this.keyframes[this.currentKeyframeIndex].percentage <= targetPercentage){\n this.currentKeyframeIndex -= 1;\n }\n } else {\n while(this.currentKeyframeIndex < this.keyframes.length && this.keyframes[this.currentKeyframeIndex].percentage <= targetPercentage){\n this.currentKeyframeIndex += 1;\n }\n }\n this.applyAnimationValue(value);\n if(this.localTime >= this._duration + this.dragTime + this.delayTime){\n // console.log(\"animation should end\");\n this.playedTime += 1;\n this.endCallbacks.forEach((callback) => {\n queueMicrotask(()=>{callback()});\n });\n if(!this.loops || (this._maxLoopCount != undefined && this.playedTime >= (this.maxLoopCount ?? 0))){\n // this.onGoing = false;\n // console.log(\"animation should stop after \", this.playedTime, \" loops\");\n this.stop();\n } else {\n // console.log(\"animation should restart\");\n this.onGoing = true;\n this.localTime = 0;\n this.currentKeyframeIndex = 0;\n this.start();\n }\n }\n // if((this.localTime >= this._duration + this.delayTime + this.dragTime) && this.loop){\n // // this.startAnimation();\n // this.localTime = 0;\n // this.onGoing = true;\n // this.currentKeyframeIndex = 0;\n // }\n }\n }\n\n findValue(valuePercentage: number, keyframes: Keyframe<T>[], animatableAttributeHelper: AnimatableAttributeHelper<T>): T{\n if(valuePercentage > 1){\n if(this.reverse){\n return animatableAttributeHelper.lerp(valuePercentage, keyframes[1], keyframes[0]);\n }\n return animatableAttributeHelper.lerp(valuePercentage, keyframes[keyframes.length - 2], keyframes[keyframes.length - 1]);\n }\n if(valuePercentage < 0){\n if(this.reverse){\n return animatableAttributeHelper.lerp(valuePercentage, keyframes[keyframes.length - 2], keyframes[keyframes.length - 1]);\n }\n return animatableAttributeHelper.lerp(valuePercentage, keyframes[1], keyframes[0]);\n }\n let left = 0;\n let right = keyframes.length - 1;\n while (left <= right) {\n let mid = left + Math.floor((right - left) / 2);\n const midPercentage = this.reverse ? 1 - keyframes[mid].percentage : keyframes[mid].percentage;\n if(midPercentage == valuePercentage) {\n return keyframes[mid].value;\n } else if(midPercentage < valuePercentage){\n if(this.reverse){\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n } else {\n if(this.reverse){\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n }\n if(left > keyframes.length - 1){\n // excceding the keyframes\n left = keyframes.length - 1;\n }\n const interpolateStartFrame = this.reverse ? {percentage: 1 - keyframes[left].percentage, value: keyframes[left].value} : keyframes[left - 1];\n const interplateEndFrame = this.reverse ? {percentage: 1 - keyframes[left - 1].percentage, value: keyframes[left - 1].value} : keyframes[left];\n // return animatableAttributeHelper.lerp(valuePercentage, keyframes[left - 1], keyframes[left]);\n return animatableAttributeHelper.lerp(valuePercentage, interpolateStartFrame, interplateEndFrame);\n }\n\n setUp(): void {\n // this.applyAnimationValue(this.keyframes[0].value);\n this.setUpFn();\n }\n\n tearDown(): void {\n this.tearDownFn(); \n }\n\n get loops(): boolean {\n return this.loop;\n }\n\n set loops(loop: boolean) {\n this.loop = loop;\n }\n\n get duration(): number {\n return this._duration + this.delayTime + this.dragTime;\n }\n\n set duration(duration: number) {\n if(duration < 0){\n return;\n }\n const originalDuration = this._duration + this.delayTime + this.dragTime;\n const scale = duration / originalDuration;\n const newDelayTime = this.delayTime * scale;\n const newDragTime = this.dragTime * scale;\n this.delayTime = newDelayTime;\n this.dragTime = newDragTime;\n this._duration = this._duration * scale;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n nonCascadingDuration(newDuration: number): void {\n if(newDuration < 0){\n return;\n }\n const originalDuration = this._duration + this.delayTime + this.dragTime;\n const scale = newDuration / originalDuration;\n const newDelayTime = this.delayTime * scale;\n const newDragTime = this.dragTime * scale;\n this.delayTime = newDelayTime;\n this.dragTime = newDragTime;\n this._duration = newDuration;\n }\n\n resetAnimationState(): void {\n this.onGoing = false;\n this.applyAnimationValue(this.keyframes[0].value);\n this.currentKeyframeIndex = 0;\n this.setUp();\n }\n\n wrapUp(): void {\n this.onGoing = false;\n this.localTime = this._duration + this.dragTime + this.delayTime + 0.1;\n this.currentKeyframeIndex = 0;\n }\n\n get delay(): number {\n return this.delayTime;\n }\n\n set delay(delayTime: number){\n this.delayTime = delayTime;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n get drag(): number {\n return this.dragTime;\n }\n\n set drag(dragTime: number){\n this.dragTime = dragTime;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n get trueDuration(): number {\n return this._duration;\n }\n\n set trueDuration(duration: number){\n this._duration = duration;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n setParent(parent: AnimatorContainer){\n this.parent = parent;\n }\n\n detachParent(): void {\n this.parent = undefined;\n }\n\n set keyFrames(keyFrames: Keyframe<T>[]){\n this.keyframes = keyFrames;\n this.zeroPercentageValue = this.findValue(0, keyFrames, this.animatableAttributeHelper);\n }\n\n get keyFrames(): Keyframe<T>[]{\n return this.keyframes;\n }\n\n get easeFunction(): (percentage: number) => number {\n return this.easeFn;\n }\n\n set easeFunction(easeFn: (percentage: number) => number){\n this.easeFn = easeFn;\n }\n\n onEnd(callback: Function): UnSubscribe{\n this.endCallbacks.push(callback);\n return ()=>{\n this.endCallbacks = this.endCallbacks.filter((cb) => cb != callback);\n }\n }\n\n onStart(callback: Function): UnSubscribe{\n this.startCallbacks.push(callback);\n return ()=>{\n this.startCallbacks = this.startCallbacks.filter((cb) => cb != callback);\n }\n }\n\n onStartAfterDelay(callback: Function): UnSubscribe{\n this.startAfterDelayCallbacks.push(callback);\n return ()=>{\n this.startAfterDelayCallbacks = this.startAfterDelayCallbacks.filter((cb) => cb != callback);\n }\n }\n\n clearOnEnd(): void {\n this.endCallbacks = [];\n }\n\n clearOnStart(): void {\n this.startCallbacks = [];\n }\n\n get maxLoopCount(): number | undefined {\n return this._maxLoopCount;\n }\n\n set maxLoopCount(maxLoopCount: number | undefined) {\n this._maxLoopCount = maxLoopCount;\n }\n}\n\nexport interface Keyframes<T> {\n keyframes: Keyframe<T>[];\n from(value: T): Keyframes<T>;\n to(value: T): Keyframes<T>;\n insertAt(percentage: number, value: T): void;\n clearFrames(): void;\n}\n\nexport class KeyFramesContiner<T> {\n\n private _keyframes: Keyframe<T>[];\n\n constructor(){\n this._keyframes = [];\n }\n\n get keyframes(): Keyframe<T>[] {\n return this._keyframes;\n }\n\n from(value: T): Keyframes<T>{\n if(this._keyframes.length == 0){\n this._keyframes.push({percentage: 0, value: value});\n } else {\n if(this._keyframes[0].percentage == 0){\n this._keyframes[0].value = value;\n } else {\n this._keyframes.unshift({percentage: 0, value: value});\n }\n }\n return this;\n }\n\n to(value: T): Keyframes<T>{\n if(this._keyframes.length == 0){\n this._keyframes.push({percentage: 1, value: value});\n } else {\n if(this._keyframes[this._keyframes.length - 1].percentage == 1){\n this._keyframes[this._keyframes.length - 1].value = value;\n } else {\n this._keyframes.push({percentage: 1, value: value});\n }\n }\n return this;\n }\n\n insertAt(percentage: number, value: T): void{\n this._keyframes.push({percentage: percentage, value: value});\n }\n\n clearFrames(): void{\n this._keyframes = [];\n }\n}\n"
5
+ "import { PointCal, Point } from \"@ue-too/math\";\n\n/**\n * Represents a keyframe in an animation timeline.\n *\n * @remarks\n * A keyframe defines a value at a specific point in the animation's progress.\n * Keyframes are defined with a percentage from 0.0 (start) to 1.0 (end), along\n * with the value at that point and an optional easing function for interpolation\n * to the next keyframe.\n *\n * @typeParam T - The type of value being animated (number, Point, RGB, etc.)\n *\n * @example\n * ```typescript\n * const keyframe: Keyframe<number> = {\n * percentage: 0.5,\n * value: 50,\n * easingFn: (t) => t * t // Ease-in quadratic\n * };\n * ```\n *\n * @category Types\n */\nexport type Keyframe<T> = {\n /** Animation progress from 0.0 (start) to 1.0 (end) */\n percentage: number;\n /** Value at this keyframe */\n value: T;\n /** Optional easing function for interpolation to next keyframe */\n easingFn?: (percentage: number) => number;\n}\n\n/**\n * Interface for type-specific interpolation helpers.\n *\n * @remarks\n * Animation helpers provide the `lerp` (linear interpolation) logic for specific types.\n * Different types require different interpolation strategies:\n * - Numbers: Simple linear interpolation\n * - Points: Component-wise interpolation\n * - Colors (RGB): Component-wise color interpolation\n * - Strings: Step-based (threshold) interpolation\n *\n * @typeParam T - The type of value being interpolated\n *\n * @example\n * ```typescript\n * const myHelper: AnimatableAttributeHelper<number> = {\n * lerp: (ratio, start, end) => {\n * const t = (ratio - start.percentage) / (end.percentage - start.percentage);\n * return start.value + t * (end.value - start.value);\n * }\n * };\n * ```\n *\n * @category Helpers\n */\nexport interface AnimatableAttributeHelper<T> {\n /**\n * Interpolates between two keyframes at a given ratio.\n *\n * @param ratio - Current animation progress (0.0 to 1.0)\n * @param start - Starting keyframe\n * @param end - Ending keyframe\n * @returns Interpolated value at the given ratio\n */\n lerp(ratio: number, start: Keyframe<T>, end: Keyframe<T>): T;\n}\n\n/**\n * Built-in interpolation helper for animating Point values.\n *\n * @remarks\n * Provides linear interpolation for 2D points with optional easing.\n * Interpolates both x and y components independently.\n *\n * @category Helpers\n */\nexport const pointHelperFunctions: AnimatableAttributeHelper<Point> = {\n lerp: (ratio: number, start: Keyframe<Point>, end: Keyframe<Point>): Point => {\n const inbetweenRatio = (ratio - start.percentage) / (end.percentage - start.percentage);\n let transformed = inbetweenRatio;\n if(start.easingFn){\n transformed = start.easingFn(inbetweenRatio);\n }\n const res = PointCal.addVector(start.value, PointCal.multiplyVectorByScalar(PointCal.subVector(end.value, start.value), transformed));\n return res;\n }\n};\n\nexport class PointAnimationHelper implements AnimatableAttributeHelper<Point> {\n\n constructor(){\n\n }\n\n lerp(ratio: number, start: Keyframe<Point>, end: Keyframe<Point>): Point {\n const inbetweenRatio = (ratio - start.percentage) / (end.percentage - start.percentage);\n let transformed = inbetweenRatio;\n if(start.easingFn){\n transformed = start.easingFn(inbetweenRatio);\n }\n const res = PointCal.addVector(start.value, PointCal.multiplyVectorByScalar(PointCal.subVector(end.value, start.value), transformed));\n return res;\n }\n\n}\n\n/**\n * Built-in interpolation helper for animating number values.\n *\n * @remarks\n * Provides linear interpolation for numeric values with optional easing.\n *\n * @category Helpers\n */\nexport const numberHelperFunctions: AnimatableAttributeHelper<number> = {\n lerp: (ratio: number, start: Keyframe<number>, end: Keyframe<number>): number => {\n const inbetweenRatio = (ratio - start.percentage) / (end.percentage - start.percentage);\n let transformed = inbetweenRatio;\n if(start.easingFn){\n transformed = start.easingFn(inbetweenRatio);\n }\n const res = start.value + transformed * (end.value - start.value);\n return res;\n }\n}\n\nexport class NumberAnimationHelper implements AnimatableAttributeHelper<number>{\n\n constructor(){\n\n }\n\n lerp(ratio: number, start: Keyframe<number>, end: Keyframe<number>): number {\n const inbetweenRatio = (ratio - start.percentage) / (end.percentage - start.percentage);\n let transformed = inbetweenRatio;\n if(start.easingFn){\n transformed = start.easingFn(inbetweenRatio);\n }\n const res = start.value + transformed * (end.value - start.value);\n return res;\n }\n}\n\n/**\n * Built-in interpolation helper for animating string values.\n *\n * @remarks\n * Uses step-based interpolation with a 50% threshold. Returns start value until\n * 50% progress, then switches to end value. Useful for discrete property changes.\n *\n * @category Helpers\n */\nexport const stringHelperFunctions: AnimatableAttributeHelper<string> = {\n lerp: (ratio: number, start: Keyframe<string>, end: Keyframe<string>): string => {\n const percentageScale = (ratio - start.percentage) / (end.percentage - start.percentage)\n // if percentageScale is negative that means it's before the start value just return start value \n // if percentageScale is more than 1 that means it's after the end value just return the end value\n // if percentageScale is less than 0.5 return the start value else return the end value\n return percentageScale < 0 || percentageScale < 0.5 ? start.value : end.value;\n }\n}\n\nexport class StringAnimationHelper implements AnimatableAttributeHelper<string>{\n constructor(){\n\n }\n \n lerp(ratio: number, start: Keyframe<string>, end: Keyframe<string>): string {\n const percentageScale = (ratio - start.percentage) / (end.percentage - start.percentage)\n // if percentageScale is negative that means it's before the start value just return start value \n // if percentageScale is more than 1 that means it's after the end value just return the end value\n // if percentageScale is less than 0.5 return the start value else return the end value\n return percentageScale < 0 || percentageScale < 0.5 ? start.value : end.value;\n }\n}\n\n/**\n * Built-in interpolation helper for animating integer values.\n *\n * @remarks\n * Uses step-based interpolation with a 50% threshold, similar to strings.\n * Useful for discrete numeric properties like indices or counts.\n *\n * @category Helpers\n */\nexport const integerHelperFunctions: AnimatableAttributeHelper<number> = {\n lerp: (ratio: number, start: Keyframe<number>, end: Keyframe<number>): number => {\n const percentageScale = (ratio - start.percentage) / (end.percentage - start.percentage)\n // if percentageScale is negative that means it's before the start value just return start value \n // if percentageScale is more than 1 that means it's after the end value just return the end value\n // if percentageScale is less than 0.5 return the start value else return the end value\n return percentageScale < 0 || percentageScale < 0.5 ? start.value : end.value;\n }\n}\n\nexport class IntegerAnimationHelper implements AnimatableAttributeHelper<number>{\n constructor(){\n\n }\n\n lerp(ratio: number, start: Keyframe<number>, end: Keyframe<number>): number {\n const percentageScale = (ratio - start.percentage) / (end.percentage - start.percentage)\n // if percentageScale is negative that means it's before the start value just return start value \n // if percentageScale is more than 1 that means it's after the end value just return the end value\n // if percentageScale is less than 0.5 return the start value else return the end value\n return percentageScale < 0 || percentageScale < 0.5 ? start.value : end.value;\n }\n}\n\n/**\n * RGB color type for color animations.\n *\n * @remarks\n * Represents a color with red, green, and blue components (0-255).\n *\n * @category Types\n */\nexport type RGB = {r: number, g: number, b: number};\n\n/**\n * Built-in interpolation helper for animating RGB color values.\n *\n * @remarks\n * Provides linear interpolation for RGB colors with component-wise blending.\n *\n * @category Helpers\n */\nexport const rgbHelperFunctions: AnimatableAttributeHelper<RGB> = {\n lerp: (ratio: number, start: Keyframe<RGB>, end: Keyframe<RGB>): RGB => {\n const res = {\n r: start.value.r + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.r - start.value.r),\n g: start.value.g + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.g - start.value.g),\n b: start.value.b + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.b - start.value.b),\n }\n return res;\n }\n}\n\nexport class RGBAnimationHelper implements AnimatableAttributeHelper<RGB> {\n constructor(){\n\n }\n\n lerp(ratio: number, start: Keyframe<RGB>, end: Keyframe<RGB>): RGB {\n const res = {\n r: start.value.r + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.r - start.value.r),\n g: start.value.g + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.g - start.value.g),\n b: start.value.b + ((ratio - start.percentage) / (end.percentage - start.percentage)) * (end.value.b - start.value.b),\n }\n return res;\n }\n}\n",
6
+ "import { AnimatableAttributeHelper, Keyframe } from \"./animatable-attribute\";\n\n/**\n * Linear easing function (no easing).\n *\n * @param percentage - Animation progress (0.0 to 1.0)\n * @returns Same as input (linear progression)\n *\n * @category Easing\n */\nexport const linear = (percentage: number) => {\n return percentage;\n}\n\n/**\n * Core interface for all animators in the animation system.\n *\n * @remarks\n * The Animator interface defines the contract for both individual animations ({@link Animation})\n * and composite animations ({@link CompositeAnimation}). All animators support:\n * - Lifecycle control (start, stop, pause, resume)\n * - Duration management with delays and drag time\n * - Looping with optional max loop count\n * - Parent-child relationships for composition\n * - Event callbacks for start and end\n *\n * @category Core\n */\nexport interface Animator{\n loops: boolean;\n duration: number;\n delay: number;\n drag: number;\n nonCascadingDuration(newDuration: number): void;\n start(): void;\n stop(): void;\n pause(): void;\n resume(): void;\n animate(deltaTime: number): void;\n setUp(): void;\n resetAnimationState(): void;\n tearDown(): void;\n setParent(parent: AnimatorContainer): void;\n detachParent(): void;\n toggleReverse(reverse: boolean): void;\n onEnd(callback: Function): UnSubscribe;\n onStart(callback: Function): UnSubscribe;\n clearOnStart(): void;\n clearOnEnd(): void;\n maxLoopCount: number | undefined;\n playing: boolean;\n}\n\n/**\n * Function type for unsubscribing from animation events.\n *\n * @category Core\n */\nexport type UnSubscribe = () => void;\n\n/**\n * Interface for containers that hold and manage child animators.\n *\n * @remarks\n * Implemented by {@link CompositeAnimation} to manage hierarchical animation structures.\n * Handles duration updates and prevents cyclic dependencies.\n *\n * @category Core\n */\nexport interface AnimatorContainer {\n updateDuration(): void;\n checkCyclicChildren(): boolean;\n containsAnimation(animationInInterest: Animator): boolean;\n}\n\n/**\n * Container for sequencing and composing multiple animations.\n *\n * @remarks\n * CompositeAnimation allows you to orchestrate complex animation sequences by:\n * - **Sequencing**: Add animations to play one after another\n * - **Overlapping**: Start animations before previous ones complete\n * - **Synchronizing**: Play multiple animations simultaneously\n * - **Nesting**: Compose animations contain other composite animations\n *\n * ## Key Features\n *\n * - Add animations at specific time offsets\n * - Position animations relative to other animations (`addAnimationAfter`, `addAnimationBefore`)\n * - Automatic duration calculation based on child animations\n * - Hierarchical composition for complex sequences\n * - Prevent cyclic animation dependencies\n *\n * @example\n * Basic sequence\n * ```typescript\n * const sequence = new CompositeAnimation();\n *\n * // Add first animation at start (time 0)\n * sequence.addAnimation('fadeIn', fadeAnimation, 0);\n *\n * // Add second animation after first completes\n * sequence.addAnimationAfter('slideIn', slideAnimation, 'fadeIn');\n *\n * // Add third animation to overlap with second (100ms after second starts)\n * sequence.addAnimationAdmist('scaleUp', scaleAnimation, 'slideIn', 100);\n *\n * sequence.start();\n * ```\n *\n * @category Core\n */\nexport class CompositeAnimation implements Animator, AnimatorContainer{\n\n private animations: Map<string, {animator: Animator, startTime?: number}>;\n private localTime: number;\n private _duration: number;\n private onGoing: boolean;\n private loop: boolean;\n private playedTime: number;\n private setUpFn: Function;\n private tearDownFn: Function;\n private _dragTime: number;\n private _delayTime: number;\n private parent: AnimatorContainer | undefined;\n private _maxLoopCount: number | undefined;\n\n private endCallbacks: Function[] = [];\n private startCallbacks: Function[] = [];\n\n private reverse: boolean;\n\n constructor(animations: Map<string, {animator: Animator, startTime?: number}> = new Map(), loop: boolean = false, parent: AnimatorContainer | undefined = undefined, setupFn: Function = ()=>{}, tearDownFn: Function = ()=>{}){\n this.animations = animations;\n this._duration = 0;\n this.calculateDuration();\n this.localTime = -1;\n this.onGoing = false;\n this.loop = loop;\n this.setUpFn = setupFn;\n this.tearDownFn = tearDownFn;\n this._delayTime = 0;\n this._dragTime = 0;\n this.parent = parent;\n this.animations.forEach((animation) => {\n animation.animator.setParent(this);\n });\n this.reverse = false;\n this.playedTime = 0;\n }\n\n toggleReverse(reverse: boolean){\n if(this.reverse == reverse){\n return;\n }\n this.reverse = reverse;\n this.animations.forEach((animation) => {\n animation.animator.toggleReverse(reverse);\n });\n }\n \n setParent(parent: AnimatorContainer){\n this.parent = parent;\n }\n\n detachParent(){\n this.parent = undefined;\n }\n\n animate(deltaTime: number): void {\n if(!this.onGoing || this.localTime > this._duration + this._delayTime + this._dragTime || this.localTime < 0 || this.animations.size == 0){\n return;\n }\n this.localTime += deltaTime;\n if (this.localTime - deltaTime <= 0 && deltaTime > 0){\n // console.log(\"composite animation start\");\n this.startCallbacks.forEach((callback) => {\n queueMicrotask(()=>{callback()});\n });\n }\n this.animateChildren(deltaTime);\n this.checkTerminalAndLoop();\n }\n\n checkTerminalAndLoop(){\n if(this.localTime >= this._duration + this._delayTime + this._dragTime){\n // console.log(\"composite animation end\");\n this.playedTime += 1;\n this.endCallbacks.forEach((callback) => {\n queueMicrotask(()=>{callback()});\n });\n if(!this.loops || (this.maxLoopCount != undefined && this.playedTime >= this.maxLoopCount)){\n // this.onGoing = false;\n this.stop();\n } else {\n // if loop is true and current loop is not the last loop, then prepare to start the animations again\n // this.onGoing = true;\n // this.localTime = 0;\n // this.animations.forEach((animation) => {\n // if(animation.animator.loops){\n // animation.animator.startAnimation();\n // }\n // });\n this.start();\n }\n }\n }\n\n animateChildren(deltaTime: number){\n const prevLocalTime = this.localTime - deltaTime;\n if(this.localTime < this._delayTime){\n return;\n }\n this.animations.forEach((animation, name: string) => {\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n if(!this.childShouldAnimate(animation, prevLocalTime)){\n this.wrapUpAnimator({animator: animation.animator, startTime: animation.startTime, name: name}, prevLocalTime);\n return;\n }\n if(prevLocalTime - this._delayTime < animation.startTime){\n animation.animator.animate(this.localTime - this._delayTime - animation.startTime);\n } else {\n animation.animator.animate(deltaTime);\n }\n });\n }\n\n childShouldAnimate(animation: {animator: Animator, startTime?: number}, prevLocalTime: number): boolean{\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n if(this.localTime - this._delayTime >= animation.startTime && this.localTime - this._delayTime <= animation.startTime + animation.animator.duration){\n return true;\n }\n return false;\n }\n\n wrapUpAnimator(animation: {animator: Animator, startTime?: number, name: string}, prevLocalTime: number){\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n if(this.localTime - this._delayTime > animation.startTime + animation.animator.duration && prevLocalTime - this._delayTime < animation.startTime + animation.animator.duration){\n // console.log(\"wrap up\", animation.name);\n // console.log(\"time remaining\", animation.startTime + animation.animator.duration - (prevLocalTime - this._delayTime));\n \n animation.animator.animate(animation.startTime + animation.animator.duration - (prevLocalTime - this._delayTime));\n }\n }\n\n pause(): void {\n this.onGoing = false;\n this.animations.forEach((animation) => {\n animation.animator.pause();\n });\n }\n\n resume(): void {\n this.onGoing = true;\n this.animations.forEach((animation) => {\n animation.animator.resume();\n });\n }\n\n start(): void {\n this.onGoing = true;\n this.setUp();\n this.localTime = 0;\n this.animations.forEach((animation) => {\n animation.animator.start();\n });\n }\n\n stop(): void {\n this.onGoing = false;\n this.playedTime = 0;\n this.localTime = this._duration + 0.1;\n this.animations.forEach((animation) => {\n animation.animator.stop();\n });\n this.tearDown();\n }\n\n get duration(): number {\n return this._duration + this._delayTime + this._dragTime;\n }\n\n set duration(duration: number) {\n if(duration < 0){\n return;\n }\n const originalDuration = this._duration + this._delayTime + this._dragTime;\n const scale = duration / originalDuration;\n const newDelayTime = this._delayTime * scale;\n const newDragTime = this._dragTime * scale;\n this._delayTime = newDelayTime;\n this._dragTime = newDragTime;\n this.animations.forEach((animation)=>{\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n animation.startTime *= scale;\n const newDuration = animation.animator.duration * scale;\n animation.animator.nonCascadingDuration(newDuration);\n });\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n nonCascadingDuration(newDuration: number): void {\n if(newDuration < 0){\n return;\n }\n const originalDuration = this._duration + this._delayTime + this._dragTime;\n const scale = newDuration / originalDuration;\n const newDelayTime = this._delayTime * scale;\n const newDragTime = this._dragTime * scale;\n this._delayTime = newDelayTime;\n this._dragTime = newDragTime;\n this.animations.forEach((animation)=>{\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n animation.startTime *= scale;\n const newDuration = animation.animator.duration * scale;\n animation.animator.nonCascadingDuration(newDuration);\n });\n this.calculateDuration();\n }\n\n resetAnimationState(): void {\n this.onGoing = false;\n this.animations.forEach((animation) => {\n animation.animator.resetAnimationState();\n });\n }\n\n getTrueDuration(): number{\n return this._duration;\n }\n\n setUp(): void {\n this.setUpFn();\n this.animations.forEach((animation) => {\n animation.animator.setUp();\n });\n }\n\n tearDown(): void {\n this.tearDownFn();\n this.animations.forEach((animation) => {\n animation.animator.tearDown();\n }); \n }\n\n addAnimation(name: string, animation: Animator, startTime: number = 0, endCallback: Function = ()=>{}){\n if(this.animations.has(name)){\n return;\n }\n if(this.parent !== undefined && this.parent.containsAnimation(animation)){\n return;\n }\n this.animations.set(name, {animator: animation, startTime: startTime});\n animation.setParent(this);\n if(this.localTime > startTime){\n animation.animate(this.localTime - startTime);\n }\n const endTime = startTime + animation.duration;\n this._duration = Math.max(this._duration, endTime);\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n addAnimationAfter(name: string, animation: Animator, afterName: string, delay: number = 0){\n let afterAnimation = this.animations.get(afterName);\n if(afterAnimation == undefined){\n return;\n }\n if(afterAnimation.startTime == undefined){\n afterAnimation.startTime = 0;\n }\n let startTime = afterAnimation.startTime + afterAnimation.animator.duration;\n startTime += delay;\n this.addAnimation(name, animation, startTime);\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n addAnimationAdmist(name: string, animation: Animator, admistName: string, delay: number){\n let admistAnimation = this.animations.get(admistName);\n if(admistAnimation == undefined){\n return;\n }\n if(admistAnimation.startTime == undefined){\n admistAnimation.startTime = 0;\n }\n let startTime = admistAnimation.startTime + delay;\n this.addAnimation(name, animation, startTime);\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n addAnimationBefore(name: string, animation: Animator, beforeName: string, aheadTime: number = 0){\n let beforeAnimation = this.animations.get(beforeName);\n if(beforeAnimation == undefined){\n return;\n }\n if(beforeAnimation.startTime == undefined){\n beforeAnimation.startTime = 0;\n }\n let startTime = beforeAnimation.startTime;\n startTime -= aheadTime;\n this.addAnimation(name, animation, startTime);\n if (startTime < 0){\n const pushOver = 0 - startTime;\n this.animations.forEach((animation) => {\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n animation.startTime += pushOver;\n });\n }\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n removeAnimation(name: string){\n let animation = this.animations.get(name);\n let deleted = this.animations.delete(name);\n if(deleted){\n if(animation != undefined){\n animation.animator.detachParent();\n }\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n }\n\n set delay(delayTime: number){\n this._delayTime = delayTime;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n get delay(): number{\n return this._delayTime;\n }\n\n set drag(dragTime: number){\n this._dragTime = dragTime;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n get drag(): number {\n return this._dragTime;\n }\n\n removeDelay(){\n this._delayTime = 0;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n removeDrag(){\n this._dragTime = 0;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n updateDuration(): void {\n if(this.checkCyclicChildren()){\n return;\n }\n this.calculateDuration();\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n calculateDuration(){\n this._duration = 0;\n this.animations.forEach((animation)=>{\n if(animation.startTime == undefined){\n animation.startTime = 0;\n }\n const endTime = animation.startTime + animation.animator.duration;\n this._duration = Math.max(this._duration, endTime);\n });\n }\n \n get loops(): boolean {\n return this.loop;\n }\n\n set loops(loop: boolean) {\n this.loop = loop;\n }\n\n checkCyclicChildren(): boolean {\n const allChildren: Animator[] = [];\n allChildren.push(this);\n const visited = new Set<Animator>();\n while(allChildren.length > 0){\n const current = allChildren.pop();\n if(current == undefined){\n continue;\n }\n if(visited.has(current)){\n return true;\n }\n visited.add(current);\n if(current instanceof CompositeAnimation){\n current.animations.forEach((animation) => {\n allChildren.push(animation.animator);\n });\n }\n }\n return false;\n }\n\n forceToggleLoop(loop: boolean){\n this.loop = true;\n this.animations.forEach((animation) => {\n animation.animator.loops = true;\n });\n }\n\n containsAnimation(animationInInterest: Animator): boolean {\n if(this.parent !== undefined){\n return this.parent.containsAnimation(animationInInterest);\n }\n const allChildren: Animator[] = [];\n allChildren.push(this);\n const visited = new Set<Animator>();\n while(allChildren.length > 0){\n const current = allChildren.pop();\n if(current == undefined){\n continue;\n }\n if(current == animationInInterest){\n return true;\n }\n if(visited.has(current)){\n continue;\n }\n visited.add(current);\n if(current instanceof CompositeAnimation){\n current.animations.forEach((animation) => {\n allChildren.push(animation.animator);\n });\n }\n }\n return false;\n }\n\n onEnd(callback: Function): UnSubscribe{\n this.endCallbacks.push(callback);\n return ()=>{\n this.endCallbacks = this.endCallbacks.filter((cb) => cb != callback);\n }\n }\n\n onStart(callback: Function): UnSubscribe{\n this.startCallbacks.push(callback);\n return ()=>{\n this.startCallbacks = this.startCallbacks.filter((cb) => cb != callback);\n }\n }\n\n clearOnEnd(): void {\n this.endCallbacks = [];\n }\n\n clearOnStart(): void {\n this.startCallbacks = [];\n }\n\n get playing(): boolean {\n return this.onGoing;\n }\n\n get maxLoopCount(): number | undefined {\n return this._maxLoopCount;\n }\n\n set maxLoopCount(maxLoopCount: number | undefined) {\n this._maxLoopCount = maxLoopCount;\n }\n}\n\n/**\n * Keyframe-based animation for a single value.\n *\n * @remarks\n * The Animation class interpolates a value through a series of keyframes over time.\n * It handles:\n * - Keyframe interpolation with binary search for efficiency\n * - Easing functions for smooth motion curves\n * - Reverse playback\n * - Looping with optional max loop count\n * - Delays before start and drag time after completion\n * - Lifecycle callbacks\n *\n * ## How It Works\n *\n * 1. Define keyframes at percentages (0.0 to 1.0) along the timeline\n * 2. Provide a callback to apply the animated value\n * 3. Provide an interpolation helper for the value type\n * 4. Call `animate(deltaTime)` each frame to progress the animation\n *\n * @typeParam T - The type of value being animated\n *\n * @example\n * Animating a number with easing\n * ```typescript\n * let opacity = 0;\n *\n * const fadeIn = new Animation(\n * [\n * { percentage: 0, value: 0 },\n * { percentage: 1, value: 1, easingFn: (t) => t * t } // Ease-in\n * ],\n * (value) => { opacity = value; },\n * numberHelperFunctions,\n * 1000 // 1 second duration\n * );\n *\n * fadeIn.start();\n *\n * // In animation loop\n * function loop(deltaTime: number) {\n * fadeIn.animate(deltaTime);\n * element.style.opacity = opacity;\n * }\n * ```\n *\n * @category Core\n */\nexport class Animation<T> implements Animator{\n\n private localTime: number; // local time starting from 0 up til duration\n private _duration: number;\n private keyframes: Keyframe<T>[];\n private animatableAttributeHelper: AnimatableAttributeHelper<T>;\n private applyAnimationValue: (value: T) => void;\n private easeFn: (percentage: number) => number;\n private onGoing: boolean;\n private currentKeyframeIndex: number;\n private loop: boolean;\n private playedTime: number;\n private setUpFn: Function;\n private tearDownFn: Function;\n private parent: AnimatorContainer | undefined;\n private delayTime: number = 0;\n private dragTime: number = 0;\n\n private reverse: boolean = false;\n private endCallbacks: Function[] = [];\n private startCallbacks: Function[] = [];\n private startAfterDelayCallbacks: Function[] = [];\n\n private zeroPercentageValue: T;\n private _maxLoopCount: number | undefined;\n private _fillMode: 'none' | 'forwards' | 'backwards' | 'both' = 'none';\n\n constructor(keyFrames: Keyframe<T>[], applyAnimationValue: (value: T) => void, animatableAttributeHelper: AnimatableAttributeHelper<T>, duration: number = 1000, loop: boolean = false, parent: AnimatorContainer | undefined = undefined, setUpFn: Function = ()=>{}, tearDownFn: Function = ()=>{}, easeFn: (percentage: number) => number = linear){\n this._duration = duration;\n this.keyframes = keyFrames;\n this.animatableAttributeHelper = animatableAttributeHelper;\n this.applyAnimationValue = applyAnimationValue;\n this.easeFn = easeFn;\n this.onGoing = false;\n this.localTime = duration + 0.1;\n this.currentKeyframeIndex = 0;\n this.loop = loop;\n this.setUpFn = setUpFn;\n this.tearDownFn = tearDownFn;\n this.parent = parent;\n this.playedTime = 0;\n this.zeroPercentageValue = this.findValue(0, keyFrames, animatableAttributeHelper);\n }\n\n toggleReverse(reverse: boolean): void{\n this.reverse = reverse;\n }\n\n start(): void{\n this.localTime = 0;\n this.currentKeyframeIndex = 0;\n this.onGoing = true;\n // this.applyAnimationValue(this.zeroPercentageValue);\n this.setUp();\n }\n\n stop(): void{\n this.onGoing = false;\n this.localTime = this._duration + this.dragTime + this.delayTime + 0.1;\n this.playedTime = 0;\n this.tearDown();\n }\n\n pause(): void{\n this.onGoing = false;\n }\n\n resume(){\n this.onGoing = true;\n }\n\n get playing(): boolean {\n return this.onGoing;\n }\n\n animate(deltaTime: number){\n if(this.onGoing != true || this.localTime < 0) {\n return;\n }\n if(deltaTime == 0){\n return;\n }\n this.localTime += deltaTime;\n // console.log(\"--------------------\");\n // console.log(\"local time\", this.localTime);\n // console.log(\"delta time\", deltaTime);\n if(this.localTime - deltaTime <= 0 && deltaTime > 0){\n // console.log(\"--------------------\");\n // console.log(\"current localtime\", this.localTime);\n // console.log(\"current delta time\", deltaTime);\n // console.log(\"previous local time\", this.localTime - deltaTime);\n // console.log(\"animation start\");\n // console.log(`the animation has been played ${this.playedTime} times`);\n // console.log(`the animation is now playing for the ${this.playedTime + 1} time`);\n this.startCallbacks.forEach((callback) => {\n queueMicrotask(()=>{callback()});\n });\n }\n if(this.localTime >= this.delayTime && (this.localTime <= this.delayTime + this._duration + this.dragTime || this.localTime - deltaTime <= this.delayTime + this._duration + this.dragTime)){\n // console.log(\"local time\", this.localTime);\n // console.log(\"duration\", this.duration);\n // console.log(\"local time would trigger end\", this.localTime >= this._duration + this.delayTime + this.dragTime);\n // console.log(\"delta time\", deltaTime);\n if(this.localTime - deltaTime <= this.delayTime && this.delayTime !== 0 && deltaTime > 0){\n this.startAfterDelayCallbacks.forEach((callback) => {\n queueMicrotask(()=>{callback()});\n });\n this.applyAnimationValue(this.zeroPercentageValue);\n }\n let localTimePercentage = (this.localTime - this.delayTime) / (this._duration);\n let targetPercentage = this.easeFn(localTimePercentage);\n if (localTimePercentage > 1){\n targetPercentage = this.easeFn(1);\n }\n let value: T;\n // console.log(\"currentKeyframeIndex\", this.currentKeyframeIndex, \"length\", this.keyFrames.length);\n if(this.currentKeyframeIndex < this.keyframes.length && this.currentKeyframeIndex >= 0 && (this.reverse ? 1 - this.keyframes[this.currentKeyframeIndex].percentage == targetPercentage : this.keyframes[this.currentKeyframeIndex].percentage == targetPercentage) ){\n value = this.keyframes[this.currentKeyframeIndex].value;\n } else {\n value = this.findValue(targetPercentage, this.keyframes, this.animatableAttributeHelper);\n }\n if(this.reverse){\n while(this.currentKeyframeIndex >= 0 && 1 - this.keyframes[this.currentKeyframeIndex].percentage <= targetPercentage){\n this.currentKeyframeIndex -= 1;\n }\n } else {\n while(this.currentKeyframeIndex < this.keyframes.length && this.keyframes[this.currentKeyframeIndex].percentage <= targetPercentage){\n this.currentKeyframeIndex += 1;\n }\n }\n this.applyAnimationValue(value);\n if(this.localTime >= this._duration + this.dragTime + this.delayTime){\n // console.log(\"animation should end\");\n this.playedTime += 1;\n this.endCallbacks.forEach((callback) => {\n queueMicrotask(()=>{callback()});\n });\n if(!this.loops || (this._maxLoopCount != undefined && this.playedTime >= (this.maxLoopCount ?? 0))){\n // this.onGoing = false;\n // console.log(\"animation should stop after \", this.playedTime, \" loops\");\n this.stop();\n } else {\n // console.log(\"animation should restart\");\n this.onGoing = true;\n this.localTime = 0;\n this.currentKeyframeIndex = 0;\n this.start();\n }\n }\n // if((this.localTime >= this._duration + this.delayTime + this.dragTime) && this.loop){\n // // this.startAnimation();\n // this.localTime = 0;\n // this.onGoing = true;\n // this.currentKeyframeIndex = 0;\n // }\n }\n }\n\n findValue(valuePercentage: number, keyframes: Keyframe<T>[], animatableAttributeHelper: AnimatableAttributeHelper<T>): T{\n if(valuePercentage > 1){\n if(this.reverse){\n return animatableAttributeHelper.lerp(valuePercentage, keyframes[1], keyframes[0]);\n }\n return animatableAttributeHelper.lerp(valuePercentage, keyframes[keyframes.length - 2], keyframes[keyframes.length - 1]);\n }\n if(valuePercentage < 0){\n if(this.reverse){\n return animatableAttributeHelper.lerp(valuePercentage, keyframes[keyframes.length - 2], keyframes[keyframes.length - 1]);\n }\n return animatableAttributeHelper.lerp(valuePercentage, keyframes[1], keyframes[0]);\n }\n let left = 0;\n let right = keyframes.length - 1;\n while (left <= right) {\n let mid = left + Math.floor((right - left) / 2);\n const midPercentage = this.reverse ? 1 - keyframes[mid].percentage : keyframes[mid].percentage;\n if(midPercentage == valuePercentage) {\n return keyframes[mid].value;\n } else if(midPercentage < valuePercentage){\n if(this.reverse){\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n } else {\n if(this.reverse){\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n }\n if(left > keyframes.length - 1){\n // excceding the keyframes\n left = keyframes.length - 1;\n }\n const interpolateStartFrame = this.reverse ? {percentage: 1 - keyframes[left].percentage, value: keyframes[left].value} : keyframes[left - 1];\n const interplateEndFrame = this.reverse ? {percentage: 1 - keyframes[left - 1].percentage, value: keyframes[left - 1].value} : keyframes[left];\n // return animatableAttributeHelper.lerp(valuePercentage, keyframes[left - 1], keyframes[left]);\n return animatableAttributeHelper.lerp(valuePercentage, interpolateStartFrame, interplateEndFrame);\n }\n\n setUp(): void {\n // this.applyAnimationValue(this.keyframes[0].value);\n this.setUpFn();\n }\n\n tearDown(): void {\n this.tearDownFn(); \n }\n\n get loops(): boolean {\n return this.loop;\n }\n\n set loops(loop: boolean) {\n this.loop = loop;\n }\n\n get duration(): number {\n return this._duration + this.delayTime + this.dragTime;\n }\n\n set duration(duration: number) {\n if(duration < 0){\n return;\n }\n const originalDuration = this._duration + this.delayTime + this.dragTime;\n const scale = duration / originalDuration;\n const newDelayTime = this.delayTime * scale;\n const newDragTime = this.dragTime * scale;\n this.delayTime = newDelayTime;\n this.dragTime = newDragTime;\n this._duration = this._duration * scale;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n nonCascadingDuration(newDuration: number): void {\n if(newDuration < 0){\n return;\n }\n const originalDuration = this._duration + this.delayTime + this.dragTime;\n const scale = newDuration / originalDuration;\n const newDelayTime = this.delayTime * scale;\n const newDragTime = this.dragTime * scale;\n this.delayTime = newDelayTime;\n this.dragTime = newDragTime;\n this._duration = newDuration;\n }\n\n resetAnimationState(): void {\n this.onGoing = false;\n this.applyAnimationValue(this.keyframes[0].value);\n this.currentKeyframeIndex = 0;\n this.setUp();\n }\n\n wrapUp(): void {\n this.onGoing = false;\n this.localTime = this._duration + this.dragTime + this.delayTime + 0.1;\n this.currentKeyframeIndex = 0;\n }\n\n get delay(): number {\n return this.delayTime;\n }\n\n set delay(delayTime: number){\n this.delayTime = delayTime;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n get drag(): number {\n return this.dragTime;\n }\n\n set drag(dragTime: number){\n this.dragTime = dragTime;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n get trueDuration(): number {\n return this._duration;\n }\n\n set trueDuration(duration: number){\n this._duration = duration;\n if(this.parent != undefined){\n this.parent.updateDuration();\n }\n }\n\n setParent(parent: AnimatorContainer){\n this.parent = parent;\n }\n\n detachParent(): void {\n this.parent = undefined;\n }\n\n set keyFrames(keyFrames: Keyframe<T>[]){\n this.keyframes = keyFrames;\n this.zeroPercentageValue = this.findValue(0, keyFrames, this.animatableAttributeHelper);\n }\n\n get keyFrames(): Keyframe<T>[]{\n return this.keyframes;\n }\n\n get easeFunction(): (percentage: number) => number {\n return this.easeFn;\n }\n\n set easeFunction(easeFn: (percentage: number) => number){\n this.easeFn = easeFn;\n }\n\n onEnd(callback: Function): UnSubscribe{\n this.endCallbacks.push(callback);\n return ()=>{\n this.endCallbacks = this.endCallbacks.filter((cb) => cb != callback);\n }\n }\n\n onStart(callback: Function): UnSubscribe{\n this.startCallbacks.push(callback);\n return ()=>{\n this.startCallbacks = this.startCallbacks.filter((cb) => cb != callback);\n }\n }\n\n onStartAfterDelay(callback: Function): UnSubscribe{\n this.startAfterDelayCallbacks.push(callback);\n return ()=>{\n this.startAfterDelayCallbacks = this.startAfterDelayCallbacks.filter((cb) => cb != callback);\n }\n }\n\n clearOnEnd(): void {\n this.endCallbacks = [];\n }\n\n clearOnStart(): void {\n this.startCallbacks = [];\n }\n\n get maxLoopCount(): number | undefined {\n return this._maxLoopCount;\n }\n\n set maxLoopCount(maxLoopCount: number | undefined) {\n this._maxLoopCount = maxLoopCount;\n }\n}\n\nexport interface Keyframes<T> {\n keyframes: Keyframe<T>[];\n from(value: T): Keyframes<T>;\n to(value: T): Keyframes<T>;\n insertAt(percentage: number, value: T): void;\n clearFrames(): void;\n}\n\nexport class KeyFramesContiner<T> {\n\n private _keyframes: Keyframe<T>[];\n\n constructor(){\n this._keyframes = [];\n }\n\n get keyframes(): Keyframe<T>[] {\n return this._keyframes;\n }\n\n from(value: T): Keyframes<T>{\n if(this._keyframes.length == 0){\n this._keyframes.push({percentage: 0, value: value});\n } else {\n if(this._keyframes[0].percentage == 0){\n this._keyframes[0].value = value;\n } else {\n this._keyframes.unshift({percentage: 0, value: value});\n }\n }\n return this;\n }\n\n to(value: T): Keyframes<T>{\n if(this._keyframes.length == 0){\n this._keyframes.push({percentage: 1, value: value});\n } else {\n if(this._keyframes[this._keyframes.length - 1].percentage == 1){\n this._keyframes[this._keyframes.length - 1].value = value;\n } else {\n this._keyframes.push({percentage: 1, value: value});\n }\n }\n return this;\n }\n\n insertAt(percentage: number, value: T): void{\n this._keyframes.push({percentage: percentage, value: value});\n }\n\n clearFrames(): void{\n this._keyframes = [];\n }\n}\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "67B42D141857372864756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "A64492CFE695240C64756E2164756E21",
10
10
  "names": []
11
11
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ue-too/animate",
3
3
  "type": "module",
4
- "version": "0.9.5",
4
+ "version": "0.11.0",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -20,7 +20,7 @@
20
20
  "./package.json": "./package.json"
21
21
  },
22
22
  "dependencies": {
23
- "@ue-too/math": "^0.9.5"
23
+ "@ue-too/math": "^0.11.0"
24
24
  },
25
25
  "main": "./index.js",
26
26
  "types": "./index.d.ts",