animejs 4.1.2 → 4.2.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -8
- package/{lib → dist/bundles}/anime.esm.js +6549 -6265
- package/dist/bundles/anime.esm.min.js +7 -0
- package/dist/bundles/anime.umd.js +8621 -0
- package/dist/bundles/anime.umd.min.js +7 -0
- package/dist/modules/animatable/animatable.cjs +150 -0
- package/dist/modules/animatable/animatable.d.ts +28 -0
- package/dist/modules/animatable/animatable.js +147 -0
- package/dist/modules/animatable/index.cjs +15 -0
- package/dist/modules/animatable/index.d.ts +1 -0
- package/dist/modules/animatable/index.js +8 -0
- package/dist/modules/animation/additive.cjs +82 -0
- package/dist/modules/animation/additive.d.ts +15 -0
- package/dist/modules/animation/additive.js +79 -0
- package/dist/modules/animation/animation.cjs +660 -0
- package/dist/modules/animation/animation.d.ts +47 -0
- package/dist/modules/animation/animation.js +657 -0
- package/dist/modules/animation/composition.cjs +383 -0
- package/dist/modules/animation/composition.d.ts +10 -0
- package/dist/modules/animation/composition.js +377 -0
- package/dist/modules/animation/index.cjs +15 -0
- package/dist/modules/animation/index.d.ts +1 -0
- package/dist/modules/animation/index.js +8 -0
- package/dist/modules/core/clock.cjs +110 -0
- package/dist/modules/core/clock.d.ts +51 -0
- package/dist/modules/core/clock.js +108 -0
- package/dist/modules/core/colors.cjs +102 -0
- package/dist/modules/core/colors.d.ts +2 -0
- package/dist/modules/core/colors.js +100 -0
- package/dist/modules/core/consts.cjs +154 -0
- package/dist/modules/core/consts.d.ts +59 -0
- package/dist/modules/core/consts.js +121 -0
- package/dist/modules/core/globals.cjs +77 -0
- package/dist/modules/core/globals.d.ts +29 -0
- package/dist/modules/core/globals.js +72 -0
- package/dist/modules/core/helpers.cjs +304 -0
- package/dist/modules/core/helpers.d.ts +43 -0
- package/dist/modules/core/helpers.js +261 -0
- package/dist/modules/core/render.cjs +389 -0
- package/dist/modules/core/render.d.ts +4 -0
- package/dist/modules/core/render.js +386 -0
- package/dist/modules/core/styles.cjs +116 -0
- package/dist/modules/core/styles.d.ts +5 -0
- package/dist/modules/core/styles.js +113 -0
- package/dist/modules/core/targets.cjs +136 -0
- package/dist/modules/core/targets.d.ts +118 -0
- package/dist/modules/core/targets.js +132 -0
- package/dist/modules/core/transforms.cjs +49 -0
- package/dist/modules/core/transforms.d.ts +2 -0
- package/dist/modules/core/transforms.js +47 -0
- package/dist/modules/core/units.cjs +67 -0
- package/dist/modules/core/units.d.ts +3 -0
- package/dist/modules/core/units.js +65 -0
- package/dist/modules/core/values.cjs +215 -0
- package/dist/modules/core/values.d.ts +14 -0
- package/dist/modules/core/values.js +205 -0
- package/dist/modules/draggable/draggable.cjs +1226 -0
- package/dist/modules/draggable/draggable.d.ts +272 -0
- package/dist/modules/draggable/draggable.js +1223 -0
- package/dist/modules/draggable/index.cjs +15 -0
- package/dist/modules/draggable/index.d.ts +1 -0
- package/dist/modules/draggable/index.js +8 -0
- package/dist/modules/easings/cubic-bezier.cjs +64 -0
- package/dist/modules/easings/cubic-bezier.d.ts +2 -0
- package/dist/modules/easings/cubic-bezier.js +62 -0
- package/dist/modules/easings/eases.cjs +149 -0
- package/dist/modules/easings/eases.d.ts +111 -0
- package/dist/modules/easings/eases.js +146 -0
- package/dist/modules/easings/index.cjs +24 -0
- package/dist/modules/easings/index.d.ts +6 -0
- package/dist/modules/easings/index.js +13 -0
- package/dist/modules/easings/irregular.cjs +41 -0
- package/dist/modules/easings/irregular.d.ts +2 -0
- package/dist/modules/easings/irregular.js +39 -0
- package/dist/modules/easings/linear.cjs +59 -0
- package/dist/modules/easings/linear.d.ts +2 -0
- package/dist/modules/easings/linear.js +57 -0
- package/dist/modules/easings/none.cjs +19 -0
- package/dist/modules/easings/none.d.ts +8 -0
- package/dist/modules/easings/none.js +17 -0
- package/dist/modules/easings/parser.cjs +59 -0
- package/dist/modules/easings/parser.d.ts +21 -0
- package/dist/modules/easings/parser.js +55 -0
- package/dist/modules/easings/steps.cjs +30 -0
- package/dist/modules/easings/steps.d.ts +2 -0
- package/dist/modules/easings/steps.js +28 -0
- package/dist/modules/engine/engine.cjs +168 -0
- package/dist/modules/engine/engine.d.ts +21 -0
- package/dist/modules/engine/engine.js +166 -0
- package/dist/modules/engine/index.cjs +14 -0
- package/dist/modules/engine/index.d.ts +1 -0
- package/dist/modules/engine/index.js +8 -0
- package/dist/modules/events/index.cjs +16 -0
- package/dist/modules/events/index.d.ts +1 -0
- package/dist/modules/events/index.js +8 -0
- package/dist/modules/events/scroll.cjs +936 -0
- package/dist/modules/events/scroll.d.ts +189 -0
- package/dist/modules/events/scroll.js +932 -0
- package/dist/modules/index.cjs +103 -0
- package/dist/modules/index.d.ts +19 -0
- package/dist/modules/index.js +42 -0
- package/dist/modules/scope/index.cjs +15 -0
- package/dist/modules/scope/index.d.ts +1 -0
- package/dist/modules/scope/index.js +8 -0
- package/dist/modules/scope/scope.cjs +254 -0
- package/dist/modules/scope/scope.d.ts +115 -0
- package/dist/modules/scope/scope.js +251 -0
- package/dist/modules/spring/index.cjs +15 -0
- package/dist/modules/spring/index.d.ts +1 -0
- package/dist/modules/spring/index.js +8 -0
- package/dist/modules/spring/spring.cjs +133 -0
- package/dist/modules/spring/spring.d.ts +37 -0
- package/dist/modules/spring/spring.js +130 -0
- package/dist/modules/svg/drawable.cjs +119 -0
- package/dist/modules/svg/drawable.d.ts +3 -0
- package/dist/modules/svg/drawable.js +117 -0
- package/dist/modules/svg/helpers.cjs +30 -0
- package/dist/modules/svg/helpers.d.ts +2 -0
- package/dist/modules/svg/helpers.js +28 -0
- package/dist/modules/svg/index.cjs +18 -0
- package/dist/modules/svg/index.d.ts +3 -0
- package/dist/modules/svg/index.js +10 -0
- package/dist/modules/svg/morphto.cjs +58 -0
- package/dist/modules/svg/morphto.d.ts +3 -0
- package/dist/modules/svg/morphto.js +56 -0
- package/dist/modules/svg/motionpath.cjs +79 -0
- package/dist/modules/svg/motionpath.d.ts +7 -0
- package/dist/modules/svg/motionpath.js +77 -0
- package/dist/modules/text/index.cjs +16 -0
- package/dist/modules/text/index.d.ts +1 -0
- package/dist/modules/text/index.js +8 -0
- package/dist/modules/text/split.cjs +488 -0
- package/dist/modules/text/split.d.ts +62 -0
- package/dist/modules/text/split.js +484 -0
- package/dist/modules/timeline/index.cjs +15 -0
- package/dist/modules/timeline/index.d.ts +1 -0
- package/dist/modules/timeline/index.js +8 -0
- package/dist/modules/timeline/position.cjs +72 -0
- package/dist/modules/timeline/position.d.ts +3 -0
- package/dist/modules/timeline/position.js +70 -0
- package/dist/modules/timeline/timeline.cjs +312 -0
- package/dist/modules/timeline/timeline.d.ts +163 -0
- package/dist/modules/timeline/timeline.js +309 -0
- package/dist/modules/timer/index.cjs +15 -0
- package/dist/modules/timer/index.d.ts +1 -0
- package/dist/modules/timer/index.js +8 -0
- package/dist/modules/timer/timer.cjs +491 -0
- package/dist/modules/timer/timer.d.ts +141 -0
- package/dist/modules/timer/timer.js +488 -0
- package/dist/modules/types/index.d.ts +387 -0
- package/dist/modules/utils/chainable.cjs +190 -0
- package/dist/modules/utils/chainable.d.ts +135 -0
- package/dist/modules/utils/chainable.js +177 -0
- package/dist/modules/utils/index.cjs +43 -0
- package/dist/modules/utils/index.d.ts +5 -0
- package/dist/modules/utils/index.js +14 -0
- package/dist/modules/utils/number.cjs +97 -0
- package/dist/modules/utils/number.d.ts +9 -0
- package/dist/modules/utils/number.js +85 -0
- package/dist/modules/utils/random.cjs +77 -0
- package/dist/modules/utils/random.d.ts +22 -0
- package/dist/modules/utils/random.js +72 -0
- package/dist/modules/utils/stagger.cjs +122 -0
- package/dist/modules/utils/stagger.d.ts +30 -0
- package/dist/modules/utils/stagger.js +120 -0
- package/dist/modules/utils/target.cjs +130 -0
- package/dist/modules/utils/target.d.ts +126 -0
- package/dist/modules/utils/target.js +125 -0
- package/dist/modules/utils/time.cjs +57 -0
- package/dist/modules/utils/time.d.ts +5 -0
- package/dist/modules/utils/time.js +54 -0
- package/dist/modules/waapi/composition.cjs +89 -0
- package/dist/modules/waapi/composition.d.ts +4 -0
- package/dist/modules/waapi/composition.js +86 -0
- package/dist/modules/waapi/index.cjs +15 -0
- package/dist/modules/waapi/index.d.ts +1 -0
- package/dist/modules/waapi/index.js +8 -0
- package/dist/modules/waapi/waapi.cjs +473 -0
- package/dist/modules/waapi/waapi.d.ts +114 -0
- package/dist/modules/waapi/waapi.js +470 -0
- package/package.json +130 -33
- package/lib/anime.cjs +0 -9
- package/lib/anime.esm.min.js +0 -9
- package/lib/anime.iife.js +0 -9
- package/lib/anime.iife.min.js +0 -9
- package/lib/anime.min.cjs +0 -9
- package/lib/anime.umd.js +0 -9
- package/lib/anime.umd.min.js +0 -9
- package/lib/gui/index.js +0 -6341
- package/types/index.d.ts +0 -1081
- package/types/index.js +0 -7407
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anime.js - core - CJS
|
|
3
|
+
* @version v4.2.0
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright 2025 - Julian Garnier
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
var globals = require('./globals.cjs');
|
|
11
|
+
var consts = require('./consts.cjs');
|
|
12
|
+
var helpers = require('./helpers.cjs');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @import {
|
|
16
|
+
* Tickable,
|
|
17
|
+
* Renderable,
|
|
18
|
+
* CallbackArgument,
|
|
19
|
+
* Tween,
|
|
20
|
+
* DOMTarget,
|
|
21
|
+
* } from '../types/index.js'
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @import {
|
|
26
|
+
* JSAnimation,
|
|
27
|
+
* } from '../animation/animation.js'
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @import {
|
|
32
|
+
* Timeline,
|
|
33
|
+
* } from '../timeline/timeline.js'
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @param {Tickable} tickable
|
|
38
|
+
* @param {Number} time
|
|
39
|
+
* @param {Number} muteCallbacks
|
|
40
|
+
* @param {Number} internalRender
|
|
41
|
+
* @param {tickModes} tickMode
|
|
42
|
+
* @return {Number}
|
|
43
|
+
*/
|
|
44
|
+
const render = (tickable, time, muteCallbacks, internalRender, tickMode) => {
|
|
45
|
+
|
|
46
|
+
const parent = tickable.parent;
|
|
47
|
+
const duration = tickable.duration;
|
|
48
|
+
const completed = tickable.completed;
|
|
49
|
+
const iterationDuration = tickable.iterationDuration;
|
|
50
|
+
const iterationCount = tickable.iterationCount;
|
|
51
|
+
const _currentIteration = tickable._currentIteration;
|
|
52
|
+
const _loopDelay = tickable._loopDelay;
|
|
53
|
+
const _reversed = tickable._reversed;
|
|
54
|
+
const _alternate = tickable._alternate;
|
|
55
|
+
const _hasChildren = tickable._hasChildren;
|
|
56
|
+
const tickableDelay = tickable._delay;
|
|
57
|
+
const tickablePrevAbsoluteTime = tickable._currentTime; // TODO: rename ._currentTime to ._absoluteCurrentTime
|
|
58
|
+
|
|
59
|
+
const tickableEndTime = tickableDelay + iterationDuration;
|
|
60
|
+
const tickableAbsoluteTime = time - tickableDelay;
|
|
61
|
+
const tickablePrevTime = helpers.clamp(tickablePrevAbsoluteTime, -tickableDelay, duration);
|
|
62
|
+
const tickableCurrentTime = helpers.clamp(tickableAbsoluteTime, -tickableDelay, duration);
|
|
63
|
+
const deltaTime = tickableAbsoluteTime - tickablePrevAbsoluteTime;
|
|
64
|
+
const isCurrentTimeAboveZero = tickableCurrentTime > 0;
|
|
65
|
+
const isCurrentTimeEqualOrAboveDuration = tickableCurrentTime >= duration;
|
|
66
|
+
const isSetter = duration <= consts.minValue;
|
|
67
|
+
const forcedTick = tickMode === consts.tickModes.FORCE;
|
|
68
|
+
|
|
69
|
+
let isOdd = 0;
|
|
70
|
+
let iterationElapsedTime = tickableAbsoluteTime;
|
|
71
|
+
// Render checks
|
|
72
|
+
// Used to also check if the children have rendered in order to trigger the onRender callback on the parent timer
|
|
73
|
+
let hasRendered = 0;
|
|
74
|
+
|
|
75
|
+
// Execute the "expensive" iterations calculations only when necessary
|
|
76
|
+
if (iterationCount > 1) {
|
|
77
|
+
// bitwise NOT operator seems to be generally faster than Math.floor() across browsers
|
|
78
|
+
const currentIteration = ~~(tickableCurrentTime / (iterationDuration + (isCurrentTimeEqualOrAboveDuration ? 0 : _loopDelay)));
|
|
79
|
+
tickable._currentIteration = helpers.clamp(currentIteration, 0, iterationCount);
|
|
80
|
+
// Prevent the iteration count to go above the max iterations when reaching the end of the animation
|
|
81
|
+
if (isCurrentTimeEqualOrAboveDuration) tickable._currentIteration--;
|
|
82
|
+
isOdd = tickable._currentIteration % 2;
|
|
83
|
+
iterationElapsedTime = tickableCurrentTime % (iterationDuration + _loopDelay) || 0;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Checks if exactly one of _reversed and (_alternate && isOdd) is true
|
|
87
|
+
const isReversed = _reversed ^ (_alternate && isOdd);
|
|
88
|
+
const _ease = /** @type {Renderable} */(tickable)._ease;
|
|
89
|
+
let iterationTime = isCurrentTimeEqualOrAboveDuration ? isReversed ? 0 : duration : isReversed ? iterationDuration - iterationElapsedTime : iterationElapsedTime;
|
|
90
|
+
if (_ease) iterationTime = iterationDuration * _ease(iterationTime / iterationDuration) || 0;
|
|
91
|
+
const isRunningBackwards = (parent ? parent.backwards : tickableAbsoluteTime < tickablePrevAbsoluteTime) ? !isReversed : !!isReversed;
|
|
92
|
+
|
|
93
|
+
tickable._currentTime = tickableAbsoluteTime;
|
|
94
|
+
tickable._iterationTime = iterationTime;
|
|
95
|
+
tickable.backwards = isRunningBackwards;
|
|
96
|
+
|
|
97
|
+
if (isCurrentTimeAboveZero && !tickable.began) {
|
|
98
|
+
tickable.began = true;
|
|
99
|
+
if (!muteCallbacks && !(parent && (isRunningBackwards || !parent.began))) {
|
|
100
|
+
tickable.onBegin(/** @type {CallbackArgument} */(tickable));
|
|
101
|
+
}
|
|
102
|
+
} else if (tickableAbsoluteTime <= 0) {
|
|
103
|
+
tickable.began = false;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Only triggers onLoop for tickable without children, otherwise call the the onLoop callback in the tick function
|
|
107
|
+
// Make sure to trigger the onLoop before rendering to allow .refresh() to pickup the current values
|
|
108
|
+
if (!muteCallbacks && !_hasChildren && isCurrentTimeAboveZero && tickable._currentIteration !== _currentIteration) {
|
|
109
|
+
tickable.onLoop(/** @type {CallbackArgument} */(tickable));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (
|
|
113
|
+
forcedTick ||
|
|
114
|
+
tickMode === consts.tickModes.AUTO && (
|
|
115
|
+
time >= tickableDelay && time <= tickableEndTime || // Normal render
|
|
116
|
+
time <= tickableDelay && tickablePrevTime > tickableDelay || // Playhead is before the animation start time so make sure the animation is at its initial state
|
|
117
|
+
time >= tickableEndTime && tickablePrevTime !== duration // Playhead is after the animation end time so make sure the animation is at its end state
|
|
118
|
+
) ||
|
|
119
|
+
iterationTime >= tickableEndTime && tickablePrevTime !== duration ||
|
|
120
|
+
iterationTime <= tickableDelay && tickablePrevTime > 0 ||
|
|
121
|
+
time <= tickablePrevTime && tickablePrevTime === duration && completed || // Force a render if a seek occurs on an completed animation
|
|
122
|
+
isCurrentTimeEqualOrAboveDuration && !completed && isSetter // This prevents 0 duration tickables to be skipped
|
|
123
|
+
) {
|
|
124
|
+
|
|
125
|
+
if (isCurrentTimeAboveZero) {
|
|
126
|
+
// Trigger onUpdate callback before rendering
|
|
127
|
+
tickable.computeDeltaTime(tickablePrevTime);
|
|
128
|
+
if (!muteCallbacks) tickable.onBeforeUpdate(/** @type {CallbackArgument} */(tickable));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Start tweens rendering
|
|
132
|
+
if (!_hasChildren) {
|
|
133
|
+
|
|
134
|
+
// Time has jumped more than globals.tickThreshold so consider this tick manual
|
|
135
|
+
const forcedRender = forcedTick || (isRunningBackwards ? deltaTime * -1 : deltaTime) >= globals.globals.tickThreshold;
|
|
136
|
+
const absoluteTime = tickable._offset + (parent ? parent._offset : 0) + tickableDelay + iterationTime;
|
|
137
|
+
|
|
138
|
+
// Only Animation can have tweens, Timer returns undefined
|
|
139
|
+
let tween = /** @type {Tween} */(/** @type {JSAnimation} */(tickable)._head);
|
|
140
|
+
let tweenTarget;
|
|
141
|
+
let tweenStyle;
|
|
142
|
+
let tweenTargetTransforms;
|
|
143
|
+
let tweenTargetTransformsProperties;
|
|
144
|
+
let tweenTransformsNeedUpdate = 0;
|
|
145
|
+
|
|
146
|
+
while (tween) {
|
|
147
|
+
|
|
148
|
+
const tweenComposition = tween._composition;
|
|
149
|
+
const tweenCurrentTime = tween._currentTime;
|
|
150
|
+
const tweenChangeDuration = tween._changeDuration;
|
|
151
|
+
const tweenAbsEndTime = tween._absoluteStartTime + tween._changeDuration;
|
|
152
|
+
const tweenNextRep = tween._nextRep;
|
|
153
|
+
const tweenPrevRep = tween._prevRep;
|
|
154
|
+
const tweenHasComposition = tweenComposition !== consts.compositionTypes.none;
|
|
155
|
+
|
|
156
|
+
if ((forcedRender || (
|
|
157
|
+
(tweenCurrentTime !== tweenChangeDuration || absoluteTime <= tweenAbsEndTime + (tweenNextRep ? tweenNextRep._delay : 0)) &&
|
|
158
|
+
(tweenCurrentTime !== 0 || absoluteTime >= tween._absoluteStartTime)
|
|
159
|
+
)) && (!tweenHasComposition || (
|
|
160
|
+
!tween._isOverridden &&
|
|
161
|
+
(!tween._isOverlapped || absoluteTime <= tweenAbsEndTime) &&
|
|
162
|
+
(!tweenNextRep || (tweenNextRep._isOverridden || absoluteTime <= tweenNextRep._absoluteStartTime)) &&
|
|
163
|
+
(!tweenPrevRep || (tweenPrevRep._isOverridden || (absoluteTime >= (tweenPrevRep._absoluteStartTime + tweenPrevRep._changeDuration) + tween._delay)))
|
|
164
|
+
))
|
|
165
|
+
) {
|
|
166
|
+
|
|
167
|
+
const tweenNewTime = tween._currentTime = helpers.clamp(iterationTime - tween._startTime, 0, tweenChangeDuration);
|
|
168
|
+
const tweenProgress = tween._ease(tweenNewTime / tween._updateDuration);
|
|
169
|
+
const tweenModifier = tween._modifier;
|
|
170
|
+
const tweenValueType = tween._valueType;
|
|
171
|
+
const tweenType = tween._tweenType;
|
|
172
|
+
const tweenIsObject = tweenType === consts.tweenTypes.OBJECT;
|
|
173
|
+
const tweenIsNumber = tweenValueType === consts.valueTypes.NUMBER;
|
|
174
|
+
// Only round the in-between frames values if the final value is a string
|
|
175
|
+
const tweenPrecision = (tweenIsNumber && tweenIsObject) || tweenProgress === 0 || tweenProgress === 1 ? -1 : globals.globals.precision;
|
|
176
|
+
|
|
177
|
+
// Recompose tween value
|
|
178
|
+
/** @type {String|Number} */
|
|
179
|
+
let value;
|
|
180
|
+
/** @type {Number} */
|
|
181
|
+
let number;
|
|
182
|
+
|
|
183
|
+
if (tweenIsNumber) {
|
|
184
|
+
value = number = /** @type {Number} */(tweenModifier(helpers.round(helpers.lerp(tween._fromNumber, tween._toNumber, tweenProgress), tweenPrecision )));
|
|
185
|
+
} else if (tweenValueType === consts.valueTypes.UNIT) {
|
|
186
|
+
// Rounding the values speed up string composition
|
|
187
|
+
number = /** @type {Number} */(tweenModifier(helpers.round(helpers.lerp(tween._fromNumber, tween._toNumber, tweenProgress), tweenPrecision)));
|
|
188
|
+
value = `${number}${tween._unit}`;
|
|
189
|
+
} else if (tweenValueType === consts.valueTypes.COLOR) {
|
|
190
|
+
const fn = tween._fromNumbers;
|
|
191
|
+
const tn = tween._toNumbers;
|
|
192
|
+
const r = helpers.round(helpers.clamp(/** @type {Number} */(tweenModifier(helpers.lerp(fn[0], tn[0], tweenProgress))), 0, 255), 0);
|
|
193
|
+
const g = helpers.round(helpers.clamp(/** @type {Number} */(tweenModifier(helpers.lerp(fn[1], tn[1], tweenProgress))), 0, 255), 0);
|
|
194
|
+
const b = helpers.round(helpers.clamp(/** @type {Number} */(tweenModifier(helpers.lerp(fn[2], tn[2], tweenProgress))), 0, 255), 0);
|
|
195
|
+
const a = helpers.clamp(/** @type {Number} */(tweenModifier(helpers.round(helpers.lerp(fn[3], tn[3], tweenProgress), tweenPrecision))), 0, 1);
|
|
196
|
+
value = `rgba(${r},${g},${b},${a})`;
|
|
197
|
+
if (tweenHasComposition) {
|
|
198
|
+
const ns = tween._numbers;
|
|
199
|
+
ns[0] = r;
|
|
200
|
+
ns[1] = g;
|
|
201
|
+
ns[2] = b;
|
|
202
|
+
ns[3] = a;
|
|
203
|
+
}
|
|
204
|
+
} else if (tweenValueType === consts.valueTypes.COMPLEX) {
|
|
205
|
+
value = tween._strings[0];
|
|
206
|
+
for (let j = 0, l = tween._toNumbers.length; j < l; j++) {
|
|
207
|
+
const n = /** @type {Number} */(tweenModifier(helpers.round(helpers.lerp(tween._fromNumbers[j], tween._toNumbers[j], tweenProgress), tweenPrecision)));
|
|
208
|
+
const s = tween._strings[j + 1];
|
|
209
|
+
value += `${s ? n + s : n}`;
|
|
210
|
+
if (tweenHasComposition) {
|
|
211
|
+
tween._numbers[j] = n;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// For additive tweens and Animatables
|
|
217
|
+
if (tweenHasComposition) {
|
|
218
|
+
tween._number = number;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (!internalRender && tweenComposition !== consts.compositionTypes.blend) {
|
|
222
|
+
|
|
223
|
+
const tweenProperty = tween.property;
|
|
224
|
+
tweenTarget = tween.target;
|
|
225
|
+
|
|
226
|
+
if (tweenIsObject) {
|
|
227
|
+
tweenTarget[tweenProperty] = value;
|
|
228
|
+
} else if (tweenType === consts.tweenTypes.ATTRIBUTE) {
|
|
229
|
+
/** @type {DOMTarget} */(tweenTarget).setAttribute(tweenProperty, /** @type {String} */(value));
|
|
230
|
+
} else {
|
|
231
|
+
tweenStyle = /** @type {DOMTarget} */(tweenTarget).style;
|
|
232
|
+
if (tweenType === consts.tweenTypes.TRANSFORM) {
|
|
233
|
+
if (tweenTarget !== tweenTargetTransforms) {
|
|
234
|
+
tweenTargetTransforms = tweenTarget;
|
|
235
|
+
// NOTE: Referencing the cachedTransforms in the tween property directly can be a little bit faster but appears to increase memory usage.
|
|
236
|
+
tweenTargetTransformsProperties = tweenTarget[consts.transformsSymbol];
|
|
237
|
+
}
|
|
238
|
+
tweenTargetTransformsProperties[tweenProperty] = value;
|
|
239
|
+
tweenTransformsNeedUpdate = 1;
|
|
240
|
+
} else if (tweenType === consts.tweenTypes.CSS) {
|
|
241
|
+
tweenStyle[tweenProperty] = value;
|
|
242
|
+
} else if (tweenType === consts.tweenTypes.CSS_VAR) {
|
|
243
|
+
tweenStyle.setProperty(tweenProperty,/** @type {String} */(value));
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (isCurrentTimeAboveZero) hasRendered = 1;
|
|
248
|
+
|
|
249
|
+
} else {
|
|
250
|
+
// Used for composing timeline tweens without having to do a real render
|
|
251
|
+
tween._value = value;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// NOTE: Possible improvement: Use translate(x,y) / translate3d(x,y,z) syntax
|
|
257
|
+
// to reduce memory usage on string composition
|
|
258
|
+
if (tweenTransformsNeedUpdate && tween._renderTransforms) {
|
|
259
|
+
let str = consts.emptyString;
|
|
260
|
+
for (let key in tweenTargetTransformsProperties) {
|
|
261
|
+
str += `${consts.transformsFragmentStrings[key]}${tweenTargetTransformsProperties[key]}) `;
|
|
262
|
+
}
|
|
263
|
+
tweenStyle.transform = str;
|
|
264
|
+
tweenTransformsNeedUpdate = 0;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
tween = tween._next;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (!muteCallbacks && hasRendered) {
|
|
271
|
+
/** @type {JSAnimation} */(tickable).onRender(/** @type {JSAnimation} */(tickable));
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (!muteCallbacks && isCurrentTimeAboveZero) {
|
|
276
|
+
tickable.onUpdate(/** @type {CallbackArgument} */(tickable));
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// End tweens rendering
|
|
282
|
+
|
|
283
|
+
// Handle setters on timeline differently and allow re-trigering the onComplete callback when seeking backwards
|
|
284
|
+
if (parent && isSetter) {
|
|
285
|
+
if (!muteCallbacks && (
|
|
286
|
+
(parent.began && !isRunningBackwards && tickableAbsoluteTime >= duration && !completed) ||
|
|
287
|
+
(isRunningBackwards && tickableAbsoluteTime <= consts.minValue && completed)
|
|
288
|
+
)) {
|
|
289
|
+
tickable.onComplete(/** @type {CallbackArgument} */(tickable));
|
|
290
|
+
tickable.completed = !isRunningBackwards;
|
|
291
|
+
}
|
|
292
|
+
// If currentTime is both above 0 and at least equals to duration, handles normal onComplete or infinite loops
|
|
293
|
+
} else if (isCurrentTimeAboveZero && isCurrentTimeEqualOrAboveDuration) {
|
|
294
|
+
if (iterationCount === Infinity) {
|
|
295
|
+
// Offset the tickable _startTime with its duration to reset _currentTime to 0 and continue the infinite timer
|
|
296
|
+
tickable._startTime += tickable.duration;
|
|
297
|
+
} else if (tickable._currentIteration >= iterationCount - 1) {
|
|
298
|
+
// By setting paused to true, we tell the engine loop to not render this tickable and removes it from the list on the next tick
|
|
299
|
+
tickable.paused = true;
|
|
300
|
+
if (!completed && !_hasChildren) {
|
|
301
|
+
// If the tickable has children, triggers onComplete() only when all children have completed in the tick function
|
|
302
|
+
tickable.completed = true;
|
|
303
|
+
if (!muteCallbacks && !(parent && (isRunningBackwards || !parent.began))) {
|
|
304
|
+
tickable.onComplete(/** @type {CallbackArgument} */(tickable));
|
|
305
|
+
tickable._resolve(/** @type {CallbackArgument} */(tickable));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// Otherwise set the completed flag to false
|
|
310
|
+
} else {
|
|
311
|
+
tickable.completed = false;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// NOTE: hasRendered * direction (negative for backwards) this way we can remove the tickable.backwards property completly ?
|
|
315
|
+
return hasRendered;
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* @param {Tickable} tickable
|
|
320
|
+
* @param {Number} time
|
|
321
|
+
* @param {Number} muteCallbacks
|
|
322
|
+
* @param {Number} internalRender
|
|
323
|
+
* @param {Number} tickMode
|
|
324
|
+
* @return {void}
|
|
325
|
+
*/
|
|
326
|
+
const tick = (tickable, time, muteCallbacks, internalRender, tickMode) => {
|
|
327
|
+
const _currentIteration = tickable._currentIteration;
|
|
328
|
+
render(tickable, time, muteCallbacks, internalRender, tickMode);
|
|
329
|
+
if (tickable._hasChildren) {
|
|
330
|
+
const tl = /** @type {Timeline} */(tickable);
|
|
331
|
+
const tlIsRunningBackwards = tl.backwards;
|
|
332
|
+
const tlChildrenTime = internalRender ? time : tl._iterationTime;
|
|
333
|
+
const tlCildrenTickTime = helpers.now();
|
|
334
|
+
|
|
335
|
+
let tlChildrenHasRendered = 0;
|
|
336
|
+
let tlChildrenHaveCompleted = true;
|
|
337
|
+
|
|
338
|
+
// If the timeline has looped forward, we need to manually triggers children skipped callbacks
|
|
339
|
+
if (!internalRender && tl._currentIteration !== _currentIteration) {
|
|
340
|
+
const tlIterationDuration = tl.iterationDuration;
|
|
341
|
+
helpers.forEachChildren(tl, (/** @type {JSAnimation} */child) => {
|
|
342
|
+
if (!tlIsRunningBackwards) {
|
|
343
|
+
// Force an internal render to trigger the callbacks if the child has not completed on loop
|
|
344
|
+
if (!child.completed && !child.backwards && child._currentTime < child.iterationDuration) {
|
|
345
|
+
render(child, tlIterationDuration, muteCallbacks, 1, consts.tickModes.FORCE);
|
|
346
|
+
}
|
|
347
|
+
// Reset their began and completed flags to allow retrigering callbacks on the next iteration
|
|
348
|
+
child.began = false;
|
|
349
|
+
child.completed = false;
|
|
350
|
+
} else {
|
|
351
|
+
const childDuration = child.duration;
|
|
352
|
+
const childStartTime = child._offset + child._delay;
|
|
353
|
+
const childEndTime = childStartTime + childDuration;
|
|
354
|
+
// Triggers the onComplete callback on reverse for children on the edges of the timeline
|
|
355
|
+
if (!muteCallbacks && childDuration <= consts.minValue && (!childStartTime || childEndTime === tlIterationDuration)) {
|
|
356
|
+
child.onComplete(child);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
if (!muteCallbacks) tl.onLoop(/** @type {CallbackArgument} */(tl));
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
helpers.forEachChildren(tl, (/** @type {JSAnimation} */child) => {
|
|
364
|
+
const childTime = helpers.round((tlChildrenTime - child._offset) * child._speed, 12); // Rounding is needed when using seconds
|
|
365
|
+
const childTickMode = child._fps < tl._fps ? child.requestTick(tlCildrenTickTime) : tickMode;
|
|
366
|
+
tlChildrenHasRendered += render(child, childTime, muteCallbacks, internalRender, childTickMode);
|
|
367
|
+
if (!child.completed && tlChildrenHaveCompleted) tlChildrenHaveCompleted = false;
|
|
368
|
+
}, tlIsRunningBackwards);
|
|
369
|
+
|
|
370
|
+
// Renders on timeline are triggered by its children so it needs to be set after rendering the children
|
|
371
|
+
if (!muteCallbacks && tlChildrenHasRendered) tl.onRender(/** @type {CallbackArgument} */(tl));
|
|
372
|
+
|
|
373
|
+
// Triggers the timeline onComplete() once all chindren all completed and the current time has reached the end
|
|
374
|
+
if ((tlChildrenHaveCompleted || tlIsRunningBackwards) && tl._currentTime >= tl.duration) {
|
|
375
|
+
// Make sure the paused flag is false in case it has been skipped in the render function
|
|
376
|
+
tl.paused = true;
|
|
377
|
+
if (!tl.completed) {
|
|
378
|
+
tl.completed = true;
|
|
379
|
+
if (!muteCallbacks) {
|
|
380
|
+
tl.onComplete(/** @type {CallbackArgument} */(tl));
|
|
381
|
+
tl._resolve(/** @type {CallbackArgument} */(tl));
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
exports.render = render;
|
|
389
|
+
exports.tick = tick;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export function render(tickable: Tickable, time: number, muteCallbacks: number, internalRender: number, tickMode: tickModes): number;
|
|
2
|
+
export function tick(tickable: Tickable, time: number, muteCallbacks: number, internalRender: number, tickMode: number): void;
|
|
3
|
+
import type { Tickable } from '../types/index.js';
|
|
4
|
+
import { tickModes } from './consts.js';
|