@tsparticles/engine 3.3.0 → 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 (265) hide show
  1. package/README.md +0 -4
  2. package/browser/Core/Canvas.js +27 -22
  3. package/browser/Core/Container.js +55 -42
  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 +11 -10
  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 +55 -42
  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 +13 -7
  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 +27 -22
  115. package/esm/Core/Container.js +55 -42
  116. package/esm/Core/Engine.js +82 -74
  117. package/esm/Core/Particle.js +29 -15
  118. package/esm/Core/Particles.js +23 -24
  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 +3 -2
  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 +13 -7
  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/Container.d.ts +4 -2
  176. package/types/Core/Engine.d.ts +6 -5
  177. package/types/Core/Interfaces/IPlugin.d.ts +3 -4
  178. package/types/Core/Interfaces/IShapeDrawer.d.ts +1 -0
  179. package/types/Core/Particle.d.ts +1 -0
  180. package/types/Enums/AnimationStatus.d.ts +1 -1
  181. package/types/Enums/Directions/MoveDirection.d.ts +1 -1
  182. package/types/Enums/Directions/OutModeDirection.d.ts +1 -1
  183. package/types/Enums/Directions/RotateDirection.d.ts +1 -1
  184. package/types/Enums/InteractivityDetect.d.ts +1 -1
  185. package/types/Enums/Modes/AnimationMode.d.ts +1 -1
  186. package/types/Enums/Modes/CollisionMode.d.ts +1 -1
  187. package/types/Enums/Modes/LimitMode.d.ts +1 -1
  188. package/types/Enums/Modes/OutMode.d.ts +1 -1
  189. package/types/Enums/Modes/PixelMode.d.ts +1 -1
  190. package/types/Enums/Modes/ResponsiveMode.d.ts +1 -1
  191. package/types/Enums/Modes/ThemeMode.d.ts +1 -1
  192. package/types/Enums/Types/AlterType.d.ts +1 -1
  193. package/types/Enums/Types/DestroyType.d.ts +1 -1
  194. package/types/Enums/Types/DivType.d.ts +1 -1
  195. package/types/Enums/Types/EasingType.d.ts +1 -1
  196. package/types/Enums/Types/EventType.d.ts +1 -1
  197. package/types/Enums/Types/GradientType.d.ts +1 -1
  198. package/types/Enums/Types/InteractorType.d.ts +1 -1
  199. package/types/Enums/Types/ParticleOutType.d.ts +1 -1
  200. package/types/Enums/Types/StartValueType.d.ts +1 -1
  201. package/types/Options/Classes/Options.d.ts +2 -1
  202. package/types/Options/Classes/Responsive.d.ts +2 -2
  203. package/types/Options/Classes/Theme/Theme.d.ts +2 -2
  204. package/types/Options/Interfaces/IResponsive.d.ts +2 -3
  205. package/types/Options/Interfaces/Theme/ITheme.d.ts +2 -3
  206. package/types/Types/RangeType.d.ts +1 -1
  207. package/umd/Core/Canvas.js +27 -22
  208. package/umd/Core/Container.js +56 -43
  209. package/umd/Core/Engine.js +83 -99
  210. package/umd/Core/Particle.js +30 -16
  211. package/umd/Core/Particles.js +24 -25
  212. package/umd/Core/Utils/EventListeners.js +19 -18
  213. package/umd/Core/Utils/ExternalInteractorBase.js +3 -2
  214. package/umd/Core/Utils/InteractionManager.js +4 -3
  215. package/umd/Core/Utils/ParticlesInteractorBase.js +3 -2
  216. package/umd/Core/Utils/QuadTree.js +1 -1
  217. package/umd/Core/Utils/Ranges.js +6 -5
  218. package/umd/Enums/AnimationStatus.js +6 -0
  219. package/umd/Enums/Directions/MoveDirection.js +15 -0
  220. package/umd/Enums/Directions/OutModeDirection.js +8 -0
  221. package/umd/Enums/Directions/RotateDirection.js +7 -0
  222. package/umd/Enums/InteractivityDetect.js +7 -0
  223. package/umd/Enums/Modes/AnimationMode.js +8 -0
  224. package/umd/Enums/Modes/CollisionMode.js +7 -0
  225. package/umd/Enums/Modes/LimitMode.js +6 -0
  226. package/umd/Enums/Modes/OutMode.js +9 -0
  227. package/umd/Enums/Modes/PixelMode.js +6 -0
  228. package/umd/Enums/Modes/ResponsiveMode.js +6 -0
  229. package/umd/Enums/Modes/ThemeMode.js +7 -0
  230. package/umd/Enums/Types/AlterType.js +6 -0
  231. package/umd/Enums/Types/DestroyType.js +7 -0
  232. package/umd/Enums/Types/DivType.js +6 -0
  233. package/umd/Enums/Types/EasingType.js +31 -0
  234. package/umd/Enums/Types/EventType.js +16 -0
  235. package/umd/Enums/Types/GradientType.js +7 -0
  236. package/umd/Enums/Types/InteractorType.js +6 -0
  237. package/umd/Enums/Types/ParticleOutType.js +7 -0
  238. package/umd/Enums/Types/StartValueType.js +7 -0
  239. package/umd/Options/Classes/AnimationOptions.js +5 -3
  240. package/umd/Options/Classes/Interactivity/Events/DivEvent.js +3 -2
  241. package/umd/Options/Classes/Interactivity/Events/Events.js +1 -1
  242. package/umd/Options/Classes/Interactivity/Interactivity.js +3 -2
  243. package/umd/Options/Classes/ManualParticle.js +3 -2
  244. package/umd/Options/Classes/Options.js +15 -13
  245. package/umd/Options/Classes/Particles/Collisions/Collisions.js +3 -2
  246. package/umd/Options/Classes/Particles/Move/Move.js +3 -2
  247. package/umd/Options/Classes/Particles/Move/MoveCenter.js +3 -2
  248. package/umd/Options/Classes/Particles/Move/OutModes.js +3 -2
  249. package/umd/Options/Classes/Particles/Number/ParticlesNumberLimit.js +3 -2
  250. package/umd/Options/Classes/Particles/Opacity/OpacityAnimation.js +3 -2
  251. package/umd/Options/Classes/Particles/ParticlesOptions.js +1 -1
  252. package/umd/Options/Classes/Particles/Size/SizeAnimation.js +3 -2
  253. package/umd/Options/Classes/Responsive.js +6 -5
  254. package/umd/Options/Classes/Theme/ThemeDefault.js +3 -2
  255. package/umd/Types/RangeType.js +6 -0
  256. package/umd/Utils/CanvasUtils.js +14 -8
  257. package/umd/Utils/ColorUtils.js +18 -10
  258. package/umd/Utils/EventDispatcher.js +1 -1
  259. package/umd/Utils/HslColorManager.js +11 -4
  260. package/umd/Utils/NumberUtils.js +12 -11
  261. package/umd/Utils/RgbColorManager.js +11 -4
  262. package/umd/Utils/Utils.js +38 -32
  263. package/174.min.js +0 -2
  264. package/174.min.js.LICENSE.txt +0 -1
  265. package/dist_browser_Core_Container_js.js +0 -102
@@ -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.3.0";
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;
@@ -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/Vectors.js", "../Utils/NumberUtils.js", "../Utils/Utils.js", "./Utils/Constants.js", "../Utils/ColorUtils.js", "../Options/Classes/Interactivity/Interactivity.js", "../Utils/CanvasUtils.js", "../Utils/OptionsUtils.js"], factory);
7
+ define(["require", "exports", "./Utils/Vectors.js", "../Utils/NumberUtils.js", "../Utils/Utils.js", "./Utils/Constants.js", "../Utils/ColorUtils.js", "../Enums/Types/EventType.js", "../Options/Classes/Interactivity/Interactivity.js", "../Enums/Directions/MoveDirection.js", "../Enums/Modes/OutMode.js", "../Enums/Types/ParticleOutType.js", "../Enums/Modes/PixelMode.js", "../Utils/CanvasUtils.js", "../Utils/OptionsUtils.js"], factory);
8
8
  }
9
9
  })(function (require, exports) {
10
10
  "use strict";
@@ -15,10 +15,15 @@
15
15
  const Utils_js_1 = require("../Utils/Utils.js");
16
16
  const Constants_js_1 = require("./Utils/Constants.js");
17
17
  const ColorUtils_js_1 = require("../Utils/ColorUtils.js");
18
+ const EventType_js_1 = require("../Enums/Types/EventType.js");
18
19
  const Interactivity_js_1 = require("../Options/Classes/Interactivity/Interactivity.js");
20
+ const MoveDirection_js_1 = require("../Enums/Directions/MoveDirection.js");
21
+ const OutMode_js_1 = require("../Enums/Modes/OutMode.js");
22
+ const ParticleOutType_js_1 = require("../Enums/Types/ParticleOutType.js");
23
+ const PixelMode_js_1 = require("../Enums/Modes/PixelMode.js");
19
24
  const CanvasUtils_js_1 = require("../Utils/CanvasUtils.js");
20
25
  const OptionsUtils_js_1 = require("../Utils/OptionsUtils.js");
21
- const defaultRetryCount = 0, double = 2, half = 0.5, squareExp = 2;
26
+ const defaultRetryCount = 0, double = 2, half = 0.5, squareExp = 2, randomString = "random";
22
27
  function loadEffectData(effect, effectOptions, id, reduceDuplicates) {
23
28
  const effectData = effectOptions.options[effect];
24
29
  if (!effectData) {
@@ -67,7 +72,7 @@
67
72
  }), pos = Vectors_js_1.Vector3d.create(exactPosition.x, exactPosition.y, zIndex), radius = this.getRadius(), outModes = this.options.move.outModes, fixHorizontal = (outMode) => {
68
73
  fixOutMode({
69
74
  outMode,
70
- checkModes: ["bounce"],
75
+ checkModes: [OutMode_js_1.OutMode.bounce],
71
76
  coord: pos.x,
72
77
  maxCoord: container.canvas.size.width,
73
78
  setCb: (value) => (pos.x += value),
@@ -76,7 +81,7 @@
76
81
  }, fixVertical = (outMode) => {
77
82
  fixOutMode({
78
83
  outMode,
79
- checkModes: ["bounce"],
84
+ checkModes: [OutMode_js_1.OutMode.bounce],
80
85
  coord: pos.y,
81
86
  maxCoord: container.canvas.size.height,
82
87
  setCb: (value) => (pos.y += value),
@@ -95,7 +100,7 @@
95
100
  };
96
101
  this._calculateVelocity = () => {
97
102
  const baseVelocity = (0, NumberUtils_js_1.getParticleBaseVelocity)(this.direction), res = baseVelocity.copy(), moveOptions = this.options.move;
98
- if (moveOptions.direction === "inside" || moveOptions.direction === "outside") {
103
+ if (moveOptions.direction === MoveDirection_js_1.MoveDirection.inside || moveOptions.direction === MoveDirection_js_1.MoveDirection.outside) {
99
104
  return res;
100
105
  }
101
106
  const rad = (0, NumberUtils_js_1.degToRad)((0, NumberUtils_js_1.getRangeValue)(moveOptions.angle.value)), radOffset = (0, NumberUtils_js_1.degToRad)((0, NumberUtils_js_1.getRangeValue)(moveOptions.angle.offset)), range = {
@@ -123,9 +128,9 @@
123
128
  if (retries >= minRetries && tryCount > retries) {
124
129
  throw new Error(`${Constants_js_1.errorPrefix} particle is overlapping and can't be placed`);
125
130
  }
126
- return !!this.container.particles.find((particle) => (0, NumberUtils_js_1.getDistance)(pos, particle.position) < radius + particle.getRadius());
131
+ return !!this.container.particles.find(particle => (0, NumberUtils_js_1.getDistance)(pos, particle.position) < radius + particle.getRadius());
127
132
  };
128
- this._getRollColor = (color) => {
133
+ this._getRollColor = color => {
129
134
  if (!color || !this.roll || (!this.backColor && !this.roll.alter)) {
130
135
  return color;
131
136
  }
@@ -141,7 +146,7 @@
141
146
  }
142
147
  return color;
143
148
  };
144
- this._initPosition = (position) => {
149
+ this._initPosition = position => {
145
150
  const container = this.container, zIndexValue = (0, NumberUtils_js_1.getRangeValue)(this.options.zIndex.value), minZ = 0;
146
151
  this.position = this._calcPosition(container, position, (0, NumberUtils_js_1.clamp)(zIndexValue, minZ, container.zLayers));
147
152
  this.initialPosition = this.position.copy();
@@ -149,15 +154,15 @@
149
154
  this.moveCenter = {
150
155
  ...(0, Utils_js_1.getPosition)(this.options.move.center, canvasSize),
151
156
  radius: this.options.move.center.radius ?? defaultRadius,
152
- mode: this.options.move.center.mode ?? "percent",
157
+ mode: this.options.move.center.mode ?? PixelMode_js_1.PixelMode.percent,
153
158
  };
154
159
  this.direction = (0, NumberUtils_js_1.getParticleDirectionAngle)(this.options.move.direction, this.position, this.moveCenter);
155
160
  switch (this.options.move.direction) {
156
- case "inside":
157
- this.outType = "inside";
161
+ case MoveDirection_js_1.MoveDirection.inside:
162
+ this.outType = ParticleOutType_js_1.ParticleOutType.inside;
158
163
  break;
159
- case "outside":
160
- this.outType = "outside";
164
+ case MoveDirection_js_1.MoveDirection.outside:
165
+ this.outType = ParticleOutType_js_1.ParticleOutType.outside;
161
166
  break;
162
167
  }
163
168
  this.offset = Vectors_js_1.Vector.origin;
@@ -180,7 +185,7 @@
180
185
  updater.particleDestroyed?.(this, override);
181
186
  }
182
187
  pathGenerator?.reset(this);
183
- this._engine.dispatchEvent("particleDestroyed", {
188
+ this._engine.dispatchEvent(EventType_js_1.EventType.particleDestroyed, {
184
189
  container: this.container,
185
190
  data: {
186
191
  particle: this,
@@ -225,14 +230,15 @@
225
230
  this.lastPathTime = 0;
226
231
  this.destroyed = false;
227
232
  this.unbreakable = false;
233
+ this.isRotating = false;
228
234
  this.rotation = 0;
229
235
  this.misplaced = false;
230
236
  this.retina = {
231
237
  maxDistance: {},
232
238
  };
233
- this.outType = "normal";
239
+ this.outType = ParticleOutType_js_1.ParticleOutType.normal;
234
240
  this.ignoresResizeRatio = true;
235
- const pxRatio = container.retina.pixelRatio, mainOptions = container.actualOptions, particlesOptions = (0, OptionsUtils_js_1.loadParticlesOptions)(this._engine, container, mainOptions.particles), effectType = particlesOptions.effect.type, shapeType = particlesOptions.shape.type, { reduceDuplicates } = particlesOptions;
241
+ const pxRatio = container.retina.pixelRatio, mainOptions = container.actualOptions, particlesOptions = (0, OptionsUtils_js_1.loadParticlesOptions)(this._engine, container, mainOptions.particles), { reduceDuplicates } = particlesOptions, effectType = particlesOptions.effect.type, shapeType = particlesOptions.shape.type;
236
242
  this.effect = (0, Utils_js_1.itemFromSingleOrMultiple)(effectType, this.id, reduceDuplicates);
237
243
  this.shape = (0, Utils_js_1.itemFromSingleOrMultiple)(shapeType, this.id, reduceDuplicates);
238
244
  const effectOptions = particlesOptions.effect, shapeOptions = particlesOptions.shape;
@@ -252,6 +258,14 @@
252
258
  }
253
259
  }
254
260
  }
261
+ if (this.effect === randomString) {
262
+ const availableEffects = [...this.container.effectDrawers.keys()];
263
+ this.effect = availableEffects[Math.floor(Math.random() * availableEffects.length)];
264
+ }
265
+ if (this.shape === randomString) {
266
+ const availableShapes = [...this.container.shapeDrawers.keys()];
267
+ this.shape = availableShapes[Math.floor(Math.random() * availableShapes.length)];
268
+ }
255
269
  this.effectData = loadEffectData(this.effect, effectOptions, this.id, reduceDuplicates);
256
270
  this.shapeData = loadShapeData(this.shape, shapeOptions, this.id, reduceDuplicates);
257
271
  particlesOptions.load(overrideOptions);
@@ -4,14 +4,16 @@
4
4
  if (v !== undefined) module.exports = v;
5
5
  }
6
6
  else if (typeof define === "function" && define.amd) {
7
- define(["require", "exports", "../Utils/Utils.js", "./Utils/InteractionManager.js", "./Particle.js", "./Utils/Point.js", "./Utils/QuadTree.js", "./Utils/Ranges.js", "./Utils/Constants.js"], factory);
7
+ define(["require", "exports", "../Utils/Utils.js", "../Enums/Types/EventType.js", "./Utils/InteractionManager.js", "../Enums/Modes/LimitMode.js", "./Particle.js", "./Utils/Point.js", "./Utils/QuadTree.js", "./Utils/Ranges.js", "./Utils/Constants.js"], factory);
8
8
  }
9
9
  })(function (require, exports) {
10
10
  "use strict";
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.Particles = void 0;
13
13
  const Utils_js_1 = require("../Utils/Utils.js");
14
+ const EventType_js_1 = require("../Enums/Types/EventType.js");
14
15
  const InteractionManager_js_1 = require("./Utils/InteractionManager.js");
16
+ const LimitMode_js_1 = require("../Enums/Modes/LimitMode.js");
15
17
  const Particle_js_1 = require("./Particle.js");
16
18
  const Point_js_1 = require("./Utils/Point.js");
17
19
  const QuadTree_js_1 = require("./Utils/QuadTree.js");
@@ -25,9 +27,7 @@
25
27
  class Particles {
26
28
  constructor(engine, container) {
27
29
  this._addToPool = (...particles) => {
28
- for (const particle of particles) {
29
- this._pool.push(particle);
30
- }
30
+ this._pool.push(...particles);
31
31
  };
32
32
  this._applyDensity = (options, manualCount, group) => {
33
33
  const numberOptions = options.number;
@@ -40,7 +40,7 @@
40
40
  }
41
41
  return;
42
42
  }
43
- 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);
43
+ 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);
44
44
  if (group === undefined) {
45
45
  this._limit = numberOptions.limit.value * densityFactor;
46
46
  }
@@ -54,7 +54,7 @@
54
54
  this.removeQuantity(particlesCount - particlesNumber, group);
55
55
  }
56
56
  };
57
- this._initDensityFactor = (densityOptions) => {
57
+ this._initDensityFactor = densityOptions => {
58
58
  const container = this._container, defaultFactor = 1;
59
59
  if (!container.canvas.element || !densityOptions.enable) {
60
60
  return defaultFactor;
@@ -79,7 +79,7 @@
79
79
  this._array.push(particle);
80
80
  this._zArray.push(particle);
81
81
  this._nextId++;
82
- this._engine.dispatchEvent("particleAdded", {
82
+ this._engine.dispatchEvent(EventType_js_1.EventType.particleAdded, {
83
83
  container: this._container,
84
84
  data: {
85
85
  particle,
@@ -100,7 +100,7 @@
100
100
  this._array.splice(index, deleteCount);
101
101
  this._zArray.splice(zIdx, deleteCount);
102
102
  particle.destroy(override);
103
- this._engine.dispatchEvent("particleRemoved", {
103
+ this._engine.dispatchEvent(EventType_js_1.EventType.particleRemoved, {
104
104
  container: this._container,
105
105
  data: {
106
106
  particle,
@@ -131,23 +131,24 @@
131
131
  }
132
132
  addManualParticles() {
133
133
  const container = this._container, options = container.actualOptions;
134
- for (const particle of options.manualParticles) {
135
- this.addParticle(particle.position ? (0, Utils_js_1.getPosition)(particle.position, container.canvas.size) : undefined, particle.options);
136
- }
134
+ options.manualParticles.forEach(p => this.addParticle(p.position ? (0, Utils_js_1.getPosition)(p.position, container.canvas.size) : undefined, p.options));
137
135
  }
138
136
  addParticle(position, overrideOptions, group, initializer) {
139
- const limitOptions = this._container.actualOptions.particles.number.limit, limit = group === undefined ? this._limit : this._groupLimits.get(group) ?? this._limit, currentCount = this.count, minLimit = 0;
137
+ 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;
140
138
  if (limit > minLimit) {
141
- if (limitOptions.mode === "delete") {
142
- const countOffset = 1, minCount = 0, countToRemove = currentCount + countOffset - limit;
143
- if (countToRemove > minCount) {
144
- this.removeQuantity(countToRemove);
145
- }
146
- }
147
- else if (limitOptions.mode === "wait") {
148
- if (currentCount >= limit) {
149
- return;
139
+ switch (limitMode) {
140
+ case LimitMode_js_1.LimitMode.delete: {
141
+ const countOffset = 1, minCount = 0, countToRemove = currentCount + countOffset - limit;
142
+ if (countToRemove > minCount) {
143
+ this.removeQuantity(countToRemove);
144
+ }
145
+ break;
150
146
  }
147
+ case LimitMode_js_1.LimitMode.wait:
148
+ if (currentCount >= limit) {
149
+ return;
150
+ }
151
+ break;
151
152
  }
152
153
  }
153
154
  return this._pushParticle(position, overrideOptions, group, initializer);
@@ -193,9 +194,7 @@
193
194
  await this.initPlugins();
194
195
  let handled = false;
195
196
  for (const [, plugin] of container.plugins) {
196
- if (plugin.particlesInitialization !== undefined) {
197
- handled = plugin.particlesInitialization();
198
- }
197
+ handled = plugin.particlesInitialization?.() ?? handled;
199
198
  if (handled) {
200
199
  break;
201
200
  }
@@ -310,7 +309,7 @@
310
309
  this._array = this.filter(checkDelete);
311
310
  this._zArray = this._zArray.filter(checkDelete);
312
311
  for (const particle of particlesToDelete) {
313
- this._engine.dispatchEvent("particleRemoved", {
312
+ this._engine.dispatchEvent(EventType_js_1.EventType.particleRemoved, {
314
313
  container: this._container,
315
314
  data: {
316
315
  particle,