@tsparticles/engine 4.0.0-alpha.5 → 4.0.0-beta.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 (279) hide show
  1. package/164.min.js +1 -0
  2. package/README.md +41 -7
  3. package/browser/Core/Canvas.js +250 -143
  4. package/browser/Core/Container.js +80 -74
  5. package/browser/Core/Engine.js +44 -67
  6. package/browser/Core/Particle.js +202 -173
  7. package/browser/Core/Particles.js +187 -138
  8. package/browser/Core/Retina.js +5 -0
  9. package/browser/Core/Utils/Constants.js +2 -2
  10. package/browser/Core/Utils/EventListeners.js +67 -63
  11. package/browser/Core/Utils/Ranges.js +29 -10
  12. package/browser/Core/Utils/SpatialHashGrid.js +102 -0
  13. package/browser/Core/Utils/Vectors.js +17 -18
  14. package/browser/Enums/Types/EasingType.js +18 -3
  15. package/browser/Options/Classes/AnimatableColor.js +1 -0
  16. package/browser/Options/Classes/AnimationOptions.js +8 -0
  17. package/browser/Options/Classes/Background/Background.js +6 -0
  18. package/browser/Options/Classes/ColorAnimation.js +12 -1
  19. package/browser/Options/Classes/FullScreen/FullScreen.js +2 -0
  20. package/browser/Options/Classes/HslAnimation.js +4 -5
  21. package/browser/Options/Classes/Options.js +63 -4
  22. package/browser/Options/Classes/OptionsColor.js +1 -0
  23. package/browser/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  24. package/browser/Options/Classes/Particles/Effect/Effect.js +3 -4
  25. package/browser/Options/Classes/Particles/Fill.js +28 -0
  26. package/browser/Options/Classes/Particles/Move/Move.js +17 -3
  27. package/browser/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  28. package/browser/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  29. package/browser/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  30. package/browser/Options/Classes/Particles/Move/OutModes.js +5 -0
  31. package/browser/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  32. package/browser/Options/Classes/Particles/Move/Spin.js +3 -0
  33. package/browser/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  34. package/browser/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  35. package/browser/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  36. package/browser/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  37. package/browser/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  38. package/browser/Options/Classes/Particles/ParticlesOptions.js +25 -5
  39. package/browser/Options/Classes/Particles/Shape/Shape.js +3 -4
  40. package/browser/Options/Classes/Particles/Size/Size.js +1 -0
  41. package/browser/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  42. package/browser/Options/Classes/Particles/Stroke.js +3 -0
  43. package/browser/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  44. package/browser/Options/Classes/ResizeEvent.js +2 -0
  45. package/browser/Options/Classes/ValueWithRandom.js +3 -4
  46. package/browser/Utils/CanvasUtils.js +43 -62
  47. package/browser/Utils/ColorUtils.js +30 -19
  48. package/browser/Utils/EventDispatcher.js +1 -0
  49. package/browser/Utils/MathUtils.js +12 -7
  50. package/browser/Utils/Utils.js +109 -31
  51. package/browser/exports.js +1 -2
  52. package/cjs/Core/Canvas.js +250 -143
  53. package/cjs/Core/Container.js +80 -74
  54. package/cjs/Core/Engine.js +44 -67
  55. package/cjs/Core/Particle.js +202 -173
  56. package/cjs/Core/Particles.js +187 -138
  57. package/cjs/Core/Retina.js +5 -0
  58. package/cjs/Core/Utils/Constants.js +2 -2
  59. package/cjs/Core/Utils/EventListeners.js +67 -63
  60. package/cjs/Core/Utils/Ranges.js +29 -10
  61. package/cjs/Core/Utils/SpatialHashGrid.js +102 -0
  62. package/cjs/Core/Utils/Vectors.js +17 -18
  63. package/cjs/Enums/Types/EasingType.js +18 -3
  64. package/cjs/Options/Classes/AnimatableColor.js +1 -0
  65. package/cjs/Options/Classes/AnimationOptions.js +8 -0
  66. package/cjs/Options/Classes/Background/Background.js +6 -0
  67. package/cjs/Options/Classes/ColorAnimation.js +12 -1
  68. package/cjs/Options/Classes/FullScreen/FullScreen.js +2 -0
  69. package/cjs/Options/Classes/HslAnimation.js +4 -5
  70. package/cjs/Options/Classes/Options.js +63 -4
  71. package/cjs/Options/Classes/OptionsColor.js +1 -0
  72. package/cjs/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  73. package/cjs/Options/Classes/Particles/Effect/Effect.js +3 -4
  74. package/cjs/Options/Classes/Particles/Fill.js +28 -0
  75. package/cjs/Options/Classes/Particles/Move/Move.js +17 -3
  76. package/cjs/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  77. package/cjs/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  78. package/cjs/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  79. package/cjs/Options/Classes/Particles/Move/OutModes.js +5 -0
  80. package/cjs/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  81. package/cjs/Options/Classes/Particles/Move/Spin.js +3 -0
  82. package/cjs/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  83. package/cjs/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  84. package/cjs/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  85. package/cjs/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  86. package/cjs/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  87. package/cjs/Options/Classes/Particles/ParticlesOptions.js +25 -5
  88. package/cjs/Options/Classes/Particles/Shape/Shape.js +3 -4
  89. package/cjs/Options/Classes/Particles/Size/Size.js +1 -0
  90. package/cjs/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  91. package/cjs/Options/Classes/Particles/Stroke.js +3 -0
  92. package/cjs/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  93. package/cjs/Options/Classes/ResizeEvent.js +2 -0
  94. package/cjs/Options/Classes/ValueWithRandom.js +3 -4
  95. package/cjs/Utils/CanvasUtils.js +43 -62
  96. package/cjs/Utils/ColorUtils.js +30 -19
  97. package/cjs/Utils/EventDispatcher.js +1 -0
  98. package/cjs/Utils/MathUtils.js +12 -7
  99. package/cjs/Utils/Utils.js +109 -31
  100. package/cjs/exports.js +1 -2
  101. package/dist_browser_Core_Container_js.js +12 -12
  102. package/esm/Core/Canvas.js +250 -143
  103. package/esm/Core/Container.js +80 -74
  104. package/esm/Core/Engine.js +44 -67
  105. package/esm/Core/Particle.js +202 -173
  106. package/esm/Core/Particles.js +187 -138
  107. package/esm/Core/Retina.js +5 -0
  108. package/esm/Core/Utils/Constants.js +2 -2
  109. package/esm/Core/Utils/EventListeners.js +67 -63
  110. package/esm/Core/Utils/Ranges.js +29 -10
  111. package/esm/Core/Utils/SpatialHashGrid.js +102 -0
  112. package/esm/Core/Utils/Vectors.js +17 -18
  113. package/esm/Enums/Types/EasingType.js +18 -3
  114. package/esm/Options/Classes/AnimatableColor.js +1 -0
  115. package/esm/Options/Classes/AnimationOptions.js +8 -0
  116. package/esm/Options/Classes/Background/Background.js +6 -0
  117. package/esm/Options/Classes/ColorAnimation.js +12 -1
  118. package/esm/Options/Classes/FullScreen/FullScreen.js +2 -0
  119. package/esm/Options/Classes/HslAnimation.js +4 -5
  120. package/esm/Options/Classes/Options.js +63 -4
  121. package/esm/Options/Classes/OptionsColor.js +1 -0
  122. package/esm/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  123. package/esm/Options/Classes/Particles/Effect/Effect.js +3 -4
  124. package/esm/Options/Classes/Particles/Fill.js +28 -0
  125. package/esm/Options/Classes/Particles/Move/Move.js +17 -3
  126. package/esm/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  127. package/esm/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  128. package/esm/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  129. package/esm/Options/Classes/Particles/Move/OutModes.js +5 -0
  130. package/esm/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  131. package/esm/Options/Classes/Particles/Move/Spin.js +3 -0
  132. package/esm/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  133. package/esm/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  134. package/esm/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  135. package/esm/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  136. package/esm/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  137. package/esm/Options/Classes/Particles/ParticlesOptions.js +25 -5
  138. package/esm/Options/Classes/Particles/Shape/Shape.js +3 -4
  139. package/esm/Options/Classes/Particles/Size/Size.js +1 -0
  140. package/esm/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  141. package/esm/Options/Classes/Particles/Stroke.js +3 -0
  142. package/esm/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  143. package/esm/Options/Classes/ResizeEvent.js +2 -0
  144. package/esm/Options/Classes/ValueWithRandom.js +3 -4
  145. package/esm/Utils/CanvasUtils.js +43 -62
  146. package/esm/Utils/ColorUtils.js +30 -19
  147. package/esm/Utils/EventDispatcher.js +1 -0
  148. package/esm/Utils/MathUtils.js +12 -7
  149. package/esm/Utils/Utils.js +109 -31
  150. package/esm/exports.js +1 -2
  151. package/package.json +1 -1
  152. package/report.html +3 -3
  153. package/scripts/install.js +4 -20
  154. package/tsparticles.engine.js +93 -91
  155. package/tsparticles.engine.min.js +2 -2
  156. package/types/Core/Canvas.d.ts +17 -4
  157. package/types/Core/Container.d.ts +3 -7
  158. package/types/Core/Engine.d.ts +13 -20
  159. package/types/Core/Interfaces/IColorManager.d.ts +0 -1
  160. package/types/Core/Interfaces/IContainerPlugin.d.ts +6 -1
  161. package/types/Core/Interfaces/IPalette.d.ts +7 -0
  162. package/types/Core/Interfaces/IParticleOpacityData.d.ts +1 -0
  163. package/types/Core/Interfaces/IParticleValueAnimation.d.ts +3 -3
  164. package/types/Core/Interfaces/IShapeDrawData.d.ts +8 -0
  165. package/types/Core/Interfaces/IShapeDrawer.d.ts +0 -1
  166. package/types/Core/Interfaces/IShapeValues.d.ts +0 -1
  167. package/types/Core/Particle.d.ts +4 -7
  168. package/types/Core/Particles.d.ts +15 -7
  169. package/types/Core/Utils/Constants.d.ts +2 -2
  170. package/types/Core/Utils/Ranges.d.ts +4 -1
  171. package/types/Core/Utils/SpatialHashGrid.d.ts +25 -0
  172. package/types/Core/Utils/Vectors.d.ts +8 -10
  173. package/types/Enums/Types/EasingType.d.ts +20 -5
  174. package/types/Options/Classes/ColorAnimation.d.ts +3 -1
  175. package/types/Options/Classes/HslAnimation.d.ts +3 -4
  176. package/types/Options/Classes/Options.d.ts +2 -0
  177. package/types/Options/Classes/Particles/Effect/Effect.d.ts +0 -1
  178. package/types/Options/Classes/Particles/Fill.d.ts +12 -0
  179. package/types/Options/Classes/Particles/Move/Move.d.ts +0 -2
  180. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +2 -2
  181. package/types/Options/Classes/Particles/Shape/Shape.d.ts +0 -1
  182. package/types/Options/Classes/ValueWithRandom.d.ts +0 -1
  183. package/types/Options/Interfaces/IColorAnimation.d.ts +2 -0
  184. package/types/Options/Interfaces/IOptions.d.ts +1 -0
  185. package/types/Options/Interfaces/Particles/Effect/IEffect.d.ts +0 -1
  186. package/types/Options/Interfaces/Particles/IFill.d.ts +9 -0
  187. package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +2 -2
  188. package/types/Options/Interfaces/Particles/IStroke.d.ts +2 -2
  189. package/types/Options/Interfaces/Particles/Move/IMove.d.ts +0 -2
  190. package/types/Options/Interfaces/Particles/Shape/IShape.d.ts +0 -1
  191. package/types/Types/EngineInitializers.d.ts +6 -3
  192. package/types/Utils/CanvasUtils.d.ts +6 -14
  193. package/types/Utils/ColorUtils.d.ts +3 -2
  194. package/types/Utils/MathUtils.d.ts +2 -0
  195. package/types/Utils/Utils.d.ts +8 -1
  196. package/types/export-types.d.ts +3 -5
  197. package/types/exports.d.ts +1 -2
  198. package/umd/Core/Canvas.js +248 -141
  199. package/umd/Core/Container.js +80 -74
  200. package/umd/Core/Engine.js +43 -66
  201. package/umd/Core/Particle.js +203 -174
  202. package/umd/Core/Particles.js +187 -138
  203. package/umd/Core/Retina.js +5 -0
  204. package/umd/Core/Utils/Constants.js +3 -3
  205. package/umd/Core/Utils/EventListeners.js +67 -63
  206. package/umd/Core/Utils/Ranges.js +28 -9
  207. package/umd/Core/Utils/SpatialHashGrid.js +116 -0
  208. package/umd/Core/Utils/Vectors.js +17 -18
  209. package/umd/Enums/Types/EasingType.js +18 -3
  210. package/umd/Options/Classes/AnimatableColor.js +1 -0
  211. package/umd/Options/Classes/AnimationOptions.js +8 -0
  212. package/umd/Options/Classes/Background/Background.js +6 -0
  213. package/umd/Options/Classes/ColorAnimation.js +12 -1
  214. package/umd/Options/Classes/FullScreen/FullScreen.js +2 -0
  215. package/umd/Options/Classes/HslAnimation.js +5 -6
  216. package/umd/Options/Classes/Options.js +63 -4
  217. package/umd/Options/Classes/OptionsColor.js +1 -0
  218. package/umd/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  219. package/umd/Options/Classes/Particles/Effect/Effect.js +3 -4
  220. package/umd/Options/Classes/Particles/Fill.js +42 -0
  221. package/umd/Options/Classes/Particles/Move/Move.js +18 -4
  222. package/umd/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  223. package/umd/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  224. package/umd/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  225. package/umd/Options/Classes/Particles/Move/OutModes.js +5 -0
  226. package/umd/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  227. package/umd/Options/Classes/Particles/Move/Spin.js +3 -0
  228. package/umd/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  229. package/umd/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  230. package/umd/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  231. package/umd/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  232. package/umd/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  233. package/umd/Options/Classes/Particles/ParticlesOptions.js +26 -6
  234. package/umd/Options/Classes/Particles/Shape/Shape.js +3 -4
  235. package/umd/Options/Classes/Particles/Size/Size.js +1 -0
  236. package/umd/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  237. package/umd/Options/Classes/Particles/Stroke.js +3 -0
  238. package/umd/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  239. package/umd/Options/Classes/ResizeEvent.js +2 -0
  240. package/umd/Options/Classes/ValueWithRandom.js +3 -4
  241. package/umd/Utils/CanvasUtils.js +43 -66
  242. package/umd/Utils/ColorUtils.js +30 -18
  243. package/umd/Utils/EventDispatcher.js +1 -0
  244. package/umd/Utils/MathUtils.js +14 -7
  245. package/umd/Utils/Utils.js +111 -32
  246. package/umd/exports.js +2 -3
  247. package/794.min.js +0 -2
  248. package/794.min.js.LICENSE.txt +0 -1
  249. package/browser/Core/Utils/Point.js +0 -6
  250. package/browser/Core/Utils/QuadTree.js +0 -59
  251. package/browser/Options/Classes/Particles/Move/MoveAttract.js +0 -33
  252. package/cjs/Core/Utils/Point.js +0 -6
  253. package/cjs/Core/Utils/QuadTree.js +0 -59
  254. package/cjs/Options/Classes/Particles/Move/MoveAttract.js +0 -33
  255. package/esm/Core/Interfaces/IMovePathGenerator.js +0 -1
  256. package/esm/Core/Interfaces/IParticleMover.js +0 -1
  257. package/esm/Core/Utils/Point.js +0 -6
  258. package/esm/Core/Utils/QuadTree.js +0 -59
  259. package/esm/Options/Classes/Particles/Move/MoveAttract.js +0 -33
  260. package/esm/Options/Interfaces/Particles/Move/IMoveAttract.js +0 -1
  261. package/tsparticles.engine.min.js.LICENSE.txt +0 -1
  262. package/types/Core/Interfaces/IMovePathGenerator.d.ts +0 -10
  263. package/types/Core/Interfaces/IParticleMover.d.ts +0 -7
  264. package/types/Core/Utils/Point.d.ts +0 -7
  265. package/types/Core/Utils/QuadTree.d.ts +0 -18
  266. package/types/Options/Classes/Particles/Move/MoveAttract.d.ts +0 -12
  267. package/types/Options/Interfaces/Particles/Move/IMoveAttract.d.ts +0 -7
  268. package/umd/Core/Utils/Point.js +0 -20
  269. package/umd/Core/Utils/QuadTree.js +0 -73
  270. package/umd/Options/Classes/Particles/Move/MoveAttract.js +0 -47
  271. package/umd/Options/Interfaces/Particles/Move/IMoveAttract.js +0 -12
  272. /package/browser/Core/Interfaces/{IMovePathGenerator.js → IPalette.js} +0 -0
  273. /package/browser/{Core/Interfaces/IParticleMover.js → Options/Interfaces/Particles/IFill.js} +0 -0
  274. /package/{browser/Options/Interfaces/Particles/Move/IMoveAttract.js → cjs/Core/Interfaces/IPalette.js} +0 -0
  275. /package/cjs/{Core/Interfaces/IMovePathGenerator.js → Options/Interfaces/Particles/IFill.js} +0 -0
  276. /package/{cjs/Core/Interfaces/IParticleMover.js → esm/Core/Interfaces/IPalette.js} +0 -0
  277. /package/{cjs/Options/Interfaces/Particles/Move/IMoveAttract.js → esm/Options/Interfaces/Particles/IFill.js} +0 -0
  278. /package/umd/Core/Interfaces/{IMovePathGenerator.js → IPalette.js} +0 -0
  279. /package/umd/{Core/Interfaces/IParticleMover.js → Options/Interfaces/Particles/IFill.js} +0 -0
@@ -1,6 +1,6 @@
1
- import { clear, clearDrawPlugin, drawParticle, drawParticlePlugin, drawPlugin, paintBase, paintImage, } from "../Utils/CanvasUtils.js";
1
+ import { clear, drawParticle, drawParticlePlugin, paintBase, paintImage } from "../Utils/CanvasUtils.js";
2
2
  import { cloneStyle, getFullScreenStyle, safeMatchMedia, safeMutationObserver } from "../Utils/Utils.js";
3
- import { defaultTransformValue, generatedAttribute, minimumSize, zIndexFactorOffset } from "./Utils/Constants.js";
3
+ import { defaultCompositeValue, defaultTransformValue, defaultZoom, generatedAttribute, half, minimumSize, zIndexFactorOffset, } from "./Utils/Constants.js";
4
4
  import { getStyleFromHsl, getStyleFromRgb, rangeColorToHsl, rangeColorToRgb } from "../Utils/ColorUtils.js";
5
5
  const fColorIndex = 0, sColorIndex = 1;
6
6
  function setTransformValue(factor, newFactor, key) {
@@ -39,120 +39,37 @@ function setStyle(canvas, style, important = false) {
39
39
  }
40
40
  }
41
41
  export class Canvas {
42
+ container;
43
+ element;
44
+ size;
45
+ zoom = defaultZoom;
46
+ _canvasClearPlugins;
47
+ _canvasPaintPlugins;
48
+ _canvasSettings;
49
+ _clearDrawPlugins;
50
+ _colorPlugins;
51
+ _context;
52
+ _drawParticlePlugins;
53
+ _drawParticlesCleanupPlugins;
54
+ _drawParticlesSetupPlugins;
55
+ _drawPlugins;
56
+ _drawSettingsCleanupPlugins;
57
+ _drawSettingsSetupPlugins;
58
+ _engine;
59
+ _generated;
60
+ _mutationObserver;
61
+ _originalStyle;
62
+ _pointerEvents;
63
+ _postDrawUpdaters;
64
+ _preDrawUpdaters;
65
+ _resizePlugins;
66
+ _reusableColorStyles = {};
67
+ _reusablePluginColors = [undefined, undefined];
68
+ _reusableTransform = {};
69
+ _standardSize;
70
+ _zoomCenter;
42
71
  constructor(container, engine) {
43
72
  this.container = container;
44
- this._reusableColorStyles = {};
45
- this._reusablePluginColors = [undefined, undefined];
46
- this._reusableTransform = {};
47
- this._applyPostDrawUpdaters = particle => {
48
- for (const updater of this._postDrawUpdaters) {
49
- updater.afterDraw?.(particle);
50
- }
51
- };
52
- this._applyPreDrawUpdaters = (ctx, particle, radius, zOpacity, colorStyles, transform) => {
53
- for (const updater of this._preDrawUpdaters) {
54
- if (updater.getColorStyles) {
55
- const { fill, stroke } = updater.getColorStyles(particle, ctx, radius, zOpacity);
56
- if (fill) {
57
- colorStyles.fill = fill;
58
- }
59
- if (stroke) {
60
- colorStyles.stroke = stroke;
61
- }
62
- }
63
- if (updater.getTransformValues) {
64
- const updaterTransform = updater.getTransformValues(particle);
65
- for (const key in updaterTransform) {
66
- setTransformValue(transform, updaterTransform, key);
67
- }
68
- }
69
- updater.beforeDraw?.(particle);
70
- }
71
- };
72
- this._applyResizePlugins = () => {
73
- for (const plugin of this._resizePlugins) {
74
- plugin.resize?.();
75
- }
76
- };
77
- this._getPluginParticleColors = particle => {
78
- let fColor, sColor;
79
- for (const plugin of this._colorPlugins) {
80
- if (!fColor && plugin.particleFillColor) {
81
- fColor = rangeColorToHsl(this._engine, plugin.particleFillColor(particle));
82
- }
83
- if (!sColor && plugin.particleStrokeColor) {
84
- sColor = rangeColorToHsl(this._engine, plugin.particleStrokeColor(particle));
85
- }
86
- if (fColor && sColor) {
87
- break;
88
- }
89
- }
90
- this._reusablePluginColors[fColorIndex] = fColor;
91
- this._reusablePluginColors[sColorIndex] = sColor;
92
- return this._reusablePluginColors;
93
- };
94
- this._initStyle = () => {
95
- const element = this.element, options = this.container.actualOptions;
96
- if (!element) {
97
- return;
98
- }
99
- if (this._fullScreen) {
100
- this._setFullScreenStyle();
101
- }
102
- else {
103
- this._resetOriginalStyle();
104
- }
105
- for (const key in options.style) {
106
- if (!key || !Object.hasOwn(options.style, key)) {
107
- continue;
108
- }
109
- const value = options.style[key];
110
- if (!value) {
111
- continue;
112
- }
113
- element.style.setProperty(key, value, "important");
114
- }
115
- };
116
- this._repairStyle = () => {
117
- const element = this.element;
118
- if (!element) {
119
- return;
120
- }
121
- this._safeMutationObserver(observer => {
122
- observer.disconnect();
123
- });
124
- this._initStyle();
125
- this.initBackground();
126
- const pointerEvents = this._pointerEvents;
127
- element.style.pointerEvents = pointerEvents;
128
- element.setAttribute("pointer-events", pointerEvents);
129
- this._safeMutationObserver(observer => {
130
- if (!(element instanceof Node)) {
131
- return;
132
- }
133
- observer.observe(element, { attributes: true });
134
- });
135
- };
136
- this._resetOriginalStyle = () => {
137
- const element = this.element, originalStyle = this._originalStyle;
138
- if (!element || !originalStyle) {
139
- return;
140
- }
141
- setStyle(element, originalStyle, true);
142
- };
143
- this._safeMutationObserver = callback => {
144
- if (!this._mutationObserver) {
145
- return;
146
- }
147
- callback(this._mutationObserver);
148
- };
149
- this._setFullScreenStyle = () => {
150
- const element = this.element;
151
- if (!element) {
152
- return;
153
- }
154
- setStyle(element, getFullScreenStyle(this.container.actualOptions.fullScreen.zIndex), true);
155
- };
156
73
  this._engine = engine;
157
74
  this._standardSize = {
158
75
  height: 0,
@@ -169,8 +86,20 @@ export class Canvas {
169
86
  this._postDrawUpdaters = [];
170
87
  this._resizePlugins = [];
171
88
  this._colorPlugins = [];
89
+ this._canvasClearPlugins = [];
90
+ this._canvasPaintPlugins = [];
91
+ this._clearDrawPlugins = [];
92
+ this._drawParticlePlugins = [];
93
+ this._drawParticlesCleanupPlugins = [];
94
+ this._drawParticlesSetupPlugins = [];
95
+ this._drawPlugins = [];
96
+ this._drawSettingsSetupPlugins = [];
97
+ this._drawSettingsCleanupPlugins = [];
172
98
  this._pointerEvents = "none";
173
99
  }
100
+ get settings() {
101
+ return this._canvasSettings;
102
+ }
174
103
  get _fullScreen() {
175
104
  return this.container.actualOptions.fullScreen.enable;
176
105
  }
@@ -184,9 +113,10 @@ export class Canvas {
184
113
  }
185
114
  clear() {
186
115
  let pluginHandled = false;
187
- for (const plugin of this.container.plugins) {
188
- if (!pluginHandled && plugin.canvasClear) {
189
- pluginHandled = plugin.canvasClear();
116
+ for (const plugin of this._canvasClearPlugins) {
117
+ pluginHandled = plugin.canvasClear?.() ?? false;
118
+ if (pluginHandled) {
119
+ break;
190
120
  }
191
121
  }
192
122
  if (pluginHandled) {
@@ -194,11 +124,6 @@ export class Canvas {
194
124
  }
195
125
  this.canvasClear();
196
126
  }
197
- clearDrawPlugin(plugin, delta) {
198
- this.draw(ctx => {
199
- clearDrawPlugin(ctx, plugin, delta);
200
- });
201
- }
202
127
  destroy() {
203
128
  this.stop();
204
129
  if (this._generated) {
@@ -213,6 +138,15 @@ export class Canvas {
213
138
  this._postDrawUpdaters = [];
214
139
  this._resizePlugins = [];
215
140
  this._colorPlugins = [];
141
+ this._canvasClearPlugins = [];
142
+ this._canvasPaintPlugins = [];
143
+ this._clearDrawPlugins = [];
144
+ this._drawParticlePlugins = [];
145
+ this._drawParticlesCleanupPlugins = [];
146
+ this._drawParticlesSetupPlugins = [];
147
+ this._drawPlugins = [];
148
+ this._drawSettingsSetupPlugins = [];
149
+ this._drawSettingsCleanupPlugins = [];
216
150
  }
217
151
  draw(cb) {
218
152
  const ctx = this._context;
@@ -229,18 +163,21 @@ export class Canvas {
229
163
  if (radius <= minimumSize) {
230
164
  return;
231
165
  }
232
- const pfColor = particle.getFillColor(), psColor = particle.getStrokeColor() ?? pfColor;
166
+ const pfColor = particle.getFillColor(), psColor = particle.getStrokeColor();
233
167
  let [fColor, sColor] = this._getPluginParticleColors(particle);
234
168
  fColor ??= pfColor;
235
169
  sColor ??= psColor;
236
170
  if (!fColor && !sColor) {
237
171
  return;
238
172
  }
239
- const container = this.container, zIndexOptions = particle.options.zIndex, zIndexFactor = zIndexFactorOffset - particle.zIndexFactor, { opacity, strokeOpacity } = particle.getOpacity(), transform = this._reusableTransform, colorStyles = this._reusableColorStyles, fill = fColor ? getStyleFromHsl(fColor, container.hdr, opacity) : undefined, stroke = sColor ? getStyleFromHsl(sColor, container.hdr, strokeOpacity) : fill;
173
+ const container = this.container, zIndexOptions = particle.options.zIndex, zIndexFactor = zIndexFactorOffset - particle.zIndexFactor, { fillOpacity, opacity, strokeOpacity } = particle.getOpacity(), transform = this._reusableTransform, colorStyles = this._reusableColorStyles, fill = fColor ? getStyleFromHsl(fColor, container.hdr, fillOpacity * opacity) : undefined, stroke = sColor ? getStyleFromHsl(sColor, container.hdr, strokeOpacity * opacity) : fill;
240
174
  transform.a = transform.b = transform.c = transform.d = undefined;
241
175
  colorStyles.fill = fill;
242
176
  colorStyles.stroke = stroke;
243
177
  this.draw((context) => {
178
+ for (const plugin of this._drawParticlesSetupPlugins) {
179
+ plugin.drawParticleSetup?.(context, particle, delta);
180
+ }
244
181
  this._applyPreDrawUpdaters(context, particle, radius, opacity, colorStyles, transform);
245
182
  drawParticle({
246
183
  container,
@@ -252,32 +189,48 @@ export class Canvas {
252
189
  opacity: opacity,
253
190
  transform,
254
191
  });
192
+ this._applyPostDrawUpdaters(particle);
193
+ for (const plugin of this._drawParticlesCleanupPlugins) {
194
+ plugin.drawParticleCleanup?.(context, particle, delta);
195
+ }
255
196
  });
256
- this._applyPostDrawUpdaters(particle);
257
197
  }
258
- drawParticlePlugin(plugin, particle, delta) {
198
+ drawParticlePlugins(particle, delta) {
259
199
  this.draw(ctx => {
260
- drawParticlePlugin(ctx, plugin, particle, delta);
200
+ for (const plugin of this._drawParticlePlugins) {
201
+ drawParticlePlugin(ctx, plugin, particle, delta);
202
+ }
261
203
  });
262
204
  }
263
205
  drawParticles(delta) {
264
- const { particles, plugins } = this.container;
206
+ const { particles } = this.container;
265
207
  this.clear();
266
208
  particles.update(delta);
267
- for (const plugin of plugins.values()) {
268
- this.drawPlugin(plugin, delta);
269
- }
270
- this.draw(() => {
209
+ this.draw(ctx => {
210
+ for (const plugin of this._drawSettingsSetupPlugins) {
211
+ plugin.drawSettingsSetup?.(ctx, delta);
212
+ }
213
+ for (const plugin of this._drawPlugins) {
214
+ plugin.draw?.(ctx, delta);
215
+ }
271
216
  particles.drawParticles(delta);
217
+ for (const plugin of this._clearDrawPlugins) {
218
+ plugin.clearDraw?.(ctx, delta);
219
+ }
220
+ for (const plugin of this._drawSettingsCleanupPlugins) {
221
+ plugin.drawSettingsCleanup?.(ctx, delta);
222
+ }
272
223
  });
273
- for (const plugin of plugins.values()) {
274
- this.clearDrawPlugin(plugin, delta);
275
- }
276
224
  }
277
- drawPlugin(plugin, delta) {
278
- this.draw(ctx => {
279
- drawPlugin(ctx, plugin, delta);
280
- });
225
+ getZoomCenter() {
226
+ const pxRatio = this.container.retina.pixelRatio, { width, height } = this.size;
227
+ if (this._zoomCenter) {
228
+ return this._zoomCenter;
229
+ }
230
+ return {
231
+ x: (width * half) / pxRatio,
232
+ y: (height * half) / pxRatio,
233
+ };
281
234
  }
282
235
  init() {
283
236
  this._safeMutationObserver(obs => {
@@ -322,6 +275,16 @@ export class Canvas {
322
275
  }
323
276
  initPlugins() {
324
277
  this._resizePlugins = [];
278
+ this._colorPlugins = [];
279
+ this._canvasClearPlugins = [];
280
+ this._canvasPaintPlugins = [];
281
+ this._clearDrawPlugins = [];
282
+ this._drawParticlePlugins = [];
283
+ this._drawParticlesSetupPlugins = [];
284
+ this._drawParticlesCleanupPlugins = [];
285
+ this._drawPlugins = [];
286
+ this._drawSettingsSetupPlugins = [];
287
+ this._drawSettingsCleanupPlugins = [];
325
288
  for (const plugin of this.container.plugins) {
326
289
  if (plugin.resize) {
327
290
  this._resizePlugins.push(plugin);
@@ -329,6 +292,33 @@ export class Canvas {
329
292
  if (plugin.particleFillColor ?? plugin.particleStrokeColor) {
330
293
  this._colorPlugins.push(plugin);
331
294
  }
295
+ if (plugin.canvasClear) {
296
+ this._canvasClearPlugins.push(plugin);
297
+ }
298
+ if (plugin.canvasPaint) {
299
+ this._canvasPaintPlugins.push(plugin);
300
+ }
301
+ if (plugin.drawParticle) {
302
+ this._drawParticlePlugins.push(plugin);
303
+ }
304
+ if (plugin.drawParticleSetup) {
305
+ this._drawParticlesSetupPlugins.push(plugin);
306
+ }
307
+ if (plugin.drawParticleCleanup) {
308
+ this._drawParticlesCleanupPlugins.push(plugin);
309
+ }
310
+ if (plugin.draw) {
311
+ this._drawPlugins.push(plugin);
312
+ }
313
+ if (plugin.drawSettingsSetup) {
314
+ this._drawSettingsSetupPlugins.push(plugin);
315
+ }
316
+ if (plugin.drawSettingsCleanup) {
317
+ this._drawSettingsCleanupPlugins.push(plugin);
318
+ }
319
+ if (plugin.clearDraw) {
320
+ this._clearDrawPlugins.push(plugin);
321
+ }
332
322
  }
333
323
  }
334
324
  initUpdaters() {
@@ -360,12 +350,16 @@ export class Canvas {
360
350
  canvas.height = retinaSize.height = standardSize.height * pxRatio;
361
351
  canvas.width = retinaSize.width = standardSize.width * pxRatio;
362
352
  const canSupportHdrQuery = safeMatchMedia("(color-gamut: p3)");
363
- this._context = this.element.getContext("2d", {
353
+ this._canvasSettings = {
364
354
  alpha: true,
365
355
  colorSpace: canSupportHdrQuery?.matches && container.hdr ? "display-p3" : "srgb",
366
356
  desynchronized: true,
367
357
  willReadFrequently: false,
368
- });
358
+ };
359
+ this._context = this.element.getContext("2d", this._canvasSettings);
360
+ if (this._context) {
361
+ this._context.globalCompositeOperation = defaultCompositeValue;
362
+ }
369
363
  this._safeMutationObserver(obs => {
370
364
  obs.disconnect();
371
365
  });
@@ -380,11 +374,11 @@ export class Canvas {
380
374
  }
381
375
  paint() {
382
376
  let handled = false;
383
- for (const plugin of this.container.plugins) {
377
+ for (const plugin of this._canvasPaintPlugins) {
378
+ handled = plugin.canvasPaint?.() ?? false;
384
379
  if (handled) {
385
380
  break;
386
381
  }
387
- handled = plugin.canvasPaint?.() ?? false;
388
382
  }
389
383
  if (handled) {
390
384
  return;
@@ -440,6 +434,10 @@ export class Canvas {
440
434
  this._pointerEvents = type;
441
435
  this._repairStyle();
442
436
  }
437
+ setZoom(zoomLevel, center) {
438
+ this.zoom = zoomLevel;
439
+ this._zoomCenter = center;
440
+ }
443
441
  stop() {
444
442
  this._safeMutationObserver(obs => {
445
443
  obs.disconnect();
@@ -460,4 +458,113 @@ export class Canvas {
460
458
  await container.refresh();
461
459
  }
462
460
  }
461
+ _applyPostDrawUpdaters = particle => {
462
+ for (const updater of this._postDrawUpdaters) {
463
+ updater.afterDraw?.(particle);
464
+ }
465
+ };
466
+ _applyPreDrawUpdaters = (ctx, particle, radius, zOpacity, colorStyles, transform) => {
467
+ for (const updater of this._preDrawUpdaters) {
468
+ if (updater.getColorStyles) {
469
+ const { fill, stroke } = updater.getColorStyles(particle, ctx, radius, zOpacity);
470
+ if (fill) {
471
+ colorStyles.fill = fill;
472
+ }
473
+ if (stroke) {
474
+ colorStyles.stroke = stroke;
475
+ }
476
+ }
477
+ if (updater.getTransformValues) {
478
+ const updaterTransform = updater.getTransformValues(particle);
479
+ for (const key in updaterTransform) {
480
+ setTransformValue(transform, updaterTransform, key);
481
+ }
482
+ }
483
+ updater.beforeDraw?.(particle);
484
+ }
485
+ };
486
+ _applyResizePlugins = () => {
487
+ for (const plugin of this._resizePlugins) {
488
+ plugin.resize?.();
489
+ }
490
+ };
491
+ _getPluginParticleColors = particle => {
492
+ let fColor, sColor;
493
+ for (const plugin of this._colorPlugins) {
494
+ if (!fColor && plugin.particleFillColor) {
495
+ fColor = rangeColorToHsl(this._engine, plugin.particleFillColor(particle));
496
+ }
497
+ if (!sColor && plugin.particleStrokeColor) {
498
+ sColor = rangeColorToHsl(this._engine, plugin.particleStrokeColor(particle));
499
+ }
500
+ if (fColor && sColor) {
501
+ break;
502
+ }
503
+ }
504
+ this._reusablePluginColors[fColorIndex] = fColor;
505
+ this._reusablePluginColors[sColorIndex] = sColor;
506
+ return this._reusablePluginColors;
507
+ };
508
+ _initStyle = () => {
509
+ const element = this.element, options = this.container.actualOptions;
510
+ if (!element) {
511
+ return;
512
+ }
513
+ if (this._fullScreen) {
514
+ this._setFullScreenStyle();
515
+ }
516
+ else {
517
+ this._resetOriginalStyle();
518
+ }
519
+ for (const key in options.style) {
520
+ if (!key || !(key in options.style)) {
521
+ continue;
522
+ }
523
+ const value = options.style[key];
524
+ if (!value) {
525
+ continue;
526
+ }
527
+ element.style.setProperty(key, value, "important");
528
+ }
529
+ };
530
+ _repairStyle = () => {
531
+ const element = this.element;
532
+ if (!element) {
533
+ return;
534
+ }
535
+ this._safeMutationObserver(observer => {
536
+ observer.disconnect();
537
+ });
538
+ this._initStyle();
539
+ this.initBackground();
540
+ const pointerEvents = this._pointerEvents;
541
+ element.style.pointerEvents = pointerEvents;
542
+ element.setAttribute("pointer-events", pointerEvents);
543
+ this._safeMutationObserver(observer => {
544
+ if (!(element instanceof Node)) {
545
+ return;
546
+ }
547
+ observer.observe(element, { attributes: true });
548
+ });
549
+ };
550
+ _resetOriginalStyle = () => {
551
+ const element = this.element, originalStyle = this._originalStyle;
552
+ if (!element || !originalStyle) {
553
+ return;
554
+ }
555
+ setStyle(element, originalStyle, true);
556
+ };
557
+ _safeMutationObserver = callback => {
558
+ if (!this._mutationObserver) {
559
+ return;
560
+ }
561
+ callback(this._mutationObserver);
562
+ };
563
+ _setFullScreenStyle = () => {
564
+ const element = this.element;
565
+ if (!element) {
566
+ return;
567
+ }
568
+ setStyle(element, getFullScreenStyle(this.container.actualOptions.fullScreen.zIndex), true);
569
+ };
463
570
  }