@tsparticles/engine 4.0.0-alpha.3 → 4.0.0-alpha.5

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 (266) hide show
  1. package/794.min.js +2 -0
  2. package/794.min.js.LICENSE.txt +1 -0
  3. package/README.md +2 -5
  4. package/browser/Core/Canvas.js +3 -3
  5. package/browser/Core/Container.js +35 -155
  6. package/browser/Core/Engine.js +32 -78
  7. package/browser/Core/Particle.js +5 -10
  8. package/browser/Core/Particles.js +36 -25
  9. package/browser/Core/Utils/Constants.js +2 -2
  10. package/browser/Core/Utils/EventListeners.js +5 -250
  11. package/browser/Options/Classes/Options.js +7 -75
  12. package/browser/Options/Classes/Particles/ParticlesOptions.js +5 -11
  13. package/{esm/Options/Classes/Interactivity/Events → browser/Options/Classes}/ResizeEvent.js +1 -1
  14. package/browser/Utils/ColorUtils.js +7 -5
  15. package/browser/Utils/Utils.js +33 -36
  16. package/browser/exports.js +1 -21
  17. package/cjs/Core/Canvas.js +3 -3
  18. package/cjs/Core/Container.js +35 -155
  19. package/cjs/Core/Engine.js +32 -78
  20. package/cjs/Core/Particle.js +5 -10
  21. package/cjs/Core/Particles.js +36 -25
  22. package/cjs/Core/Utils/Constants.js +2 -2
  23. package/cjs/Core/Utils/EventListeners.js +5 -250
  24. package/cjs/Options/Classes/Options.js +7 -75
  25. package/cjs/Options/Classes/Particles/ParticlesOptions.js +5 -11
  26. package/cjs/Options/Classes/{Interactivity/Events/ResizeEvent.js → ResizeEvent.js} +1 -1
  27. package/cjs/Utils/ColorUtils.js +7 -5
  28. package/cjs/Utils/Utils.js +33 -36
  29. package/cjs/exports.js +1 -21
  30. package/dist_browser_Core_Container_js.js +6 -16
  31. package/esm/Core/Canvas.js +3 -3
  32. package/esm/Core/Container.js +35 -155
  33. package/esm/Core/Engine.js +32 -78
  34. package/esm/Core/Particle.js +5 -10
  35. package/esm/Core/Particles.js +36 -25
  36. package/esm/Core/Utils/Constants.js +2 -2
  37. package/esm/Core/Utils/EventListeners.js +5 -250
  38. package/esm/Options/Classes/Options.js +7 -75
  39. package/esm/Options/Classes/Particles/ParticlesOptions.js +5 -11
  40. package/{browser/Options/Classes/Interactivity/Events → esm/Options/Classes}/ResizeEvent.js +1 -1
  41. package/esm/Utils/ColorUtils.js +7 -5
  42. package/esm/Utils/Utils.js +33 -36
  43. package/esm/exports.js +1 -21
  44. package/package.json +1 -1
  45. package/report.html +1 -1
  46. package/tsparticles.engine.js +14 -206
  47. package/tsparticles.engine.min.js +1 -1
  48. package/tsparticles.engine.min.js.LICENSE.txt +1 -1
  49. package/types/Core/Container.d.ts +3 -15
  50. package/types/Core/Engine.d.ts +8 -19
  51. package/types/Core/Interfaces/IContainerPlugin.d.ts +8 -1
  52. package/types/Core/Interfaces/IPlugin.d.ts +5 -1
  53. package/types/Core/Particle.d.ts +0 -2
  54. package/types/Core/Particles.d.ts +1 -5
  55. package/types/Core/Utils/Constants.d.ts +2 -2
  56. package/types/Core/Utils/EventListeners.d.ts +0 -14
  57. package/types/Options/Classes/Options.d.ts +2 -11
  58. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +0 -2
  59. package/types/Options/Classes/ResizeEvent.d.ts +9 -0
  60. package/types/Options/Interfaces/IOptions.d.ts +2 -8
  61. package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +0 -3
  62. package/types/Types/EngineInitializers.d.ts +10 -0
  63. package/types/Utils/Utils.d.ts +4 -6
  64. package/types/export-types.d.ts +3 -19
  65. package/types/exports.d.ts +1 -21
  66. package/umd/Core/Canvas.js +3 -3
  67. package/umd/Core/Container.js +35 -155
  68. package/umd/Core/Engine.js +33 -79
  69. package/umd/Core/Particle.js +6 -11
  70. package/umd/Core/Particles.js +37 -26
  71. package/umd/Core/Utils/Constants.js +3 -3
  72. package/umd/Core/Utils/EventListeners.js +7 -252
  73. package/umd/Options/Classes/Options.js +7 -75
  74. package/umd/Options/Classes/Particles/ParticlesOptions.js +5 -11
  75. package/umd/Options/Classes/{Interactivity/Events/ResizeEvent.js → ResizeEvent.js} +2 -2
  76. package/umd/Utils/ColorUtils.js +7 -5
  77. package/umd/Utils/Utils.js +34 -39
  78. package/umd/exports.js +2 -22
  79. package/638.min.js +0 -2
  80. package/638.min.js.LICENSE.txt +0 -1
  81. package/browser/Core/Interfaces/IMouseData.js +0 -1
  82. package/browser/Core/Interfaces/IParticlesInteractor.js +0 -1
  83. package/browser/Core/Utils/ExternalInteractorBase.js +0 -7
  84. package/browser/Core/Utils/InteractionManager.js +0 -60
  85. package/browser/Core/Utils/ParticlesInteractorBase.js +0 -7
  86. package/browser/Enums/InteractivityDetect.js +0 -6
  87. package/browser/Enums/Modes/ResponsiveMode.js +0 -5
  88. package/browser/Enums/Modes/ThemeMode.js +0 -6
  89. package/browser/Enums/Types/DivType.js +0 -5
  90. package/browser/Enums/Types/InteractorType.js +0 -5
  91. package/browser/Options/Classes/Interactivity/Events/ClickEvent.js +0 -18
  92. package/browser/Options/Classes/Interactivity/Events/DivEvent.js +0 -27
  93. package/browser/Options/Classes/Interactivity/Events/Events.js +0 -30
  94. package/browser/Options/Classes/Interactivity/Events/HoverEvent.js +0 -21
  95. package/browser/Options/Classes/Interactivity/Events/Parallax.js +0 -22
  96. package/browser/Options/Classes/Interactivity/Interactivity.js +0 -22
  97. package/browser/Options/Classes/Interactivity/Modes/Modes.js +0 -25
  98. package/browser/Options/Classes/ManualParticle.js +0 -21
  99. package/browser/Options/Classes/Responsive.js +0 -29
  100. package/browser/Options/Classes/Theme/Theme.js +0 -21
  101. package/browser/Options/Classes/Theme/ThemeDefault.js +0 -23
  102. package/browser/Options/Interfaces/IManualParticle.js +0 -1
  103. package/browser/Options/Interfaces/IResponsive.js +0 -1
  104. package/browser/Options/Interfaces/Interactivity/Events/IClickEvent.js +0 -1
  105. package/browser/Options/Interfaces/Interactivity/Events/IDivEvent.js +0 -1
  106. package/browser/Options/Interfaces/Interactivity/Events/IEvents.js +0 -1
  107. package/browser/Options/Interfaces/Interactivity/Events/IHoverEvent.js +0 -1
  108. package/browser/Options/Interfaces/Interactivity/Events/IParallax.js +0 -1
  109. package/browser/Options/Interfaces/Interactivity/IInteractivity.js +0 -1
  110. package/browser/Options/Interfaces/Interactivity/Modes/IModeDiv.js +0 -1
  111. package/browser/Options/Interfaces/Interactivity/Modes/IModes.js +0 -1
  112. package/browser/Options/Interfaces/Theme/ITheme.js +0 -1
  113. package/browser/Options/Interfaces/Theme/IThemeDefault.js +0 -1
  114. package/cjs/Core/Interfaces/IContainerInteractivity.js +0 -1
  115. package/cjs/Core/Interfaces/IExternalInteractor.js +0 -1
  116. package/cjs/Core/Interfaces/IInteractor.js +0 -1
  117. package/cjs/Core/Interfaces/IMouseData.js +0 -1
  118. package/cjs/Core/Interfaces/IParticlesInteractor.js +0 -1
  119. package/cjs/Core/Utils/ExternalInteractorBase.js +0 -7
  120. package/cjs/Core/Utils/InteractionManager.js +0 -60
  121. package/cjs/Core/Utils/ParticlesInteractorBase.js +0 -7
  122. package/cjs/Enums/InteractivityDetect.js +0 -6
  123. package/cjs/Enums/Modes/ResponsiveMode.js +0 -5
  124. package/cjs/Enums/Modes/ThemeMode.js +0 -6
  125. package/cjs/Enums/Types/DivType.js +0 -5
  126. package/cjs/Enums/Types/InteractorType.js +0 -5
  127. package/cjs/Options/Classes/Interactivity/Events/ClickEvent.js +0 -18
  128. package/cjs/Options/Classes/Interactivity/Events/DivEvent.js +0 -27
  129. package/cjs/Options/Classes/Interactivity/Events/Events.js +0 -30
  130. package/cjs/Options/Classes/Interactivity/Events/HoverEvent.js +0 -21
  131. package/cjs/Options/Classes/Interactivity/Events/Parallax.js +0 -22
  132. package/cjs/Options/Classes/Interactivity/Interactivity.js +0 -22
  133. package/cjs/Options/Classes/Interactivity/Modes/Modes.js +0 -25
  134. package/cjs/Options/Classes/ManualParticle.js +0 -21
  135. package/cjs/Options/Classes/Responsive.js +0 -29
  136. package/cjs/Options/Classes/Theme/Theme.js +0 -21
  137. package/cjs/Options/Classes/Theme/ThemeDefault.js +0 -23
  138. package/cjs/Options/Interfaces/IManualParticle.js +0 -1
  139. package/cjs/Options/Interfaces/IResponsive.js +0 -1
  140. package/cjs/Options/Interfaces/Interactivity/Events/IClickEvent.js +0 -1
  141. package/cjs/Options/Interfaces/Interactivity/Events/IDivEvent.js +0 -1
  142. package/cjs/Options/Interfaces/Interactivity/Events/IEvents.js +0 -1
  143. package/cjs/Options/Interfaces/Interactivity/Events/IHoverEvent.js +0 -1
  144. package/cjs/Options/Interfaces/Interactivity/Events/IParallax.js +0 -1
  145. package/cjs/Options/Interfaces/Interactivity/IInteractivity.js +0 -1
  146. package/cjs/Options/Interfaces/Interactivity/Modes/IModeDiv.js +0 -1
  147. package/cjs/Options/Interfaces/Interactivity/Modes/IModes.js +0 -1
  148. package/cjs/Options/Interfaces/Theme/ITheme.js +0 -1
  149. package/cjs/Options/Interfaces/Theme/IThemeDefault.js +0 -1
  150. package/esm/Core/Interfaces/IContainerInteractivity.js +0 -1
  151. package/esm/Core/Interfaces/IExternalInteractor.js +0 -1
  152. package/esm/Core/Interfaces/IInteractor.js +0 -1
  153. package/esm/Core/Interfaces/IMouseData.js +0 -1
  154. package/esm/Core/Interfaces/IParticlesInteractor.js +0 -1
  155. package/esm/Core/Utils/ExternalInteractorBase.js +0 -7
  156. package/esm/Core/Utils/InteractionManager.js +0 -60
  157. package/esm/Core/Utils/ParticlesInteractorBase.js +0 -7
  158. package/esm/Enums/InteractivityDetect.js +0 -6
  159. package/esm/Enums/Modes/ResponsiveMode.js +0 -5
  160. package/esm/Enums/Modes/ThemeMode.js +0 -6
  161. package/esm/Enums/Types/DivType.js +0 -5
  162. package/esm/Enums/Types/InteractorType.js +0 -5
  163. package/esm/Options/Classes/Interactivity/Events/ClickEvent.js +0 -18
  164. package/esm/Options/Classes/Interactivity/Events/DivEvent.js +0 -27
  165. package/esm/Options/Classes/Interactivity/Events/Events.js +0 -30
  166. package/esm/Options/Classes/Interactivity/Events/HoverEvent.js +0 -21
  167. package/esm/Options/Classes/Interactivity/Events/Parallax.js +0 -22
  168. package/esm/Options/Classes/Interactivity/Interactivity.js +0 -22
  169. package/esm/Options/Classes/Interactivity/Modes/Modes.js +0 -25
  170. package/esm/Options/Classes/ManualParticle.js +0 -21
  171. package/esm/Options/Classes/Responsive.js +0 -29
  172. package/esm/Options/Classes/Theme/Theme.js +0 -21
  173. package/esm/Options/Classes/Theme/ThemeDefault.js +0 -23
  174. package/esm/Options/Interfaces/IManualParticle.js +0 -1
  175. package/esm/Options/Interfaces/IResponsive.js +0 -1
  176. package/esm/Options/Interfaces/Interactivity/Events/IClickEvent.js +0 -1
  177. package/esm/Options/Interfaces/Interactivity/Events/IDivEvent.js +0 -1
  178. package/esm/Options/Interfaces/Interactivity/Events/IEvents.js +0 -1
  179. package/esm/Options/Interfaces/Interactivity/Events/IHoverEvent.js +0 -1
  180. package/esm/Options/Interfaces/Interactivity/Events/IParallax.js +0 -1
  181. package/esm/Options/Interfaces/Interactivity/IInteractivity.js +0 -1
  182. package/esm/Options/Interfaces/Interactivity/Modes/IModeDiv.js +0 -1
  183. package/esm/Options/Interfaces/Interactivity/Modes/IModes.js +0 -1
  184. package/esm/Options/Interfaces/Theme/ITheme.js +0 -1
  185. package/esm/Options/Interfaces/Theme/IThemeDefault.js +0 -1
  186. package/types/Core/Interfaces/IContainerInteractivity.d.ts +0 -6
  187. package/types/Core/Interfaces/IExternalInteractor.d.ts +0 -12
  188. package/types/Core/Interfaces/IInteractor.d.ts +0 -16
  189. package/types/Core/Interfaces/IMouseData.d.ts +0 -9
  190. package/types/Core/Interfaces/IParticlesInteractor.d.ts +0 -7
  191. package/types/Core/Utils/ExternalInteractorBase.d.ts +0 -15
  192. package/types/Core/Utils/InteractionManager.d.ts +0 -17
  193. package/types/Core/Utils/ParticlesInteractorBase.d.ts +0 -15
  194. package/types/Enums/InteractivityDetect.d.ts +0 -5
  195. package/types/Enums/Modes/ResponsiveMode.d.ts +0 -4
  196. package/types/Enums/Modes/ThemeMode.d.ts +0 -5
  197. package/types/Enums/Types/DivType.d.ts +0 -4
  198. package/types/Enums/Types/InteractorType.d.ts +0 -4
  199. package/types/Options/Classes/Interactivity/Events/ClickEvent.d.ts +0 -10
  200. package/types/Options/Classes/Interactivity/Events/DivEvent.d.ts +0 -13
  201. package/types/Options/Classes/Interactivity/Events/Events.d.ts +0 -16
  202. package/types/Options/Classes/Interactivity/Events/HoverEvent.d.ts +0 -12
  203. package/types/Options/Classes/Interactivity/Events/Parallax.d.ts +0 -10
  204. package/types/Options/Classes/Interactivity/Events/ResizeEvent.d.ts +0 -9
  205. package/types/Options/Classes/Interactivity/Interactivity.d.ts +0 -16
  206. package/types/Options/Classes/Interactivity/Modes/Modes.d.ts +0 -12
  207. package/types/Options/Classes/ManualParticle.d.ts +0 -10
  208. package/types/Options/Classes/Responsive.d.ts +0 -12
  209. package/types/Options/Classes/Theme/Theme.d.ts +0 -12
  210. package/types/Options/Classes/Theme/ThemeDefault.d.ts +0 -11
  211. package/types/Options/Interfaces/IManualParticle.d.ts +0 -7
  212. package/types/Options/Interfaces/IResponsive.d.ts +0 -7
  213. package/types/Options/Interfaces/Interactivity/Events/IClickEvent.d.ts +0 -5
  214. package/types/Options/Interfaces/Interactivity/Events/IDivEvent.d.ts +0 -8
  215. package/types/Options/Interfaces/Interactivity/Events/IEvents.d.ts +0 -11
  216. package/types/Options/Interfaces/Interactivity/Events/IHoverEvent.d.ts +0 -7
  217. package/types/Options/Interfaces/Interactivity/Events/IParallax.d.ts +0 -5
  218. package/types/Options/Interfaces/Interactivity/IInteractivity.d.ts +0 -9
  219. package/types/Options/Interfaces/Interactivity/Modes/IModeDiv.d.ts +0 -4
  220. package/types/Options/Interfaces/Interactivity/Modes/IModes.d.ts +0 -1
  221. package/types/Options/Interfaces/Theme/ITheme.d.ts +0 -7
  222. package/types/Options/Interfaces/Theme/IThemeDefault.d.ts +0 -6
  223. package/umd/Core/Interfaces/IExternalInteractor.js +0 -12
  224. package/umd/Core/Interfaces/IInteractor.js +0 -12
  225. package/umd/Core/Interfaces/IMouseData.js +0 -12
  226. package/umd/Core/Interfaces/IParticlesInteractor.js +0 -12
  227. package/umd/Core/Utils/ExternalInteractorBase.js +0 -21
  228. package/umd/Core/Utils/InteractionManager.js +0 -74
  229. package/umd/Core/Utils/ParticlesInteractorBase.js +0 -21
  230. package/umd/Enums/InteractivityDetect.js +0 -19
  231. package/umd/Enums/Modes/ResponsiveMode.js +0 -18
  232. package/umd/Enums/Modes/ThemeMode.js +0 -19
  233. package/umd/Enums/Types/DivType.js +0 -18
  234. package/umd/Enums/Types/InteractorType.js +0 -18
  235. package/umd/Options/Classes/Interactivity/Events/ClickEvent.js +0 -32
  236. package/umd/Options/Classes/Interactivity/Events/DivEvent.js +0 -41
  237. package/umd/Options/Classes/Interactivity/Events/Events.js +0 -44
  238. package/umd/Options/Classes/Interactivity/Events/HoverEvent.js +0 -35
  239. package/umd/Options/Classes/Interactivity/Events/Parallax.js +0 -36
  240. package/umd/Options/Classes/Interactivity/Interactivity.js +0 -36
  241. package/umd/Options/Classes/Interactivity/Modes/Modes.js +0 -39
  242. package/umd/Options/Classes/ManualParticle.js +0 -35
  243. package/umd/Options/Classes/Responsive.js +0 -43
  244. package/umd/Options/Classes/Theme/Theme.js +0 -35
  245. package/umd/Options/Classes/Theme/ThemeDefault.js +0 -37
  246. package/umd/Options/Interfaces/IManualParticle.js +0 -12
  247. package/umd/Options/Interfaces/IResponsive.js +0 -12
  248. package/umd/Options/Interfaces/Interactivity/Events/IClickEvent.js +0 -12
  249. package/umd/Options/Interfaces/Interactivity/Events/IDivEvent.js +0 -12
  250. package/umd/Options/Interfaces/Interactivity/Events/IEvents.js +0 -12
  251. package/umd/Options/Interfaces/Interactivity/Events/IHoverEvent.js +0 -12
  252. package/umd/Options/Interfaces/Interactivity/Events/IParallax.js +0 -12
  253. package/umd/Options/Interfaces/Interactivity/IInteractivity.js +0 -12
  254. package/umd/Options/Interfaces/Interactivity/Modes/IModeDiv.js +0 -12
  255. package/umd/Options/Interfaces/Interactivity/Modes/IModes.js +0 -12
  256. package/umd/Options/Interfaces/Theme/ITheme.js +0 -12
  257. package/umd/Options/Interfaces/Theme/IThemeDefault.js +0 -12
  258. /package/browser/Options/Interfaces/{Interactivity/Events/IResizeEvent.js → IResizeEvent.js} +0 -0
  259. /package/browser/{Core/Interfaces/IContainerInteractivity.js → Types/EngineInitializers.js} +0 -0
  260. /package/cjs/Options/Interfaces/{Interactivity/Events/IResizeEvent.js → IResizeEvent.js} +0 -0
  261. /package/{browser/Core/Interfaces/IExternalInteractor.js → cjs/Types/EngineInitializers.js} +0 -0
  262. /package/esm/Options/Interfaces/{Interactivity/Events/IResizeEvent.js → IResizeEvent.js} +0 -0
  263. /package/{browser/Core/Interfaces/IInteractor.js → esm/Types/EngineInitializers.js} +0 -0
  264. /package/types/Options/Interfaces/{Interactivity/Events/IResizeEvent.d.ts → IResizeEvent.d.ts} +0 -0
  265. /package/umd/Options/Interfaces/{Interactivity/Events/IResizeEvent.js → IResizeEvent.js} +0 -0
  266. /package/umd/{Core/Interfaces/IContainerInteractivity.js → Types/EngineInitializers.js} +0 -0
@@ -1,18 +1,10 @@
1
1
  import { canvasFirstIndex, canvasTag, generatedAttribute, generatedFalse, generatedTrue, loadMinIndex, loadRandomFactor, none, one, removeDeleteCount, } from "./Utils/Constants.js";
2
- import { itemFromSingleOrMultiple, safeDocument } from "../Utils/Utils.js";
2
+ import { getItemsFromInitializer, itemFromSingleOrMultiple, safeDocument } from "../Utils/Utils.js";
3
3
  import { EventDispatcher } from "../Utils/EventDispatcher.js";
4
4
  import { EventType } from "../Enums/Types/EventType.js";
5
5
  import { getLogger } from "../Utils/LogUtils.js";
6
6
  import { getRandom } from "../Utils/MathUtils.js";
7
7
  const fullPercent = "100%";
8
- async function getItemsFromInitializer(container, map, initializers, force = false) {
9
- let res = map.get(container);
10
- if (!res || force) {
11
- res = await Promise.all([...initializers.values()].map(t => t(container)));
12
- map.set(container, res);
13
- }
14
- return res;
15
- }
16
8
  async function getDataFromUrl(data) {
17
9
  const url = itemFromSingleOrMultiple(data.url, data.index);
18
10
  if (!url) {
@@ -49,7 +41,7 @@ const getCanvasFromContainer = (domContainer) => {
49
41
  return canvasEl;
50
42
  }, getDomContainer = (id, source) => {
51
43
  const documentSafe = safeDocument();
52
- let domContainer = source ?? document.getElementById(id);
44
+ let domContainer = source ?? documentSafe.getElementById(id);
53
45
  if (domContainer) {
54
46
  return domContainer;
55
47
  }
@@ -65,16 +57,17 @@ export class Engine {
65
57
  this._domArray = [];
66
58
  this._eventDispatcher = new EventDispatcher();
67
59
  this._initialized = false;
60
+ this._isRunningLoaders = false;
68
61
  this._loadPromises = new Set();
62
+ this._allLoadersSet = new Set();
63
+ this._executedSet = new Set();
69
64
  this.plugins = [];
70
65
  this.colorManagers = new Map();
71
66
  this.easingFunctions = new Map();
72
67
  this._initializers = {
73
- interactors: new Map(),
74
68
  movers: new Map(),
75
69
  updaters: new Map(),
76
70
  };
77
- this.interactors = new Map();
78
71
  this.movers = new Map();
79
72
  this.updaters = new Map();
80
73
  this.presets = new Map();
@@ -93,7 +86,7 @@ export class Engine {
93
86
  return this._domArray;
94
87
  }
95
88
  get version() {
96
- return "4.0.0-alpha.3";
89
+ return "4.0.0-alpha.5";
97
90
  }
98
91
  addColorManager(manager) {
99
92
  this.colorManagers.set(manager.key, manager);
@@ -118,9 +111,6 @@ export class Engine {
118
111
  addEventListener(type, listener) {
119
112
  this._eventDispatcher.addEventListener(type, listener);
120
113
  }
121
- addInteractor(name, interactorInitializer) {
122
- this._initializers.interactors.set(name, interactorInitializer);
123
- }
124
114
  addMover(name, moverInitializer) {
125
115
  this._initializers.movers.set(name, moverInitializer);
126
116
  }
@@ -162,35 +152,16 @@ export class Engine {
162
152
  clearPlugins(container) {
163
153
  this.updaters.delete(container);
164
154
  this.movers.delete(container);
165
- this.interactors.delete(container);
166
155
  }
167
156
  dispatchEvent(type, args) {
168
157
  this._eventDispatcher.dispatchEvent(type, args);
169
158
  }
170
- dom() {
171
- return this.items;
172
- }
173
- domItem(index) {
174
- return this.item(index);
175
- }
176
- async getAvailablePlugins(container) {
177
- const res = new Map();
178
- for (const plugin of this.plugins) {
179
- if (plugin.needsPlugin(container.actualOptions)) {
180
- res.set(plugin.id, await plugin.getPlugin(container));
181
- }
182
- }
183
- return res;
184
- }
185
159
  getEasing(name) {
186
160
  return this.easingFunctions.get(name) ?? ((value) => value);
187
161
  }
188
162
  getEffectDrawer(type) {
189
163
  return this.effectDrawers.get(type);
190
164
  }
191
- async getInteractors(container, force = false) {
192
- return getItemsFromInitializer(container, this.interactors, this._initializers.interactors, force);
193
- }
194
165
  async getMovers(container, force = false) {
195
166
  return getItemsFromInitializer(container, this.movers, this._initializers.movers, force);
196
167
  }
@@ -216,36 +187,21 @@ export class Engine {
216
187
  return getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
217
188
  }
218
189
  async init() {
219
- if (this._initialized) {
190
+ if (this._initialized || this._isRunningLoaders)
220
191
  return;
221
- }
222
- const executed = new Set(), allLoaders = new Set(this._loadPromises), stack = [...allLoaders];
223
- while (stack.length) {
224
- const loader = stack.shift();
225
- if (!loader) {
226
- continue;
227
- }
228
- if (executed.has(loader)) {
229
- continue;
192
+ this._isRunningLoaders = true;
193
+ this._executedSet = new Set();
194
+ this._allLoadersSet = new Set(this._loadPromises);
195
+ try {
196
+ for (const loader of this._allLoadersSet) {
197
+ await this._runLoader(loader, this._executedSet, this._allLoadersSet);
230
198
  }
231
- executed.add(loader);
232
- const inner = [], origRegister = this.register.bind(this);
233
- this.register = (...loaders) => {
234
- inner.push(...loaders);
235
- for (const loader of loaders) {
236
- allLoaders.add(loader);
237
- }
238
- };
239
- await loader(this);
240
- this.register = origRegister;
241
- stack.unshift(...inner);
242
- this._loadPromises.delete(loader);
243
199
  }
244
- this._loadPromises.clear();
245
- for (const loader of allLoaders) {
246
- this._loadPromises.add(loader);
200
+ finally {
201
+ this._loadPromises.clear();
202
+ this._isRunningLoaders = false;
203
+ this._initialized = true;
247
204
  }
248
- this._initialized = true;
249
205
  }
250
206
  item(index) {
251
207
  const { items } = this, item = items[index];
@@ -275,11 +231,6 @@ export class Engine {
275
231
  await newItem.start();
276
232
  return newItem;
277
233
  }
278
- loadOptions(options, sourceOptions) {
279
- this.plugins.forEach(plugin => {
280
- plugin.loadOptions(options, sourceOptions);
281
- });
282
- }
283
234
  loadParticlesOptions(container, options, ...sourceOptions) {
284
235
  const updaters = this.updaters.get(container);
285
236
  if (!updaters) {
@@ -293,24 +244,27 @@ export class Engine {
293
244
  }
294
245
  await Promise.all(this.items.map(t => t.refresh()));
295
246
  }
296
- register(...loadPromises) {
247
+ async register(...loaders) {
297
248
  if (this._initialized) {
298
- throw new Error(`Register plugins can only be done before calling tsParticles.load()`);
249
+ throw new Error("Register plugins can only be done before calling tsParticles.load()");
299
250
  }
300
- for (const loadPromise of loadPromises) {
301
- this._loadPromises.add(loadPromise);
251
+ for (const loader of loaders) {
252
+ if (this._isRunningLoaders) {
253
+ await this._runLoader(loader, this._executedSet, this._allLoadersSet);
254
+ }
255
+ else {
256
+ this._loadPromises.add(loader);
257
+ }
302
258
  }
303
259
  }
304
260
  removeEventListener(type, listener) {
305
261
  this._eventDispatcher.removeEventListener(type, listener);
306
262
  }
307
- setOnClickHandler(callback) {
308
- const { items } = this;
309
- if (!items.length) {
310
- throw new Error("Click handlers can only be set after calling tsParticles.load()");
311
- }
312
- items.forEach(item => {
313
- item.addClickHandler(callback);
314
- });
263
+ async _runLoader(loader, executed, allLoaders) {
264
+ if (executed.has(loader))
265
+ return;
266
+ executed.add(loader);
267
+ allLoaders.add(loader);
268
+ await loader(this);
315
269
  }
316
270
  }
@@ -3,7 +3,6 @@ import { calcExactPositionOrRandomFromSize, clamp, degToRad, getParticleBaseVelo
3
3
  import { decayOffset, defaultAngle, defaultOpacity, defaultRetryCount, defaultTransform, double, half, identity, millisecondsToSeconds, minZ, none, randomColorValue, rollFactor, squareExp, tryCountIncrement, zIndexFactorOffset, } from "./Utils/Constants.js";
4
4
  import { deepExtend, getPosition, initParticleNumericAnimationValue, isInArray, itemFromSingleOrMultiple, } from "../Utils/Utils.js";
5
5
  import { EventType } from "../Enums/Types/EventType.js";
6
- import { Interactivity } from "../Options/Classes/Interactivity/Interactivity.js";
7
6
  import { MoveDirection } from "../Enums/Directions/MoveDirection.js";
8
7
  import { OutMode } from "../Enums/Modes/OutMode.js";
9
8
  import { ParticleOutType } from "../Enums/Types/ParticleOutType.js";
@@ -53,7 +52,7 @@ export class Particle {
53
52
  };
54
53
  this._calcPosition = (position, zIndex) => {
55
54
  let tryCount = defaultRetryCount, posVec = position ? Vector3d.create(position.x, position.y, zIndex) : undefined;
56
- const container = this.container, plugins = Array.from(container.plugins.values()), outModes = this.options.move.outModes, radius = this.getRadius(), canvasSize = container.canvas.size, abortController = new AbortController(), { signal } = abortController;
55
+ const container = this.container, plugins = Array.from(container.plugins), outModes = this.options.move.outModes, radius = this.getRadius(), canvasSize = container.canvas.size, abortController = new AbortController(), { signal } = abortController;
57
56
  while (!signal.aborted) {
58
57
  for (const plugin of plugins) {
59
58
  const pluginPos = plugin.particlePosition?.(posVec, this);
@@ -173,7 +172,7 @@ export class Particle {
173
172
  this.slow.inRange = false;
174
173
  const container = this.container, pathGenerator = this.pathGenerator, shapeDrawer = this.shape ? container.shapeDrawers.get(this.shape) : undefined;
175
174
  shapeDrawer?.particleDestroy?.(this);
176
- for (const plugin of container.plugins.values()) {
175
+ for (const plugin of container.plugins) {
177
176
  plugin.particleDestroyed?.(this, override);
178
177
  }
179
178
  for (const updater of container.particles.updaters) {
@@ -189,7 +188,7 @@ export class Particle {
189
188
  }
190
189
  draw(delta) {
191
190
  const container = this.container, canvas = container.canvas;
192
- for (const plugin of container.plugins.values()) {
191
+ for (const plugin of container.plugins) {
193
192
  canvas.drawParticlePlugin(plugin, this, delta);
194
193
  }
195
194
  canvas.drawParticle(this, delta);
@@ -240,7 +239,7 @@ export class Particle {
240
239
  return this._cachedTransform;
241
240
  }
242
241
  init(id, position, overrideOptions, group) {
243
- const container = this.container, engine = this._engine;
242
+ const container = this.container;
244
243
  this.id = id;
245
244
  this.group = group;
246
245
  this.effectClose = true;
@@ -300,10 +299,6 @@ export class Particle {
300
299
  if (shapeData) {
301
300
  particlesOptions.load(shapeData.particles);
302
301
  }
303
- const interactivity = new Interactivity(engine, container);
304
- interactivity.load(container.actualOptions.interactivity);
305
- interactivity.load(particlesOptions.interactivity);
306
- this.interactivity = interactivity;
307
302
  this.effectFill = effectData?.fill ?? particlesOptions.effect.fill;
308
303
  this.effectClose = effectData?.close ?? particlesOptions.effect.close;
309
304
  this.shapeFill = shapeData?.fill ?? particlesOptions.shape.fill;
@@ -372,7 +367,7 @@ export class Particle {
372
367
  }
373
368
  effectDrawer?.particleInit?.(container, this);
374
369
  shapeDrawer?.particleInit?.(container, this);
375
- for (const plugin of container.plugins.values()) {
370
+ for (const plugin of container.plugins) {
376
371
  plugin.particleCreated?.(this);
377
372
  }
378
373
  }
@@ -1,13 +1,11 @@
1
1
  import { countOffset, defaultDensityFactor, defaultRemoveQuantity, deleteCount, lengthOffset, minCount, minIndex, minLimit, posOffset, qTreeCapacity, sizeFactor, squareExp, } from "./Utils/Constants.js";
2
2
  import { EventType } from "../Enums/Types/EventType.js";
3
- import { InteractionManager } from "./Utils/InteractionManager.js";
4
3
  import { LimitMode } from "../Enums/Modes/LimitMode.js";
5
4
  import { Particle } from "./Particle.js";
6
5
  import { Point } from "./Utils/Point.js";
7
6
  import { QuadTree } from "./Utils/QuadTree.js";
8
7
  import { Rectangle } from "./Utils/Ranges.js";
9
8
  import { getLogger } from "../Utils/LogUtils.js";
10
- import { getPosition } from "../Utils/Utils.js";
11
9
  import { loadParticlesOptions } from "../Utils/OptionsUtils.js";
12
10
  const qTreeRectangle = (canvasSize) => {
13
11
  const { height, width } = canvasSize;
@@ -18,7 +16,7 @@ export class Particles {
18
16
  this._addToPool = (...particles) => {
19
17
  this._pool.push(...particles);
20
18
  };
21
- this._applyDensity = (options, manualCount, group, groupOptions) => {
19
+ this._applyDensity = (options, pluginsCount, group, groupOptions) => {
22
20
  const numberOptions = options.number;
23
21
  if (!numberOptions.density.enable) {
24
22
  if (group === undefined) {
@@ -29,7 +27,7 @@ export class Particles {
29
27
  }
30
28
  return;
31
29
  }
32
- const densityFactor = this._initDensityFactor(numberOptions.density), optParticlesNumber = numberOptions.value, 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);
30
+ const densityFactor = this._initDensityFactor(numberOptions.density), optParticlesNumber = numberOptions.value, optParticlesLimit = numberOptions.limit.value > minLimit ? numberOptions.limit.value : optParticlesNumber, particlesNumber = Math.min(optParticlesNumber, optParticlesLimit) * densityFactor + pluginsCount, particlesCount = Math.min(this.count, this.filter(t => t.group === group).length);
33
31
  if (group === undefined) {
34
32
  this._limit = numberOptions.limit.value * densityFactor;
35
33
  }
@@ -109,7 +107,6 @@ export class Particles {
109
107
  this._groupLimits = new Map();
110
108
  this._needsSort = false;
111
109
  this._lastZIndex = 0;
112
- this._interactionManager = new InteractionManager(engine, container);
113
110
  this._pluginsInitialized = false;
114
111
  const canvasSize = container.canvas.size;
115
112
  this.quadTree = new QuadTree(qTreeRectangle(canvasSize), qTreeCapacity);
@@ -119,10 +116,6 @@ export class Particles {
119
116
  get count() {
120
117
  return this._array.length;
121
118
  }
122
- addManualParticles() {
123
- const container = this._container, options = container.actualOptions;
124
- options.manualParticles.forEach(p => this.addParticle(p.position ? getPosition(p.position, container.canvas.size) : undefined, p.options));
125
- }
126
119
  addParticle(position, overrideOptions, group, initializer) {
127
120
  const limitMode = this._container.actualOptions.particles.number.limit.mode, limit = group === undefined ? this._limit : (this._groupLimits.get(group) ?? this._limit), currentCount = this.count;
128
121
  if (limit > minLimit) {
@@ -168,22 +161,23 @@ export class Particles {
168
161
  get(index) {
169
162
  return this._array[index];
170
163
  }
171
- handleClickMode(mode) {
172
- this._interactionManager.handleClickMode(mode);
173
- }
174
164
  async init() {
175
165
  const container = this._container, options = container.actualOptions;
176
166
  this._lastZIndex = 0;
177
167
  this._needsSort = false;
168
+ for (const plugin of container.plugins) {
169
+ if (plugin.redrawInit) {
170
+ await plugin.redrawInit();
171
+ }
172
+ }
178
173
  await this.initPlugins();
179
174
  let handled = false;
180
- for (const plugin of container.plugins.values()) {
175
+ for (const plugin of container.plugins) {
181
176
  handled = plugin.particlesInitialization?.() ?? handled;
182
177
  if (handled) {
183
178
  break;
184
179
  }
185
180
  }
186
- this.addManualParticles();
187
181
  if (!handled) {
188
182
  const particlesOptions = options.particles, groups = particlesOptions.groups;
189
183
  for (const group in groups) {
@@ -207,14 +201,13 @@ export class Particles {
207
201
  const container = this._container;
208
202
  this.movers = await this._engine.getMovers(container, true);
209
203
  this.updaters = await this._engine.getUpdaters(container, true);
210
- await this._interactionManager.init();
211
204
  for (const pathGenerator of container.pathGenerators.values()) {
212
205
  pathGenerator.init(container);
213
206
  }
214
207
  }
215
- push(nb, mouse, overrideOptions, group) {
208
+ push(nb, position, overrideOptions, group) {
216
209
  for (let i = 0; i < nb; i++) {
217
- this.addParticle(mouse?.position, overrideOptions, group);
210
+ this.addParticle(position, overrideOptions, group);
218
211
  }
219
212
  }
220
213
  async redraw() {
@@ -241,16 +234,22 @@ export class Particles {
241
234
  this.removeAt(minIndex, quantity, group);
242
235
  }
243
236
  setDensity() {
244
- const options = this._container.actualOptions, groups = options.particles.groups, manualCount = options.manualParticles.length;
237
+ const options = this._container.actualOptions, groups = options.particles.groups;
238
+ let pluginsCount = 0;
239
+ for (const plugin of this._container.plugins) {
240
+ if (plugin.particlesDensityCount) {
241
+ pluginsCount += plugin.particlesDensityCount();
242
+ }
243
+ }
245
244
  for (const group in groups) {
246
245
  const groupData = groups[group];
247
246
  if (!groupData) {
248
247
  continue;
249
248
  }
250
249
  const groupDataOptions = loadParticlesOptions(this._engine, this._container, groupData);
251
- this._applyDensity(groupDataOptions, manualCount, group);
250
+ this._applyDensity(groupDataOptions, pluginsCount, group);
252
251
  }
253
- this._applyDensity(options.particles, manualCount);
252
+ this._applyDensity(options.particles, pluginsCount);
254
253
  }
255
254
  setLastZIndex(zIndex) {
256
255
  this._lastZIndex = zIndex;
@@ -265,7 +264,7 @@ export class Particles {
265
264
  for (const pathGenerator of container.pathGenerators.values()) {
266
265
  pathGenerator.update();
267
266
  }
268
- for (const plugin of container.plugins.values()) {
267
+ for (const plugin of container.plugins) {
269
268
  plugin.update?.(delta);
270
269
  }
271
270
  const resizeFactor = this._resizeFactor;
@@ -277,8 +276,12 @@ export class Particles {
277
276
  particle.initialPosition.y *= resizeFactor.height;
278
277
  }
279
278
  particle.ignoresResizeRatio = false;
280
- this._interactionManager.reset(particle);
281
- for (const plugin of this._container.plugins.values()) {
279
+ for (const plugin of this._container.plugins) {
280
+ if (plugin.particleReset) {
281
+ plugin.particleReset(particle);
282
+ }
283
+ }
284
+ for (const plugin of this._container.plugins) {
282
285
  if (particle.destroyed) {
283
286
  break;
284
287
  }
@@ -309,13 +312,21 @@ export class Particles {
309
312
  }
310
313
  this._addToPool(...particlesToDelete);
311
314
  }
312
- this._interactionManager.externalInteract(delta);
315
+ for (const plugin of container.plugins) {
316
+ if (plugin.postUpdate) {
317
+ plugin.postUpdate(delta);
318
+ }
319
+ }
313
320
  for (const particle of this._array) {
314
321
  for (const updater of this.updaters) {
315
322
  updater.update(particle, delta);
316
323
  }
317
324
  if (!particle.destroyed && !particle.spawning) {
318
- this._interactionManager.particlesInteract(particle, delta);
325
+ for (const plugin of container.plugins) {
326
+ if (plugin.postParticleUpdate) {
327
+ plugin.postParticleUpdate(particle, delta);
328
+ }
329
+ }
319
330
  }
320
331
  }
321
332
  delete this._resizeFactor;
@@ -1,4 +1,4 @@
1
- export const generatedAttribute = "generated", mouseDownEvent = "pointerdown", mouseUpEvent = "pointerup", mouseLeaveEvent = "pointerleave", mouseOutEvent = "pointerout", mouseMoveEvent = "pointermove", touchStartEvent = "touchstart", touchEndEvent = "touchend", touchMoveEvent = "touchmove", touchCancelEvent = "touchcancel", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
1
+ export const generatedAttribute = "generated", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
2
2
  x: 0,
3
3
  y: 0,
4
4
  z: 0,
@@ -7,4 +7,4 @@ export const generatedAttribute = "generated", mouseDownEvent = "pointerdown", m
7
7
  b: 0,
8
8
  c: 0,
9
9
  d: 1,
10
- }, randomColorValue = "random", midColorValue = "mid", double = 2, doublePI = Math.PI * double, defaultFps = 60, defaultAlpha = 1, generatedTrue = "true", generatedFalse = "false", canvasTag = "canvas", defaultRetryCount = 0, squareExp = 2, qTreeCapacity = 4, defaultRemoveQuantity = 1, defaultRatio = 1, defaultReduceFactor = 1, subdivideCount = 4, inverseFactorNumerator = 1.0, rgbMax = 255, hMax = 360, sMax = 100, lMax = 100, hMin = 0, sMin = 0, hPhase = 60, empty = 0, quarter = 0.25, threeQuarter = half + quarter, minVelocity = 0, defaultTransformValue = 1, minimumSize = 0, minimumLength = 0, zIndexFactorOffset = 1, defaultOpacity = 1, clickRadius = 1, touchEndLengthOffset = 1, minCoordinate = 0, removeDeleteCount = 1, removeMinIndex = 0, defaultFpsLimit = 120, minFpsLimit = 0, canvasFirstIndex = 0, loadRandomFactor = 10000, loadMinIndex = 0, one = 1, none = 0, decayOffset = 1, tryCountIncrement = 1, minRetries = 0, rollFactor = 1, minZ = 0, defaultRadius = 0, posOffset = -quarter, sizeFactor = 1.5, minLimit = 0, countOffset = 1, minCount = 0, minIndex = 0, manualCount = 0, lengthOffset = 1, defaultDensityFactor = 1, deleteCount = 1, touchDelay = 500, manualDefaultPosition = 50, defaultAngle = 0, identity = 1, minStrokeWidth = 0, lFactor = 1, lMin = 0, triple = 3, sextuple = 6, sNormalizedOffset = 1, phaseNumerator = 1, defaultRgbMin = 0, defaultVelocity = 0, defaultLoops = 0, defaultTime = 0;
10
+ }, randomColorValue = "random", midColorValue = "mid", double = 2, doublePI = Math.PI * double, defaultFps = 60, defaultAlpha = 1, generatedTrue = "true", generatedFalse = "false", canvasTag = "canvas", defaultRetryCount = 0, squareExp = 2, qTreeCapacity = 4, defaultRemoveQuantity = 1, defaultRatio = 1, defaultReduceFactor = 1, subdivideCount = 4, inverseFactorNumerator = 1.0, rgbMax = 255, hMax = 360, sMax = 100, lMax = 100, hMin = 0, sMin = 0, hPhase = 60, empty = 0, quarter = 0.25, threeQuarter = half + quarter, minVelocity = 0, defaultTransformValue = 1, minimumSize = 0, minimumLength = 0, zIndexFactorOffset = 1, defaultOpacity = 1, clickRadius = 1, touchEndLengthOffset = 1, minCoordinate = 0, removeDeleteCount = 1, removeMinIndex = 0, defaultFpsLimit = 120, minFpsLimit = 0, canvasFirstIndex = 0, loadRandomFactor = 10000, loadMinIndex = 0, one = 1, none = 0, decayOffset = 1, tryCountIncrement = 1, minRetries = 0, rollFactor = 1, minZ = 0, defaultRadius = 0, posOffset = -quarter, sizeFactor = 1.5, minLimit = 0, countOffset = 1, minCount = 0, minIndex = 0, lengthOffset = 1, defaultDensityFactor = 1, deleteCount = 1, touchDelay = 500, manualDefaultPosition = 50, defaultAngle = 0, identity = 1, minStrokeWidth = 0, lFactor = 1, lMin = 0, triple = 3, sextuple = 6, sNormalizedOffset = 1, phaseNumerator = 1, defaultRgbMin = 0, defaultVelocity = 0, defaultLoops = 0, defaultTime = 0;