@tsparticles/engine 3.3.0 → 3.5.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 (272) hide show
  1. package/README.md +0 -4
  2. package/browser/Core/Canvas.js +27 -22
  3. package/browser/Core/Container.js +57 -44
  4. package/browser/Core/Engine.js +82 -74
  5. package/browser/Core/Particle.js +29 -15
  6. package/browser/Core/Particles.js +23 -24
  7. package/browser/Core/Utils/EventListeners.js +18 -17
  8. package/browser/Core/Utils/ExternalInteractorBase.js +2 -1
  9. package/browser/Core/Utils/InteractionManager.js +3 -2
  10. package/browser/Core/Utils/ParticlesInteractorBase.js +2 -1
  11. package/browser/Core/Utils/QuadTree.js +1 -1
  12. package/browser/Core/Utils/Ranges.js +5 -4
  13. package/browser/Enums/AnimationStatus.js +5 -1
  14. package/browser/Enums/Directions/MoveDirection.js +14 -1
  15. package/browser/Enums/Directions/OutModeDirection.js +7 -1
  16. package/browser/Enums/Directions/RotateDirection.js +6 -1
  17. package/browser/Enums/InteractivityDetect.js +6 -1
  18. package/browser/Enums/Modes/AnimationMode.js +7 -1
  19. package/browser/Enums/Modes/CollisionMode.js +6 -1
  20. package/browser/Enums/Modes/LimitMode.js +5 -1
  21. package/browser/Enums/Modes/OutMode.js +8 -1
  22. package/browser/Enums/Modes/PixelMode.js +5 -1
  23. package/browser/Enums/Modes/ResponsiveMode.js +5 -1
  24. package/browser/Enums/Modes/ThemeMode.js +6 -1
  25. package/browser/Enums/Types/AlterType.js +5 -1
  26. package/browser/Enums/Types/DestroyType.js +6 -1
  27. package/browser/Enums/Types/DivType.js +5 -1
  28. package/browser/Enums/Types/EasingType.js +30 -1
  29. package/browser/Enums/Types/EventType.js +15 -1
  30. package/browser/Enums/Types/GradientType.js +6 -1
  31. package/browser/Enums/Types/InteractorType.js +5 -1
  32. package/browser/Enums/Types/ParticleOutType.js +6 -1
  33. package/browser/Enums/Types/StartValueType.js +6 -1
  34. package/browser/Options/Classes/AnimationOptions.js +4 -2
  35. package/browser/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
  36. package/browser/Options/Classes/Interactivity/Events/Events.js +1 -1
  37. package/browser/Options/Classes/Interactivity/Interactivity.js +2 -1
  38. package/browser/Options/Classes/ManualParticle.js +2 -1
  39. package/browser/Options/Classes/Options.js +14 -12
  40. package/browser/Options/Classes/Particles/Collisions/Collisions.js +2 -1
  41. package/browser/Options/Classes/Particles/Move/Move.js +2 -1
  42. package/browser/Options/Classes/Particles/Move/MoveCenter.js +2 -1
  43. package/browser/Options/Classes/Particles/Move/OutModes.js +2 -1
  44. package/browser/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
  45. package/browser/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
  46. package/browser/Options/Classes/Particles/ParticlesOptions.js +1 -1
  47. package/browser/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
  48. package/browser/Options/Classes/Responsive.js +5 -4
  49. package/browser/Options/Classes/Theme/ThemeDefault.js +2 -1
  50. package/browser/Types/RangeType.js +5 -1
  51. package/browser/Utils/CanvasUtils.js +13 -7
  52. package/browser/Utils/ColorUtils.js +17 -9
  53. package/browser/Utils/EventDispatcher.js +1 -1
  54. package/browser/Utils/HslColorManager.js +11 -4
  55. package/browser/Utils/NumberUtils.js +28 -14
  56. package/browser/Utils/RgbColorManager.js +11 -4
  57. package/browser/Utils/Utils.js +37 -31
  58. package/cjs/Core/Canvas.js +27 -22
  59. package/cjs/Core/Container.js +57 -44
  60. package/cjs/Core/Engine.js +82 -74
  61. package/cjs/Core/Particle.js +29 -15
  62. package/cjs/Core/Particles.js +23 -24
  63. package/cjs/Core/Utils/EventListeners.js +18 -17
  64. package/cjs/Core/Utils/ExternalInteractorBase.js +2 -1
  65. package/cjs/Core/Utils/InteractionManager.js +3 -2
  66. package/cjs/Core/Utils/ParticlesInteractorBase.js +2 -1
  67. package/cjs/Core/Utils/QuadTree.js +1 -1
  68. package/cjs/Core/Utils/Ranges.js +5 -4
  69. package/cjs/Enums/AnimationStatus.js +6 -0
  70. package/cjs/Enums/Directions/MoveDirection.js +15 -0
  71. package/cjs/Enums/Directions/OutModeDirection.js +8 -0
  72. package/cjs/Enums/Directions/RotateDirection.js +7 -0
  73. package/cjs/Enums/InteractivityDetect.js +7 -0
  74. package/cjs/Enums/Modes/AnimationMode.js +8 -0
  75. package/cjs/Enums/Modes/CollisionMode.js +7 -0
  76. package/cjs/Enums/Modes/LimitMode.js +6 -0
  77. package/cjs/Enums/Modes/OutMode.js +9 -0
  78. package/cjs/Enums/Modes/PixelMode.js +6 -0
  79. package/cjs/Enums/Modes/ResponsiveMode.js +6 -0
  80. package/cjs/Enums/Modes/ThemeMode.js +7 -0
  81. package/cjs/Enums/Types/AlterType.js +6 -0
  82. package/cjs/Enums/Types/DestroyType.js +7 -0
  83. package/cjs/Enums/Types/DivType.js +6 -0
  84. package/cjs/Enums/Types/EasingType.js +31 -0
  85. package/cjs/Enums/Types/EventType.js +16 -0
  86. package/cjs/Enums/Types/GradientType.js +7 -0
  87. package/cjs/Enums/Types/InteractorType.js +6 -0
  88. package/cjs/Enums/Types/ParticleOutType.js +7 -0
  89. package/cjs/Enums/Types/StartValueType.js +7 -0
  90. package/cjs/Options/Classes/AnimationOptions.js +4 -2
  91. package/cjs/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
  92. package/cjs/Options/Classes/Interactivity/Events/Events.js +1 -1
  93. package/cjs/Options/Classes/Interactivity/Interactivity.js +2 -1
  94. package/cjs/Options/Classes/ManualParticle.js +2 -1
  95. package/cjs/Options/Classes/Options.js +14 -12
  96. package/cjs/Options/Classes/Particles/Collisions/Collisions.js +2 -1
  97. package/cjs/Options/Classes/Particles/Move/Move.js +2 -1
  98. package/cjs/Options/Classes/Particles/Move/MoveCenter.js +2 -1
  99. package/cjs/Options/Classes/Particles/Move/OutModes.js +2 -1
  100. package/cjs/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
  101. package/cjs/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
  102. package/cjs/Options/Classes/Particles/ParticlesOptions.js +1 -1
  103. package/cjs/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
  104. package/cjs/Options/Classes/Responsive.js +5 -4
  105. package/cjs/Options/Classes/Theme/ThemeDefault.js +2 -1
  106. package/cjs/Types/RangeType.js +6 -0
  107. package/cjs/Utils/CanvasUtils.js +24 -19
  108. package/cjs/Utils/ColorUtils.js +37 -30
  109. package/cjs/Utils/EventDispatcher.js +1 -1
  110. package/cjs/Utils/HslColorManager.js +11 -4
  111. package/cjs/Utils/NumberUtils.js +54 -38
  112. package/cjs/Utils/OptionsUtils.js +2 -3
  113. package/cjs/Utils/RgbColorManager.js +11 -4
  114. package/cjs/Utils/TypeUtils.js +6 -7
  115. package/cjs/Utils/Utils.js +66 -61
  116. package/cjs/init.js +1 -2
  117. package/esm/Core/Canvas.js +27 -22
  118. package/esm/Core/Container.js +57 -44
  119. package/esm/Core/Engine.js +82 -74
  120. package/esm/Core/Particle.js +29 -15
  121. package/esm/Core/Particles.js +23 -24
  122. package/esm/Core/Utils/EventListeners.js +18 -17
  123. package/esm/Core/Utils/ExternalInteractorBase.js +2 -1
  124. package/esm/Core/Utils/InteractionManager.js +3 -2
  125. package/esm/Core/Utils/ParticlesInteractorBase.js +2 -1
  126. package/esm/Core/Utils/QuadTree.js +1 -1
  127. package/esm/Core/Utils/Ranges.js +5 -4
  128. package/esm/Enums/AnimationStatus.js +5 -1
  129. package/esm/Enums/Directions/MoveDirection.js +14 -1
  130. package/esm/Enums/Directions/OutModeDirection.js +7 -1
  131. package/esm/Enums/Directions/RotateDirection.js +6 -1
  132. package/esm/Enums/InteractivityDetect.js +6 -1
  133. package/esm/Enums/Modes/AnimationMode.js +7 -1
  134. package/esm/Enums/Modes/CollisionMode.js +6 -1
  135. package/esm/Enums/Modes/LimitMode.js +5 -1
  136. package/esm/Enums/Modes/OutMode.js +8 -1
  137. package/esm/Enums/Modes/PixelMode.js +5 -1
  138. package/esm/Enums/Modes/ResponsiveMode.js +5 -1
  139. package/esm/Enums/Modes/ThemeMode.js +6 -1
  140. package/esm/Enums/Types/AlterType.js +5 -1
  141. package/esm/Enums/Types/DestroyType.js +6 -1
  142. package/esm/Enums/Types/DivType.js +5 -1
  143. package/esm/Enums/Types/EasingType.js +30 -1
  144. package/esm/Enums/Types/EventType.js +15 -1
  145. package/esm/Enums/Types/GradientType.js +6 -1
  146. package/esm/Enums/Types/InteractorType.js +5 -1
  147. package/esm/Enums/Types/ParticleOutType.js +6 -1
  148. package/esm/Enums/Types/StartValueType.js +6 -1
  149. package/esm/Options/Classes/AnimationOptions.js +4 -2
  150. package/esm/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
  151. package/esm/Options/Classes/Interactivity/Events/Events.js +1 -1
  152. package/esm/Options/Classes/Interactivity/Interactivity.js +2 -1
  153. package/esm/Options/Classes/ManualParticle.js +2 -1
  154. package/esm/Options/Classes/Options.js +14 -12
  155. package/esm/Options/Classes/Particles/Collisions/Collisions.js +2 -1
  156. package/esm/Options/Classes/Particles/Move/Move.js +2 -1
  157. package/esm/Options/Classes/Particles/Move/MoveCenter.js +2 -1
  158. package/esm/Options/Classes/Particles/Move/OutModes.js +2 -1
  159. package/esm/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
  160. package/esm/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
  161. package/esm/Options/Classes/Particles/ParticlesOptions.js +1 -1
  162. package/esm/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
  163. package/esm/Options/Classes/Responsive.js +5 -4
  164. package/esm/Options/Classes/Theme/ThemeDefault.js +2 -1
  165. package/esm/Types/RangeType.js +5 -1
  166. package/esm/Utils/CanvasUtils.js +13 -7
  167. package/esm/Utils/ColorUtils.js +17 -9
  168. package/esm/Utils/EventDispatcher.js +1 -1
  169. package/esm/Utils/HslColorManager.js +11 -4
  170. package/esm/Utils/NumberUtils.js +28 -14
  171. package/esm/Utils/RgbColorManager.js +11 -4
  172. package/esm/Utils/Utils.js +37 -31
  173. package/package.json +1 -1
  174. package/report.html +1 -1
  175. package/tsparticles.engine.js +327 -225
  176. package/tsparticles.engine.min.js +1 -1
  177. package/tsparticles.engine.min.js.LICENSE.txt +1 -1
  178. package/types/Core/Container.d.ts +4 -2
  179. package/types/Core/Engine.d.ts +6 -5
  180. package/types/Core/Interfaces/IPlugin.d.ts +3 -4
  181. package/types/Core/Interfaces/IShapeDrawer.d.ts +1 -0
  182. package/types/Core/Particle.d.ts +1 -0
  183. package/types/Enums/AnimationStatus.d.ts +1 -1
  184. package/types/Enums/Directions/MoveDirection.d.ts +1 -1
  185. package/types/Enums/Directions/OutModeDirection.d.ts +1 -1
  186. package/types/Enums/Directions/RotateDirection.d.ts +1 -1
  187. package/types/Enums/InteractivityDetect.d.ts +1 -1
  188. package/types/Enums/Modes/AnimationMode.d.ts +1 -1
  189. package/types/Enums/Modes/CollisionMode.d.ts +1 -1
  190. package/types/Enums/Modes/LimitMode.d.ts +1 -1
  191. package/types/Enums/Modes/OutMode.d.ts +1 -1
  192. package/types/Enums/Modes/PixelMode.d.ts +1 -1
  193. package/types/Enums/Modes/ResponsiveMode.d.ts +1 -1
  194. package/types/Enums/Modes/ThemeMode.d.ts +1 -1
  195. package/types/Enums/Types/AlterType.d.ts +1 -1
  196. package/types/Enums/Types/DestroyType.d.ts +1 -1
  197. package/types/Enums/Types/DivType.d.ts +1 -1
  198. package/types/Enums/Types/EasingType.d.ts +1 -1
  199. package/types/Enums/Types/EventType.d.ts +1 -1
  200. package/types/Enums/Types/GradientType.d.ts +1 -1
  201. package/types/Enums/Types/InteractorType.d.ts +1 -1
  202. package/types/Enums/Types/ParticleOutType.d.ts +1 -1
  203. package/types/Enums/Types/StartValueType.d.ts +1 -1
  204. package/types/Options/Classes/Options.d.ts +2 -1
  205. package/types/Options/Classes/Responsive.d.ts +2 -2
  206. package/types/Options/Classes/Theme/Theme.d.ts +2 -2
  207. package/types/Options/Interfaces/IResponsive.d.ts +2 -3
  208. package/types/Options/Interfaces/Theme/ITheme.d.ts +2 -3
  209. package/types/Types/RangeType.d.ts +1 -1
  210. package/types/Utils/NumberUtils.d.ts +3 -0
  211. package/umd/Core/Canvas.js +27 -22
  212. package/umd/Core/Container.js +58 -45
  213. package/umd/Core/Engine.js +83 -99
  214. package/umd/Core/Particle.js +30 -16
  215. package/umd/Core/Particles.js +24 -25
  216. package/umd/Core/Utils/EventListeners.js +19 -18
  217. package/umd/Core/Utils/ExternalInteractorBase.js +3 -2
  218. package/umd/Core/Utils/InteractionManager.js +4 -3
  219. package/umd/Core/Utils/ParticlesInteractorBase.js +3 -2
  220. package/umd/Core/Utils/QuadTree.js +1 -1
  221. package/umd/Core/Utils/Ranges.js +6 -5
  222. package/umd/Enums/AnimationStatus.js +6 -0
  223. package/umd/Enums/Directions/MoveDirection.js +15 -0
  224. package/umd/Enums/Directions/OutModeDirection.js +8 -0
  225. package/umd/Enums/Directions/RotateDirection.js +7 -0
  226. package/umd/Enums/InteractivityDetect.js +7 -0
  227. package/umd/Enums/Modes/AnimationMode.js +8 -0
  228. package/umd/Enums/Modes/CollisionMode.js +7 -0
  229. package/umd/Enums/Modes/LimitMode.js +6 -0
  230. package/umd/Enums/Modes/OutMode.js +9 -0
  231. package/umd/Enums/Modes/PixelMode.js +6 -0
  232. package/umd/Enums/Modes/ResponsiveMode.js +6 -0
  233. package/umd/Enums/Modes/ThemeMode.js +7 -0
  234. package/umd/Enums/Types/AlterType.js +6 -0
  235. package/umd/Enums/Types/DestroyType.js +7 -0
  236. package/umd/Enums/Types/DivType.js +6 -0
  237. package/umd/Enums/Types/EasingType.js +31 -0
  238. package/umd/Enums/Types/EventType.js +16 -0
  239. package/umd/Enums/Types/GradientType.js +7 -0
  240. package/umd/Enums/Types/InteractorType.js +6 -0
  241. package/umd/Enums/Types/ParticleOutType.js +7 -0
  242. package/umd/Enums/Types/StartValueType.js +7 -0
  243. package/umd/Options/Classes/AnimationOptions.js +5 -3
  244. package/umd/Options/Classes/Interactivity/Events/DivEvent.js +3 -2
  245. package/umd/Options/Classes/Interactivity/Events/Events.js +1 -1
  246. package/umd/Options/Classes/Interactivity/Interactivity.js +3 -2
  247. package/umd/Options/Classes/ManualParticle.js +3 -2
  248. package/umd/Options/Classes/Options.js +15 -13
  249. package/umd/Options/Classes/Particles/Collisions/Collisions.js +3 -2
  250. package/umd/Options/Classes/Particles/Move/Move.js +3 -2
  251. package/umd/Options/Classes/Particles/Move/MoveCenter.js +3 -2
  252. package/umd/Options/Classes/Particles/Move/OutModes.js +3 -2
  253. package/umd/Options/Classes/Particles/Number/ParticlesNumberLimit.js +3 -2
  254. package/umd/Options/Classes/Particles/Opacity/OpacityAnimation.js +3 -2
  255. package/umd/Options/Classes/Particles/ParticlesOptions.js +1 -1
  256. package/umd/Options/Classes/Particles/Size/SizeAnimation.js +3 -2
  257. package/umd/Options/Classes/Responsive.js +6 -5
  258. package/umd/Options/Classes/Theme/ThemeDefault.js +3 -2
  259. package/umd/Types/RangeType.js +6 -0
  260. package/umd/Utils/CanvasUtils.js +25 -20
  261. package/umd/Utils/ColorUtils.js +38 -31
  262. package/umd/Utils/EventDispatcher.js +1 -1
  263. package/umd/Utils/HslColorManager.js +11 -4
  264. package/umd/Utils/NumberUtils.js +55 -39
  265. package/umd/Utils/OptionsUtils.js +2 -3
  266. package/umd/Utils/RgbColorManager.js +11 -4
  267. package/umd/Utils/TypeUtils.js +6 -7
  268. package/umd/Utils/Utils.js +67 -62
  269. package/umd/init.js +1 -2
  270. package/174.min.js +0 -2
  271. package/174.min.js.LICENSE.txt +0 -1
  272. package/dist_browser_Core_Container_js.js +0 -102
@@ -1,11 +1,13 @@
1
1
  import { errorPrefix, generatedAttribute } from "./Utils/Constants.js";
2
2
  import { executeOnSingleOrMultiple, getLogger, itemFromSingleOrMultiple } from "../Utils/Utils.js";
3
+ import { Container } from "./Container.js";
3
4
  import { EventDispatcher } from "../Utils/EventDispatcher.js";
5
+ import { EventType } from "../Enums/Types/EventType.js";
4
6
  import { getRandom } from "../Utils/NumberUtils.js";
5
7
  async function getItemsFromInitializer(container, map, initializers, force = false) {
6
8
  let res = map.get(container);
7
9
  if (!res || force) {
8
- res = await Promise.all([...initializers.values()].map((t) => t(container)));
10
+ res = await Promise.all([...initializers.values()].map(t => t(container)));
9
11
  map.set(container, res);
10
12
  }
11
13
  return res;
@@ -22,6 +24,46 @@ async function getDataFromUrl(data) {
22
24
  getLogger().error(`${errorPrefix} ${response.status} while retrieving config file`);
23
25
  return data.fallback;
24
26
  }
27
+ const generatedTrue = "true", generatedFalse = "false", canvasTag = "canvas", getCanvasFromContainer = (domContainer) => {
28
+ let canvasEl;
29
+ if (domContainer instanceof HTMLCanvasElement || domContainer.tagName.toLowerCase() === canvasTag) {
30
+ canvasEl = domContainer;
31
+ if (!canvasEl.dataset[generatedAttribute]) {
32
+ canvasEl.dataset[generatedAttribute] = generatedFalse;
33
+ }
34
+ }
35
+ else {
36
+ const existingCanvases = domContainer.getElementsByTagName(canvasTag);
37
+ if (existingCanvases.length) {
38
+ const firstIndex = 0;
39
+ canvasEl = existingCanvases[firstIndex];
40
+ canvasEl.dataset[generatedAttribute] = generatedFalse;
41
+ }
42
+ else {
43
+ canvasEl = document.createElement(canvasTag);
44
+ canvasEl.dataset[generatedAttribute] = generatedTrue;
45
+ domContainer.appendChild(canvasEl);
46
+ }
47
+ }
48
+ const fullPercent = "100%";
49
+ if (!canvasEl.style.width) {
50
+ canvasEl.style.width = fullPercent;
51
+ }
52
+ if (!canvasEl.style.height) {
53
+ canvasEl.style.height = fullPercent;
54
+ }
55
+ return canvasEl;
56
+ }, getDomContainer = (id, source) => {
57
+ let domContainer = source ?? document.getElementById(id);
58
+ if (domContainer) {
59
+ return domContainer;
60
+ }
61
+ domContainer = document.createElement("div");
62
+ domContainer.id = id;
63
+ domContainer.dataset[generatedAttribute] = generatedTrue;
64
+ document.body.append(domContainer);
65
+ return domContainer;
66
+ };
25
67
  export class Engine {
26
68
  constructor() {
27
69
  this._configs = new Map();
@@ -49,16 +91,19 @@ export class Engine {
49
91
  }
50
92
  return res;
51
93
  }
94
+ get items() {
95
+ return this._domArray;
96
+ }
52
97
  get version() {
53
- return "3.3.0";
98
+ return "3.5.0";
54
99
  }
55
100
  addConfig(config) {
56
101
  const key = config.key ?? config.name ?? "default";
57
102
  this._configs.set(key, config);
58
- this._eventDispatcher.dispatchEvent("configAdded", { data: { name: key, config } });
103
+ this._eventDispatcher.dispatchEvent(EventType.configAdded, { data: { name: key, config } });
59
104
  }
60
105
  async addEffect(effect, drawer, refresh = true) {
61
- executeOnSingleOrMultiple(effect, (type) => {
106
+ executeOnSingleOrMultiple(effect, type => {
62
107
  if (!this.getEffectDrawer(type)) {
63
108
  this.effectDrawers.set(type, drawer);
64
109
  }
@@ -98,12 +143,13 @@ export class Engine {
98
143
  }
99
144
  await this.refresh(refresh);
100
145
  }
101
- async addShape(shape, drawer, refresh = true) {
102
- executeOnSingleOrMultiple(shape, (type) => {
103
- if (!this.getShapeDrawer(type)) {
104
- this.shapeDrawers.set(type, drawer);
146
+ async addShape(drawer, refresh = true) {
147
+ for (const validType of drawer.validTypes) {
148
+ if (this.getShapeDrawer(validType)) {
149
+ continue;
105
150
  }
106
- });
151
+ this.shapeDrawers.set(validType, drawer);
152
+ }
107
153
  await this.refresh(refresh);
108
154
  }
109
155
  clearPlugins(container) {
@@ -115,16 +161,10 @@ export class Engine {
115
161
  this._eventDispatcher.dispatchEvent(type, args);
116
162
  }
117
163
  dom() {
118
- return this._domArray;
164
+ return this.items;
119
165
  }
120
166
  domItem(index) {
121
- const dom = this.dom(), item = dom[index];
122
- if (!item || item.destroyed) {
123
- const deleteCount = 1;
124
- dom.splice(index, deleteCount);
125
- return;
126
- }
127
- return item;
167
+ return this.item(index);
128
168
  }
129
169
  async getAvailablePlugins(container) {
130
170
  const res = new Map();
@@ -139,16 +179,16 @@ export class Engine {
139
179
  return this.effectDrawers.get(type);
140
180
  }
141
181
  async getInteractors(container, force = false) {
142
- return await getItemsFromInitializer(container, this.interactors, this._initializers.interactors, force);
182
+ return getItemsFromInitializer(container, this.interactors, this._initializers.interactors, force);
143
183
  }
144
184
  async getMovers(container, force = false) {
145
- return await getItemsFromInitializer(container, this.movers, this._initializers.movers, force);
185
+ return getItemsFromInitializer(container, this.movers, this._initializers.movers, force);
146
186
  }
147
187
  getPathGenerator(type) {
148
188
  return this.pathGenerators.get(type);
149
189
  }
150
190
  getPlugin(plugin) {
151
- return this.plugins.find((t) => t.id === plugin);
191
+ return this.plugins.find(t => t.id === plugin);
152
192
  }
153
193
  getPreset(preset) {
154
194
  return this.presets.get(preset);
@@ -163,7 +203,7 @@ export class Engine {
163
203
  return this.shapeDrawers.keys();
164
204
  }
165
205
  async getUpdaters(container, force = false) {
166
- return await getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
206
+ return getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
167
207
  }
168
208
  init() {
169
209
  if (this._initialized) {
@@ -171,89 +211,57 @@ export class Engine {
171
211
  }
172
212
  this._initialized = true;
173
213
  }
214
+ item(index) {
215
+ const { items } = this, item = items[index];
216
+ if (!item || item.destroyed) {
217
+ const deleteCount = 1;
218
+ items.splice(index, deleteCount);
219
+ return;
220
+ }
221
+ return item;
222
+ }
174
223
  async load(params) {
175
224
  const randomFactor = 10000, id = params.id ?? params.element?.id ?? `tsparticles${Math.floor(getRandom() * randomFactor)}`, { index, url } = params, options = url ? await getDataFromUrl({ fallback: params.options, url, index }) : params.options;
176
- let domContainer = params.element ?? document.getElementById(id);
177
- if (!domContainer) {
178
- domContainer = document.createElement("div");
179
- domContainer.id = id;
180
- document.body.append(domContainer);
181
- }
182
- const currentOptions = itemFromSingleOrMultiple(options, index), dom = this.dom(), oldIndex = dom.findIndex((v) => v.id.description === id), minIndex = 0;
225
+ const currentOptions = itemFromSingleOrMultiple(options, index), { items } = this, oldIndex = items.findIndex(v => v.id.description === id), minIndex = 0, newItem = new Container(this, id, currentOptions);
183
226
  if (oldIndex >= minIndex) {
184
- const old = this.domItem(oldIndex);
227
+ const old = this.item(oldIndex), one = 1, none = 0, deleteCount = old ? one : none;
185
228
  if (old && !old.destroyed) {
186
- old.destroy();
187
- const deleteCount = 1;
188
- dom.splice(oldIndex, deleteCount);
189
- }
190
- }
191
- let canvasEl;
192
- if (domContainer.tagName.toLowerCase() === "canvas") {
193
- canvasEl = domContainer;
194
- canvasEl.dataset[generatedAttribute] = "false";
195
- }
196
- else {
197
- const existingCanvases = domContainer.getElementsByTagName("canvas");
198
- if (existingCanvases.length) {
199
- const firstIndex = 0;
200
- canvasEl = existingCanvases[firstIndex];
201
- canvasEl.dataset[generatedAttribute] = "false";
229
+ old.destroy(false);
202
230
  }
203
- else {
204
- canvasEl = document.createElement("canvas");
205
- canvasEl.dataset[generatedAttribute] = "true";
206
- domContainer.appendChild(canvasEl);
207
- }
208
- }
209
- if (!canvasEl.style.width) {
210
- canvasEl.style.width = "100%";
211
- }
212
- if (!canvasEl.style.height) {
213
- canvasEl.style.height = "100%";
214
- }
215
- const { Container } = await import("./Container.js"), newItem = new Container(this, id, currentOptions);
216
- if (oldIndex >= minIndex) {
217
- const deleteCount = 0;
218
- dom.splice(oldIndex, deleteCount, newItem);
231
+ items.splice(oldIndex, deleteCount, newItem);
219
232
  }
220
233
  else {
221
- dom.push(newItem);
234
+ items.push(newItem);
222
235
  }
236
+ const domContainer = getDomContainer(id, params.element), canvasEl = getCanvasFromContainer(domContainer);
223
237
  newItem.canvas.loadCanvas(canvasEl);
224
238
  await newItem.start();
225
239
  return newItem;
226
240
  }
227
241
  loadOptions(options, sourceOptions) {
228
- for (const plugin of this.plugins) {
229
- plugin.loadOptions(options, sourceOptions);
230
- }
242
+ this.plugins.forEach(plugin => plugin.loadOptions?.(options, sourceOptions));
231
243
  }
232
244
  loadParticlesOptions(container, options, ...sourceOptions) {
233
245
  const updaters = this.updaters.get(container);
234
246
  if (!updaters) {
235
247
  return;
236
248
  }
237
- for (const updater of updaters) {
238
- updater.loadOptions?.(options, ...sourceOptions);
239
- }
249
+ updaters.forEach(updater => updater.loadOptions?.(options, ...sourceOptions));
240
250
  }
241
251
  async refresh(refresh = true) {
242
252
  if (!refresh) {
243
253
  return;
244
254
  }
245
- await Promise.all(this.dom().map((t) => t.refresh()));
255
+ await Promise.all(this.items.map(t => t.refresh()));
246
256
  }
247
257
  removeEventListener(type, listener) {
248
258
  this._eventDispatcher.removeEventListener(type, listener);
249
259
  }
250
260
  setOnClickHandler(callback) {
251
- const dom = this.dom();
252
- if (!dom.length) {
261
+ const { items } = this;
262
+ if (!items.length) {
253
263
  throw new Error(`${errorPrefix} can only set click handlers after calling tsParticles.load()`);
254
264
  }
255
- for (const domItem of dom) {
256
- domItem.addClickHandler(callback);
257
- }
265
+ items.forEach(item => item.addClickHandler(callback));
258
266
  }
259
267
  }
@@ -3,10 +3,15 @@ import { calcExactPositionOrRandomFromSize, clamp, degToRad, getDistance, getPar
3
3
  import { deepExtend, getPosition, initParticleNumericAnimationValue, isInArray, itemFromSingleOrMultiple, } from "../Utils/Utils.js";
4
4
  import { errorPrefix, millisecondsToSeconds } from "./Utils/Constants.js";
5
5
  import { getHslFromAnimation, rangeColorToRgb } from "../Utils/ColorUtils.js";
6
+ import { EventType } from "../Enums/Types/EventType.js";
6
7
  import { Interactivity } from "../Options/Classes/Interactivity/Interactivity.js";
8
+ import { MoveDirection } from "../Enums/Directions/MoveDirection.js";
9
+ import { OutMode } from "../Enums/Modes/OutMode.js";
10
+ import { ParticleOutType } from "../Enums/Types/ParticleOutType.js";
11
+ import { PixelMode } from "../Enums/Modes/PixelMode.js";
7
12
  import { alterHsl } from "../Utils/CanvasUtils.js";
8
13
  import { loadParticlesOptions } from "../Utils/OptionsUtils.js";
9
- const defaultRetryCount = 0, double = 2, half = 0.5, squareExp = 2;
14
+ const defaultRetryCount = 0, double = 2, half = 0.5, squareExp = 2, randomString = "random";
10
15
  function loadEffectData(effect, effectOptions, id, reduceDuplicates) {
11
16
  const effectData = effectOptions.options[effect];
12
17
  if (!effectData) {
@@ -55,7 +60,7 @@ export class Particle {
55
60
  }), pos = Vector3d.create(exactPosition.x, exactPosition.y, zIndex), radius = this.getRadius(), outModes = this.options.move.outModes, fixHorizontal = (outMode) => {
56
61
  fixOutMode({
57
62
  outMode,
58
- checkModes: ["bounce"],
63
+ checkModes: [OutMode.bounce],
59
64
  coord: pos.x,
60
65
  maxCoord: container.canvas.size.width,
61
66
  setCb: (value) => (pos.x += value),
@@ -64,7 +69,7 @@ export class Particle {
64
69
  }, fixVertical = (outMode) => {
65
70
  fixOutMode({
66
71
  outMode,
67
- checkModes: ["bounce"],
72
+ checkModes: [OutMode.bounce],
68
73
  coord: pos.y,
69
74
  maxCoord: container.canvas.size.height,
70
75
  setCb: (value) => (pos.y += value),
@@ -83,7 +88,7 @@ export class Particle {
83
88
  };
84
89
  this._calculateVelocity = () => {
85
90
  const baseVelocity = getParticleBaseVelocity(this.direction), res = baseVelocity.copy(), moveOptions = this.options.move;
86
- if (moveOptions.direction === "inside" || moveOptions.direction === "outside") {
91
+ if (moveOptions.direction === MoveDirection.inside || moveOptions.direction === MoveDirection.outside) {
87
92
  return res;
88
93
  }
89
94
  const rad = degToRad(getRangeValue(moveOptions.angle.value)), radOffset = degToRad(getRangeValue(moveOptions.angle.offset)), range = {
@@ -111,9 +116,9 @@ export class Particle {
111
116
  if (retries >= minRetries && tryCount > retries) {
112
117
  throw new Error(`${errorPrefix} particle is overlapping and can't be placed`);
113
118
  }
114
- return !!this.container.particles.find((particle) => getDistance(pos, particle.position) < radius + particle.getRadius());
119
+ return !!this.container.particles.find(particle => getDistance(pos, particle.position) < radius + particle.getRadius());
115
120
  };
116
- this._getRollColor = (color) => {
121
+ this._getRollColor = color => {
117
122
  if (!color || !this.roll || (!this.backColor && !this.roll.alter)) {
118
123
  return color;
119
124
  }
@@ -129,7 +134,7 @@ export class Particle {
129
134
  }
130
135
  return color;
131
136
  };
132
- this._initPosition = (position) => {
137
+ this._initPosition = position => {
133
138
  const container = this.container, zIndexValue = getRangeValue(this.options.zIndex.value), minZ = 0;
134
139
  this.position = this._calcPosition(container, position, clamp(zIndexValue, minZ, container.zLayers));
135
140
  this.initialPosition = this.position.copy();
@@ -137,15 +142,15 @@ export class Particle {
137
142
  this.moveCenter = {
138
143
  ...getPosition(this.options.move.center, canvasSize),
139
144
  radius: this.options.move.center.radius ?? defaultRadius,
140
- mode: this.options.move.center.mode ?? "percent",
145
+ mode: this.options.move.center.mode ?? PixelMode.percent,
141
146
  };
142
147
  this.direction = getParticleDirectionAngle(this.options.move.direction, this.position, this.moveCenter);
143
148
  switch (this.options.move.direction) {
144
- case "inside":
145
- this.outType = "inside";
149
+ case MoveDirection.inside:
150
+ this.outType = ParticleOutType.inside;
146
151
  break;
147
- case "outside":
148
- this.outType = "outside";
152
+ case MoveDirection.outside:
153
+ this.outType = ParticleOutType.outside;
149
154
  break;
150
155
  }
151
156
  this.offset = Vector.origin;
@@ -168,7 +173,7 @@ export class Particle {
168
173
  updater.particleDestroyed?.(this, override);
169
174
  }
170
175
  pathGenerator?.reset(this);
171
- this._engine.dispatchEvent("particleDestroyed", {
176
+ this._engine.dispatchEvent(EventType.particleDestroyed, {
172
177
  container: this.container,
173
178
  data: {
174
179
  particle: this,
@@ -213,14 +218,15 @@ export class Particle {
213
218
  this.lastPathTime = 0;
214
219
  this.destroyed = false;
215
220
  this.unbreakable = false;
221
+ this.isRotating = false;
216
222
  this.rotation = 0;
217
223
  this.misplaced = false;
218
224
  this.retina = {
219
225
  maxDistance: {},
220
226
  };
221
- this.outType = "normal";
227
+ this.outType = ParticleOutType.normal;
222
228
  this.ignoresResizeRatio = true;
223
- const pxRatio = container.retina.pixelRatio, mainOptions = container.actualOptions, particlesOptions = loadParticlesOptions(this._engine, container, mainOptions.particles), effectType = particlesOptions.effect.type, shapeType = particlesOptions.shape.type, { reduceDuplicates } = particlesOptions;
229
+ const pxRatio = container.retina.pixelRatio, mainOptions = container.actualOptions, particlesOptions = loadParticlesOptions(this._engine, container, mainOptions.particles), { reduceDuplicates } = particlesOptions, effectType = particlesOptions.effect.type, shapeType = particlesOptions.shape.type;
224
230
  this.effect = itemFromSingleOrMultiple(effectType, this.id, reduceDuplicates);
225
231
  this.shape = itemFromSingleOrMultiple(shapeType, this.id, reduceDuplicates);
226
232
  const effectOptions = particlesOptions.effect, shapeOptions = particlesOptions.shape;
@@ -240,6 +246,14 @@ export class Particle {
240
246
  }
241
247
  }
242
248
  }
249
+ if (this.effect === randomString) {
250
+ const availableEffects = [...this.container.effectDrawers.keys()];
251
+ this.effect = availableEffects[Math.floor(Math.random() * availableEffects.length)];
252
+ }
253
+ if (this.shape === randomString) {
254
+ const availableShapes = [...this.container.shapeDrawers.keys()];
255
+ this.shape = availableShapes[Math.floor(Math.random() * availableShapes.length)];
256
+ }
243
257
  this.effectData = loadEffectData(this.effect, effectOptions, this.id, reduceDuplicates);
244
258
  this.shapeData = loadShapeData(this.shape, shapeOptions, this.id, reduceDuplicates);
245
259
  particlesOptions.load(overrideOptions);
@@ -1,5 +1,7 @@
1
1
  import { getLogger, getPosition } from "../Utils/Utils.js";
2
+ import { EventType } from "../Enums/Types/EventType.js";
2
3
  import { InteractionManager } from "./Utils/InteractionManager.js";
4
+ import { LimitMode } from "../Enums/Modes/LimitMode.js";
3
5
  import { Particle } from "./Particle.js";
4
6
  import { Point } from "./Utils/Point.js";
5
7
  import { QuadTree } from "./Utils/QuadTree.js";
@@ -13,9 +15,7 @@ const qTreeRectangle = (canvasSize) => {
13
15
  export class Particles {
14
16
  constructor(engine, container) {
15
17
  this._addToPool = (...particles) => {
16
- for (const particle of particles) {
17
- this._pool.push(particle);
18
- }
18
+ this._pool.push(...particles);
19
19
  };
20
20
  this._applyDensity = (options, manualCount, group) => {
21
21
  const numberOptions = options.number;
@@ -28,7 +28,7 @@ export class Particles {
28
28
  }
29
29
  return;
30
30
  }
31
- const densityFactor = this._initDensityFactor(numberOptions.density), optParticlesNumber = numberOptions.value, minLimit = 0, optParticlesLimit = numberOptions.limit.value > minLimit ? numberOptions.limit.value : optParticlesNumber, particlesNumber = Math.min(optParticlesNumber, optParticlesLimit) * densityFactor + manualCount, particlesCount = Math.min(this.count, this.filter((t) => t.group === group).length);
31
+ const densityFactor = this._initDensityFactor(numberOptions.density), optParticlesNumber = numberOptions.value, minLimit = 0, optParticlesLimit = numberOptions.limit.value > minLimit ? numberOptions.limit.value : optParticlesNumber, particlesNumber = Math.min(optParticlesNumber, optParticlesLimit) * densityFactor + manualCount, particlesCount = Math.min(this.count, this.filter(t => t.group === group).length);
32
32
  if (group === undefined) {
33
33
  this._limit = numberOptions.limit.value * densityFactor;
34
34
  }
@@ -42,7 +42,7 @@ export class Particles {
42
42
  this.removeQuantity(particlesCount - particlesNumber, group);
43
43
  }
44
44
  };
45
- this._initDensityFactor = (densityOptions) => {
45
+ this._initDensityFactor = densityOptions => {
46
46
  const container = this._container, defaultFactor = 1;
47
47
  if (!container.canvas.element || !densityOptions.enable) {
48
48
  return defaultFactor;
@@ -67,7 +67,7 @@ export class Particles {
67
67
  this._array.push(particle);
68
68
  this._zArray.push(particle);
69
69
  this._nextId++;
70
- this._engine.dispatchEvent("particleAdded", {
70
+ this._engine.dispatchEvent(EventType.particleAdded, {
71
71
  container: this._container,
72
72
  data: {
73
73
  particle,
@@ -88,7 +88,7 @@ export class Particles {
88
88
  this._array.splice(index, deleteCount);
89
89
  this._zArray.splice(zIdx, deleteCount);
90
90
  particle.destroy(override);
91
- this._engine.dispatchEvent("particleRemoved", {
91
+ this._engine.dispatchEvent(EventType.particleRemoved, {
92
92
  container: this._container,
93
93
  data: {
94
94
  particle,
@@ -119,23 +119,24 @@ export class Particles {
119
119
  }
120
120
  addManualParticles() {
121
121
  const container = this._container, options = container.actualOptions;
122
- for (const particle of options.manualParticles) {
123
- this.addParticle(particle.position ? getPosition(particle.position, container.canvas.size) : undefined, particle.options);
124
- }
122
+ options.manualParticles.forEach(p => this.addParticle(p.position ? getPosition(p.position, container.canvas.size) : undefined, p.options));
125
123
  }
126
124
  addParticle(position, overrideOptions, group, initializer) {
127
- const limitOptions = this._container.actualOptions.particles.number.limit, limit = group === undefined ? this._limit : this._groupLimits.get(group) ?? this._limit, currentCount = this.count, minLimit = 0;
125
+ const limitMode = this._container.actualOptions.particles.number.limit.mode, limit = group === undefined ? this._limit : this._groupLimits.get(group) ?? this._limit, currentCount = this.count, minLimit = 0;
128
126
  if (limit > minLimit) {
129
- if (limitOptions.mode === "delete") {
130
- const countOffset = 1, minCount = 0, countToRemove = currentCount + countOffset - limit;
131
- if (countToRemove > minCount) {
132
- this.removeQuantity(countToRemove);
133
- }
134
- }
135
- else if (limitOptions.mode === "wait") {
136
- if (currentCount >= limit) {
137
- return;
127
+ switch (limitMode) {
128
+ case LimitMode.delete: {
129
+ const countOffset = 1, minCount = 0, countToRemove = currentCount + countOffset - limit;
130
+ if (countToRemove > minCount) {
131
+ this.removeQuantity(countToRemove);
132
+ }
133
+ break;
138
134
  }
135
+ case LimitMode.wait:
136
+ if (currentCount >= limit) {
137
+ return;
138
+ }
139
+ break;
139
140
  }
140
141
  }
141
142
  return this._pushParticle(position, overrideOptions, group, initializer);
@@ -181,9 +182,7 @@ export class Particles {
181
182
  await this.initPlugins();
182
183
  let handled = false;
183
184
  for (const [, plugin] of container.plugins) {
184
- if (plugin.particlesInitialization !== undefined) {
185
- handled = plugin.particlesInitialization();
186
- }
185
+ handled = plugin.particlesInitialization?.() ?? handled;
187
186
  if (handled) {
188
187
  break;
189
188
  }
@@ -298,7 +297,7 @@ export class Particles {
298
297
  this._array = this.filter(checkDelete);
299
298
  this._zArray = this._zArray.filter(checkDelete);
300
299
  for (const particle of particlesToDelete) {
301
- this._engine.dispatchEvent("particleRemoved", {
300
+ this._engine.dispatchEvent(EventType.particleRemoved, {
302
301
  container: this._container,
303
302
  data: {
304
303
  particle,
@@ -1,5 +1,6 @@
1
1
  import { executeOnSingleOrMultiple, safeMatchMedia } from "../../Utils/Utils.js";
2
2
  import { millisecondsToSeconds, mouseDownEvent, mouseLeaveEvent, mouseMoveEvent, mouseOutEvent, mouseUpEvent, resizeEvent, touchCancelEvent, touchEndEvent, touchMoveEvent, touchStartEvent, visibilityChangeEvent, } from "./Constants.js";
3
+ import { InteractivityDetect } from "../../Enums/InteractivityDetect.js";
3
4
  import { isBoolean } from "../../Utils/TypeUtils.js";
4
5
  const double = 2;
5
6
  function manageListener(element, event, handler, add, options) {
@@ -21,7 +22,7 @@ function manageListener(element, event, handler, add, options) {
21
22
  export class EventListeners {
22
23
  constructor(container) {
23
24
  this.container = container;
24
- this._doMouseTouchClick = (e) => {
25
+ this._doMouseTouchClick = e => {
25
26
  const container = this.container, options = container.actualOptions;
26
27
  if (this._canPush) {
27
28
  const mouseInteractivity = container.interactivity.mouse, mousePos = mouseInteractivity.position;
@@ -31,7 +32,7 @@ export class EventListeners {
31
32
  mouseInteractivity.clickPosition = { ...mousePos };
32
33
  mouseInteractivity.clickTime = new Date().getTime();
33
34
  const onClick = options.interactivity.events.onClick;
34
- executeOnSingleOrMultiple(onClick.mode, (mode) => this.container.handleClickMode(mode));
35
+ executeOnSingleOrMultiple(onClick.mode, mode => this.container.handleClickMode(mode));
35
36
  }
36
37
  if (e.type === "touchend") {
37
38
  const touchDelay = 500;
@@ -39,8 +40,8 @@ export class EventListeners {
39
40
  }
40
41
  };
41
42
  this._handleThemeChange = (e) => {
42
- const mediaEvent = e, container = this.container, options = container.options, defaultThemes = options.defaultThemes, themeName = mediaEvent.matches ? defaultThemes.dark : defaultThemes.light, theme = options.themes.find((theme) => theme.name === themeName);
43
- if (theme && theme.default.auto) {
43
+ const mediaEvent = e, container = this.container, options = container.options, defaultThemes = options.defaultThemes, themeName = mediaEvent.matches ? defaultThemes.dark : defaultThemes.light, theme = options.themes.find(theme => theme.name === themeName);
44
+ if (theme?.default.auto) {
44
45
  void container.loadTheme(themeName);
45
46
  }
46
47
  };
@@ -50,7 +51,7 @@ export class EventListeners {
50
51
  if (!options.pauseOnBlur) {
51
52
  return;
52
53
  }
53
- if (document && document.hidden) {
54
+ if (document?.hidden) {
54
55
  container.pageHidden = true;
55
56
  container.pause();
56
57
  }
@@ -102,14 +103,14 @@ export class EventListeners {
102
103
  manageListener(interactivityEl, mouseLeaveTmpEvent, handlers.mouseLeave, add);
103
104
  manageListener(interactivityEl, touchCancelEvent, handlers.touchCancel, add);
104
105
  };
105
- this._manageListeners = (add) => {
106
+ this._manageListeners = add => {
106
107
  const handlers = this._handlers, container = this.container, options = container.actualOptions, detectType = options.interactivity.detectsOn, canvasEl = container.canvas.element;
107
108
  let mouseLeaveTmpEvent = mouseLeaveEvent;
108
- if (detectType === "window") {
109
+ if (detectType === InteractivityDetect.window) {
109
110
  container.interactivity.element = window;
110
111
  mouseLeaveTmpEvent = mouseOutEvent;
111
112
  }
112
- else if (detectType === "parent" && canvasEl) {
113
+ else if (detectType === InteractivityDetect.parent && canvasEl) {
113
114
  container.interactivity.element = canvasEl.parentElement ?? canvasEl.parentNode;
114
115
  }
115
116
  else {
@@ -122,7 +123,7 @@ export class EventListeners {
122
123
  manageListener(document, visibilityChangeEvent, handlers.visibilityChange, add, false);
123
124
  }
124
125
  };
125
- this._manageMediaMatch = (add) => {
126
+ this._manageMediaMatch = add => {
126
127
  const handlers = this._handlers, mediaMatch = safeMatchMedia("(prefers-color-scheme: dark)");
127
128
  if (!mediaMatch) {
128
129
  return;
@@ -141,7 +142,7 @@ export class EventListeners {
141
142
  mediaMatch.removeListener(handlers.oldThemeChange);
142
143
  }
143
144
  };
144
- this._manageResize = (add) => {
145
+ this._manageResize = add => {
145
146
  const handlers = this._handlers, container = this.container, options = container.actualOptions;
146
147
  if (!options.interactivity.events.resize) {
147
148
  return;
@@ -160,7 +161,7 @@ export class EventListeners {
160
161
  }
161
162
  else if (!this._resizeObserver && add && canvasEl) {
162
163
  this._resizeObserver = new ResizeObserver((entries) => {
163
- const entry = entries.find((e) => e.target === canvasEl);
164
+ const entry = entries.find(e => e.target === canvasEl);
164
165
  if (!entry) {
165
166
  return;
166
167
  }
@@ -178,7 +179,7 @@ export class EventListeners {
178
179
  mouse.clicking = true;
179
180
  mouse.downPosition = mouse.position;
180
181
  };
181
- this._mouseTouchClick = (e) => {
182
+ this._mouseTouchClick = e => {
182
183
  const container = this.container, options = container.actualOptions, { mouse } = container.interactivity;
183
184
  mouse.inside = true;
184
185
  let handled = false;
@@ -213,7 +214,7 @@ export class EventListeners {
213
214
  mouse.inside = false;
214
215
  mouse.clicking = false;
215
216
  };
216
- this._mouseTouchMove = (e) => {
217
+ this._mouseTouchMove = e => {
217
218
  const container = this.container, options = container.actualOptions, interactivity = container.interactivity, canvasEl = container.canvas.element;
218
219
  if (!interactivity?.element) {
219
220
  return;
@@ -232,7 +233,7 @@ export class EventListeners {
232
233
  };
233
234
  }
234
235
  }
235
- else if (options.interactivity.detectsOn === "parent") {
236
+ else if (options.interactivity.detectsOn === InteractivityDetect.parent) {
236
237
  const source = mouseEvent.target, target = mouseEvent.currentTarget;
237
238
  if (source && target && canvasEl) {
238
239
  const sourceRect = source.getBoundingClientRect(), targetRect = target.getBoundingClientRect(), canvasRect = canvasEl.getBoundingClientRect();
@@ -273,21 +274,21 @@ export class EventListeners {
273
274
  interactivity.mouse.position = pos;
274
275
  interactivity.status = mouseMoveEvent;
275
276
  };
276
- this._touchEnd = (e) => {
277
+ this._touchEnd = e => {
277
278
  const evt = e, touches = Array.from(evt.changedTouches);
278
279
  for (const touch of touches) {
279
280
  this._touches.delete(touch.identifier);
280
281
  }
281
282
  this._mouseTouchFinish();
282
283
  };
283
- this._touchEndClick = (e) => {
284
+ this._touchEndClick = e => {
284
285
  const evt = e, touches = Array.from(evt.changedTouches);
285
286
  for (const touch of touches) {
286
287
  this._touches.delete(touch.identifier);
287
288
  }
288
289
  this._mouseTouchClick(e);
289
290
  };
290
- this._touchStart = (e) => {
291
+ this._touchStart = e => {
291
292
  const evt = e, touches = Array.from(evt.changedTouches);
292
293
  for (const touch of touches) {
293
294
  this._touches.set(touch.identifier, performance.now());
@@ -1,6 +1,7 @@
1
+ import { InteractorType } from "../../Enums/Types/InteractorType.js";
1
2
  export class ExternalInteractorBase {
2
3
  constructor(container) {
3
- this.type = "external";
4
+ this.type = InteractorType.external;
4
5
  this.container = container;
5
6
  }
6
7
  }
@@ -1,3 +1,4 @@
1
+ import { InteractorType } from "../../Enums/Types/InteractorType.js";
1
2
  export class InteractionManager {
2
3
  constructor(engine, container) {
3
4
  this.container = container;
@@ -24,10 +25,10 @@ export class InteractionManager {
24
25
  this._particleInteractors = [];
25
26
  for (const interactor of this._interactors) {
26
27
  switch (interactor.type) {
27
- case "external":
28
+ case InteractorType.external:
28
29
  this._externalInteractors.push(interactor);
29
30
  break;
30
- case "particles":
31
+ case InteractorType.particles:
31
32
  this._particleInteractors.push(interactor);
32
33
  break;
33
34
  }