@studiometa/js-toolkit 2.10.3 → 2.12.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 (275) hide show
  1. package/Base/Base.cjs +155 -60
  2. package/Base/Base.cjs.map +2 -2
  3. package/Base/Base.d.ts +1 -1
  4. package/Base/Base.js +138 -38
  5. package/Base/Base.js.map +2 -2
  6. package/Base/managers/AbstractManager.cjs +21 -0
  7. package/Base/managers/AbstractManager.cjs.map +2 -2
  8. package/Base/managers/AbstractManager.d.ts +1 -0
  9. package/Base/managers/AbstractManager.js +21 -0
  10. package/Base/managers/AbstractManager.js.map +2 -2
  11. package/Base/managers/ChildrenManager.cjs +41 -8
  12. package/Base/managers/ChildrenManager.cjs.map +3 -3
  13. package/Base/managers/ChildrenManager.js +41 -8
  14. package/Base/managers/ChildrenManager.js.map +2 -2
  15. package/Base/managers/EventsManager.cjs +94 -9
  16. package/Base/managers/EventsManager.cjs.map +2 -2
  17. package/Base/managers/EventsManager.d.ts +1 -0
  18. package/Base/managers/EventsManager.js +90 -9
  19. package/Base/managers/EventsManager.js.map +2 -2
  20. package/Base/managers/OptionsManager.cjs +29 -2
  21. package/Base/managers/OptionsManager.cjs.map +2 -2
  22. package/Base/managers/OptionsManager.d.ts +1 -0
  23. package/Base/managers/OptionsManager.js +25 -2
  24. package/Base/managers/OptionsManager.js.map +2 -2
  25. package/Base/managers/RefsManager.cjs +32 -5
  26. package/Base/managers/RefsManager.cjs.map +2 -2
  27. package/Base/managers/RefsManager.d.ts +1 -1
  28. package/Base/managers/RefsManager.js +40 -6
  29. package/Base/managers/RefsManager.js.map +2 -2
  30. package/Base/managers/ResponsiveOptionsManager.cjs +22 -6
  31. package/Base/managers/ResponsiveOptionsManager.cjs.map +2 -2
  32. package/Base/managers/ResponsiveOptionsManager.js +22 -6
  33. package/Base/managers/ResponsiveOptionsManager.js.map +2 -2
  34. package/Base/managers/ServicesManager.cjs +54 -4
  35. package/Base/managers/ServicesManager.cjs.map +2 -2
  36. package/Base/managers/ServicesManager.js +54 -4
  37. package/Base/managers/ServicesManager.js.map +2 -2
  38. package/Base/utils.cjs +4 -0
  39. package/Base/utils.cjs.map +2 -2
  40. package/Base/utils.d.ts +1 -0
  41. package/Base/utils.js +4 -0
  42. package/Base/utils.js.map +2 -2
  43. package/decorators/index.cjs +3 -2
  44. package/decorators/index.cjs.map +2 -2
  45. package/decorators/index.d.ts +3 -2
  46. package/decorators/index.js +3 -2
  47. package/decorators/index.js.map +2 -2
  48. package/decorators/withBreakpointManager.cjs +14 -4
  49. package/decorators/withBreakpointManager.cjs.map +2 -2
  50. package/decorators/withBreakpointManager.js +14 -4
  51. package/decorators/withBreakpointManager.js.map +2 -2
  52. package/decorators/withBreakpointObserver.cjs +11 -1
  53. package/decorators/withBreakpointObserver.cjs.map +2 -2
  54. package/decorators/withBreakpointObserver.js +12 -2
  55. package/decorators/withBreakpointObserver.js.map +2 -2
  56. package/decorators/withDrag.cjs +6 -0
  57. package/decorators/withDrag.cjs.map +1 -1
  58. package/decorators/withDrag.js +6 -0
  59. package/decorators/withDrag.js.map +1 -1
  60. package/decorators/withExtraConfig.cjs +7 -0
  61. package/decorators/withExtraConfig.cjs.map +1 -1
  62. package/decorators/withExtraConfig.js +3 -0
  63. package/decorators/withExtraConfig.js.map +1 -1
  64. package/decorators/withFreezedOptions.cjs +8 -0
  65. package/decorators/withFreezedOptions.cjs.map +2 -2
  66. package/decorators/withFreezedOptions.js +8 -0
  67. package/decorators/withFreezedOptions.js.map +2 -2
  68. package/decorators/withIntersectionObserver.cjs +10 -1
  69. package/decorators/withIntersectionObserver.cjs.map +2 -2
  70. package/decorators/withIntersectionObserver.js +10 -1
  71. package/decorators/withIntersectionObserver.js.map +2 -2
  72. package/decorators/withMountOnMediaQuery.cjs +16 -0
  73. package/decorators/withMountOnMediaQuery.cjs.map +2 -2
  74. package/decorators/withMountOnMediaQuery.js +16 -0
  75. package/decorators/withMountOnMediaQuery.js.map +2 -2
  76. package/decorators/withMountWhenInView.cjs +21 -0
  77. package/decorators/withMountWhenInView.cjs.map +2 -2
  78. package/decorators/withMountWhenInView.js +21 -0
  79. package/decorators/withMountWhenInView.js.map +2 -2
  80. package/decorators/withRelativePointer.cjs +56 -0
  81. package/decorators/withRelativePointer.cjs.map +7 -0
  82. package/decorators/withRelativePointer.d.ts +13 -0
  83. package/decorators/withRelativePointer.js +34 -0
  84. package/decorators/withRelativePointer.js.map +7 -0
  85. package/decorators/withResponsiveOptions.cjs +3 -0
  86. package/decorators/withResponsiveOptions.cjs.map +1 -1
  87. package/decorators/withResponsiveOptions.js +3 -0
  88. package/decorators/withResponsiveOptions.js.map +1 -1
  89. package/decorators/withScrolledInView/utils.cjs +6 -6
  90. package/decorators/withScrolledInView/utils.cjs.map +2 -2
  91. package/decorators/withScrolledInView/utils.js +7 -7
  92. package/decorators/withScrolledInView/utils.js.map +2 -2
  93. package/decorators/withScrolledInView/withScrolledInView.cjs +33 -0
  94. package/decorators/withScrolledInView/withScrolledInView.cjs.map +2 -2
  95. package/decorators/withScrolledInView/withScrolledInView.js +33 -0
  96. package/decorators/withScrolledInView/withScrolledInView.js.map +2 -2
  97. package/decorators/withVue2.cjs +3 -0
  98. package/decorators/withVue2.cjs.map +1 -1
  99. package/decorators/withVue2.js +3 -0
  100. package/decorators/withVue2.js.map +1 -1
  101. package/helpers/createApp.cjs +2 -2
  102. package/helpers/createApp.cjs.map +2 -2
  103. package/helpers/createApp.js +2 -2
  104. package/helpers/createApp.js.map +2 -2
  105. package/helpers/getClosestParent.cjs +4 -0
  106. package/helpers/getClosestParent.cjs.map +1 -1
  107. package/helpers/getDirectChildren.cjs.map +1 -1
  108. package/helpers/getDirectChildren.js.map +1 -1
  109. package/helpers/importOnInteraction.cjs +4 -4
  110. package/helpers/importOnInteraction.cjs.map +2 -2
  111. package/helpers/importOnInteraction.js +4 -4
  112. package/helpers/importOnInteraction.js.map +2 -2
  113. package/helpers/importWhenPrefersMotion.cjs +4 -0
  114. package/helpers/importWhenPrefersMotion.cjs.map +1 -1
  115. package/helpers/importWhenVisible.cjs +2 -1
  116. package/helpers/importWhenVisible.cjs.map +2 -2
  117. package/helpers/importWhenVisible.js +2 -1
  118. package/helpers/importWhenVisible.js.map +2 -2
  119. package/helpers/index.cjs +4 -0
  120. package/helpers/index.cjs.map +1 -1
  121. package/package.json +5 -2
  122. package/services/drag.cjs +12 -8
  123. package/services/drag.cjs.map +2 -2
  124. package/services/drag.js +8 -8
  125. package/services/drag.js.map +2 -2
  126. package/services/index.cjs +4 -0
  127. package/services/index.cjs.map +1 -1
  128. package/services/key.cjs +6 -2
  129. package/services/key.cjs.map +2 -2
  130. package/services/key.js +2 -2
  131. package/services/key.js.map +2 -2
  132. package/services/load.cjs +3 -0
  133. package/services/load.cjs.map +2 -2
  134. package/services/load.js +3 -0
  135. package/services/load.js.map +2 -2
  136. package/services/pointer.cjs +33 -20
  137. package/services/pointer.cjs.map +3 -3
  138. package/services/pointer.d.ts +1 -3
  139. package/services/pointer.js +33 -20
  140. package/services/pointer.js.map +3 -3
  141. package/services/raf.cjs +2 -2
  142. package/services/raf.cjs.map +2 -2
  143. package/services/raf.js +2 -2
  144. package/services/raf.js.map +2 -2
  145. package/services/resize.cjs +4 -0
  146. package/services/resize.cjs.map +1 -1
  147. package/services/scroll.cjs +4 -0
  148. package/services/scroll.cjs.map +1 -1
  149. package/services/service.cjs +2 -2
  150. package/services/service.cjs.map +2 -2
  151. package/services/service.js +2 -2
  152. package/services/service.js.map +2 -2
  153. package/utils/Queue.cjs +30 -0
  154. package/utils/Queue.cjs.map +1 -1
  155. package/utils/Queue.js +30 -0
  156. package/utils/Queue.js.map +1 -1
  157. package/utils/SmartQueue.cjs +16 -0
  158. package/utils/SmartQueue.cjs.map +2 -2
  159. package/utils/SmartQueue.js +12 -0
  160. package/utils/SmartQueue.js.map +2 -2
  161. package/utils/collide/collidePointRect.cjs +4 -1
  162. package/utils/collide/collidePointRect.cjs.map +1 -1
  163. package/utils/collide/collidePointRect.js +4 -1
  164. package/utils/collide/collidePointRect.js.map +1 -1
  165. package/utils/collide/collideRectRect.cjs +4 -1
  166. package/utils/collide/collideRectRect.cjs.map +1 -1
  167. package/utils/collide/collideRectRect.js +4 -1
  168. package/utils/collide/collideRectRect.js.map +1 -1
  169. package/utils/collide/index.cjs +4 -0
  170. package/utils/collide/index.cjs.map +1 -1
  171. package/utils/css/animate.cjs +21 -12
  172. package/utils/css/animate.cjs.map +2 -2
  173. package/utils/css/animate.js +17 -12
  174. package/utils/css/animate.js.map +2 -2
  175. package/utils/css/classes.cjs +2 -3
  176. package/utils/css/classes.cjs.map +2 -2
  177. package/utils/css/classes.js +2 -3
  178. package/utils/css/classes.js.map +2 -2
  179. package/utils/css/index.cjs +4 -0
  180. package/utils/css/index.cjs.map +1 -1
  181. package/utils/css/matrix.cjs.map +1 -1
  182. package/utils/css/matrix.js.map +1 -1
  183. package/utils/css/styles.cjs +2 -2
  184. package/utils/css/styles.cjs.map +2 -2
  185. package/utils/css/styles.js +2 -2
  186. package/utils/css/styles.js.map +2 -2
  187. package/utils/css/transform.cjs.map +1 -1
  188. package/utils/css/transform.js.map +1 -1
  189. package/utils/css/transition.cjs +19 -0
  190. package/utils/css/transition.cjs.map +2 -2
  191. package/utils/css/transition.js +15 -0
  192. package/utils/css/transition.js.map +2 -2
  193. package/utils/focusTrap.cjs +4 -0
  194. package/utils/focusTrap.cjs.map +2 -2
  195. package/utils/focusTrap.d.ts +1 -0
  196. package/utils/focusTrap.js.map +2 -2
  197. package/utils/history.cjs +6 -5
  198. package/utils/history.cjs.map +2 -2
  199. package/utils/history.js +6 -5
  200. package/utils/history.js.map +2 -2
  201. package/utils/index.cjs +4 -0
  202. package/utils/index.cjs.map +1 -1
  203. package/utils/math/clamp.cjs.map +2 -2
  204. package/utils/math/clamp.d.ts +1 -0
  205. package/utils/math/clamp.js.map +2 -2
  206. package/utils/math/clamp01.cjs +4 -0
  207. package/utils/math/clamp01.cjs.map +2 -2
  208. package/utils/math/clamp01.d.ts +1 -0
  209. package/utils/math/clamp01.js.map +2 -2
  210. package/utils/math/index.cjs +4 -0
  211. package/utils/math/index.cjs.map +1 -1
  212. package/utils/math/inertiaFinalValue.cjs +4 -0
  213. package/utils/math/inertiaFinalValue.cjs.map +1 -1
  214. package/utils/nextFrame.cjs.map +2 -2
  215. package/utils/nextFrame.d.ts +1 -0
  216. package/utils/nextFrame.js.map +2 -2
  217. package/utils/noop.cjs.map +2 -2
  218. package/utils/noop.d.ts +1 -0
  219. package/utils/noop.js.map +2 -2
  220. package/utils/object/autoBind.cjs +11 -5
  221. package/utils/object/autoBind.cjs.map +2 -2
  222. package/utils/object/autoBind.js +7 -5
  223. package/utils/object/autoBind.js.map +2 -2
  224. package/utils/object/index.cjs +4 -0
  225. package/utils/object/index.cjs.map +1 -1
  226. package/utils/scheduler.cjs +4 -4
  227. package/utils/scheduler.cjs.map +2 -2
  228. package/utils/scheduler.js +4 -4
  229. package/utils/scheduler.js.map +2 -2
  230. package/utils/scrollTo.cjs +4 -0
  231. package/utils/scrollTo.cjs.map +2 -2
  232. package/utils/scrollTo.d.ts +1 -0
  233. package/utils/scrollTo.js.map +2 -2
  234. package/utils/string/endsWith.cjs +35 -0
  235. package/utils/string/endsWith.cjs.map +7 -0
  236. package/utils/string/endsWith.d.ts +8 -0
  237. package/utils/string/endsWith.js +13 -0
  238. package/utils/string/endsWith.js.map +7 -0
  239. package/utils/string/index.cjs +7 -0
  240. package/utils/string/index.cjs.map +2 -2
  241. package/utils/string/index.d.ts +2 -0
  242. package/utils/string/index.js +2 -0
  243. package/utils/string/index.js.map +2 -2
  244. package/utils/string/startsWith.cjs +35 -0
  245. package/utils/string/startsWith.cjs.map +7 -0
  246. package/utils/string/startsWith.d.ts +8 -0
  247. package/utils/string/startsWith.js +13 -0
  248. package/utils/string/startsWith.js.map +7 -0
  249. package/utils/string/withLeadingCharacters.cjs +4 -0
  250. package/utils/string/withLeadingCharacters.cjs.map +1 -1
  251. package/utils/string/withLeadingCharacters.js.map +1 -1
  252. package/utils/string/withLeadingSlash.cjs +4 -0
  253. package/utils/string/withLeadingSlash.cjs.map +1 -1
  254. package/utils/string/withTrailingCharacters.cjs +4 -0
  255. package/utils/string/withTrailingCharacters.cjs.map +1 -1
  256. package/utils/string/withTrailingCharacters.js.map +1 -1
  257. package/utils/string/withTrailingSlash.cjs +4 -0
  258. package/utils/string/withTrailingSlash.cjs.map +1 -1
  259. package/utils/string/withoutLeadingCharacters.cjs.map +1 -1
  260. package/utils/string/withoutLeadingCharacters.js.map +1 -1
  261. package/utils/string/withoutLeadingCharactersRecursive.cjs +4 -0
  262. package/utils/string/withoutLeadingCharactersRecursive.cjs.map +1 -1
  263. package/utils/string/withoutLeadingCharactersRecursive.js.map +1 -1
  264. package/utils/string/withoutLeadingSlash.cjs +4 -0
  265. package/utils/string/withoutLeadingSlash.cjs.map +1 -1
  266. package/utils/string/withoutTrailingCharacters.cjs.map +1 -1
  267. package/utils/string/withoutTrailingCharacters.js.map +1 -1
  268. package/utils/string/withoutTrailingCharactersRecursive.cjs +4 -0
  269. package/utils/string/withoutTrailingCharactersRecursive.cjs.map +1 -1
  270. package/utils/string/withoutTrailingCharactersRecursive.js.map +1 -1
  271. package/utils/string/withoutTrailingSlash.cjs +4 -0
  272. package/utils/string/withoutTrailingSlash.cjs.map +1 -1
  273. package/utils/tween.cjs +4 -0
  274. package/utils/tween.cjs.map +1 -1
  275. package/utils/tween.js.map +1 -1
package/utils/Queue.cjs CHANGED
@@ -23,14 +23,35 @@ __export(Queue_exports, {
23
23
  });
24
24
  module.exports = __toCommonJS(Queue_exports);
25
25
  var Queue = class {
26
+ /**
27
+ * List of tasks.
28
+ */
26
29
  tasks = [];
30
+ /**
31
+ * Number of tasks running in a single batch.
32
+ */
27
33
  concurrency = 10;
34
+ /**
35
+ * A function to schedule the next batch.
36
+ */
28
37
  waiter;
38
+ /**
39
+ * Is schedule running?
40
+ */
29
41
  isScheduled = false;
42
+ /**
43
+ * Constructor.
44
+ *
45
+ * @param {number} concurrency Number of tasks running in a single batch.
46
+ * @param {(cb: (...args:unknown[]) => unknown) => unknown} waiter Scheduler for the next batch execution.
47
+ */
30
48
  constructor(concurrency, waiter = (cb) => cb()) {
31
49
  this.concurrency = concurrency;
32
50
  this.waiter = waiter;
33
51
  }
52
+ /**
53
+ * Add a task to the queue.
54
+ */
34
55
  add(task) {
35
56
  const p = new Promise((resolve) => {
36
57
  this.tasks.push(() => resolve(task()));
@@ -38,6 +59,9 @@ var Queue = class {
38
59
  this.scheduleFlush();
39
60
  return p;
40
61
  }
62
+ /**
63
+ * Schedule next flush.
64
+ */
41
65
  scheduleFlush() {
42
66
  if (this.isScheduled) {
43
67
  return;
@@ -45,6 +69,9 @@ var Queue = class {
45
69
  this.isScheduled = true;
46
70
  this.waiter(() => this.flush());
47
71
  }
72
+ /**
73
+ * Flush current batch.
74
+ */
48
75
  flush() {
49
76
  this.run(this.tasks.splice(0, this.concurrency));
50
77
  this.isScheduled = false;
@@ -52,6 +79,9 @@ var Queue = class {
52
79
  this.scheduleFlush();
53
80
  }
54
81
  }
82
+ /**
83
+ * Run the queue.
84
+ */
55
85
  run(tasks) {
56
86
  let task;
57
87
  while (task = tasks.shift()) {
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/Queue.ts"],
4
4
  "sourcesContent": ["/**\n * Manage tasks in a queue.\n */\nexport class Queue {\n /**\n * List of tasks.\n */\n tasks: Array<(...args: unknown[]) => unknown> = [];\n\n /**\n * Number of tasks running in a single batch.\n */\n concurrency = 10;\n\n /**\n * A function to schedule the next batch.\n */\n waiter: (cb: (...args: unknown[]) => unknown) => unknown;\n\n /**\n * Is schedule running?\n */\n isScheduled = false;\n\n /**\n * Constructor.\n *\n * @param {number} concurrency Number of tasks running in a single batch.\n * @param {(cb: (...args:unknown[]) => unknown) => unknown} waiter Scheduler for the next batch execution.\n */\n constructor(\n concurrency: number,\n waiter: (cb: (...args: unknown[]) => unknown) => unknown = (cb) => cb(),\n ) {\n this.concurrency = concurrency;\n this.waiter = waiter;\n }\n\n /**\n * Add a task to the queue.\n */\n add(task: () => unknown) {\n const p = new Promise((resolve) => {\n this.tasks.push(() => resolve(task()));\n });\n this.scheduleFlush();\n return p;\n }\n\n /**\n * Schedule next flush.\n */\n scheduleFlush() {\n if (this.isScheduled) {\n return;\n }\n\n this.isScheduled = true;\n this.waiter(() => this.flush());\n }\n\n /**\n * Flush current batch.\n */\n flush() {\n this.run(this.tasks.splice(0, this.concurrency));\n this.isScheduled = false;\n\n if (this.tasks.length > 0) {\n this.scheduleFlush();\n }\n }\n\n /**\n * Run the queue.\n */\n run(tasks: Array<(...args: unknown[]) => unknown>) {\n let task;\n // eslint-disable-next-line no-cond-assign\n while ((task = tasks.shift())) {\n task();\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,IAAM,QAAN,MAAY;AAAA,EAIjB,QAAgD,CAAC;AAAA,EAKjD,cAAc;AAAA,EAKd;AAAA,EAKA,cAAc;AAAA,EAQd,YACE,aACA,SAA2D,CAAC,OAAO,GAAG,GACtE;AACA,SAAK,cAAc;AACnB,SAAK,SAAS;AAAA,EAChB;AAAA,EAKA,IAAI,MAAqB;AACvB,UAAM,IAAI,IAAI,QAAQ,CAAC,YAAY;AACjC,WAAK,MAAM,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,IACvC,CAAC;AACD,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAKA,gBAAgB;AACd,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,SAAK,cAAc;AACnB,SAAK,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,EAChC;AAAA,EAKA,QAAQ;AACN,SAAK,IAAI,KAAK,MAAM,OAAO,GAAG,KAAK,WAAW,CAAC;AAC/C,SAAK,cAAc;AAEnB,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAKA,IAAI,OAA+C;AACjD,QAAI;AAEJ,WAAQ,OAAO,MAAM,MAAM,GAAI;AAC7B,WAAK;AAAA,IACP;AAAA,EACF;AACF;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,IAAM,QAAN,MAAY;AAAA;AAAA;AAAA;AAAA,EAIjB,QAAgD,CAAC;AAAA;AAAA;AAAA;AAAA,EAKjD,cAAc;AAAA;AAAA;AAAA;AAAA,EAKd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQd,YACE,aACA,SAA2D,CAAC,OAAO,GAAG,GACtE;AACA,SAAK,cAAc;AACnB,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAqB;AACvB,UAAM,IAAI,IAAI,QAAQ,CAAC,YAAY;AACjC,WAAK,MAAM,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,IACvC,CAAC;AACD,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AACd,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,SAAK,cAAc;AACnB,SAAK,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACN,SAAK,IAAI,KAAK,MAAM,OAAO,GAAG,KAAK,WAAW,CAAC;AAC/C,SAAK,cAAc;AAEnB,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA+C;AACjD,QAAI;AAEJ,WAAQ,OAAO,MAAM,MAAM,GAAI;AAC7B,WAAK;AAAA,IACP;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
package/utils/Queue.js CHANGED
@@ -1,12 +1,33 @@
1
1
  class Queue {
2
+ /**
3
+ * List of tasks.
4
+ */
2
5
  tasks = [];
6
+ /**
7
+ * Number of tasks running in a single batch.
8
+ */
3
9
  concurrency = 10;
10
+ /**
11
+ * A function to schedule the next batch.
12
+ */
4
13
  waiter;
14
+ /**
15
+ * Is schedule running?
16
+ */
5
17
  isScheduled = false;
18
+ /**
19
+ * Constructor.
20
+ *
21
+ * @param {number} concurrency Number of tasks running in a single batch.
22
+ * @param {(cb: (...args:unknown[]) => unknown) => unknown} waiter Scheduler for the next batch execution.
23
+ */
6
24
  constructor(concurrency, waiter = (cb) => cb()) {
7
25
  this.concurrency = concurrency;
8
26
  this.waiter = waiter;
9
27
  }
28
+ /**
29
+ * Add a task to the queue.
30
+ */
10
31
  add(task) {
11
32
  const p = new Promise((resolve) => {
12
33
  this.tasks.push(() => resolve(task()));
@@ -14,6 +35,9 @@ class Queue {
14
35
  this.scheduleFlush();
15
36
  return p;
16
37
  }
38
+ /**
39
+ * Schedule next flush.
40
+ */
17
41
  scheduleFlush() {
18
42
  if (this.isScheduled) {
19
43
  return;
@@ -21,6 +45,9 @@ class Queue {
21
45
  this.isScheduled = true;
22
46
  this.waiter(() => this.flush());
23
47
  }
48
+ /**
49
+ * Flush current batch.
50
+ */
24
51
  flush() {
25
52
  this.run(this.tasks.splice(0, this.concurrency));
26
53
  this.isScheduled = false;
@@ -28,6 +55,9 @@ class Queue {
28
55
  this.scheduleFlush();
29
56
  }
30
57
  }
58
+ /**
59
+ * Run the queue.
60
+ */
31
61
  run(tasks) {
32
62
  let task;
33
63
  while (task = tasks.shift()) {
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/Queue.ts"],
4
4
  "sourcesContent": ["/**\n * Manage tasks in a queue.\n */\nexport class Queue {\n /**\n * List of tasks.\n */\n tasks: Array<(...args: unknown[]) => unknown> = [];\n\n /**\n * Number of tasks running in a single batch.\n */\n concurrency = 10;\n\n /**\n * A function to schedule the next batch.\n */\n waiter: (cb: (...args: unknown[]) => unknown) => unknown;\n\n /**\n * Is schedule running?\n */\n isScheduled = false;\n\n /**\n * Constructor.\n *\n * @param {number} concurrency Number of tasks running in a single batch.\n * @param {(cb: (...args:unknown[]) => unknown) => unknown} waiter Scheduler for the next batch execution.\n */\n constructor(\n concurrency: number,\n waiter: (cb: (...args: unknown[]) => unknown) => unknown = (cb) => cb(),\n ) {\n this.concurrency = concurrency;\n this.waiter = waiter;\n }\n\n /**\n * Add a task to the queue.\n */\n add(task: () => unknown) {\n const p = new Promise((resolve) => {\n this.tasks.push(() => resolve(task()));\n });\n this.scheduleFlush();\n return p;\n }\n\n /**\n * Schedule next flush.\n */\n scheduleFlush() {\n if (this.isScheduled) {\n return;\n }\n\n this.isScheduled = true;\n this.waiter(() => this.flush());\n }\n\n /**\n * Flush current batch.\n */\n flush() {\n this.run(this.tasks.splice(0, this.concurrency));\n this.isScheduled = false;\n\n if (this.tasks.length > 0) {\n this.scheduleFlush();\n }\n }\n\n /**\n * Run the queue.\n */\n run(tasks: Array<(...args: unknown[]) => unknown>) {\n let task;\n // eslint-disable-next-line no-cond-assign\n while ((task = tasks.shift())) {\n task();\n }\n }\n}\n"],
5
- "mappings": "AAGO,MAAM,MAAM;AAAA,EAIjB,QAAgD,CAAC;AAAA,EAKjD,cAAc;AAAA,EAKd;AAAA,EAKA,cAAc;AAAA,EAQd,YACE,aACA,SAA2D,CAAC,OAAO,GAAG,GACtE;AACA,SAAK,cAAc;AACnB,SAAK,SAAS;AAAA,EAChB;AAAA,EAKA,IAAI,MAAqB;AACvB,UAAM,IAAI,IAAI,QAAQ,CAAC,YAAY;AACjC,WAAK,MAAM,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,IACvC,CAAC;AACD,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAKA,gBAAgB;AACd,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,SAAK,cAAc;AACnB,SAAK,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,EAChC;AAAA,EAKA,QAAQ;AACN,SAAK,IAAI,KAAK,MAAM,OAAO,GAAG,KAAK,WAAW,CAAC;AAC/C,SAAK,cAAc;AAEnB,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAKA,IAAI,OAA+C;AACjD,QAAI;AAEJ,WAAQ,OAAO,MAAM,MAAM,GAAI;AAC7B,WAAK;AAAA,IACP;AAAA,EACF;AACF;",
5
+ "mappings": "AAGO,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA,EAIjB,QAAgD,CAAC;AAAA;AAAA;AAAA;AAAA,EAKjD,cAAc;AAAA;AAAA;AAAA;AAAA,EAKd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQd,YACE,aACA,SAA2D,CAAC,OAAO,GAAG,GACtE;AACA,SAAK,cAAc;AACnB,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAqB;AACvB,UAAM,IAAI,IAAI,QAAQ,CAAC,YAAY;AACjC,WAAK,MAAM,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,IACvC,CAAC;AACD,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AACd,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,SAAK,cAAc;AACnB,SAAK,OAAO,MAAM,KAAK,MAAM,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACN,SAAK,IAAI,KAAK,MAAM,OAAO,GAAG,KAAK,WAAW,CAAC;AAC/C,SAAK,cAAc;AAEnB,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA+C;AACjD,QAAI;AAEJ,WAAQ,OAAO,MAAM,MAAM,GAAI;AAC7B,WAAK;AAAA,IACP;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -17,6 +17,10 @@ var __copyProps = (to, from, except, desc) => {
17
17
  return to;
18
18
  };
19
19
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
24
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
25
  mod
22
26
  ));
@@ -32,10 +36,19 @@ var import_Queue = require("./Queue.cjs");
32
36
  var import_nextTick = __toESM(require("./nextTick.cjs"), 1);
33
37
  var LONG_TASK_DURATION = 40;
34
38
  var SmartQueue = class extends import_Queue.Queue {
39
+ /**
40
+ * A function to schedule the next batch.
41
+ */
35
42
  waiter = import_nextTick.default;
43
+ /**
44
+ * Class constructor.
45
+ */
36
46
  constructor() {
37
47
  super(Number.POSITIVE_INFINITY, import_nextTick.default);
38
48
  }
49
+ /**
50
+ * Flush current batch.
51
+ */
39
52
  flush() {
40
53
  this.run(this.tasks);
41
54
  this.isScheduled = false;
@@ -43,6 +56,9 @@ var SmartQueue = class extends import_Queue.Queue {
43
56
  this.scheduleFlush();
44
57
  }
45
58
  }
59
+ /**
60
+ * Run the queue.
61
+ */
46
62
  run(tasks) {
47
63
  let task;
48
64
  const start = performance.now();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/SmartQueue.ts"],
4
- "sourcesContent": ["import { Queue } from './Queue.js';\nimport nextTick from './nextTick.js';\n\n/**\n * A task is considered long if it blocks the main thread for more thant 50ms.\n * By using 40ms as a limit, we make the bet that we can avoid long running\n * tasks by dispatching small tasks smartly.\n * @see https://developer.mozilla.org/en-US/docs/Glossary/Long_task\n */\nconst LONG_TASK_DURATION = 40;\n\n/**\n * Manage tasks in a smart queue.\n * Tasks will be automatically batch-called inside a single event loop\n * lasting no more than 50ms, which is considered a long task.\n */\nexport class SmartQueue extends Queue {\n /**\n * A function to schedule the next batch.\n */\n waiter = nextTick;\n\n /**\n * Class constructor.\n */\n constructor() {\n super(Number.POSITIVE_INFINITY, nextTick);\n }\n\n /**\n * Flush current batch.\n */\n flush() {\n this.run(this.tasks);\n this.isScheduled = false;\n\n if (this.tasks.length > 0) {\n this.scheduleFlush();\n }\n }\n\n /**\n * Run the queue.\n */\n run(tasks: Array<(...args: unknown[]) => unknown>) {\n let task;\n const start = performance.now();\n let now = start;\n // eslint-disable-next-line no-cond-assign\n while (now - start < LONG_TASK_DURATION && (task = tasks.shift())) {\n task();\n now = performance.now();\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAsB;AACtB,sBAAqB;AAQrB,IAAM,qBAAqB;AAOpB,IAAM,aAAN,cAAyB,mBAAM;AAAA,EAIpC,SAAS,gBAAAA;AAAA,EAKT,cAAc;AACZ,UAAM,OAAO,mBAAmB,gBAAAA,OAAQ;AAAA,EAC1C;AAAA,EAKA,QAAQ;AACN,SAAK,IAAI,KAAK,KAAK;AACnB,SAAK,cAAc;AAEnB,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAKA,IAAI,OAA+C;AACjD,QAAI;AACJ,UAAM,QAAQ,YAAY,IAAI;AAC9B,QAAI,MAAM;AAEV,WAAO,MAAM,QAAQ,uBAAuB,OAAO,MAAM,MAAM,IAAI;AACjE,WAAK;AACL,YAAM,YAAY,IAAI;AAAA,IACxB;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { Queue } from './Queue.js';\nimport nextTick from './nextTick.js';\n\n/**\n * A task is considered long if it blocks the main thread for more thant 50ms.\n * By using 40ms as a limit, we make the bet that we can avoid long running\n * tasks by dispatching small tasks smartly.\n *\n * @see https://developer.mozilla.org/en-US/docs/Glossary/Long_task\n */\nconst LONG_TASK_DURATION = 40;\n\n/**\n * Manage tasks in a smart queue.\n * Tasks will be automatically batch-called inside a single event loop\n * lasting no more than 50ms, which is considered a long task.\n */\nexport class SmartQueue extends Queue {\n /**\n * A function to schedule the next batch.\n */\n waiter = nextTick;\n\n /**\n * Class constructor.\n */\n constructor() {\n super(Number.POSITIVE_INFINITY, nextTick);\n }\n\n /**\n * Flush current batch.\n */\n flush() {\n this.run(this.tasks);\n this.isScheduled = false;\n\n if (this.tasks.length > 0) {\n this.scheduleFlush();\n }\n }\n\n /**\n * Run the queue.\n */\n run(tasks: Array<(...args: unknown[]) => unknown>) {\n let task;\n const start = performance.now();\n let now = start;\n // eslint-disable-next-line no-cond-assign\n while (now - start < LONG_TASK_DURATION && (task = tasks.shift())) {\n task();\n now = performance.now();\n }\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAsB;AACtB,sBAAqB;AASrB,IAAM,qBAAqB;AAOpB,IAAM,aAAN,cAAyB,mBAAM;AAAA;AAAA;AAAA;AAAA,EAIpC,SAAS,gBAAAA;AAAA;AAAA;AAAA;AAAA,EAKT,cAAc;AACZ,UAAM,OAAO,mBAAmB,gBAAAA,OAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACN,SAAK,IAAI,KAAK,KAAK;AACnB,SAAK,cAAc;AAEnB,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA+C;AACjD,QAAI;AACJ,UAAM,QAAQ,YAAY,IAAI;AAC9B,QAAI,MAAM;AAEV,WAAO,MAAM,QAAQ,uBAAuB,OAAO,MAAM,MAAM,IAAI;AACjE,WAAK;AACL,YAAM,YAAY,IAAI;AAAA,IACxB;AAAA,EACF;AACF;",
6
6
  "names": ["nextTick"]
7
7
  }
@@ -2,10 +2,19 @@ import { Queue } from "./Queue.js";
2
2
  import nextTick from "./nextTick.js";
3
3
  const LONG_TASK_DURATION = 40;
4
4
  class SmartQueue extends Queue {
5
+ /**
6
+ * A function to schedule the next batch.
7
+ */
5
8
  waiter = nextTick;
9
+ /**
10
+ * Class constructor.
11
+ */
6
12
  constructor() {
7
13
  super(Number.POSITIVE_INFINITY, nextTick);
8
14
  }
15
+ /**
16
+ * Flush current batch.
17
+ */
9
18
  flush() {
10
19
  this.run(this.tasks);
11
20
  this.isScheduled = false;
@@ -13,6 +22,9 @@ class SmartQueue extends Queue {
13
22
  this.scheduleFlush();
14
23
  }
15
24
  }
25
+ /**
26
+ * Run the queue.
27
+ */
16
28
  run(tasks) {
17
29
  let task;
18
30
  const start = performance.now();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/SmartQueue.ts"],
4
- "sourcesContent": ["import { Queue } from './Queue.js';\nimport nextTick from './nextTick.js';\n\n/**\n * A task is considered long if it blocks the main thread for more thant 50ms.\n * By using 40ms as a limit, we make the bet that we can avoid long running\n * tasks by dispatching small tasks smartly.\n * @see https://developer.mozilla.org/en-US/docs/Glossary/Long_task\n */\nconst LONG_TASK_DURATION = 40;\n\n/**\n * Manage tasks in a smart queue.\n * Tasks will be automatically batch-called inside a single event loop\n * lasting no more than 50ms, which is considered a long task.\n */\nexport class SmartQueue extends Queue {\n /**\n * A function to schedule the next batch.\n */\n waiter = nextTick;\n\n /**\n * Class constructor.\n */\n constructor() {\n super(Number.POSITIVE_INFINITY, nextTick);\n }\n\n /**\n * Flush current batch.\n */\n flush() {\n this.run(this.tasks);\n this.isScheduled = false;\n\n if (this.tasks.length > 0) {\n this.scheduleFlush();\n }\n }\n\n /**\n * Run the queue.\n */\n run(tasks: Array<(...args: unknown[]) => unknown>) {\n let task;\n const start = performance.now();\n let now = start;\n // eslint-disable-next-line no-cond-assign\n while (now - start < LONG_TASK_DURATION && (task = tasks.shift())) {\n task();\n now = performance.now();\n }\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,aAAa;AACtB,OAAO,cAAc;AAQrB,MAAM,qBAAqB;AAOpB,MAAM,mBAAmB,MAAM;AAAA,EAIpC,SAAS;AAAA,EAKT,cAAc;AACZ,UAAM,OAAO,mBAAmB,QAAQ;AAAA,EAC1C;AAAA,EAKA,QAAQ;AACN,SAAK,IAAI,KAAK,KAAK;AACnB,SAAK,cAAc;AAEnB,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAKA,IAAI,OAA+C;AACjD,QAAI;AACJ,UAAM,QAAQ,YAAY,IAAI;AAC9B,QAAI,MAAM;AAEV,WAAO,MAAM,QAAQ,uBAAuB,OAAO,MAAM,MAAM,IAAI;AACjE,WAAK;AACL,YAAM,YAAY,IAAI;AAAA,IACxB;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { Queue } from './Queue.js';\nimport nextTick from './nextTick.js';\n\n/**\n * A task is considered long if it blocks the main thread for more thant 50ms.\n * By using 40ms as a limit, we make the bet that we can avoid long running\n * tasks by dispatching small tasks smartly.\n *\n * @see https://developer.mozilla.org/en-US/docs/Glossary/Long_task\n */\nconst LONG_TASK_DURATION = 40;\n\n/**\n * Manage tasks in a smart queue.\n * Tasks will be automatically batch-called inside a single event loop\n * lasting no more than 50ms, which is considered a long task.\n */\nexport class SmartQueue extends Queue {\n /**\n * A function to schedule the next batch.\n */\n waiter = nextTick;\n\n /**\n * Class constructor.\n */\n constructor() {\n super(Number.POSITIVE_INFINITY, nextTick);\n }\n\n /**\n * Flush current batch.\n */\n flush() {\n this.run(this.tasks);\n this.isScheduled = false;\n\n if (this.tasks.length > 0) {\n this.scheduleFlush();\n }\n }\n\n /**\n * Run the queue.\n */\n run(tasks: Array<(...args: unknown[]) => unknown>) {\n let task;\n const start = performance.now();\n let now = start;\n // eslint-disable-next-line no-cond-assign\n while (now - start < LONG_TASK_DURATION && (task = tasks.shift())) {\n task();\n now = performance.now();\n }\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,aAAa;AACtB,OAAO,cAAc;AASrB,MAAM,qBAAqB;AAOpB,MAAM,mBAAmB,MAAM;AAAA;AAAA;AAAA;AAAA,EAIpC,SAAS;AAAA;AAAA;AAAA;AAAA,EAKT,cAAc;AACZ,UAAM,OAAO,mBAAmB,QAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACN,SAAK,IAAI,KAAK,KAAK;AACnB,SAAK,cAAc;AAEnB,QAAI,KAAK,MAAM,SAAS,GAAG;AACzB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA+C;AACjD,QAAI;AACJ,UAAM,QAAQ,YAAY,IAAI;AAC9B,QAAI,MAAM;AAEV,WAAO,MAAM,QAAQ,uBAAuB,OAAO,MAAM,MAAM,IAAI;AACjE,WAAK;AACL,YAAM,YAAY,IAAI;AAAA,IACxB;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -23,7 +23,10 @@ __export(collidePointRect_exports, {
23
23
  });
24
24
  module.exports = __toCommonJS(collidePointRect_exports);
25
25
  function collidePointRect(point, rect) {
26
- return point.x >= rect.x && point.x <= rect.x + rect.width && point.y >= rect.y && point.y <= rect.y + rect.height;
26
+ return point.x >= rect.x && // right of the left edge AND
27
+ point.x <= rect.x + rect.width && // left of the right edge AND
28
+ point.y >= rect.y && // below the top AND
29
+ point.y <= rect.y + rect.height;
27
30
  }
28
31
  if (module.exports.default) module.exports = module.exports.default;
29
32
  //# sourceMappingURL=collidePointRect.cjs.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/collide/collidePointRect.ts"],
4
4
  "sourcesContent": ["/**\n * @typedef {Object} Point\n * @property {number} x Point's x position\n * @property {number} y Point's y position\n */\n\n/**\n * @typedef {Object} Rect\n * @property {number} x Rectangle's x position\n * @property {number} y Rectangle's y position\n * @property {number} width Rectangle's width\n * @property {number} height Rectangle's height\n */\n\n/**\n * Test if a point collides with a rectangle.\n * Inspired by http://www.jeffreythompson.org/collision-detection/point-rect.php\n *\n * @param {Point} point Point\n * @param {Rect} rect Rectangle\n * @returns {boolean} Is the point inside the rectangle's bounds ?\n */\nexport default function collidePointRect(point, rect) {\n return (\n point.x >= rect.x && // right of the left edge AND\n point.x <= rect.x + rect.width && // left of the right edge AND\n point.y >= rect.y && // below the top AND\n point.y <= rect.y + rect.height // above the bottom\n );\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBe,SAAR,iBAAkC,OAAO,MAAM;AACpD,SACE,MAAM,KAAK,KAAK,KAChB,MAAM,KAAK,KAAK,IAAI,KAAK,SACzB,MAAM,KAAK,KAAK,KAChB,MAAM,KAAK,KAAK,IAAI,KAAK;AAE7B;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBe,SAAR,iBAAkC,OAAO,MAAM;AACpD,SACE,MAAM,KAAK,KAAK;AAAA,EAChB,MAAM,KAAK,KAAK,IAAI,KAAK;AAAA,EACzB,MAAM,KAAK,KAAK;AAAA,EAChB,MAAM,KAAK,KAAK,IAAI,KAAK;AAE7B;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,8 @@
1
1
  function collidePointRect(point, rect) {
2
- return point.x >= rect.x && point.x <= rect.x + rect.width && point.y >= rect.y && point.y <= rect.y + rect.height;
2
+ return point.x >= rect.x && // right of the left edge AND
3
+ point.x <= rect.x + rect.width && // left of the right edge AND
4
+ point.y >= rect.y && // below the top AND
5
+ point.y <= rect.y + rect.height;
3
6
  }
4
7
  export {
5
8
  collidePointRect as default
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/collide/collidePointRect.ts"],
4
4
  "sourcesContent": ["/**\n * @typedef {Object} Point\n * @property {number} x Point's x position\n * @property {number} y Point's y position\n */\n\n/**\n * @typedef {Object} Rect\n * @property {number} x Rectangle's x position\n * @property {number} y Rectangle's y position\n * @property {number} width Rectangle's width\n * @property {number} height Rectangle's height\n */\n\n/**\n * Test if a point collides with a rectangle.\n * Inspired by http://www.jeffreythompson.org/collision-detection/point-rect.php\n *\n * @param {Point} point Point\n * @param {Rect} rect Rectangle\n * @returns {boolean} Is the point inside the rectangle's bounds ?\n */\nexport default function collidePointRect(point, rect) {\n return (\n point.x >= rect.x && // right of the left edge AND\n point.x <= rect.x + rect.width && // left of the right edge AND\n point.y >= rect.y && // below the top AND\n point.y <= rect.y + rect.height // above the bottom\n );\n}\n"],
5
- "mappings": "AAsBe,SAAR,iBAAkC,OAAO,MAAM;AACpD,SACE,MAAM,KAAK,KAAK,KAChB,MAAM,KAAK,KAAK,IAAI,KAAK,SACzB,MAAM,KAAK,KAAK,KAChB,MAAM,KAAK,KAAK,IAAI,KAAK;AAE7B;",
5
+ "mappings": "AAsBe,SAAR,iBAAkC,OAAO,MAAM;AACpD,SACE,MAAM,KAAK,KAAK;AAAA,EAChB,MAAM,KAAK,KAAK,IAAI,KAAK;AAAA,EACzB,MAAM,KAAK,KAAK;AAAA,EAChB,MAAM,KAAK,KAAK,IAAI,KAAK;AAE7B;",
6
6
  "names": []
7
7
  }
@@ -23,7 +23,10 @@ __export(collideRectRect_exports, {
23
23
  });
24
24
  module.exports = __toCommonJS(collideRectRect_exports);
25
25
  function collideRectRect(rect1, rect2) {
26
- return rect1.x + rect1.width >= rect2.x && rect1.x <= rect2.x + rect2.width && rect1.y + rect1.height >= rect2.y && rect1.y <= rect2.y + rect2.height;
26
+ return rect1.x + rect1.width >= rect2.x && // rect1 right edge past rect2 left AND
27
+ rect1.x <= rect2.x + rect2.width && // rect1 left edge past rect2 right AND
28
+ rect1.y + rect1.height >= rect2.y && // rect1 top edge past rect2 bottom AND
29
+ rect1.y <= rect2.y + rect2.height;
27
30
  }
28
31
  if (module.exports.default) module.exports = module.exports.default;
29
32
  //# sourceMappingURL=collideRectRect.cjs.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/collide/collideRectRect.ts"],
4
4
  "sourcesContent": ["/**\n * @typedef {Object} Rect\n * @property {number} x Rectangle's x position\n * @property {number} y Rectangle's y position\n * @property {number} width Rectangle's width\n * @property {number} height Rectangle's height\n */\n\n/**\n * Test if a rectangle collides with another rectangle.\n * Inspired by http://www.jeffreythompson.org/collision-detection/rect-rect.php\n *\n * @param {Rect} rect1 Rectangle 1\n * @param {Rect} rect2 Rectangle 2\n * @returns {boolean} Are the sides of one rectangle touching the other ?\n */\nexport default function collideRectRect(rect1, rect2) {\n return (\n rect1.x + rect1.width >= rect2.x && // rect1 right edge past rect2 left AND\n rect1.x <= rect2.x + rect2.width && // rect1 left edge past rect2 right AND\n rect1.y + rect1.height >= rect2.y && // rect1 top edge past rect2 bottom AND\n rect1.y <= rect2.y + rect2.height // rect1 bottom edge past rect2 top\n );\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBe,SAAR,gBAAiC,OAAO,OAAO;AACpD,SACE,MAAM,IAAI,MAAM,SAAS,MAAM,KAC/B,MAAM,KAAK,MAAM,IAAI,MAAM,SAC3B,MAAM,IAAI,MAAM,UAAU,MAAM,KAChC,MAAM,KAAK,MAAM,IAAI,MAAM;AAE/B;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBe,SAAR,gBAAiC,OAAO,OAAO;AACpD,SACE,MAAM,IAAI,MAAM,SAAS,MAAM;AAAA,EAC/B,MAAM,KAAK,MAAM,IAAI,MAAM;AAAA,EAC3B,MAAM,IAAI,MAAM,UAAU,MAAM;AAAA,EAChC,MAAM,KAAK,MAAM,IAAI,MAAM;AAE/B;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,8 @@
1
1
  function collideRectRect(rect1, rect2) {
2
- return rect1.x + rect1.width >= rect2.x && rect1.x <= rect2.x + rect2.width && rect1.y + rect1.height >= rect2.y && rect1.y <= rect2.y + rect2.height;
2
+ return rect1.x + rect1.width >= rect2.x && // rect1 right edge past rect2 left AND
3
+ rect1.x <= rect2.x + rect2.width && // rect1 left edge past rect2 right AND
4
+ rect1.y + rect1.height >= rect2.y && // rect1 top edge past rect2 bottom AND
5
+ rect1.y <= rect2.y + rect2.height;
3
6
  }
4
7
  export {
5
8
  collideRectRect as default
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/collide/collideRectRect.ts"],
4
4
  "sourcesContent": ["/**\n * @typedef {Object} Rect\n * @property {number} x Rectangle's x position\n * @property {number} y Rectangle's y position\n * @property {number} width Rectangle's width\n * @property {number} height Rectangle's height\n */\n\n/**\n * Test if a rectangle collides with another rectangle.\n * Inspired by http://www.jeffreythompson.org/collision-detection/rect-rect.php\n *\n * @param {Rect} rect1 Rectangle 1\n * @param {Rect} rect2 Rectangle 2\n * @returns {boolean} Are the sides of one rectangle touching the other ?\n */\nexport default function collideRectRect(rect1, rect2) {\n return (\n rect1.x + rect1.width >= rect2.x && // rect1 right edge past rect2 left AND\n rect1.x <= rect2.x + rect2.width && // rect1 left edge past rect2 right AND\n rect1.y + rect1.height >= rect2.y && // rect1 top edge past rect2 bottom AND\n rect1.y <= rect2.y + rect2.height // rect1 bottom edge past rect2 top\n );\n}\n"],
5
- "mappings": "AAgBe,SAAR,gBAAiC,OAAO,OAAO;AACpD,SACE,MAAM,IAAI,MAAM,SAAS,MAAM,KAC/B,MAAM,KAAK,MAAM,IAAI,MAAM,SAC3B,MAAM,IAAI,MAAM,UAAU,MAAM,KAChC,MAAM,KAAK,MAAM,IAAI,MAAM;AAE/B;",
5
+ "mappings": "AAgBe,SAAR,gBAAiC,OAAO,OAAO;AACpD,SACE,MAAM,IAAI,MAAM,SAAS,MAAM;AAAA,EAC/B,MAAM,KAAK,MAAM,IAAI,MAAM;AAAA,EAC3B,MAAM,IAAI,MAAM,UAAU,MAAM;AAAA,EAChC,MAAM,KAAK,MAAM,IAAI,MAAM;AAE/B;",
6
6
  "names": []
7
7
  }
@@ -17,6 +17,10 @@ var __copyProps = (to, from, except, desc) => {
17
17
  return to;
18
18
  };
19
19
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
24
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
25
  mod
22
26
  ));
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/collide/index.ts"],
4
4
  "sourcesContent": ["/**\n * Inspired by http://www.jeffreythompson.org/collision-detection/\n */\nexport { default as boundingRectToCircle } from './boundingRectToCircle.js';\nexport { default as collideCircleCircle } from './collideCircleCircle.js';\nexport { default as collideCircleRect } from './collideCircleRect.js';\nexport { default as collidePointCircle } from './collidePointCircle.js';\nexport { default as collidePointRect } from './collidePointRect.js';\nexport { default as collideRectRect } from './collideRectRect.js';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kCAAgD;AAChD,iCAA+C;AAC/C,+BAA6C;AAC7C,gCAA8C;AAC9C,8BAA4C;AAC5C,6BAA2C;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kCAAgD;AAChD,iCAA+C;AAC/C,+BAA6C;AAC7C,gCAA8C;AAC9C,8BAA4C;AAC5C,6BAA2C;",
6
6
  "names": []
7
7
  }
@@ -17,6 +17,10 @@ var __copyProps = (to, from, except, desc) => {
17
17
  return to;
18
18
  };
19
19
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
24
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
25
  mod
22
26
  ));
@@ -34,6 +38,7 @@ var import_transform = __toESM(require("./transform.cjs"), 1);
34
38
  var import_scheduler = require("../scheduler.cjs");
35
39
  var import_tween = require("../tween.cjs");
36
40
  var import_utils = require("./utils.cjs");
41
+ var import_string = require("../string/index.cjs");
37
42
  var id = 0;
38
43
  var running = /* @__PURE__ */ new WeakMap();
39
44
  var CSSUnitConverter = {
@@ -55,6 +60,7 @@ function getAnimationStepValue(val, getSizeRef) {
55
60
  var generateTranslateRenderStrategy = (sizeRef) => (element, fromValue, toValue, progress) => (0, import_math.lerp)(
56
61
  getAnimationStepValue(
57
62
  fromValue ?? 0,
63
+ /* istanbul ignore next */
58
64
  () => element[sizeRef]
59
65
  ),
60
66
  getAnimationStepValue(toValue ?? 0, () => element[sizeRef]),
@@ -121,9 +127,9 @@ function render(element, from, to, progress) {
121
127
  element.style.transformOrigin = transformOrigin;
122
128
  }
123
129
  if (customProperties !== false) {
124
- customProperties.forEach((customProperty) => {
130
+ for (const customProperty of customProperties) {
125
131
  element.style.setProperty(customProperty[0], customProperty[1].toString());
126
- });
132
+ }
127
133
  }
128
134
  (0, import_transform.default)(element, props);
129
135
  });
@@ -136,7 +142,7 @@ function singleAnimate(element, keyframes, options = {}) {
136
142
  ...keyframe,
137
143
  offset: keyframe.offset ?? index / keyframesCount,
138
144
  easing: (0, import_tween.normalizeEase)(keyframe.easing),
139
- vars: Object.keys(keyframe).filter((key2) => key2.startsWith("--"))
145
+ vars: Object.keys(keyframe).filter((key2) => (0, import_string.startsWith)(key2, "--"))
140
146
  })
141
147
  );
142
148
  if (!running.has(element)) {
@@ -158,10 +164,10 @@ function singleAnimate(element, keyframes, options = {}) {
158
164
  options.onStart();
159
165
  }
160
166
  const runningKeys = running.get(element);
161
- runningKeys.forEach((runningPause, runningKey) => {
167
+ for (const [runningKey, runningPause] of runningKeys.entries()) {
162
168
  runningPause();
163
169
  runningKeys.delete(runningKey);
164
- });
170
+ }
165
171
  runningKeys.set(key, controls.pause);
166
172
  running.set(element, runningKeys);
167
173
  }
@@ -173,14 +179,17 @@ function animate(elementOrElements, keyframes, options = {}) {
173
179
  elementOrElements,
174
180
  (element) => singleAnimate(element, keyframes, options)
175
181
  );
176
- const delegate = (key) => (...args) => {
177
- if (key === "progress" && args.length === 0) {
178
- return controls[0][key]();
182
+ const delegate = (key) => (
183
+ // eslint-disable-next-line consistent-return
184
+ (...args) => {
185
+ if (key === "progress" && args.length === 0) {
186
+ return controls[0][key]();
187
+ }
188
+ for (const control of controls) {
189
+ control[key](...args);
190
+ }
179
191
  }
180
- controls.forEach((control) => {
181
- control[key](...args);
182
- });
183
- };
192
+ );
184
193
  return {
185
194
  start: delegate("start"),
186
195
  pause: delegate("pause"),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/css/animate.ts"],
4
- "sourcesContent": ["import { lerp, map } from '../math/index.js';\nimport { isDefined, isFunction, isNumber } from '../is.js';\nimport transform, { TRANSFORM_PROPS } from './transform.js';\nimport { domScheduler as scheduler } from '../scheduler.js';\nimport { tween, normalizeEase } from '../tween.js';\n// eslint-disable-next-line import/extensions\nimport { eachElements } from './utils.js';\nimport type { TransformProps } from './transform.js';\nimport type { EasingFunction } from '../math/index.js';\nimport type { BezierCurve, TweenOptions } from '../tween.js';\n\nexport type CSSCustomPropertyName = `--${string}`;\n\nexport type Keyframe = TransformProps & {\n opacity?: number;\n transformOrigin?: string;\n easing?: EasingFunction | BezierCurve;\n offset?: number;\n [key: CSSCustomPropertyName]: number;\n};\n\nexport type NormalizedKeyframe = Keyframe & {\n easing: EasingFunction;\n offset: number;\n vars: string[];\n};\n\nexport type Animate = {\n start: () => void;\n pause: () => void;\n play: () => void;\n finish: () => void;\n progress: (value?: number) => number;\n};\n\nlet id = 0;\nconst running = new WeakMap();\n\nconst CSSUnitConverter = {\n '%': (value, getSizeRef) => (value * getSizeRef()) / 100,\n vh: (value) => (value * window.innerHeight) / 100,\n vw: (value) => (value * window.innerWidth) / 100,\n vmin: (value) => (value * Math.min(window.innerWidth, window.innerHeight)) / 100,\n vmax: (value) => (value * Math.max(window.innerWidth, window.innerHeight)) / 100,\n};\n\n/**\n * Get the value from a step property.\n */\nfunction getAnimationStepValue(val: number | [number, string], getSizeRef: () => number): number {\n if (isNumber(val)) {\n return val;\n }\n\n if (!val[1] || !CSSUnitConverter[val[1]]) {\n return val[0];\n }\n\n return CSSUnitConverter[val[1]](val[0], getSizeRef);\n}\n\nconst generateTranslateRenderStrategy = (sizeRef) => (element, fromValue, toValue, progress) =>\n lerp(\n getAnimationStepValue(\n fromValue ?? 0,\n /* istanbul ignore next */\n () => element[sizeRef],\n ),\n getAnimationStepValue(toValue ?? 0, () => element[sizeRef]),\n progress,\n );\nconst widthBasedTranslateRenderStrategy = generateTranslateRenderStrategy('offsetWidth');\nconst heightBasedTranslateRenderStrategy = generateTranslateRenderStrategy('offsetHeight');\n\nconst generateLerpRenderStrategy = (defaultValue) => (element, fromValue, toValue, progress) =>\n lerp(fromValue ?? defaultValue, toValue ?? defaultValue, progress);\nconst scaleRenderStrategy = generateLerpRenderStrategy(1);\nconst degreesRenderStrategy = generateLerpRenderStrategy(0);\n\nconst transformRenderStrategies = {\n x: widthBasedTranslateRenderStrategy,\n y: heightBasedTranslateRenderStrategy,\n z: widthBasedTranslateRenderStrategy,\n scale: scaleRenderStrategy,\n scaleX: scaleRenderStrategy,\n scaleY: scaleRenderStrategy,\n scaleZ: scaleRenderStrategy,\n skew: degreesRenderStrategy,\n skewX: degreesRenderStrategy,\n skewY: degreesRenderStrategy,\n rotate: degreesRenderStrategy,\n rotateX: degreesRenderStrategy,\n rotateY: degreesRenderStrategy,\n rotateZ: degreesRenderStrategy,\n};\n\n/**\n * Render an element style based on 2 keyframes and a progress value.\n */\nfunction render(\n element: HTMLElement,\n from: NormalizedKeyframe,\n to: NormalizedKeyframe,\n progress: number,\n) {\n const stepProgress = to.easing(map(progress, from.offset, to.offset, 0, 1));\n\n scheduler.read(() => {\n let opacity: false | number | string = false;\n if (isDefined(from.opacity) || isDefined(to.opacity)) {\n opacity = map(stepProgress, 0, 1, from.opacity ?? 1, to.opacity ?? 1);\n } else if (element.style.opacity) {\n opacity = '';\n }\n\n let transformOrigin: false | string = false;\n if (isDefined(to.transformOrigin)) {\n transformOrigin = to.transformOrigin;\n } else if (element.style.transformOrigin) {\n transformOrigin = '';\n }\n\n let customProperties: false | [string, number][] = false;\n if (isDefined(from.vars) && isDefined(to.vars)) {\n customProperties = from.vars.map((customPropertyName) => {\n const customPropertyValue = lerp(\n from[customPropertyName],\n to[customPropertyName],\n stepProgress,\n );\n return [customPropertyName, customPropertyValue];\n });\n }\n\n const props = Object.fromEntries(\n TRANSFORM_PROPS.filter((name) => isDefined(from[name]) || isDefined(to[name])).map((name) => [\n name,\n transformRenderStrategies[name](element, from[name], to[name], stepProgress),\n ]),\n );\n scheduler.write(() => {\n if (opacity !== false) {\n // @ts-ignore\n element.style.opacity = opacity;\n }\n if (transformOrigin !== false) {\n element.style.transformOrigin = transformOrigin;\n }\n if (customProperties !== false) {\n customProperties.forEach((customProperty) => {\n element.style.setProperty(customProperty[0], customProperty[1].toString());\n });\n }\n transform(element, props);\n });\n });\n}\n\n/**\n * Animate an element.\n */\nfunction singleAnimate(\n element: HTMLElement,\n keyframes: Keyframe[],\n options: TweenOptions = {},\n): Animate {\n const keyframesCount = keyframes.length - 1;\n const normalizedKeyframes = keyframes.map(\n (keyframe, index): NormalizedKeyframe => ({\n ...keyframe,\n offset: keyframe.offset ?? index / keyframesCount,\n easing: normalizeEase(keyframe.easing),\n vars: Object.keys(keyframe).filter((key) => key.startsWith('--')),\n }),\n );\n\n if (!running.has(element)) {\n running.set(element, new Map());\n }\n\n const key = `animate-${id}`;\n id += 1;\n\n /**\n * Set the progress value.\n */\n function callback(progress: number) {\n let toIndex = 0;\n while (\n normalizedKeyframes[toIndex] &&\n normalizedKeyframes[toIndex].offset <= progress &&\n normalizedKeyframes[toIndex].offset !== 1\n ) {\n toIndex += 1;\n }\n\n render(element, normalizedKeyframes[toIndex - 1], normalizedKeyframes[toIndex], progress);\n }\n\n const controls = tween(callback, {\n ...options,\n onStart() {\n if (isFunction(options.onStart)) {\n options.onStart();\n }\n // Stop running instances\n const runningKeys = running.get(element);\n runningKeys.forEach((runningPause, runningKey) => {\n runningPause();\n runningKeys.delete(runningKey);\n });\n runningKeys.set(key, controls.pause);\n running.set(element, runningKeys);\n },\n });\n\n return controls;\n}\n\n/**\n * Animate one or more elements.\n */\nexport function animate(\n elementOrElements: HTMLElement | HTMLElement[] | NodeListOf<HTMLElement>,\n keyframes: Keyframe[],\n options: TweenOptions = {},\n): Animate {\n const controls = eachElements(elementOrElements, (element) =>\n singleAnimate(element, keyframes, options),\n );\n\n const delegate =\n (key) =>\n // eslint-disable-next-line consistent-return\n (...args) => {\n if (key === 'progress' && args.length === 0) {\n return controls[0][key]();\n }\n\n controls.forEach((control) => {\n control[key](...args);\n });\n };\n\n return {\n start: delegate('start'),\n pause: delegate('pause'),\n finish: delegate('finish'),\n play: delegate('play'),\n progress: delegate('progress'),\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { lerp, map } from '../math/index.js';\nimport { isDefined, isFunction, isNumber } from '../is.js';\nimport transform, { TRANSFORM_PROPS } from './transform.js';\nimport { domScheduler as scheduler } from '../scheduler.js';\nimport { tween, normalizeEase } from '../tween.js';\n// eslint-disable-next-line import/extensions\nimport { eachElements } from './utils.js';\nimport { startsWith } from '../string/index.js';\nimport type { TransformProps } from './transform.js';\nimport type { EasingFunction } from '../math/index.js';\nimport type { BezierCurve, TweenOptions } from '../tween.js';\n\nexport type CSSCustomPropertyName = `--${string}`;\n\nexport type Keyframe = TransformProps & {\n opacity?: number;\n transformOrigin?: string;\n easing?: EasingFunction | BezierCurve;\n offset?: number;\n [key: CSSCustomPropertyName]: number;\n};\n\nexport type NormalizedKeyframe = Keyframe & {\n easing: EasingFunction;\n offset: number;\n vars: string[];\n};\n\nexport type Animate = {\n start: () => void;\n pause: () => void;\n play: () => void;\n finish: () => void;\n progress: (value?: number) => number;\n};\n\nlet id = 0;\nconst running = new WeakMap();\n\nconst CSSUnitConverter = {\n '%': (value, getSizeRef) => (value * getSizeRef()) / 100,\n vh: (value) => (value * window.innerHeight) / 100,\n vw: (value) => (value * window.innerWidth) / 100,\n vmin: (value) => (value * Math.min(window.innerWidth, window.innerHeight)) / 100,\n vmax: (value) => (value * Math.max(window.innerWidth, window.innerHeight)) / 100,\n};\n\n/**\n * Get the value from a step property.\n */\nfunction getAnimationStepValue(val: number | [number, string], getSizeRef: () => number): number {\n if (isNumber(val)) {\n return val;\n }\n\n if (!val[1] || !CSSUnitConverter[val[1]]) {\n return val[0];\n }\n\n return CSSUnitConverter[val[1]](val[0], getSizeRef);\n}\n\nconst generateTranslateRenderStrategy = (sizeRef) => (element, fromValue, toValue, progress) =>\n lerp(\n getAnimationStepValue(\n fromValue ?? 0,\n /* istanbul ignore next */\n () => element[sizeRef],\n ),\n getAnimationStepValue(toValue ?? 0, () => element[sizeRef]),\n progress,\n );\nconst widthBasedTranslateRenderStrategy = generateTranslateRenderStrategy('offsetWidth');\nconst heightBasedTranslateRenderStrategy = generateTranslateRenderStrategy('offsetHeight');\n\nconst generateLerpRenderStrategy = (defaultValue) => (element, fromValue, toValue, progress) =>\n lerp(fromValue ?? defaultValue, toValue ?? defaultValue, progress);\nconst scaleRenderStrategy = generateLerpRenderStrategy(1);\nconst degreesRenderStrategy = generateLerpRenderStrategy(0);\n\nconst transformRenderStrategies = {\n x: widthBasedTranslateRenderStrategy,\n y: heightBasedTranslateRenderStrategy,\n z: widthBasedTranslateRenderStrategy,\n scale: scaleRenderStrategy,\n scaleX: scaleRenderStrategy,\n scaleY: scaleRenderStrategy,\n scaleZ: scaleRenderStrategy,\n skew: degreesRenderStrategy,\n skewX: degreesRenderStrategy,\n skewY: degreesRenderStrategy,\n rotate: degreesRenderStrategy,\n rotateX: degreesRenderStrategy,\n rotateY: degreesRenderStrategy,\n rotateZ: degreesRenderStrategy,\n};\n\n/**\n * Render an element style based on 2 keyframes and a progress value.\n */\nfunction render(\n element: HTMLElement,\n from: NormalizedKeyframe,\n to: NormalizedKeyframe,\n progress: number,\n) {\n const stepProgress = to.easing(map(progress, from.offset, to.offset, 0, 1));\n\n scheduler.read(() => {\n let opacity: false | number | string = false;\n if (isDefined(from.opacity) || isDefined(to.opacity)) {\n opacity = map(stepProgress, 0, 1, from.opacity ?? 1, to.opacity ?? 1);\n } else if (element.style.opacity) {\n opacity = '';\n }\n\n let transformOrigin: false | string = false;\n if (isDefined(to.transformOrigin)) {\n transformOrigin = to.transformOrigin;\n } else if (element.style.transformOrigin) {\n transformOrigin = '';\n }\n\n let customProperties: false | [string, number][] = false;\n if (isDefined(from.vars) && isDefined(to.vars)) {\n customProperties = from.vars.map((customPropertyName) => {\n const customPropertyValue = lerp(\n from[customPropertyName],\n to[customPropertyName],\n stepProgress,\n );\n return [customPropertyName, customPropertyValue];\n });\n }\n\n const props = Object.fromEntries(\n TRANSFORM_PROPS.filter((name) => isDefined(from[name]) || isDefined(to[name])).map((name) => [\n name,\n transformRenderStrategies[name](element, from[name], to[name], stepProgress),\n ]),\n );\n scheduler.write(() => {\n if (opacity !== false) {\n // @ts-ignore\n element.style.opacity = opacity;\n }\n if (transformOrigin !== false) {\n element.style.transformOrigin = transformOrigin;\n }\n if (customProperties !== false) {\n for (const customProperty of customProperties) {\n element.style.setProperty(customProperty[0], customProperty[1].toString());\n }\n }\n transform(element, props);\n });\n });\n}\n\n/**\n * Animate an element.\n */\nfunction singleAnimate(\n element: HTMLElement,\n keyframes: Keyframe[],\n options: TweenOptions = {},\n): Animate {\n const keyframesCount = keyframes.length - 1;\n const normalizedKeyframes = keyframes.map(\n (keyframe, index): NormalizedKeyframe => ({\n ...keyframe,\n offset: keyframe.offset ?? index / keyframesCount,\n easing: normalizeEase(keyframe.easing),\n vars: Object.keys(keyframe).filter((key) => startsWith(key, '--')),\n }),\n );\n\n if (!running.has(element)) {\n running.set(element, new Map());\n }\n\n const key = `animate-${id}`;\n id += 1;\n\n /**\n * Set the progress value.\n */\n function callback(progress: number) {\n let toIndex = 0;\n while (\n normalizedKeyframes[toIndex] &&\n normalizedKeyframes[toIndex].offset <= progress &&\n normalizedKeyframes[toIndex].offset !== 1\n ) {\n toIndex += 1;\n }\n\n render(element, normalizedKeyframes[toIndex - 1], normalizedKeyframes[toIndex], progress);\n }\n\n const controls = tween(callback, {\n ...options,\n onStart() {\n if (isFunction(options.onStart)) {\n options.onStart();\n }\n // Stop running instances\n const runningKeys = running.get(element);\n for (const [runningKey, runningPause] of runningKeys.entries()) {\n runningPause();\n runningKeys.delete(runningKey);\n }\n runningKeys.set(key, controls.pause);\n running.set(element, runningKeys);\n },\n });\n\n return controls;\n}\n\n/**\n * Animate one or more elements.\n */\nexport function animate(\n elementOrElements: HTMLElement | HTMLElement[] | NodeListOf<HTMLElement>,\n keyframes: Keyframe[],\n options: TweenOptions = {},\n): Animate {\n const controls = eachElements(elementOrElements, (element) =>\n singleAnimate(element, keyframes, options),\n );\n\n const delegate =\n (key) =>\n // eslint-disable-next-line consistent-return\n (...args) => {\n if (key === 'progress' && args.length === 0) {\n return controls[0][key]();\n }\n\n for (const control of controls) {\n control[key](...args);\n }\n };\n\n return {\n start: delegate('start'),\n pause: delegate('pause'),\n finish: delegate('finish'),\n play: delegate('play'),\n progress: delegate('progress'),\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["scheduler", "transform", "key"]
7
7
  }
@@ -4,6 +4,7 @@ import transform, { TRANSFORM_PROPS } from "./transform.js";
4
4
  import { domScheduler as scheduler } from "../scheduler.js";
5
5
  import { tween, normalizeEase } from "../tween.js";
6
6
  import { eachElements } from "./utils.js";
7
+ import { startsWith } from "../string/index.js";
7
8
  let id = 0;
8
9
  const running = /* @__PURE__ */ new WeakMap();
9
10
  const CSSUnitConverter = {
@@ -25,6 +26,7 @@ function getAnimationStepValue(val, getSizeRef) {
25
26
  const generateTranslateRenderStrategy = (sizeRef) => (element, fromValue, toValue, progress) => lerp(
26
27
  getAnimationStepValue(
27
28
  fromValue ?? 0,
29
+ /* istanbul ignore next */
28
30
  () => element[sizeRef]
29
31
  ),
30
32
  getAnimationStepValue(toValue ?? 0, () => element[sizeRef]),
@@ -91,9 +93,9 @@ function render(element, from, to, progress) {
91
93
  element.style.transformOrigin = transformOrigin;
92
94
  }
93
95
  if (customProperties !== false) {
94
- customProperties.forEach((customProperty) => {
96
+ for (const customProperty of customProperties) {
95
97
  element.style.setProperty(customProperty[0], customProperty[1].toString());
96
- });
98
+ }
97
99
  }
98
100
  transform(element, props);
99
101
  });
@@ -106,7 +108,7 @@ function singleAnimate(element, keyframes, options = {}) {
106
108
  ...keyframe,
107
109
  offset: keyframe.offset ?? index / keyframesCount,
108
110
  easing: normalizeEase(keyframe.easing),
109
- vars: Object.keys(keyframe).filter((key2) => key2.startsWith("--"))
111
+ vars: Object.keys(keyframe).filter((key2) => startsWith(key2, "--"))
110
112
  })
111
113
  );
112
114
  if (!running.has(element)) {
@@ -128,10 +130,10 @@ function singleAnimate(element, keyframes, options = {}) {
128
130
  options.onStart();
129
131
  }
130
132
  const runningKeys = running.get(element);
131
- runningKeys.forEach((runningPause, runningKey) => {
133
+ for (const [runningKey, runningPause] of runningKeys.entries()) {
132
134
  runningPause();
133
135
  runningKeys.delete(runningKey);
134
- });
136
+ }
135
137
  runningKeys.set(key, controls.pause);
136
138
  running.set(element, runningKeys);
137
139
  }
@@ -143,14 +145,17 @@ function animate(elementOrElements, keyframes, options = {}) {
143
145
  elementOrElements,
144
146
  (element) => singleAnimate(element, keyframes, options)
145
147
  );
146
- const delegate = (key) => (...args) => {
147
- if (key === "progress" && args.length === 0) {
148
- return controls[0][key]();
148
+ const delegate = (key) => (
149
+ // eslint-disable-next-line consistent-return
150
+ (...args) => {
151
+ if (key === "progress" && args.length === 0) {
152
+ return controls[0][key]();
153
+ }
154
+ for (const control of controls) {
155
+ control[key](...args);
156
+ }
149
157
  }
150
- controls.forEach((control) => {
151
- control[key](...args);
152
- });
153
- };
158
+ );
154
159
  return {
155
160
  start: delegate("start"),
156
161
  pause: delegate("pause"),