@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
@@ -51,120 +51,37 @@
51
51
  }
52
52
  }
53
53
  class Canvas {
54
+ container;
55
+ element;
56
+ size;
57
+ zoom = Constants_js_1.defaultZoom;
58
+ _canvasClearPlugins;
59
+ _canvasPaintPlugins;
60
+ _canvasSettings;
61
+ _clearDrawPlugins;
62
+ _colorPlugins;
63
+ _context;
64
+ _drawParticlePlugins;
65
+ _drawParticlesCleanupPlugins;
66
+ _drawParticlesSetupPlugins;
67
+ _drawPlugins;
68
+ _drawSettingsCleanupPlugins;
69
+ _drawSettingsSetupPlugins;
70
+ _engine;
71
+ _generated;
72
+ _mutationObserver;
73
+ _originalStyle;
74
+ _pointerEvents;
75
+ _postDrawUpdaters;
76
+ _preDrawUpdaters;
77
+ _resizePlugins;
78
+ _reusableColorStyles = {};
79
+ _reusablePluginColors = [undefined, undefined];
80
+ _reusableTransform = {};
81
+ _standardSize;
82
+ _zoomCenter;
54
83
  constructor(container, engine) {
55
84
  this.container = container;
56
- this._reusableColorStyles = {};
57
- this._reusablePluginColors = [undefined, undefined];
58
- this._reusableTransform = {};
59
- this._applyPostDrawUpdaters = particle => {
60
- for (const updater of this._postDrawUpdaters) {
61
- updater.afterDraw?.(particle);
62
- }
63
- };
64
- this._applyPreDrawUpdaters = (ctx, particle, radius, zOpacity, colorStyles, transform) => {
65
- for (const updater of this._preDrawUpdaters) {
66
- if (updater.getColorStyles) {
67
- const { fill, stroke } = updater.getColorStyles(particle, ctx, radius, zOpacity);
68
- if (fill) {
69
- colorStyles.fill = fill;
70
- }
71
- if (stroke) {
72
- colorStyles.stroke = stroke;
73
- }
74
- }
75
- if (updater.getTransformValues) {
76
- const updaterTransform = updater.getTransformValues(particle);
77
- for (const key in updaterTransform) {
78
- setTransformValue(transform, updaterTransform, key);
79
- }
80
- }
81
- updater.beforeDraw?.(particle);
82
- }
83
- };
84
- this._applyResizePlugins = () => {
85
- for (const plugin of this._resizePlugins) {
86
- plugin.resize?.();
87
- }
88
- };
89
- this._getPluginParticleColors = particle => {
90
- let fColor, sColor;
91
- for (const plugin of this._colorPlugins) {
92
- if (!fColor && plugin.particleFillColor) {
93
- fColor = (0, ColorUtils_js_1.rangeColorToHsl)(this._engine, plugin.particleFillColor(particle));
94
- }
95
- if (!sColor && plugin.particleStrokeColor) {
96
- sColor = (0, ColorUtils_js_1.rangeColorToHsl)(this._engine, plugin.particleStrokeColor(particle));
97
- }
98
- if (fColor && sColor) {
99
- break;
100
- }
101
- }
102
- this._reusablePluginColors[fColorIndex] = fColor;
103
- this._reusablePluginColors[sColorIndex] = sColor;
104
- return this._reusablePluginColors;
105
- };
106
- this._initStyle = () => {
107
- const element = this.element, options = this.container.actualOptions;
108
- if (!element) {
109
- return;
110
- }
111
- if (this._fullScreen) {
112
- this._setFullScreenStyle();
113
- }
114
- else {
115
- this._resetOriginalStyle();
116
- }
117
- for (const key in options.style) {
118
- if (!key || !Object.hasOwn(options.style, key)) {
119
- continue;
120
- }
121
- const value = options.style[key];
122
- if (!value) {
123
- continue;
124
- }
125
- element.style.setProperty(key, value, "important");
126
- }
127
- };
128
- this._repairStyle = () => {
129
- const element = this.element;
130
- if (!element) {
131
- return;
132
- }
133
- this._safeMutationObserver(observer => {
134
- observer.disconnect();
135
- });
136
- this._initStyle();
137
- this.initBackground();
138
- const pointerEvents = this._pointerEvents;
139
- element.style.pointerEvents = pointerEvents;
140
- element.setAttribute("pointer-events", pointerEvents);
141
- this._safeMutationObserver(observer => {
142
- if (!(element instanceof Node)) {
143
- return;
144
- }
145
- observer.observe(element, { attributes: true });
146
- });
147
- };
148
- this._resetOriginalStyle = () => {
149
- const element = this.element, originalStyle = this._originalStyle;
150
- if (!element || !originalStyle) {
151
- return;
152
- }
153
- setStyle(element, originalStyle, true);
154
- };
155
- this._safeMutationObserver = callback => {
156
- if (!this._mutationObserver) {
157
- return;
158
- }
159
- callback(this._mutationObserver);
160
- };
161
- this._setFullScreenStyle = () => {
162
- const element = this.element;
163
- if (!element) {
164
- return;
165
- }
166
- setStyle(element, (0, Utils_js_1.getFullScreenStyle)(this.container.actualOptions.fullScreen.zIndex), true);
167
- };
168
85
  this._engine = engine;
169
86
  this._standardSize = {
170
87
  height: 0,
@@ -181,8 +98,20 @@
181
98
  this._postDrawUpdaters = [];
182
99
  this._resizePlugins = [];
183
100
  this._colorPlugins = [];
101
+ this._canvasClearPlugins = [];
102
+ this._canvasPaintPlugins = [];
103
+ this._clearDrawPlugins = [];
104
+ this._drawParticlePlugins = [];
105
+ this._drawParticlesCleanupPlugins = [];
106
+ this._drawParticlesSetupPlugins = [];
107
+ this._drawPlugins = [];
108
+ this._drawSettingsSetupPlugins = [];
109
+ this._drawSettingsCleanupPlugins = [];
184
110
  this._pointerEvents = "none";
185
111
  }
112
+ get settings() {
113
+ return this._canvasSettings;
114
+ }
186
115
  get _fullScreen() {
187
116
  return this.container.actualOptions.fullScreen.enable;
188
117
  }
@@ -196,9 +125,10 @@
196
125
  }
197
126
  clear() {
198
127
  let pluginHandled = false;
199
- for (const plugin of this.container.plugins) {
200
- if (!pluginHandled && plugin.canvasClear) {
201
- pluginHandled = plugin.canvasClear();
128
+ for (const plugin of this._canvasClearPlugins) {
129
+ pluginHandled = plugin.canvasClear?.() ?? false;
130
+ if (pluginHandled) {
131
+ break;
202
132
  }
203
133
  }
204
134
  if (pluginHandled) {
@@ -206,11 +136,6 @@
206
136
  }
207
137
  this.canvasClear();
208
138
  }
209
- clearDrawPlugin(plugin, delta) {
210
- this.draw(ctx => {
211
- (0, CanvasUtils_js_1.clearDrawPlugin)(ctx, plugin, delta);
212
- });
213
- }
214
139
  destroy() {
215
140
  this.stop();
216
141
  if (this._generated) {
@@ -225,6 +150,15 @@
225
150
  this._postDrawUpdaters = [];
226
151
  this._resizePlugins = [];
227
152
  this._colorPlugins = [];
153
+ this._canvasClearPlugins = [];
154
+ this._canvasPaintPlugins = [];
155
+ this._clearDrawPlugins = [];
156
+ this._drawParticlePlugins = [];
157
+ this._drawParticlesCleanupPlugins = [];
158
+ this._drawParticlesSetupPlugins = [];
159
+ this._drawPlugins = [];
160
+ this._drawSettingsSetupPlugins = [];
161
+ this._drawSettingsCleanupPlugins = [];
228
162
  }
229
163
  draw(cb) {
230
164
  const ctx = this._context;
@@ -241,18 +175,21 @@
241
175
  if (radius <= Constants_js_1.minimumSize) {
242
176
  return;
243
177
  }
244
- const pfColor = particle.getFillColor(), psColor = particle.getStrokeColor() ?? pfColor;
178
+ const pfColor = particle.getFillColor(), psColor = particle.getStrokeColor();
245
179
  let [fColor, sColor] = this._getPluginParticleColors(particle);
246
180
  fColor ??= pfColor;
247
181
  sColor ??= psColor;
248
182
  if (!fColor && !sColor) {
249
183
  return;
250
184
  }
251
- const container = this.container, zIndexOptions = particle.options.zIndex, zIndexFactor = Constants_js_1.zIndexFactorOffset - particle.zIndexFactor, { opacity, strokeOpacity } = particle.getOpacity(), transform = this._reusableTransform, colorStyles = this._reusableColorStyles, fill = fColor ? (0, ColorUtils_js_1.getStyleFromHsl)(fColor, container.hdr, opacity) : undefined, stroke = sColor ? (0, ColorUtils_js_1.getStyleFromHsl)(sColor, container.hdr, strokeOpacity) : fill;
185
+ const container = this.container, zIndexOptions = particle.options.zIndex, zIndexFactor = Constants_js_1.zIndexFactorOffset - particle.zIndexFactor, { fillOpacity, opacity, strokeOpacity } = particle.getOpacity(), transform = this._reusableTransform, colorStyles = this._reusableColorStyles, fill = fColor ? (0, ColorUtils_js_1.getStyleFromHsl)(fColor, container.hdr, fillOpacity * opacity) : undefined, stroke = sColor ? (0, ColorUtils_js_1.getStyleFromHsl)(sColor, container.hdr, strokeOpacity * opacity) : fill;
252
186
  transform.a = transform.b = transform.c = transform.d = undefined;
253
187
  colorStyles.fill = fill;
254
188
  colorStyles.stroke = stroke;
255
189
  this.draw((context) => {
190
+ for (const plugin of this._drawParticlesSetupPlugins) {
191
+ plugin.drawParticleSetup?.(context, particle, delta);
192
+ }
256
193
  this._applyPreDrawUpdaters(context, particle, radius, opacity, colorStyles, transform);
257
194
  (0, CanvasUtils_js_1.drawParticle)({
258
195
  container,
@@ -264,32 +201,48 @@
264
201
  opacity: opacity,
265
202
  transform,
266
203
  });
204
+ this._applyPostDrawUpdaters(particle);
205
+ for (const plugin of this._drawParticlesCleanupPlugins) {
206
+ plugin.drawParticleCleanup?.(context, particle, delta);
207
+ }
267
208
  });
268
- this._applyPostDrawUpdaters(particle);
269
209
  }
270
- drawParticlePlugin(plugin, particle, delta) {
210
+ drawParticlePlugins(particle, delta) {
271
211
  this.draw(ctx => {
272
- (0, CanvasUtils_js_1.drawParticlePlugin)(ctx, plugin, particle, delta);
212
+ for (const plugin of this._drawParticlePlugins) {
213
+ (0, CanvasUtils_js_1.drawParticlePlugin)(ctx, plugin, particle, delta);
214
+ }
273
215
  });
274
216
  }
275
217
  drawParticles(delta) {
276
- const { particles, plugins } = this.container;
218
+ const { particles } = this.container;
277
219
  this.clear();
278
220
  particles.update(delta);
279
- for (const plugin of plugins.values()) {
280
- this.drawPlugin(plugin, delta);
281
- }
282
- this.draw(() => {
221
+ this.draw(ctx => {
222
+ for (const plugin of this._drawSettingsSetupPlugins) {
223
+ plugin.drawSettingsSetup?.(ctx, delta);
224
+ }
225
+ for (const plugin of this._drawPlugins) {
226
+ plugin.draw?.(ctx, delta);
227
+ }
283
228
  particles.drawParticles(delta);
229
+ for (const plugin of this._clearDrawPlugins) {
230
+ plugin.clearDraw?.(ctx, delta);
231
+ }
232
+ for (const plugin of this._drawSettingsCleanupPlugins) {
233
+ plugin.drawSettingsCleanup?.(ctx, delta);
234
+ }
284
235
  });
285
- for (const plugin of plugins.values()) {
286
- this.clearDrawPlugin(plugin, delta);
287
- }
288
236
  }
289
- drawPlugin(plugin, delta) {
290
- this.draw(ctx => {
291
- (0, CanvasUtils_js_1.drawPlugin)(ctx, plugin, delta);
292
- });
237
+ getZoomCenter() {
238
+ const pxRatio = this.container.retina.pixelRatio, { width, height } = this.size;
239
+ if (this._zoomCenter) {
240
+ return this._zoomCenter;
241
+ }
242
+ return {
243
+ x: (width * Constants_js_1.half) / pxRatio,
244
+ y: (height * Constants_js_1.half) / pxRatio,
245
+ };
293
246
  }
294
247
  init() {
295
248
  this._safeMutationObserver(obs => {
@@ -334,6 +287,16 @@
334
287
  }
335
288
  initPlugins() {
336
289
  this._resizePlugins = [];
290
+ this._colorPlugins = [];
291
+ this._canvasClearPlugins = [];
292
+ this._canvasPaintPlugins = [];
293
+ this._clearDrawPlugins = [];
294
+ this._drawParticlePlugins = [];
295
+ this._drawParticlesSetupPlugins = [];
296
+ this._drawParticlesCleanupPlugins = [];
297
+ this._drawPlugins = [];
298
+ this._drawSettingsSetupPlugins = [];
299
+ this._drawSettingsCleanupPlugins = [];
337
300
  for (const plugin of this.container.plugins) {
338
301
  if (plugin.resize) {
339
302
  this._resizePlugins.push(plugin);
@@ -341,6 +304,33 @@
341
304
  if (plugin.particleFillColor ?? plugin.particleStrokeColor) {
342
305
  this._colorPlugins.push(plugin);
343
306
  }
307
+ if (plugin.canvasClear) {
308
+ this._canvasClearPlugins.push(plugin);
309
+ }
310
+ if (plugin.canvasPaint) {
311
+ this._canvasPaintPlugins.push(plugin);
312
+ }
313
+ if (plugin.drawParticle) {
314
+ this._drawParticlePlugins.push(plugin);
315
+ }
316
+ if (plugin.drawParticleSetup) {
317
+ this._drawParticlesSetupPlugins.push(plugin);
318
+ }
319
+ if (plugin.drawParticleCleanup) {
320
+ this._drawParticlesCleanupPlugins.push(plugin);
321
+ }
322
+ if (plugin.draw) {
323
+ this._drawPlugins.push(plugin);
324
+ }
325
+ if (plugin.drawSettingsSetup) {
326
+ this._drawSettingsSetupPlugins.push(plugin);
327
+ }
328
+ if (plugin.drawSettingsCleanup) {
329
+ this._drawSettingsCleanupPlugins.push(plugin);
330
+ }
331
+ if (plugin.clearDraw) {
332
+ this._clearDrawPlugins.push(plugin);
333
+ }
344
334
  }
345
335
  }
346
336
  initUpdaters() {
@@ -372,12 +362,16 @@
372
362
  canvas.height = retinaSize.height = standardSize.height * pxRatio;
373
363
  canvas.width = retinaSize.width = standardSize.width * pxRatio;
374
364
  const canSupportHdrQuery = (0, Utils_js_1.safeMatchMedia)("(color-gamut: p3)");
375
- this._context = this.element.getContext("2d", {
365
+ this._canvasSettings = {
376
366
  alpha: true,
377
367
  colorSpace: canSupportHdrQuery?.matches && container.hdr ? "display-p3" : "srgb",
378
368
  desynchronized: true,
379
369
  willReadFrequently: false,
380
- });
370
+ };
371
+ this._context = this.element.getContext("2d", this._canvasSettings);
372
+ if (this._context) {
373
+ this._context.globalCompositeOperation = Constants_js_1.defaultCompositeValue;
374
+ }
381
375
  this._safeMutationObserver(obs => {
382
376
  obs.disconnect();
383
377
  });
@@ -392,11 +386,11 @@
392
386
  }
393
387
  paint() {
394
388
  let handled = false;
395
- for (const plugin of this.container.plugins) {
389
+ for (const plugin of this._canvasPaintPlugins) {
390
+ handled = plugin.canvasPaint?.() ?? false;
396
391
  if (handled) {
397
392
  break;
398
393
  }
399
- handled = plugin.canvasPaint?.() ?? false;
400
394
  }
401
395
  if (handled) {
402
396
  return;
@@ -452,6 +446,10 @@
452
446
  this._pointerEvents = type;
453
447
  this._repairStyle();
454
448
  }
449
+ setZoom(zoomLevel, center) {
450
+ this.zoom = zoomLevel;
451
+ this._zoomCenter = center;
452
+ }
455
453
  stop() {
456
454
  this._safeMutationObserver(obs => {
457
455
  obs.disconnect();
@@ -472,6 +470,115 @@
472
470
  await container.refresh();
473
471
  }
474
472
  }
473
+ _applyPostDrawUpdaters = particle => {
474
+ for (const updater of this._postDrawUpdaters) {
475
+ updater.afterDraw?.(particle);
476
+ }
477
+ };
478
+ _applyPreDrawUpdaters = (ctx, particle, radius, zOpacity, colorStyles, transform) => {
479
+ for (const updater of this._preDrawUpdaters) {
480
+ if (updater.getColorStyles) {
481
+ const { fill, stroke } = updater.getColorStyles(particle, ctx, radius, zOpacity);
482
+ if (fill) {
483
+ colorStyles.fill = fill;
484
+ }
485
+ if (stroke) {
486
+ colorStyles.stroke = stroke;
487
+ }
488
+ }
489
+ if (updater.getTransformValues) {
490
+ const updaterTransform = updater.getTransformValues(particle);
491
+ for (const key in updaterTransform) {
492
+ setTransformValue(transform, updaterTransform, key);
493
+ }
494
+ }
495
+ updater.beforeDraw?.(particle);
496
+ }
497
+ };
498
+ _applyResizePlugins = () => {
499
+ for (const plugin of this._resizePlugins) {
500
+ plugin.resize?.();
501
+ }
502
+ };
503
+ _getPluginParticleColors = particle => {
504
+ let fColor, sColor;
505
+ for (const plugin of this._colorPlugins) {
506
+ if (!fColor && plugin.particleFillColor) {
507
+ fColor = (0, ColorUtils_js_1.rangeColorToHsl)(this._engine, plugin.particleFillColor(particle));
508
+ }
509
+ if (!sColor && plugin.particleStrokeColor) {
510
+ sColor = (0, ColorUtils_js_1.rangeColorToHsl)(this._engine, plugin.particleStrokeColor(particle));
511
+ }
512
+ if (fColor && sColor) {
513
+ break;
514
+ }
515
+ }
516
+ this._reusablePluginColors[fColorIndex] = fColor;
517
+ this._reusablePluginColors[sColorIndex] = sColor;
518
+ return this._reusablePluginColors;
519
+ };
520
+ _initStyle = () => {
521
+ const element = this.element, options = this.container.actualOptions;
522
+ if (!element) {
523
+ return;
524
+ }
525
+ if (this._fullScreen) {
526
+ this._setFullScreenStyle();
527
+ }
528
+ else {
529
+ this._resetOriginalStyle();
530
+ }
531
+ for (const key in options.style) {
532
+ if (!key || !(key in options.style)) {
533
+ continue;
534
+ }
535
+ const value = options.style[key];
536
+ if (!value) {
537
+ continue;
538
+ }
539
+ element.style.setProperty(key, value, "important");
540
+ }
541
+ };
542
+ _repairStyle = () => {
543
+ const element = this.element;
544
+ if (!element) {
545
+ return;
546
+ }
547
+ this._safeMutationObserver(observer => {
548
+ observer.disconnect();
549
+ });
550
+ this._initStyle();
551
+ this.initBackground();
552
+ const pointerEvents = this._pointerEvents;
553
+ element.style.pointerEvents = pointerEvents;
554
+ element.setAttribute("pointer-events", pointerEvents);
555
+ this._safeMutationObserver(observer => {
556
+ if (!(element instanceof Node)) {
557
+ return;
558
+ }
559
+ observer.observe(element, { attributes: true });
560
+ });
561
+ };
562
+ _resetOriginalStyle = () => {
563
+ const element = this.element, originalStyle = this._originalStyle;
564
+ if (!element || !originalStyle) {
565
+ return;
566
+ }
567
+ setStyle(element, originalStyle, true);
568
+ };
569
+ _safeMutationObserver = callback => {
570
+ if (!this._mutationObserver) {
571
+ return;
572
+ }
573
+ callback(this._mutationObserver);
574
+ };
575
+ _setFullScreenStyle = () => {
576
+ const element = this.element;
577
+ if (!element) {
578
+ return;
579
+ }
580
+ setStyle(element, (0, Utils_js_1.getFullScreenStyle)(this.container.actualOptions.fullScreen.zIndex), true);
581
+ };
475
582
  }
476
583
  exports.Canvas = Canvas;
477
584
  });