@tsparticles/engine 4.0.0-alpha.8 → 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 (274) hide show
  1. package/164.min.js +1 -0
  2. package/README.md +41 -7
  3. package/browser/Core/Canvas.js +238 -137
  4. package/browser/Core/Container.js +80 -74
  5. package/browser/Core/Engine.js +43 -64
  6. package/browser/Core/Particle.js +182 -169
  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/Options/Classes/AnimatableColor.js +1 -0
  15. package/browser/Options/Classes/AnimationOptions.js +8 -0
  16. package/browser/Options/Classes/Background/Background.js +6 -0
  17. package/browser/Options/Classes/ColorAnimation.js +12 -1
  18. package/browser/Options/Classes/FullScreen/FullScreen.js +2 -0
  19. package/browser/Options/Classes/HslAnimation.js +4 -5
  20. package/browser/Options/Classes/Options.js +63 -4
  21. package/browser/Options/Classes/OptionsColor.js +1 -0
  22. package/browser/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  23. package/browser/Options/Classes/Particles/Effect/Effect.js +3 -4
  24. package/browser/Options/Classes/Particles/Fill.js +28 -0
  25. package/browser/Options/Classes/Particles/Move/Move.js +17 -3
  26. package/browser/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  27. package/browser/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  28. package/browser/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  29. package/browser/Options/Classes/Particles/Move/OutModes.js +5 -0
  30. package/browser/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  31. package/browser/Options/Classes/Particles/Move/Spin.js +3 -0
  32. package/browser/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  33. package/browser/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  34. package/browser/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  35. package/browser/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  36. package/browser/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  37. package/browser/Options/Classes/Particles/ParticlesOptions.js +25 -5
  38. package/browser/Options/Classes/Particles/Shape/Shape.js +3 -4
  39. package/browser/Options/Classes/Particles/Size/Size.js +1 -0
  40. package/browser/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  41. package/browser/Options/Classes/Particles/Stroke.js +3 -0
  42. package/browser/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  43. package/browser/Options/Classes/ResizeEvent.js +2 -0
  44. package/browser/Options/Classes/ValueWithRandom.js +3 -4
  45. package/browser/Utils/CanvasUtils.js +44 -51
  46. package/browser/Utils/ColorUtils.js +30 -19
  47. package/browser/Utils/EventDispatcher.js +1 -0
  48. package/browser/Utils/MathUtils.js +12 -7
  49. package/browser/Utils/Utils.js +109 -31
  50. package/browser/exports.js +1 -2
  51. package/cjs/Core/Canvas.js +238 -137
  52. package/cjs/Core/Container.js +80 -74
  53. package/cjs/Core/Engine.js +43 -64
  54. package/cjs/Core/Particle.js +182 -169
  55. package/cjs/Core/Particles.js +187 -138
  56. package/cjs/Core/Retina.js +5 -0
  57. package/cjs/Core/Utils/Constants.js +2 -2
  58. package/cjs/Core/Utils/EventListeners.js +67 -63
  59. package/cjs/Core/Utils/Ranges.js +29 -10
  60. package/cjs/Core/Utils/SpatialHashGrid.js +102 -0
  61. package/cjs/Core/Utils/Vectors.js +17 -18
  62. package/cjs/Options/Classes/AnimatableColor.js +1 -0
  63. package/cjs/Options/Classes/AnimationOptions.js +8 -0
  64. package/cjs/Options/Classes/Background/Background.js +6 -0
  65. package/cjs/Options/Classes/ColorAnimation.js +12 -1
  66. package/cjs/Options/Classes/FullScreen/FullScreen.js +2 -0
  67. package/cjs/Options/Classes/HslAnimation.js +4 -5
  68. package/cjs/Options/Classes/Options.js +63 -4
  69. package/cjs/Options/Classes/OptionsColor.js +1 -0
  70. package/cjs/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  71. package/cjs/Options/Classes/Particles/Effect/Effect.js +3 -4
  72. package/cjs/Options/Classes/Particles/Fill.js +28 -0
  73. package/cjs/Options/Classes/Particles/Move/Move.js +17 -3
  74. package/cjs/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  75. package/cjs/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  76. package/cjs/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  77. package/cjs/Options/Classes/Particles/Move/OutModes.js +5 -0
  78. package/cjs/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  79. package/cjs/Options/Classes/Particles/Move/Spin.js +3 -0
  80. package/cjs/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  81. package/cjs/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  82. package/cjs/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  83. package/cjs/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  84. package/cjs/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  85. package/cjs/Options/Classes/Particles/ParticlesOptions.js +25 -5
  86. package/cjs/Options/Classes/Particles/Shape/Shape.js +3 -4
  87. package/cjs/Options/Classes/Particles/Size/Size.js +1 -0
  88. package/cjs/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  89. package/cjs/Options/Classes/Particles/Stroke.js +3 -0
  90. package/cjs/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  91. package/cjs/Options/Classes/ResizeEvent.js +2 -0
  92. package/cjs/Options/Classes/ValueWithRandom.js +3 -4
  93. package/cjs/Utils/CanvasUtils.js +44 -51
  94. package/cjs/Utils/ColorUtils.js +30 -19
  95. package/cjs/Utils/EventDispatcher.js +1 -0
  96. package/cjs/Utils/MathUtils.js +12 -7
  97. package/cjs/Utils/Utils.js +109 -31
  98. package/cjs/exports.js +1 -2
  99. package/dist_browser_Core_Container_js.js +12 -12
  100. package/esm/Core/Canvas.js +238 -137
  101. package/esm/Core/Container.js +80 -74
  102. package/esm/Core/Engine.js +43 -64
  103. package/esm/Core/Particle.js +182 -169
  104. package/esm/Core/Particles.js +187 -138
  105. package/esm/Core/Retina.js +5 -0
  106. package/esm/Core/Utils/Constants.js +2 -2
  107. package/esm/Core/Utils/EventListeners.js +67 -63
  108. package/esm/Core/Utils/Ranges.js +29 -10
  109. package/esm/Core/Utils/SpatialHashGrid.js +102 -0
  110. package/esm/Core/Utils/Vectors.js +17 -18
  111. package/esm/Options/Classes/AnimatableColor.js +1 -0
  112. package/esm/Options/Classes/AnimationOptions.js +8 -0
  113. package/esm/Options/Classes/Background/Background.js +6 -0
  114. package/esm/Options/Classes/ColorAnimation.js +12 -1
  115. package/esm/Options/Classes/FullScreen/FullScreen.js +2 -0
  116. package/esm/Options/Classes/HslAnimation.js +4 -5
  117. package/esm/Options/Classes/Options.js +63 -4
  118. package/esm/Options/Classes/OptionsColor.js +1 -0
  119. package/esm/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  120. package/esm/Options/Classes/Particles/Effect/Effect.js +3 -4
  121. package/esm/Options/Classes/Particles/Fill.js +28 -0
  122. package/esm/Options/Classes/Particles/Move/Move.js +17 -3
  123. package/esm/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  124. package/esm/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  125. package/esm/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  126. package/esm/Options/Classes/Particles/Move/OutModes.js +5 -0
  127. package/esm/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  128. package/esm/Options/Classes/Particles/Move/Spin.js +3 -0
  129. package/esm/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  130. package/esm/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  131. package/esm/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  132. package/esm/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  133. package/esm/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  134. package/esm/Options/Classes/Particles/ParticlesOptions.js +25 -5
  135. package/esm/Options/Classes/Particles/Shape/Shape.js +3 -4
  136. package/esm/Options/Classes/Particles/Size/Size.js +1 -0
  137. package/esm/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  138. package/esm/Options/Classes/Particles/Stroke.js +3 -0
  139. package/esm/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  140. package/esm/Options/Classes/ResizeEvent.js +2 -0
  141. package/esm/Options/Classes/ValueWithRandom.js +3 -4
  142. package/esm/Utils/CanvasUtils.js +44 -51
  143. package/esm/Utils/ColorUtils.js +30 -19
  144. package/esm/Utils/EventDispatcher.js +1 -0
  145. package/esm/Utils/MathUtils.js +12 -7
  146. package/esm/Utils/Utils.js +109 -31
  147. package/esm/exports.js +1 -2
  148. package/package.json +1 -1
  149. package/report.html +1 -1
  150. package/scripts/install.js +4 -20
  151. package/tsparticles.engine.js +93 -91
  152. package/tsparticles.engine.min.js +2 -2
  153. package/types/Core/Canvas.d.ts +17 -2
  154. package/types/Core/Container.d.ts +3 -7
  155. package/types/Core/Engine.d.ts +13 -20
  156. package/types/Core/Interfaces/IColorManager.d.ts +0 -1
  157. package/types/Core/Interfaces/IContainerPlugin.d.ts +2 -1
  158. package/types/Core/Interfaces/IPalette.d.ts +7 -0
  159. package/types/Core/Interfaces/IParticleOpacityData.d.ts +1 -0
  160. package/types/Core/Interfaces/IParticleValueAnimation.d.ts +3 -3
  161. package/types/Core/Interfaces/IShapeDrawData.d.ts +8 -0
  162. package/types/Core/Interfaces/IShapeDrawer.d.ts +0 -1
  163. package/types/Core/Interfaces/IShapeValues.d.ts +0 -1
  164. package/types/Core/Particle.d.ts +3 -7
  165. package/types/Core/Particles.d.ts +15 -7
  166. package/types/Core/Utils/Constants.d.ts +2 -2
  167. package/types/Core/Utils/Ranges.d.ts +4 -1
  168. package/types/Core/Utils/SpatialHashGrid.d.ts +25 -0
  169. package/types/Core/Utils/Vectors.d.ts +8 -10
  170. package/types/Options/Classes/ColorAnimation.d.ts +3 -1
  171. package/types/Options/Classes/HslAnimation.d.ts +3 -4
  172. package/types/Options/Classes/Options.d.ts +2 -0
  173. package/types/Options/Classes/Particles/Effect/Effect.d.ts +0 -1
  174. package/types/Options/Classes/Particles/Fill.d.ts +12 -0
  175. package/types/Options/Classes/Particles/Move/Move.d.ts +0 -2
  176. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +2 -2
  177. package/types/Options/Classes/Particles/Shape/Shape.d.ts +0 -1
  178. package/types/Options/Classes/ValueWithRandom.d.ts +0 -1
  179. package/types/Options/Interfaces/IColorAnimation.d.ts +2 -0
  180. package/types/Options/Interfaces/IOptions.d.ts +1 -0
  181. package/types/Options/Interfaces/Particles/Effect/IEffect.d.ts +0 -1
  182. package/types/Options/Interfaces/Particles/IFill.d.ts +9 -0
  183. package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +2 -2
  184. package/types/Options/Interfaces/Particles/IStroke.d.ts +2 -2
  185. package/types/Options/Interfaces/Particles/Move/IMove.d.ts +0 -2
  186. package/types/Options/Interfaces/Particles/Shape/IShape.d.ts +0 -1
  187. package/types/Types/EngineInitializers.d.ts +6 -3
  188. package/types/Utils/CanvasUtils.d.ts +6 -12
  189. package/types/Utils/ColorUtils.d.ts +3 -2
  190. package/types/Utils/MathUtils.d.ts +2 -0
  191. package/types/Utils/Utils.d.ts +8 -1
  192. package/types/export-types.d.ts +3 -5
  193. package/types/exports.d.ts +1 -2
  194. package/umd/Core/Canvas.js +237 -136
  195. package/umd/Core/Container.js +80 -74
  196. package/umd/Core/Engine.js +42 -63
  197. package/umd/Core/Particle.js +183 -170
  198. package/umd/Core/Particles.js +187 -138
  199. package/umd/Core/Retina.js +5 -0
  200. package/umd/Core/Utils/Constants.js +3 -3
  201. package/umd/Core/Utils/EventListeners.js +67 -63
  202. package/umd/Core/Utils/Ranges.js +28 -9
  203. package/umd/Core/Utils/SpatialHashGrid.js +116 -0
  204. package/umd/Core/Utils/Vectors.js +17 -18
  205. package/umd/Options/Classes/AnimatableColor.js +1 -0
  206. package/umd/Options/Classes/AnimationOptions.js +8 -0
  207. package/umd/Options/Classes/Background/Background.js +6 -0
  208. package/umd/Options/Classes/ColorAnimation.js +12 -1
  209. package/umd/Options/Classes/FullScreen/FullScreen.js +2 -0
  210. package/umd/Options/Classes/HslAnimation.js +5 -6
  211. package/umd/Options/Classes/Options.js +63 -4
  212. package/umd/Options/Classes/OptionsColor.js +1 -0
  213. package/umd/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  214. package/umd/Options/Classes/Particles/Effect/Effect.js +3 -4
  215. package/umd/Options/Classes/Particles/Fill.js +42 -0
  216. package/umd/Options/Classes/Particles/Move/Move.js +18 -4
  217. package/umd/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  218. package/umd/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  219. package/umd/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  220. package/umd/Options/Classes/Particles/Move/OutModes.js +5 -0
  221. package/umd/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  222. package/umd/Options/Classes/Particles/Move/Spin.js +3 -0
  223. package/umd/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  224. package/umd/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  225. package/umd/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  226. package/umd/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  227. package/umd/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  228. package/umd/Options/Classes/Particles/ParticlesOptions.js +26 -6
  229. package/umd/Options/Classes/Particles/Shape/Shape.js +3 -4
  230. package/umd/Options/Classes/Particles/Size/Size.js +1 -0
  231. package/umd/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  232. package/umd/Options/Classes/Particles/Stroke.js +3 -0
  233. package/umd/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  234. package/umd/Options/Classes/ResizeEvent.js +2 -0
  235. package/umd/Options/Classes/ValueWithRandom.js +3 -4
  236. package/umd/Utils/CanvasUtils.js +44 -53
  237. package/umd/Utils/ColorUtils.js +30 -18
  238. package/umd/Utils/EventDispatcher.js +1 -0
  239. package/umd/Utils/MathUtils.js +14 -7
  240. package/umd/Utils/Utils.js +111 -32
  241. package/umd/exports.js +2 -3
  242. package/794.min.js +0 -2
  243. package/794.min.js.LICENSE.txt +0 -1
  244. package/browser/Core/Utils/Point.js +0 -6
  245. package/browser/Core/Utils/QuadTree.js +0 -59
  246. package/browser/Options/Classes/Particles/Move/MoveAttract.js +0 -33
  247. package/cjs/Core/Utils/Point.js +0 -6
  248. package/cjs/Core/Utils/QuadTree.js +0 -59
  249. package/cjs/Options/Classes/Particles/Move/MoveAttract.js +0 -33
  250. package/esm/Core/Interfaces/IMovePathGenerator.js +0 -1
  251. package/esm/Core/Interfaces/IParticleMover.js +0 -1
  252. package/esm/Core/Utils/Point.js +0 -6
  253. package/esm/Core/Utils/QuadTree.js +0 -59
  254. package/esm/Options/Classes/Particles/Move/MoveAttract.js +0 -33
  255. package/esm/Options/Interfaces/Particles/Move/IMoveAttract.js +0 -1
  256. package/tsparticles.engine.min.js.LICENSE.txt +0 -1
  257. package/types/Core/Interfaces/IMovePathGenerator.d.ts +0 -10
  258. package/types/Core/Interfaces/IParticleMover.d.ts +0 -7
  259. package/types/Core/Utils/Point.d.ts +0 -7
  260. package/types/Core/Utils/QuadTree.d.ts +0 -18
  261. package/types/Options/Classes/Particles/Move/MoveAttract.d.ts +0 -12
  262. package/types/Options/Interfaces/Particles/Move/IMoveAttract.d.ts +0 -7
  263. package/umd/Core/Utils/Point.js +0 -20
  264. package/umd/Core/Utils/QuadTree.js +0 -73
  265. package/umd/Options/Classes/Particles/Move/MoveAttract.js +0 -47
  266. package/umd/Options/Interfaces/Particles/Move/IMoveAttract.js +0 -12
  267. /package/browser/Core/Interfaces/{IMovePathGenerator.js → IPalette.js} +0 -0
  268. /package/browser/{Core/Interfaces/IParticleMover.js → Options/Interfaces/Particles/IFill.js} +0 -0
  269. /package/{browser/Options/Interfaces/Particles/Move/IMoveAttract.js → cjs/Core/Interfaces/IPalette.js} +0 -0
  270. /package/cjs/{Core/Interfaces/IMovePathGenerator.js → Options/Interfaces/Particles/IFill.js} +0 -0
  271. /package/{cjs/Core/Interfaces/IParticleMover.js → esm/Core/Interfaces/IPalette.js} +0 -0
  272. /package/{cjs/Options/Interfaces/Particles/Move/IMoveAttract.js → esm/Options/Interfaces/Particles/IFill.js} +0 -0
  273. /package/umd/Core/Interfaces/{IMovePathGenerator.js → IPalette.js} +0 -0
  274. /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) {
@@ -220,6 +150,15 @@
220
150
  this._postDrawUpdaters = [];
221
151
  this._resizePlugins = [];
222
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 = [];
223
162
  }
224
163
  draw(cb) {
225
164
  const ctx = this._context;
@@ -236,22 +175,20 @@
236
175
  if (radius <= Constants_js_1.minimumSize) {
237
176
  return;
238
177
  }
239
- const pfColor = particle.getFillColor(), psColor = particle.getStrokeColor() ?? pfColor;
178
+ const pfColor = particle.getFillColor(), psColor = particle.getStrokeColor();
240
179
  let [fColor, sColor] = this._getPluginParticleColors(particle);
241
180
  fColor ??= pfColor;
242
181
  sColor ??= psColor;
243
182
  if (!fColor && !sColor) {
244
183
  return;
245
184
  }
246
- 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;
247
186
  transform.a = transform.b = transform.c = transform.d = undefined;
248
187
  colorStyles.fill = fill;
249
188
  colorStyles.stroke = stroke;
250
189
  this.draw((context) => {
251
- for (const plugin of container.plugins) {
252
- if (plugin.drawParticleSetup) {
253
- plugin.drawParticleSetup(context, particle, delta);
254
- }
190
+ for (const plugin of this._drawParticlesSetupPlugins) {
191
+ plugin.drawParticleSetup?.(context, particle, delta);
255
192
  }
256
193
  this._applyPreDrawUpdaters(context, particle, radius, opacity, colorStyles, transform);
257
194
  (0, CanvasUtils_js_1.drawParticle)({
@@ -265,38 +202,48 @@
265
202
  transform,
266
203
  });
267
204
  this._applyPostDrawUpdaters(particle);
268
- for (const plugin of container.plugins) {
269
- if (plugin.drawParticleCleanup) {
270
- plugin.drawParticleCleanup(context, particle, delta);
271
- }
205
+ for (const plugin of this._drawParticlesCleanupPlugins) {
206
+ plugin.drawParticleCleanup?.(context, particle, delta);
272
207
  }
273
208
  });
274
209
  }
275
- drawParticlePlugin(plugin, particle, delta) {
210
+ drawParticlePlugins(particle, delta) {
276
211
  this.draw(ctx => {
277
- (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
+ }
278
215
  });
279
216
  }
280
217
  drawParticles(delta) {
281
- const { particles, plugins } = this.container;
218
+ const { particles } = this.container;
282
219
  this.clear();
283
220
  particles.update(delta);
284
221
  this.draw(ctx => {
285
- for (const plugin of plugins) {
222
+ for (const plugin of this._drawSettingsSetupPlugins) {
286
223
  plugin.drawSettingsSetup?.(ctx, delta);
287
224
  }
288
- for (const plugin of plugins) {
225
+ for (const plugin of this._drawPlugins) {
289
226
  plugin.draw?.(ctx, delta);
290
227
  }
291
228
  particles.drawParticles(delta);
292
- for (const plugin of plugins) {
229
+ for (const plugin of this._clearDrawPlugins) {
293
230
  plugin.clearDraw?.(ctx, delta);
294
231
  }
295
- for (const plugin of plugins) {
232
+ for (const plugin of this._drawSettingsCleanupPlugins) {
296
233
  plugin.drawSettingsCleanup?.(ctx, delta);
297
234
  }
298
235
  });
299
236
  }
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
+ };
246
+ }
300
247
  init() {
301
248
  this._safeMutationObserver(obs => {
302
249
  obs.disconnect();
@@ -340,6 +287,16 @@
340
287
  }
341
288
  initPlugins() {
342
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 = [];
343
300
  for (const plugin of this.container.plugins) {
344
301
  if (plugin.resize) {
345
302
  this._resizePlugins.push(plugin);
@@ -347,6 +304,33 @@
347
304
  if (plugin.particleFillColor ?? plugin.particleStrokeColor) {
348
305
  this._colorPlugins.push(plugin);
349
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
+ }
350
334
  }
351
335
  }
352
336
  initUpdaters() {
@@ -378,12 +362,16 @@
378
362
  canvas.height = retinaSize.height = standardSize.height * pxRatio;
379
363
  canvas.width = retinaSize.width = standardSize.width * pxRatio;
380
364
  const canSupportHdrQuery = (0, Utils_js_1.safeMatchMedia)("(color-gamut: p3)");
381
- this._context = this.element.getContext("2d", {
365
+ this._canvasSettings = {
382
366
  alpha: true,
383
367
  colorSpace: canSupportHdrQuery?.matches && container.hdr ? "display-p3" : "srgb",
384
368
  desynchronized: true,
385
369
  willReadFrequently: false,
386
- });
370
+ };
371
+ this._context = this.element.getContext("2d", this._canvasSettings);
372
+ if (this._context) {
373
+ this._context.globalCompositeOperation = Constants_js_1.defaultCompositeValue;
374
+ }
387
375
  this._safeMutationObserver(obs => {
388
376
  obs.disconnect();
389
377
  });
@@ -398,11 +386,11 @@
398
386
  }
399
387
  paint() {
400
388
  let handled = false;
401
- for (const plugin of this.container.plugins) {
389
+ for (const plugin of this._canvasPaintPlugins) {
390
+ handled = plugin.canvasPaint?.() ?? false;
402
391
  if (handled) {
403
392
  break;
404
393
  }
405
- handled = plugin.canvasPaint?.() ?? false;
406
394
  }
407
395
  if (handled) {
408
396
  return;
@@ -458,6 +446,10 @@
458
446
  this._pointerEvents = type;
459
447
  this._repairStyle();
460
448
  }
449
+ setZoom(zoomLevel, center) {
450
+ this.zoom = zoomLevel;
451
+ this._zoomCenter = center;
452
+ }
461
453
  stop() {
462
454
  this._safeMutationObserver(obs => {
463
455
  obs.disconnect();
@@ -478,6 +470,115 @@
478
470
  await container.refresh();
479
471
  }
480
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
+ };
481
582
  }
482
583
  exports.Canvas = Canvas;
483
584
  });