@thednp/tween 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/Now.ts","../src/Runtime.ts","../src/Tween.ts","../src/Timeline.ts","../src/Easing.ts","../src/interpolators/array.ts","../src/interpolators/path.ts"],"sourcesContent":["let _nowFunc = () => performance.now();\n\nexport const now = (): number => {\n return _nowFunc();\n};\n\nexport function setNow(nowFunction: typeof _nowFunc) {\n _nowFunc = nowFunction;\n}\n","// Runtime.ts\nimport { type Tween } from \"./Tween.ts\";\nimport { type Timeline } from \"./Timeline.ts\";\nimport { now } from \"./Now.ts\";\nimport { TweenProps } from \"./types.ts\";\n\ntype AnimationItem<T extends TweenProps = never> = Tween<T> | Timeline<T>;\n\nexport const Queue: AnimationItem[] = [];\n\nexport function addToQueue<T extends TweenProps>(\n newItem: AnimationItem<T>,\n): void {\n const item = newItem as unknown as AnimationItem<never>;\n if (Queue.includes(item)) return;\n Queue.push(item);\n if (!rafID) Runtime();\n}\n\nexport function removeFromQueue<T extends TweenProps>(\n removedItem: AnimationItem<T>,\n): void {\n Queue.splice(\n Queue.indexOf(removedItem as unknown as AnimationItem<never>),\n 1,\n );\n}\n\nlet rafID = 0;\n\nexport function Runtime(t = now()) {\n let i = 0;\n while (i < Queue.length) {\n if (Queue[i].update(t)) {\n i += 1;\n } else {\n Queue.splice(i, 1);\n }\n }\n\n if (Queue.length === 0) {\n cancelAnimationFrame(rafID);\n rafID = 0;\n } else rafID = requestAnimationFrame(Runtime);\n}\n","// Tween.ts\nimport type {\n BaseTweenProps,\n DeepPartial,\n EasingFunction,\n InterpolatorFunction,\n TweenCallback,\n TweenProps,\n TweenUpdateCallback,\n} from \"./types.ts\";\nimport { addToQueue, removeFromQueue } from \"./Runtime.ts\";\nimport { now } from \"./Now.ts\";\n\nexport class Tween<T extends TweenProps = never> {\n private _interpolators = new Map<string, InterpolatorFunction>();\n private _state: T;\n private _startIsSet = false;\n private _startFired = false;\n private _propsStart: TweenProps = {};\n private _propsEnd: TweenProps = {};\n private _isPlaying = false;\n private _duration = 1000;\n private _delay = 0;\n private _easing: EasingFunction = (t) => t;\n private _startTime: number = 0;\n private _onUpdate?: TweenUpdateCallback<T>;\n private _onComplete?: TweenCallback<T>;\n private _onStart?: TweenCallback<T>;\n private _onStop?: TweenCallback<T>;\n\n constructor(initialValues: T) {\n this._state = initialValues;\n return this;\n }\n\n get isPlaying(): boolean {\n return this._isPlaying;\n }\n\n start(time = now(), overrideStart = false) {\n if (this._isPlaying) return this;\n // istanbul ignore else @preserve\n if (!this._startIsSet || /* istanbul ignore next */ overrideStart) {\n this._startIsSet = true;\n\n this._setProps(\n this._state,\n this._propsStart,\n this._propsEnd,\n overrideStart,\n );\n }\n this._isPlaying = true;\n this._startTime = time;\n this._startTime += this._delay;\n addToQueue(this);\n return this;\n }\n startFromLast(time = now()) {\n return this.start(time, true);\n }\n stop() {\n if (!this._isPlaying) return this;\n removeFromQueue(this);\n this._isPlaying = false;\n this._onStop?.(this._state);\n return this;\n }\n from(startValues: Partial<T>) {\n // this._propsStart = startValues as T;\n Object.assign(this._propsStart, startValues);\n this._startIsSet = false;\n\n return this;\n }\n to(endValues: DeepPartial<T>) {\n this._propsEnd = endValues as TweenProps;\n this._startIsSet = false;\n\n return this;\n }\n duration(seconds = 1) {\n this._duration = seconds * 1000;\n return this;\n }\n delay(seconds = 0) {\n this._delay = seconds * 1000;\n return this;\n }\n\n easing(easing: EasingFunction = (t: number) => t) {\n this._easing = easing;\n return this;\n }\n getDuration() {\n return this._duration;\n }\n /**\n * @param time - The current time\n * @param autoStart - When true, calling update will implicitly call start()\n * as well. Note, if you stop() or end() the tween, but are still calling\n * update(), it will start again!\n *\n * @returns true if the tween is still playing after the update, false\n * otherwise (calling update on a paused tween still returns true because\n * it is still playing, just paused).\n */\n update(time = now(), autoStart?: boolean) {\n // istanbul ignore else\n if (!this._isPlaying) {\n // istanbul ignore else\n if (autoStart) this.start(time, true);\n else return false;\n }\n\n // istanbul ignore else\n if (time < this._startTime) return true;\n\n // istanbul ignore else\n if (!this._startFired && this._onStart) {\n this._onStart(this._state);\n this._startFired = true;\n }\n\n let elapsed = (time - this._startTime) / this._duration;\n elapsed = this._duration === 0 || elapsed > 1 ? 1 : elapsed;\n const progress = this._easing(elapsed);\n\n this._setState(\n this._state,\n this._propsStart,\n this._propsEnd,\n progress,\n );\n\n this._onUpdate?.(this._state, elapsed, progress);\n\n // istanbul ignore else\n if (elapsed === 1) {\n this._onComplete?.(this._state);\n this._isPlaying = false;\n\n return false;\n }\n return true;\n }\n\n onStart(callback: TweenCallback<T>) {\n this._onStart = callback;\n return this;\n }\n onUpdate(callback?: TweenUpdateCallback<T>) {\n this._onUpdate = callback;\n return this;\n }\n onComplete(callback: TweenCallback<T>) {\n this._onComplete = callback;\n return this;\n }\n onStop(callback: TweenCallback<T>) {\n this._onStop = callback;\n return this;\n }\n\n private _setState(\n object: TweenProps | BaseTweenProps,\n valuesStart: TweenProps | BaseTweenProps,\n valuesEnd: Partial<T> | TweenProps | BaseTweenProps,\n value: number,\n ): void {\n const endEntries = Object.entries(valuesEnd);\n const len = endEntries.length;\n\n let i = 0;\n while (i < len) {\n const [property, end] = endEntries[i];\n i++;\n // Don't update properties that do not exist in the source object\n // istanbul ignore else\n if (valuesStart[property] === undefined) continue;\n\n const start = valuesStart[property];\n\n // Protect against non matching properties.\n // istanbul ignore else @preserve\n if (start.constructor !== end?.constructor) continue;\n\n // Protect against non numeric properties.\n // istanbul ignore else @preserve\n if (this._interpolators.has(property)) {\n const interpolator = this._interpolators.get(property)!;\n object[property] = interpolator(start as never, end as never, value);\n } else if (typeof end === \"number\") {\n object[property] = (start as number) +\n (end - (start as number)) * value;\n } else if (typeof end === \"object\") {\n this._setState(\n object[property] as BaseTweenProps,\n start as BaseTweenProps,\n end as BaseTweenProps,\n value,\n );\n }\n }\n }\n private _setProps(\n obj: T,\n propsStart: TweenProps,\n propsEnd: TweenProps,\n overrideStartingValues: boolean,\n ): void {\n const endKeys = Object.keys(propsEnd);\n\n for (const property of endKeys) {\n const startValue = obj[property];\n\n // Save the starting value, but only once unless override is requested.\n // istanbul ignore else\n if (\n typeof propsStart[property] === \"undefined\" ||\n overrideStartingValues\n ) {\n propsStart[property] = startValue;\n }\n }\n }\n use(\n property: string,\n interpolateFn: InterpolatorFunction,\n ): this {\n // istanbul ignore else\n if (!this._interpolators.has(property)) {\n this._interpolators.set(property, interpolateFn);\n }\n return this;\n }\n}\n","// Timeline.ts\nimport type {\n BaseTweenProps,\n DeepPartial,\n InterpolatorFunction,\n Position,\n TimelineCallback,\n TimelineEntry,\n TimelineEntryConfig,\n TweenProps,\n} from \"./types.ts\";\nimport { addToQueue, removeFromQueue } from \"./Runtime.ts\";\nimport { now } from \"./Now.ts\";\n\nexport class Timeline<T extends TweenProps = never> {\n public state: T;\n private _state: T;\n private _entries: TimelineEntry<T>[] = [];\n private _labels = new Map<string, number>();\n private _progress = 0;\n private _duration = 0;\n private _time = 0;\n private _pauseTime = 0;\n private _lastTime?: number;\n private _isPlaying = false;\n private _repeat = 0;\n private _initialRepeat = 0;\n private _interpolators = new Map<string, InterpolatorFunction>();\n private _onStart?: TimelineCallback<T>;\n private _onStop?: TimelineCallback<T>;\n private _onPause?: TimelineCallback<T>;\n private _onResume?: TimelineCallback<T>;\n private _onUpdate?: TimelineCallback<T>;\n private _onComplete?: TimelineCallback<T>;\n\n constructor(initialState: T) {\n this.state = initialState;\n this._state = { ...initialState };\n }\n\n to(\n {\n duration = 1,\n easing = (t) => t,\n ...values\n }: DeepPartial<T> & TimelineEntryConfig,\n position: Position = \"+=0\",\n ): this {\n const startTime = this._resolvePosition(position);\n const to = values as TweenProps & DeepPartial<T>;\n const entryDuration = duration * 1000;\n\n this._entries.push({\n to,\n startTime,\n duration: entryDuration,\n easing,\n hasStarted: false,\n });\n\n const endTime = startTime + entryDuration;\n this._duration = Math.max(this._duration, endTime);\n\n return this;\n }\n\n play(): this {\n if (this._pauseTime) return this.resume();\n if (this._isPlaying) return this;\n\n this._isPlaying = true;\n this._lastTime = undefined;\n this._time = 0;\n this._resetState();\n this._updateEntries(0);\n this._onStart?.(this.state, 0);\n\n addToQueue(this);\n return this;\n }\n\n pause(): this {\n if (!this._isPlaying) return this;\n this._isPlaying = false;\n this._pauseTime = now();\n this._onPause?.(this.state, this.progress);\n return this;\n }\n\n resume(time = now()): this {\n if (this._isPlaying) return this;\n this._isPlaying = true;\n const dif = time - this._pauseTime;\n this._pauseTime = 0;\n this._lastTime = (this._lastTime || time) + dif;\n this._onResume?.(this.state, this.progress);\n\n addToQueue(this);\n return this;\n }\n\n stop(): this {\n if (!this._isPlaying) return this;\n this._isPlaying = false;\n this._time = 0;\n this._pauseTime = 0;\n removeFromQueue(this);\n this._resetState();\n this._updateEntries(0);\n this._onStop?.(this.state, this._progress);\n return this;\n }\n\n repeat(count = 0): this {\n this._repeat = count;\n this._initialRepeat = count;\n return this;\n }\n\n seek(pointer: number | string): this {\n const elapsed = this._resolvePosition(pointer);\n this._resetState();\n this._time = Math.max(0, elapsed);\n this._updateEntries(this._time);\n return this;\n }\n\n label(name: string, position?: Position): this {\n this._labels.set(name, this._resolvePosition(position));\n return this;\n }\n\n onStart(cb: TimelineCallback<T>): this {\n this._onStart = cb;\n return this;\n }\n\n onPause(cb: TimelineCallback<T>): this {\n this._onPause = cb;\n return this;\n }\n\n onResume(cb: TimelineCallback<T>): this {\n this._onResume = cb;\n return this;\n }\n\n onStop(cb: TimelineCallback<T>): this {\n this._onStop = cb;\n return this;\n }\n\n onUpdate(cb: TimelineCallback<T>): this {\n this._onUpdate = cb;\n return this;\n }\n\n onComplete(cb: TimelineCallback<T>): this {\n this._onComplete = cb;\n return this;\n }\n\n get progress(): number {\n return this._progress;\n }\n\n get duration(): number {\n return this._duration;\n }\n\n get isPlaying(): boolean {\n return this._isPlaying;\n }\n\n get isPaused(): boolean {\n return !this._isPlaying && this._pauseTime > 0;\n }\n\n update(time = now()) {\n if (!this._isPlaying) return false;\n if (this._lastTime === undefined) this._lastTime = time;\n const delta = time - this._lastTime;\n this._lastTime = time;\n this._time += delta;\n\n this._updateEntries(this._time);\n\n // istanbul ignore else\n if (this._progress === 1) {\n // istanbul ignore else\n if (this._repeat === 0) {\n this._isPlaying = false;\n this._repeat = this._initialRepeat;\n\n this._onComplete?.(this.state, 1);\n } else {\n // istanbul ignore else @preserve\n if (this._repeat !== Infinity) this._repeat--;\n this._time = 0;\n this._resetState();\n this._updateEntries(0);\n }\n }\n return this._isPlaying;\n }\n\n private _updateEntries(elapsed: number) {\n this._progress = this._duration === 0 || elapsed >= this._duration\n ? 1\n : elapsed / this._duration;\n\n let i = 0;\n const entriesLen = this._entries.length;\n while (i < entriesLen) {\n const entry = this._entries[i];\n const localTime = elapsed - entry.startTime;\n const tweenElapsed = Math.max(0, Math.min(1, localTime / entry.duration));\n\n if (!entry.hasStarted && tweenElapsed > 0) {\n entry.hasStarted = true;\n entry.startValues = {};\n for (const key in entry.to) {\n entry.startValues[key] = this.state[key];\n }\n }\n\n if (entry.hasStarted) {\n this._setState(\n this.state,\n entry.startValues as TweenProps & DeepPartial<T>,\n entry.to as TweenProps & DeepPartial<T>,\n entry.easing(tweenElapsed),\n );\n }\n i += 1;\n }\n\n this._onUpdate?.(this.state, this._progress);\n }\n\n private _resolvePosition(pos?: Position): number {\n if (typeof pos === \"number\") return pos * 1000;\n\n // istanbul ignore else @preserve\n if (typeof pos === \"string\") {\n // First try label\n const labelTime = this._labels.get(pos);\n if (labelTime !== undefined) return labelTime;\n\n // Then relative\n // istanbul ignore else @preserve\n if (pos.startsWith(\"+=\") || pos.startsWith(\"-=\")) {\n let offset = parseFloat(pos.slice(2));\n if (isNaN(offset)) offset = 0;\n offset *= 1000;\n return pos.startsWith(\"+=\")\n ? this._duration + offset\n : Math.max(0, this._duration - offset);\n }\n }\n\n // fallback to current duration\n return this._duration;\n }\n\n private _setState(\n object: TweenProps | BaseTweenProps,\n valuesStart: TweenProps | BaseTweenProps,\n valuesEnd: Partial<T> | TweenProps | BaseTweenProps,\n value: number,\n ): void {\n const endEntries = Object.entries(valuesEnd);\n const len = endEntries.length;\n let i = 0;\n\n while (i < len) {\n const [property, end] = endEntries[i];\n i++;\n if (valuesStart[property] === undefined) continue;\n\n const start = valuesStart[property];\n\n if (start.constructor !== end?.constructor) continue;\n\n // istanbul ignore else @preserve\n if (this._interpolators.has(property)) {\n const interpolator = this._interpolators.get(property)!;\n object[property] = interpolator(start as never, end as never, value);\n } else if (typeof end === \"number\") {\n object[property] = (start as number) +\n (end - (start as number)) * value;\n } else if (typeof end === \"object\") {\n this._setState(\n object[property] as BaseTweenProps,\n start as BaseTweenProps,\n end as BaseTweenProps,\n value,\n );\n }\n }\n }\n\n private _resetState() {\n Object.assign(this.state, this._state);\n let i = 0;\n const entriesLen = this._entries.length;\n while (i < entriesLen) {\n const entry = this._entries[i];\n entry.hasStarted = false;\n entry.startValues = undefined;\n i += 1;\n }\n }\n\n clear() {\n this._entries.length = 0;\n this._duration = 0;\n this._labels.clear();\n this._time = 0;\n this._progress = 0;\n this._pauseTime = 0;\n this._lastTime = undefined;\n // Optionally reset repeat if you want fresh repeats on remount\n this._repeat = this._initialRepeat;\n return this;\n }\n\n use(\n property: string,\n interpolateFn: InterpolatorFunction,\n ): this {\n if (!this._interpolators.has(property)) {\n this._interpolators.set(property, interpolateFn);\n }\n return this;\n }\n}\n","// Easing.ts\nimport type { EasingFunction, EasingFunctionGroup } from \"./types.ts\";\n\n/**\n * The Ease class provides a collection of easing functions for use with tween.js.\n */\n\nexport const Easing = Object.freeze({\n Linear: Object.freeze<EasingFunctionGroup & { None: EasingFunction }>({\n None(amount: number): number {\n return amount;\n },\n In(amount: number): number {\n return amount;\n },\n Out(amount: number): number {\n return amount;\n },\n InOut(amount: number): number {\n return amount;\n },\n }),\n\n Quadratic: Object.freeze(\n <EasingFunctionGroup> {\n In(amount: number): number {\n return amount * amount;\n },\n Out(amount: number): number {\n return amount * (2 - amount);\n },\n InOut(amount: number): number {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount;\n }\n\n return -0.5 * (--amount * (amount - 2) - 1);\n },\n },\n ),\n\n Cubic: Object.freeze(\n <EasingFunctionGroup> {\n In(amount: number): number {\n return amount * amount * amount;\n },\n Out(amount: number): number {\n return --amount * amount * amount + 1;\n },\n InOut(amount: number): number {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount;\n }\n return 0.5 * ((amount -= 2) * amount * amount + 2);\n },\n },\n ),\n\n Quartic: Object.freeze(\n <EasingFunctionGroup> {\n In(amount: number): number {\n return amount * amount * amount * amount;\n },\n Out(amount: number): number {\n return 1 - --amount * amount * amount * amount;\n },\n InOut(amount: number): number {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount * amount;\n }\n\n return -0.5 * ((amount -= 2) * amount * amount * amount - 2);\n },\n },\n ),\n\n Quintic: Object.freeze(\n <EasingFunctionGroup> {\n In(amount: number): number {\n return amount * amount * amount * amount * amount;\n },\n Out(amount: number): number {\n return --amount * amount * amount * amount * amount + 1;\n },\n InOut(amount: number): number {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount * amount * amount;\n }\n\n return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2);\n },\n },\n ),\n\n Sinusoidal: Object.freeze(\n <EasingFunctionGroup> {\n In(amount: number): number {\n return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2);\n },\n Out(amount: number): number {\n return Math.sin((amount * Math.PI) / 2);\n },\n InOut(amount: number): number {\n return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount)));\n },\n },\n ),\n\n Exponential: Object.freeze(\n <EasingFunctionGroup> {\n In(amount: number): number {\n return amount === 0 ? 0 : Math.pow(1024, amount - 1);\n },\n Out(amount: number): number {\n return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount);\n },\n InOut(amount: number): number {\n if (amount === 0) {\n return 0;\n }\n\n if (amount === 1) {\n return 1;\n }\n\n if ((amount *= 2) < 1) {\n return 0.5 * Math.pow(1024, amount - 1);\n }\n\n return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2);\n },\n },\n ),\n\n Circular: Object.freeze(\n <EasingFunctionGroup> {\n In(amount: number): number {\n return 1 - Math.sqrt(1 - amount * amount);\n },\n Out(amount: number): number {\n return Math.sqrt(1 - --amount * amount);\n },\n InOut(amount: number): number {\n if ((amount *= 2) < 1) {\n return -0.5 * (Math.sqrt(1 - amount * amount) - 1);\n }\n return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1);\n },\n },\n ),\n\n Elastic: Object.freeze(\n <EasingFunctionGroup> {\n In(amount: number): number {\n if (amount === 0) {\n return 0;\n }\n\n if (amount === 1) {\n return 1;\n }\n\n return (\n -Math.pow(2, 10 * (amount - 1)) *\n Math.sin((amount - 1.1) * 5 * Math.PI)\n );\n },\n Out(amount: number): number {\n if (amount === 0) {\n return 0;\n }\n\n if (amount === 1) {\n return 1;\n }\n return (\n Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1\n );\n },\n InOut(amount: number): number {\n if (amount === 0) {\n return 0;\n }\n\n if (amount === 1) {\n return 1;\n }\n\n amount *= 2;\n\n if (amount < 1) {\n return (\n -0.5 *\n Math.pow(2, 10 * (amount - 1)) *\n Math.sin((amount - 1.1) * 5 * Math.PI)\n );\n }\n\n return (\n 0.5 *\n Math.pow(2, -10 * (amount - 1)) *\n Math.sin((amount - 1.1) * 5 * Math.PI) +\n 1\n );\n },\n },\n ),\n\n Back: Object.freeze(\n <EasingFunctionGroup> {\n In(amount: number): number {\n const s = 1.70158;\n return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s);\n },\n Out(amount: number): number {\n const s = 1.70158;\n return amount === 0\n ? 0\n : --amount * amount * ((s + 1) * amount + s) + 1;\n },\n InOut(amount: number): number {\n const s = 1.70158 * 1.525;\n if ((amount *= 2) < 1) {\n return 0.5 * (amount * amount * ((s + 1) * amount - s));\n }\n return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2);\n },\n },\n ),\n\n Bounce: Object.freeze(\n <EasingFunctionGroup> {\n In(amount: number): number {\n return 1 - Easing.Bounce.Out(1 - amount);\n },\n Out(amount: number): number {\n if (amount < 1 / 2.75) {\n return 7.5625 * amount * amount;\n } else if (amount < 2 / 2.75) {\n return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75;\n } else if (amount < 2.5 / 2.75) {\n return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375;\n } else {\n return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375;\n }\n },\n InOut(amount: number): number {\n if (amount < 0.5) {\n return Easing.Bounce.In(amount * 2) * 0.5;\n }\n return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5;\n },\n },\n ),\n\n pow(power = 4): EasingFunctionGroup {\n power = power < Number.EPSILON ? Number.EPSILON : power;\n power = power > 10000 ? 10000 : power;\n return {\n In(amount: number): number {\n return amount ** power;\n },\n Out(amount: number): number {\n return 1 - (1 - amount) ** power;\n },\n InOut(amount: number): number {\n if (amount < 0.5) {\n return (amount * 2) ** power / 2;\n }\n return (1 - (2 - amount * 2) ** power) / 2 + 0.5;\n },\n };\n },\n});\n","// interpolators/array.ts\nimport { InterpolatorFunction } from \"../types.ts\";\n\nexport const interpolateArray: InterpolatorFunction<number[]> = <\n T extends number[],\n>(\n start: T,\n end: T,\n value: number,\n) => {\n if (value === 0 && start.length !== end.length) {\n console.warn(\"Array length mismatch. Returning first array.\");\n return start;\n }\n const result = [] as unknown as T;\n const len = end.length;\n let i = 0;\n\n while (i < len) {\n result.push(start[i] + (end[i] - start[i]) * value);\n i += 1;\n }\n return result;\n};\n","// interpolators/path.ts\nimport type {\n CubeValues,\n InterpolatorFunction,\n LineValues,\n MorphPathArray,\n MorphPathSegment,\n} from \"../types.ts\";\n\n/**\n * NOTE: Path interpolation only works when both paths have:\n * - Identical command structure (same number and order of M/L/C/Z)\n * - Corresponding coordinates to interpolate\n * Complex morphs (square → triangle) require preprocessing (e.g. KUTE.JS, Flubber)\n * @param start - A starting PathArray value\n * @param end - A starting PathArray value\n * @param t - The progress\n * @returns The interpolated PathArray value\n */\n\nexport const interpolatePath: InterpolatorFunction<MorphPathArray> = <\n T extends MorphPathArray,\n>(\n start: T,\n end: T,\n t: number,\n): T => {\n if (t === 0 && start.length !== end.length) {\n console.warn(\"Path length mismatch. Returning start path.\");\n return start;\n }\n const result = [] as unknown as T;\n\n for (let i = 0; i < end.length; i += 1) {\n const [pathCommand1, values1] = [\n start[i][0],\n start[i].slice(1) as LineValues | CubeValues,\n ];\n const [pathCommand2, values2] = [\n end[i][0],\n end[i].slice(1) as LineValues | CubeValues,\n ];\n const commandMismatch = pathCommand1 !== pathCommand2;\n\n if (t === 0 && (values1.length !== values2.length || commandMismatch)) {\n console.warn(\n (commandMismatch ? \"PathCommand\" : \"Params\") +\n \" mismatch at index: \" +\n i +\n \". Returning start path.\",\n );\n return start;\n }\n\n if (pathCommand1.toUpperCase() === \"Z\") {\n result.push([\"Z\"]);\n } else {\n const resValues = [] as unknown as CubeValues | LineValues;\n\n for (let j = 0; j < values2.length; j += 1) {\n resValues.push(values1[j] + (values2[j] - values1[j]) * t);\n }\n result.push([pathCommand2, ...resValues] as MorphPathSegment);\n }\n }\n\n return result;\n};\n"],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ //#region src/types.d.ts
2
+ type DeepPartial<T> = T extends Record<string, T[keyof T]> ? Partial<T> | { [P in keyof T]?: DeepPartial<T[P]> } : T;
3
+ type BaseTweenProps = Record<string, number>;
4
+ type TweenProps = Record<string, number | number[] | BaseTweenProps | MorphPathArray>;
5
+ type TimelineCallback<T extends TweenProps> = (state: T, progress: number) => void;
6
+ type TweenUpdateCallback<T extends TweenProps> = (obj: T, elapsed: number, progress: number) => void;
7
+ type TweenCallback<T extends TweenProps> = (obj: T) => void;
8
+ type EasingFunction = (amount: number) => number;
9
+ type EasingFunctionGroup = {
10
+ In: EasingFunction;
11
+ Out: EasingFunction;
12
+ InOut: EasingFunction;
13
+ };
14
+ type Position = number | string;
15
+ type InterpolatorFunction<I extends number[] | MorphPathArray = never> = <T extends I>(start: T, end: T, t: number) => T;
16
+ interface TimelineEntryConfig {
17
+ duration?: number;
18
+ easing?: EasingFunction;
19
+ }
20
+ interface TimelineEntry<T extends TweenProps> {
21
+ to: TweenProps | DeepPartial<T>;
22
+ startTime: number;
23
+ duration: number;
24
+ easing: EasingFunction;
25
+ startValues?: TweenProps | DeepPartial<T>;
26
+ hasStarted?: boolean;
27
+ }
28
+ type LineValues = [number, number];
29
+ type CubeValues = [number, number, number, number, number, number];
30
+ type MorphPathSegment = ["M" | "L", number, number] | ["C", number, number, number, number, number, number] | ["Z"];
31
+ type MorphPathArray = Array<MorphPathSegment>;
32
+ //#endregion
33
+ //#region src/Tween.d.ts
34
+ declare class Tween<T extends TweenProps = never> {
35
+ private _interpolators;
36
+ private _state;
37
+ private _startIsSet;
38
+ private _startFired;
39
+ private _propsStart;
40
+ private _propsEnd;
41
+ private _isPlaying;
42
+ private _duration;
43
+ private _delay;
44
+ private _easing;
45
+ private _startTime;
46
+ private _onUpdate?;
47
+ private _onComplete?;
48
+ private _onStart?;
49
+ private _onStop?;
50
+ constructor(initialValues: T);
51
+ get isPlaying(): boolean;
52
+ start(time?: number, overrideStart?: boolean): this;
53
+ startFromLast(time?: number): this;
54
+ stop(): this;
55
+ from(startValues: Partial<T>): this;
56
+ to(endValues: DeepPartial<T>): this;
57
+ duration(seconds?: number): this;
58
+ delay(seconds?: number): this;
59
+ easing(easing?: EasingFunction): this;
60
+ getDuration(): number;
61
+ /**
62
+ * @param time - The current time
63
+ * @param autoStart - When true, calling update will implicitly call start()
64
+ * as well. Note, if you stop() or end() the tween, but are still calling
65
+ * update(), it will start again!
66
+ *
67
+ * @returns true if the tween is still playing after the update, false
68
+ * otherwise (calling update on a paused tween still returns true because
69
+ * it is still playing, just paused).
70
+ */
71
+ update(time?: number, autoStart?: boolean): boolean;
72
+ onStart(callback: TweenCallback<T>): this;
73
+ onUpdate(callback?: TweenUpdateCallback<T>): this;
74
+ onComplete(callback: TweenCallback<T>): this;
75
+ onStop(callback: TweenCallback<T>): this;
76
+ private _setState;
77
+ private _setProps;
78
+ use(property: string, interpolateFn: InterpolatorFunction): this;
79
+ }
80
+ //#endregion
81
+ //#region src/Timeline.d.ts
82
+ declare class Timeline<T extends TweenProps = never> {
83
+ state: T;
84
+ private _state;
85
+ private _entries;
86
+ private _labels;
87
+ private _progress;
88
+ private _duration;
89
+ private _time;
90
+ private _pauseTime;
91
+ private _lastTime?;
92
+ private _isPlaying;
93
+ private _repeat;
94
+ private _initialRepeat;
95
+ private _interpolators;
96
+ private _onStart?;
97
+ private _onStop?;
98
+ private _onPause?;
99
+ private _onResume?;
100
+ private _onUpdate?;
101
+ private _onComplete?;
102
+ constructor(initialState: T);
103
+ to({
104
+ duration,
105
+ easing,
106
+ ...values
107
+ }: DeepPartial<T> & TimelineEntryConfig, position?: Position): this;
108
+ play(): this;
109
+ pause(): this;
110
+ resume(time?: number): this;
111
+ stop(): this;
112
+ repeat(count?: number): this;
113
+ seek(pointer: number | string): this;
114
+ label(name: string, position?: Position): this;
115
+ onStart(cb: TimelineCallback<T>): this;
116
+ onPause(cb: TimelineCallback<T>): this;
117
+ onResume(cb: TimelineCallback<T>): this;
118
+ onStop(cb: TimelineCallback<T>): this;
119
+ onUpdate(cb: TimelineCallback<T>): this;
120
+ onComplete(cb: TimelineCallback<T>): this;
121
+ get progress(): number;
122
+ get duration(): number;
123
+ get isPlaying(): boolean;
124
+ get isPaused(): boolean;
125
+ update(time?: number): boolean;
126
+ private _updateEntries;
127
+ private _resolvePosition;
128
+ private _setState;
129
+ private _resetState;
130
+ clear(): this;
131
+ use(property: string, interpolateFn: InterpolatorFunction): this;
132
+ }
133
+ //#endregion
134
+ //#region src/Easing.d.ts
135
+ /**
136
+ * The Ease class provides a collection of easing functions for use with tween.js.
137
+ */
138
+ declare const Easing: Readonly<{
139
+ Linear: Readonly<EasingFunctionGroup & {
140
+ None: EasingFunction;
141
+ }>;
142
+ Quadratic: Readonly<EasingFunctionGroup>;
143
+ Cubic: Readonly<EasingFunctionGroup>;
144
+ Quartic: Readonly<EasingFunctionGroup>;
145
+ Quintic: Readonly<EasingFunctionGroup>;
146
+ Sinusoidal: Readonly<EasingFunctionGroup>;
147
+ Exponential: Readonly<EasingFunctionGroup>;
148
+ Circular: Readonly<EasingFunctionGroup>;
149
+ Elastic: Readonly<EasingFunctionGroup>;
150
+ Back: Readonly<EasingFunctionGroup>;
151
+ Bounce: Readonly<EasingFunctionGroup>;
152
+ pow(power?: number): EasingFunctionGroup;
153
+ }>;
154
+ //#endregion
155
+ //#region src/Runtime.d.ts
156
+ type AnimationItem<T extends TweenProps = never> = Tween<T> | Timeline<T>;
157
+ declare const Queue: AnimationItem[];
158
+ declare function addToQueue<T extends TweenProps>(newItem: AnimationItem<T>): void;
159
+ declare function removeFromQueue<T extends TweenProps>(removedItem: AnimationItem<T>): void;
160
+ declare function Runtime(t?: number): void;
161
+ //#endregion
162
+ //#region src/Now.d.ts
163
+ declare let _nowFunc: () => number;
164
+ declare const now: () => number;
165
+ declare function setNow(nowFunction: typeof _nowFunc): void;
166
+ //#endregion
167
+ //#region src/interpolators/array.d.ts
168
+ declare const interpolateArray: InterpolatorFunction<number[]>;
169
+ //#endregion
170
+ //#region src/interpolators/path.d.ts
171
+ /**
172
+ * NOTE: Path interpolation only works when both paths have:
173
+ * - Identical command structure (same number and order of M/L/C/Z)
174
+ * - Corresponding coordinates to interpolate
175
+ * Complex morphs (square → triangle) require preprocessing (e.g. KUTE.JS, Flubber)
176
+ * @param start - A starting PathArray value
177
+ * @param end - A starting PathArray value
178
+ * @param t - The progress
179
+ * @returns The interpolated PathArray value
180
+ */
181
+ declare const interpolatePath: InterpolatorFunction<MorphPathArray>;
182
+ //#endregion
183
+ export { BaseTweenProps, CubeValues, DeepPartial, Easing, EasingFunction, EasingFunctionGroup, InterpolatorFunction, LineValues, MorphPathArray, MorphPathSegment, Position, Queue, Runtime, Timeline, TimelineCallback, TimelineEntry, TimelineEntryConfig, Tween, TweenCallback, TweenProps, TweenUpdateCallback, addToQueue, interpolateArray, interpolatePath, now, removeFromQueue, setNow };
184
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1,184 @@
1
+ //#region src/types.d.ts
2
+ type DeepPartial<T> = T extends Record<string, T[keyof T]> ? Partial<T> | { [P in keyof T]?: DeepPartial<T[P]> } : T;
3
+ type BaseTweenProps = Record<string, number>;
4
+ type TweenProps = Record<string, number | number[] | BaseTweenProps | MorphPathArray>;
5
+ type TimelineCallback<T extends TweenProps> = (state: T, progress: number) => void;
6
+ type TweenUpdateCallback<T extends TweenProps> = (obj: T, elapsed: number, progress: number) => void;
7
+ type TweenCallback<T extends TweenProps> = (obj: T) => void;
8
+ type EasingFunction = (amount: number) => number;
9
+ type EasingFunctionGroup = {
10
+ In: EasingFunction;
11
+ Out: EasingFunction;
12
+ InOut: EasingFunction;
13
+ };
14
+ type Position = number | string;
15
+ type InterpolatorFunction<I extends number[] | MorphPathArray = never> = <T extends I>(start: T, end: T, t: number) => T;
16
+ interface TimelineEntryConfig {
17
+ duration?: number;
18
+ easing?: EasingFunction;
19
+ }
20
+ interface TimelineEntry<T extends TweenProps> {
21
+ to: TweenProps | DeepPartial<T>;
22
+ startTime: number;
23
+ duration: number;
24
+ easing: EasingFunction;
25
+ startValues?: TweenProps | DeepPartial<T>;
26
+ hasStarted?: boolean;
27
+ }
28
+ type LineValues = [number, number];
29
+ type CubeValues = [number, number, number, number, number, number];
30
+ type MorphPathSegment = ["M" | "L", number, number] | ["C", number, number, number, number, number, number] | ["Z"];
31
+ type MorphPathArray = Array<MorphPathSegment>;
32
+ //#endregion
33
+ //#region src/Tween.d.ts
34
+ declare class Tween<T extends TweenProps = never> {
35
+ private _interpolators;
36
+ private _state;
37
+ private _startIsSet;
38
+ private _startFired;
39
+ private _propsStart;
40
+ private _propsEnd;
41
+ private _isPlaying;
42
+ private _duration;
43
+ private _delay;
44
+ private _easing;
45
+ private _startTime;
46
+ private _onUpdate?;
47
+ private _onComplete?;
48
+ private _onStart?;
49
+ private _onStop?;
50
+ constructor(initialValues: T);
51
+ get isPlaying(): boolean;
52
+ start(time?: number, overrideStart?: boolean): this;
53
+ startFromLast(time?: number): this;
54
+ stop(): this;
55
+ from(startValues: Partial<T>): this;
56
+ to(endValues: DeepPartial<T>): this;
57
+ duration(seconds?: number): this;
58
+ delay(seconds?: number): this;
59
+ easing(easing?: EasingFunction): this;
60
+ getDuration(): number;
61
+ /**
62
+ * @param time - The current time
63
+ * @param autoStart - When true, calling update will implicitly call start()
64
+ * as well. Note, if you stop() or end() the tween, but are still calling
65
+ * update(), it will start again!
66
+ *
67
+ * @returns true if the tween is still playing after the update, false
68
+ * otherwise (calling update on a paused tween still returns true because
69
+ * it is still playing, just paused).
70
+ */
71
+ update(time?: number, autoStart?: boolean): boolean;
72
+ onStart(callback: TweenCallback<T>): this;
73
+ onUpdate(callback?: TweenUpdateCallback<T>): this;
74
+ onComplete(callback: TweenCallback<T>): this;
75
+ onStop(callback: TweenCallback<T>): this;
76
+ private _setState;
77
+ private _setProps;
78
+ use(property: string, interpolateFn: InterpolatorFunction): this;
79
+ }
80
+ //#endregion
81
+ //#region src/Timeline.d.ts
82
+ declare class Timeline<T extends TweenProps = never> {
83
+ state: T;
84
+ private _state;
85
+ private _entries;
86
+ private _labels;
87
+ private _progress;
88
+ private _duration;
89
+ private _time;
90
+ private _pauseTime;
91
+ private _lastTime?;
92
+ private _isPlaying;
93
+ private _repeat;
94
+ private _initialRepeat;
95
+ private _interpolators;
96
+ private _onStart?;
97
+ private _onStop?;
98
+ private _onPause?;
99
+ private _onResume?;
100
+ private _onUpdate?;
101
+ private _onComplete?;
102
+ constructor(initialState: T);
103
+ to({
104
+ duration,
105
+ easing,
106
+ ...values
107
+ }: DeepPartial<T> & TimelineEntryConfig, position?: Position): this;
108
+ play(): this;
109
+ pause(): this;
110
+ resume(time?: number): this;
111
+ stop(): this;
112
+ repeat(count?: number): this;
113
+ seek(pointer: number | string): this;
114
+ label(name: string, position?: Position): this;
115
+ onStart(cb: TimelineCallback<T>): this;
116
+ onPause(cb: TimelineCallback<T>): this;
117
+ onResume(cb: TimelineCallback<T>): this;
118
+ onStop(cb: TimelineCallback<T>): this;
119
+ onUpdate(cb: TimelineCallback<T>): this;
120
+ onComplete(cb: TimelineCallback<T>): this;
121
+ get progress(): number;
122
+ get duration(): number;
123
+ get isPlaying(): boolean;
124
+ get isPaused(): boolean;
125
+ update(time?: number): boolean;
126
+ private _updateEntries;
127
+ private _resolvePosition;
128
+ private _setState;
129
+ private _resetState;
130
+ clear(): this;
131
+ use(property: string, interpolateFn: InterpolatorFunction): this;
132
+ }
133
+ //#endregion
134
+ //#region src/Easing.d.ts
135
+ /**
136
+ * The Ease class provides a collection of easing functions for use with tween.js.
137
+ */
138
+ declare const Easing: Readonly<{
139
+ Linear: Readonly<EasingFunctionGroup & {
140
+ None: EasingFunction;
141
+ }>;
142
+ Quadratic: Readonly<EasingFunctionGroup>;
143
+ Cubic: Readonly<EasingFunctionGroup>;
144
+ Quartic: Readonly<EasingFunctionGroup>;
145
+ Quintic: Readonly<EasingFunctionGroup>;
146
+ Sinusoidal: Readonly<EasingFunctionGroup>;
147
+ Exponential: Readonly<EasingFunctionGroup>;
148
+ Circular: Readonly<EasingFunctionGroup>;
149
+ Elastic: Readonly<EasingFunctionGroup>;
150
+ Back: Readonly<EasingFunctionGroup>;
151
+ Bounce: Readonly<EasingFunctionGroup>;
152
+ pow(power?: number): EasingFunctionGroup;
153
+ }>;
154
+ //#endregion
155
+ //#region src/Runtime.d.ts
156
+ type AnimationItem<T extends TweenProps = never> = Tween<T> | Timeline<T>;
157
+ declare const Queue: AnimationItem[];
158
+ declare function addToQueue<T extends TweenProps>(newItem: AnimationItem<T>): void;
159
+ declare function removeFromQueue<T extends TweenProps>(removedItem: AnimationItem<T>): void;
160
+ declare function Runtime(t?: number): void;
161
+ //#endregion
162
+ //#region src/Now.d.ts
163
+ declare let _nowFunc: () => number;
164
+ declare const now: () => number;
165
+ declare function setNow(nowFunction: typeof _nowFunc): void;
166
+ //#endregion
167
+ //#region src/interpolators/array.d.ts
168
+ declare const interpolateArray: InterpolatorFunction<number[]>;
169
+ //#endregion
170
+ //#region src/interpolators/path.d.ts
171
+ /**
172
+ * NOTE: Path interpolation only works when both paths have:
173
+ * - Identical command structure (same number and order of M/L/C/Z)
174
+ * - Corresponding coordinates to interpolate
175
+ * Complex morphs (square → triangle) require preprocessing (e.g. KUTE.JS, Flubber)
176
+ * @param start - A starting PathArray value
177
+ * @param end - A starting PathArray value
178
+ * @param t - The progress
179
+ * @returns The interpolated PathArray value
180
+ */
181
+ declare const interpolatePath: InterpolatorFunction<MorphPathArray>;
182
+ //#endregion
183
+ export { BaseTweenProps, CubeValues, DeepPartial, Easing, EasingFunction, EasingFunctionGroup, InterpolatorFunction, LineValues, MorphPathArray, MorphPathSegment, Position, Queue, Runtime, Timeline, TimelineCallback, TimelineEntry, TimelineEntryConfig, Tween, TweenCallback, TweenProps, TweenUpdateCallback, addToQueue, interpolateArray, interpolatePath, now, removeFromQueue, setNow };
184
+ //# sourceMappingURL=index.d.mts.map