@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
@@ -5,6 +5,7 @@ const Constants_js_1 = require("./Utils/Constants.js");
5
5
  const Utils_js_1 = require("../Utils/Utils.js");
6
6
  const Canvas_js_1 = require("./Canvas.js");
7
7
  const EventListeners_js_1 = require("./Utils/EventListeners.js");
8
+ const EventType_js_1 = require("../Enums/Types/EventType.js");
8
9
  const Options_js_1 = require("../Options/Classes/Options.js");
9
10
  const Particles_js_1 = require("./Particles.js");
10
11
  const Retina_js_1 = require("./Retina.js");
@@ -27,7 +28,7 @@ function loadContainerOptions(engine, container, ...sourceOptionsArr) {
27
28
  }
28
29
  class Container {
29
30
  constructor(engine, id, sourceOptions) {
30
- this._intersectionManager = (entries) => {
31
+ this._intersectionManager = entries => {
31
32
  if (!guardCheck(this) || !this.actualOptions.pauseOnOutsideViewport) {
32
33
  return;
33
34
  }
@@ -43,7 +44,7 @@ class Container {
43
44
  }
44
45
  }
45
46
  };
46
- this._nextFrame = async (timestamp) => {
47
+ this._nextFrame = (timestamp) => {
47
48
  try {
48
49
  if (!this._smooth &&
49
50
  this._lastFrameTime !== undefined &&
@@ -59,7 +60,7 @@ class Container {
59
60
  this.draw(false);
60
61
  return;
61
62
  }
62
- await this.particles.draw(delta);
63
+ this.particles.draw(delta);
63
64
  if (!this.alive()) {
64
65
  this.destroy();
65
66
  return;
@@ -86,6 +87,7 @@ class Container {
86
87
  this._lastFrameTime = 0;
87
88
  this.zLayers = 100;
88
89
  this.pageHidden = false;
90
+ this._clickHandlers = new Map();
89
91
  this._sourceOptions = sourceOptions;
90
92
  this._initialSourceOptions = sourceOptions;
91
93
  this.retina = new Retina_js_1.Retina(this);
@@ -104,8 +106,8 @@ class Container {
104
106
  this._options = loadContainerOptions(this._engine, this);
105
107
  this.actualOptions = loadContainerOptions(this._engine, this);
106
108
  this._eventListeners = new EventListeners_js_1.EventListeners(this);
107
- this._intersectionObserver = (0, Utils_js_1.safeIntersectionObserver)((entries) => this._intersectionManager(entries));
108
- this._engine.dispatchEvent("containerBuilt", { container: this });
109
+ this._intersectionObserver = (0, Utils_js_1.safeIntersectionObserver)(entries => this._intersectionManager(entries));
110
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerBuilt, { container: this });
109
111
  }
110
112
  get animationStatus() {
111
113
  return !this._paused && !this.pageHidden && guardCheck(this);
@@ -133,8 +135,7 @@ class Container {
133
135
  y: pos.y * pxRatio,
134
136
  }, particles = this.particles.quadTree.queryCircle(posRetina, radius * pxRatio);
135
137
  callback(e, particles);
136
- };
137
- const clickHandler = (e) => {
138
+ }, clickHandler = (e) => {
138
139
  if (!guardCheck(this)) {
139
140
  return;
140
141
  }
@@ -143,27 +144,23 @@ class Container {
143
144
  y: mouseEvent.offsetY || mouseEvent.clientY,
144
145
  }, radius = 1;
145
146
  clickOrTouchHandler(e, pos, radius);
146
- };
147
- const touchStartHandler = () => {
147
+ }, touchStartHandler = () => {
148
148
  if (!guardCheck(this)) {
149
149
  return;
150
150
  }
151
151
  touched = true;
152
152
  touchMoved = false;
153
- };
154
- const touchMoveHandler = () => {
153
+ }, touchMoveHandler = () => {
155
154
  if (!guardCheck(this)) {
156
155
  return;
157
156
  }
158
157
  touchMoved = true;
159
- };
160
- const touchEndHandler = (e) => {
158
+ }, touchEndHandler = (e) => {
161
159
  if (!guardCheck(this)) {
162
160
  return;
163
161
  }
164
162
  if (touched && !touchMoved) {
165
- const touchEvent = e;
166
- const lengthOffset = 1;
163
+ const touchEvent = e, lengthOffset = 1;
167
164
  let lastTouch = touchEvent.touches[touchEvent.touches.length - lengthOffset];
168
165
  if (!lastTouch) {
169
166
  lastTouch = touchEvent.changedTouches[touchEvent.changedTouches.length - lengthOffset];
@@ -179,8 +176,7 @@ class Container {
179
176
  }
180
177
  touched = false;
181
178
  touchMoved = false;
182
- };
183
- const touchCancelHandler = () => {
179
+ }, touchCancelHandler = () => {
184
180
  if (!guardCheck(this)) {
185
181
  return;
186
182
  }
@@ -188,11 +184,14 @@ class Container {
188
184
  touchMoved = false;
189
185
  };
190
186
  let touched = false, touchMoved = false;
191
- el.addEventListener("click", clickHandler);
192
- el.addEventListener("touchstart", touchStartHandler);
193
- el.addEventListener("touchmove", touchMoveHandler);
194
- el.addEventListener("touchend", touchEndHandler);
195
- el.addEventListener("touchcancel", touchCancelHandler);
187
+ this._clickHandlers.set("click", clickHandler);
188
+ this._clickHandlers.set("touchstart", touchStartHandler);
189
+ this._clickHandlers.set("touchmove", touchMoveHandler);
190
+ this._clickHandlers.set("touchend", touchEndHandler);
191
+ this._clickHandlers.set("touchcancel", touchCancelHandler);
192
+ for (const [key, handler] of this._clickHandlers) {
193
+ el.addEventListener(key, handler);
194
+ }
196
195
  }
197
196
  addLifeTime(value) {
198
197
  this._lifeTime += value;
@@ -207,11 +206,21 @@ class Container {
207
206
  alive() {
208
207
  return !this._duration || this._lifeTime <= this._duration;
209
208
  }
210
- destroy() {
209
+ clearClickHandlers() {
210
+ if (!guardCheck(this)) {
211
+ return;
212
+ }
213
+ for (const [key, handler] of this._clickHandlers) {
214
+ this.interactivity.element?.removeEventListener(key, handler);
215
+ }
216
+ this._clickHandlers.clear();
217
+ }
218
+ destroy(remove = true) {
211
219
  if (!guardCheck(this)) {
212
220
  return;
213
221
  }
214
222
  this.stop();
223
+ this.clearClickHandlers();
215
224
  this.particles.destroy();
216
225
  this.canvas.destroy();
217
226
  for (const [, effectDrawer] of this.effectDrawers) {
@@ -228,26 +237,28 @@ class Container {
228
237
  }
229
238
  this._engine.clearPlugins(this);
230
239
  this.destroyed = true;
231
- const mainArr = this._engine.dom(), idx = mainArr.findIndex((t) => t === this), minIndex = 0;
232
- if (idx >= minIndex) {
233
- const deleteCount = 1;
234
- mainArr.splice(idx, deleteCount);
240
+ if (remove) {
241
+ const mainArr = this._engine.items, idx = mainArr.findIndex(t => t === this), minIndex = 0;
242
+ if (idx >= minIndex) {
243
+ const deleteCount = 1;
244
+ mainArr.splice(idx, deleteCount);
245
+ }
235
246
  }
236
- this._engine.dispatchEvent("containerDestroyed", { container: this });
247
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerDestroyed, { container: this });
237
248
  }
238
249
  draw(force) {
239
250
  if (!guardCheck(this)) {
240
251
  return;
241
252
  }
242
253
  let refreshTime = force;
243
- const frame = async (timestamp) => {
254
+ const frame = (timestamp) => {
244
255
  if (refreshTime) {
245
256
  this._lastFrameTime = undefined;
246
257
  refreshTime = false;
247
258
  }
248
- await this._nextFrame(timestamp);
259
+ this._nextFrame(timestamp);
249
260
  };
250
- this._drawAnimationFrame = requestAnimationFrame((timestamp) => void frame(timestamp));
261
+ this._drawAnimationFrame = requestAnimationFrame(timestamp => frame(timestamp));
251
262
  }
252
263
  async export(type, options = {}) {
253
264
  for (const [, plugin] of this.plugins) {
@@ -301,13 +312,14 @@ class Container {
301
312
  this.updateActualOptions();
302
313
  this.canvas.initBackground();
303
314
  this.canvas.resize();
304
- this.zLayers = this.actualOptions.zLayers;
305
- this._duration = (0, NumberUtils_js_1.getRangeValue)(this.actualOptions.duration) * Constants_js_1.millisecondsToSeconds;
306
- this._delay = (0, NumberUtils_js_1.getRangeValue)(this.actualOptions.delay) * Constants_js_1.millisecondsToSeconds;
315
+ const { zLayers, duration, delay, fpsLimit, smooth } = this.actualOptions;
316
+ this.zLayers = zLayers;
317
+ this._duration = (0, NumberUtils_js_1.getRangeValue)(duration) * Constants_js_1.millisecondsToSeconds;
318
+ this._delay = (0, NumberUtils_js_1.getRangeValue)(delay) * Constants_js_1.millisecondsToSeconds;
307
319
  this._lifeTime = 0;
308
320
  const defaultFpsLimit = 120, minFpsLimit = 0;
309
- this.fpsLimit = this.actualOptions.fpsLimit > minFpsLimit ? this.actualOptions.fpsLimit : defaultFpsLimit;
310
- this._smooth = this.actualOptions.smooth;
321
+ this.fpsLimit = fpsLimit > minFpsLimit ? fpsLimit : defaultFpsLimit;
322
+ this._smooth = smooth;
311
323
  for (const [, drawer] of this.effectDrawers) {
312
324
  await drawer.init?.(this);
313
325
  }
@@ -317,13 +329,13 @@ class Container {
317
329
  for (const [, plugin] of this.plugins) {
318
330
  await plugin.init?.();
319
331
  }
320
- this._engine.dispatchEvent("containerInit", { container: this });
332
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerInit, { container: this });
321
333
  await this.particles.init();
322
- await this.particles.setDensity();
334
+ this.particles.setDensity();
323
335
  for (const [, plugin] of this.plugins) {
324
336
  plugin.particlesSetup?.();
325
337
  }
326
- this._engine.dispatchEvent("particlesSetup", { container: this });
338
+ this._engine.dispatchEvent(EventType_js_1.EventType.particlesSetup, { container: this });
327
339
  }
328
340
  async loadTheme(name) {
329
341
  if (!guardCheck(this)) {
@@ -349,7 +361,7 @@ class Container {
349
361
  if (!this.pageHidden) {
350
362
  this._paused = true;
351
363
  }
352
- this._engine.dispatchEvent("containerPaused", { container: this });
364
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerPaused, { container: this });
353
365
  }
354
366
  play(force) {
355
367
  if (!guardCheck(this)) {
@@ -370,7 +382,7 @@ class Container {
370
382
  }
371
383
  }
372
384
  }
373
- this._engine.dispatchEvent("containerPlay", { container: this });
385
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerPlay, { container: this });
374
386
  this.draw(needsUpdate ?? false);
375
387
  }
376
388
  async refresh() {
@@ -380,12 +392,13 @@ class Container {
380
392
  this.stop();
381
393
  return this.start();
382
394
  }
383
- async reset() {
395
+ async reset(sourceOptions) {
384
396
  if (!guardCheck(this)) {
385
397
  return;
386
398
  }
387
- this._initialSourceOptions = undefined;
388
- this._options = loadContainerOptions(this._engine, this);
399
+ this._initialSourceOptions = sourceOptions;
400
+ this._sourceOptions = sourceOptions;
401
+ this._options = loadContainerOptions(this._engine, this, this._initialSourceOptions, this.sourceOptions);
389
402
  this.actualOptions = loadContainerOptions(this._engine, this, this._options);
390
403
  return this.refresh();
391
404
  }
@@ -395,7 +408,7 @@ class Container {
395
408
  }
396
409
  await this.init();
397
410
  this.started = true;
398
- await new Promise((resolve) => {
411
+ await new Promise(resolve => {
399
412
  const start = async () => {
400
413
  this._eventListeners.addListeners();
401
414
  if (this.interactivity.element instanceof HTMLElement && this._intersectionObserver) {
@@ -404,7 +417,7 @@ class Container {
404
417
  for (const [, plugin] of this.plugins) {
405
418
  await plugin.start?.();
406
419
  }
407
- this._engine.dispatchEvent("containerStarted", { container: this });
420
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerStarted, { container: this });
408
421
  this.play();
409
422
  resolve();
410
423
  };
@@ -435,7 +448,7 @@ class Container {
435
448
  this.plugins.delete(key);
436
449
  }
437
450
  this._sourceOptions = this._options;
438
- this._engine.dispatchEvent("containerStopped", { container: this });
451
+ this._engine.dispatchEvent(EventType_js_1.EventType.containerStopped, { container: this });
439
452
  }
440
453
  updateActualOptions() {
441
454
  this.actualOptions.responsive = [];
@@ -1,37 +1,16 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
3
  exports.Engine = void 0;
27
4
  const Constants_js_1 = require("./Utils/Constants.js");
28
5
  const Utils_js_1 = require("../Utils/Utils.js");
6
+ const Container_js_1 = require("./Container.js");
29
7
  const EventDispatcher_js_1 = require("../Utils/EventDispatcher.js");
8
+ const EventType_js_1 = require("../Enums/Types/EventType.js");
30
9
  const NumberUtils_js_1 = require("../Utils/NumberUtils.js");
31
10
  async function getItemsFromInitializer(container, map, initializers, force = false) {
32
11
  let res = map.get(container);
33
12
  if (!res || force) {
34
- res = await Promise.all([...initializers.values()].map((t) => t(container)));
13
+ res = await Promise.all([...initializers.values()].map(t => t(container)));
35
14
  map.set(container, res);
36
15
  }
37
16
  return res;
@@ -48,6 +27,46 @@ async function getDataFromUrl(data) {
48
27
  (0, Utils_js_1.getLogger)().error(`${Constants_js_1.errorPrefix} ${response.status} while retrieving config file`);
49
28
  return data.fallback;
50
29
  }
30
+ const generatedTrue = "true", generatedFalse = "false", canvasTag = "canvas", getCanvasFromContainer = (domContainer) => {
31
+ let canvasEl;
32
+ if (domContainer instanceof HTMLCanvasElement || domContainer.tagName.toLowerCase() === canvasTag) {
33
+ canvasEl = domContainer;
34
+ if (!canvasEl.dataset[Constants_js_1.generatedAttribute]) {
35
+ canvasEl.dataset[Constants_js_1.generatedAttribute] = generatedFalse;
36
+ }
37
+ }
38
+ else {
39
+ const existingCanvases = domContainer.getElementsByTagName(canvasTag);
40
+ if (existingCanvases.length) {
41
+ const firstIndex = 0;
42
+ canvasEl = existingCanvases[firstIndex];
43
+ canvasEl.dataset[Constants_js_1.generatedAttribute] = generatedFalse;
44
+ }
45
+ else {
46
+ canvasEl = document.createElement(canvasTag);
47
+ canvasEl.dataset[Constants_js_1.generatedAttribute] = generatedTrue;
48
+ domContainer.appendChild(canvasEl);
49
+ }
50
+ }
51
+ const fullPercent = "100%";
52
+ if (!canvasEl.style.width) {
53
+ canvasEl.style.width = fullPercent;
54
+ }
55
+ if (!canvasEl.style.height) {
56
+ canvasEl.style.height = fullPercent;
57
+ }
58
+ return canvasEl;
59
+ }, getDomContainer = (id, source) => {
60
+ let domContainer = source ?? document.getElementById(id);
61
+ if (domContainer) {
62
+ return domContainer;
63
+ }
64
+ domContainer = document.createElement("div");
65
+ domContainer.id = id;
66
+ domContainer.dataset[Constants_js_1.generatedAttribute] = generatedTrue;
67
+ document.body.append(domContainer);
68
+ return domContainer;
69
+ };
51
70
  class Engine {
52
71
  constructor() {
53
72
  this._configs = new Map();
@@ -75,16 +94,19 @@ class Engine {
75
94
  }
76
95
  return res;
77
96
  }
97
+ get items() {
98
+ return this._domArray;
99
+ }
78
100
  get version() {
79
- return "3.2.2";
101
+ return "3.4.0";
80
102
  }
81
103
  addConfig(config) {
82
104
  const key = config.key ?? config.name ?? "default";
83
105
  this._configs.set(key, config);
84
- this._eventDispatcher.dispatchEvent("configAdded", { data: { name: key, config } });
106
+ this._eventDispatcher.dispatchEvent(EventType_js_1.EventType.configAdded, { data: { name: key, config } });
85
107
  }
86
108
  async addEffect(effect, drawer, refresh = true) {
87
- (0, Utils_js_1.executeOnSingleOrMultiple)(effect, (type) => {
109
+ (0, Utils_js_1.executeOnSingleOrMultiple)(effect, type => {
88
110
  if (!this.getEffectDrawer(type)) {
89
111
  this.effectDrawers.set(type, drawer);
90
112
  }
@@ -124,12 +146,13 @@ class Engine {
124
146
  }
125
147
  await this.refresh(refresh);
126
148
  }
127
- async addShape(shape, drawer, refresh = true) {
128
- (0, Utils_js_1.executeOnSingleOrMultiple)(shape, (type) => {
129
- if (!this.getShapeDrawer(type)) {
130
- this.shapeDrawers.set(type, drawer);
149
+ async addShape(drawer, refresh = true) {
150
+ for (const validType of drawer.validTypes) {
151
+ if (this.getShapeDrawer(validType)) {
152
+ continue;
131
153
  }
132
- });
154
+ this.shapeDrawers.set(validType, drawer);
155
+ }
133
156
  await this.refresh(refresh);
134
157
  }
135
158
  clearPlugins(container) {
@@ -141,16 +164,10 @@ class Engine {
141
164
  this._eventDispatcher.dispatchEvent(type, args);
142
165
  }
143
166
  dom() {
144
- return this._domArray;
167
+ return this.items;
145
168
  }
146
169
  domItem(index) {
147
- const dom = this.dom(), item = dom[index];
148
- if (!item || item.destroyed) {
149
- const deleteCount = 1;
150
- dom.splice(index, deleteCount);
151
- return;
152
- }
153
- return item;
170
+ return this.item(index);
154
171
  }
155
172
  async getAvailablePlugins(container) {
156
173
  const res = new Map();
@@ -165,16 +182,16 @@ class Engine {
165
182
  return this.effectDrawers.get(type);
166
183
  }
167
184
  async getInteractors(container, force = false) {
168
- return await getItemsFromInitializer(container, this.interactors, this._initializers.interactors, force);
185
+ return getItemsFromInitializer(container, this.interactors, this._initializers.interactors, force);
169
186
  }
170
187
  async getMovers(container, force = false) {
171
- return await getItemsFromInitializer(container, this.movers, this._initializers.movers, force);
188
+ return getItemsFromInitializer(container, this.movers, this._initializers.movers, force);
172
189
  }
173
190
  getPathGenerator(type) {
174
191
  return this.pathGenerators.get(type);
175
192
  }
176
193
  getPlugin(plugin) {
177
- return this.plugins.find((t) => t.id === plugin);
194
+ return this.plugins.find(t => t.id === plugin);
178
195
  }
179
196
  getPreset(preset) {
180
197
  return this.presets.get(preset);
@@ -189,7 +206,7 @@ class Engine {
189
206
  return this.shapeDrawers.keys();
190
207
  }
191
208
  async getUpdaters(container, force = false) {
192
- return await getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
209
+ return getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
193
210
  }
194
211
  init() {
195
212
  if (this._initialized) {
@@ -197,90 +214,58 @@ class Engine {
197
214
  }
198
215
  this._initialized = true;
199
216
  }
217
+ item(index) {
218
+ const { items } = this, item = items[index];
219
+ if (!item || item.destroyed) {
220
+ const deleteCount = 1;
221
+ items.splice(index, deleteCount);
222
+ return;
223
+ }
224
+ return item;
225
+ }
200
226
  async load(params) {
201
227
  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;
202
- let domContainer = params.element ?? document.getElementById(id);
203
- if (!domContainer) {
204
- domContainer = document.createElement("div");
205
- domContainer.id = id;
206
- document.body.append(domContainer);
207
- }
208
- const currentOptions = (0, Utils_js_1.itemFromSingleOrMultiple)(options, index), dom = this.dom(), oldIndex = dom.findIndex((v) => v.id.description === id), minIndex = 0;
228
+ 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);
209
229
  if (oldIndex >= minIndex) {
210
- const old = this.domItem(oldIndex);
230
+ const old = this.item(oldIndex), one = 1, none = 0, deleteCount = old ? one : none;
211
231
  if (old && !old.destroyed) {
212
- old.destroy();
213
- const deleteCount = 1;
214
- dom.splice(oldIndex, deleteCount);
215
- }
216
- }
217
- let canvasEl;
218
- if (domContainer.tagName.toLowerCase() === "canvas") {
219
- canvasEl = domContainer;
220
- canvasEl.dataset[Constants_js_1.generatedAttribute] = "false";
221
- }
222
- else {
223
- const existingCanvases = domContainer.getElementsByTagName("canvas");
224
- if (existingCanvases.length) {
225
- const firstIndex = 0;
226
- canvasEl = existingCanvases[firstIndex];
227
- canvasEl.dataset[Constants_js_1.generatedAttribute] = "false";
228
- }
229
- else {
230
- canvasEl = document.createElement("canvas");
231
- canvasEl.dataset[Constants_js_1.generatedAttribute] = "true";
232
- domContainer.appendChild(canvasEl);
232
+ old.destroy(false);
233
233
  }
234
- }
235
- if (!canvasEl.style.width) {
236
- canvasEl.style.width = "100%";
237
- }
238
- if (!canvasEl.style.height) {
239
- canvasEl.style.height = "100%";
240
- }
241
- const { Container } = await Promise.resolve().then(() => __importStar(require("./Container.js"))), newItem = new Container(this, id, currentOptions);
242
- if (oldIndex >= minIndex) {
243
- const deleteCount = 0;
244
- dom.splice(oldIndex, deleteCount, newItem);
234
+ items.splice(oldIndex, deleteCount, newItem);
245
235
  }
246
236
  else {
247
- dom.push(newItem);
237
+ items.push(newItem);
248
238
  }
239
+ const domContainer = getDomContainer(id, params.element), canvasEl = getCanvasFromContainer(domContainer);
249
240
  newItem.canvas.loadCanvas(canvasEl);
250
241
  await newItem.start();
251
242
  return newItem;
252
243
  }
253
244
  loadOptions(options, sourceOptions) {
254
- for (const plugin of this.plugins) {
255
- plugin.loadOptions(options, sourceOptions);
256
- }
245
+ this.plugins.forEach(plugin => plugin.loadOptions?.(options, sourceOptions));
257
246
  }
258
247
  loadParticlesOptions(container, options, ...sourceOptions) {
259
248
  const updaters = this.updaters.get(container);
260
249
  if (!updaters) {
261
250
  return;
262
251
  }
263
- for (const updater of updaters) {
264
- updater.loadOptions?.(options, ...sourceOptions);
265
- }
252
+ updaters.forEach(updater => updater.loadOptions?.(options, ...sourceOptions));
266
253
  }
267
254
  async refresh(refresh = true) {
268
255
  if (!refresh) {
269
256
  return;
270
257
  }
271
- await Promise.all(this.dom().map((t) => t.refresh()));
258
+ await Promise.all(this.items.map(t => t.refresh()));
272
259
  }
273
260
  removeEventListener(type, listener) {
274
261
  this._eventDispatcher.removeEventListener(type, listener);
275
262
  }
276
263
  setOnClickHandler(callback) {
277
- const dom = this.dom();
278
- if (!dom.length) {
264
+ const { items } = this;
265
+ if (!items.length) {
279
266
  throw new Error(`${Constants_js_1.errorPrefix} can only set click handlers after calling tsParticles.load()`);
280
267
  }
281
- for (const domItem of dom) {
282
- domItem.addClickHandler(callback);
283
- }
268
+ items.forEach(item => item.addClickHandler(callback));
284
269
  }
285
270
  }
286
271
  exports.Engine = Engine;