animejs 4.3.6 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +6 -9
  2. package/dist/bundles/anime.esm.js +973 -391
  3. package/dist/bundles/anime.esm.min.js +2 -2
  4. package/dist/bundles/anime.umd.js +977 -390
  5. package/dist/bundles/anime.umd.min.js +2 -2
  6. package/dist/modules/animatable/animatable.cjs +1 -1
  7. package/dist/modules/animatable/animatable.js +2 -2
  8. package/dist/modules/animatable/index.cjs +1 -1
  9. package/dist/modules/animatable/index.js +1 -1
  10. package/dist/modules/animation/additive.cjs +1 -1
  11. package/dist/modules/animation/additive.js +1 -1
  12. package/dist/modules/animation/animation.cjs +38 -16
  13. package/dist/modules/animation/animation.d.ts +2 -2
  14. package/dist/modules/animation/animation.js +42 -20
  15. package/dist/modules/animation/composition.cjs +1 -1
  16. package/dist/modules/animation/composition.js +3 -3
  17. package/dist/modules/animation/index.cjs +1 -1
  18. package/dist/modules/animation/index.js +1 -1
  19. package/dist/modules/core/clock.cjs +1 -1
  20. package/dist/modules/core/clock.js +1 -1
  21. package/dist/modules/core/colors.cjs +1 -1
  22. package/dist/modules/core/colors.js +1 -1
  23. package/dist/modules/core/consts.cjs +3 -9
  24. package/dist/modules/core/consts.d.ts +1 -5
  25. package/dist/modules/core/consts.js +4 -8
  26. package/dist/modules/core/globals.cjs +16 -5
  27. package/dist/modules/core/globals.d.ts +22 -1
  28. package/dist/modules/core/globals.js +18 -6
  29. package/dist/modules/core/helpers.cjs +7 -10
  30. package/dist/modules/core/helpers.js +8 -11
  31. package/dist/modules/core/render.cjs +7 -34
  32. package/dist/modules/core/render.js +8 -35
  33. package/dist/modules/core/styles.cjs +53 -32
  34. package/dist/modules/core/styles.d.ts +1 -0
  35. package/dist/modules/core/styles.js +55 -35
  36. package/dist/modules/core/targets.cjs +1 -1
  37. package/dist/modules/core/targets.js +1 -1
  38. package/dist/modules/core/transforms.cjs +129 -13
  39. package/dist/modules/core/transforms.d.ts +1 -0
  40. package/dist/modules/core/transforms.js +130 -15
  41. package/dist/modules/core/units.cjs +1 -1
  42. package/dist/modules/core/units.js +1 -1
  43. package/dist/modules/core/values.cjs +68 -8
  44. package/dist/modules/core/values.d.ts +5 -2
  45. package/dist/modules/core/values.js +69 -11
  46. package/dist/modules/draggable/draggable.cjs +1 -1
  47. package/dist/modules/draggable/draggable.js +1 -1
  48. package/dist/modules/draggable/index.cjs +1 -1
  49. package/dist/modules/draggable/index.js +1 -1
  50. package/dist/modules/easings/cubic-bezier/index.cjs +1 -1
  51. package/dist/modules/easings/cubic-bezier/index.js +1 -1
  52. package/dist/modules/easings/eases/index.cjs +1 -1
  53. package/dist/modules/easings/eases/index.js +1 -1
  54. package/dist/modules/easings/eases/parser.cjs +1 -1
  55. package/dist/modules/easings/eases/parser.js +1 -1
  56. package/dist/modules/easings/index.cjs +1 -1
  57. package/dist/modules/easings/index.js +1 -1
  58. package/dist/modules/easings/irregular/index.cjs +1 -1
  59. package/dist/modules/easings/irregular/index.js +1 -1
  60. package/dist/modules/easings/linear/index.cjs +1 -1
  61. package/dist/modules/easings/linear/index.js +1 -1
  62. package/dist/modules/easings/none.cjs +1 -1
  63. package/dist/modules/easings/none.js +1 -1
  64. package/dist/modules/easings/spring/index.cjs +1 -1
  65. package/dist/modules/easings/spring/index.js +1 -1
  66. package/dist/modules/easings/steps/index.cjs +1 -1
  67. package/dist/modules/easings/steps/index.js +1 -1
  68. package/dist/modules/engine/engine.cjs +1 -1
  69. package/dist/modules/engine/engine.js +1 -1
  70. package/dist/modules/engine/index.cjs +1 -1
  71. package/dist/modules/engine/index.js +1 -1
  72. package/dist/modules/events/index.cjs +1 -1
  73. package/dist/modules/events/index.js +1 -1
  74. package/dist/modules/events/scroll.cjs +1 -1
  75. package/dist/modules/events/scroll.js +1 -1
  76. package/dist/modules/index.cjs +9 -1
  77. package/dist/modules/index.d.ts +1 -0
  78. package/dist/modules/index.js +4 -1
  79. package/dist/modules/layout/index.cjs +1 -1
  80. package/dist/modules/layout/index.js +1 -1
  81. package/dist/modules/layout/layout.cjs +29 -25
  82. package/dist/modules/layout/layout.d.ts +4 -3
  83. package/dist/modules/layout/layout.js +30 -26
  84. package/dist/modules/scope/index.cjs +1 -1
  85. package/dist/modules/scope/index.js +1 -1
  86. package/dist/modules/scope/scope.cjs +1 -1
  87. package/dist/modules/scope/scope.js +1 -1
  88. package/dist/modules/svg/drawable.cjs +1 -1
  89. package/dist/modules/svg/drawable.js +1 -1
  90. package/dist/modules/svg/helpers.cjs +1 -1
  91. package/dist/modules/svg/helpers.js +1 -1
  92. package/dist/modules/svg/index.cjs +1 -1
  93. package/dist/modules/svg/index.js +1 -1
  94. package/dist/modules/svg/morphto.cjs +3 -6
  95. package/dist/modules/svg/morphto.js +3 -6
  96. package/dist/modules/svg/motionpath.cjs +1 -1
  97. package/dist/modules/svg/motionpath.js +1 -1
  98. package/dist/modules/text/index.cjs +3 -1
  99. package/dist/modules/text/index.d.ts +1 -0
  100. package/dist/modules/text/index.js +2 -1
  101. package/dist/modules/text/scramble.cjs +272 -0
  102. package/dist/modules/text/scramble.d.ts +3 -0
  103. package/dist/modules/text/scramble.js +270 -0
  104. package/dist/modules/text/split.cjs +5 -5
  105. package/dist/modules/text/split.d.ts +5 -5
  106. package/dist/modules/text/split.js +5 -5
  107. package/dist/modules/timeline/index.cjs +1 -1
  108. package/dist/modules/timeline/index.js +1 -1
  109. package/dist/modules/timeline/position.cjs +1 -1
  110. package/dist/modules/timeline/position.js +1 -1
  111. package/dist/modules/timeline/timeline.cjs +36 -18
  112. package/dist/modules/timeline/timeline.d.ts +6 -5
  113. package/dist/modules/timeline/timeline.js +37 -19
  114. package/dist/modules/timer/index.cjs +1 -1
  115. package/dist/modules/timer/index.js +1 -1
  116. package/dist/modules/timer/timer.cjs +8 -12
  117. package/dist/modules/timer/timer.d.ts +2 -0
  118. package/dist/modules/timer/timer.js +9 -13
  119. package/dist/modules/types/index.d.ts +76 -8
  120. package/dist/modules/utils/chainable.cjs +8 -5
  121. package/dist/modules/utils/chainable.js +8 -5
  122. package/dist/modules/utils/index.cjs +5 -1
  123. package/dist/modules/utils/index.d.ts +1 -0
  124. package/dist/modules/utils/index.js +2 -1
  125. package/dist/modules/utils/number.cjs +1 -1
  126. package/dist/modules/utils/number.js +1 -1
  127. package/dist/modules/utils/random.cjs +1 -1
  128. package/dist/modules/utils/random.js +1 -1
  129. package/dist/modules/utils/stagger.cjs +117 -20
  130. package/dist/modules/utils/stagger.js +118 -21
  131. package/dist/modules/utils/target.cjs +1 -1
  132. package/dist/modules/utils/target.js +1 -1
  133. package/dist/modules/utils/time.cjs +5 -3
  134. package/dist/modules/utils/time.d.ts +1 -1
  135. package/dist/modules/utils/time.js +5 -3
  136. package/dist/modules/waapi/composition.cjs +1 -1
  137. package/dist/modules/waapi/composition.js +1 -1
  138. package/dist/modules/waapi/index.cjs +1 -1
  139. package/dist/modules/waapi/index.js +1 -1
  140. package/dist/modules/waapi/waapi.cjs +19 -20
  141. package/dist/modules/waapi/waapi.js +20 -21
  142. package/package.json +2 -1
@@ -8,6 +8,17 @@
8
8
  * Scope,
9
9
  * } from '../scope/index.js'
10
10
  */
11
+ /**
12
+ * @typedef {Object} EditorGlobals
13
+ * @property {boolean} showPanel
14
+ * @property {boolean} synced
15
+ * @property {Function} addAnimation
16
+ * @property {Function} addTimeline
17
+ * @property {Function} addTimelineChild
18
+ * @property {Function} resolveStagger
19
+ * @property {Object|null} _head
20
+ * @property {Object|null} _tail
21
+ */
11
22
  /** @type {DefaultsParams} */
12
23
  export const defaults: DefaultsParams;
13
24
  export namespace scope {
@@ -19,12 +30,22 @@ export namespace globals {
19
30
  export let precision: number;
20
31
  export let timeScale: number;
21
32
  export let tickThreshold: number;
33
+ export let editor: EditorGlobals | null;
22
34
  }
23
- export const devTools: any;
24
35
  export namespace globalVersions {
25
36
  let version: string;
26
37
  let engine: any;
27
38
  }
39
+ export type EditorGlobals = {
40
+ showPanel: boolean;
41
+ synced: boolean;
42
+ addAnimation: Function;
43
+ addTimeline: Function;
44
+ addTimelineChild: Function;
45
+ resolveStagger: Function;
46
+ _head: any | null;
47
+ _tail: any | null;
48
+ };
28
49
  import type { DefaultsParams } from '../types/index.js';
29
50
  import type { Scope } from '../scope/index.js';
30
51
  import { doc } from './consts.js';
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * Anime.js - core - ESM
3
- * @version v4.3.6
3
+ * @version v4.4.1
4
4
  * @license MIT
5
5
  * @copyright 2026 - Julian Garnier
6
6
  */
7
7
 
8
- import { isBrowser, win, noop, maxFps, K, compositionTypes, doc } from './consts.js';
8
+ import { isBrowser, win, noop, compositionTypes, K, maxFps, doc } from './consts.js';
9
9
 
10
10
  /**
11
11
  * @import {
@@ -18,6 +18,18 @@ import { isBrowser, win, noop, maxFps, K, compositionTypes, doc } from './consts
18
18
  * } from '../scope/index.js'
19
19
  */
20
20
 
21
+ /**
22
+ * @typedef {Object} EditorGlobals
23
+ * @property {boolean} showPanel
24
+ * @property {boolean} synced
25
+ * @property {Function} addAnimation
26
+ * @property {Function} addTimeline
27
+ * @property {Function} addTimelineChild
28
+ * @property {Function} resolveStagger
29
+ * @property {Object|null} _head
30
+ * @property {Object|null} _tail
31
+ */
32
+
21
33
  /** @type {DefaultsParams} */
22
34
  const defaults = {
23
35
  id: null,
@@ -61,15 +73,15 @@ const globals = {
61
73
  timeScale: 1,
62
74
  /** @type {Number} */
63
75
  tickThreshold: 200,
76
+ /** @type {EditorGlobals|null} */
77
+ editor: null,
64
78
  };
65
79
 
66
- const devTools = isBrowser && win.AnimeJSDevTools;
67
-
68
- const globalVersions = { version: '4.3.6', engine: null };
80
+ const globalVersions = { version: '4.4.1', engine: null };
69
81
 
70
82
  if (isBrowser) {
71
83
  if (!win.AnimeJS) win.AnimeJS = [];
72
84
  win.AnimeJS.push(globalVersions);
73
85
  }
74
86
 
75
- export { defaults, devTools, globalVersions, globals, scope };
87
+ export { defaults, globalVersions, globals, scope };
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Anime.js - core - CJS
3
- * @version v4.3.6
3
+ * @version v4.4.1
4
4
  * @license MIT
5
5
  * @copyright 2026 - Julian Garnier
6
6
  */
@@ -124,8 +124,6 @@ const _round = Math.round;
124
124
  */
125
125
  const clamp = (v, min, max) => v < min ? min : v > max ? max : v;
126
126
 
127
- const powCache = {};
128
-
129
127
  /**
130
128
  * Rounds a number to specified decimal places
131
129
  *
@@ -133,13 +131,12 @@ const powCache = {};
133
131
  * @param {Number} decimalLength - Number of decimal places
134
132
  * @return {Number}
135
133
  */
136
- const round = (v, decimalLength) => {
137
- if (decimalLength < 0) return v;
138
- if (!decimalLength) return _round(v);
139
- let p = powCache[decimalLength];
140
- if (!p) p = powCache[decimalLength] = 10 ** decimalLength;
141
- return _round(v * p) / p;
142
- };
134
+ const round = (v, decimalLength) => {
135
+ if (decimalLength < 0) return v;
136
+ if (!decimalLength) return _round(v);
137
+ const p = 10 ** decimalLength;
138
+ return _round(v * p) / p;
139
+ };
143
140
 
144
141
  /**
145
142
  * Snaps a value to nearest increment or array value
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * Anime.js - core - ESM
3
- * @version v4.3.6
3
+ * @version v4.4.1
4
4
  * @license MIT
5
5
  * @copyright 2026 - Julian Garnier
6
6
  */
7
7
 
8
- import { isBrowser, maxValue, minValue, hexTestRgx, lowerCaseRgx, validRgbHslRgx } from './consts.js';
8
+ import { isBrowser, maxValue, minValue, lowerCaseRgx, hexTestRgx, validRgbHslRgx } from './consts.js';
9
9
  import { globals } from './globals.js';
10
10
 
11
11
  /**
@@ -122,8 +122,6 @@ const _round = Math.round;
122
122
  */
123
123
  const clamp = (v, min, max) => v < min ? min : v > max ? max : v;
124
124
 
125
- const powCache = {};
126
-
127
125
  /**
128
126
  * Rounds a number to specified decimal places
129
127
  *
@@ -131,13 +129,12 @@ const powCache = {};
131
129
  * @param {Number} decimalLength - Number of decimal places
132
130
  * @return {Number}
133
131
  */
134
- const round = (v, decimalLength) => {
135
- if (decimalLength < 0) return v;
136
- if (!decimalLength) return _round(v);
137
- let p = powCache[decimalLength];
138
- if (!p) p = powCache[decimalLength] = 10 ** decimalLength;
139
- return _round(v * p) / p;
140
- };
132
+ const round = (v, decimalLength) => {
133
+ if (decimalLength < 0) return v;
134
+ if (!decimalLength) return _round(v);
135
+ const p = 10 ** decimalLength;
136
+ return _round(v * p) / p;
137
+ };
141
138
 
142
139
  /**
143
140
  * Snaps a value to nearest increment or array value
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Anime.js - core - CJS
3
- * @version v4.3.6
3
+ * @version v4.4.1
4
4
  * @license MIT
5
5
  * @copyright 2026 - Julian Garnier
6
6
  */
@@ -10,9 +10,11 @@
10
10
  var globals = require('./globals.cjs');
11
11
  var consts = require('./consts.cjs');
12
12
  var helpers = require('./helpers.cjs');
13
+ var transforms = require('./transforms.cjs');
14
+ var values = require('./values.cjs');
13
15
 
14
16
  /**
15
- * @import {
17
+ * @import {
16
18
  * Tickable,
17
19
  * Renderable,
18
20
  * CallbackArgument,
@@ -55,7 +57,6 @@ const render = (tickable, time, muteCallbacks, internalRender, tickMode) => {
55
57
  const _hasChildren = tickable._hasChildren;
56
58
  const tickableDelay = tickable._delay;
57
59
  const tickablePrevAbsoluteTime = tickable._currentTime; // TODO: rename ._currentTime to ._absoluteCurrentTime
58
-
59
60
  const tickableEndTime = tickableDelay + iterationDuration;
60
61
  const tickableAbsoluteTime = time - tickableDelay;
61
62
  const tickablePrevTime = helpers.clamp(tickablePrevAbsoluteTime, -tickableDelay, duration);
@@ -187,30 +188,9 @@ const render = (tickable, time, muteCallbacks, internalRender, tickMode) => {
187
188
  number = /** @type {Number} */(tweenModifier(helpers.round(helpers.lerp(tween._fromNumber, tween._toNumber, tweenProgress), tweenPrecision)));
188
189
  value = `${number}${tween._unit}`;
189
190
  } 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
- }
191
+ value = values.composeColorValue(tween, tweenProgress, tweenPrecision);
204
192
  } 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
- }
193
+ value = values.composeComplexValue(tween, tweenProgress, tweenPrecision);
214
194
  }
215
195
 
216
196
  // For additive tweens and Animatables
@@ -253,14 +233,8 @@ const render = (tickable, time, muteCallbacks, internalRender, tickMode) => {
253
233
 
254
234
  }
255
235
 
256
- // NOTE: Possible improvement: Use translate(x,y) / translate3d(x,y,z) syntax
257
- // to reduce memory usage on string composition
258
236
  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;
237
+ tweenStyle.transform = transforms.buildTransformString(tweenTargetTransformsProperties);
264
238
  tweenTransformsNeedUpdate = 0;
265
239
  }
266
240
 
@@ -371,7 +345,6 @@ const tick = (tickable, time, muteCallbacks, internalRender, tickMode) => {
371
345
 
372
346
  // Renders on timeline are triggered by its children so it needs to be set after rendering the children
373
347
  if (!muteCallbacks && tlChildrenHasRendered) tl.onRender(/** @type {CallbackArgument} */(tl));
374
-
375
348
  // Triggers the timeline onComplete() once all chindren all completed and the current time has reached the end
376
349
  if ((tlChildrenHaveCompleted || tlIsRunningBackwards) && tl._currentTime >= tl.duration) {
377
350
  // Make sure the paused flag is false in case it has been skipped in the render function
@@ -1,16 +1,18 @@
1
1
  /**
2
2
  * Anime.js - core - ESM
3
- * @version v4.3.6
3
+ * @version v4.4.1
4
4
  * @license MIT
5
5
  * @copyright 2026 - Julian Garnier
6
6
  */
7
7
 
8
8
  import { globals } from './globals.js';
9
- import { minValue, tickModes, valueTypes, compositionTypes, tweenTypes, transformsSymbol, transformsFragmentStrings, emptyString } from './consts.js';
9
+ import { minValue, tickModes, valueTypes, compositionTypes, tweenTypes, transformsSymbol } from './consts.js';
10
10
  import { forEachChildren, round, now, clamp, lerp } from './helpers.js';
11
+ import { buildTransformString } from './transforms.js';
12
+ import { composeColorValue, composeComplexValue } from './values.js';
11
13
 
12
14
  /**
13
- * @import {
15
+ * @import {
14
16
  * Tickable,
15
17
  * Renderable,
16
18
  * CallbackArgument,
@@ -53,7 +55,6 @@ const render = (tickable, time, muteCallbacks, internalRender, tickMode) => {
53
55
  const _hasChildren = tickable._hasChildren;
54
56
  const tickableDelay = tickable._delay;
55
57
  const tickablePrevAbsoluteTime = tickable._currentTime; // TODO: rename ._currentTime to ._absoluteCurrentTime
56
-
57
58
  const tickableEndTime = tickableDelay + iterationDuration;
58
59
  const tickableAbsoluteTime = time - tickableDelay;
59
60
  const tickablePrevTime = clamp(tickablePrevAbsoluteTime, -tickableDelay, duration);
@@ -185,30 +186,9 @@ const render = (tickable, time, muteCallbacks, internalRender, tickMode) => {
185
186
  number = /** @type {Number} */(tweenModifier(round(lerp(tween._fromNumber, tween._toNumber, tweenProgress), tweenPrecision)));
186
187
  value = `${number}${tween._unit}`;
187
188
  } 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
- }
189
+ value = composeColorValue(tween, tweenProgress, tweenPrecision);
202
190
  } 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
- }
191
+ value = composeComplexValue(tween, tweenProgress, tweenPrecision);
212
192
  }
213
193
 
214
194
  // For additive tweens and Animatables
@@ -251,14 +231,8 @@ const render = (tickable, time, muteCallbacks, internalRender, tickMode) => {
251
231
 
252
232
  }
253
233
 
254
- // NOTE: Possible improvement: Use translate(x,y) / translate3d(x,y,z) syntax
255
- // to reduce memory usage on string composition
256
234
  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;
235
+ tweenStyle.transform = buildTransformString(tweenTargetTransformsProperties);
262
236
  tweenTransformsNeedUpdate = 0;
263
237
  }
264
238
 
@@ -369,7 +343,6 @@ const tick = (tickable, time, muteCallbacks, internalRender, tickMode) => {
369
343
 
370
344
  // Renders on timeline are triggered by its children so it needs to be set after rendering the children
371
345
  if (!muteCallbacks && tlChildrenHasRendered) tl.onRender(/** @type {CallbackArgument} */(tl));
372
-
373
346
  // Triggers the timeline onComplete() once all chindren all completed and the current time has reached the end
374
347
  if ((tlChildrenHaveCompleted || tlIsRunningBackwards) && tl._currentTime >= tl.duration) {
375
348
  // Make sure the paused flag is false in case it has been skipped in the render function
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Anime.js - core - CJS
3
- * @version v4.3.6
3
+ * @version v4.4.1
4
4
  * @license MIT
5
5
  * @copyright 2026 - Julian Garnier
6
6
  */
@@ -9,6 +9,7 @@
9
9
 
10
10
  var consts = require('./consts.cjs');
11
11
  var helpers = require('./helpers.cjs');
12
+ var transforms = require('./transforms.cjs');
12
13
 
13
14
  /**
14
15
  * @import {
@@ -59,58 +60,78 @@ const sanitizePropertyName = (propertyName, target, tweenType) => {
59
60
  /**
60
61
  * @template {Renderable} T
61
62
  * @param {T} renderable
63
+ * @param {Boolean} [inlineStylesOnly]
62
64
  * @return {T}
63
65
  */
64
- const cleanInlineStyles = renderable => {
65
- // Allow cleanInlineStyles() to be called on timelines
66
+ const revertValues = (renderable, inlineStylesOnly = false) => {
67
+ // Allow revertValues() to be called on timelines
66
68
  if (renderable._hasChildren) {
67
- helpers.forEachChildren(renderable, cleanInlineStyles, true);
69
+ helpers.forEachChildren(renderable, (/** @type {Renderable} */child) => revertValues(child, inlineStylesOnly), true);
68
70
  } else {
69
71
  const animation = /** @type {JSAnimation} */(renderable);
70
72
  animation.pause();
71
73
  helpers.forEachChildren(animation, (/** @type {Tween} */tween) => {
72
74
  const tweenProperty = tween.property;
73
75
  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');
76
+ const tweenType = tween._tweenType;
77
+ const originalInlinedValue = tween._inlineValue;
78
+ const tweenHadNoInlineValue = helpers.isNil(originalInlinedValue) || originalInlinedValue === consts.emptyString;
79
+ if (tweenType === consts.tweenTypes.OBJECT) {
80
+ if (!inlineStylesOnly && !tweenHadNoInlineValue) {
81
+ tweenTarget[tweenProperty] = originalInlinedValue;
82
+ }
83
+ } else if (tweenTarget[consts.isDomSymbol]) {
84
+ if (tweenType === consts.tweenTypes.ATTRIBUTE) {
85
+ if (!inlineStylesOnly) {
86
+ if (tweenHadNoInlineValue) {
87
+ /** @type {DOMTarget} */(tweenTarget).removeAttribute(tweenProperty);
88
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;
89
+ /** @type {DOMTarget} */(tweenTarget).setAttribute(tweenProperty, /** @type {String} */(originalInlinedValue));
94
90
  }
95
91
  }
96
92
  } else {
97
- if (tweenHadNoInlineValue) {
98
- targetStyle.removeProperty(helpers.toLowerCase(tweenProperty));
93
+ const targetStyle = /** @type {DOMTarget} */(tweenTarget).style;
94
+ if (tweenType === consts.tweenTypes.TRANSFORM) {
95
+ const cachedTransforms = tweenTarget[consts.transformsSymbol];
96
+ if (tweenHadNoInlineValue) {
97
+ delete cachedTransforms[tweenProperty];
98
+ } else {
99
+ cachedTransforms[tweenProperty] = originalInlinedValue;
100
+ }
101
+ if (tween._renderTransforms) {
102
+ if (!Object.keys(cachedTransforms).length) {
103
+ targetStyle.removeProperty('transform');
104
+ } else {
105
+ targetStyle.transform = transforms.buildTransformString(cachedTransforms);
106
+ }
107
+ }
99
108
  } else {
100
- targetStyle[tweenProperty] = originalInlinedValue;
109
+ if (tweenHadNoInlineValue) {
110
+ targetStyle.removeProperty(helpers.toLowerCase(tweenProperty));
111
+ } else {
112
+ targetStyle[tweenProperty] = originalInlinedValue;
113
+ }
101
114
  }
102
115
  }
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
- }
116
+ }
117
+ if (tweenTarget[consts.isDomSymbol] && animation._tail === tween) {
118
+ animation.targets.forEach(t => {
119
+ if (t.getAttribute && t.getAttribute('style') === consts.emptyString) {
120
+ t.removeAttribute('style');
121
+ } });
109
122
  }
110
123
  });
111
124
  }
112
125
  return renderable;
113
126
  };
114
127
 
128
+ /**
129
+ * @template {Renderable} T
130
+ * @param {T} renderable
131
+ * @return {T}
132
+ */
133
+ const cleanInlineStyles = renderable => revertValues(renderable, true);
134
+
115
135
  exports.cleanInlineStyles = cleanInlineStyles;
136
+ exports.revertValues = revertValues;
116
137
  exports.sanitizePropertyName = sanitizePropertyName;
@@ -1,4 +1,5 @@
1
1
  export function sanitizePropertyName(propertyName: string, target: Target, tweenType: tweenTypes): string;
2
+ export function revertValues<T extends Renderable>(renderable: T, inlineStylesOnly?: boolean): T;
2
3
  export function cleanInlineStyles<T extends Renderable>(renderable: T): T;
3
4
  import type { Target } from '../types/index.js';
4
5
  import { tweenTypes } from './consts.js';
@@ -1,12 +1,13 @@
1
1
  /**
2
2
  * Anime.js - core - ESM
3
- * @version v4.3.6
3
+ * @version v4.4.1
4
4
  * @license MIT
5
5
  * @copyright 2026 - Julian Garnier
6
6
  */
7
7
 
8
- import { tweenTypes, shortTransforms, isDomSymbol, transformsSymbol, transformsFragmentStrings, emptyString } from './consts.js';
9
- import { forEachChildren, isSvg, toLowerCase, isNil } from './helpers.js';
8
+ import { tweenTypes, isDomSymbol, transformsSymbol, emptyString, shortTransforms } from './consts.js';
9
+ import { forEachChildren, toLowerCase, isNil, isSvg } from './helpers.js';
10
+ import { buildTransformString } from './transforms.js';
10
11
 
11
12
  /**
12
13
  * @import {
@@ -57,57 +58,76 @@ const sanitizePropertyName = (propertyName, target, tweenType) => {
57
58
  /**
58
59
  * @template {Renderable} T
59
60
  * @param {T} renderable
61
+ * @param {Boolean} [inlineStylesOnly]
60
62
  * @return {T}
61
63
  */
62
- const cleanInlineStyles = renderable => {
63
- // Allow cleanInlineStyles() to be called on timelines
64
+ const revertValues = (renderable, inlineStylesOnly = false) => {
65
+ // Allow revertValues() to be called on timelines
64
66
  if (renderable._hasChildren) {
65
- forEachChildren(renderable, cleanInlineStyles, true);
67
+ forEachChildren(renderable, (/** @type {Renderable} */child) => revertValues(child, inlineStylesOnly), true);
66
68
  } else {
67
69
  const animation = /** @type {JSAnimation} */(renderable);
68
70
  animation.pause();
69
71
  forEachChildren(animation, (/** @type {Tween} */tween) => {
70
72
  const tweenProperty = tween.property;
71
73
  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');
74
+ const tweenType = tween._tweenType;
75
+ const originalInlinedValue = tween._inlineValue;
76
+ const tweenHadNoInlineValue = isNil(originalInlinedValue) || originalInlinedValue === emptyString;
77
+ if (tweenType === tweenTypes.OBJECT) {
78
+ if (!inlineStylesOnly && !tweenHadNoInlineValue) {
79
+ tweenTarget[tweenProperty] = originalInlinedValue;
80
+ }
81
+ } else if (tweenTarget[isDomSymbol]) {
82
+ if (tweenType === tweenTypes.ATTRIBUTE) {
83
+ if (!inlineStylesOnly) {
84
+ if (tweenHadNoInlineValue) {
85
+ /** @type {DOMTarget} */(tweenTarget).removeAttribute(tweenProperty);
86
86
  } else {
87
- let str = emptyString;
88
- for (let key in cachedTransforms) {
89
- str += transformsFragmentStrings[key] + cachedTransforms[key] + ') ';
90
- }
91
- targetStyle.transform = str;
87
+ /** @type {DOMTarget} */(tweenTarget).setAttribute(tweenProperty, /** @type {String} */(originalInlinedValue));
92
88
  }
93
89
  }
94
90
  } else {
95
- if (tweenHadNoInlineValue) {
96
- targetStyle.removeProperty(toLowerCase(tweenProperty));
91
+ const targetStyle = /** @type {DOMTarget} */(tweenTarget).style;
92
+ if (tweenType === tweenTypes.TRANSFORM) {
93
+ const cachedTransforms = tweenTarget[transformsSymbol];
94
+ if (tweenHadNoInlineValue) {
95
+ delete cachedTransforms[tweenProperty];
96
+ } else {
97
+ cachedTransforms[tweenProperty] = originalInlinedValue;
98
+ }
99
+ if (tween._renderTransforms) {
100
+ if (!Object.keys(cachedTransforms).length) {
101
+ targetStyle.removeProperty('transform');
102
+ } else {
103
+ targetStyle.transform = buildTransformString(cachedTransforms);
104
+ }
105
+ }
97
106
  } else {
98
- targetStyle[tweenProperty] = originalInlinedValue;
107
+ if (tweenHadNoInlineValue) {
108
+ targetStyle.removeProperty(toLowerCase(tweenProperty));
109
+ } else {
110
+ targetStyle[tweenProperty] = originalInlinedValue;
111
+ }
99
112
  }
100
113
  }
101
- if (animation._tail === tween) {
102
- animation.targets.forEach(t => {
103
- if (t.getAttribute && t.getAttribute('style') === emptyString) {
104
- t.removeAttribute('style');
105
- } });
106
- }
114
+ }
115
+ if (tweenTarget[isDomSymbol] && animation._tail === tween) {
116
+ animation.targets.forEach(t => {
117
+ if (t.getAttribute && t.getAttribute('style') === emptyString) {
118
+ t.removeAttribute('style');
119
+ } });
107
120
  }
108
121
  });
109
122
  }
110
123
  return renderable;
111
124
  };
112
125
 
113
- export { cleanInlineStyles, sanitizePropertyName };
126
+ /**
127
+ * @template {Renderable} T
128
+ * @param {T} renderable
129
+ * @return {T}
130
+ */
131
+ const cleanInlineStyles = renderable => revertValues(renderable, true);
132
+
133
+ export { cleanInlineStyles, revertValues, sanitizePropertyName };
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Anime.js - core - CJS
3
- * @version v4.3.6
3
+ * @version v4.4.1
4
4
  * @license MIT
5
5
  * @copyright 2026 - Julian Garnier
6
6
  */
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Anime.js - core - ESM
3
- * @version v4.3.6
3
+ * @version v4.4.1
4
4
  * @license MIT
5
5
  * @copyright 2026 - Julian Garnier
6
6
  */