@tsparticles/engine 3.2.2 → 3.4.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 (281) hide show
  1. package/README.md +0 -4
  2. package/browser/Core/Canvas.js +34 -29
  3. package/browser/Core/Container.js +60 -47
  4. package/browser/Core/Engine.js +82 -74
  5. package/browser/Core/Particle.js +40 -26
  6. package/browser/Core/Particles.js +51 -52
  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 +7 -6
  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 +27 -21
  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 +11 -10
  56. package/browser/Utils/RgbColorManager.js +11 -4
  57. package/browser/Utils/Utils.js +37 -31
  58. package/cjs/Core/Canvas.js +34 -29
  59. package/cjs/Core/Container.js +60 -47
  60. package/cjs/Core/Engine.js +82 -97
  61. package/cjs/Core/Particle.js +40 -26
  62. package/cjs/Core/Particles.js +52 -76
  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 +7 -6
  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 +27 -21
  108. package/cjs/Utils/ColorUtils.js +17 -9
  109. package/cjs/Utils/EventDispatcher.js +1 -1
  110. package/cjs/Utils/HslColorManager.js +11 -4
  111. package/cjs/Utils/NumberUtils.js +11 -10
  112. package/cjs/Utils/RgbColorManager.js +11 -4
  113. package/cjs/Utils/Utils.js +37 -31
  114. package/esm/Core/Canvas.js +34 -29
  115. package/esm/Core/Container.js +60 -47
  116. package/esm/Core/Engine.js +82 -74
  117. package/esm/Core/Particle.js +40 -26
  118. package/esm/Core/Particles.js +51 -52
  119. package/esm/Core/Utils/EventListeners.js +18 -17
  120. package/esm/Core/Utils/ExternalInteractorBase.js +2 -1
  121. package/esm/Core/Utils/InteractionManager.js +7 -6
  122. package/esm/Core/Utils/ParticlesInteractorBase.js +2 -1
  123. package/esm/Core/Utils/QuadTree.js +1 -1
  124. package/esm/Core/Utils/Ranges.js +5 -4
  125. package/esm/Enums/AnimationStatus.js +5 -1
  126. package/esm/Enums/Directions/MoveDirection.js +14 -1
  127. package/esm/Enums/Directions/OutModeDirection.js +7 -1
  128. package/esm/Enums/Directions/RotateDirection.js +6 -1
  129. package/esm/Enums/InteractivityDetect.js +6 -1
  130. package/esm/Enums/Modes/AnimationMode.js +7 -1
  131. package/esm/Enums/Modes/CollisionMode.js +6 -1
  132. package/esm/Enums/Modes/LimitMode.js +5 -1
  133. package/esm/Enums/Modes/OutMode.js +8 -1
  134. package/esm/Enums/Modes/PixelMode.js +5 -1
  135. package/esm/Enums/Modes/ResponsiveMode.js +5 -1
  136. package/esm/Enums/Modes/ThemeMode.js +6 -1
  137. package/esm/Enums/Types/AlterType.js +5 -1
  138. package/esm/Enums/Types/DestroyType.js +6 -1
  139. package/esm/Enums/Types/DivType.js +5 -1
  140. package/esm/Enums/Types/EasingType.js +30 -1
  141. package/esm/Enums/Types/EventType.js +15 -1
  142. package/esm/Enums/Types/GradientType.js +6 -1
  143. package/esm/Enums/Types/InteractorType.js +5 -1
  144. package/esm/Enums/Types/ParticleOutType.js +6 -1
  145. package/esm/Enums/Types/StartValueType.js +6 -1
  146. package/esm/Options/Classes/AnimationOptions.js +4 -2
  147. package/esm/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
  148. package/esm/Options/Classes/Interactivity/Events/Events.js +1 -1
  149. package/esm/Options/Classes/Interactivity/Interactivity.js +2 -1
  150. package/esm/Options/Classes/ManualParticle.js +2 -1
  151. package/esm/Options/Classes/Options.js +14 -12
  152. package/esm/Options/Classes/Particles/Collisions/Collisions.js +2 -1
  153. package/esm/Options/Classes/Particles/Move/Move.js +2 -1
  154. package/esm/Options/Classes/Particles/Move/MoveCenter.js +2 -1
  155. package/esm/Options/Classes/Particles/Move/OutModes.js +2 -1
  156. package/esm/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
  157. package/esm/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
  158. package/esm/Options/Classes/Particles/ParticlesOptions.js +1 -1
  159. package/esm/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
  160. package/esm/Options/Classes/Responsive.js +5 -4
  161. package/esm/Options/Classes/Theme/ThemeDefault.js +2 -1
  162. package/esm/Types/RangeType.js +5 -1
  163. package/esm/Utils/CanvasUtils.js +27 -21
  164. package/esm/Utils/ColorUtils.js +17 -9
  165. package/esm/Utils/EventDispatcher.js +1 -1
  166. package/esm/Utils/HslColorManager.js +11 -4
  167. package/esm/Utils/NumberUtils.js +11 -10
  168. package/esm/Utils/RgbColorManager.js +11 -4
  169. package/esm/Utils/Utils.js +37 -31
  170. package/package.json +1 -1
  171. package/report.html +1 -1
  172. package/tsparticles.engine.js +327 -225
  173. package/tsparticles.engine.min.js +1 -1
  174. package/tsparticles.engine.min.js.LICENSE.txt +1 -1
  175. package/types/Core/Canvas.d.ts +4 -4
  176. package/types/Core/Container.d.ts +4 -2
  177. package/types/Core/Engine.d.ts +6 -5
  178. package/types/Core/Interfaces/IContainerPlugin.d.ts +4 -4
  179. package/types/Core/Interfaces/IEffectDrawer.d.ts +3 -3
  180. package/types/Core/Interfaces/IExternalInteractor.d.ts +1 -1
  181. package/types/Core/Interfaces/IMovePathGenerator.d.ts +2 -2
  182. package/types/Core/Interfaces/IParticleMover.d.ts +2 -2
  183. package/types/Core/Interfaces/IParticleUpdater.d.ts +2 -2
  184. package/types/Core/Interfaces/IParticlesInteractor.d.ts +1 -1
  185. package/types/Core/Interfaces/IPlugin.d.ts +3 -4
  186. package/types/Core/Interfaces/IShapeDrawer.d.ts +5 -4
  187. package/types/Core/Particle.d.ts +3 -2
  188. package/types/Core/Particles.d.ts +7 -7
  189. package/types/Core/Utils/ExternalInteractorBase.d.ts +1 -1
  190. package/types/Core/Utils/InteractionManager.d.ts +2 -2
  191. package/types/Core/Utils/ParticlesInteractorBase.d.ts +1 -1
  192. package/types/Enums/AnimationStatus.d.ts +1 -1
  193. package/types/Enums/Directions/MoveDirection.d.ts +1 -1
  194. package/types/Enums/Directions/OutModeDirection.d.ts +1 -1
  195. package/types/Enums/Directions/RotateDirection.d.ts +1 -1
  196. package/types/Enums/InteractivityDetect.d.ts +1 -1
  197. package/types/Enums/Modes/AnimationMode.d.ts +1 -1
  198. package/types/Enums/Modes/CollisionMode.d.ts +1 -1
  199. package/types/Enums/Modes/LimitMode.d.ts +1 -1
  200. package/types/Enums/Modes/OutMode.d.ts +1 -1
  201. package/types/Enums/Modes/PixelMode.d.ts +1 -1
  202. package/types/Enums/Modes/ResponsiveMode.d.ts +1 -1
  203. package/types/Enums/Modes/ThemeMode.d.ts +1 -1
  204. package/types/Enums/Types/AlterType.d.ts +1 -1
  205. package/types/Enums/Types/DestroyType.d.ts +1 -1
  206. package/types/Enums/Types/DivType.d.ts +1 -1
  207. package/types/Enums/Types/EasingType.d.ts +1 -1
  208. package/types/Enums/Types/EventType.d.ts +1 -1
  209. package/types/Enums/Types/GradientType.d.ts +1 -1
  210. package/types/Enums/Types/InteractorType.d.ts +1 -1
  211. package/types/Enums/Types/ParticleOutType.d.ts +1 -1
  212. package/types/Enums/Types/StartValueType.d.ts +1 -1
  213. package/types/Options/Classes/Options.d.ts +2 -1
  214. package/types/Options/Classes/Responsive.d.ts +2 -2
  215. package/types/Options/Classes/Theme/Theme.d.ts +2 -2
  216. package/types/Options/Interfaces/IResponsive.d.ts +2 -3
  217. package/types/Options/Interfaces/Theme/ITheme.d.ts +2 -3
  218. package/types/Types/RangeType.d.ts +1 -1
  219. package/types/Utils/CanvasUtils.d.ts +6 -6
  220. package/umd/Core/Canvas.js +34 -29
  221. package/umd/Core/Container.js +61 -48
  222. package/umd/Core/Engine.js +83 -99
  223. package/umd/Core/Particle.js +41 -27
  224. package/umd/Core/Particles.js +53 -78
  225. package/umd/Core/Utils/EventListeners.js +19 -18
  226. package/umd/Core/Utils/ExternalInteractorBase.js +3 -2
  227. package/umd/Core/Utils/InteractionManager.js +8 -7
  228. package/umd/Core/Utils/ParticlesInteractorBase.js +3 -2
  229. package/umd/Core/Utils/QuadTree.js +1 -1
  230. package/umd/Core/Utils/Ranges.js +6 -5
  231. package/umd/Enums/AnimationStatus.js +6 -0
  232. package/umd/Enums/Directions/MoveDirection.js +15 -0
  233. package/umd/Enums/Directions/OutModeDirection.js +8 -0
  234. package/umd/Enums/Directions/RotateDirection.js +7 -0
  235. package/umd/Enums/InteractivityDetect.js +7 -0
  236. package/umd/Enums/Modes/AnimationMode.js +8 -0
  237. package/umd/Enums/Modes/CollisionMode.js +7 -0
  238. package/umd/Enums/Modes/LimitMode.js +6 -0
  239. package/umd/Enums/Modes/OutMode.js +9 -0
  240. package/umd/Enums/Modes/PixelMode.js +6 -0
  241. package/umd/Enums/Modes/ResponsiveMode.js +6 -0
  242. package/umd/Enums/Modes/ThemeMode.js +7 -0
  243. package/umd/Enums/Types/AlterType.js +6 -0
  244. package/umd/Enums/Types/DestroyType.js +7 -0
  245. package/umd/Enums/Types/DivType.js +6 -0
  246. package/umd/Enums/Types/EasingType.js +31 -0
  247. package/umd/Enums/Types/EventType.js +16 -0
  248. package/umd/Enums/Types/GradientType.js +7 -0
  249. package/umd/Enums/Types/InteractorType.js +6 -0
  250. package/umd/Enums/Types/ParticleOutType.js +7 -0
  251. package/umd/Enums/Types/StartValueType.js +7 -0
  252. package/umd/Options/Classes/AnimationOptions.js +5 -3
  253. package/umd/Options/Classes/Interactivity/Events/DivEvent.js +3 -2
  254. package/umd/Options/Classes/Interactivity/Events/Events.js +1 -1
  255. package/umd/Options/Classes/Interactivity/Interactivity.js +3 -2
  256. package/umd/Options/Classes/ManualParticle.js +3 -2
  257. package/umd/Options/Classes/Options.js +15 -13
  258. package/umd/Options/Classes/Particles/Collisions/Collisions.js +3 -2
  259. package/umd/Options/Classes/Particles/Move/Move.js +3 -2
  260. package/umd/Options/Classes/Particles/Move/MoveCenter.js +3 -2
  261. package/umd/Options/Classes/Particles/Move/OutModes.js +3 -2
  262. package/umd/Options/Classes/Particles/Number/ParticlesNumberLimit.js +3 -2
  263. package/umd/Options/Classes/Particles/Opacity/OpacityAnimation.js +3 -2
  264. package/umd/Options/Classes/Particles/ParticlesOptions.js +1 -1
  265. package/umd/Options/Classes/Particles/Size/SizeAnimation.js +3 -2
  266. package/umd/Options/Classes/Responsive.js +6 -5
  267. package/umd/Options/Classes/Theme/ThemeDefault.js +3 -2
  268. package/umd/Types/RangeType.js +6 -0
  269. package/umd/Utils/CanvasUtils.js +28 -22
  270. package/umd/Utils/ColorUtils.js +18 -10
  271. package/umd/Utils/EventDispatcher.js +1 -1
  272. package/umd/Utils/HslColorManager.js +11 -4
  273. package/umd/Utils/NumberUtils.js +12 -11
  274. package/umd/Utils/RgbColorManager.js +11 -4
  275. package/umd/Utils/Utils.js +38 -32
  276. package/373.min.js +0 -2
  277. package/373.min.js.LICENSE.txt +0 -1
  278. package/438.min.js +0 -2
  279. package/438.min.js.LICENSE.txt +0 -1
  280. package/dist_browser_Core_Container_js.js +0 -92
  281. package/dist_browser_Core_Particle_js.js +0 -32
@@ -4,7 +4,7 @@
4
4
  if (v !== undefined) module.exports = v;
5
5
  }
6
6
  else if (typeof define === "function" && define.amd) {
7
- define(["require", "exports", "./Utils/Constants.js", "../Utils/Utils.js", "./Canvas.js", "./Utils/EventListeners.js", "../Options/Classes/Options.js", "./Particles.js", "./Retina.js", "../Utils/NumberUtils.js", "../Utils/OptionsUtils.js"], factory);
7
+ define(["require", "exports", "./Utils/Constants.js", "../Utils/Utils.js", "./Canvas.js", "./Utils/EventListeners.js", "../Enums/Types/EventType.js", "../Options/Classes/Options.js", "./Particles.js", "./Retina.js", "../Utils/NumberUtils.js", "../Utils/OptionsUtils.js"], factory);
8
8
  }
9
9
  })(function (require, exports) {
10
10
  "use strict";
@@ -14,6 +14,7 @@
14
14
  const Utils_js_1 = require("../Utils/Utils.js");
15
15
  const Canvas_js_1 = require("./Canvas.js");
16
16
  const EventListeners_js_1 = require("./Utils/EventListeners.js");
17
+ const EventType_js_1 = require("../Enums/Types/EventType.js");
17
18
  const Options_js_1 = require("../Options/Classes/Options.js");
18
19
  const Particles_js_1 = require("./Particles.js");
19
20
  const Retina_js_1 = require("./Retina.js");
@@ -36,7 +37,7 @@
36
37
  }
37
38
  class Container {
38
39
  constructor(engine, id, sourceOptions) {
39
- this._intersectionManager = (entries) => {
40
+ this._intersectionManager = entries => {
40
41
  if (!guardCheck(this) || !this.actualOptions.pauseOnOutsideViewport) {
41
42
  return;
42
43
  }
@@ -52,7 +53,7 @@
52
53
  }
53
54
  }
54
55
  };
55
- this._nextFrame = async (timestamp) => {
56
+ this._nextFrame = (timestamp) => {
56
57
  try {
57
58
  if (!this._smooth &&
58
59
  this._lastFrameTime !== undefined &&
@@ -68,7 +69,7 @@
68
69
  this.draw(false);
69
70
  return;
70
71
  }
71
- await this.particles.draw(delta);
72
+ this.particles.draw(delta);
72
73
  if (!this.alive()) {
73
74
  this.destroy();
74
75
  return;
@@ -95,6 +96,7 @@
95
96
  this._lastFrameTime = 0;
96
97
  this.zLayers = 100;
97
98
  this.pageHidden = false;
99
+ this._clickHandlers = new Map();
98
100
  this._sourceOptions = sourceOptions;
99
101
  this._initialSourceOptions = sourceOptions;
100
102
  this.retina = new Retina_js_1.Retina(this);
@@ -113,8 +115,8 @@
113
115
  this._options = loadContainerOptions(this._engine, this);
114
116
  this.actualOptions = loadContainerOptions(this._engine, this);
115
117
  this._eventListeners = new EventListeners_js_1.EventListeners(this);
116
- this._intersectionObserver = (0, Utils_js_1.safeIntersectionObserver)((entries) => this._intersectionManager(entries));
117
- this._engine.dispatchEvent("containerBuilt", { container: this });
118
+ this._intersectionObserver = (0, Utils_js_1.safeIntersectionObserver)(entries => this._intersectionManager(entries));
119
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerBuilt, { container: this });
118
120
  }
119
121
  get animationStatus() {
120
122
  return !this._paused && !this.pageHidden && guardCheck(this);
@@ -142,8 +144,7 @@
142
144
  y: pos.y * pxRatio,
143
145
  }, particles = this.particles.quadTree.queryCircle(posRetina, radius * pxRatio);
144
146
  callback(e, particles);
145
- };
146
- const clickHandler = (e) => {
147
+ }, clickHandler = (e) => {
147
148
  if (!guardCheck(this)) {
148
149
  return;
149
150
  }
@@ -152,27 +153,23 @@
152
153
  y: mouseEvent.offsetY || mouseEvent.clientY,
153
154
  }, radius = 1;
154
155
  clickOrTouchHandler(e, pos, radius);
155
- };
156
- const touchStartHandler = () => {
156
+ }, touchStartHandler = () => {
157
157
  if (!guardCheck(this)) {
158
158
  return;
159
159
  }
160
160
  touched = true;
161
161
  touchMoved = false;
162
- };
163
- const touchMoveHandler = () => {
162
+ }, touchMoveHandler = () => {
164
163
  if (!guardCheck(this)) {
165
164
  return;
166
165
  }
167
166
  touchMoved = true;
168
- };
169
- const touchEndHandler = (e) => {
167
+ }, touchEndHandler = (e) => {
170
168
  if (!guardCheck(this)) {
171
169
  return;
172
170
  }
173
171
  if (touched && !touchMoved) {
174
- const touchEvent = e;
175
- const lengthOffset = 1;
172
+ const touchEvent = e, lengthOffset = 1;
176
173
  let lastTouch = touchEvent.touches[touchEvent.touches.length - lengthOffset];
177
174
  if (!lastTouch) {
178
175
  lastTouch = touchEvent.changedTouches[touchEvent.changedTouches.length - lengthOffset];
@@ -188,8 +185,7 @@
188
185
  }
189
186
  touched = false;
190
187
  touchMoved = false;
191
- };
192
- const touchCancelHandler = () => {
188
+ }, touchCancelHandler = () => {
193
189
  if (!guardCheck(this)) {
194
190
  return;
195
191
  }
@@ -197,11 +193,14 @@
197
193
  touchMoved = false;
198
194
  };
199
195
  let touched = false, touchMoved = false;
200
- el.addEventListener("click", clickHandler);
201
- el.addEventListener("touchstart", touchStartHandler);
202
- el.addEventListener("touchmove", touchMoveHandler);
203
- el.addEventListener("touchend", touchEndHandler);
204
- el.addEventListener("touchcancel", touchCancelHandler);
196
+ this._clickHandlers.set("click", clickHandler);
197
+ this._clickHandlers.set("touchstart", touchStartHandler);
198
+ this._clickHandlers.set("touchmove", touchMoveHandler);
199
+ this._clickHandlers.set("touchend", touchEndHandler);
200
+ this._clickHandlers.set("touchcancel", touchCancelHandler);
201
+ for (const [key, handler] of this._clickHandlers) {
202
+ el.addEventListener(key, handler);
203
+ }
205
204
  }
206
205
  addLifeTime(value) {
207
206
  this._lifeTime += value;
@@ -216,11 +215,21 @@
216
215
  alive() {
217
216
  return !this._duration || this._lifeTime <= this._duration;
218
217
  }
219
- destroy() {
218
+ clearClickHandlers() {
219
+ if (!guardCheck(this)) {
220
+ return;
221
+ }
222
+ for (const [key, handler] of this._clickHandlers) {
223
+ this.interactivity.element?.removeEventListener(key, handler);
224
+ }
225
+ this._clickHandlers.clear();
226
+ }
227
+ destroy(remove = true) {
220
228
  if (!guardCheck(this)) {
221
229
  return;
222
230
  }
223
231
  this.stop();
232
+ this.clearClickHandlers();
224
233
  this.particles.destroy();
225
234
  this.canvas.destroy();
226
235
  for (const [, effectDrawer] of this.effectDrawers) {
@@ -237,26 +246,28 @@
237
246
  }
238
247
  this._engine.clearPlugins(this);
239
248
  this.destroyed = true;
240
- const mainArr = this._engine.dom(), idx = mainArr.findIndex((t) => t === this), minIndex = 0;
241
- if (idx >= minIndex) {
242
- const deleteCount = 1;
243
- mainArr.splice(idx, deleteCount);
249
+ if (remove) {
250
+ const mainArr = this._engine.items, idx = mainArr.findIndex(t => t === this), minIndex = 0;
251
+ if (idx >= minIndex) {
252
+ const deleteCount = 1;
253
+ mainArr.splice(idx, deleteCount);
254
+ }
244
255
  }
245
- this._engine.dispatchEvent("containerDestroyed", { container: this });
256
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerDestroyed, { container: this });
246
257
  }
247
258
  draw(force) {
248
259
  if (!guardCheck(this)) {
249
260
  return;
250
261
  }
251
262
  let refreshTime = force;
252
- const frame = async (timestamp) => {
263
+ const frame = (timestamp) => {
253
264
  if (refreshTime) {
254
265
  this._lastFrameTime = undefined;
255
266
  refreshTime = false;
256
267
  }
257
- await this._nextFrame(timestamp);
268
+ this._nextFrame(timestamp);
258
269
  };
259
- this._drawAnimationFrame = requestAnimationFrame((timestamp) => void frame(timestamp));
270
+ this._drawAnimationFrame = requestAnimationFrame(timestamp => frame(timestamp));
260
271
  }
261
272
  async export(type, options = {}) {
262
273
  for (const [, plugin] of this.plugins) {
@@ -310,13 +321,14 @@
310
321
  this.updateActualOptions();
311
322
  this.canvas.initBackground();
312
323
  this.canvas.resize();
313
- this.zLayers = this.actualOptions.zLayers;
314
- this._duration = (0, NumberUtils_js_1.getRangeValue)(this.actualOptions.duration) * Constants_js_1.millisecondsToSeconds;
315
- this._delay = (0, NumberUtils_js_1.getRangeValue)(this.actualOptions.delay) * Constants_js_1.millisecondsToSeconds;
324
+ const { zLayers, duration, delay, fpsLimit, smooth } = this.actualOptions;
325
+ this.zLayers = zLayers;
326
+ this._duration = (0, NumberUtils_js_1.getRangeValue)(duration) * Constants_js_1.millisecondsToSeconds;
327
+ this._delay = (0, NumberUtils_js_1.getRangeValue)(delay) * Constants_js_1.millisecondsToSeconds;
316
328
  this._lifeTime = 0;
317
329
  const defaultFpsLimit = 120, minFpsLimit = 0;
318
- this.fpsLimit = this.actualOptions.fpsLimit > minFpsLimit ? this.actualOptions.fpsLimit : defaultFpsLimit;
319
- this._smooth = this.actualOptions.smooth;
330
+ this.fpsLimit = fpsLimit > minFpsLimit ? fpsLimit : defaultFpsLimit;
331
+ this._smooth = smooth;
320
332
  for (const [, drawer] of this.effectDrawers) {
321
333
  await drawer.init?.(this);
322
334
  }
@@ -326,13 +338,13 @@
326
338
  for (const [, plugin] of this.plugins) {
327
339
  await plugin.init?.();
328
340
  }
329
- this._engine.dispatchEvent("containerInit", { container: this });
341
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerInit, { container: this });
330
342
  await this.particles.init();
331
- await this.particles.setDensity();
343
+ this.particles.setDensity();
332
344
  for (const [, plugin] of this.plugins) {
333
345
  plugin.particlesSetup?.();
334
346
  }
335
- this._engine.dispatchEvent("particlesSetup", { container: this });
347
+ this._engine.dispatchEvent(EventType_js_1.EventType.particlesSetup, { container: this });
336
348
  }
337
349
  async loadTheme(name) {
338
350
  if (!guardCheck(this)) {
@@ -358,7 +370,7 @@
358
370
  if (!this.pageHidden) {
359
371
  this._paused = true;
360
372
  }
361
- this._engine.dispatchEvent("containerPaused", { container: this });
373
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerPaused, { container: this });
362
374
  }
363
375
  play(force) {
364
376
  if (!guardCheck(this)) {
@@ -379,7 +391,7 @@
379
391
  }
380
392
  }
381
393
  }
382
- this._engine.dispatchEvent("containerPlay", { container: this });
394
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerPlay, { container: this });
383
395
  this.draw(needsUpdate ?? false);
384
396
  }
385
397
  async refresh() {
@@ -389,12 +401,13 @@
389
401
  this.stop();
390
402
  return this.start();
391
403
  }
392
- async reset() {
404
+ async reset(sourceOptions) {
393
405
  if (!guardCheck(this)) {
394
406
  return;
395
407
  }
396
- this._initialSourceOptions = undefined;
397
- this._options = loadContainerOptions(this._engine, this);
408
+ this._initialSourceOptions = sourceOptions;
409
+ this._sourceOptions = sourceOptions;
410
+ this._options = loadContainerOptions(this._engine, this, this._initialSourceOptions, this.sourceOptions);
398
411
  this.actualOptions = loadContainerOptions(this._engine, this, this._options);
399
412
  return this.refresh();
400
413
  }
@@ -404,7 +417,7 @@
404
417
  }
405
418
  await this.init();
406
419
  this.started = true;
407
- await new Promise((resolve) => {
420
+ await new Promise(resolve => {
408
421
  const start = async () => {
409
422
  this._eventListeners.addListeners();
410
423
  if (this.interactivity.element instanceof HTMLElement && this._intersectionObserver) {
@@ -413,7 +426,7 @@
413
426
  for (const [, plugin] of this.plugins) {
414
427
  await plugin.start?.();
415
428
  }
416
- this._engine.dispatchEvent("containerStarted", { container: this });
429
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerStarted, { container: this });
417
430
  this.play();
418
431
  resolve();
419
432
  };
@@ -444,7 +457,7 @@
444
457
  this.plugins.delete(key);
445
458
  }
446
459
  this._sourceOptions = this._options;
447
- this._engine.dispatchEvent("containerStopped", { container: this });
460
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerStopped, { container: this });
448
461
  }
449
462
  updateActualOptions() {
450
463
  this.actualOptions.responsive = [];
@@ -1,47 +1,25 @@
1
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
2
- if (k2 === undefined) k2 = k;
3
- var desc = Object.getOwnPropertyDescriptor(m, k);
4
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
5
- desc = { enumerable: true, get: function() { return m[k]; } };
6
- }
7
- Object.defineProperty(o, k2, desc);
8
- }) : (function(o, m, k, k2) {
9
- if (k2 === undefined) k2 = k;
10
- o[k2] = m[k];
11
- }));
12
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
13
- Object.defineProperty(o, "default", { enumerable: true, value: v });
14
- }) : function(o, v) {
15
- o["default"] = v;
16
- });
17
- var __importStar = (this && this.__importStar) || function (mod) {
18
- if (mod && mod.__esModule) return mod;
19
- var result = {};
20
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
21
- __setModuleDefault(result, mod);
22
- return result;
23
- };
24
1
  (function (factory) {
25
2
  if (typeof module === "object" && typeof module.exports === "object") {
26
3
  var v = factory(require, exports);
27
4
  if (v !== undefined) module.exports = v;
28
5
  }
29
6
  else if (typeof define === "function" && define.amd) {
30
- define(["require", "exports", "./Utils/Constants.js", "../Utils/Utils.js", "../Utils/EventDispatcher.js", "../Utils/NumberUtils.js"], factory);
7
+ define(["require", "exports", "./Utils/Constants.js", "../Utils/Utils.js", "./Container.js", "../Utils/EventDispatcher.js", "../Enums/Types/EventType.js", "../Utils/NumberUtils.js"], factory);
31
8
  }
32
9
  })(function (require, exports) {
33
10
  "use strict";
34
- var __syncRequire = typeof module === "object" && typeof module.exports === "object";
35
11
  Object.defineProperty(exports, "__esModule", { value: true });
36
12
  exports.Engine = void 0;
37
13
  const Constants_js_1 = require("./Utils/Constants.js");
38
14
  const Utils_js_1 = require("../Utils/Utils.js");
15
+ const Container_js_1 = require("./Container.js");
39
16
  const EventDispatcher_js_1 = require("../Utils/EventDispatcher.js");
17
+ const EventType_js_1 = require("../Enums/Types/EventType.js");
40
18
  const NumberUtils_js_1 = require("../Utils/NumberUtils.js");
41
19
  async function getItemsFromInitializer(container, map, initializers, force = false) {
42
20
  let res = map.get(container);
43
21
  if (!res || force) {
44
- res = await Promise.all([...initializers.values()].map((t) => t(container)));
22
+ res = await Promise.all([...initializers.values()].map(t => t(container)));
45
23
  map.set(container, res);
46
24
  }
47
25
  return res;
@@ -58,6 +36,46 @@ var __importStar = (this && this.__importStar) || function (mod) {
58
36
  (0, Utils_js_1.getLogger)().error(`${Constants_js_1.errorPrefix} ${response.status} while retrieving config file`);
59
37
  return data.fallback;
60
38
  }
39
+ const generatedTrue = "true", generatedFalse = "false", canvasTag = "canvas", getCanvasFromContainer = (domContainer) => {
40
+ let canvasEl;
41
+ if (domContainer instanceof HTMLCanvasElement || domContainer.tagName.toLowerCase() === canvasTag) {
42
+ canvasEl = domContainer;
43
+ if (!canvasEl.dataset[Constants_js_1.generatedAttribute]) {
44
+ canvasEl.dataset[Constants_js_1.generatedAttribute] = generatedFalse;
45
+ }
46
+ }
47
+ else {
48
+ const existingCanvases = domContainer.getElementsByTagName(canvasTag);
49
+ if (existingCanvases.length) {
50
+ const firstIndex = 0;
51
+ canvasEl = existingCanvases[firstIndex];
52
+ canvasEl.dataset[Constants_js_1.generatedAttribute] = generatedFalse;
53
+ }
54
+ else {
55
+ canvasEl = document.createElement(canvasTag);
56
+ canvasEl.dataset[Constants_js_1.generatedAttribute] = generatedTrue;
57
+ domContainer.appendChild(canvasEl);
58
+ }
59
+ }
60
+ const fullPercent = "100%";
61
+ if (!canvasEl.style.width) {
62
+ canvasEl.style.width = fullPercent;
63
+ }
64
+ if (!canvasEl.style.height) {
65
+ canvasEl.style.height = fullPercent;
66
+ }
67
+ return canvasEl;
68
+ }, getDomContainer = (id, source) => {
69
+ let domContainer = source ?? document.getElementById(id);
70
+ if (domContainer) {
71
+ return domContainer;
72
+ }
73
+ domContainer = document.createElement("div");
74
+ domContainer.id = id;
75
+ domContainer.dataset[Constants_js_1.generatedAttribute] = generatedTrue;
76
+ document.body.append(domContainer);
77
+ return domContainer;
78
+ };
61
79
  class Engine {
62
80
  constructor() {
63
81
  this._configs = new Map();
@@ -85,16 +103,19 @@ var __importStar = (this && this.__importStar) || function (mod) {
85
103
  }
86
104
  return res;
87
105
  }
106
+ get items() {
107
+ return this._domArray;
108
+ }
88
109
  get version() {
89
- return "3.2.2";
110
+ return "3.4.0";
90
111
  }
91
112
  addConfig(config) {
92
113
  const key = config.key ?? config.name ?? "default";
93
114
  this._configs.set(key, config);
94
- this._eventDispatcher.dispatchEvent("configAdded", { data: { name: key, config } });
115
+ this._eventDispatcher.dispatchEvent(EventType_js_1.EventType.configAdded, { data: { name: key, config } });
95
116
  }
96
117
  async addEffect(effect, drawer, refresh = true) {
97
- (0, Utils_js_1.executeOnSingleOrMultiple)(effect, (type) => {
118
+ (0, Utils_js_1.executeOnSingleOrMultiple)(effect, type => {
98
119
  if (!this.getEffectDrawer(type)) {
99
120
  this.effectDrawers.set(type, drawer);
100
121
  }
@@ -134,12 +155,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
134
155
  }
135
156
  await this.refresh(refresh);
136
157
  }
137
- async addShape(shape, drawer, refresh = true) {
138
- (0, Utils_js_1.executeOnSingleOrMultiple)(shape, (type) => {
139
- if (!this.getShapeDrawer(type)) {
140
- this.shapeDrawers.set(type, drawer);
158
+ async addShape(drawer, refresh = true) {
159
+ for (const validType of drawer.validTypes) {
160
+ if (this.getShapeDrawer(validType)) {
161
+ continue;
141
162
  }
142
- });
163
+ this.shapeDrawers.set(validType, drawer);
164
+ }
143
165
  await this.refresh(refresh);
144
166
  }
145
167
  clearPlugins(container) {
@@ -151,16 +173,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
151
173
  this._eventDispatcher.dispatchEvent(type, args);
152
174
  }
153
175
  dom() {
154
- return this._domArray;
176
+ return this.items;
155
177
  }
156
178
  domItem(index) {
157
- const dom = this.dom(), item = dom[index];
158
- if (!item || item.destroyed) {
159
- const deleteCount = 1;
160
- dom.splice(index, deleteCount);
161
- return;
162
- }
163
- return item;
179
+ return this.item(index);
164
180
  }
165
181
  async getAvailablePlugins(container) {
166
182
  const res = new Map();
@@ -175,16 +191,16 @@ var __importStar = (this && this.__importStar) || function (mod) {
175
191
  return this.effectDrawers.get(type);
176
192
  }
177
193
  async getInteractors(container, force = false) {
178
- return await getItemsFromInitializer(container, this.interactors, this._initializers.interactors, force);
194
+ return getItemsFromInitializer(container, this.interactors, this._initializers.interactors, force);
179
195
  }
180
196
  async getMovers(container, force = false) {
181
- return await getItemsFromInitializer(container, this.movers, this._initializers.movers, force);
197
+ return getItemsFromInitializer(container, this.movers, this._initializers.movers, force);
182
198
  }
183
199
  getPathGenerator(type) {
184
200
  return this.pathGenerators.get(type);
185
201
  }
186
202
  getPlugin(plugin) {
187
- return this.plugins.find((t) => t.id === plugin);
203
+ return this.plugins.find(t => t.id === plugin);
188
204
  }
189
205
  getPreset(preset) {
190
206
  return this.presets.get(preset);
@@ -199,7 +215,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
199
215
  return this.shapeDrawers.keys();
200
216
  }
201
217
  async getUpdaters(container, force = false) {
202
- return await getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
218
+ return getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
203
219
  }
204
220
  init() {
205
221
  if (this._initialized) {
@@ -207,90 +223,58 @@ var __importStar = (this && this.__importStar) || function (mod) {
207
223
  }
208
224
  this._initialized = true;
209
225
  }
226
+ item(index) {
227
+ const { items } = this, item = items[index];
228
+ if (!item || item.destroyed) {
229
+ const deleteCount = 1;
230
+ items.splice(index, deleteCount);
231
+ return;
232
+ }
233
+ return item;
234
+ }
210
235
  async load(params) {
211
236
  const randomFactor = 10000, id = params.id ?? params.element?.id ?? `tsparticles${Math.floor((0, NumberUtils_js_1.getRandom)() * randomFactor)}`, { index, url } = params, options = url ? await getDataFromUrl({ fallback: params.options, url, index }) : params.options;
212
- let domContainer = params.element ?? document.getElementById(id);
213
- if (!domContainer) {
214
- domContainer = document.createElement("div");
215
- domContainer.id = id;
216
- document.body.append(domContainer);
217
- }
218
- const currentOptions = (0, Utils_js_1.itemFromSingleOrMultiple)(options, index), dom = this.dom(), oldIndex = dom.findIndex((v) => v.id.description === id), minIndex = 0;
237
+ const currentOptions = (0, Utils_js_1.itemFromSingleOrMultiple)(options, index), { items } = this, oldIndex = items.findIndex(v => v.id.description === id), minIndex = 0, newItem = new Container_js_1.Container(this, id, currentOptions);
219
238
  if (oldIndex >= minIndex) {
220
- const old = this.domItem(oldIndex);
239
+ const old = this.item(oldIndex), one = 1, none = 0, deleteCount = old ? one : none;
221
240
  if (old && !old.destroyed) {
222
- old.destroy();
223
- const deleteCount = 1;
224
- dom.splice(oldIndex, deleteCount);
241
+ old.destroy(false);
225
242
  }
226
- }
227
- let canvasEl;
228
- if (domContainer.tagName.toLowerCase() === "canvas") {
229
- canvasEl = domContainer;
230
- canvasEl.dataset[Constants_js_1.generatedAttribute] = "false";
243
+ items.splice(oldIndex, deleteCount, newItem);
231
244
  }
232
245
  else {
233
- const existingCanvases = domContainer.getElementsByTagName("canvas");
234
- if (existingCanvases.length) {
235
- const firstIndex = 0;
236
- canvasEl = existingCanvases[firstIndex];
237
- canvasEl.dataset[Constants_js_1.generatedAttribute] = "false";
238
- }
239
- else {
240
- canvasEl = document.createElement("canvas");
241
- canvasEl.dataset[Constants_js_1.generatedAttribute] = "true";
242
- domContainer.appendChild(canvasEl);
243
- }
244
- }
245
- if (!canvasEl.style.width) {
246
- canvasEl.style.width = "100%";
247
- }
248
- if (!canvasEl.style.height) {
249
- canvasEl.style.height = "100%";
250
- }
251
- const { Container } = await (__syncRequire ? Promise.resolve().then(() => __importStar(require("./Container.js"))) : new Promise((resolve_1, reject_1) => { require(["./Container.js"], resolve_1, reject_1); }).then(__importStar)), newItem = new Container(this, id, currentOptions);
252
- if (oldIndex >= minIndex) {
253
- const deleteCount = 0;
254
- dom.splice(oldIndex, deleteCount, newItem);
255
- }
256
- else {
257
- dom.push(newItem);
246
+ items.push(newItem);
258
247
  }
248
+ const domContainer = getDomContainer(id, params.element), canvasEl = getCanvasFromContainer(domContainer);
259
249
  newItem.canvas.loadCanvas(canvasEl);
260
250
  await newItem.start();
261
251
  return newItem;
262
252
  }
263
253
  loadOptions(options, sourceOptions) {
264
- for (const plugin of this.plugins) {
265
- plugin.loadOptions(options, sourceOptions);
266
- }
254
+ this.plugins.forEach(plugin => plugin.loadOptions?.(options, sourceOptions));
267
255
  }
268
256
  loadParticlesOptions(container, options, ...sourceOptions) {
269
257
  const updaters = this.updaters.get(container);
270
258
  if (!updaters) {
271
259
  return;
272
260
  }
273
- for (const updater of updaters) {
274
- updater.loadOptions?.(options, ...sourceOptions);
275
- }
261
+ updaters.forEach(updater => updater.loadOptions?.(options, ...sourceOptions));
276
262
  }
277
263
  async refresh(refresh = true) {
278
264
  if (!refresh) {
279
265
  return;
280
266
  }
281
- await Promise.all(this.dom().map((t) => t.refresh()));
267
+ await Promise.all(this.items.map(t => t.refresh()));
282
268
  }
283
269
  removeEventListener(type, listener) {
284
270
  this._eventDispatcher.removeEventListener(type, listener);
285
271
  }
286
272
  setOnClickHandler(callback) {
287
- const dom = this.dom();
288
- if (!dom.length) {
273
+ const { items } = this;
274
+ if (!items.length) {
289
275
  throw new Error(`${Constants_js_1.errorPrefix} can only set click handlers after calling tsParticles.load()`);
290
276
  }
291
- for (const domItem of dom) {
292
- domItem.addClickHandler(callback);
293
- }
277
+ items.forEach(item => item.addClickHandler(callback));
294
278
  }
295
279
  }
296
280
  exports.Engine = Engine;