@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.
package/dist/index.mjs ADDED
@@ -0,0 +1,610 @@
1
+ //#region src/Now.ts
2
+ let _nowFunc = () => performance.now();
3
+ const now = () => {
4
+ return _nowFunc();
5
+ };
6
+ function setNow(nowFunction) {
7
+ _nowFunc = nowFunction;
8
+ }
9
+
10
+ //#endregion
11
+ //#region src/Runtime.ts
12
+ const Queue = [];
13
+ function addToQueue(newItem) {
14
+ const item = newItem;
15
+ if (Queue.includes(item)) return;
16
+ Queue.push(item);
17
+ if (!rafID) Runtime();
18
+ }
19
+ function removeFromQueue(removedItem) {
20
+ Queue.splice(Queue.indexOf(removedItem), 1);
21
+ }
22
+ let rafID = 0;
23
+ function Runtime(t = now()) {
24
+ let i = 0;
25
+ while (i < Queue.length) if (Queue[i].update(t)) i += 1;
26
+ else Queue.splice(i, 1);
27
+ if (Queue.length === 0) {
28
+ cancelAnimationFrame(rafID);
29
+ rafID = 0;
30
+ } else rafID = requestAnimationFrame(Runtime);
31
+ }
32
+
33
+ //#endregion
34
+ //#region src/Tween.ts
35
+ var Tween = class {
36
+ _interpolators = /* @__PURE__ */ new Map();
37
+ _state;
38
+ _startIsSet = false;
39
+ _startFired = false;
40
+ _propsStart = {};
41
+ _propsEnd = {};
42
+ _isPlaying = false;
43
+ _duration = 1e3;
44
+ _delay = 0;
45
+ _easing = (t) => t;
46
+ _startTime = 0;
47
+ _onUpdate;
48
+ _onComplete;
49
+ _onStart;
50
+ _onStop;
51
+ constructor(initialValues) {
52
+ this._state = initialValues;
53
+ return this;
54
+ }
55
+ get isPlaying() {
56
+ return this._isPlaying;
57
+ }
58
+ start(time = now(), overrideStart = false) {
59
+ if (this._isPlaying) return this;
60
+ if (!this._startIsSet || overrideStart) {
61
+ this._startIsSet = true;
62
+ this._setProps(this._state, this._propsStart, this._propsEnd, overrideStart);
63
+ }
64
+ this._isPlaying = true;
65
+ this._startTime = time;
66
+ this._startTime += this._delay;
67
+ addToQueue(this);
68
+ return this;
69
+ }
70
+ startFromLast(time = now()) {
71
+ return this.start(time, true);
72
+ }
73
+ stop() {
74
+ if (!this._isPlaying) return this;
75
+ removeFromQueue(this);
76
+ this._isPlaying = false;
77
+ this._onStop?.(this._state);
78
+ return this;
79
+ }
80
+ from(startValues) {
81
+ Object.assign(this._propsStart, startValues);
82
+ this._startIsSet = false;
83
+ return this;
84
+ }
85
+ to(endValues) {
86
+ this._propsEnd = endValues;
87
+ this._startIsSet = false;
88
+ return this;
89
+ }
90
+ duration(seconds = 1) {
91
+ this._duration = seconds * 1e3;
92
+ return this;
93
+ }
94
+ delay(seconds = 0) {
95
+ this._delay = seconds * 1e3;
96
+ return this;
97
+ }
98
+ easing(easing = (t) => t) {
99
+ this._easing = easing;
100
+ return this;
101
+ }
102
+ getDuration() {
103
+ return this._duration;
104
+ }
105
+ update(time = now(), autoStart) {
106
+ if (!this._isPlaying) if (autoStart) this.start(time, true);
107
+ else return false;
108
+ if (time < this._startTime) return true;
109
+ if (!this._startFired && this._onStart) {
110
+ this._onStart(this._state);
111
+ this._startFired = true;
112
+ }
113
+ let elapsed = (time - this._startTime) / this._duration;
114
+ elapsed = this._duration === 0 || elapsed > 1 ? 1 : elapsed;
115
+ const progress = this._easing(elapsed);
116
+ this._setState(this._state, this._propsStart, this._propsEnd, progress);
117
+ this._onUpdate?.(this._state, elapsed, progress);
118
+ if (elapsed === 1) {
119
+ this._onComplete?.(this._state);
120
+ this._isPlaying = false;
121
+ return false;
122
+ }
123
+ return true;
124
+ }
125
+ onStart(callback) {
126
+ this._onStart = callback;
127
+ return this;
128
+ }
129
+ onUpdate(callback) {
130
+ this._onUpdate = callback;
131
+ return this;
132
+ }
133
+ onComplete(callback) {
134
+ this._onComplete = callback;
135
+ return this;
136
+ }
137
+ onStop(callback) {
138
+ this._onStop = callback;
139
+ return this;
140
+ }
141
+ _setState(object, valuesStart, valuesEnd, value) {
142
+ const endEntries = Object.entries(valuesEnd);
143
+ const len = endEntries.length;
144
+ let i = 0;
145
+ while (i < len) {
146
+ const [property, end] = endEntries[i];
147
+ i++;
148
+ if (valuesStart[property] === void 0) continue;
149
+ const start = valuesStart[property];
150
+ if (start.constructor !== end?.constructor) continue;
151
+ if (this._interpolators.has(property)) object[property] = this._interpolators.get(property)(start, end, value);
152
+ else if (typeof end === "number") object[property] = start + (end - start) * value;
153
+ else if (typeof end === "object") this._setState(object[property], start, end, value);
154
+ }
155
+ }
156
+ _setProps(obj, propsStart, propsEnd, overrideStartingValues) {
157
+ const endKeys = Object.keys(propsEnd);
158
+ for (const property of endKeys) {
159
+ const startValue = obj[property];
160
+ if (typeof propsStart[property] === "undefined" || overrideStartingValues) propsStart[property] = startValue;
161
+ }
162
+ }
163
+ use(property, interpolateFn) {
164
+ if (!this._interpolators.has(property)) this._interpolators.set(property, interpolateFn);
165
+ return this;
166
+ }
167
+ };
168
+
169
+ //#endregion
170
+ //#region src/Timeline.ts
171
+ var Timeline = class {
172
+ state;
173
+ _state;
174
+ _entries = [];
175
+ _labels = /* @__PURE__ */ new Map();
176
+ _progress = 0;
177
+ _duration = 0;
178
+ _time = 0;
179
+ _pauseTime = 0;
180
+ _lastTime;
181
+ _isPlaying = false;
182
+ _repeat = 0;
183
+ _initialRepeat = 0;
184
+ _interpolators = /* @__PURE__ */ new Map();
185
+ _onStart;
186
+ _onStop;
187
+ _onPause;
188
+ _onResume;
189
+ _onUpdate;
190
+ _onComplete;
191
+ constructor(initialState) {
192
+ this.state = initialState;
193
+ this._state = { ...initialState };
194
+ }
195
+ to({ duration = 1, easing = (t) => t, ...values }, position = "+=0") {
196
+ const startTime = this._resolvePosition(position);
197
+ const to = values;
198
+ const entryDuration = duration * 1e3;
199
+ this._entries.push({
200
+ to,
201
+ startTime,
202
+ duration: entryDuration,
203
+ easing,
204
+ hasStarted: false
205
+ });
206
+ const endTime = startTime + entryDuration;
207
+ this._duration = Math.max(this._duration, endTime);
208
+ return this;
209
+ }
210
+ play() {
211
+ if (this._pauseTime) return this.resume();
212
+ if (this._isPlaying) return this;
213
+ this._isPlaying = true;
214
+ this._lastTime = void 0;
215
+ this._time = 0;
216
+ this._resetState();
217
+ this._updateEntries(0);
218
+ this._onStart?.(this.state, 0);
219
+ addToQueue(this);
220
+ return this;
221
+ }
222
+ pause() {
223
+ if (!this._isPlaying) return this;
224
+ this._isPlaying = false;
225
+ this._pauseTime = now();
226
+ this._onPause?.(this.state, this.progress);
227
+ return this;
228
+ }
229
+ resume(time = now()) {
230
+ if (this._isPlaying) return this;
231
+ this._isPlaying = true;
232
+ const dif = time - this._pauseTime;
233
+ this._pauseTime = 0;
234
+ this._lastTime = (this._lastTime || time) + dif;
235
+ this._onResume?.(this.state, this.progress);
236
+ addToQueue(this);
237
+ return this;
238
+ }
239
+ stop() {
240
+ if (!this._isPlaying) return this;
241
+ this._isPlaying = false;
242
+ this._time = 0;
243
+ this._pauseTime = 0;
244
+ removeFromQueue(this);
245
+ this._resetState();
246
+ this._updateEntries(0);
247
+ this._onStop?.(this.state, this._progress);
248
+ return this;
249
+ }
250
+ repeat(count = 0) {
251
+ this._repeat = count;
252
+ this._initialRepeat = count;
253
+ return this;
254
+ }
255
+ seek(pointer) {
256
+ const elapsed = this._resolvePosition(pointer);
257
+ this._resetState();
258
+ this._time = Math.max(0, elapsed);
259
+ this._updateEntries(this._time);
260
+ return this;
261
+ }
262
+ label(name, position) {
263
+ this._labels.set(name, this._resolvePosition(position));
264
+ return this;
265
+ }
266
+ onStart(cb) {
267
+ this._onStart = cb;
268
+ return this;
269
+ }
270
+ onPause(cb) {
271
+ this._onPause = cb;
272
+ return this;
273
+ }
274
+ onResume(cb) {
275
+ this._onResume = cb;
276
+ return this;
277
+ }
278
+ onStop(cb) {
279
+ this._onStop = cb;
280
+ return this;
281
+ }
282
+ onUpdate(cb) {
283
+ this._onUpdate = cb;
284
+ return this;
285
+ }
286
+ onComplete(cb) {
287
+ this._onComplete = cb;
288
+ return this;
289
+ }
290
+ get progress() {
291
+ return this._progress;
292
+ }
293
+ get duration() {
294
+ return this._duration;
295
+ }
296
+ get isPlaying() {
297
+ return this._isPlaying;
298
+ }
299
+ get isPaused() {
300
+ return !this._isPlaying && this._pauseTime > 0;
301
+ }
302
+ update(time = now()) {
303
+ if (!this._isPlaying) return false;
304
+ if (this._lastTime === void 0) this._lastTime = time;
305
+ const delta = time - this._lastTime;
306
+ this._lastTime = time;
307
+ this._time += delta;
308
+ this._updateEntries(this._time);
309
+ if (this._progress === 1) if (this._repeat === 0) {
310
+ this._isPlaying = false;
311
+ this._repeat = this._initialRepeat;
312
+ this._onComplete?.(this.state, 1);
313
+ } else {
314
+ if (this._repeat !== Infinity) this._repeat--;
315
+ this._time = 0;
316
+ this._resetState();
317
+ this._updateEntries(0);
318
+ }
319
+ return this._isPlaying;
320
+ }
321
+ _updateEntries(elapsed) {
322
+ this._progress = this._duration === 0 || elapsed >= this._duration ? 1 : elapsed / this._duration;
323
+ let i = 0;
324
+ const entriesLen = this._entries.length;
325
+ while (i < entriesLen) {
326
+ const entry = this._entries[i];
327
+ const localTime = elapsed - entry.startTime;
328
+ const tweenElapsed = Math.max(0, Math.min(1, localTime / entry.duration));
329
+ if (!entry.hasStarted && tweenElapsed > 0) {
330
+ entry.hasStarted = true;
331
+ entry.startValues = {};
332
+ for (const key in entry.to) entry.startValues[key] = this.state[key];
333
+ }
334
+ if (entry.hasStarted) this._setState(this.state, entry.startValues, entry.to, entry.easing(tweenElapsed));
335
+ i += 1;
336
+ }
337
+ this._onUpdate?.(this.state, this._progress);
338
+ }
339
+ _resolvePosition(pos) {
340
+ if (typeof pos === "number") return pos * 1e3;
341
+ if (typeof pos === "string") {
342
+ const labelTime = this._labels.get(pos);
343
+ if (labelTime !== void 0) return labelTime;
344
+ if (pos.startsWith("+=") || pos.startsWith("-=")) {
345
+ let offset = parseFloat(pos.slice(2));
346
+ if (isNaN(offset)) offset = 0;
347
+ offset *= 1e3;
348
+ return pos.startsWith("+=") ? this._duration + offset : Math.max(0, this._duration - offset);
349
+ }
350
+ }
351
+ return this._duration;
352
+ }
353
+ _setState(object, valuesStart, valuesEnd, value) {
354
+ const endEntries = Object.entries(valuesEnd);
355
+ const len = endEntries.length;
356
+ let i = 0;
357
+ while (i < len) {
358
+ const [property, end] = endEntries[i];
359
+ i++;
360
+ if (valuesStart[property] === void 0) continue;
361
+ const start = valuesStart[property];
362
+ if (start.constructor !== end?.constructor) continue;
363
+ if (this._interpolators.has(property)) object[property] = this._interpolators.get(property)(start, end, value);
364
+ else if (typeof end === "number") object[property] = start + (end - start) * value;
365
+ else if (typeof end === "object") this._setState(object[property], start, end, value);
366
+ }
367
+ }
368
+ _resetState() {
369
+ Object.assign(this.state, this._state);
370
+ let i = 0;
371
+ const entriesLen = this._entries.length;
372
+ while (i < entriesLen) {
373
+ const entry = this._entries[i];
374
+ entry.hasStarted = false;
375
+ entry.startValues = void 0;
376
+ i += 1;
377
+ }
378
+ }
379
+ clear() {
380
+ this._entries.length = 0;
381
+ this._duration = 0;
382
+ this._labels.clear();
383
+ this._time = 0;
384
+ this._progress = 0;
385
+ this._pauseTime = 0;
386
+ this._lastTime = void 0;
387
+ this._repeat = this._initialRepeat;
388
+ return this;
389
+ }
390
+ use(property, interpolateFn) {
391
+ if (!this._interpolators.has(property)) this._interpolators.set(property, interpolateFn);
392
+ return this;
393
+ }
394
+ };
395
+
396
+ //#endregion
397
+ //#region src/Easing.ts
398
+ const Easing = Object.freeze({
399
+ Linear: Object.freeze({
400
+ None(amount) {
401
+ return amount;
402
+ },
403
+ In(amount) {
404
+ return amount;
405
+ },
406
+ Out(amount) {
407
+ return amount;
408
+ },
409
+ InOut(amount) {
410
+ return amount;
411
+ }
412
+ }),
413
+ Quadratic: Object.freeze({
414
+ In(amount) {
415
+ return amount * amount;
416
+ },
417
+ Out(amount) {
418
+ return amount * (2 - amount);
419
+ },
420
+ InOut(amount) {
421
+ if ((amount *= 2) < 1) return .5 * amount * amount;
422
+ return -.5 * (--amount * (amount - 2) - 1);
423
+ }
424
+ }),
425
+ Cubic: Object.freeze({
426
+ In(amount) {
427
+ return amount * amount * amount;
428
+ },
429
+ Out(amount) {
430
+ return --amount * amount * amount + 1;
431
+ },
432
+ InOut(amount) {
433
+ if ((amount *= 2) < 1) return .5 * amount * amount * amount;
434
+ return .5 * ((amount -= 2) * amount * amount + 2);
435
+ }
436
+ }),
437
+ Quartic: Object.freeze({
438
+ In(amount) {
439
+ return amount * amount * amount * amount;
440
+ },
441
+ Out(amount) {
442
+ return 1 - --amount * amount * amount * amount;
443
+ },
444
+ InOut(amount) {
445
+ if ((amount *= 2) < 1) return .5 * amount * amount * amount * amount;
446
+ return -.5 * ((amount -= 2) * amount * amount * amount - 2);
447
+ }
448
+ }),
449
+ Quintic: Object.freeze({
450
+ In(amount) {
451
+ return amount * amount * amount * amount * amount;
452
+ },
453
+ Out(amount) {
454
+ return --amount * amount * amount * amount * amount + 1;
455
+ },
456
+ InOut(amount) {
457
+ if ((amount *= 2) < 1) return .5 * amount * amount * amount * amount * amount;
458
+ return .5 * ((amount -= 2) * amount * amount * amount * amount + 2);
459
+ }
460
+ }),
461
+ Sinusoidal: Object.freeze({
462
+ In(amount) {
463
+ return 1 - Math.sin((1 - amount) * Math.PI / 2);
464
+ },
465
+ Out(amount) {
466
+ return Math.sin(amount * Math.PI / 2);
467
+ },
468
+ InOut(amount) {
469
+ return .5 * (1 - Math.sin(Math.PI * (.5 - amount)));
470
+ }
471
+ }),
472
+ Exponential: Object.freeze({
473
+ In(amount) {
474
+ return amount === 0 ? 0 : Math.pow(1024, amount - 1);
475
+ },
476
+ Out(amount) {
477
+ return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount);
478
+ },
479
+ InOut(amount) {
480
+ if (amount === 0) return 0;
481
+ if (amount === 1) return 1;
482
+ if ((amount *= 2) < 1) return .5 * Math.pow(1024, amount - 1);
483
+ return .5 * (-Math.pow(2, -10 * (amount - 1)) + 2);
484
+ }
485
+ }),
486
+ Circular: Object.freeze({
487
+ In(amount) {
488
+ return 1 - Math.sqrt(1 - amount * amount);
489
+ },
490
+ Out(amount) {
491
+ return Math.sqrt(1 - --amount * amount);
492
+ },
493
+ InOut(amount) {
494
+ if ((amount *= 2) < 1) return -.5 * (Math.sqrt(1 - amount * amount) - 1);
495
+ return .5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1);
496
+ }
497
+ }),
498
+ Elastic: Object.freeze({
499
+ In(amount) {
500
+ if (amount === 0) return 0;
501
+ if (amount === 1) return 1;
502
+ return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);
503
+ },
504
+ Out(amount) {
505
+ if (amount === 0) return 0;
506
+ if (amount === 1) return 1;
507
+ return Math.pow(2, -10 * amount) * Math.sin((amount - .1) * 5 * Math.PI) + 1;
508
+ },
509
+ InOut(amount) {
510
+ if (amount === 0) return 0;
511
+ if (amount === 1) return 1;
512
+ amount *= 2;
513
+ if (amount < 1) return -.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);
514
+ return .5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1;
515
+ }
516
+ }),
517
+ Back: Object.freeze({
518
+ In(amount) {
519
+ const s = 1.70158;
520
+ return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s);
521
+ },
522
+ Out(amount) {
523
+ const s = 1.70158;
524
+ return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1;
525
+ },
526
+ InOut(amount) {
527
+ const s = 1.70158 * 1.525;
528
+ if ((amount *= 2) < 1) return .5 * (amount * amount * ((s + 1) * amount - s));
529
+ return .5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2);
530
+ }
531
+ }),
532
+ Bounce: Object.freeze({
533
+ In(amount) {
534
+ return 1 - Easing.Bounce.Out(1 - amount);
535
+ },
536
+ Out(amount) {
537
+ if (amount < 1 / 2.75) return 7.5625 * amount * amount;
538
+ else if (amount < 2 / 2.75) return 7.5625 * (amount -= 1.5 / 2.75) * amount + .75;
539
+ else if (amount < 2.5 / 2.75) return 7.5625 * (amount -= 2.25 / 2.75) * amount + .9375;
540
+ else return 7.5625 * (amount -= 2.625 / 2.75) * amount + .984375;
541
+ },
542
+ InOut(amount) {
543
+ if (amount < .5) return Easing.Bounce.In(amount * 2) * .5;
544
+ return Easing.Bounce.Out(amount * 2 - 1) * .5 + .5;
545
+ }
546
+ }),
547
+ pow(power = 4) {
548
+ power = power < Number.EPSILON ? Number.EPSILON : power;
549
+ power = power > 1e4 ? 1e4 : power;
550
+ return {
551
+ In(amount) {
552
+ return amount ** power;
553
+ },
554
+ Out(amount) {
555
+ return 1 - (1 - amount) ** power;
556
+ },
557
+ InOut(amount) {
558
+ if (amount < .5) return (amount * 2) ** power / 2;
559
+ return (1 - (2 - amount * 2) ** power) / 2 + .5;
560
+ }
561
+ };
562
+ }
563
+ });
564
+
565
+ //#endregion
566
+ //#region src/interpolators/array.ts
567
+ const interpolateArray = (start, end, value) => {
568
+ if (value === 0 && start.length !== end.length) {
569
+ console.warn("Array length mismatch. Returning first array.");
570
+ return start;
571
+ }
572
+ const result = [];
573
+ const len = end.length;
574
+ let i = 0;
575
+ while (i < len) {
576
+ result.push(start[i] + (end[i] - start[i]) * value);
577
+ i += 1;
578
+ }
579
+ return result;
580
+ };
581
+
582
+ //#endregion
583
+ //#region src/interpolators/path.ts
584
+ const interpolatePath = (start, end, t) => {
585
+ if (t === 0 && start.length !== end.length) {
586
+ console.warn("Path length mismatch. Returning start path.");
587
+ return start;
588
+ }
589
+ const result = [];
590
+ for (let i = 0; i < end.length; i += 1) {
591
+ const [pathCommand1, values1] = [start[i][0], start[i].slice(1)];
592
+ const [pathCommand2, values2] = [end[i][0], end[i].slice(1)];
593
+ const commandMismatch = pathCommand1 !== pathCommand2;
594
+ if (t === 0 && (values1.length !== values2.length || commandMismatch)) {
595
+ console.warn((commandMismatch ? "PathCommand" : "Params") + " mismatch at index: " + i + ". Returning start path.");
596
+ return start;
597
+ }
598
+ if (pathCommand1.toUpperCase() === "Z") result.push(["Z"]);
599
+ else {
600
+ const resValues = [];
601
+ for (let j = 0; j < values2.length; j += 1) resValues.push(values1[j] + (values2[j] - values1[j]) * t);
602
+ result.push([pathCommand2, ...resValues]);
603
+ }
604
+ }
605
+ return result;
606
+ };
607
+
608
+ //#endregion
609
+ export { Easing, Queue, Runtime, Timeline, Tween, addToQueue, interpolateArray, interpolatePath, now, removeFromQueue, setNow };
610
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","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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"}