@tsparticles/engine 3.9.1 → 4.0.0-alpha.1

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 (431) hide show
  1. package/638.min.js +2 -0
  2. package/638.min.js.LICENSE.txt +1 -0
  3. package/browser/Core/Canvas.js +126 -181
  4. package/browser/Core/Container.js +22 -18
  5. package/browser/Core/Engine.js +64 -54
  6. package/browser/Core/Particle.js +43 -48
  7. package/browser/Core/Particles.js +33 -24
  8. package/browser/Core/Retina.js +2 -3
  9. package/browser/Core/Utils/Constants.js +2 -2
  10. package/browser/Core/Utils/EventListeners.js +74 -64
  11. package/browser/Core/Utils/QuadTree.js +1 -1
  12. package/browser/Core/Utils/Ranges.js +2 -2
  13. package/browser/Core/Utils/Vectors.js +15 -21
  14. package/browser/Options/Classes/AnimatableColor.js +3 -3
  15. package/browser/Options/Classes/AnimationOptions.js +1 -1
  16. package/browser/Options/Classes/ColorAnimation.js +1 -1
  17. package/browser/Options/Classes/Options.js +13 -10
  18. package/browser/Options/Classes/Particles/Move/Move.js +1 -4
  19. package/browser/Options/Classes/Particles/Move/MoveAngle.js +1 -1
  20. package/browser/Options/Classes/Particles/Move/MoveAttract.js +1 -1
  21. package/browser/Options/Classes/Particles/Move/MoveGravity.js +1 -1
  22. package/browser/Options/Classes/Particles/Move/Spin.js +1 -1
  23. package/browser/Options/Classes/Particles/ParticlesOptions.js +0 -6
  24. package/browser/Options/Classes/Particles/Stroke.js +1 -1
  25. package/browser/Options/Classes/ValueWithRandom.js +1 -1
  26. package/browser/Utils/CanvasUtils.js +65 -21
  27. package/browser/Utils/ColorUtils.js +61 -45
  28. package/browser/Utils/EventDispatcher.js +3 -1
  29. package/browser/Utils/LogUtils.js +22 -0
  30. package/browser/Utils/{NumberUtils.js → MathUtils.js} +14 -7
  31. package/browser/Utils/Utils.js +23 -125
  32. package/browser/bundle.js +3 -3
  33. package/browser/export-types.js +1 -99
  34. package/browser/exports.js +2 -9
  35. package/browser/index.js +3 -7
  36. package/browser/initEngine.js +4 -0
  37. package/cjs/Core/Canvas.js +136 -195
  38. package/cjs/Core/Container.js +57 -57
  39. package/cjs/Core/Engine.js +77 -71
  40. package/cjs/Core/Interfaces/Colors.js +1 -2
  41. package/cjs/Core/Interfaces/IBounds.js +1 -2
  42. package/cjs/Core/Interfaces/IBubbleParticleData.js +1 -2
  43. package/cjs/Core/Interfaces/ICircleBouncer.js +1 -2
  44. package/cjs/Core/Interfaces/IColorManager.js +1 -2
  45. package/cjs/Core/Interfaces/IContainerInteractivity.js +1 -2
  46. package/cjs/Core/Interfaces/IContainerPlugin.js +1 -2
  47. package/cjs/Core/Interfaces/ICoordinates.js +1 -2
  48. package/cjs/Core/Interfaces/IDelta.js +1 -2
  49. package/cjs/Core/Interfaces/IDimension.js +1 -2
  50. package/cjs/Core/Interfaces/IDistance.js +1 -2
  51. package/cjs/Core/Interfaces/IDrawParticleParams.js +1 -2
  52. package/cjs/Core/Interfaces/IEffectDrawer.js +1 -2
  53. package/cjs/Core/Interfaces/IExternalInteractor.js +1 -2
  54. package/cjs/Core/Interfaces/IInteractor.js +1 -2
  55. package/cjs/Core/Interfaces/ILoadParams.js +1 -2
  56. package/cjs/Core/Interfaces/IMouseData.js +1 -2
  57. package/cjs/Core/Interfaces/IMovePathGenerator.js +1 -2
  58. package/cjs/Core/Interfaces/IParticleColorStyle.js +1 -2
  59. package/cjs/Core/Interfaces/IParticleHslAnimation.js +1 -2
  60. package/cjs/Core/Interfaces/IParticleLife.js +1 -2
  61. package/cjs/Core/Interfaces/IParticleMover.js +1 -2
  62. package/cjs/Core/Interfaces/IParticleRetinaProps.js +1 -2
  63. package/cjs/Core/Interfaces/IParticleRoll.js +1 -2
  64. package/cjs/Core/Interfaces/IParticleTransformValues.js +1 -2
  65. package/cjs/Core/Interfaces/IParticleUpdater.js +1 -2
  66. package/cjs/Core/Interfaces/IParticleValueAnimation.js +1 -2
  67. package/cjs/Core/Interfaces/IParticlesInteractor.js +1 -2
  68. package/cjs/Core/Interfaces/IPlugin.js +1 -2
  69. package/cjs/Core/Interfaces/IPositionFromSizeParams.js +1 -2
  70. package/cjs/Core/Interfaces/IRangeValue.js +1 -2
  71. package/cjs/Core/Interfaces/IShapeDrawData.js +1 -2
  72. package/cjs/Core/Interfaces/IShapeDrawer.js +1 -2
  73. package/cjs/Core/Interfaces/IShapeValues.js +1 -2
  74. package/cjs/Core/Interfaces/ISlowParticleData.js +1 -2
  75. package/cjs/Core/Particle.js +99 -108
  76. package/cjs/Core/Particles.js +63 -58
  77. package/cjs/Core/Retina.js +13 -18
  78. package/cjs/Core/Utils/Constants.js +3 -7
  79. package/cjs/Core/Utils/EventListeners.js +94 -88
  80. package/cjs/Core/Utils/ExternalInteractorBase.js +3 -7
  81. package/cjs/Core/Utils/InteractionManager.js +4 -8
  82. package/cjs/Core/Utils/ParticlesInteractorBase.js +3 -7
  83. package/cjs/Core/Utils/Point.js +1 -5
  84. package/cjs/Core/Utils/QuadTree.js +10 -14
  85. package/cjs/Core/Utils/Ranges.js +14 -20
  86. package/cjs/Core/Utils/Vectors.js +24 -35
  87. package/cjs/Enums/AnimationStatus.js +2 -5
  88. package/cjs/Enums/Directions/MoveDirection.js +2 -5
  89. package/cjs/Enums/Directions/OutModeDirection.js +2 -5
  90. package/cjs/Enums/Directions/RotateDirection.js +2 -5
  91. package/cjs/Enums/InteractivityDetect.js +2 -5
  92. package/cjs/Enums/Modes/AnimationMode.js +2 -5
  93. package/cjs/Enums/Modes/LimitMode.js +2 -5
  94. package/cjs/Enums/Modes/OutMode.js +2 -5
  95. package/cjs/Enums/Modes/PixelMode.js +2 -5
  96. package/cjs/Enums/Modes/ResponsiveMode.js +2 -5
  97. package/cjs/Enums/Modes/ThemeMode.js +2 -5
  98. package/cjs/Enums/Types/AlterType.js +2 -5
  99. package/cjs/Enums/Types/DestroyType.js +2 -5
  100. package/cjs/Enums/Types/DivType.js +2 -5
  101. package/cjs/Enums/Types/EasingType.js +2 -5
  102. package/cjs/Enums/Types/EventType.js +2 -5
  103. package/cjs/Enums/Types/GradientType.js +2 -5
  104. package/cjs/Enums/Types/InteractorType.js +2 -5
  105. package/cjs/Enums/Types/ParticleOutType.js +2 -5
  106. package/cjs/Enums/Types/StartValueType.js +2 -5
  107. package/cjs/Options/Classes/AnimatableColor.js +10 -14
  108. package/cjs/Options/Classes/AnimationOptions.js +14 -19
  109. package/cjs/Options/Classes/Background/Background.js +6 -10
  110. package/cjs/Options/Classes/ColorAnimation.js +6 -10
  111. package/cjs/Options/Classes/FullScreen/FullScreen.js +3 -7
  112. package/cjs/Options/Classes/HslAnimation.js +7 -11
  113. package/cjs/Options/Classes/Interactivity/Events/ClickEvent.js +3 -7
  114. package/cjs/Options/Classes/Interactivity/Events/DivEvent.js +5 -9
  115. package/cjs/Options/Classes/Interactivity/Events/Events.js +14 -18
  116. package/cjs/Options/Classes/Interactivity/Events/HoverEvent.js +5 -9
  117. package/cjs/Options/Classes/Interactivity/Events/Parallax.js +3 -7
  118. package/cjs/Options/Classes/Interactivity/Events/ResizeEvent.js +3 -7
  119. package/cjs/Options/Classes/Interactivity/Interactivity.js +9 -13
  120. package/cjs/Options/Classes/Interactivity/Modes/Modes.js +3 -7
  121. package/cjs/Options/Classes/ManualParticle.js +10 -14
  122. package/cjs/Options/Classes/Options.js +41 -42
  123. package/cjs/Options/Classes/OptionsColor.js +5 -9
  124. package/cjs/Options/Classes/Particles/Bounce/ParticlesBounce.js +6 -10
  125. package/cjs/Options/Classes/Particles/Bounce/ParticlesBounceFactor.js +2 -6
  126. package/cjs/Options/Classes/Particles/Effect/Effect.js +5 -9
  127. package/cjs/Options/Classes/Particles/Move/Move.js +26 -33
  128. package/cjs/Options/Classes/Particles/Move/MoveAngle.js +6 -10
  129. package/cjs/Options/Classes/Particles/Move/MoveAttract.js +5 -9
  130. package/cjs/Options/Classes/Particles/Move/MoveCenter.js +5 -9
  131. package/cjs/Options/Classes/Particles/Move/MoveGravity.js +6 -10
  132. package/cjs/Options/Classes/Particles/Move/OutModes.js +5 -9
  133. package/cjs/Options/Classes/Particles/Move/Path/MovePath.js +7 -11
  134. package/cjs/Options/Classes/Particles/Move/Spin.js +7 -11
  135. package/cjs/Options/Classes/Particles/Number/ParticlesDensity.js +3 -7
  136. package/cjs/Options/Classes/Particles/Number/ParticlesNumber.js +7 -11
  137. package/cjs/Options/Classes/Particles/Number/ParticlesNumberLimit.js +5 -9
  138. package/cjs/Options/Classes/Particles/Opacity/Opacity.js +6 -10
  139. package/cjs/Options/Classes/Particles/Opacity/OpacityAnimation.js +6 -10
  140. package/cjs/Options/Classes/Particles/ParticlesOptions.js +29 -39
  141. package/cjs/Options/Classes/Particles/Shape/Shape.js +5 -9
  142. package/cjs/Options/Classes/Particles/Size/Size.js +6 -10
  143. package/cjs/Options/Classes/Particles/Size/SizeAnimation.js +6 -10
  144. package/cjs/Options/Classes/Particles/Stroke.js +8 -12
  145. package/cjs/Options/Classes/Particles/ZIndex/ZIndex.js +4 -8
  146. package/cjs/Options/Classes/Responsive.js +13 -17
  147. package/cjs/Options/Classes/Theme/Theme.js +7 -11
  148. package/cjs/Options/Classes/Theme/ThemeDefault.js +5 -9
  149. package/cjs/Options/Classes/ValueWithRandom.js +12 -18
  150. package/cjs/Options/Interfaces/Background/IBackground.js +1 -2
  151. package/cjs/Options/Interfaces/FullScreen/IFullScreen.js +1 -2
  152. package/cjs/Options/Interfaces/IAnimatable.js +1 -2
  153. package/cjs/Options/Interfaces/IAnimatableColor.js +1 -2
  154. package/cjs/Options/Interfaces/IAnimation.js +1 -2
  155. package/cjs/Options/Interfaces/IColorAnimation.js +1 -2
  156. package/cjs/Options/Interfaces/IHslAnimation.js +1 -2
  157. package/cjs/Options/Interfaces/IManualParticle.js +1 -2
  158. package/cjs/Options/Interfaces/IOptionLoader.js +1 -2
  159. package/cjs/Options/Interfaces/IOptions.js +1 -2
  160. package/cjs/Options/Interfaces/IOptionsColor.js +1 -2
  161. package/cjs/Options/Interfaces/IResponsive.js +1 -2
  162. package/cjs/Options/Interfaces/IValueWithRandom.js +1 -2
  163. package/cjs/Options/Interfaces/Interactivity/Events/IClickEvent.js +1 -2
  164. package/cjs/Options/Interfaces/Interactivity/Events/IDivEvent.js +1 -2
  165. package/cjs/Options/Interfaces/Interactivity/Events/IEvents.js +1 -2
  166. package/cjs/Options/Interfaces/Interactivity/Events/IHoverEvent.js +1 -2
  167. package/cjs/Options/Interfaces/Interactivity/Events/IParallax.js +1 -2
  168. package/cjs/Options/Interfaces/Interactivity/Events/IResizeEvent.js +1 -2
  169. package/cjs/Options/Interfaces/Interactivity/IInteractivity.js +1 -2
  170. package/cjs/Options/Interfaces/Interactivity/Modes/IModeDiv.js +1 -2
  171. package/cjs/Options/Interfaces/Interactivity/Modes/IModes.js +1 -2
  172. package/cjs/Options/Interfaces/Particles/Bounce/IParticlesBounce.js +1 -2
  173. package/cjs/Options/Interfaces/Particles/Effect/IEffect.js +1 -2
  174. package/cjs/Options/Interfaces/Particles/IParticlesOptions.js +1 -2
  175. package/cjs/Options/Interfaces/Particles/IStroke.js +1 -2
  176. package/cjs/Options/Interfaces/Particles/Move/IMove.js +1 -2
  177. package/cjs/Options/Interfaces/Particles/Move/IMoveAngle.js +1 -2
  178. package/cjs/Options/Interfaces/Particles/Move/IMoveAttract.js +1 -2
  179. package/cjs/Options/Interfaces/Particles/Move/IMoveCenter.js +1 -2
  180. package/cjs/Options/Interfaces/Particles/Move/IMoveGravity.js +1 -2
  181. package/cjs/Options/Interfaces/Particles/Move/IOutModes.js +1 -2
  182. package/cjs/Options/Interfaces/Particles/Move/ISpin.js +1 -2
  183. package/cjs/Options/Interfaces/Particles/Move/Path/IMovePath.js +1 -2
  184. package/cjs/Options/Interfaces/Particles/Number/IParticlesDensity.js +1 -2
  185. package/cjs/Options/Interfaces/Particles/Number/IParticlesNumber.js +1 -2
  186. package/cjs/Options/Interfaces/Particles/Number/IParticlesNumberLimit.js +1 -2
  187. package/cjs/Options/Interfaces/Particles/Opacity/IOpacity.js +1 -2
  188. package/cjs/Options/Interfaces/Particles/Opacity/IOpacityAnimation.js +1 -2
  189. package/cjs/Options/Interfaces/Particles/Shape/IShape.js +1 -2
  190. package/cjs/Options/Interfaces/Particles/Size/ISize.js +1 -2
  191. package/cjs/Options/Interfaces/Particles/Size/ISizeAnimation.js +1 -2
  192. package/cjs/Options/Interfaces/Particles/ZIndex/IZIndex.js +1 -2
  193. package/cjs/Options/Interfaces/Theme/ITheme.js +1 -2
  194. package/cjs/Options/Interfaces/Theme/IThemeDefault.js +1 -2
  195. package/cjs/Types/CustomEventArgs.js +1 -2
  196. package/cjs/Types/CustomEventListener.js +1 -2
  197. package/cjs/Types/EasingFunction.js +1 -2
  198. package/cjs/Types/ExportResult.js +1 -2
  199. package/cjs/Types/ISourceOptions.js +1 -2
  200. package/cjs/Types/ParticlesGroups.js +1 -2
  201. package/cjs/Types/PathOptions.js +1 -2
  202. package/cjs/Types/RangeValue.js +1 -2
  203. package/cjs/Types/RecursivePartial.js +1 -2
  204. package/cjs/Types/ShapeData.js +1 -2
  205. package/cjs/Types/SingleOrMultiple.js +1 -2
  206. package/cjs/Utils/CanvasUtils.js +86 -55
  207. package/cjs/Utils/ColorUtils.js +136 -141
  208. package/cjs/Utils/EventDispatcher.js +8 -10
  209. package/cjs/Utils/LogUtils.js +22 -0
  210. package/{esm/Utils/NumberUtils.js → cjs/Utils/MathUtils.js} +14 -7
  211. package/cjs/Utils/OptionsUtils.js +4 -8
  212. package/cjs/Utils/TypeUtils.js +7 -16
  213. package/cjs/Utils/Utils.js +104 -239
  214. package/cjs/bundle.js +5 -22
  215. package/cjs/export-types.js +1 -115
  216. package/cjs/exports.js +77 -100
  217. package/cjs/index.js +5 -26
  218. package/cjs/initEngine.js +4 -0
  219. package/dist_browser_Core_Container_js.js +102 -0
  220. package/esm/Core/Canvas.js +126 -181
  221. package/esm/Core/Container.js +22 -18
  222. package/esm/Core/Engine.js +64 -54
  223. package/esm/Core/Particle.js +43 -48
  224. package/esm/Core/Particles.js +33 -24
  225. package/esm/Core/Retina.js +2 -3
  226. package/esm/Core/Utils/Constants.js +2 -2
  227. package/esm/Core/Utils/EventListeners.js +74 -64
  228. package/esm/Core/Utils/QuadTree.js +1 -1
  229. package/esm/Core/Utils/Ranges.js +2 -2
  230. package/esm/Core/Utils/Vectors.js +15 -21
  231. package/esm/Enums/RangeType.js +5 -0
  232. package/esm/Options/Classes/AnimatableColor.js +3 -3
  233. package/esm/Options/Classes/AnimationOptions.js +1 -1
  234. package/esm/Options/Classes/ColorAnimation.js +1 -1
  235. package/esm/Options/Classes/Options.js +13 -10
  236. package/esm/Options/Classes/Particles/Move/Move.js +1 -4
  237. package/esm/Options/Classes/Particles/Move/MoveAngle.js +1 -1
  238. package/esm/Options/Classes/Particles/Move/MoveAttract.js +1 -1
  239. package/esm/Options/Classes/Particles/Move/MoveGravity.js +1 -1
  240. package/esm/Options/Classes/Particles/Move/Spin.js +1 -1
  241. package/esm/Options/Classes/Particles/ParticlesOptions.js +0 -6
  242. package/esm/Options/Classes/Particles/Stroke.js +1 -1
  243. package/esm/Options/Classes/ValueWithRandom.js +1 -1
  244. package/esm/Utils/CanvasUtils.js +65 -21
  245. package/esm/Utils/ColorUtils.js +61 -45
  246. package/esm/Utils/EventDispatcher.js +3 -1
  247. package/esm/Utils/LogUtils.js +22 -0
  248. package/esm/Utils/MathUtils.js +158 -0
  249. package/esm/Utils/Utils.js +23 -125
  250. package/esm/bundle.js +3 -3
  251. package/esm/export-types.js +1 -99
  252. package/esm/exports.js +2 -9
  253. package/esm/index.js +3 -7
  254. package/esm/initEngine.js +4 -0
  255. package/package.json +3 -2
  256. package/report.html +5 -4
  257. package/scripts/install.js +204 -118
  258. package/tsparticles.engine.js +492 -451
  259. package/tsparticles.engine.min.js +1 -1
  260. package/tsparticles.engine.min.js.LICENSE.txt +1 -1
  261. package/types/Core/Canvas.d.ts +6 -9
  262. package/types/Core/Container.d.ts +1 -0
  263. package/types/Core/Engine.d.ts +20 -16
  264. package/types/Core/Interfaces/Colors.d.ts +46 -2
  265. package/types/Core/Interfaces/IColorManager.d.ts +1 -1
  266. package/types/Core/Interfaces/IContainerPlugin.d.ts +4 -0
  267. package/types/Core/Interfaces/IDrawParticleParams.d.ts +0 -4
  268. package/types/Core/Interfaces/IEffectDrawer.d.ts +2 -1
  269. package/types/Core/Interfaces/IShapeDrawData.d.ts +2 -0
  270. package/types/Core/Interfaces/IShapeDrawer.d.ts +1 -0
  271. package/types/Core/Particle.d.ts +4 -5
  272. package/types/Core/Particles.d.ts +1 -1
  273. package/types/Core/Utils/Constants.d.ts +2 -2
  274. package/types/Core/Utils/EventListeners.d.ts +1 -0
  275. package/types/Core/Utils/Vectors.d.ts +3 -3
  276. package/types/Options/Classes/Options.d.ts +1 -2
  277. package/types/Options/Classes/OptionsColor.d.ts +2 -2
  278. package/types/Options/Classes/Particles/Move/Move.d.ts +0 -2
  279. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +0 -4
  280. package/types/Options/Interfaces/IOptions.d.ts +1 -2
  281. package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +0 -4
  282. package/types/Options/Interfaces/Particles/Move/IMove.d.ts +0 -2
  283. package/types/Utils/CanvasUtils.d.ts +4 -1
  284. package/types/Utils/ColorUtils.d.ts +2 -2
  285. package/types/Utils/LogUtils.d.ts +11 -0
  286. package/types/Utils/{NumberUtils.d.ts → MathUtils.d.ts} +2 -1
  287. package/types/Utils/TypeUtils.d.ts +2 -2
  288. package/types/Utils/Utils.d.ts +4 -16
  289. package/types/export-types.d.ts +91 -101
  290. package/types/exports.d.ts +2 -9
  291. package/types/index.d.ts +1 -1
  292. package/types/initEngine.d.ts +2 -0
  293. package/umd/Core/Canvas.js +123 -178
  294. package/umd/Core/Container.js +25 -21
  295. package/umd/Core/Engine.js +97 -53
  296. package/umd/Core/Particle.js +54 -59
  297. package/umd/Core/Particles.js +33 -24
  298. package/umd/Core/Retina.js +9 -10
  299. package/umd/Core/Utils/Constants.js +3 -3
  300. package/umd/Core/Utils/EventListeners.js +72 -62
  301. package/umd/Core/Utils/QuadTree.js +3 -3
  302. package/umd/Core/Utils/Ranges.js +4 -4
  303. package/umd/Core/Utils/Vectors.js +15 -21
  304. package/umd/Options/Classes/AnimatableColor.js +3 -3
  305. package/umd/Options/Classes/AnimationOptions.js +6 -6
  306. package/umd/Options/Classes/ColorAnimation.js +3 -3
  307. package/umd/Options/Classes/Options.js +16 -13
  308. package/umd/Options/Classes/Particles/Move/Move.js +5 -8
  309. package/umd/Options/Classes/Particles/Move/MoveAngle.js +4 -4
  310. package/umd/Options/Classes/Particles/Move/MoveAttract.js +3 -3
  311. package/umd/Options/Classes/Particles/Move/MoveGravity.js +4 -4
  312. package/umd/Options/Classes/Particles/Move/Spin.js +3 -3
  313. package/umd/Options/Classes/Particles/ParticlesOptions.js +1 -7
  314. package/umd/Options/Classes/Particles/Stroke.js +4 -4
  315. package/umd/Options/Classes/ValueWithRandom.js +3 -3
  316. package/umd/Utils/CanvasUtils.js +69 -22
  317. package/umd/Utils/ColorUtils.js +72 -56
  318. package/umd/Utils/EventDispatcher.js +3 -1
  319. package/umd/Utils/LogUtils.js +36 -0
  320. package/umd/Utils/{NumberUtils.js → MathUtils.js} +16 -8
  321. package/umd/Utils/Utils.js +36 -141
  322. package/umd/bundle.js +4 -4
  323. package/umd/export-types.js +1 -114
  324. package/umd/exports.js +3 -10
  325. package/umd/index.js +4 -8
  326. package/umd/{init.js → initEngine.js} +3 -5
  327. package/browser/Core/Interfaces/IRectSideResult.js +0 -1
  328. package/browser/Core/Interfaces/ITrailFillData.js +0 -1
  329. package/browser/Enums/Modes/CollisionMode.js +0 -6
  330. package/browser/Options/Classes/BackgroundMask/BackgroundMask.js +0 -24
  331. package/browser/Options/Classes/BackgroundMask/BackgroundMaskCover.js +0 -21
  332. package/browser/Options/Classes/Particles/Collisions/Collisions.js +0 -33
  333. package/browser/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +0 -14
  334. package/browser/Options/Classes/Particles/Collisions/CollisionsOverlap.js +0 -18
  335. package/browser/Options/Classes/Particles/Move/MoveTrail.js +0 -23
  336. package/browser/Options/Classes/Particles/Move/MoveTrailFill.js +0 -15
  337. package/browser/Options/Classes/Particles/Shadow.js +0 -35
  338. package/browser/Options/Interfaces/BackgroundMask/IBackgroundMask.js +0 -1
  339. package/browser/Options/Interfaces/BackgroundMask/IBackgroundMaskCover.js +0 -1
  340. package/browser/Options/Interfaces/Particles/Collisions/ICollisions.js +0 -1
  341. package/browser/Options/Interfaces/Particles/Collisions/ICollisionsAbsorb.js +0 -1
  342. package/browser/Options/Interfaces/Particles/Collisions/ICollisionsOverlap.js +0 -1
  343. package/browser/Options/Interfaces/Particles/IShadow.js +0 -1
  344. package/browser/Options/Interfaces/Particles/Move/IMoveTrail.js +0 -1
  345. package/browser/Options/Interfaces/Particles/Move/IMoveTrailFill.js +0 -1
  346. package/browser/init.js +0 -6
  347. package/cjs/Core/Interfaces/IRectSideResult.js +0 -2
  348. package/cjs/Core/Interfaces/ITrailFillData.js +0 -2
  349. package/cjs/Enums/Modes/CollisionMode.js +0 -9
  350. package/cjs/Options/Classes/BackgroundMask/BackgroundMask.js +0 -28
  351. package/cjs/Options/Classes/BackgroundMask/BackgroundMaskCover.js +0 -25
  352. package/cjs/Options/Classes/Particles/Collisions/Collisions.js +0 -37
  353. package/cjs/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +0 -18
  354. package/cjs/Options/Classes/Particles/Collisions/CollisionsOverlap.js +0 -22
  355. package/cjs/Options/Classes/Particles/Move/MoveTrail.js +0 -27
  356. package/cjs/Options/Classes/Particles/Move/MoveTrailFill.js +0 -19
  357. package/cjs/Options/Classes/Particles/Shadow.js +0 -39
  358. package/cjs/Options/Interfaces/BackgroundMask/IBackgroundMask.js +0 -2
  359. package/cjs/Options/Interfaces/BackgroundMask/IBackgroundMaskCover.js +0 -2
  360. package/cjs/Options/Interfaces/Particles/Collisions/ICollisions.js +0 -2
  361. package/cjs/Options/Interfaces/Particles/Collisions/ICollisionsAbsorb.js +0 -2
  362. package/cjs/Options/Interfaces/Particles/Collisions/ICollisionsOverlap.js +0 -2
  363. package/cjs/Options/Interfaces/Particles/IShadow.js +0 -2
  364. package/cjs/Options/Interfaces/Particles/Move/IMoveTrail.js +0 -2
  365. package/cjs/Options/Interfaces/Particles/Move/IMoveTrailFill.js +0 -2
  366. package/cjs/Types/RangeType.js +0 -8
  367. package/cjs/Utils/NumberUtils.js +0 -177
  368. package/cjs/init.js +0 -9
  369. package/esm/Core/Interfaces/IRectSideResult.js +0 -1
  370. package/esm/Core/Interfaces/ITrailFillData.js +0 -1
  371. package/esm/Enums/Modes/CollisionMode.js +0 -6
  372. package/esm/Options/Classes/BackgroundMask/BackgroundMask.js +0 -24
  373. package/esm/Options/Classes/BackgroundMask/BackgroundMaskCover.js +0 -21
  374. package/esm/Options/Classes/Particles/Collisions/Collisions.js +0 -33
  375. package/esm/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +0 -14
  376. package/esm/Options/Classes/Particles/Collisions/CollisionsOverlap.js +0 -18
  377. package/esm/Options/Classes/Particles/Move/MoveTrail.js +0 -23
  378. package/esm/Options/Classes/Particles/Move/MoveTrailFill.js +0 -15
  379. package/esm/Options/Classes/Particles/Shadow.js +0 -35
  380. package/esm/Options/Interfaces/BackgroundMask/IBackgroundMask.js +0 -1
  381. package/esm/Options/Interfaces/BackgroundMask/IBackgroundMaskCover.js +0 -1
  382. package/esm/Options/Interfaces/Particles/Collisions/ICollisions.js +0 -1
  383. package/esm/Options/Interfaces/Particles/Collisions/ICollisionsAbsorb.js +0 -1
  384. package/esm/Options/Interfaces/Particles/Collisions/ICollisionsOverlap.js +0 -1
  385. package/esm/Options/Interfaces/Particles/IShadow.js +0 -1
  386. package/esm/Options/Interfaces/Particles/Move/IMoveTrail.js +0 -1
  387. package/esm/Options/Interfaces/Particles/Move/IMoveTrailFill.js +0 -1
  388. package/esm/init.js +0 -6
  389. package/types/Core/Interfaces/IRectSideResult.d.ts +0 -5
  390. package/types/Core/Interfaces/ITrailFillData.d.ts +0 -6
  391. package/types/Enums/Modes/CollisionMode.d.ts +0 -5
  392. package/types/Options/Classes/BackgroundMask/BackgroundMask.d.ts +0 -11
  393. package/types/Options/Classes/BackgroundMask/BackgroundMaskCover.d.ts +0 -11
  394. package/types/Options/Classes/Particles/Collisions/Collisions.d.ts +0 -18
  395. package/types/Options/Classes/Particles/Collisions/CollisionsAbsorb.d.ts +0 -8
  396. package/types/Options/Classes/Particles/Collisions/CollisionsOverlap.d.ts +0 -9
  397. package/types/Options/Classes/Particles/Move/MoveTrail.d.ts +0 -11
  398. package/types/Options/Classes/Particles/Move/MoveTrailFill.d.ts +0 -9
  399. package/types/Options/Classes/Particles/Shadow.d.ts +0 -13
  400. package/types/Options/Interfaces/BackgroundMask/IBackgroundMask.d.ts +0 -8
  401. package/types/Options/Interfaces/BackgroundMask/IBackgroundMaskCover.d.ts +0 -6
  402. package/types/Options/Interfaces/Particles/Collisions/ICollisions.d.ts +0 -13
  403. package/types/Options/Interfaces/Particles/Collisions/ICollisionsAbsorb.d.ts +0 -3
  404. package/types/Options/Interfaces/Particles/Collisions/ICollisionsOverlap.d.ts +0 -4
  405. package/types/Options/Interfaces/Particles/IShadow.d.ts +0 -8
  406. package/types/Options/Interfaces/Particles/Move/IMoveTrail.d.ts +0 -6
  407. package/types/Options/Interfaces/Particles/Move/IMoveTrailFill.d.ts +0 -5
  408. package/types/init.d.ts +0 -2
  409. package/umd/Core/Interfaces/IRectSideResult.js +0 -12
  410. package/umd/Core/Interfaces/ITrailFillData.js +0 -12
  411. package/umd/Enums/Modes/CollisionMode.js +0 -19
  412. package/umd/Options/Classes/BackgroundMask/BackgroundMask.js +0 -38
  413. package/umd/Options/Classes/BackgroundMask/BackgroundMaskCover.js +0 -35
  414. package/umd/Options/Classes/Particles/Collisions/Collisions.js +0 -47
  415. package/umd/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +0 -28
  416. package/umd/Options/Classes/Particles/Collisions/CollisionsOverlap.js +0 -32
  417. package/umd/Options/Classes/Particles/Move/MoveTrail.js +0 -37
  418. package/umd/Options/Classes/Particles/Move/MoveTrailFill.js +0 -29
  419. package/umd/Options/Classes/Particles/Shadow.js +0 -49
  420. package/umd/Options/Interfaces/BackgroundMask/IBackgroundMask.js +0 -12
  421. package/umd/Options/Interfaces/BackgroundMask/IBackgroundMaskCover.js +0 -12
  422. package/umd/Options/Interfaces/Particles/Collisions/ICollisions.js +0 -12
  423. package/umd/Options/Interfaces/Particles/Collisions/ICollisionsAbsorb.js +0 -12
  424. package/umd/Options/Interfaces/Particles/Collisions/ICollisionsOverlap.js +0 -12
  425. package/umd/Options/Interfaces/Particles/IShadow.js +0 -12
  426. package/umd/Options/Interfaces/Particles/Move/IMoveTrail.js +0 -12
  427. package/umd/Options/Interfaces/Particles/Move/IMoveTrailFill.js +0 -12
  428. /package/browser/{Types → Enums}/RangeType.js +0 -0
  429. /package/{esm/Types → cjs/Enums}/RangeType.js +0 -0
  430. /package/types/{Types → Enums}/RangeType.d.ts +0 -0
  431. /package/umd/{Types → Enums}/RangeType.js +0 -0
@@ -1,9 +1,9 @@
1
- import { canvasFirstIndex, canvasTag, errorPrefix, generatedAttribute, generatedFalse, generatedTrue, loadMinIndex, loadRandomFactor, none, one, removeDeleteCount, } from "./Utils/Constants.js";
2
- import { executeOnSingleOrMultiple, getLogger, itemFromSingleOrMultiple } from "../Utils/Utils.js";
3
- import { Container } from "./Container.js";
1
+ import { canvasFirstIndex, canvasTag, generatedAttribute, generatedFalse, generatedTrue, loadMinIndex, loadRandomFactor, none, one, removeDeleteCount, } from "./Utils/Constants.js";
2
+ import { itemFromSingleOrMultiple, safeDocument } from "../Utils/Utils.js";
4
3
  import { EventDispatcher } from "../Utils/EventDispatcher.js";
5
4
  import { EventType } from "../Enums/Types/EventType.js";
6
- import { getRandom } from "../Utils/NumberUtils.js";
5
+ import { getLogger } from "../Utils/LogUtils.js";
6
+ import { getRandom } from "../Utils/MathUtils.js";
7
7
  async function getItemsFromInitializer(container, map, initializers, force = false) {
8
8
  let res = map.get(container);
9
9
  if (!res || force) {
@@ -21,25 +21,23 @@ async function getDataFromUrl(data) {
21
21
  if (response.ok) {
22
22
  return (await response.json());
23
23
  }
24
- getLogger().error(`${errorPrefix} ${response.status} while retrieving config file`);
24
+ getLogger().error(`${response.status.toString()} while retrieving config file`);
25
25
  return data.fallback;
26
26
  }
27
27
  const getCanvasFromContainer = (domContainer) => {
28
28
  let canvasEl;
29
29
  if (domContainer instanceof HTMLCanvasElement || domContainer.tagName.toLowerCase() === canvasTag) {
30
30
  canvasEl = domContainer;
31
- if (!canvasEl.dataset[generatedAttribute]) {
32
- canvasEl.dataset[generatedAttribute] = generatedFalse;
33
- }
31
+ canvasEl.dataset[generatedAttribute] ??= generatedFalse;
34
32
  }
35
33
  else {
36
- const existingCanvases = domContainer.getElementsByTagName(canvasTag);
37
- if (existingCanvases.length) {
38
- canvasEl = existingCanvases[canvasFirstIndex];
34
+ const existingCanvases = domContainer.getElementsByTagName(canvasTag), foundCanvas = existingCanvases[canvasFirstIndex];
35
+ if (foundCanvas) {
36
+ canvasEl = foundCanvas;
39
37
  canvasEl.dataset[generatedAttribute] = generatedFalse;
40
38
  }
41
39
  else {
42
- canvasEl = document.createElement(canvasTag);
40
+ canvasEl = safeDocument().createElement(canvasTag);
43
41
  canvasEl.dataset[generatedAttribute] = generatedTrue;
44
42
  domContainer.appendChild(canvasEl);
45
43
  }
@@ -53,14 +51,14 @@ const getCanvasFromContainer = (domContainer) => {
53
51
  }
54
52
  return canvasEl;
55
53
  }, getDomContainer = (id, source) => {
56
- let domContainer = source ?? document.getElementById(id);
54
+ let domContainer = source ?? safeDocument().getElementById(id);
57
55
  if (domContainer) {
58
56
  return domContainer;
59
57
  }
60
- domContainer = document.createElement("div");
58
+ domContainer = safeDocument().createElement("div");
61
59
  domContainer.id = id;
62
60
  domContainer.dataset[generatedAttribute] = generatedTrue;
63
- document.body.append(domContainer);
61
+ safeDocument().body.append(domContainer);
64
62
  return domContainer;
65
63
  };
66
64
  export class Engine {
@@ -69,6 +67,7 @@ export class Engine {
69
67
  this._domArray = [];
70
68
  this._eventDispatcher = new EventDispatcher();
71
69
  this._initialized = false;
70
+ this._loadPromises = new Set();
72
71
  this.plugins = [];
73
72
  this.colorManagers = new Map();
74
73
  this.easingFunctions = new Map();
@@ -96,73 +95,65 @@ export class Engine {
96
95
  return this._domArray;
97
96
  }
98
97
  get version() {
99
- return "3.9.1";
98
+ return "4.0.0-alpha.1";
100
99
  }
101
- async addColorManager(manager, refresh = true) {
100
+ addColorManager(manager) {
102
101
  this.colorManagers.set(manager.key, manager);
103
- await this.refresh(refresh);
104
102
  }
105
103
  addConfig(config) {
106
104
  const key = config.key ?? config.name ?? "default";
107
105
  this._configs.set(key, config);
108
106
  this._eventDispatcher.dispatchEvent(EventType.configAdded, { data: { name: key, config } });
109
107
  }
110
- async addEasing(name, easing, refresh = true) {
111
- if (this.getEasing(name)) {
108
+ addEasing(name, easing) {
109
+ if (this.easingFunctions.get(name)) {
112
110
  return;
113
111
  }
114
112
  this.easingFunctions.set(name, easing);
115
- await this.refresh(refresh);
116
113
  }
117
- async addEffect(effect, drawer, refresh = true) {
118
- executeOnSingleOrMultiple(effect, type => {
119
- if (!this.getEffectDrawer(type)) {
120
- this.effectDrawers.set(type, drawer);
121
- }
122
- });
123
- await this.refresh(refresh);
114
+ addEffect(effect, drawer) {
115
+ if (this.getEffectDrawer(effect)) {
116
+ return;
117
+ }
118
+ this.effectDrawers.set(effect, drawer);
124
119
  }
125
120
  addEventListener(type, listener) {
126
121
  this._eventDispatcher.addEventListener(type, listener);
127
122
  }
128
- async addInteractor(name, interactorInitializer, refresh = true) {
123
+ addInteractor(name, interactorInitializer) {
129
124
  this._initializers.interactors.set(name, interactorInitializer);
130
- await this.refresh(refresh);
131
125
  }
132
- async addMover(name, moverInitializer, refresh = true) {
126
+ addMover(name, moverInitializer) {
133
127
  this._initializers.movers.set(name, moverInitializer);
134
- await this.refresh(refresh);
135
128
  }
136
- async addParticleUpdater(name, updaterInitializer, refresh = true) {
129
+ addParticleUpdater(name, updaterInitializer) {
137
130
  this._initializers.updaters.set(name, updaterInitializer);
138
- await this.refresh(refresh);
139
131
  }
140
- async addPathGenerator(name, generator, refresh = true) {
141
- if (!this.getPathGenerator(name)) {
142
- this.pathGenerators.set(name, generator);
132
+ addPathGenerator(name, generator) {
133
+ if (this.getPathGenerator(name)) {
134
+ return;
143
135
  }
144
- await this.refresh(refresh);
136
+ this.pathGenerators.set(name, generator);
145
137
  }
146
- async addPlugin(plugin, refresh = true) {
147
- if (!this.getPlugin(plugin.id)) {
148
- this.plugins.push(plugin);
138
+ addPlugin(plugin) {
139
+ if (this.getPlugin(plugin.id)) {
140
+ return;
149
141
  }
150
- await this.refresh(refresh);
142
+ this.plugins.push(plugin);
151
143
  }
152
- async addPreset(preset, options, override = false, refresh = true) {
153
- if (override || !this.getPreset(preset)) {
154
- this.presets.set(preset, options);
144
+ addPreset(preset, options, override = false) {
145
+ if (!(override || !this.getPreset(preset))) {
146
+ return;
155
147
  }
156
- await this.refresh(refresh);
148
+ this.presets.set(preset, options);
157
149
  }
158
- async addShape(drawer, refresh = true) {
150
+ addShape(drawer) {
159
151
  for (const validType of drawer.validTypes) {
160
152
  if (this.getShapeDrawer(validType)) {
161
153
  continue;
162
154
  }
163
155
  this.shapeDrawers.set(validType, drawer);
164
156
  }
165
- await this.refresh(refresh);
166
157
  }
167
158
  checkVersion(pluginVersion) {
168
159
  if (this.version === pluginVersion) {
@@ -226,22 +217,29 @@ export class Engine {
226
217
  async getUpdaters(container, force = false) {
227
218
  return getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
228
219
  }
229
- init() {
220
+ async init() {
230
221
  if (this._initialized) {
231
222
  return;
232
223
  }
224
+ for (const loadPromise of this._loadPromises) {
225
+ await loadPromise(this);
226
+ }
227
+ this._loadPromises.clear();
233
228
  this._initialized = true;
234
229
  }
235
230
  item(index) {
236
231
  const { items } = this, item = items[index];
237
- if (!item || item.destroyed) {
232
+ if (item?.destroyed) {
238
233
  items.splice(index, removeDeleteCount);
239
234
  return;
240
235
  }
241
236
  return item;
242
237
  }
243
238
  async load(params) {
244
- const id = params.id ?? params.element?.id ?? `tsparticles${Math.floor(getRandom() * loadRandomFactor)}`, { index, url } = params, options = url ? await getDataFromUrl({ fallback: params.options, url, index }) : params.options, currentOptions = itemFromSingleOrMultiple(options, index), { items } = this, oldIndex = items.findIndex(v => v.id.description === id), newItem = new Container(this, id, currentOptions);
239
+ await this.init();
240
+ const { Container } = await import("./Container.js"), id = params.id ??
241
+ params.element?.id ??
242
+ `tsparticles${Math.floor(getRandom() * loadRandomFactor).toString()}`, { index, url } = params, options = url ? await getDataFromUrl({ fallback: params.options, url, index }) : params.options, currentOptions = itemFromSingleOrMultiple(options, index), { items } = this, oldIndex = items.findIndex(v => v.id.description === id), newItem = new Container(this, id, currentOptions);
245
243
  if (oldIndex >= loadMinIndex) {
246
244
  const old = this.item(oldIndex), deleteCount = old ? one : none;
247
245
  if (old && !old.destroyed) {
@@ -258,7 +256,9 @@ export class Engine {
258
256
  return newItem;
259
257
  }
260
258
  loadOptions(options, sourceOptions) {
261
- this.plugins.forEach(plugin => plugin.loadOptions?.(options, sourceOptions));
259
+ this.plugins.forEach(plugin => {
260
+ plugin.loadOptions(options, sourceOptions);
261
+ });
262
262
  }
263
263
  loadParticlesOptions(container, options, ...sourceOptions) {
264
264
  const updaters = this.updaters.get(container);
@@ -273,14 +273,24 @@ export class Engine {
273
273
  }
274
274
  await Promise.all(this.items.map(t => t.refresh()));
275
275
  }
276
+ register(...loadPromises) {
277
+ if (this._initialized) {
278
+ throw new Error(`Register plugins can only be done before calling tsParticles.load()`);
279
+ }
280
+ for (const loadPromise of loadPromises) {
281
+ this._loadPromises.add(loadPromise);
282
+ }
283
+ }
276
284
  removeEventListener(type, listener) {
277
285
  this._eventDispatcher.removeEventListener(type, listener);
278
286
  }
279
287
  setOnClickHandler(callback) {
280
288
  const { items } = this;
281
289
  if (!items.length) {
282
- throw new Error(`${errorPrefix} can only set click handlers after calling tsParticles.load()`);
290
+ throw new Error("Click handlers can only be set after calling tsParticles.load()");
283
291
  }
284
- items.forEach(item => item.addClickHandler(callback));
292
+ items.forEach(item => {
293
+ item.addClickHandler(callback);
294
+ });
285
295
  }
286
296
  }
@@ -1,21 +1,17 @@
1
1
  import { Vector, Vector3d } from "./Utils/Vectors.js";
2
- import { calcExactPositionOrRandomFromSize, clamp, degToRad, getDistance, getParticleBaseVelocity, getParticleDirectionAngle, getRandom, getRangeValue, randomInRange, setRangeValue, } from "../Utils/NumberUtils.js";
3
- import { decayOffset, defaultRadius, defaultRetryCount, double, errorPrefix, half, millisecondsToSeconds, minRetries, minZ, none, randomColorValue, rollFactor, squareExp, tryCountIncrement, } from "./Utils/Constants.js";
2
+ import { calcExactPositionOrRandomFromSize, clamp, degToRad, getParticleBaseVelocity, getParticleDirectionAngle, getRandom, getRangeValue, randomInRangeValue, setRangeValue, } from "../Utils/MathUtils.js";
3
+ import { decayOffset, defaultAngle, defaultRetryCount, double, half, millisecondsToSeconds, minZ, none, randomColorValue, rollFactor, squareExp, tryCountIncrement, } from "./Utils/Constants.js";
4
4
  import { deepExtend, getPosition, initParticleNumericAnimationValue, isInArray, itemFromSingleOrMultiple, } from "../Utils/Utils.js";
5
- import { getHslFromAnimation, rangeColorToRgb } from "../Utils/ColorUtils.js";
6
5
  import { EventType } from "../Enums/Types/EventType.js";
7
6
  import { Interactivity } from "../Options/Classes/Interactivity/Interactivity.js";
8
7
  import { MoveDirection } from "../Enums/Directions/MoveDirection.js";
9
8
  import { OutMode } from "../Enums/Modes/OutMode.js";
10
9
  import { ParticleOutType } from "../Enums/Types/ParticleOutType.js";
11
- import { PixelMode } from "../Enums/Modes/PixelMode.js";
12
10
  import { alterHsl } from "../Utils/CanvasUtils.js";
11
+ import { getHslFromAnimation } from "../Utils/ColorUtils.js";
13
12
  import { loadParticlesOptions } from "../Utils/OptionsUtils.js";
14
13
  function loadEffectData(effect, effectOptions, id, reduceDuplicates) {
15
14
  const effectData = effectOptions.options[effect];
16
- if (!effectData) {
17
- return;
18
- }
19
15
  return deepExtend({
20
16
  close: effectOptions.close,
21
17
  fill: effectOptions.fill,
@@ -23,9 +19,6 @@ function loadEffectData(effect, effectOptions, id, reduceDuplicates) {
23
19
  }
24
20
  function loadShapeData(shape, shapeOptions, id, reduceDuplicates) {
25
21
  const shapeData = shapeOptions.options[shape];
26
- if (!shapeData) {
27
- return;
28
- }
29
22
  return deepExtend({
30
23
  close: shapeOptions.close,
31
24
  fill: shapeOptions.fill,
@@ -47,8 +40,9 @@ export class Particle {
47
40
  constructor(engine, container) {
48
41
  this.container = container;
49
42
  this._calcPosition = (container, position, zIndex, tryCount = defaultRetryCount) => {
50
- for (const plugin of container.plugins.values()) {
51
- const pluginPos = plugin.particlePosition !== undefined ? plugin.particlePosition(position, this) : undefined;
43
+ const plugins = container.plugins.values();
44
+ for (const plugin of plugins) {
45
+ const pluginPos = plugin.particlePosition?.(position, this);
52
46
  if (pluginPos) {
53
47
  return Vector3d.create(pluginPos.x, pluginPos.y, zIndex);
54
48
  }
@@ -79,7 +73,14 @@ export class Particle {
79
73
  fixHorizontal(outModes.right ?? outModes.default);
80
74
  fixVertical(outModes.top ?? outModes.default);
81
75
  fixVertical(outModes.bottom ?? outModes.default);
82
- if (this._checkOverlap(pos, tryCount)) {
76
+ let isValidPosition = true;
77
+ for (const plugin of plugins) {
78
+ isValidPosition = plugin.checkParticlePosition?.(this, pos, tryCount);
79
+ if (isValidPosition === false) {
80
+ break;
81
+ }
82
+ }
83
+ if (!isValidPosition) {
83
84
  return this._calcPosition(container, undefined, zIndex, tryCount + tryCountIncrement);
84
85
  }
85
86
  return pos;
@@ -94,33 +95,18 @@ export class Particle {
94
95
  right: radOffset + rad * half,
95
96
  };
96
97
  if (!moveOptions.straight) {
97
- res.angle += randomInRange(setRangeValue(range.left, range.right));
98
+ res.angle += randomInRangeValue(setRangeValue(range.left, range.right));
98
99
  }
99
100
  if (moveOptions.random && typeof moveOptions.speed === "number") {
100
101
  res.length *= getRandom();
101
102
  }
102
103
  return res;
103
104
  };
104
- this._checkOverlap = (pos, tryCount = defaultRetryCount) => {
105
- const collisionsOptions = this.options.collisions, radius = this.getRadius();
106
- if (!collisionsOptions.enable) {
107
- return false;
108
- }
109
- const overlapOptions = collisionsOptions.overlap;
110
- if (overlapOptions.enable) {
111
- return false;
112
- }
113
- const retries = overlapOptions.retries;
114
- if (retries >= minRetries && tryCount > retries) {
115
- throw new Error(`${errorPrefix} particle is overlapping and can't be placed`);
116
- }
117
- return !!this.container.particles.find(particle => getDistance(pos, particle.position) < radius + particle.getRadius());
118
- };
119
105
  this._getRollColor = color => {
120
106
  if (!color || !this.roll || (!this.backColor && !this.roll.alter)) {
121
107
  return color;
122
108
  }
123
- const backFactor = this.roll.horizontal && this.roll.vertical ? double * rollFactor : rollFactor, backSum = this.roll.horizontal ? Math.PI * half : none, rolled = Math.floor(((this.roll.angle ?? none) + backSum) / (Math.PI / backFactor)) % double;
109
+ const backFactor = this.roll.horizontal && this.roll.vertical ? double * rollFactor : rollFactor, backSum = this.roll.horizontal ? Math.PI * half : none, rolled = Math.floor((this.roll.angle + backSum) / (Math.PI / backFactor)) % double;
124
110
  if (!rolled) {
125
111
  return color;
126
112
  }
@@ -139,8 +125,8 @@ export class Particle {
139
125
  const canvasSize = container.canvas.size;
140
126
  this.moveCenter = {
141
127
  ...getPosition(this.options.move.center, canvasSize),
142
- radius: this.options.move.center.radius ?? defaultRadius,
143
- mode: this.options.move.center.mode ?? PixelMode.percent,
128
+ radius: this.options.move.center.radius,
129
+ mode: this.options.move.center.mode,
144
130
  };
145
131
  this.direction = getParticleDirectionAngle(this.options.move.direction, this.position, this.moveCenter);
146
132
  switch (this.options.move.direction) {
@@ -162,7 +148,7 @@ export class Particle {
162
148
  this.destroyed = true;
163
149
  this.bubble.inRange = false;
164
150
  this.slow.inRange = false;
165
- const container = this.container, pathGenerator = this.pathGenerator, shapeDrawer = container.shapeDrawers.get(this.shape);
151
+ const container = this.container, pathGenerator = this.pathGenerator, shapeDrawer = this.shape ? container.shapeDrawers.get(this.shape) : undefined;
166
152
  shapeDrawer?.particleDestroy?.(this);
167
153
  for (const plugin of container.plugins.values()) {
168
154
  plugin.particleDestroyed?.(this, override);
@@ -185,6 +171,9 @@ export class Particle {
185
171
  }
186
172
  canvas.drawParticle(this, delta);
187
173
  }
174
+ getAngle() {
175
+ return this.rotation + (this.pathRotation ? this.velocity.angle : defaultAngle);
176
+ }
188
177
  getFillColor() {
189
178
  return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.color));
190
179
  }
@@ -224,7 +213,7 @@ export class Particle {
224
213
  };
225
214
  this.outType = ParticleOutType.normal;
226
215
  this.ignoresResizeRatio = true;
227
- const pxRatio = container.retina.pixelRatio, mainOptions = container.actualOptions, particlesOptions = loadParticlesOptions(this._engine, container, mainOptions.particles), { reduceDuplicates } = particlesOptions, effectType = particlesOptions.effect.type, shapeType = particlesOptions.shape.type;
216
+ const pxRatio = container.retina.pixelRatio, mainOptions = container.actualOptions, particlesOptions = loadParticlesOptions(this._engine, container, mainOptions.particles), reduceDuplicates = particlesOptions.reduceDuplicates, effectType = particlesOptions.effect.type, shapeType = particlesOptions.shape.type;
228
217
  this.effect = itemFromSingleOrMultiple(effectType, this.id, reduceDuplicates);
229
218
  this.shape = itemFromSingleOrMultiple(shapeType, this.id, reduceDuplicates);
230
219
  const effectOptions = particlesOptions.effect, shapeOptions = particlesOptions.shape;
@@ -252,8 +241,10 @@ export class Particle {
252
241
  const availableShapes = [...this.container.shapeDrawers.keys()];
253
242
  this.shape = availableShapes[Math.floor(getRandom() * availableShapes.length)];
254
243
  }
255
- this.effectData = loadEffectData(this.effect, effectOptions, this.id, reduceDuplicates);
256
- this.shapeData = loadShapeData(this.shape, shapeOptions, this.id, reduceDuplicates);
244
+ this.effectData = this.effect
245
+ ? loadEffectData(this.effect, effectOptions, this.id, reduceDuplicates)
246
+ : undefined;
247
+ this.shapeData = this.shape ? loadShapeData(this.shape, shapeOptions, this.id, reduceDuplicates) : undefined;
257
248
  particlesOptions.load(overrideOptions);
258
249
  const effectData = this.effectData;
259
250
  if (effectData) {
@@ -297,21 +288,26 @@ export class Particle {
297
288
  particles.setLastZIndex(this.position.z);
298
289
  this.zIndexFactor = this.position.z / container.zLayers;
299
290
  this.sides = 24;
300
- let effectDrawer = container.effectDrawers.get(this.effect);
301
- if (!effectDrawer) {
302
- effectDrawer = this._engine.getEffectDrawer(this.effect);
303
- if (effectDrawer) {
304
- container.effectDrawers.set(this.effect, effectDrawer);
291
+ let effectDrawer, shapeDrawer;
292
+ if (this.effect) {
293
+ effectDrawer = container.effectDrawers.get(this.effect);
294
+ if (!effectDrawer) {
295
+ effectDrawer = this._engine.getEffectDrawer(this.effect);
296
+ if (effectDrawer) {
297
+ container.effectDrawers.set(this.effect, effectDrawer);
298
+ }
305
299
  }
306
300
  }
307
301
  if (effectDrawer?.loadEffect) {
308
302
  effectDrawer.loadEffect(this);
309
303
  }
310
- let shapeDrawer = container.shapeDrawers.get(this.shape);
311
- if (!shapeDrawer) {
312
- shapeDrawer = this._engine.getShapeDrawer(this.shape);
313
- if (shapeDrawer) {
314
- container.shapeDrawers.set(this.shape, shapeDrawer);
304
+ if (this.shape) {
305
+ shapeDrawer = container.shapeDrawers.get(this.shape);
306
+ if (!shapeDrawer) {
307
+ shapeDrawer = this._engine.getShapeDrawer(this.shape);
308
+ if (shapeDrawer) {
309
+ container.shapeDrawers.set(this.shape, shapeDrawer);
310
+ }
315
311
  }
316
312
  }
317
313
  if (shapeDrawer?.loadShape) {
@@ -322,12 +318,11 @@ export class Particle {
322
318
  this.sides = sideCountFunc(this);
323
319
  }
324
320
  this.spawning = false;
325
- this.shadowColor = rangeColorToRgb(this._engine, this.options.shadow.color);
326
321
  for (const updater of particles.updaters) {
327
322
  updater.init(this);
328
323
  }
329
324
  for (const mover of particles.movers) {
330
- mover.init?.(this);
325
+ mover.init(this);
331
326
  }
332
327
  effectDrawer?.particleInit?.(container, this);
333
328
  shapeDrawer?.particleInit?.(container, this);
@@ -1,5 +1,4 @@
1
- import { countOffset, defaultDensityFactor, defaultRemoveQuantity, deleteCount, errorPrefix, lengthOffset, minCount, minIndex, minLimit, posOffset, qTreeCapacity, sizeFactor, squareExp, } from "./Utils/Constants.js";
2
- import { getLogger, getPosition } from "../Utils/Utils.js";
1
+ import { countOffset, defaultDensityFactor, defaultRemoveQuantity, deleteCount, lengthOffset, minCount, minIndex, minLimit, posOffset, qTreeCapacity, sizeFactor, squareExp, } from "./Utils/Constants.js";
3
2
  import { EventType } from "../Enums/Types/EventType.js";
4
3
  import { InteractionManager } from "./Utils/InteractionManager.js";
5
4
  import { LimitMode } from "../Enums/Modes/LimitMode.js";
@@ -7,6 +6,9 @@ import { Particle } from "./Particle.js";
7
6
  import { Point } from "./Utils/Point.js";
8
7
  import { QuadTree } from "./Utils/QuadTree.js";
9
8
  import { Rectangle } from "./Utils/Ranges.js";
9
+ import { getLogger } from "../Utils/LogUtils.js";
10
+ import { getPosition } from "../Utils/Utils.js";
11
+ import { loadParticlesOptions } from "../Utils/OptionsUtils.js";
10
12
  const qTreeRectangle = (canvasSize) => {
11
13
  const { height, width } = canvasSize;
12
14
  return new Rectangle(posOffset * width, posOffset * height, sizeFactor * width, sizeFactor * height);
@@ -18,12 +20,12 @@ export class Particles {
18
20
  };
19
21
  this._applyDensity = (options, manualCount, group, groupOptions) => {
20
22
  const numberOptions = options.number;
21
- if (!options.number.density?.enable) {
23
+ if (!numberOptions.density.enable) {
22
24
  if (group === undefined) {
23
25
  this._limit = numberOptions.limit.value;
24
26
  }
25
- else if (groupOptions?.number.limit?.value ?? numberOptions.limit.value) {
26
- this._groupLimits.set(group, groupOptions?.number.limit?.value ?? numberOptions.limit.value);
27
+ else if (groupOptions?.number.limit.value ?? numberOptions.limit.value) {
28
+ this._groupLimits.set(group, groupOptions?.number.limit.value ?? numberOptions.limit.value);
27
29
  }
28
30
  return;
29
31
  }
@@ -51,10 +53,7 @@ export class Particles {
51
53
  };
52
54
  this._pushParticle = (position, overrideOptions, group, initializer) => {
53
55
  try {
54
- let particle = this._pool.pop();
55
- if (!particle) {
56
- particle = new Particle(this._engine, this._container);
57
- }
56
+ const particle = this._pool.pop() ?? new Particle(this._engine, this._container);
58
57
  particle.init(this._nextId, position, overrideOptions, group);
59
58
  let canAdd = true;
60
59
  if (initializer) {
@@ -75,12 +74,16 @@ export class Particles {
75
74
  return particle;
76
75
  }
77
76
  catch (e) {
78
- getLogger().warning(`${errorPrefix} adding particle: ${e}`);
77
+ getLogger().warning(`error adding particle: ${e}`);
79
78
  }
79
+ return undefined;
80
80
  };
81
81
  this._removeParticle = (index, group, override) => {
82
82
  const particle = this._array[index];
83
- if (!particle || particle.group !== group) {
83
+ if (!particle) {
84
+ return false;
85
+ }
86
+ if (particle.group !== group) {
84
87
  return false;
85
88
  }
86
89
  const zIdx = this._zArray.indexOf(particle);
@@ -151,15 +154,9 @@ export class Particles {
151
154
  this.movers = [];
152
155
  this.updaters = [];
153
156
  }
154
- draw(delta) {
155
- const container = this._container, canvas = container.canvas;
156
- canvas.clear();
157
- this.update(delta);
158
- for (const plugin of container.plugins.values()) {
159
- canvas.drawPlugin(plugin, delta);
160
- }
161
- for (const p of this._zArray) {
162
- p.draw(delta);
157
+ drawParticles(delta) {
158
+ for (const particle of this._zArray) {
159
+ particle.draw(delta);
163
160
  }
164
161
  }
165
162
  filter(condition) {
@@ -191,7 +188,10 @@ export class Particles {
191
188
  const particlesOptions = options.particles, groups = particlesOptions.groups;
192
189
  for (const group in groups) {
193
190
  const groupOptions = groups[group];
194
- for (let i = this.count, j = 0; j < groupOptions.number?.value && i < particlesOptions.number.value; i++, j++) {
191
+ if (!groupOptions) {
192
+ continue;
193
+ }
194
+ for (let i = this.count, j = 0; j < groupOptions.number.value && i < particlesOptions.number.value; i++, j++) {
195
195
  this.addParticle(undefined, groupOptions, group);
196
196
  }
197
197
  }
@@ -220,7 +220,7 @@ export class Particles {
220
220
  async redraw() {
221
221
  this.clear();
222
222
  await this.init();
223
- this.draw({ value: 0, factor: 0 });
223
+ this._container.canvas.drawParticles({ value: 0, factor: 0 });
224
224
  }
225
225
  remove(particle, group, override) {
226
226
  this.removeAt(this._array.indexOf(particle), undefined, group, override);
@@ -243,7 +243,12 @@ export class Particles {
243
243
  setDensity() {
244
244
  const options = this._container.actualOptions, groups = options.particles.groups, manualCount = options.manualParticles.length;
245
245
  for (const group in groups) {
246
- this._applyDensity(groups[group], manualCount, group);
246
+ const groupData = groups[group];
247
+ if (!groupData) {
248
+ continue;
249
+ }
250
+ const groupDataOptions = loadParticlesOptions(this._engine, this._container, groupData);
251
+ this._applyDensity(groupDataOptions, manualCount, group);
247
252
  }
248
253
  this._applyDensity(options.particles, manualCount);
249
254
  }
@@ -317,7 +322,11 @@ export class Particles {
317
322
  if (this._needsSort) {
318
323
  const zArray = this._zArray;
319
324
  zArray.sort((a, b) => b.position.z - a.position.z || a.id - b.id);
320
- this._lastZIndex = zArray[zArray.length - lengthOffset].position.z;
325
+ const lastItem = zArray[zArray.length - lengthOffset];
326
+ if (!lastItem) {
327
+ return;
328
+ }
329
+ this._lastZIndex = lastItem.position.z;
321
330
  this._needsSort = false;
322
331
  }
323
332
  }
@@ -1,6 +1,5 @@
1
1
  import { defaultRatio, defaultReduceFactor } from "./Utils/Constants.js";
2
- import { getRangeValue } from "../Utils/NumberUtils.js";
3
- import { isSsr } from "../Utils/Utils.js";
2
+ import { getRangeValue } from "../Utils/MathUtils.js";
4
3
  export class Retina {
5
4
  constructor(container) {
6
5
  this.container = container;
@@ -9,7 +8,7 @@ export class Retina {
9
8
  }
10
9
  init() {
11
10
  const container = this.container, options = container.actualOptions;
12
- this.pixelRatio = !options.detectRetina || isSsr() ? defaultRatio : devicePixelRatio;
11
+ this.pixelRatio = options.detectRetina ? devicePixelRatio : defaultRatio;
13
12
  this.reduceFactor = defaultReduceFactor;
14
13
  const ratio = this.pixelRatio, canvas = container.canvas;
15
14
  if (canvas.element) {
@@ -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", errorPrefix = "tsParticles - Error", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
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 = {
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, rgbFactor = 255, 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, 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;