animejs 4.1.4 → 4.2.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.
Files changed (188) hide show
  1. package/README.md +17 -8
  2. package/{lib → dist/bundles}/anime.esm.js +6476 -6106
  3. package/dist/bundles/anime.esm.min.js +7 -0
  4. package/dist/bundles/anime.umd.js +8809 -0
  5. package/dist/bundles/anime.umd.min.js +7 -0
  6. package/dist/modules/animatable/animatable.cjs +150 -0
  7. package/dist/modules/animatable/animatable.d.ts +28 -0
  8. package/dist/modules/animatable/animatable.js +147 -0
  9. package/dist/modules/animatable/index.cjs +15 -0
  10. package/dist/modules/animatable/index.d.ts +1 -0
  11. package/dist/modules/animatable/index.js +8 -0
  12. package/dist/modules/animation/additive.cjs +82 -0
  13. package/dist/modules/animation/additive.d.ts +15 -0
  14. package/dist/modules/animation/additive.js +79 -0
  15. package/dist/modules/animation/animation.cjs +667 -0
  16. package/dist/modules/animation/animation.d.ts +45 -0
  17. package/dist/modules/animation/animation.js +664 -0
  18. package/dist/modules/animation/composition.cjs +383 -0
  19. package/dist/modules/animation/composition.d.ts +10 -0
  20. package/dist/modules/animation/composition.js +377 -0
  21. package/dist/modules/animation/index.cjs +15 -0
  22. package/dist/modules/animation/index.d.ts +1 -0
  23. package/dist/modules/animation/index.js +8 -0
  24. package/dist/modules/core/clock.cjs +110 -0
  25. package/dist/modules/core/clock.d.ts +51 -0
  26. package/dist/modules/core/clock.js +108 -0
  27. package/dist/modules/core/colors.cjs +102 -0
  28. package/dist/modules/core/colors.d.ts +2 -0
  29. package/dist/modules/core/colors.js +100 -0
  30. package/dist/modules/core/consts.cjs +159 -0
  31. package/dist/modules/core/consts.d.ts +61 -0
  32. package/dist/modules/core/consts.js +124 -0
  33. package/dist/modules/core/globals.cjs +78 -0
  34. package/dist/modules/core/globals.d.ts +29 -0
  35. package/dist/modules/core/globals.js +73 -0
  36. package/dist/modules/core/helpers.cjs +304 -0
  37. package/dist/modules/core/helpers.d.ts +43 -0
  38. package/dist/modules/core/helpers.js +261 -0
  39. package/dist/modules/core/render.cjs +391 -0
  40. package/dist/modules/core/render.d.ts +4 -0
  41. package/dist/modules/core/render.js +388 -0
  42. package/dist/modules/core/styles.cjs +116 -0
  43. package/dist/modules/core/styles.d.ts +5 -0
  44. package/dist/modules/core/styles.js +113 -0
  45. package/dist/modules/core/targets.cjs +136 -0
  46. package/dist/modules/core/targets.d.ts +118 -0
  47. package/dist/modules/core/targets.js +132 -0
  48. package/dist/modules/core/transforms.cjs +49 -0
  49. package/dist/modules/core/transforms.d.ts +2 -0
  50. package/dist/modules/core/transforms.js +47 -0
  51. package/dist/modules/core/units.cjs +67 -0
  52. package/dist/modules/core/units.d.ts +3 -0
  53. package/dist/modules/core/units.js +65 -0
  54. package/dist/modules/core/values.cjs +226 -0
  55. package/dist/modules/core/values.d.ts +14 -0
  56. package/dist/modules/core/values.js +216 -0
  57. package/dist/modules/draggable/draggable.cjs +1226 -0
  58. package/dist/modules/draggable/draggable.d.ts +272 -0
  59. package/dist/modules/draggable/draggable.js +1223 -0
  60. package/dist/modules/draggable/index.cjs +15 -0
  61. package/dist/modules/draggable/index.d.ts +1 -0
  62. package/dist/modules/draggable/index.js +8 -0
  63. package/dist/modules/easings/cubic-bezier/index.cjs +64 -0
  64. package/dist/modules/easings/cubic-bezier/index.d.ts +2 -0
  65. package/dist/modules/easings/cubic-bezier/index.js +62 -0
  66. package/dist/modules/easings/eases/index.cjs +14 -0
  67. package/dist/modules/easings/eases/index.d.ts +1 -0
  68. package/dist/modules/easings/eases/index.js +8 -0
  69. package/dist/modules/easings/eases/parser.cjs +191 -0
  70. package/dist/modules/easings/eases/parser.d.ts +125 -0
  71. package/dist/modules/easings/eases/parser.js +185 -0
  72. package/dist/modules/easings/index.cjs +26 -0
  73. package/dist/modules/easings/index.d.ts +6 -0
  74. package/dist/modules/easings/index.js +13 -0
  75. package/dist/modules/easings/irregular/index.cjs +41 -0
  76. package/dist/modules/easings/irregular/index.d.ts +2 -0
  77. package/dist/modules/easings/irregular/index.js +39 -0
  78. package/dist/modules/easings/linear/index.cjs +59 -0
  79. package/dist/modules/easings/linear/index.d.ts +2 -0
  80. package/dist/modules/easings/linear/index.js +57 -0
  81. package/dist/modules/easings/none.cjs +19 -0
  82. package/dist/modules/easings/none.d.ts +8 -0
  83. package/dist/modules/easings/none.js +17 -0
  84. package/dist/modules/easings/spring/index.cjs +255 -0
  85. package/dist/modules/easings/spring/index.d.ts +53 -0
  86. package/dist/modules/easings/spring/index.js +251 -0
  87. package/dist/modules/easings/steps/index.cjs +30 -0
  88. package/dist/modules/easings/steps/index.d.ts +2 -0
  89. package/dist/modules/easings/steps/index.js +28 -0
  90. package/dist/modules/engine/engine.cjs +168 -0
  91. package/dist/modules/engine/engine.d.ts +21 -0
  92. package/dist/modules/engine/engine.js +166 -0
  93. package/dist/modules/engine/index.cjs +14 -0
  94. package/dist/modules/engine/index.d.ts +1 -0
  95. package/dist/modules/engine/index.js +8 -0
  96. package/dist/modules/events/index.cjs +16 -0
  97. package/dist/modules/events/index.d.ts +1 -0
  98. package/dist/modules/events/index.js +8 -0
  99. package/dist/modules/events/scroll.cjs +940 -0
  100. package/dist/modules/events/scroll.d.ts +191 -0
  101. package/dist/modules/events/scroll.js +936 -0
  102. package/dist/modules/index.cjs +102 -0
  103. package/dist/modules/index.d.ts +18 -0
  104. package/dist/modules/index.js +41 -0
  105. package/dist/modules/scope/index.cjs +15 -0
  106. package/dist/modules/scope/index.d.ts +1 -0
  107. package/dist/modules/scope/index.js +8 -0
  108. package/dist/modules/scope/scope.cjs +254 -0
  109. package/dist/modules/scope/scope.d.ts +115 -0
  110. package/dist/modules/scope/scope.js +251 -0
  111. package/dist/modules/svg/drawable.cjs +119 -0
  112. package/dist/modules/svg/drawable.d.ts +3 -0
  113. package/dist/modules/svg/drawable.js +117 -0
  114. package/dist/modules/svg/helpers.cjs +30 -0
  115. package/dist/modules/svg/helpers.d.ts +2 -0
  116. package/dist/modules/svg/helpers.js +28 -0
  117. package/dist/modules/svg/index.cjs +18 -0
  118. package/dist/modules/svg/index.d.ts +3 -0
  119. package/dist/modules/svg/index.js +10 -0
  120. package/dist/modules/svg/morphto.cjs +58 -0
  121. package/dist/modules/svg/morphto.d.ts +3 -0
  122. package/dist/modules/svg/morphto.js +56 -0
  123. package/dist/modules/svg/motionpath.cjs +79 -0
  124. package/dist/modules/svg/motionpath.d.ts +7 -0
  125. package/dist/modules/svg/motionpath.js +77 -0
  126. package/dist/modules/text/index.cjs +16 -0
  127. package/dist/modules/text/index.d.ts +1 -0
  128. package/dist/modules/text/index.js +8 -0
  129. package/dist/modules/text/split.cjs +488 -0
  130. package/dist/modules/text/split.d.ts +62 -0
  131. package/dist/modules/text/split.js +484 -0
  132. package/dist/modules/timeline/index.cjs +15 -0
  133. package/dist/modules/timeline/index.d.ts +1 -0
  134. package/dist/modules/timeline/index.js +8 -0
  135. package/dist/modules/timeline/position.cjs +72 -0
  136. package/dist/modules/timeline/position.d.ts +3 -0
  137. package/dist/modules/timeline/position.js +70 -0
  138. package/dist/modules/timeline/timeline.cjs +312 -0
  139. package/dist/modules/timeline/timeline.d.ts +163 -0
  140. package/dist/modules/timeline/timeline.js +309 -0
  141. package/dist/modules/timer/index.cjs +15 -0
  142. package/dist/modules/timer/index.d.ts +1 -0
  143. package/dist/modules/timer/index.js +8 -0
  144. package/dist/modules/timer/timer.cjs +491 -0
  145. package/dist/modules/timer/timer.d.ts +141 -0
  146. package/dist/modules/timer/timer.js +488 -0
  147. package/dist/modules/types/index.d.ts +404 -0
  148. package/dist/modules/utils/chainable.cjs +190 -0
  149. package/dist/modules/utils/chainable.d.ts +135 -0
  150. package/dist/modules/utils/chainable.js +177 -0
  151. package/dist/modules/utils/index.cjs +43 -0
  152. package/dist/modules/utils/index.d.ts +5 -0
  153. package/dist/modules/utils/index.js +14 -0
  154. package/dist/modules/utils/number.cjs +97 -0
  155. package/dist/modules/utils/number.d.ts +9 -0
  156. package/dist/modules/utils/number.js +85 -0
  157. package/dist/modules/utils/random.cjs +77 -0
  158. package/dist/modules/utils/random.d.ts +22 -0
  159. package/dist/modules/utils/random.js +72 -0
  160. package/dist/modules/utils/stagger.cjs +122 -0
  161. package/dist/modules/utils/stagger.d.ts +30 -0
  162. package/dist/modules/utils/stagger.js +120 -0
  163. package/dist/modules/utils/target.cjs +130 -0
  164. package/dist/modules/utils/target.d.ts +126 -0
  165. package/dist/modules/utils/target.js +125 -0
  166. package/dist/modules/utils/time.cjs +57 -0
  167. package/dist/modules/utils/time.d.ts +5 -0
  168. package/dist/modules/utils/time.js +54 -0
  169. package/dist/modules/waapi/composition.cjs +95 -0
  170. package/dist/modules/waapi/composition.d.ts +4 -0
  171. package/dist/modules/waapi/composition.js +92 -0
  172. package/dist/modules/waapi/index.cjs +15 -0
  173. package/dist/modules/waapi/index.d.ts +1 -0
  174. package/dist/modules/waapi/index.js +8 -0
  175. package/dist/modules/waapi/waapi.cjs +492 -0
  176. package/dist/modules/waapi/waapi.d.ts +116 -0
  177. package/dist/modules/waapi/waapi.js +489 -0
  178. package/package.json +166 -33
  179. package/lib/anime.cjs +0 -9
  180. package/lib/anime.esm.min.js +0 -9
  181. package/lib/anime.iife.js +0 -9
  182. package/lib/anime.iife.min.js +0 -9
  183. package/lib/anime.min.cjs +0 -9
  184. package/lib/anime.umd.js +0 -9
  185. package/lib/anime.umd.min.js +0 -9
  186. package/lib/gui/index.js +0 -6341
  187. package/types/index.d.ts +0 -1127
  188. package/types/index.js +0 -7395
@@ -0,0 +1,388 @@
1
+ /**
2
+ * Anime.js - core - ESM
3
+ * @version v4.2.0
4
+ * @license MIT
5
+ * @copyright 2025 - Julian Garnier
6
+ */
7
+
8
+ import { globals } from './globals.js';
9
+ import { minValue, tickModes, valueTypes, compositionTypes, tweenTypes, transformsSymbol, transformsFragmentStrings, emptyString } from './consts.js';
10
+ import { forEachChildren, round, now, clamp, lerp } from './helpers.js';
11
+
12
+ /**
13
+ * @import {
14
+ * Tickable,
15
+ * Renderable,
16
+ * CallbackArgument,
17
+ * Tween,
18
+ * DOMTarget,
19
+ * } from '../types/index.js'
20
+ */
21
+
22
+ /**
23
+ * @import {
24
+ * JSAnimation,
25
+ * } from '../animation/animation.js'
26
+ */
27
+
28
+ /**
29
+ * @import {
30
+ * Timeline,
31
+ * } from '../timeline/timeline.js'
32
+ */
33
+
34
+ /**
35
+ * @param {Tickable} tickable
36
+ * @param {Number} time
37
+ * @param {Number} muteCallbacks
38
+ * @param {Number} internalRender
39
+ * @param {tickModes} tickMode
40
+ * @return {Number}
41
+ */
42
+ const render = (tickable, time, muteCallbacks, internalRender, tickMode) => {
43
+
44
+ const parent = tickable.parent;
45
+ const duration = tickable.duration;
46
+ const completed = tickable.completed;
47
+ const iterationDuration = tickable.iterationDuration;
48
+ const iterationCount = tickable.iterationCount;
49
+ const _currentIteration = tickable._currentIteration;
50
+ const _loopDelay = tickable._loopDelay;
51
+ const _reversed = tickable._reversed;
52
+ const _alternate = tickable._alternate;
53
+ const _hasChildren = tickable._hasChildren;
54
+ const tickableDelay = tickable._delay;
55
+ const tickablePrevAbsoluteTime = tickable._currentTime; // TODO: rename ._currentTime to ._absoluteCurrentTime
56
+
57
+ const tickableEndTime = tickableDelay + iterationDuration;
58
+ const tickableAbsoluteTime = time - tickableDelay;
59
+ const tickablePrevTime = clamp(tickablePrevAbsoluteTime, -tickableDelay, duration);
60
+ const tickableCurrentTime = clamp(tickableAbsoluteTime, -tickableDelay, duration);
61
+ const deltaTime = tickableAbsoluteTime - tickablePrevAbsoluteTime;
62
+ const isCurrentTimeAboveZero = tickableCurrentTime > 0;
63
+ const isCurrentTimeEqualOrAboveDuration = tickableCurrentTime >= duration;
64
+ const isSetter = duration <= minValue;
65
+ const forcedTick = tickMode === tickModes.FORCE;
66
+
67
+ let isOdd = 0;
68
+ let iterationElapsedTime = tickableAbsoluteTime;
69
+ // Render checks
70
+ // Used to also check if the children have rendered in order to trigger the onRender callback on the parent timer
71
+ let hasRendered = 0;
72
+
73
+ // Execute the "expensive" iterations calculations only when necessary
74
+ if (iterationCount > 1) {
75
+ // bitwise NOT operator seems to be generally faster than Math.floor() across browsers
76
+ const currentIteration = ~~(tickableCurrentTime / (iterationDuration + (isCurrentTimeEqualOrAboveDuration ? 0 : _loopDelay)));
77
+ tickable._currentIteration = clamp(currentIteration, 0, iterationCount);
78
+ // Prevent the iteration count to go above the max iterations when reaching the end of the animation
79
+ if (isCurrentTimeEqualOrAboveDuration) tickable._currentIteration--;
80
+ isOdd = tickable._currentIteration % 2;
81
+ iterationElapsedTime = tickableCurrentTime % (iterationDuration + _loopDelay) || 0;
82
+ }
83
+
84
+ // Checks if exactly one of _reversed and (_alternate && isOdd) is true
85
+ const isReversed = _reversed ^ (_alternate && isOdd);
86
+ const _ease = /** @type {Renderable} */(tickable)._ease;
87
+ let iterationTime = isCurrentTimeEqualOrAboveDuration ? isReversed ? 0 : duration : isReversed ? iterationDuration - iterationElapsedTime : iterationElapsedTime;
88
+ if (_ease) iterationTime = iterationDuration * _ease(iterationTime / iterationDuration) || 0;
89
+ const isRunningBackwards = (parent ? parent.backwards : tickableAbsoluteTime < tickablePrevAbsoluteTime) ? !isReversed : !!isReversed;
90
+
91
+ tickable._currentTime = tickableAbsoluteTime;
92
+ tickable._iterationTime = iterationTime;
93
+ tickable.backwards = isRunningBackwards;
94
+
95
+ if (isCurrentTimeAboveZero && !tickable.began) {
96
+ tickable.began = true;
97
+ if (!muteCallbacks && !(parent && (isRunningBackwards || !parent.began))) {
98
+ tickable.onBegin(/** @type {CallbackArgument} */(tickable));
99
+ }
100
+ } else if (tickableAbsoluteTime <= 0) {
101
+ tickable.began = false;
102
+ }
103
+
104
+ // Only triggers onLoop for tickable without children, otherwise call the the onLoop callback in the tick function
105
+ // Make sure to trigger the onLoop before rendering to allow .refresh() to pickup the current values
106
+ if (!muteCallbacks && !_hasChildren && isCurrentTimeAboveZero && tickable._currentIteration !== _currentIteration) {
107
+ tickable.onLoop(/** @type {CallbackArgument} */(tickable));
108
+ }
109
+
110
+ if (
111
+ forcedTick ||
112
+ tickMode === tickModes.AUTO && (
113
+ time >= tickableDelay && time <= tickableEndTime || // Normal render
114
+ time <= tickableDelay && tickablePrevTime > tickableDelay || // Playhead is before the animation start time so make sure the animation is at its initial state
115
+ time >= tickableEndTime && tickablePrevTime !== duration // Playhead is after the animation end time so make sure the animation is at its end state
116
+ ) ||
117
+ iterationTime >= tickableEndTime && tickablePrevTime !== duration ||
118
+ iterationTime <= tickableDelay && tickablePrevTime > 0 ||
119
+ time <= tickablePrevTime && tickablePrevTime === duration && completed || // Force a render if a seek occurs on an completed animation
120
+ isCurrentTimeEqualOrAboveDuration && !completed && isSetter // This prevents 0 duration tickables to be skipped
121
+ ) {
122
+
123
+ if (isCurrentTimeAboveZero) {
124
+ // Trigger onUpdate callback before rendering
125
+ tickable.computeDeltaTime(tickablePrevTime);
126
+ if (!muteCallbacks) tickable.onBeforeUpdate(/** @type {CallbackArgument} */(tickable));
127
+ }
128
+
129
+ // Start tweens rendering
130
+ if (!_hasChildren) {
131
+
132
+ // Time has jumped more than globals.tickThreshold so consider this tick manual
133
+ const forcedRender = forcedTick || (isRunningBackwards ? deltaTime * -1 : deltaTime) >= globals.tickThreshold;
134
+ const absoluteTime = tickable._offset + (parent ? parent._offset : 0) + tickableDelay + iterationTime;
135
+
136
+ // Only Animation can have tweens, Timer returns undefined
137
+ let tween = /** @type {Tween} */(/** @type {JSAnimation} */(tickable)._head);
138
+ let tweenTarget;
139
+ let tweenStyle;
140
+ let tweenTargetTransforms;
141
+ let tweenTargetTransformsProperties;
142
+ let tweenTransformsNeedUpdate = 0;
143
+
144
+ while (tween) {
145
+
146
+ const tweenComposition = tween._composition;
147
+ const tweenCurrentTime = tween._currentTime;
148
+ const tweenChangeDuration = tween._changeDuration;
149
+ const tweenAbsEndTime = tween._absoluteStartTime + tween._changeDuration;
150
+ const tweenNextRep = tween._nextRep;
151
+ const tweenPrevRep = tween._prevRep;
152
+ const tweenHasComposition = tweenComposition !== compositionTypes.none;
153
+
154
+ if ((forcedRender || (
155
+ (tweenCurrentTime !== tweenChangeDuration || absoluteTime <= tweenAbsEndTime + (tweenNextRep ? tweenNextRep._delay : 0)) &&
156
+ (tweenCurrentTime !== 0 || absoluteTime >= tween._absoluteStartTime)
157
+ )) && (!tweenHasComposition || (
158
+ !tween._isOverridden &&
159
+ (!tween._isOverlapped || absoluteTime <= tweenAbsEndTime) &&
160
+ (!tweenNextRep || (tweenNextRep._isOverridden || absoluteTime <= tweenNextRep._absoluteStartTime)) &&
161
+ (!tweenPrevRep || (tweenPrevRep._isOverridden || (absoluteTime >= (tweenPrevRep._absoluteStartTime + tweenPrevRep._changeDuration) + tween._delay)))
162
+ ))
163
+ ) {
164
+
165
+ const tweenNewTime = tween._currentTime = clamp(iterationTime - tween._startTime, 0, tweenChangeDuration);
166
+ const tweenProgress = tween._ease(tweenNewTime / tween._updateDuration);
167
+ const tweenModifier = tween._modifier;
168
+ const tweenValueType = tween._valueType;
169
+ const tweenType = tween._tweenType;
170
+ const tweenIsObject = tweenType === tweenTypes.OBJECT;
171
+ const tweenIsNumber = tweenValueType === valueTypes.NUMBER;
172
+ // Only round the in-between frames values if the final value is a string
173
+ const tweenPrecision = (tweenIsNumber && tweenIsObject) || tweenProgress === 0 || tweenProgress === 1 ? -1 : globals.precision;
174
+
175
+ // Recompose tween value
176
+ /** @type {String|Number} */
177
+ let value;
178
+ /** @type {Number} */
179
+ let number;
180
+
181
+ if (tweenIsNumber) {
182
+ value = number = /** @type {Number} */(tweenModifier(round(lerp(tween._fromNumber, tween._toNumber, tweenProgress), tweenPrecision )));
183
+ } else if (tweenValueType === valueTypes.UNIT) {
184
+ // Rounding the values speed up string composition
185
+ number = /** @type {Number} */(tweenModifier(round(lerp(tween._fromNumber, tween._toNumber, tweenProgress), tweenPrecision)));
186
+ value = `${number}${tween._unit}`;
187
+ } else if (tweenValueType === valueTypes.COLOR) {
188
+ const fn = tween._fromNumbers;
189
+ const tn = tween._toNumbers;
190
+ const r = round(clamp(/** @type {Number} */(tweenModifier(lerp(fn[0], tn[0], tweenProgress))), 0, 255), 0);
191
+ const g = round(clamp(/** @type {Number} */(tweenModifier(lerp(fn[1], tn[1], tweenProgress))), 0, 255), 0);
192
+ const b = round(clamp(/** @type {Number} */(tweenModifier(lerp(fn[2], tn[2], tweenProgress))), 0, 255), 0);
193
+ const a = clamp(/** @type {Number} */(tweenModifier(round(lerp(fn[3], tn[3], tweenProgress), tweenPrecision))), 0, 1);
194
+ value = `rgba(${r},${g},${b},${a})`;
195
+ if (tweenHasComposition) {
196
+ const ns = tween._numbers;
197
+ ns[0] = r;
198
+ ns[1] = g;
199
+ ns[2] = b;
200
+ ns[3] = a;
201
+ }
202
+ } else if (tweenValueType === valueTypes.COMPLEX) {
203
+ value = tween._strings[0];
204
+ for (let j = 0, l = tween._toNumbers.length; j < l; j++) {
205
+ const n = /** @type {Number} */(tweenModifier(round(lerp(tween._fromNumbers[j], tween._toNumbers[j], tweenProgress), tweenPrecision)));
206
+ const s = tween._strings[j + 1];
207
+ value += `${s ? n + s : n}`;
208
+ if (tweenHasComposition) {
209
+ tween._numbers[j] = n;
210
+ }
211
+ }
212
+ }
213
+
214
+ // For additive tweens and Animatables
215
+ if (tweenHasComposition) {
216
+ tween._number = number;
217
+ }
218
+
219
+ if (!internalRender && tweenComposition !== compositionTypes.blend) {
220
+
221
+ const tweenProperty = tween.property;
222
+ tweenTarget = tween.target;
223
+
224
+ if (tweenIsObject) {
225
+ tweenTarget[tweenProperty] = value;
226
+ } else if (tweenType === tweenTypes.ATTRIBUTE) {
227
+ /** @type {DOMTarget} */(tweenTarget).setAttribute(tweenProperty, /** @type {String} */(value));
228
+ } else {
229
+ tweenStyle = /** @type {DOMTarget} */(tweenTarget).style;
230
+ if (tweenType === tweenTypes.TRANSFORM) {
231
+ if (tweenTarget !== tweenTargetTransforms) {
232
+ tweenTargetTransforms = tweenTarget;
233
+ // NOTE: Referencing the cachedTransforms in the tween property directly can be a little bit faster but appears to increase memory usage.
234
+ tweenTargetTransformsProperties = tweenTarget[transformsSymbol];
235
+ }
236
+ tweenTargetTransformsProperties[tweenProperty] = value;
237
+ tweenTransformsNeedUpdate = 1;
238
+ } else if (tweenType === tweenTypes.CSS) {
239
+ tweenStyle[tweenProperty] = value;
240
+ } else if (tweenType === tweenTypes.CSS_VAR) {
241
+ tweenStyle.setProperty(tweenProperty,/** @type {String} */(value));
242
+ }
243
+ }
244
+
245
+ if (isCurrentTimeAboveZero) hasRendered = 1;
246
+
247
+ } else {
248
+ // Used for composing timeline tweens without having to do a real render
249
+ tween._value = value;
250
+ }
251
+
252
+ }
253
+
254
+ // NOTE: Possible improvement: Use translate(x,y) / translate3d(x,y,z) syntax
255
+ // to reduce memory usage on string composition
256
+ if (tweenTransformsNeedUpdate && tween._renderTransforms) {
257
+ let str = emptyString;
258
+ for (let key in tweenTargetTransformsProperties) {
259
+ str += `${transformsFragmentStrings[key]}${tweenTargetTransformsProperties[key]}) `;
260
+ }
261
+ tweenStyle.transform = str;
262
+ tweenTransformsNeedUpdate = 0;
263
+ }
264
+
265
+ tween = tween._next;
266
+ }
267
+
268
+ if (!muteCallbacks && hasRendered) {
269
+ /** @type {JSAnimation} */(tickable).onRender(/** @type {JSAnimation} */(tickable));
270
+ }
271
+ }
272
+
273
+ if (!muteCallbacks && isCurrentTimeAboveZero) {
274
+ tickable.onUpdate(/** @type {CallbackArgument} */(tickable));
275
+ }
276
+
277
+ }
278
+
279
+ // End tweens rendering
280
+
281
+ // Handle setters on timeline differently and allow re-trigering the onComplete callback when seeking backwards
282
+ if (parent && isSetter) {
283
+ if (!muteCallbacks && (
284
+ // (tickableAbsoluteTime > 0 instead) of (tickableAbsoluteTime >= duration) to prevent floating point precision issues
285
+ // see: https://github.com/juliangarnier/anime/issues/1088
286
+ (parent.began && !isRunningBackwards && tickableAbsoluteTime > 0 && !completed) ||
287
+ (isRunningBackwards && tickableAbsoluteTime <= 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 = 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
+ 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, 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 <= minValue && (!childStartTime || childEndTime === tlIterationDuration)) {
356
+ child.onComplete(child);
357
+ }
358
+ }
359
+ });
360
+ if (!muteCallbacks) tl.onLoop(/** @type {CallbackArgument} */(tl));
361
+ }
362
+
363
+ forEachChildren(tl, (/** @type {JSAnimation} */child) => {
364
+ const childTime = 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
+ export { render, tick };
@@ -0,0 +1,116 @@
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 consts = require('./consts.cjs');
11
+ var helpers = require('./helpers.cjs');
12
+
13
+ /**
14
+ * @import {
15
+ * JSAnimation,
16
+ * } from '../animation/animation.js'
17
+ */
18
+
19
+ /**
20
+ * @import {
21
+ * Target,
22
+ * DOMTarget,
23
+ * Renderable,
24
+ * Tween,
25
+ * } from '../types/index.js'
26
+ */
27
+
28
+ const propertyNamesCache = {};
29
+
30
+ /**
31
+ * @param {String} propertyName
32
+ * @param {Target} target
33
+ * @param {tweenTypes} tweenType
34
+ * @return {String}
35
+ */
36
+ const sanitizePropertyName = (propertyName, target, tweenType) => {
37
+ if (tweenType === consts.tweenTypes.TRANSFORM) {
38
+ const t = consts.shortTransforms.get(propertyName);
39
+ return t ? t : propertyName;
40
+ } else if (
41
+ tweenType === consts.tweenTypes.CSS ||
42
+ // Handle special cases where properties like "strokeDashoffset" needs to be set as "stroke-dashoffset"
43
+ // but properties like "baseFrequency" should stay in lowerCamelCase
44
+ (tweenType === consts.tweenTypes.ATTRIBUTE && (helpers.isSvg(target) && propertyName in /** @type {DOMTarget} */(target).style))
45
+ ) {
46
+ const cachedPropertyName = propertyNamesCache[propertyName];
47
+ if (cachedPropertyName) {
48
+ return cachedPropertyName;
49
+ } else {
50
+ const lowerCaseName = propertyName ? helpers.toLowerCase(propertyName) : propertyName;
51
+ propertyNamesCache[propertyName] = lowerCaseName;
52
+ return lowerCaseName;
53
+ }
54
+ } else {
55
+ return propertyName;
56
+ }
57
+ };
58
+
59
+ /**
60
+ * @template {Renderable} T
61
+ * @param {T} renderable
62
+ * @return {T}
63
+ */
64
+ const cleanInlineStyles = renderable => {
65
+ // Allow cleanInlineStyles() to be called on timelines
66
+ if (renderable._hasChildren) {
67
+ helpers.forEachChildren(renderable, cleanInlineStyles, true);
68
+ } else {
69
+ const animation = /** @type {JSAnimation} */(renderable);
70
+ animation.pause();
71
+ helpers.forEachChildren(animation, (/** @type {Tween} */tween) => {
72
+ const tweenProperty = tween.property;
73
+ const tweenTarget = tween.target;
74
+ if (tweenTarget[consts.isDomSymbol]) {
75
+ const targetStyle = /** @type {DOMTarget} */(tweenTarget).style;
76
+ const originalInlinedValue = tween._inlineValue;
77
+ const tweenHadNoInlineValue = helpers.isNil(originalInlinedValue) || originalInlinedValue === consts.emptyString;
78
+ if (tween._tweenType === consts.tweenTypes.TRANSFORM) {
79
+ const cachedTransforms = tweenTarget[consts.transformsSymbol];
80
+ if (tweenHadNoInlineValue) {
81
+ delete cachedTransforms[tweenProperty];
82
+ } else {
83
+ cachedTransforms[tweenProperty] = originalInlinedValue;
84
+ }
85
+ if (tween._renderTransforms) {
86
+ if (!Object.keys(cachedTransforms).length) {
87
+ targetStyle.removeProperty('transform');
88
+ } else {
89
+ let str = consts.emptyString;
90
+ for (let key in cachedTransforms) {
91
+ str += consts.transformsFragmentStrings[key] + cachedTransforms[key] + ') ';
92
+ }
93
+ targetStyle.transform = str;
94
+ }
95
+ }
96
+ } else {
97
+ if (tweenHadNoInlineValue) {
98
+ targetStyle.removeProperty(helpers.toLowerCase(tweenProperty));
99
+ } else {
100
+ targetStyle[tweenProperty] = originalInlinedValue;
101
+ }
102
+ }
103
+ if (animation._tail === tween) {
104
+ animation.targets.forEach(t => {
105
+ if (t.getAttribute && t.getAttribute('style') === consts.emptyString) {
106
+ t.removeAttribute('style');
107
+ } });
108
+ }
109
+ }
110
+ });
111
+ }
112
+ return renderable;
113
+ };
114
+
115
+ exports.cleanInlineStyles = cleanInlineStyles;
116
+ exports.sanitizePropertyName = sanitizePropertyName;
@@ -0,0 +1,5 @@
1
+ export function sanitizePropertyName(propertyName: string, target: Target, tweenType: tweenTypes): string;
2
+ export function cleanInlineStyles<T extends Renderable>(renderable: T): T;
3
+ import type { Target } from '../types/index.js';
4
+ import { tweenTypes } from './consts.js';
5
+ import type { Renderable } from '../types/index.js';
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Anime.js - core - ESM
3
+ * @version v4.2.0
4
+ * @license MIT
5
+ * @copyright 2025 - Julian Garnier
6
+ */
7
+
8
+ import { tweenTypes, shortTransforms, isDomSymbol, transformsSymbol, transformsFragmentStrings, emptyString } from './consts.js';
9
+ import { forEachChildren, isSvg, toLowerCase, isNil } from './helpers.js';
10
+
11
+ /**
12
+ * @import {
13
+ * JSAnimation,
14
+ * } from '../animation/animation.js'
15
+ */
16
+
17
+ /**
18
+ * @import {
19
+ * Target,
20
+ * DOMTarget,
21
+ * Renderable,
22
+ * Tween,
23
+ * } from '../types/index.js'
24
+ */
25
+
26
+ const propertyNamesCache = {};
27
+
28
+ /**
29
+ * @param {String} propertyName
30
+ * @param {Target} target
31
+ * @param {tweenTypes} tweenType
32
+ * @return {String}
33
+ */
34
+ const sanitizePropertyName = (propertyName, target, tweenType) => {
35
+ if (tweenType === tweenTypes.TRANSFORM) {
36
+ const t = shortTransforms.get(propertyName);
37
+ return t ? t : propertyName;
38
+ } else if (
39
+ tweenType === tweenTypes.CSS ||
40
+ // Handle special cases where properties like "strokeDashoffset" needs to be set as "stroke-dashoffset"
41
+ // but properties like "baseFrequency" should stay in lowerCamelCase
42
+ (tweenType === tweenTypes.ATTRIBUTE && (isSvg(target) && propertyName in /** @type {DOMTarget} */(target).style))
43
+ ) {
44
+ const cachedPropertyName = propertyNamesCache[propertyName];
45
+ if (cachedPropertyName) {
46
+ return cachedPropertyName;
47
+ } else {
48
+ const lowerCaseName = propertyName ? toLowerCase(propertyName) : propertyName;
49
+ propertyNamesCache[propertyName] = lowerCaseName;
50
+ return lowerCaseName;
51
+ }
52
+ } else {
53
+ return propertyName;
54
+ }
55
+ };
56
+
57
+ /**
58
+ * @template {Renderable} T
59
+ * @param {T} renderable
60
+ * @return {T}
61
+ */
62
+ const cleanInlineStyles = renderable => {
63
+ // Allow cleanInlineStyles() to be called on timelines
64
+ if (renderable._hasChildren) {
65
+ forEachChildren(renderable, cleanInlineStyles, true);
66
+ } else {
67
+ const animation = /** @type {JSAnimation} */(renderable);
68
+ animation.pause();
69
+ forEachChildren(animation, (/** @type {Tween} */tween) => {
70
+ const tweenProperty = tween.property;
71
+ const tweenTarget = tween.target;
72
+ if (tweenTarget[isDomSymbol]) {
73
+ const targetStyle = /** @type {DOMTarget} */(tweenTarget).style;
74
+ const originalInlinedValue = tween._inlineValue;
75
+ const tweenHadNoInlineValue = isNil(originalInlinedValue) || originalInlinedValue === emptyString;
76
+ if (tween._tweenType === tweenTypes.TRANSFORM) {
77
+ const cachedTransforms = tweenTarget[transformsSymbol];
78
+ if (tweenHadNoInlineValue) {
79
+ delete cachedTransforms[tweenProperty];
80
+ } else {
81
+ cachedTransforms[tweenProperty] = originalInlinedValue;
82
+ }
83
+ if (tween._renderTransforms) {
84
+ if (!Object.keys(cachedTransforms).length) {
85
+ targetStyle.removeProperty('transform');
86
+ } else {
87
+ let str = emptyString;
88
+ for (let key in cachedTransforms) {
89
+ str += transformsFragmentStrings[key] + cachedTransforms[key] + ') ';
90
+ }
91
+ targetStyle.transform = str;
92
+ }
93
+ }
94
+ } else {
95
+ if (tweenHadNoInlineValue) {
96
+ targetStyle.removeProperty(toLowerCase(tweenProperty));
97
+ } else {
98
+ targetStyle[tweenProperty] = originalInlinedValue;
99
+ }
100
+ }
101
+ if (animation._tail === tween) {
102
+ animation.targets.forEach(t => {
103
+ if (t.getAttribute && t.getAttribute('style') === emptyString) {
104
+ t.removeAttribute('style');
105
+ } });
106
+ }
107
+ }
108
+ });
109
+ }
110
+ return renderable;
111
+ };
112
+
113
+ export { cleanInlineStyles, sanitizePropertyName };