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.
Files changed (191) hide show
  1. package/README.md +18 -8
  2. package/{lib → dist/bundles}/anime.esm.js +6549 -6265
  3. package/dist/bundles/anime.esm.min.js +7 -0
  4. package/dist/bundles/anime.umd.js +8621 -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 +660 -0
  16. package/dist/modules/animation/animation.d.ts +47 -0
  17. package/dist/modules/animation/animation.js +657 -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 +154 -0
  31. package/dist/modules/core/consts.d.ts +59 -0
  32. package/dist/modules/core/consts.js +121 -0
  33. package/dist/modules/core/globals.cjs +77 -0
  34. package/dist/modules/core/globals.d.ts +29 -0
  35. package/dist/modules/core/globals.js +72 -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 +389 -0
  40. package/dist/modules/core/render.d.ts +4 -0
  41. package/dist/modules/core/render.js +386 -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 +215 -0
  55. package/dist/modules/core/values.d.ts +14 -0
  56. package/dist/modules/core/values.js +205 -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.cjs +64 -0
  64. package/dist/modules/easings/cubic-bezier.d.ts +2 -0
  65. package/dist/modules/easings/cubic-bezier.js +62 -0
  66. package/dist/modules/easings/eases.cjs +149 -0
  67. package/dist/modules/easings/eases.d.ts +111 -0
  68. package/dist/modules/easings/eases.js +146 -0
  69. package/dist/modules/easings/index.cjs +24 -0
  70. package/dist/modules/easings/index.d.ts +6 -0
  71. package/dist/modules/easings/index.js +13 -0
  72. package/dist/modules/easings/irregular.cjs +41 -0
  73. package/dist/modules/easings/irregular.d.ts +2 -0
  74. package/dist/modules/easings/irregular.js +39 -0
  75. package/dist/modules/easings/linear.cjs +59 -0
  76. package/dist/modules/easings/linear.d.ts +2 -0
  77. package/dist/modules/easings/linear.js +57 -0
  78. package/dist/modules/easings/none.cjs +19 -0
  79. package/dist/modules/easings/none.d.ts +8 -0
  80. package/dist/modules/easings/none.js +17 -0
  81. package/dist/modules/easings/parser.cjs +59 -0
  82. package/dist/modules/easings/parser.d.ts +21 -0
  83. package/dist/modules/easings/parser.js +55 -0
  84. package/dist/modules/easings/steps.cjs +30 -0
  85. package/dist/modules/easings/steps.d.ts +2 -0
  86. package/dist/modules/easings/steps.js +28 -0
  87. package/dist/modules/engine/engine.cjs +168 -0
  88. package/dist/modules/engine/engine.d.ts +21 -0
  89. package/dist/modules/engine/engine.js +166 -0
  90. package/dist/modules/engine/index.cjs +14 -0
  91. package/dist/modules/engine/index.d.ts +1 -0
  92. package/dist/modules/engine/index.js +8 -0
  93. package/dist/modules/events/index.cjs +16 -0
  94. package/dist/modules/events/index.d.ts +1 -0
  95. package/dist/modules/events/index.js +8 -0
  96. package/dist/modules/events/scroll.cjs +936 -0
  97. package/dist/modules/events/scroll.d.ts +189 -0
  98. package/dist/modules/events/scroll.js +932 -0
  99. package/dist/modules/index.cjs +103 -0
  100. package/dist/modules/index.d.ts +19 -0
  101. package/dist/modules/index.js +42 -0
  102. package/dist/modules/scope/index.cjs +15 -0
  103. package/dist/modules/scope/index.d.ts +1 -0
  104. package/dist/modules/scope/index.js +8 -0
  105. package/dist/modules/scope/scope.cjs +254 -0
  106. package/dist/modules/scope/scope.d.ts +115 -0
  107. package/dist/modules/scope/scope.js +251 -0
  108. package/dist/modules/spring/index.cjs +15 -0
  109. package/dist/modules/spring/index.d.ts +1 -0
  110. package/dist/modules/spring/index.js +8 -0
  111. package/dist/modules/spring/spring.cjs +133 -0
  112. package/dist/modules/spring/spring.d.ts +37 -0
  113. package/dist/modules/spring/spring.js +130 -0
  114. package/dist/modules/svg/drawable.cjs +119 -0
  115. package/dist/modules/svg/drawable.d.ts +3 -0
  116. package/dist/modules/svg/drawable.js +117 -0
  117. package/dist/modules/svg/helpers.cjs +30 -0
  118. package/dist/modules/svg/helpers.d.ts +2 -0
  119. package/dist/modules/svg/helpers.js +28 -0
  120. package/dist/modules/svg/index.cjs +18 -0
  121. package/dist/modules/svg/index.d.ts +3 -0
  122. package/dist/modules/svg/index.js +10 -0
  123. package/dist/modules/svg/morphto.cjs +58 -0
  124. package/dist/modules/svg/morphto.d.ts +3 -0
  125. package/dist/modules/svg/morphto.js +56 -0
  126. package/dist/modules/svg/motionpath.cjs +79 -0
  127. package/dist/modules/svg/motionpath.d.ts +7 -0
  128. package/dist/modules/svg/motionpath.js +77 -0
  129. package/dist/modules/text/index.cjs +16 -0
  130. package/dist/modules/text/index.d.ts +1 -0
  131. package/dist/modules/text/index.js +8 -0
  132. package/dist/modules/text/split.cjs +488 -0
  133. package/dist/modules/text/split.d.ts +62 -0
  134. package/dist/modules/text/split.js +484 -0
  135. package/dist/modules/timeline/index.cjs +15 -0
  136. package/dist/modules/timeline/index.d.ts +1 -0
  137. package/dist/modules/timeline/index.js +8 -0
  138. package/dist/modules/timeline/position.cjs +72 -0
  139. package/dist/modules/timeline/position.d.ts +3 -0
  140. package/dist/modules/timeline/position.js +70 -0
  141. package/dist/modules/timeline/timeline.cjs +312 -0
  142. package/dist/modules/timeline/timeline.d.ts +163 -0
  143. package/dist/modules/timeline/timeline.js +309 -0
  144. package/dist/modules/timer/index.cjs +15 -0
  145. package/dist/modules/timer/index.d.ts +1 -0
  146. package/dist/modules/timer/index.js +8 -0
  147. package/dist/modules/timer/timer.cjs +491 -0
  148. package/dist/modules/timer/timer.d.ts +141 -0
  149. package/dist/modules/timer/timer.js +488 -0
  150. package/dist/modules/types/index.d.ts +387 -0
  151. package/dist/modules/utils/chainable.cjs +190 -0
  152. package/dist/modules/utils/chainable.d.ts +135 -0
  153. package/dist/modules/utils/chainable.js +177 -0
  154. package/dist/modules/utils/index.cjs +43 -0
  155. package/dist/modules/utils/index.d.ts +5 -0
  156. package/dist/modules/utils/index.js +14 -0
  157. package/dist/modules/utils/number.cjs +97 -0
  158. package/dist/modules/utils/number.d.ts +9 -0
  159. package/dist/modules/utils/number.js +85 -0
  160. package/dist/modules/utils/random.cjs +77 -0
  161. package/dist/modules/utils/random.d.ts +22 -0
  162. package/dist/modules/utils/random.js +72 -0
  163. package/dist/modules/utils/stagger.cjs +122 -0
  164. package/dist/modules/utils/stagger.d.ts +30 -0
  165. package/dist/modules/utils/stagger.js +120 -0
  166. package/dist/modules/utils/target.cjs +130 -0
  167. package/dist/modules/utils/target.d.ts +126 -0
  168. package/dist/modules/utils/target.js +125 -0
  169. package/dist/modules/utils/time.cjs +57 -0
  170. package/dist/modules/utils/time.d.ts +5 -0
  171. package/dist/modules/utils/time.js +54 -0
  172. package/dist/modules/waapi/composition.cjs +89 -0
  173. package/dist/modules/waapi/composition.d.ts +4 -0
  174. package/dist/modules/waapi/composition.js +86 -0
  175. package/dist/modules/waapi/index.cjs +15 -0
  176. package/dist/modules/waapi/index.d.ts +1 -0
  177. package/dist/modules/waapi/index.js +8 -0
  178. package/dist/modules/waapi/waapi.cjs +473 -0
  179. package/dist/modules/waapi/waapi.d.ts +114 -0
  180. package/dist/modules/waapi/waapi.js +470 -0
  181. package/package.json +130 -33
  182. package/lib/anime.cjs +0 -9
  183. package/lib/anime.esm.min.js +0 -9
  184. package/lib/anime.iife.js +0 -9
  185. package/lib/anime.iife.min.js +0 -9
  186. package/lib/anime.min.cjs +0 -9
  187. package/lib/anime.umd.js +0 -9
  188. package/lib/anime.umd.min.js +0 -9
  189. package/lib/gui/index.js +0 -6341
  190. package/types/index.d.ts +0 -1081
  191. package/types/index.js +0 -7407
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Anime.js - timeline - ESM
3
+ * @version v4.2.0
4
+ * @license MIT
5
+ * @copyright 2025 - Julian Garnier
6
+ */
7
+
8
+ import { globals } from '../core/globals.js';
9
+ import { minValue, compositionTypes, tickModes } from '../core/consts.js';
10
+ import { mergeObjects, isObj, isFnc, isUnd, isStr, normalizeTime, forEachChildren, isNum, addChild, clampInfinity } from '../core/helpers.js';
11
+ import { setValue } from '../core/values.js';
12
+ import { parseTargets } from '../core/targets.js';
13
+ import { tick } from '../core/render.js';
14
+ import { cleanInlineStyles } from '../core/styles.js';
15
+ import { removeTargetsFromRenderable } from '../animation/composition.js';
16
+ import { JSAnimation } from '../animation/animation.js';
17
+ import { Timer } from '../timer/timer.js';
18
+ import { parseEase } from '../easings/eases.js';
19
+ import { parseTimelinePosition } from './position.js';
20
+
21
+ /**
22
+ * @import {
23
+ * TargetsParam,
24
+ * Callback,
25
+ * Tickable,
26
+ * TimerParams,
27
+ * AnimationParams,
28
+ * Target,
29
+ * Renderable,
30
+ * TimelineParams,
31
+ * DefaultsParams,
32
+ * TimelinePosition,
33
+ * StaggerFunction,
34
+ * } from '../types/index.js'
35
+ */
36
+
37
+ /**
38
+ * @import {
39
+ * WAAPIAnimation,
40
+ * } from '../waapi/waapi.js'
41
+ */
42
+
43
+ /**
44
+ * @param {Timeline} tl
45
+ * @return {Number}
46
+ */
47
+ function getTimelineTotalDuration(tl) {
48
+ return clampInfinity(((tl.iterationDuration + tl._loopDelay) * tl.iterationCount) - tl._loopDelay) || minValue;
49
+ }
50
+
51
+ /**
52
+ * @overload
53
+ * @param {TimerParams} childParams
54
+ * @param {Timeline} tl
55
+ * @param {Number} timePosition
56
+ * @return {Timeline}
57
+ *
58
+ * @overload
59
+ * @param {AnimationParams} childParams
60
+ * @param {Timeline} tl
61
+ * @param {Number} timePosition
62
+ * @param {TargetsParam} targets
63
+ * @param {Number} [index]
64
+ * @param {Number} [length]
65
+ * @return {Timeline}
66
+ *
67
+ * @param {TimerParams|AnimationParams} childParams
68
+ * @param {Timeline} tl
69
+ * @param {Number} timePosition
70
+ * @param {TargetsParam} [targets]
71
+ * @param {Number} [index]
72
+ * @param {Number} [length]
73
+ */
74
+ function addTlChild(childParams, tl, timePosition, targets, index, length) {
75
+ const isSetter = isNum(childParams.duration) && /** @type {Number} */(childParams.duration) <= minValue;
76
+ // Offset the tl position with -minValue for 0 duration animations or .set() calls in order to align their end value with the defined position
77
+ const adjustedPosition = isSetter ? timePosition - minValue : timePosition;
78
+ tick(tl, adjustedPosition, 1, 1, tickModes.AUTO);
79
+ const tlChild = targets ?
80
+ new JSAnimation(targets,/** @type {AnimationParams} */(childParams), tl, adjustedPosition, false, index, length) :
81
+ new Timer(/** @type {TimerParams} */(childParams), tl, adjustedPosition);
82
+ tlChild.init(1);
83
+ // TODO: Might be better to insert at a position relative to startTime?
84
+ addChild(tl, tlChild);
85
+ forEachChildren(tl, (/** @type {Renderable} */child) => {
86
+ const childTLOffset = child._offset + child._delay;
87
+ const childDur = childTLOffset + child.duration;
88
+ if (childDur > tl.iterationDuration) tl.iterationDuration = childDur;
89
+ });
90
+ tl.duration = getTimelineTotalDuration(tl);
91
+ return tl;
92
+ }
93
+
94
+ class Timeline extends Timer {
95
+
96
+ /**
97
+ * @param {TimelineParams} [parameters]
98
+ */
99
+ constructor(parameters = {}) {
100
+ super(/** @type {TimerParams&TimelineParams} */(parameters), null, 0);
101
+ /** @type {Number} */
102
+ this.duration = 0; // TL duration starts at 0 and grows when adding children
103
+ /** @type {Record<String, Number>} */
104
+ this.labels = {};
105
+ const defaultsParams = parameters.defaults;
106
+ const globalDefaults = globals.defaults;
107
+ /** @type {DefaultsParams} */
108
+ this.defaults = defaultsParams ? mergeObjects(defaultsParams, globalDefaults) : globalDefaults;
109
+ /** @type {Callback<this>} */
110
+ this.onRender = parameters.onRender || globalDefaults.onRender;
111
+ const tlPlaybackEase = setValue(parameters.playbackEase, globalDefaults.playbackEase);
112
+ this._ease = tlPlaybackEase ? parseEase(tlPlaybackEase) : null;
113
+ /** @type {Number} */
114
+ this.iterationDuration = 0;
115
+ }
116
+
117
+ /**
118
+ * @overload
119
+ * @param {TargetsParam} a1
120
+ * @param {AnimationParams} a2
121
+ * @param {TimelinePosition|StaggerFunction<Number|String>} [a3]
122
+ * @return {this}
123
+ *
124
+ * @overload
125
+ * @param {TimerParams} a1
126
+ * @param {TimelinePosition} [a2]
127
+ * @return {this}
128
+ *
129
+ * @param {TargetsParam|TimerParams} a1
130
+ * @param {TimelinePosition|AnimationParams} a2
131
+ * @param {TimelinePosition|StaggerFunction<Number|String>} [a3]
132
+ */
133
+ add(a1, a2, a3) {
134
+ const isAnim = isObj(a2);
135
+ const isTimer = isObj(a1);
136
+ if (isAnim || isTimer) {
137
+ this._hasChildren = true;
138
+ if (isAnim) {
139
+ const childParams = /** @type {AnimationParams} */(a2);
140
+ // Check for function for children stagger positions
141
+ if (isFnc(a3)) {
142
+ const staggeredPosition = a3;
143
+ const parsedTargetsArray = parseTargets(/** @type {TargetsParam} */(a1));
144
+ // Store initial duration before adding new children that will change the duration
145
+ const tlDuration = this.duration;
146
+ // Store initial _iterationDuration before adding new children that will change the duration
147
+ const tlIterationDuration = this.iterationDuration;
148
+ // Store the original id in order to add specific indexes to the new animations ids
149
+ const id = childParams.id;
150
+ let i = 0;
151
+ /** @type {Number} */
152
+ const parsedLength = (parsedTargetsArray.length);
153
+ parsedTargetsArray.forEach((/** @type {Target} */target) => {
154
+ // Create a new parameter object for each staggered children
155
+ const staggeredChildParams = { ...childParams };
156
+ // Reset the duration of the timeline iteration before each stagger to prevent wrong start value calculation
157
+ this.duration = tlDuration;
158
+ this.iterationDuration = tlIterationDuration;
159
+ if (!isUnd(id)) staggeredChildParams.id = id + '-' + i;
160
+ addTlChild(
161
+ staggeredChildParams,
162
+ this,
163
+ parseTimelinePosition(this, staggeredPosition(target, i, parsedLength, this)),
164
+ target,
165
+ i,
166
+ parsedLength
167
+ );
168
+ i++;
169
+ });
170
+ } else {
171
+ addTlChild(
172
+ childParams,
173
+ this,
174
+ parseTimelinePosition(this, a3),
175
+ /** @type {TargetsParam} */(a1),
176
+ );
177
+ }
178
+ } else {
179
+ // It's a Timer
180
+ addTlChild(
181
+ /** @type TimerParams */(a1),
182
+ this,
183
+ parseTimelinePosition(this,a2),
184
+ );
185
+ }
186
+ return this.init(1); // 1 = internalRender
187
+ }
188
+ }
189
+
190
+ /**
191
+ * @overload
192
+ * @param {Tickable} [synced]
193
+ * @param {TimelinePosition} [position]
194
+ * @return {this}
195
+ *
196
+ * @overload
197
+ * @param {globalThis.Animation} [synced]
198
+ * @param {TimelinePosition} [position]
199
+ * @return {this}
200
+ *
201
+ * @overload
202
+ * @param {WAAPIAnimation} [synced]
203
+ * @param {TimelinePosition} [position]
204
+ * @return {this}
205
+ *
206
+ * @param {Tickable|WAAPIAnimation|globalThis.Animation} [synced]
207
+ * @param {TimelinePosition} [position]
208
+ */
209
+ sync(synced, position) {
210
+ if (isUnd(synced) || synced && isUnd(synced.pause)) return this;
211
+ synced.pause();
212
+ const duration = +(/** @type {globalThis.Animation} */(synced).effect ? /** @type {globalThis.Animation} */(synced).effect.getTiming().duration : /** @type {Tickable} */(synced).duration);
213
+ return this.add(synced, { currentTime: [0, duration], duration, ease: 'linear' }, position);
214
+ }
215
+
216
+ /**
217
+ * @param {TargetsParam} targets
218
+ * @param {AnimationParams} parameters
219
+ * @param {TimelinePosition} [position]
220
+ * @return {this}
221
+ */
222
+ set(targets, parameters, position) {
223
+ if (isUnd(parameters)) return this;
224
+ parameters.duration = minValue;
225
+ parameters.composition = compositionTypes.replace;
226
+ return this.add(targets, parameters, position);
227
+ }
228
+
229
+ /**
230
+ * @param {Callback<Timer>} callback
231
+ * @param {TimelinePosition} [position]
232
+ * @return {this}
233
+ */
234
+ call(callback, position) {
235
+ if (isUnd(callback) || callback && !isFnc(callback)) return this;
236
+ return this.add({ duration: 0, onComplete: () => callback(this) }, position);
237
+ }
238
+
239
+ /**
240
+ * @param {String} labelName
241
+ * @param {TimelinePosition} [position]
242
+ * @return {this}
243
+ *
244
+ */
245
+ label(labelName, position) {
246
+ if (isUnd(labelName) || labelName && !isStr(labelName)) return this;
247
+ this.labels[labelName] = parseTimelinePosition(this, position);
248
+ return this;
249
+ }
250
+
251
+ /**
252
+ * @param {TargetsParam} targets
253
+ * @param {String} [propertyName]
254
+ * @return {this}
255
+ */
256
+ remove(targets, propertyName) {
257
+ removeTargetsFromRenderable(parseTargets(targets), this, propertyName);
258
+ return this;
259
+ }
260
+
261
+ /**
262
+ * @param {Number} newDuration
263
+ * @return {this}
264
+ */
265
+ stretch(newDuration) {
266
+ const currentDuration = this.duration;
267
+ if (currentDuration === normalizeTime(newDuration)) return this;
268
+ const timeScale = newDuration / currentDuration;
269
+ const labels = this.labels;
270
+ forEachChildren(this, (/** @type {JSAnimation} */child) => child.stretch(child.duration * timeScale));
271
+ for (let labelName in labels) labels[labelName] *= timeScale;
272
+ return super.stretch(newDuration);
273
+ }
274
+
275
+ /**
276
+ * @return {this}
277
+ */
278
+ refresh() {
279
+ forEachChildren(this, (/** @type {JSAnimation} */child) => {
280
+ if (child.refresh) child.refresh();
281
+ });
282
+ return this;
283
+ }
284
+
285
+ /**
286
+ * @return {this}
287
+ */
288
+ revert() {
289
+ super.revert();
290
+ forEachChildren(this, (/** @type {JSAnimation} */child) => child.revert, true);
291
+ return cleanInlineStyles(this);
292
+ }
293
+
294
+ /**
295
+ * @param {Callback<this>} [callback]
296
+ * @return {Promise}
297
+ */
298
+ then(callback) {
299
+ return super.then(callback);
300
+ }
301
+ }
302
+
303
+ /**
304
+ * @param {TimelineParams} [parameters]
305
+ * @return {Timeline}
306
+ */
307
+ const createTimeline = parameters => new Timeline(parameters).init();
308
+
309
+ export { Timeline, createTimeline };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Anime.js - timer - CJS
3
+ * @version v4.2.0
4
+ * @license MIT
5
+ * @copyright 2025 - Julian Garnier
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ var timer = require('./timer.cjs');
11
+
12
+
13
+
14
+ exports.Timer = timer.Timer;
15
+ exports.createTimer = timer.createTimer;
@@ -0,0 +1 @@
1
+ export * from "./timer.js";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Anime.js - timer - ESM
3
+ * @version v4.2.0
4
+ * @license MIT
5
+ * @copyright 2025 - Julian Garnier
6
+ */
7
+
8
+ export { Timer, createTimer } from './timer.js';