@tsparticles/engine 3.6.0-beta.1 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/README.md +6 -1
  2. package/browser/Core/Canvas.js +32 -21
  3. package/browser/Core/Container.js +1 -1
  4. package/browser/Core/Engine.js +17 -1
  5. package/browser/Core/Particle.js +1 -1
  6. package/browser/Options/Classes/AnimatableColor.js +2 -2
  7. package/browser/Options/Classes/AnimationOptions.js +3 -2
  8. package/browser/Options/Classes/Background/Background.js +2 -1
  9. package/browser/Options/Classes/BackgroundMask/BackgroundMask.js +2 -2
  10. package/browser/Options/Classes/BackgroundMask/BackgroundMaskCover.js +2 -1
  11. package/browser/Options/Classes/ColorAnimation.js +2 -1
  12. package/browser/Options/Classes/FullScreen/FullScreen.js +2 -1
  13. package/browser/Options/Classes/HslAnimation.js +2 -1
  14. package/browser/Options/Classes/Interactivity/Events/ClickEvent.js +2 -1
  15. package/browser/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
  16. package/browser/Options/Classes/Interactivity/Events/Events.js +2 -1
  17. package/browser/Options/Classes/Interactivity/Events/HoverEvent.js +2 -1
  18. package/browser/Options/Classes/Interactivity/Events/Parallax.js +2 -1
  19. package/browser/Options/Classes/Interactivity/Events/ResizeEvent.js +2 -1
  20. package/browser/Options/Classes/Interactivity/Interactivity.js +2 -1
  21. package/browser/Options/Classes/Interactivity/Modes/Modes.js +2 -1
  22. package/browser/Options/Classes/ManualParticle.js +2 -1
  23. package/browser/Options/Classes/Options.js +2 -2
  24. package/browser/Options/Classes/OptionsColor.js +5 -3
  25. package/browser/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -1
  26. package/browser/Options/Classes/Particles/Collisions/Collisions.js +2 -1
  27. package/browser/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +2 -1
  28. package/browser/Options/Classes/Particles/Collisions/CollisionsOverlap.js +2 -1
  29. package/browser/Options/Classes/Particles/Effect/Effect.js +2 -1
  30. package/browser/Options/Classes/Particles/Move/Move.js +2 -2
  31. package/browser/Options/Classes/Particles/Move/MoveAngle.js +2 -1
  32. package/browser/Options/Classes/Particles/Move/MoveAttract.js +2 -1
  33. package/browser/Options/Classes/Particles/Move/MoveCenter.js +2 -1
  34. package/browser/Options/Classes/Particles/Move/MoveGravity.js +2 -1
  35. package/browser/Options/Classes/Particles/Move/MoveTrail.js +2 -1
  36. package/browser/Options/Classes/Particles/Move/MoveTrailFill.js +2 -1
  37. package/browser/Options/Classes/Particles/Move/OutModes.js +2 -1
  38. package/browser/Options/Classes/Particles/Move/Path/MovePath.js +2 -1
  39. package/browser/Options/Classes/Particles/Move/Spin.js +2 -1
  40. package/browser/Options/Classes/Particles/Number/ParticlesDensity.js +2 -1
  41. package/browser/Options/Classes/Particles/Number/ParticlesNumber.js +2 -1
  42. package/browser/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
  43. package/browser/Options/Classes/Particles/Opacity/Opacity.js +2 -1
  44. package/browser/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
  45. package/browser/Options/Classes/Particles/ParticlesOptions.js +2 -1
  46. package/browser/Options/Classes/Particles/Shadow.js +2 -1
  47. package/browser/Options/Classes/Particles/Shape/Shape.js +2 -1
  48. package/browser/Options/Classes/Particles/Size/Size.js +2 -1
  49. package/browser/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
  50. package/browser/Options/Classes/Particles/Stroke.js +2 -1
  51. package/browser/Options/Classes/Particles/ZIndex/ZIndex.js +2 -1
  52. package/browser/Options/Classes/Responsive.js +5 -4
  53. package/browser/Options/Classes/Theme/Theme.js +2 -1
  54. package/browser/Options/Classes/Theme/ThemeDefault.js +2 -1
  55. package/browser/Options/Classes/ValueWithRandom.js +4 -3
  56. package/browser/Types/EasingFunction.js +1 -0
  57. package/browser/Utils/ColorUtils.js +25 -45
  58. package/browser/Utils/NumberUtils.js +1 -10
  59. package/browser/Utils/TypeUtils.js +3 -0
  60. package/browser/Utils/Utils.js +6 -0
  61. package/browser/exports.js +0 -2
  62. package/browser/init.js +0 -6
  63. package/cjs/Core/Canvas.js +32 -21
  64. package/cjs/Core/Container.js +1 -1
  65. package/cjs/Core/Engine.js +17 -1
  66. package/cjs/Core/Particle.js +1 -1
  67. package/cjs/Options/Classes/AnimatableColor.js +1 -1
  68. package/cjs/Options/Classes/AnimationOptions.js +3 -2
  69. package/cjs/Options/Classes/Background/Background.js +2 -1
  70. package/cjs/Options/Classes/BackgroundMask/BackgroundMask.js +2 -2
  71. package/cjs/Options/Classes/BackgroundMask/BackgroundMaskCover.js +2 -1
  72. package/cjs/Options/Classes/ColorAnimation.js +2 -1
  73. package/cjs/Options/Classes/FullScreen/FullScreen.js +2 -1
  74. package/cjs/Options/Classes/HslAnimation.js +2 -1
  75. package/cjs/Options/Classes/Interactivity/Events/ClickEvent.js +2 -1
  76. package/cjs/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
  77. package/cjs/Options/Classes/Interactivity/Events/Events.js +2 -1
  78. package/cjs/Options/Classes/Interactivity/Events/HoverEvent.js +2 -1
  79. package/cjs/Options/Classes/Interactivity/Events/Parallax.js +2 -1
  80. package/cjs/Options/Classes/Interactivity/Events/ResizeEvent.js +2 -1
  81. package/cjs/Options/Classes/Interactivity/Interactivity.js +2 -1
  82. package/cjs/Options/Classes/Interactivity/Modes/Modes.js +2 -1
  83. package/cjs/Options/Classes/ManualParticle.js +2 -1
  84. package/cjs/Options/Classes/Options.js +2 -2
  85. package/cjs/Options/Classes/OptionsColor.js +4 -2
  86. package/cjs/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -1
  87. package/cjs/Options/Classes/Particles/Collisions/Collisions.js +2 -1
  88. package/cjs/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +2 -1
  89. package/cjs/Options/Classes/Particles/Collisions/CollisionsOverlap.js +2 -1
  90. package/cjs/Options/Classes/Particles/Effect/Effect.js +2 -1
  91. package/cjs/Options/Classes/Particles/Move/Move.js +1 -1
  92. package/cjs/Options/Classes/Particles/Move/MoveAngle.js +2 -1
  93. package/cjs/Options/Classes/Particles/Move/MoveAttract.js +2 -1
  94. package/cjs/Options/Classes/Particles/Move/MoveCenter.js +2 -1
  95. package/cjs/Options/Classes/Particles/Move/MoveGravity.js +2 -1
  96. package/cjs/Options/Classes/Particles/Move/MoveTrail.js +2 -1
  97. package/cjs/Options/Classes/Particles/Move/MoveTrailFill.js +2 -1
  98. package/cjs/Options/Classes/Particles/Move/OutModes.js +2 -1
  99. package/cjs/Options/Classes/Particles/Move/Path/MovePath.js +2 -1
  100. package/cjs/Options/Classes/Particles/Move/Spin.js +2 -1
  101. package/cjs/Options/Classes/Particles/Number/ParticlesDensity.js +2 -1
  102. package/cjs/Options/Classes/Particles/Number/ParticlesNumber.js +2 -1
  103. package/cjs/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
  104. package/cjs/Options/Classes/Particles/Opacity/Opacity.js +2 -1
  105. package/cjs/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
  106. package/cjs/Options/Classes/Particles/ParticlesOptions.js +2 -1
  107. package/cjs/Options/Classes/Particles/Shadow.js +2 -1
  108. package/cjs/Options/Classes/Particles/Shape/Shape.js +2 -1
  109. package/cjs/Options/Classes/Particles/Size/Size.js +2 -1
  110. package/cjs/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
  111. package/cjs/Options/Classes/Particles/Stroke.js +2 -1
  112. package/cjs/Options/Classes/Particles/ZIndex/ZIndex.js +2 -1
  113. package/cjs/Options/Classes/Responsive.js +5 -4
  114. package/cjs/Options/Classes/Theme/Theme.js +2 -1
  115. package/cjs/Options/Classes/Theme/ThemeDefault.js +2 -1
  116. package/cjs/Options/Classes/ValueWithRandom.js +4 -3
  117. package/cjs/Types/EasingFunction.js +2 -0
  118. package/cjs/Utils/ColorUtils.js +25 -46
  119. package/cjs/Utils/NumberUtils.js +1 -12
  120. package/cjs/Utils/TypeUtils.js +4 -0
  121. package/cjs/Utils/Utils.js +7 -0
  122. package/cjs/exports.js +0 -2
  123. package/cjs/init.js +0 -6
  124. package/esm/Core/Canvas.js +32 -21
  125. package/esm/Core/Container.js +1 -1
  126. package/esm/Core/Engine.js +17 -1
  127. package/esm/Core/Particle.js +1 -1
  128. package/esm/Options/Classes/AnimatableColor.js +2 -2
  129. package/esm/Options/Classes/AnimationOptions.js +3 -2
  130. package/esm/Options/Classes/Background/Background.js +2 -1
  131. package/esm/Options/Classes/BackgroundMask/BackgroundMask.js +2 -2
  132. package/esm/Options/Classes/BackgroundMask/BackgroundMaskCover.js +2 -1
  133. package/esm/Options/Classes/ColorAnimation.js +2 -1
  134. package/esm/Options/Classes/FullScreen/FullScreen.js +2 -1
  135. package/esm/Options/Classes/HslAnimation.js +2 -1
  136. package/esm/Options/Classes/Interactivity/Events/ClickEvent.js +2 -1
  137. package/esm/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
  138. package/esm/Options/Classes/Interactivity/Events/Events.js +2 -1
  139. package/esm/Options/Classes/Interactivity/Events/HoverEvent.js +2 -1
  140. package/esm/Options/Classes/Interactivity/Events/Parallax.js +2 -1
  141. package/esm/Options/Classes/Interactivity/Events/ResizeEvent.js +2 -1
  142. package/esm/Options/Classes/Interactivity/Interactivity.js +2 -1
  143. package/esm/Options/Classes/Interactivity/Modes/Modes.js +2 -1
  144. package/esm/Options/Classes/ManualParticle.js +2 -1
  145. package/esm/Options/Classes/Options.js +2 -2
  146. package/esm/Options/Classes/OptionsColor.js +5 -3
  147. package/esm/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -1
  148. package/esm/Options/Classes/Particles/Collisions/Collisions.js +2 -1
  149. package/esm/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +2 -1
  150. package/esm/Options/Classes/Particles/Collisions/CollisionsOverlap.js +2 -1
  151. package/esm/Options/Classes/Particles/Effect/Effect.js +2 -1
  152. package/esm/Options/Classes/Particles/Move/Move.js +2 -2
  153. package/esm/Options/Classes/Particles/Move/MoveAngle.js +2 -1
  154. package/esm/Options/Classes/Particles/Move/MoveAttract.js +2 -1
  155. package/esm/Options/Classes/Particles/Move/MoveCenter.js +2 -1
  156. package/esm/Options/Classes/Particles/Move/MoveGravity.js +2 -1
  157. package/esm/Options/Classes/Particles/Move/MoveTrail.js +2 -1
  158. package/esm/Options/Classes/Particles/Move/MoveTrailFill.js +2 -1
  159. package/esm/Options/Classes/Particles/Move/OutModes.js +2 -1
  160. package/esm/Options/Classes/Particles/Move/Path/MovePath.js +2 -1
  161. package/esm/Options/Classes/Particles/Move/Spin.js +2 -1
  162. package/esm/Options/Classes/Particles/Number/ParticlesDensity.js +2 -1
  163. package/esm/Options/Classes/Particles/Number/ParticlesNumber.js +2 -1
  164. package/esm/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
  165. package/esm/Options/Classes/Particles/Opacity/Opacity.js +2 -1
  166. package/esm/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
  167. package/esm/Options/Classes/Particles/ParticlesOptions.js +2 -1
  168. package/esm/Options/Classes/Particles/Shadow.js +2 -1
  169. package/esm/Options/Classes/Particles/Shape/Shape.js +2 -1
  170. package/esm/Options/Classes/Particles/Size/Size.js +2 -1
  171. package/esm/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
  172. package/esm/Options/Classes/Particles/Stroke.js +2 -1
  173. package/esm/Options/Classes/Particles/ZIndex/ZIndex.js +2 -1
  174. package/esm/Options/Classes/Responsive.js +5 -4
  175. package/esm/Options/Classes/Theme/Theme.js +2 -1
  176. package/esm/Options/Classes/Theme/ThemeDefault.js +2 -1
  177. package/esm/Options/Classes/ValueWithRandom.js +4 -3
  178. package/esm/Types/EasingFunction.js +1 -0
  179. package/esm/Utils/ColorUtils.js +25 -45
  180. package/esm/Utils/NumberUtils.js +1 -10
  181. package/esm/Utils/TypeUtils.js +3 -0
  182. package/esm/Utils/Utils.js +6 -0
  183. package/esm/exports.js +0 -2
  184. package/esm/init.js +0 -6
  185. package/package.json +1 -1
  186. package/report.html +1 -1
  187. package/tsparticles.engine.js +62 -82
  188. package/tsparticles.engine.min.js +1 -1
  189. package/tsparticles.engine.min.js.LICENSE.txt +1 -1
  190. package/types/Core/Canvas.d.ts +4 -1
  191. package/types/Core/Engine.d.ts +9 -1
  192. package/types/Core/Interfaces/Colors.d.ts +28 -0
  193. package/types/Types/EasingFunction.d.ts +1 -0
  194. package/types/Utils/ColorUtils.d.ts +8 -9
  195. package/types/Utils/NumberUtils.d.ts +0 -5
  196. package/types/Utils/TypeUtils.d.ts +1 -0
  197. package/types/Utils/Utils.d.ts +2 -0
  198. package/types/exports.d.ts +0 -2
  199. package/umd/Core/Canvas.js +32 -21
  200. package/umd/Core/Container.js +1 -1
  201. package/umd/Core/Engine.js +17 -1
  202. package/umd/Core/Particle.js +1 -1
  203. package/umd/Options/Classes/AnimatableColor.js +1 -1
  204. package/umd/Options/Classes/AnimationOptions.js +4 -3
  205. package/umd/Options/Classes/Background/Background.js +3 -2
  206. package/umd/Options/Classes/BackgroundMask/BackgroundMask.js +3 -3
  207. package/umd/Options/Classes/BackgroundMask/BackgroundMaskCover.js +3 -2
  208. package/umd/Options/Classes/ColorAnimation.js +3 -2
  209. package/umd/Options/Classes/FullScreen/FullScreen.js +3 -2
  210. package/umd/Options/Classes/HslAnimation.js +3 -2
  211. package/umd/Options/Classes/Interactivity/Events/ClickEvent.js +3 -2
  212. package/umd/Options/Classes/Interactivity/Events/DivEvent.js +3 -2
  213. package/umd/Options/Classes/Interactivity/Events/Events.js +3 -2
  214. package/umd/Options/Classes/Interactivity/Events/HoverEvent.js +3 -2
  215. package/umd/Options/Classes/Interactivity/Events/Parallax.js +3 -2
  216. package/umd/Options/Classes/Interactivity/Events/ResizeEvent.js +3 -2
  217. package/umd/Options/Classes/Interactivity/Interactivity.js +3 -2
  218. package/umd/Options/Classes/Interactivity/Modes/Modes.js +3 -2
  219. package/umd/Options/Classes/ManualParticle.js +3 -2
  220. package/umd/Options/Classes/Options.js +3 -3
  221. package/umd/Options/Classes/OptionsColor.js +4 -2
  222. package/umd/Options/Classes/Particles/Bounce/ParticlesBounce.js +3 -2
  223. package/umd/Options/Classes/Particles/Collisions/Collisions.js +3 -2
  224. package/umd/Options/Classes/Particles/Collisions/CollisionsAbsorb.js +3 -2
  225. package/umd/Options/Classes/Particles/Collisions/CollisionsOverlap.js +3 -2
  226. package/umd/Options/Classes/Particles/Effect/Effect.js +3 -2
  227. package/umd/Options/Classes/Particles/Move/Move.js +1 -1
  228. package/umd/Options/Classes/Particles/Move/MoveAngle.js +3 -2
  229. package/umd/Options/Classes/Particles/Move/MoveAttract.js +3 -2
  230. package/umd/Options/Classes/Particles/Move/MoveCenter.js +3 -2
  231. package/umd/Options/Classes/Particles/Move/MoveGravity.js +3 -2
  232. package/umd/Options/Classes/Particles/Move/MoveTrail.js +3 -2
  233. package/umd/Options/Classes/Particles/Move/MoveTrailFill.js +3 -2
  234. package/umd/Options/Classes/Particles/Move/OutModes.js +3 -2
  235. package/umd/Options/Classes/Particles/Move/Path/MovePath.js +3 -2
  236. package/umd/Options/Classes/Particles/Move/Spin.js +3 -2
  237. package/umd/Options/Classes/Particles/Number/ParticlesDensity.js +3 -2
  238. package/umd/Options/Classes/Particles/Number/ParticlesNumber.js +3 -2
  239. package/umd/Options/Classes/Particles/Number/ParticlesNumberLimit.js +3 -2
  240. package/umd/Options/Classes/Particles/Opacity/Opacity.js +3 -2
  241. package/umd/Options/Classes/Particles/Opacity/OpacityAnimation.js +3 -2
  242. package/umd/Options/Classes/Particles/ParticlesOptions.js +3 -2
  243. package/umd/Options/Classes/Particles/Shadow.js +3 -2
  244. package/umd/Options/Classes/Particles/Shape/Shape.js +3 -2
  245. package/umd/Options/Classes/Particles/Size/Size.js +3 -2
  246. package/umd/Options/Classes/Particles/Size/SizeAnimation.js +3 -2
  247. package/umd/Options/Classes/Particles/Stroke.js +3 -2
  248. package/umd/Options/Classes/Particles/ZIndex/ZIndex.js +3 -2
  249. package/umd/Options/Classes/Responsive.js +6 -5
  250. package/umd/Options/Classes/Theme/Theme.js +3 -2
  251. package/umd/Options/Classes/Theme/ThemeDefault.js +3 -2
  252. package/umd/Options/Classes/ValueWithRandom.js +5 -4
  253. package/umd/Types/EasingFunction.js +12 -0
  254. package/umd/Utils/ColorUtils.js +25 -46
  255. package/umd/Utils/NumberUtils.js +1 -12
  256. package/umd/Utils/TypeUtils.js +4 -0
  257. package/umd/Utils/Utils.js +7 -0
  258. package/umd/exports.js +1 -3
  259. package/umd/init.js +1 -7
  260. package/browser/Utils/HslColorManager.js +0 -45
  261. package/browser/Utils/RgbColorManager.js +0 -44
  262. package/cjs/Utils/HslColorManager.js +0 -49
  263. package/cjs/Utils/RgbColorManager.js +0 -48
  264. package/esm/Utils/HslColorManager.js +0 -45
  265. package/esm/Utils/RgbColorManager.js +0 -44
  266. package/types/Utils/HslColorManager.d.ts +0 -10
  267. package/types/Utils/RgbColorManager.d.ts +0 -10
  268. package/umd/Utils/HslColorManager.js +0 -59
  269. package/umd/Utils/RgbColorManager.js +0 -58
package/README.md CHANGED
@@ -898,6 +898,12 @@ flowchart TD
898
898
  subgraph all-plugins [Plugins]
899
899
  plugin-canvas-mask[Canvas Mask]
900
900
 
901
+ subgraph all-plugins-colors [Colors]
902
+ plugin-hsv-color[HSV Color]
903
+ plugin-named-color[Named Color]
904
+ plugin-oklch-color[Oklch Color]
905
+ end
906
+
901
907
  subgraph all-plugins-easings [Easings]
902
908
  plugin-easing-back[Back]
903
909
  plugin-easing-circ[Circ]
@@ -921,7 +927,6 @@ flowchart TD
921
927
  plugin-export-video[Video]
922
928
  end
923
929
 
924
- plugin-hsv-color[HSV Color]
925
930
  plugin-infection[Infection]
926
931
  plugin-motion[Motion]
927
932
  plugin-poisson-disc[Poisson Disc]
@@ -26,7 +26,7 @@ function setStyle(canvas, style, important = false) {
26
26
  }
27
27
  }
28
28
  export class Canvas {
29
- constructor(container) {
29
+ constructor(container, engine) {
30
30
  this.container = container;
31
31
  this._applyPostDrawUpdaters = particle => {
32
32
  for (const updater of this._postDrawUpdaters) {
@@ -62,10 +62,10 @@ export class Canvas {
62
62
  let fColor, sColor;
63
63
  for (const plugin of this._colorPlugins) {
64
64
  if (!fColor && plugin.particleFillColor) {
65
- fColor = rangeColorToHsl(plugin.particleFillColor(particle));
65
+ fColor = rangeColorToHsl(this._engine, plugin.particleFillColor(particle));
66
66
  }
67
67
  if (!sColor && plugin.particleStrokeColor) {
68
- sColor = rangeColorToHsl(plugin.particleStrokeColor(particle));
68
+ sColor = rangeColorToHsl(this._engine, plugin.particleStrokeColor(particle));
69
69
  }
70
70
  if (fColor && sColor) {
71
71
  break;
@@ -76,7 +76,7 @@ export class Canvas {
76
76
  this._initCover = async () => {
77
77
  const options = this.container.actualOptions, cover = options.backgroundMask.cover, color = cover.color;
78
78
  if (color) {
79
- const coverRgb = rangeColorToRgb(color);
79
+ const coverRgb = rangeColorToRgb(this._engine, color);
80
80
  if (coverRgb) {
81
81
  const coverColor = {
82
82
  ...coverRgb,
@@ -135,7 +135,7 @@ export class Canvas {
135
135
  }
136
136
  const factorNumerator = 1, opacity = factorNumerator / trail.length;
137
137
  if (trailFill.color) {
138
- const fillColor = rangeColorToRgb(trailFill.color);
138
+ const fillColor = rangeColorToRgb(this._engine, trailFill.color);
139
139
  if (!fillColor) {
140
140
  return;
141
141
  }
@@ -216,10 +216,16 @@ export class Canvas {
216
216
  height: "100%",
217
217
  }, true);
218
218
  };
219
- this.size = {
219
+ this._engine = engine;
220
+ this._standardSize = {
220
221
  height: 0,
221
222
  width: 0,
222
223
  };
224
+ const pxRatio = container.retina.pixelRatio, stdSize = this._standardSize;
225
+ this.size = {
226
+ height: stdSize.height * pxRatio,
227
+ width: stdSize.width * pxRatio,
228
+ };
223
229
  this._context = null;
224
230
  this._generated = false;
225
231
  this._preDrawUpdaters = [];
@@ -363,7 +369,7 @@ export class Canvas {
363
369
  return;
364
370
  }
365
371
  if (background.color) {
366
- const color = rangeColorToRgb(background.color);
372
+ const color = rangeColorToRgb(this._engine, background.color);
367
373
  elementStyle.backgroundColor = color ? getStyleFromRgb(color, background.opacity) : "";
368
374
  }
369
375
  else {
@@ -408,8 +414,13 @@ export class Canvas {
408
414
  this.element = canvas;
409
415
  this.element.ariaHidden = "true";
410
416
  this._originalStyle = deepExtend({}, this.element.style);
411
- this.size.height = canvas.offsetHeight;
412
- this.size.width = canvas.offsetWidth;
417
+ const standardSize = this._standardSize;
418
+ standardSize.height = canvas.offsetHeight;
419
+ standardSize.width = canvas.offsetWidth;
420
+ const pxRatio = this.container.retina.pixelRatio;
421
+ const retinaSize = this.size;
422
+ retinaSize.height = standardSize.height * pxRatio;
423
+ retinaSize.width = standardSize.width * pxRatio;
413
424
  this._context = this.element.getContext("2d");
414
425
  this._safeMutationObserver(obs => {
415
426
  if (!this.element || !(this.element instanceof Node)) {
@@ -444,23 +455,23 @@ export class Canvas {
444
455
  if (!this.element) {
445
456
  return false;
446
457
  }
447
- const container = this.container, pxRatio = container.retina.pixelRatio, size = container.canvas.size, newSize = {
448
- width: this.element.offsetWidth * pxRatio,
449
- height: this.element.offsetHeight * pxRatio,
458
+ const container = this.container, currentSize = container.canvas._standardSize, newSize = {
459
+ width: this.element.offsetWidth,
460
+ height: this.element.offsetHeight,
450
461
  };
451
- if (newSize.height === size.height &&
452
- newSize.width === size.width &&
453
- newSize.height === this.element.height &&
454
- newSize.width === this.element.width) {
462
+ if (newSize.height === currentSize.height && newSize.width === currentSize.width) {
455
463
  return false;
456
464
  }
457
- const oldSize = { ...size };
458
- this.element.width = size.width = this.element.offsetWidth * pxRatio;
459
- this.element.height = size.height = this.element.offsetHeight * pxRatio;
465
+ const oldSize = { ...currentSize }, pxRatio = container.retina.pixelRatio;
466
+ currentSize.height = newSize.height;
467
+ currentSize.width = newSize.width;
468
+ const retinaSize = this.size;
469
+ this.element.width = retinaSize.width = currentSize.width * pxRatio;
470
+ this.element.height = retinaSize.height = currentSize.height * pxRatio;
460
471
  if (this.container.started) {
461
472
  container.particles.setResizeFactor({
462
- width: size.width / oldSize.width,
463
- height: size.height / oldSize.height,
473
+ width: currentSize.width / oldSize.width,
474
+ height: currentSize.height / oldSize.height,
464
475
  });
465
476
  }
466
477
  return true;
@@ -88,7 +88,7 @@ export class Container {
88
88
  this._sourceOptions = sourceOptions;
89
89
  this._initialSourceOptions = sourceOptions;
90
90
  this.retina = new Retina(this);
91
- this.canvas = new Canvas(this);
91
+ this.canvas = new Canvas(this, this._engine);
92
92
  this.particles = new Particles(this._engine, this);
93
93
  this.pathGenerators = new Map();
94
94
  this.interactivity = {
@@ -71,6 +71,8 @@ export class Engine {
71
71
  this._eventDispatcher = new EventDispatcher();
72
72
  this._initialized = false;
73
73
  this.plugins = [];
74
+ this.colorManagers = new Map();
75
+ this.easingFunctions = new Map();
74
76
  this._initializers = {
75
77
  interactors: new Map(),
76
78
  movers: new Map(),
@@ -95,13 +97,24 @@ export class Engine {
95
97
  return this._domArray;
96
98
  }
97
99
  get version() {
98
- return "3.6.0-beta.1";
100
+ return "3.7.0";
101
+ }
102
+ async addColorManager(manager, refresh = true) {
103
+ this.colorManagers.set(manager.key, manager);
104
+ await this.refresh(refresh);
99
105
  }
100
106
  addConfig(config) {
101
107
  const key = config.key ?? config.name ?? "default";
102
108
  this._configs.set(key, config);
103
109
  this._eventDispatcher.dispatchEvent(EventType.configAdded, { data: { name: key, config } });
104
110
  }
111
+ async addEasing(name, easing, refresh = true) {
112
+ if (this.getEasing(name)) {
113
+ return;
114
+ }
115
+ this.easingFunctions.set(name, easing);
116
+ await this.refresh(refresh);
117
+ }
105
118
  async addEffect(effect, drawer, refresh = true) {
106
119
  executeOnSingleOrMultiple(effect, type => {
107
120
  if (!this.getEffectDrawer(type)) {
@@ -175,6 +188,9 @@ export class Engine {
175
188
  }
176
189
  return res;
177
190
  }
191
+ getEasing(name) {
192
+ return this.easingFunctions.get(name) ?? ((value) => value);
193
+ }
178
194
  getEffectDrawer(type) {
179
195
  return this.effectDrawers.get(type);
180
196
  }
@@ -325,7 +325,7 @@ export class Particle {
325
325
  this.sides = sideCountFunc(this);
326
326
  }
327
327
  this.spawning = false;
328
- this.shadowColor = rangeColorToRgb(this.options.shadow.color);
328
+ this.shadowColor = rangeColorToRgb(this._engine, this.options.shadow.color);
329
329
  for (const updater of particles.updaters) {
330
330
  updater.init(this);
331
331
  }
@@ -1,4 +1,4 @@
1
- import { isArray, isString } from "../../Utils/TypeUtils.js";
1
+ import { isArray, isNull, isString } from "../../Utils/TypeUtils.js";
2
2
  import { HslAnimation } from "./HslAnimation.js";
3
3
  import { OptionsColor } from "./OptionsColor.js";
4
4
  export class AnimatableColor extends OptionsColor {
@@ -21,7 +21,7 @@ export class AnimatableColor extends OptionsColor {
21
21
  }
22
22
  load(data) {
23
23
  super.load(data);
24
- if (!data) {
24
+ if (isNull(data)) {
25
25
  return;
26
26
  }
27
27
  const colorAnimation = data.animation;
@@ -1,5 +1,6 @@
1
1
  import { AnimationMode } from "../../Enums/Modes/AnimationMode.js";
2
2
  import { StartValueType } from "../../Enums/Types/StartValueType.js";
3
+ import { isNull } from "../../Utils/TypeUtils.js";
3
4
  import { setRangeValue } from "../../Utils/NumberUtils.js";
4
5
  export class AnimationOptions {
5
6
  constructor() {
@@ -11,7 +12,7 @@ export class AnimationOptions {
11
12
  this.sync = false;
12
13
  }
13
14
  load(data) {
14
- if (!data) {
15
+ if (isNull(data)) {
15
16
  return;
16
17
  }
17
18
  if (data.count !== undefined) {
@@ -42,7 +43,7 @@ export class RangedAnimationOptions extends AnimationOptions {
42
43
  }
43
44
  load(data) {
44
45
  super.load(data);
45
- if (!data) {
46
+ if (isNull(data)) {
46
47
  return;
47
48
  }
48
49
  if (data.mode !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { OptionsColor } from "../OptionsColor.js";
2
+ import { isNull } from "../../../Utils/TypeUtils.js";
2
3
  export class Background {
3
4
  constructor() {
4
5
  this.color = new OptionsColor();
@@ -10,7 +11,7 @@ export class Background {
10
11
  this.opacity = 1;
11
12
  }
12
13
  load(data) {
13
- if (!data) {
14
+ if (isNull(data)) {
14
15
  return;
15
16
  }
16
17
  if (data.color !== undefined) {
@@ -1,5 +1,5 @@
1
+ import { isNull, isString } from "../../../Utils/TypeUtils.js";
1
2
  import { BackgroundMaskCover } from "./BackgroundMaskCover.js";
2
- import { isString } from "../../../Utils/TypeUtils.js";
3
3
  export class BackgroundMask {
4
4
  constructor() {
5
5
  this.composite = "destination-out";
@@ -7,7 +7,7 @@ export class BackgroundMask {
7
7
  this.enable = false;
8
8
  }
9
9
  load(data) {
10
- if (!data) {
10
+ if (isNull(data)) {
11
11
  return;
12
12
  }
13
13
  if (data.composite !== undefined) {
@@ -1,10 +1,11 @@
1
1
  import { OptionsColor } from "../OptionsColor.js";
2
+ import { isNull } from "../../../Utils/TypeUtils.js";
2
3
  export class BackgroundMaskCover {
3
4
  constructor() {
4
5
  this.opacity = 1;
5
6
  }
6
7
  load(data) {
7
- if (!data) {
8
+ if (isNull(data)) {
8
9
  return;
9
10
  }
10
11
  if (data.color !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { AnimationOptions } from "./AnimationOptions.js";
2
+ import { isNull } from "../../Utils/TypeUtils.js";
2
3
  import { setRangeValue } from "../../Utils/NumberUtils.js";
3
4
  export class ColorAnimation extends AnimationOptions {
4
5
  constructor() {
@@ -8,7 +9,7 @@ export class ColorAnimation extends AnimationOptions {
8
9
  }
9
10
  load(data) {
10
11
  super.load(data);
11
- if (!data) {
12
+ if (isNull(data)) {
12
13
  return;
13
14
  }
14
15
  if (data.offset !== undefined) {
@@ -1,10 +1,11 @@
1
+ import { isNull } from "../../../Utils/TypeUtils.js";
1
2
  export class FullScreen {
2
3
  constructor() {
3
4
  this.enable = true;
4
5
  this.zIndex = 0;
5
6
  }
6
7
  load(data) {
7
- if (!data) {
8
+ if (isNull(data)) {
8
9
  return;
9
10
  }
10
11
  if (data.enable !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { ColorAnimation } from "./ColorAnimation.js";
2
+ import { isNull } from "../../Utils/TypeUtils.js";
2
3
  export class HslAnimation {
3
4
  constructor() {
4
5
  this.h = new ColorAnimation();
@@ -6,7 +7,7 @@ export class HslAnimation {
6
7
  this.l = new ColorAnimation();
7
8
  }
8
9
  load(data) {
9
- if (!data) {
10
+ if (isNull(data)) {
10
11
  return;
11
12
  }
12
13
  this.h.load(data.h);
@@ -1,10 +1,11 @@
1
+ import { isNull } from "../../../../Utils/TypeUtils.js";
1
2
  export class ClickEvent {
2
3
  constructor() {
3
4
  this.enable = false;
4
5
  this.mode = [];
5
6
  }
6
7
  load(data) {
7
- if (!data) {
8
+ if (isNull(data)) {
8
9
  return;
9
10
  }
10
11
  if (data.enable !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { DivType } from "../../../../Enums/Types/DivType.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  export class DivEvent {
3
4
  constructor() {
4
5
  this.selectors = [];
@@ -7,7 +8,7 @@ export class DivEvent {
7
8
  this.type = DivType.circle;
8
9
  }
9
10
  load(data) {
10
- if (!data) {
11
+ if (isNull(data)) {
11
12
  return;
12
13
  }
13
14
  if (data.selectors !== undefined) {
@@ -3,6 +3,7 @@ import { DivEvent } from "./DivEvent.js";
3
3
  import { HoverEvent } from "./HoverEvent.js";
4
4
  import { ResizeEvent } from "./ResizeEvent.js";
5
5
  import { executeOnSingleOrMultiple } from "../../../../Utils/Utils.js";
6
+ import { isNull } from "../../../../Utils/TypeUtils.js";
6
7
  export class Events {
7
8
  constructor() {
8
9
  this.onClick = new ClickEvent();
@@ -11,7 +12,7 @@ export class Events {
11
12
  this.resize = new ResizeEvent();
12
13
  }
13
14
  load(data) {
14
- if (!data) {
15
+ if (isNull(data)) {
15
16
  return;
16
17
  }
17
18
  this.onClick.load(data.onClick);
@@ -1,4 +1,5 @@
1
1
  import { Parallax } from "./Parallax.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  export class HoverEvent {
3
4
  constructor() {
4
5
  this.enable = false;
@@ -6,7 +7,7 @@ export class HoverEvent {
6
7
  this.parallax = new Parallax();
7
8
  }
8
9
  load(data) {
9
- if (!data) {
10
+ if (isNull(data)) {
10
11
  return;
11
12
  }
12
13
  if (data.enable !== undefined) {
@@ -1,3 +1,4 @@
1
+ import { isNull } from "../../../../Utils/TypeUtils.js";
1
2
  export class Parallax {
2
3
  constructor() {
3
4
  this.enable = false;
@@ -5,7 +6,7 @@ export class Parallax {
5
6
  this.smooth = 10;
6
7
  }
7
8
  load(data) {
8
- if (!data) {
9
+ if (isNull(data)) {
9
10
  return;
10
11
  }
11
12
  if (data.enable !== undefined) {
@@ -1,10 +1,11 @@
1
+ import { isNull } from "../../../../Utils/TypeUtils.js";
1
2
  export class ResizeEvent {
2
3
  constructor() {
3
4
  this.delay = 0.5;
4
5
  this.enable = true;
5
6
  }
6
7
  load(data) {
7
- if (data === undefined) {
8
+ if (isNull(data)) {
8
9
  return;
9
10
  }
10
11
  if (data.delay !== undefined) {
@@ -1,6 +1,7 @@
1
1
  import { Events } from "./Events/Events.js";
2
2
  import { InteractivityDetect } from "../../../Enums/InteractivityDetect.js";
3
3
  import { Modes } from "./Modes/Modes.js";
4
+ import { isNull } from "../../../Utils/TypeUtils.js";
4
5
  export class Interactivity {
5
6
  constructor(engine, container) {
6
7
  this.detectsOn = InteractivityDetect.window;
@@ -8,7 +9,7 @@ export class Interactivity {
8
9
  this.modes = new Modes(engine, container);
9
10
  }
10
11
  load(data) {
11
- if (!data) {
12
+ if (isNull(data)) {
12
13
  return;
13
14
  }
14
15
  const detectsOn = data.detectsOn;
@@ -1,10 +1,11 @@
1
+ import { isNull } from "../../../../Utils/TypeUtils.js";
1
2
  export class Modes {
2
3
  constructor(engine, container) {
3
4
  this._engine = engine;
4
5
  this._container = container;
5
6
  }
6
7
  load(data) {
7
- if (!data) {
8
+ if (isNull(data)) {
8
9
  return;
9
10
  }
10
11
  if (!this._container) {
@@ -1,9 +1,10 @@
1
1
  import { PixelMode } from "../../Enums/Modes/PixelMode.js";
2
2
  import { deepExtend } from "../../Utils/Utils.js";
3
+ import { isNull } from "../../Utils/TypeUtils.js";
3
4
  const defaultPosition = 50;
4
5
  export class ManualParticle {
5
6
  load(data) {
6
- if (!data) {
7
+ if (isNull(data)) {
7
8
  return;
8
9
  }
9
10
  if (data.position) {
@@ -1,4 +1,5 @@
1
1
  import { deepExtend, executeOnSingleOrMultiple, safeMatchMedia } from "../../Utils/Utils.js";
2
+ import { isBoolean, isNull } from "../../Utils/TypeUtils.js";
2
3
  import { Background } from "./Background/Background.js";
3
4
  import { BackgroundMask } from "./BackgroundMask/BackgroundMask.js";
4
5
  import { FullScreen } from "./FullScreen/FullScreen.js";
@@ -8,7 +9,6 @@ import { Responsive } from "./Responsive.js";
8
9
  import { ResponsiveMode } from "../../Enums/Modes/ResponsiveMode.js";
9
10
  import { Theme } from "./Theme/Theme.js";
10
11
  import { ThemeMode } from "../../Enums/Modes/ThemeMode.js";
11
- import { isBoolean } from "../../Utils/TypeUtils.js";
12
12
  import { loadParticlesOptions } from "../../Utils/OptionsUtils.js";
13
13
  import { setRangeValue } from "../../Utils/NumberUtils.js";
14
14
  export class Options {
@@ -44,7 +44,7 @@ export class Options {
44
44
  this.zLayers = 100;
45
45
  }
46
46
  load(data) {
47
- if (!data) {
47
+ if (isNull(data)) {
48
48
  return;
49
49
  }
50
50
  if (data.preset !== undefined) {
@@ -1,4 +1,4 @@
1
- import { isArray, isString } from "../../Utils/TypeUtils.js";
1
+ import { isArray, isNull, isString } from "../../Utils/TypeUtils.js";
2
2
  export class OptionsColor {
3
3
  constructor() {
4
4
  this.value = "";
@@ -17,9 +17,11 @@ export class OptionsColor {
17
17
  return color;
18
18
  }
19
19
  load(data) {
20
- if (data?.value === undefined) {
20
+ if (isNull(data)) {
21
21
  return;
22
22
  }
23
- this.value = data.value;
23
+ if (!isNull(data.value)) {
24
+ this.value = data.value;
25
+ }
24
26
  }
25
27
  }
@@ -1,11 +1,12 @@
1
1
  import { ParticlesBounceFactor } from "./ParticlesBounceFactor.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  export class ParticlesBounce {
3
4
  constructor() {
4
5
  this.horizontal = new ParticlesBounceFactor();
5
6
  this.vertical = new ParticlesBounceFactor();
6
7
  }
7
8
  load(data) {
8
- if (!data) {
9
+ if (isNull(data)) {
9
10
  return;
10
11
  }
11
12
  this.horizontal.load(data.horizontal);
@@ -2,6 +2,7 @@ import { CollisionMode } from "../../../../Enums/Modes/CollisionMode.js";
2
2
  import { CollisionsAbsorb } from "./CollisionsAbsorb.js";
3
3
  import { CollisionsOverlap } from "./CollisionsOverlap.js";
4
4
  import { ParticlesBounce } from "../Bounce/ParticlesBounce.js";
5
+ import { isNull } from "../../../../Utils/TypeUtils.js";
5
6
  import { setRangeValue } from "../../../../Utils/NumberUtils.js";
6
7
  export class Collisions {
7
8
  constructor() {
@@ -13,7 +14,7 @@ export class Collisions {
13
14
  this.overlap = new CollisionsOverlap();
14
15
  }
15
16
  load(data) {
16
- if (!data) {
17
+ if (isNull(data)) {
17
18
  return;
18
19
  }
19
20
  this.absorb.load(data.absorb);
@@ -1,9 +1,10 @@
1
+ import { isNull } from "../../../../Utils/TypeUtils.js";
1
2
  export class CollisionsAbsorb {
2
3
  constructor() {
3
4
  this.speed = 2;
4
5
  }
5
6
  load(data) {
6
- if (!data) {
7
+ if (isNull(data)) {
7
8
  return;
8
9
  }
9
10
  if (data.speed !== undefined) {
@@ -1,10 +1,11 @@
1
+ import { isNull } from "../../../../Utils/TypeUtils.js";
1
2
  export class CollisionsOverlap {
2
3
  constructor() {
3
4
  this.enable = true;
4
5
  this.retries = 0;
5
6
  }
6
7
  load(data) {
7
- if (!data) {
8
+ if (isNull(data)) {
8
9
  return;
9
10
  }
10
11
  if (data.enable !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { deepExtend } from "../../../../Utils/Utils.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  export class Effect {
3
4
  constructor() {
4
5
  this.close = true;
@@ -7,7 +8,7 @@ export class Effect {
7
8
  this.type = [];
8
9
  }
9
10
  load(data) {
10
- if (!data) {
11
+ if (isNull(data)) {
11
12
  return;
12
13
  }
13
14
  const options = data.options;
@@ -1,5 +1,5 @@
1
1
  import { MoveDirection } from "../../../../Enums/Directions/MoveDirection.js";
2
- import { isNumber, isObject } from "../../../../Utils/TypeUtils.js";
2
+ import { isNull, isNumber, isObject } from "../../../../Utils/TypeUtils.js";
3
3
  import { MoveAngle } from "./MoveAngle.js";
4
4
  import { MoveAttract } from "./MoveAttract.js";
5
5
  import { MoveCenter } from "./MoveCenter.js";
@@ -32,7 +32,7 @@ export class Move {
32
32
  this.warp = false;
33
33
  }
34
34
  load(data) {
35
- if (!data) {
35
+ if (isNull(data)) {
36
36
  return;
37
37
  }
38
38
  this.angle.load(isNumber(data.angle) ? { value: data.angle } : data.angle);
@@ -1,3 +1,4 @@
1
+ import { isNull } from "../../../../Utils/TypeUtils.js";
1
2
  import { setRangeValue } from "../../../../Utils/NumberUtils.js";
2
3
  export class MoveAngle {
3
4
  constructor() {
@@ -5,7 +6,7 @@ export class MoveAngle {
5
6
  this.value = 90;
6
7
  }
7
8
  load(data) {
8
- if (!data) {
9
+ if (isNull(data)) {
9
10
  return;
10
11
  }
11
12
  if (data.offset !== undefined) {
@@ -1,3 +1,4 @@
1
+ import { isNull } from "../../../../Utils/TypeUtils.js";
1
2
  import { setRangeValue } from "../../../../Utils/NumberUtils.js";
2
3
  export class MoveAttract {
3
4
  constructor() {
@@ -9,7 +10,7 @@ export class MoveAttract {
9
10
  };
10
11
  }
11
12
  load(data) {
12
- if (!data) {
13
+ if (isNull(data)) {
13
14
  return;
14
15
  }
15
16
  if (data.distance !== undefined) {
@@ -1,4 +1,5 @@
1
1
  import { PixelMode } from "../../../../Enums/Modes/PixelMode.js";
2
+ import { isNull } from "../../../../Utils/TypeUtils.js";
2
3
  export class MoveCenter {
3
4
  constructor() {
4
5
  this.x = 50;
@@ -7,7 +8,7 @@ export class MoveCenter {
7
8
  this.radius = 0;
8
9
  }
9
10
  load(data) {
10
- if (!data) {
11
+ if (isNull(data)) {
11
12
  return;
12
13
  }
13
14
  if (data.x !== undefined) {