UNPKG

32.3 kBJavaScriptView Raw
1/**
2 * The Ease class provides a collection of easing functions for use with tween.js.
3 */
4var Easing = Object.freeze({
5 Linear: Object.freeze({
6 None: function (amount) {
7 return amount;
8 },
9 In: function (amount) {
10 return amount;
11 },
12 Out: function (amount) {
13 return amount;
14 },
15 InOut: function (amount) {
16 return amount;
17 },
18 }),
19 Quadratic: Object.freeze({
20 In: function (amount) {
21 return amount * amount;
22 },
23 Out: function (amount) {
24 return amount * (2 - amount);
25 },
26 InOut: function (amount) {
27 if ((amount *= 2) < 1) {
28 return 0.5 * amount * amount;
29 }
30 return -0.5 * (--amount * (amount - 2) - 1);
31 },
32 }),
33 Cubic: Object.freeze({
34 In: function (amount) {
35 return amount * amount * amount;
36 },
37 Out: function (amount) {
38 return --amount * amount * amount + 1;
39 },
40 InOut: function (amount) {
41 if ((amount *= 2) < 1) {
42 return 0.5 * amount * amount * amount;
43 }
44 return 0.5 * ((amount -= 2) * amount * amount + 2);
45 },
46 }),
47 Quartic: Object.freeze({
48 In: function (amount) {
49 return amount * amount * amount * amount;
50 },
51 Out: function (amount) {
52 return 1 - --amount * amount * amount * amount;
53 },
54 InOut: function (amount) {
55 if ((amount *= 2) < 1) {
56 return 0.5 * amount * amount * amount * amount;
57 }
58 return -0.5 * ((amount -= 2) * amount * amount * amount - 2);
59 },
60 }),
61 Quintic: Object.freeze({
62 In: function (amount) {
63 return amount * amount * amount * amount * amount;
64 },
65 Out: function (amount) {
66 return --amount * amount * amount * amount * amount + 1;
67 },
68 InOut: function (amount) {
69 if ((amount *= 2) < 1) {
70 return 0.5 * amount * amount * amount * amount * amount;
71 }
72 return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2);
73 },
74 }),
75 Sinusoidal: Object.freeze({
76 In: function (amount) {
77 return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2);
78 },
79 Out: function (amount) {
80 return Math.sin((amount * Math.PI) / 2);
81 },
82 InOut: function (amount) {
83 return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount)));
84 },
85 }),
86 Exponential: Object.freeze({
87 In: function (amount) {
88 return amount === 0 ? 0 : Math.pow(1024, amount - 1);
89 },
90 Out: function (amount) {
91 return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount);
92 },
93 InOut: function (amount) {
94 if (amount === 0) {
95 return 0;
96 }
97 if (amount === 1) {
98 return 1;
99 }
100 if ((amount *= 2) < 1) {
101 return 0.5 * Math.pow(1024, amount - 1);
102 }
103 return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2);
104 },
105 }),
106 Circular: Object.freeze({
107 In: function (amount) {
108 return 1 - Math.sqrt(1 - amount * amount);
109 },
110 Out: function (amount) {
111 return Math.sqrt(1 - --amount * amount);
112 },
113 InOut: function (amount) {
114 if ((amount *= 2) < 1) {
115 return -0.5 * (Math.sqrt(1 - amount * amount) - 1);
116 }
117 return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1);
118 },
119 }),
120 Elastic: Object.freeze({
121 In: function (amount) {
122 if (amount === 0) {
123 return 0;
124 }
125 if (amount === 1) {
126 return 1;
127 }
128 return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);
129 },
130 Out: function (amount) {
131 if (amount === 0) {
132 return 0;
133 }
134 if (amount === 1) {
135 return 1;
136 }
137 return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1;
138 },
139 InOut: function (amount) {
140 if (amount === 0) {
141 return 0;
142 }
143 if (amount === 1) {
144 return 1;
145 }
146 amount *= 2;
147 if (amount < 1) {
148 return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);
149 }
150 return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1;
151 },
152 }),
153 Back: Object.freeze({
154 In: function (amount) {
155 var s = 1.70158;
156 return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s);
157 },
158 Out: function (amount) {
159 var s = 1.70158;
160 return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1;
161 },
162 InOut: function (amount) {
163 var s = 1.70158 * 1.525;
164 if ((amount *= 2) < 1) {
165 return 0.5 * (amount * amount * ((s + 1) * amount - s));
166 }
167 return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2);
168 },
169 }),
170 Bounce: Object.freeze({
171 In: function (amount) {
172 return 1 - Easing.Bounce.Out(1 - amount);
173 },
174 Out: function (amount) {
175 if (amount < 1 / 2.75) {
176 return 7.5625 * amount * amount;
177 }
178 else if (amount < 2 / 2.75) {
179 return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75;
180 }
181 else if (amount < 2.5 / 2.75) {
182 return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375;
183 }
184 else {
185 return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375;
186 }
187 },
188 InOut: function (amount) {
189 if (amount < 0.5) {
190 return Easing.Bounce.In(amount * 2) * 0.5;
191 }
192 return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5;
193 },
194 }),
195 generatePow: function (power) {
196 if (power === void 0) { power = 4; }
197 power = power < Number.EPSILON ? Number.EPSILON : power;
198 power = power > 10000 ? 10000 : power;
199 return {
200 In: function (amount) {
201 return Math.pow(amount, power);
202 },
203 Out: function (amount) {
204 return 1 - Math.pow((1 - amount), power);
205 },
206 InOut: function (amount) {
207 if (amount < 0.5) {
208 return Math.pow((amount * 2), power) / 2;
209 }
210 return (1 - Math.pow((2 - amount * 2), power)) / 2 + 0.5;
211 },
212 };
213 },
214});
215
216var now = function () { return performance.now(); };
217
218/**
219 * Controlling groups of tweens
220 *
221 * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components.
222 * In these cases, you may want to create your own smaller groups of tween
223 */
224var Group = /** @class */ (function () {
225 function Group() {
226 this._tweens = {};
227 this._tweensAddedDuringUpdate = {};
228 }
229 Group.prototype.getAll = function () {
230 var _this = this;
231 return Object.keys(this._tweens).map(function (tweenId) {
232 return _this._tweens[tweenId];
233 });
234 };
235 Group.prototype.removeAll = function () {
236 this._tweens = {};
237 };
238 Group.prototype.add = function (tween) {
239 this._tweens[tween.getId()] = tween;
240 this._tweensAddedDuringUpdate[tween.getId()] = tween;
241 };
242 Group.prototype.remove = function (tween) {
243 delete this._tweens[tween.getId()];
244 delete this._tweensAddedDuringUpdate[tween.getId()];
245 };
246 Group.prototype.update = function (time, preserve) {
247 if (time === void 0) { time = now(); }
248 if (preserve === void 0) { preserve = false; }
249 var tweenIds = Object.keys(this._tweens);
250 if (tweenIds.length === 0) {
251 return false;
252 }
253 // Tweens are updated in "batches". If you add a new tween during an
254 // update, then the new tween will be updated in the next batch.
255 // If you remove a tween during an update, it may or may not be updated.
256 // However, if the removed tween was added during the current batch,
257 // then it will not be updated.
258 while (tweenIds.length > 0) {
259 this._tweensAddedDuringUpdate = {};
260 for (var i = 0; i < tweenIds.length; i++) {
261 var tween = this._tweens[tweenIds[i]];
262 var autoStart = !preserve;
263 if (tween && tween.update(time, autoStart) === false && !preserve) {
264 delete this._tweens[tweenIds[i]];
265 }
266 }
267 tweenIds = Object.keys(this._tweensAddedDuringUpdate);
268 }
269 return true;
270 };
271 return Group;
272}());
273
274/**
275 *
276 */
277var Interpolation = {
278 Linear: function (v, k) {
279 var m = v.length - 1;
280 var f = m * k;
281 var i = Math.floor(f);
282 var fn = Interpolation.Utils.Linear;
283 if (k < 0) {
284 return fn(v[0], v[1], f);
285 }
286 if (k > 1) {
287 return fn(v[m], v[m - 1], m - f);
288 }
289 return fn(v[i], v[i + 1 > m ? m : i + 1], f - i);
290 },
291 Bezier: function (v, k) {
292 var b = 0;
293 var n = v.length - 1;
294 var pw = Math.pow;
295 var bn = Interpolation.Utils.Bernstein;
296 for (var i = 0; i <= n; i++) {
297 b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i);
298 }
299 return b;
300 },
301 CatmullRom: function (v, k) {
302 var m = v.length - 1;
303 var f = m * k;
304 var i = Math.floor(f);
305 var fn = Interpolation.Utils.CatmullRom;
306 if (v[0] === v[m]) {
307 if (k < 0) {
308 i = Math.floor((f = m * (1 + k)));
309 }
310 return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i);
311 }
312 else {
313 if (k < 0) {
314 return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]);
315 }
316 if (k > 1) {
317 return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]);
318 }
319 return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i);
320 }
321 },
322 Utils: {
323 Linear: function (p0, p1, t) {
324 return (p1 - p0) * t + p0;
325 },
326 Bernstein: function (n, i) {
327 var fc = Interpolation.Utils.Factorial;
328 return fc(n) / fc(i) / fc(n - i);
329 },
330 Factorial: (function () {
331 var a = [1];
332 return function (n) {
333 var s = 1;
334 if (a[n]) {
335 return a[n];
336 }
337 for (var i = n; i > 1; i--) {
338 s *= i;
339 }
340 a[n] = s;
341 return s;
342 };
343 })(),
344 CatmullRom: function (p0, p1, p2, p3, t) {
345 var v0 = (p2 - p0) * 0.5;
346 var v1 = (p3 - p1) * 0.5;
347 var t2 = t * t;
348 var t3 = t * t2;
349 return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;
350 },
351 },
352};
353
354/**
355 * Utils
356 */
357var Sequence = /** @class */ (function () {
358 function Sequence() {
359 }
360 Sequence.nextId = function () {
361 return Sequence._nextId++;
362 };
363 Sequence._nextId = 0;
364 return Sequence;
365}());
366
367var mainGroup = new Group();
368
369/**
370 * Tween.js - Licensed under the MIT license
371 * https://github.com/tweenjs/tween.js
372 * ----------------------------------------------
373 *
374 * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors.
375 * Thank you all, you're awesome!
376 */
377var Tween = /** @class */ (function () {
378 function Tween(_object, _group) {
379 if (_group === void 0) { _group = mainGroup; }
380 this._object = _object;
381 this._group = _group;
382 this._isPaused = false;
383 this._pauseStart = 0;
384 this._valuesStart = {};
385 this._valuesEnd = {};
386 this._valuesStartRepeat = {};
387 this._duration = 1000;
388 this._isDynamic = false;
389 this._initialRepeat = 0;
390 this._repeat = 0;
391 this._yoyo = false;
392 this._isPlaying = false;
393 this._reversed = false;
394 this._delayTime = 0;
395 this._startTime = 0;
396 this._easingFunction = Easing.Linear.None;
397 this._interpolationFunction = Interpolation.Linear;
398 // eslint-disable-next-line
399 this._chainedTweens = [];
400 this._onStartCallbackFired = false;
401 this._onEveryStartCallbackFired = false;
402 this._id = Sequence.nextId();
403 this._isChainStopped = false;
404 this._propertiesAreSetUp = false;
405 this._goToEnd = false;
406 }
407 Tween.prototype.getId = function () {
408 return this._id;
409 };
410 Tween.prototype.isPlaying = function () {
411 return this._isPlaying;
412 };
413 Tween.prototype.isPaused = function () {
414 return this._isPaused;
415 };
416 Tween.prototype.getDuration = function () {
417 return this._duration;
418 };
419 Tween.prototype.to = function (target, duration) {
420 if (duration === void 0) { duration = 1000; }
421 if (this._isPlaying)
422 throw new Error('Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.');
423 this._valuesEnd = target;
424 this._propertiesAreSetUp = false;
425 this._duration = duration < 0 ? 0 : duration;
426 return this;
427 };
428 Tween.prototype.duration = function (duration) {
429 if (duration === void 0) { duration = 1000; }
430 this._duration = duration < 0 ? 0 : duration;
431 return this;
432 };
433 Tween.prototype.dynamic = function (dynamic) {
434 if (dynamic === void 0) { dynamic = false; }
435 this._isDynamic = dynamic;
436 return this;
437 };
438 Tween.prototype.start = function (time, overrideStartingValues) {
439 if (time === void 0) { time = now(); }
440 if (overrideStartingValues === void 0) { overrideStartingValues = false; }
441 if (this._isPlaying) {
442 return this;
443 }
444 // eslint-disable-next-line
445 this._group && this._group.add(this);
446 this._repeat = this._initialRepeat;
447 if (this._reversed) {
448 // If we were reversed (f.e. using the yoyo feature) then we need to
449 // flip the tween direction back to forward.
450 this._reversed = false;
451 for (var property in this._valuesStartRepeat) {
452 this._swapEndStartRepeatValues(property);
453 this._valuesStart[property] = this._valuesStartRepeat[property];
454 }
455 }
456 this._isPlaying = true;
457 this._isPaused = false;
458 this._onStartCallbackFired = false;
459 this._onEveryStartCallbackFired = false;
460 this._isChainStopped = false;
461 this._startTime = time;
462 this._startTime += this._delayTime;
463 if (!this._propertiesAreSetUp || overrideStartingValues) {
464 this._propertiesAreSetUp = true;
465 // If dynamic is not enabled, clone the end values instead of using the passed-in end values.
466 if (!this._isDynamic) {
467 var tmp = {};
468 for (var prop in this._valuesEnd)
469 tmp[prop] = this._valuesEnd[prop];
470 this._valuesEnd = tmp;
471 }
472 this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues);
473 }
474 return this;
475 };
476 Tween.prototype.startFromCurrentValues = function (time) {
477 return this.start(time, true);
478 };
479 Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) {
480 for (var property in _valuesEnd) {
481 var startValue = _object[property];
482 var startValueIsArray = Array.isArray(startValue);
483 var propType = startValueIsArray ? 'array' : typeof startValue;
484 var isInterpolationList = !startValueIsArray && Array.isArray(_valuesEnd[property]);
485 // If `to()` specifies a property that doesn't exist in the source object,
486 // we should not set that property in the object
487 if (propType === 'undefined' || propType === 'function') {
488 continue;
489 }
490 // Check if an Array was provided as property value
491 if (isInterpolationList) {
492 var endValues = _valuesEnd[property];
493 if (endValues.length === 0) {
494 continue;
495 }
496 // Handle an array of relative values.
497 // Creates a local copy of the Array with the start value at the front
498 var temp = [startValue];
499 for (var i = 0, l = endValues.length; i < l; i += 1) {
500 var value = this._handleRelativeValue(startValue, endValues[i]);
501 if (isNaN(value)) {
502 isInterpolationList = false;
503 console.warn('Found invalid interpolation list. Skipping.');
504 break;
505 }
506 temp.push(value);
507 }
508 if (isInterpolationList) {
509 // if (_valuesStart[property] === undefined) { // handle end values only the first time. NOT NEEDED? setupProperties is now guarded by _propertiesAreSetUp.
510 _valuesEnd[property] = temp;
511 // }
512 }
513 }
514 // handle the deepness of the values
515 if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) {
516 _valuesStart[property] = startValueIsArray ? [] : {};
517 var nestedObject = startValue;
518 for (var prop in nestedObject) {
519 _valuesStart[property][prop] = nestedObject[prop];
520 }
521 // TODO? repeat nested values? And yoyo? And array values?
522 _valuesStartRepeat[property] = startValueIsArray ? [] : {};
523 var endValues = _valuesEnd[property];
524 // If dynamic is not enabled, clone the end values instead of using the passed-in end values.
525 if (!this._isDynamic) {
526 var tmp = {};
527 for (var prop in endValues)
528 tmp[prop] = endValues[prop];
529 _valuesEnd[property] = endValues = tmp;
530 }
531 this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues);
532 }
533 else {
534 // Save the starting value, but only once unless override is requested.
535 if (typeof _valuesStart[property] === 'undefined' || overrideStartingValues) {
536 _valuesStart[property] = startValue;
537 }
538 if (!startValueIsArray) {
539 // eslint-disable-next-line
540 // @ts-ignore FIXME?
541 _valuesStart[property] *= 1.0; // Ensures we're using numbers, not strings
542 }
543 if (isInterpolationList) {
544 // eslint-disable-next-line
545 // @ts-ignore FIXME?
546 _valuesStartRepeat[property] = _valuesEnd[property].slice().reverse();
547 }
548 else {
549 _valuesStartRepeat[property] = _valuesStart[property] || 0;
550 }
551 }
552 }
553 };
554 Tween.prototype.stop = function () {
555 if (!this._isChainStopped) {
556 this._isChainStopped = true;
557 this.stopChainedTweens();
558 }
559 if (!this._isPlaying) {
560 return this;
561 }
562 // eslint-disable-next-line
563 this._group && this._group.remove(this);
564 this._isPlaying = false;
565 this._isPaused = false;
566 if (this._onStopCallback) {
567 this._onStopCallback(this._object);
568 }
569 return this;
570 };
571 Tween.prototype.end = function () {
572 this._goToEnd = true;
573 this.update(Infinity);
574 return this;
575 };
576 Tween.prototype.pause = function (time) {
577 if (time === void 0) { time = now(); }
578 if (this._isPaused || !this._isPlaying) {
579 return this;
580 }
581 this._isPaused = true;
582 this._pauseStart = time;
583 // eslint-disable-next-line
584 this._group && this._group.remove(this);
585 return this;
586 };
587 Tween.prototype.resume = function (time) {
588 if (time === void 0) { time = now(); }
589 if (!this._isPaused || !this._isPlaying) {
590 return this;
591 }
592 this._isPaused = false;
593 this._startTime += time - this._pauseStart;
594 this._pauseStart = 0;
595 // eslint-disable-next-line
596 this._group && this._group.add(this);
597 return this;
598 };
599 Tween.prototype.stopChainedTweens = function () {
600 for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {
601 this._chainedTweens[i].stop();
602 }
603 return this;
604 };
605 Tween.prototype.group = function (group) {
606 if (group === void 0) { group = mainGroup; }
607 this._group = group;
608 return this;
609 };
610 Tween.prototype.delay = function (amount) {
611 if (amount === void 0) { amount = 0; }
612 this._delayTime = amount;
613 return this;
614 };
615 Tween.prototype.repeat = function (times) {
616 if (times === void 0) { times = 0; }
617 this._initialRepeat = times;
618 this._repeat = times;
619 return this;
620 };
621 Tween.prototype.repeatDelay = function (amount) {
622 this._repeatDelayTime = amount;
623 return this;
624 };
625 Tween.prototype.yoyo = function (yoyo) {
626 if (yoyo === void 0) { yoyo = false; }
627 this._yoyo = yoyo;
628 return this;
629 };
630 Tween.prototype.easing = function (easingFunction) {
631 if (easingFunction === void 0) { easingFunction = Easing.Linear.None; }
632 this._easingFunction = easingFunction;
633 return this;
634 };
635 Tween.prototype.interpolation = function (interpolationFunction) {
636 if (interpolationFunction === void 0) { interpolationFunction = Interpolation.Linear; }
637 this._interpolationFunction = interpolationFunction;
638 return this;
639 };
640 // eslint-disable-next-line
641 Tween.prototype.chain = function () {
642 var tweens = [];
643 for (var _i = 0; _i < arguments.length; _i++) {
644 tweens[_i] = arguments[_i];
645 }
646 this._chainedTweens = tweens;
647 return this;
648 };
649 Tween.prototype.onStart = function (callback) {
650 this._onStartCallback = callback;
651 return this;
652 };
653 Tween.prototype.onEveryStart = function (callback) {
654 this._onEveryStartCallback = callback;
655 return this;
656 };
657 Tween.prototype.onUpdate = function (callback) {
658 this._onUpdateCallback = callback;
659 return this;
660 };
661 Tween.prototype.onRepeat = function (callback) {
662 this._onRepeatCallback = callback;
663 return this;
664 };
665 Tween.prototype.onComplete = function (callback) {
666 this._onCompleteCallback = callback;
667 return this;
668 };
669 Tween.prototype.onStop = function (callback) {
670 this._onStopCallback = callback;
671 return this;
672 };
673 /**
674 * @returns true if the tween is still playing after the update, false
675 * otherwise (calling update on a paused tween still returns true because
676 * it is still playing, just paused).
677 */
678 Tween.prototype.update = function (time, autoStart) {
679 var _this = this;
680 var _a;
681 if (time === void 0) { time = now(); }
682 if (autoStart === void 0) { autoStart = true; }
683 if (this._isPaused)
684 return true;
685 var property;
686 var endTime = this._startTime + this._duration;
687 if (!this._goToEnd && !this._isPlaying) {
688 if (time > endTime)
689 return false;
690 if (autoStart)
691 this.start(time, true);
692 }
693 this._goToEnd = false;
694 if (time < this._startTime) {
695 return true;
696 }
697 if (this._onStartCallbackFired === false) {
698 if (this._onStartCallback) {
699 this._onStartCallback(this._object);
700 }
701 this._onStartCallbackFired = true;
702 }
703 if (this._onEveryStartCallbackFired === false) {
704 if (this._onEveryStartCallback) {
705 this._onEveryStartCallback(this._object);
706 }
707 this._onEveryStartCallbackFired = true;
708 }
709 var elapsedTime = time - this._startTime;
710 var durationAndDelay = this._duration + ((_a = this._repeatDelayTime) !== null && _a !== void 0 ? _a : this._delayTime);
711 var totalTime = this._duration + this._repeat * durationAndDelay;
712 var calculateElapsedPortion = function () {
713 if (_this._duration === 0)
714 return 1;
715 if (elapsedTime > totalTime) {
716 return 1;
717 }
718 var timesRepeated = Math.trunc(elapsedTime / durationAndDelay);
719 var timeIntoCurrentRepeat = elapsedTime - timesRepeated * durationAndDelay;
720 // TODO use %?
721 // const timeIntoCurrentRepeat = elapsedTime % durationAndDelay
722 var portion = Math.min(timeIntoCurrentRepeat / _this._duration, 1);
723 if (portion === 0 && elapsedTime === _this._duration) {
724 return 1;
725 }
726 return portion;
727 };
728 var elapsed = calculateElapsedPortion();
729 var value = this._easingFunction(elapsed);
730 // properties transformations
731 this._updateProperties(this._object, this._valuesStart, this._valuesEnd, value);
732 if (this._onUpdateCallback) {
733 this._onUpdateCallback(this._object, elapsed);
734 }
735 if (this._duration === 0 || elapsedTime >= this._duration) {
736 if (this._repeat > 0) {
737 var completeCount = Math.min(Math.trunc((elapsedTime - this._duration) / durationAndDelay) + 1, this._repeat);
738 if (isFinite(this._repeat)) {
739 this._repeat -= completeCount;
740 }
741 // Reassign starting values, restart by making startTime = now
742 for (property in this._valuesStartRepeat) {
743 if (!this._yoyo && typeof this._valuesEnd[property] === 'string') {
744 this._valuesStartRepeat[property] =
745 // eslint-disable-next-line
746 // @ts-ignore FIXME?
747 this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]);
748 }
749 if (this._yoyo) {
750 this._swapEndStartRepeatValues(property);
751 }
752 this._valuesStart[property] = this._valuesStartRepeat[property];
753 }
754 if (this._yoyo) {
755 this._reversed = !this._reversed;
756 }
757 this._startTime += durationAndDelay * completeCount;
758 if (this._onRepeatCallback) {
759 this._onRepeatCallback(this._object);
760 }
761 this._onEveryStartCallbackFired = false;
762 return true;
763 }
764 else {
765 if (this._onCompleteCallback) {
766 this._onCompleteCallback(this._object);
767 }
768 for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {
769 // Make the chained tweens start exactly at the time they should,
770 // even if the `update()` method was called way past the duration of the tween
771 this._chainedTweens[i].start(this._startTime + this._duration, false);
772 }
773 this._isPlaying = false;
774 return false;
775 }
776 }
777 return true;
778 };
779 Tween.prototype._updateProperties = function (_object, _valuesStart, _valuesEnd, value) {
780 for (var property in _valuesEnd) {
781 // Don't update properties that do not exist in the source object
782 if (_valuesStart[property] === undefined) {
783 continue;
784 }
785 var start = _valuesStart[property] || 0;
786 var end = _valuesEnd[property];
787 var startIsArray = Array.isArray(_object[property]);
788 var endIsArray = Array.isArray(end);
789 var isInterpolationList = !startIsArray && endIsArray;
790 if (isInterpolationList) {
791 _object[property] = this._interpolationFunction(end, value);
792 }
793 else if (typeof end === 'object' && end) {
794 // eslint-disable-next-line
795 // @ts-ignore FIXME?
796 this._updateProperties(_object[property], start, end, value);
797 }
798 else {
799 // Parses relative end values with start as base (e.g.: +10, -3)
800 end = this._handleRelativeValue(start, end);
801 // Protect against non numeric properties.
802 if (typeof end === 'number') {
803 // eslint-disable-next-line
804 // @ts-ignore FIXME?
805 _object[property] = start + (end - start) * value;
806 }
807 }
808 }
809 };
810 Tween.prototype._handleRelativeValue = function (start, end) {
811 if (typeof end !== 'string') {
812 return end;
813 }
814 if (end.charAt(0) === '+' || end.charAt(0) === '-') {
815 return start + parseFloat(end);
816 }
817 return parseFloat(end);
818 };
819 Tween.prototype._swapEndStartRepeatValues = function (property) {
820 var tmp = this._valuesStartRepeat[property];
821 var endValue = this._valuesEnd[property];
822 if (typeof endValue === 'string') {
823 this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue);
824 }
825 else {
826 this._valuesStartRepeat[property] = this._valuesEnd[property];
827 }
828 this._valuesEnd[property] = tmp;
829 };
830 return Tween;
831}());
832
833var VERSION = '23.1.3';
834
835/**
836 * Tween.js - Licensed under the MIT license
837 * https://github.com/tweenjs/tween.js
838 * ----------------------------------------------
839 *
840 * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors.
841 * Thank you all, you're awesome!
842 */
843var nextId = Sequence.nextId;
844/**
845 * Controlling groups of tweens
846 *
847 * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components.
848 * In these cases, you may want to create your own smaller groups of tweens.
849 */
850var TWEEN = mainGroup;
851// This is the best way to export things in a way that's compatible with both ES
852// Modules and CommonJS, without build hacks, and so as not to break the
853// existing API.
854// https://github.com/rollup/rollup/issues/1961#issuecomment-423037881
855var getAll = TWEEN.getAll.bind(TWEEN);
856var removeAll = TWEEN.removeAll.bind(TWEEN);
857var add = TWEEN.add.bind(TWEEN);
858var remove = TWEEN.remove.bind(TWEEN);
859var update = TWEEN.update.bind(TWEEN);
860var exports = {
861 Easing: Easing,
862 Group: Group,
863 Interpolation: Interpolation,
864 now: now,
865 Sequence: Sequence,
866 nextId: nextId,
867 Tween: Tween,
868 VERSION: VERSION,
869 getAll: getAll,
870 removeAll: removeAll,
871 add: add,
872 remove: remove,
873 update: update,
874};
875
876export { Easing, Group, Interpolation, Sequence, Tween, VERSION, add, exports as default, getAll, nextId, now, remove, removeAll, update };