@tsparticles/engine 4.0.0-beta.0 → 4.0.0-beta.10

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 (242) hide show
  1. package/67.min.js +1 -0
  2. package/README.md +53 -965
  3. package/browser/Core/CanvasManager.js +303 -0
  4. package/browser/Core/Container.js +61 -34
  5. package/browser/Core/Engine.js +26 -138
  6. package/browser/Core/Particle.js +29 -28
  7. package/{cjs/Core/Particles.js → browser/Core/ParticlesManager.js} +27 -57
  8. package/browser/Core/RenderManager.js +303 -0
  9. package/browser/Core/Retina.js +3 -8
  10. package/browser/Core/Utils/PluginManager.js +145 -0
  11. package/browser/Options/Classes/Options.js +8 -21
  12. package/browser/Options/Classes/Particles/Paint.js +20 -0
  13. package/browser/Options/Classes/Particles/ParticlesOptions.js +65 -27
  14. package/browser/Options/Interfaces/Particles/IPaint.js +1 -0
  15. package/browser/Types/CanvasContextType.js +1 -0
  16. package/browser/Utils/CanvasUtils.js +4 -4
  17. package/browser/Utils/ColorUtils.js +21 -21
  18. package/browser/Utils/LogUtils.js +1 -0
  19. package/browser/Utils/OptionsUtils.js +2 -2
  20. package/browser/Utils/Utils.js +16 -10
  21. package/browser/exports.js +1 -0
  22. package/cjs/Core/CanvasManager.js +303 -0
  23. package/cjs/Core/Container.js +61 -34
  24. package/cjs/Core/Engine.js +26 -138
  25. package/cjs/Core/Particle.js +29 -28
  26. package/{esm/Core/Particles.js → cjs/Core/ParticlesManager.js} +27 -57
  27. package/cjs/Core/RenderManager.js +303 -0
  28. package/cjs/Core/Retina.js +3 -8
  29. package/cjs/Core/Utils/PluginManager.js +145 -0
  30. package/cjs/Options/Classes/Options.js +8 -21
  31. package/cjs/Options/Classes/Particles/Paint.js +20 -0
  32. package/cjs/Options/Classes/Particles/ParticlesOptions.js +65 -27
  33. package/cjs/Options/Interfaces/Particles/IPaint.js +1 -0
  34. package/cjs/Types/CanvasContextType.js +1 -0
  35. package/cjs/Utils/CanvasUtils.js +4 -4
  36. package/cjs/Utils/ColorUtils.js +21 -21
  37. package/cjs/Utils/LogUtils.js +1 -0
  38. package/cjs/Utils/OptionsUtils.js +2 -2
  39. package/cjs/Utils/Utils.js +16 -10
  40. package/cjs/exports.js +1 -0
  41. package/dist_browser_Core_Container_js.js +24 -14
  42. package/esm/Core/CanvasManager.js +303 -0
  43. package/esm/Core/Container.js +61 -34
  44. package/esm/Core/Engine.js +26 -138
  45. package/esm/Core/Particle.js +29 -28
  46. package/{browser/Core/Particles.js → esm/Core/ParticlesManager.js} +27 -57
  47. package/esm/Core/RenderManager.js +303 -0
  48. package/esm/Core/Retina.js +3 -8
  49. package/esm/Core/Utils/PluginManager.js +145 -0
  50. package/esm/Options/Classes/Options.js +8 -21
  51. package/esm/Options/Classes/Particles/Paint.js +20 -0
  52. package/esm/Options/Classes/Particles/ParticlesOptions.js +65 -27
  53. package/esm/Options/Interfaces/Particles/IPaint.js +1 -0
  54. package/esm/Types/CanvasContextType.js +1 -0
  55. package/esm/Utils/CanvasUtils.js +4 -4
  56. package/esm/Utils/ColorUtils.js +21 -21
  57. package/esm/Utils/LogUtils.js +1 -0
  58. package/esm/Utils/OptionsUtils.js +2 -2
  59. package/esm/Utils/Utils.js +16 -10
  60. package/esm/exports.js +1 -0
  61. package/package.json +2 -3
  62. package/report.html +84 -29
  63. package/tsparticles.engine.js +31 -11
  64. package/tsparticles.engine.min.js +2 -2
  65. package/types/Core/CanvasManager.d.ts +39 -0
  66. package/types/Core/Container.d.ts +26 -7
  67. package/types/Core/Engine.d.ts +2 -54
  68. package/types/Core/Interfaces/IContainerPlugin.d.ts +8 -7
  69. package/types/Core/Interfaces/IDrawParticleParams.d.ts +2 -1
  70. package/types/Core/Interfaces/IPalette.d.ts +15 -2
  71. package/types/Core/Interfaces/IParticleRetinaProps.d.ts +4 -4
  72. package/types/Core/Interfaces/IParticleUpdater.d.ts +2 -1
  73. package/types/Core/Interfaces/IShapeDrawData.d.ts +2 -1
  74. package/types/Core/Particle.d.ts +4 -4
  75. package/types/Core/{Particles.d.ts → ParticlesManager.d.ts} +4 -11
  76. package/types/Core/{Canvas.d.ts → RenderManager.d.ts} +12 -33
  77. package/types/Core/Retina.d.ts +0 -2
  78. package/types/Core/Utils/PluginManager.d.ts +62 -0
  79. package/types/Options/Classes/Options.d.ts +3 -3
  80. package/types/Options/Classes/Particles/Paint.d.ts +10 -0
  81. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +7 -7
  82. package/types/Options/Interfaces/Particles/IPaint.d.ts +6 -0
  83. package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +3 -4
  84. package/types/Types/CanvasContextType.d.ts +1 -0
  85. package/types/Utils/CanvasUtils.d.ts +8 -5
  86. package/types/Utils/ColorUtils.d.ts +8 -8
  87. package/types/Utils/LogUtils.d.ts +1 -0
  88. package/types/Utils/OptionsUtils.d.ts +2 -2
  89. package/types/export-types.d.ts +5 -2
  90. package/types/exports.d.ts +1 -0
  91. package/164.min.js +0 -1
  92. package/browser/Core/Canvas.js +0 -570
  93. package/cjs/Core/Canvas.js +0 -570
  94. package/esm/Core/Canvas.js +0 -570
  95. package/umd/Core/Canvas.js +0 -584
  96. package/umd/Core/Container.js +0 -356
  97. package/umd/Core/Engine.js +0 -295
  98. package/umd/Core/Interfaces/Colors.js +0 -12
  99. package/umd/Core/Interfaces/IBounds.js +0 -12
  100. package/umd/Core/Interfaces/IBubbleParticleData.js +0 -12
  101. package/umd/Core/Interfaces/ICircleBouncer.js +0 -12
  102. package/umd/Core/Interfaces/IColorManager.js +0 -12
  103. package/umd/Core/Interfaces/IContainerPlugin.js +0 -12
  104. package/umd/Core/Interfaces/ICoordinates.js +0 -12
  105. package/umd/Core/Interfaces/IDelta.js +0 -12
  106. package/umd/Core/Interfaces/IDimension.js +0 -12
  107. package/umd/Core/Interfaces/IDistance.js +0 -12
  108. package/umd/Core/Interfaces/IDrawParticleParams.js +0 -12
  109. package/umd/Core/Interfaces/IEffectDrawer.js +0 -12
  110. package/umd/Core/Interfaces/ILoadParams.js +0 -12
  111. package/umd/Core/Interfaces/IPalette.js +0 -12
  112. package/umd/Core/Interfaces/IParticleColorStyle.js +0 -12
  113. package/umd/Core/Interfaces/IParticleHslAnimation.js +0 -12
  114. package/umd/Core/Interfaces/IParticleLife.js +0 -12
  115. package/umd/Core/Interfaces/IParticleOpacityData.js +0 -12
  116. package/umd/Core/Interfaces/IParticleRetinaProps.js +0 -12
  117. package/umd/Core/Interfaces/IParticleRoll.js +0 -12
  118. package/umd/Core/Interfaces/IParticleRotateData.js +0 -12
  119. package/umd/Core/Interfaces/IParticleTransformValues.js +0 -12
  120. package/umd/Core/Interfaces/IParticleUpdater.js +0 -12
  121. package/umd/Core/Interfaces/IParticleValueAnimation.js +0 -12
  122. package/umd/Core/Interfaces/IPlugin.js +0 -12
  123. package/umd/Core/Interfaces/IPositionFromSizeParams.js +0 -12
  124. package/umd/Core/Interfaces/IRangeValue.js +0 -12
  125. package/umd/Core/Interfaces/IShapeDrawData.js +0 -12
  126. package/umd/Core/Interfaces/IShapeDrawer.js +0 -12
  127. package/umd/Core/Interfaces/IShapeValues.js +0 -12
  128. package/umd/Core/Interfaces/ISlowParticleData.js +0 -12
  129. package/umd/Core/Particle.js +0 -432
  130. package/umd/Core/Particles.js +0 -407
  131. package/umd/Core/Retina.js +0 -52
  132. package/umd/Core/Utils/Constants.js +0 -23
  133. package/umd/Core/Utils/EventListeners.js +0 -102
  134. package/umd/Core/Utils/Ranges.js +0 -91
  135. package/umd/Core/Utils/SpatialHashGrid.js +0 -116
  136. package/umd/Core/Utils/Vectors.js +0 -126
  137. package/umd/Enums/AnimationStatus.js +0 -18
  138. package/umd/Enums/Directions/MoveDirection.js +0 -27
  139. package/umd/Enums/Directions/OutModeDirection.js +0 -20
  140. package/umd/Enums/Directions/RotateDirection.js +0 -19
  141. package/umd/Enums/Modes/AnimationMode.js +0 -20
  142. package/umd/Enums/Modes/LimitMode.js +0 -18
  143. package/umd/Enums/Modes/OutMode.js +0 -21
  144. package/umd/Enums/Modes/PixelMode.js +0 -18
  145. package/umd/Enums/RangeType.js +0 -18
  146. package/umd/Enums/Types/AlterType.js +0 -18
  147. package/umd/Enums/Types/DestroyType.js +0 -19
  148. package/umd/Enums/Types/EasingType.js +0 -58
  149. package/umd/Enums/Types/EventType.js +0 -28
  150. package/umd/Enums/Types/GradientType.js +0 -19
  151. package/umd/Enums/Types/ParticleOutType.js +0 -19
  152. package/umd/Enums/Types/StartValueType.js +0 -19
  153. package/umd/Options/Classes/AnimatableColor.js +0 -52
  154. package/umd/Options/Classes/AnimationOptions.js +0 -79
  155. package/umd/Options/Classes/Background/Background.js +0 -56
  156. package/umd/Options/Classes/ColorAnimation.js +0 -44
  157. package/umd/Options/Classes/FullScreen/FullScreen.js +0 -34
  158. package/umd/Options/Classes/HslAnimation.js +0 -30
  159. package/umd/Options/Classes/Options.js +0 -171
  160. package/umd/Options/Classes/OptionsColor.js +0 -42
  161. package/umd/Options/Classes/Particles/Bounce/ParticlesBounce.js +0 -31
  162. package/umd/Options/Classes/Particles/Bounce/ParticlesBounceFactor.js +0 -21
  163. package/umd/Options/Classes/Particles/Effect/Effect.js +0 -46
  164. package/umd/Options/Classes/Particles/Fill.js +0 -42
  165. package/umd/Options/Classes/Particles/Move/Move.js +0 -120
  166. package/umd/Options/Classes/Particles/Move/MoveAngle.js +0 -35
  167. package/umd/Options/Classes/Particles/Move/MoveCenter.js +0 -45
  168. package/umd/Options/Classes/Particles/Move/MoveGravity.js +0 -45
  169. package/umd/Options/Classes/Particles/Move/OutModes.js +0 -38
  170. package/umd/Options/Classes/Particles/Move/Path/MovePath.js +0 -46
  171. package/umd/Options/Classes/Particles/Move/Spin.js +0 -40
  172. package/umd/Options/Classes/Particles/Number/ParticlesDensity.js +0 -41
  173. package/umd/Options/Classes/Particles/Number/ParticlesNumber.js +0 -37
  174. package/umd/Options/Classes/Particles/Number/ParticlesNumberLimit.js +0 -35
  175. package/umd/Options/Classes/Particles/Opacity/Opacity.js +0 -35
  176. package/umd/Options/Classes/Particles/Opacity/OpacityAnimation.js +0 -34
  177. package/umd/Options/Classes/Particles/ParticlesOptions.js +0 -116
  178. package/umd/Options/Classes/Particles/Shape/Shape.js +0 -46
  179. package/umd/Options/Classes/Particles/Size/Size.js +0 -35
  180. package/umd/Options/Classes/Particles/Size/SizeAnimation.js +0 -34
  181. package/umd/Options/Classes/Particles/Stroke.js +0 -39
  182. package/umd/Options/Classes/Particles/ZIndex/ZIndex.js +0 -42
  183. package/umd/Options/Classes/ResizeEvent.js +0 -34
  184. package/umd/Options/Classes/ValueWithRandom.js +0 -56
  185. package/umd/Options/Interfaces/Background/IBackground.js +0 -12
  186. package/umd/Options/Interfaces/FullScreen/IFullScreen.js +0 -12
  187. package/umd/Options/Interfaces/IAnimatable.js +0 -12
  188. package/umd/Options/Interfaces/IAnimatableColor.js +0 -12
  189. package/umd/Options/Interfaces/IAnimation.js +0 -12
  190. package/umd/Options/Interfaces/IColorAnimation.js +0 -12
  191. package/umd/Options/Interfaces/IHslAnimation.js +0 -12
  192. package/umd/Options/Interfaces/IOptionLoader.js +0 -12
  193. package/umd/Options/Interfaces/IOptions.js +0 -12
  194. package/umd/Options/Interfaces/IOptionsColor.js +0 -12
  195. package/umd/Options/Interfaces/IResizeEvent.js +0 -12
  196. package/umd/Options/Interfaces/IValueWithRandom.js +0 -12
  197. package/umd/Options/Interfaces/Particles/Bounce/IParticlesBounce.js +0 -12
  198. package/umd/Options/Interfaces/Particles/Effect/IEffect.js +0 -12
  199. package/umd/Options/Interfaces/Particles/IFill.js +0 -12
  200. package/umd/Options/Interfaces/Particles/IParticlesOptions.js +0 -12
  201. package/umd/Options/Interfaces/Particles/IStroke.js +0 -12
  202. package/umd/Options/Interfaces/Particles/Move/IMove.js +0 -12
  203. package/umd/Options/Interfaces/Particles/Move/IMoveAngle.js +0 -12
  204. package/umd/Options/Interfaces/Particles/Move/IMoveCenter.js +0 -12
  205. package/umd/Options/Interfaces/Particles/Move/IMoveGravity.js +0 -12
  206. package/umd/Options/Interfaces/Particles/Move/IOutModes.js +0 -12
  207. package/umd/Options/Interfaces/Particles/Move/ISpin.js +0 -12
  208. package/umd/Options/Interfaces/Particles/Move/Path/IMovePath.js +0 -12
  209. package/umd/Options/Interfaces/Particles/Number/IParticlesDensity.js +0 -12
  210. package/umd/Options/Interfaces/Particles/Number/IParticlesNumber.js +0 -12
  211. package/umd/Options/Interfaces/Particles/Number/IParticlesNumberLimit.js +0 -12
  212. package/umd/Options/Interfaces/Particles/Opacity/IOpacity.js +0 -12
  213. package/umd/Options/Interfaces/Particles/Opacity/IOpacityAnimation.js +0 -12
  214. package/umd/Options/Interfaces/Particles/Shape/IShape.js +0 -12
  215. package/umd/Options/Interfaces/Particles/Size/ISize.js +0 -12
  216. package/umd/Options/Interfaces/Particles/Size/ISizeAnimation.js +0 -12
  217. package/umd/Options/Interfaces/Particles/ZIndex/IZIndex.js +0 -12
  218. package/umd/Types/CustomEventArgs.js +0 -12
  219. package/umd/Types/CustomEventListener.js +0 -12
  220. package/umd/Types/EasingFunction.js +0 -12
  221. package/umd/Types/EngineInitializers.js +0 -12
  222. package/umd/Types/ExportResult.js +0 -12
  223. package/umd/Types/ISourceOptions.js +0 -12
  224. package/umd/Types/ParticlesGroups.js +0 -12
  225. package/umd/Types/PathOptions.js +0 -12
  226. package/umd/Types/RangeValue.js +0 -12
  227. package/umd/Types/RecursivePartial.js +0 -12
  228. package/umd/Types/ShapeData.js +0 -12
  229. package/umd/Types/SingleOrMultiple.js +0 -12
  230. package/umd/Utils/CanvasUtils.js +0 -145
  231. package/umd/Utils/ColorUtils.js +0 -395
  232. package/umd/Utils/EventDispatcher.js +0 -63
  233. package/umd/Utils/LogUtils.js +0 -36
  234. package/umd/Utils/MathUtils.js +0 -203
  235. package/umd/Utils/OptionsUtils.js +0 -25
  236. package/umd/Utils/TypeUtils.js +0 -40
  237. package/umd/Utils/Utils.js +0 -484
  238. package/umd/bundle.js +0 -32
  239. package/umd/export-types.js +0 -12
  240. package/umd/exports.js +0 -82
  241. package/umd/index.js +0 -32
  242. package/umd/initEngine.js +0 -17
@@ -0,0 +1,303 @@
1
+ import { cloneStyle, getFullScreenStyle, safeMatchMedia, safeMutationObserver } from "../Utils/Utils.js";
2
+ import { defaultZoom, generatedAttribute, half } from "./Utils/Constants.js";
3
+ import { getStyleFromRgb, rangeColorToRgb } from "../Utils/ColorUtils.js";
4
+ import { RenderManager } from "./RenderManager.js";
5
+ function setStyle(canvas, style, important = false) {
6
+ if (!style) {
7
+ return;
8
+ }
9
+ const element = canvas, elementStyle = element.style, keys = new Set();
10
+ for (let i = 0; i < elementStyle.length; i++) {
11
+ const key = elementStyle.item(i);
12
+ if (!key) {
13
+ continue;
14
+ }
15
+ keys.add(key);
16
+ }
17
+ for (let i = 0; i < style.length; i++) {
18
+ const key = style.item(i);
19
+ if (!key) {
20
+ continue;
21
+ }
22
+ keys.add(key);
23
+ }
24
+ for (const key of keys) {
25
+ const value = style.getPropertyValue(key);
26
+ if (value) {
27
+ elementStyle.setProperty(key, value, important ? "important" : "");
28
+ }
29
+ else {
30
+ elementStyle.removeProperty(key);
31
+ }
32
+ }
33
+ }
34
+ export class CanvasManager {
35
+ element;
36
+ render;
37
+ size;
38
+ zoom = defaultZoom;
39
+ _container;
40
+ _generated;
41
+ _mutationObserver;
42
+ _originalStyle;
43
+ _pluginManager;
44
+ _pointerEvents;
45
+ _resizePlugins;
46
+ _standardSize;
47
+ _zoomCenter;
48
+ constructor(pluginManager, container) {
49
+ this._pluginManager = pluginManager;
50
+ this._container = container;
51
+ this.render = new RenderManager(pluginManager, container, this);
52
+ this._standardSize = {
53
+ height: 0,
54
+ width: 0,
55
+ };
56
+ const pxRatio = container.retina.pixelRatio, stdSize = this._standardSize;
57
+ this.size = {
58
+ height: stdSize.height * pxRatio,
59
+ width: stdSize.width * pxRatio,
60
+ };
61
+ this._generated = false;
62
+ this._resizePlugins = [];
63
+ this._pointerEvents = "none";
64
+ }
65
+ get _fullScreen() {
66
+ return this._container.actualOptions.fullScreen.enable;
67
+ }
68
+ destroy() {
69
+ this.stop();
70
+ if (this._generated) {
71
+ const element = this.element;
72
+ element?.remove();
73
+ this.element = undefined;
74
+ }
75
+ else {
76
+ this._resetOriginalStyle();
77
+ }
78
+ this.render.destroy();
79
+ this._resizePlugins = [];
80
+ }
81
+ getZoomCenter() {
82
+ const pxRatio = this._container.retina.pixelRatio, { width, height } = this.size;
83
+ if (this._zoomCenter) {
84
+ return this._zoomCenter;
85
+ }
86
+ return {
87
+ x: (width * half) / pxRatio,
88
+ y: (height * half) / pxRatio,
89
+ };
90
+ }
91
+ init() {
92
+ this._safeMutationObserver(obs => {
93
+ obs.disconnect();
94
+ });
95
+ this._mutationObserver = safeMutationObserver(records => {
96
+ for (const record of records) {
97
+ if (record.type === "attributes" && record.attributeName === "style") {
98
+ this._repairStyle();
99
+ }
100
+ }
101
+ });
102
+ this.resize();
103
+ this._initStyle();
104
+ this.initBackground();
105
+ this._safeMutationObserver(obs => {
106
+ if (!this.element || !(this.element instanceof Node)) {
107
+ return;
108
+ }
109
+ obs.observe(this.element, { attributes: true });
110
+ });
111
+ this.initPlugins();
112
+ this.render.init();
113
+ }
114
+ initBackground() {
115
+ const { _container } = this, options = _container.actualOptions, background = options.background, element = this.element;
116
+ if (!element) {
117
+ return;
118
+ }
119
+ const elementStyle = element.style, color = rangeColorToRgb(this._pluginManager, background.color);
120
+ if (color) {
121
+ elementStyle.backgroundColor = getStyleFromRgb(color, _container.hdr, background.opacity);
122
+ }
123
+ else {
124
+ elementStyle.backgroundColor = "";
125
+ }
126
+ elementStyle.backgroundImage = background.image || "";
127
+ elementStyle.backgroundPosition = background.position || "";
128
+ elementStyle.backgroundRepeat = background.repeat || "";
129
+ elementStyle.backgroundSize = background.size || "";
130
+ }
131
+ initPlugins() {
132
+ this._resizePlugins = [];
133
+ for (const plugin of this._container.plugins) {
134
+ if (plugin.resize) {
135
+ this._resizePlugins.push(plugin);
136
+ }
137
+ }
138
+ }
139
+ loadCanvas(canvas) {
140
+ if (this._generated && this.element) {
141
+ this.element.remove();
142
+ }
143
+ const container = this._container;
144
+ this._generated =
145
+ generatedAttribute in canvas.dataset ? canvas.dataset[generatedAttribute] === "true" : this._generated;
146
+ this.element = canvas;
147
+ this.element.ariaHidden = "true";
148
+ this._originalStyle = cloneStyle(this.element.style);
149
+ const standardSize = this._standardSize;
150
+ standardSize.height = canvas.offsetHeight;
151
+ standardSize.width = canvas.offsetWidth;
152
+ const pxRatio = this._container.retina.pixelRatio, retinaSize = this.size;
153
+ canvas.height = retinaSize.height = standardSize.height * pxRatio;
154
+ canvas.width = retinaSize.width = standardSize.width * pxRatio;
155
+ const canSupportHdrQuery = safeMatchMedia("(color-gamut: p3)");
156
+ this.render.setContextSettings({
157
+ alpha: true,
158
+ colorSpace: canSupportHdrQuery?.matches && container.hdr ? "display-p3" : "srgb",
159
+ desynchronized: true,
160
+ willReadFrequently: false,
161
+ });
162
+ this.render.setContext(this.element.getContext("2d", this.render.settings));
163
+ this._safeMutationObserver(obs => {
164
+ obs.disconnect();
165
+ });
166
+ container.retina.init();
167
+ this.initBackground();
168
+ this._safeMutationObserver(obs => {
169
+ if (!this.element || !(this.element instanceof Node)) {
170
+ return;
171
+ }
172
+ obs.observe(this.element, { attributes: true });
173
+ });
174
+ }
175
+ resize() {
176
+ if (!this.element) {
177
+ return false;
178
+ }
179
+ const container = this._container, currentSize = container.canvas._standardSize, newSize = {
180
+ width: this.element.offsetWidth,
181
+ height: this.element.offsetHeight,
182
+ }, pxRatio = container.retina.pixelRatio, retinaSize = {
183
+ width: newSize.width * pxRatio,
184
+ height: newSize.height * pxRatio,
185
+ };
186
+ if (newSize.height === currentSize.height &&
187
+ newSize.width === currentSize.width &&
188
+ retinaSize.height === this.element.height &&
189
+ retinaSize.width === this.element.width) {
190
+ return false;
191
+ }
192
+ const oldSize = { ...currentSize };
193
+ currentSize.height = newSize.height;
194
+ currentSize.width = newSize.width;
195
+ const canvasSize = this.size;
196
+ this.element.width = canvasSize.width = retinaSize.width;
197
+ this.element.height = canvasSize.height = retinaSize.height;
198
+ if (this._container.started) {
199
+ container.particles.setResizeFactor({
200
+ width: currentSize.width / oldSize.width,
201
+ height: currentSize.height / oldSize.height,
202
+ });
203
+ }
204
+ return true;
205
+ }
206
+ setPointerEvents(type) {
207
+ const element = this.element;
208
+ if (!element) {
209
+ return;
210
+ }
211
+ this._pointerEvents = type;
212
+ this._repairStyle();
213
+ }
214
+ setZoom(zoomLevel, center) {
215
+ this.zoom = zoomLevel;
216
+ this._zoomCenter = center;
217
+ }
218
+ stop() {
219
+ this._safeMutationObserver(obs => {
220
+ obs.disconnect();
221
+ });
222
+ this._mutationObserver = undefined;
223
+ this.render.stop();
224
+ }
225
+ async windowResize() {
226
+ if (!this.element || !this.resize()) {
227
+ return;
228
+ }
229
+ const container = this._container, needsRefresh = container.updateActualOptions();
230
+ container.particles.setDensity();
231
+ this._applyResizePlugins();
232
+ if (needsRefresh) {
233
+ await container.refresh();
234
+ }
235
+ }
236
+ _applyResizePlugins = () => {
237
+ for (const plugin of this._resizePlugins) {
238
+ plugin.resize?.();
239
+ }
240
+ };
241
+ _initStyle = () => {
242
+ const element = this.element, options = this._container.actualOptions;
243
+ if (!element) {
244
+ return;
245
+ }
246
+ if (this._fullScreen) {
247
+ this._setFullScreenStyle();
248
+ }
249
+ else {
250
+ this._resetOriginalStyle();
251
+ }
252
+ for (const key in options.style) {
253
+ if (!key || !(key in options.style)) {
254
+ continue;
255
+ }
256
+ const value = options.style[key];
257
+ if (!value) {
258
+ continue;
259
+ }
260
+ element.style.setProperty(key, value, "important");
261
+ }
262
+ };
263
+ _repairStyle = () => {
264
+ const element = this.element;
265
+ if (!element) {
266
+ return;
267
+ }
268
+ this._safeMutationObserver(observer => {
269
+ observer.disconnect();
270
+ });
271
+ this._initStyle();
272
+ this.initBackground();
273
+ const pointerEvents = this._pointerEvents;
274
+ element.style.pointerEvents = pointerEvents;
275
+ element.setAttribute("pointer-events", pointerEvents);
276
+ this._safeMutationObserver(observer => {
277
+ if (!(element instanceof Node)) {
278
+ return;
279
+ }
280
+ observer.observe(element, { attributes: true });
281
+ });
282
+ };
283
+ _resetOriginalStyle = () => {
284
+ const element = this.element, originalStyle = this._originalStyle;
285
+ if (!element || !originalStyle) {
286
+ return;
287
+ }
288
+ setStyle(element, originalStyle, true);
289
+ };
290
+ _safeMutationObserver = callback => {
291
+ if (!this._mutationObserver) {
292
+ return;
293
+ }
294
+ callback(this._mutationObserver);
295
+ };
296
+ _setFullScreenStyle = () => {
297
+ const element = this.element;
298
+ if (!element) {
299
+ return;
300
+ }
301
+ setStyle(element, getFullScreenStyle(this._container.actualOptions.fullScreen.zIndex), true);
302
+ };
303
+ }
@@ -1,10 +1,10 @@
1
1
  import { animate, cancelAnimation, getRangeValue } from "../Utils/MathUtils.js";
2
- import { defaultFps, defaultFpsLimit, millisecondsToSeconds, minFpsLimit, removeDeleteCount, removeMinIndex, } from "./Utils/Constants.js";
3
- import { Canvas } from "./Canvas.js";
2
+ import { defaultFps, defaultFpsLimit, millisecondsToSeconds, minFpsLimit } from "./Utils/Constants.js";
3
+ import { CanvasManager } from "./CanvasManager.js";
4
4
  import { EventListeners } from "./Utils/EventListeners.js";
5
5
  import { EventType } from "../Enums/Types/EventType.js";
6
6
  import { Options } from "../Options/Classes/Options.js";
7
- import { Particles } from "./Particles.js";
7
+ import { ParticlesManager } from "./ParticlesManager.js";
8
8
  import { Retina } from "./Retina.js";
9
9
  import { getLogger } from "../Utils/LogUtils.js";
10
10
  import { loadOptions } from "../Utils/OptionsUtils.js";
@@ -15,8 +15,8 @@ function updateDelta(delta, value, fpsLimit = defaultFps, smooth = false) {
15
15
  delta.value = value;
16
16
  delta.factor = smooth ? defaultFps / fpsLimit : (defaultFps * value) / millisecondsToSeconds;
17
17
  }
18
- function loadContainerOptions(engine, container, ...sourceOptionsArr) {
19
- const options = new Options(engine, container);
18
+ function loadContainerOptions(pluginManager, container, ...sourceOptionsArr) {
19
+ const options = new Options(pluginManager, container);
20
20
  loadOptions(options, ...sourceOptionsArr);
21
21
  return options;
22
22
  }
@@ -24,6 +24,7 @@ export class Container {
24
24
  actualOptions;
25
25
  canvas;
26
26
  destroyed;
27
+ effectDrawers;
27
28
  fpsLimit;
28
29
  hdr;
29
30
  id;
@@ -31,28 +32,35 @@ export class Container {
31
32
  particleCreatedPlugins;
32
33
  particleDestroyedPlugins;
33
34
  particlePositionPlugins;
35
+ particleUpdaters;
34
36
  particles;
35
37
  plugins;
36
38
  retina;
39
+ shapeDrawers;
37
40
  started;
38
41
  zLayers;
39
42
  _delay;
40
43
  _delayTimeout;
41
44
  _delta = { value: 0, factor: 0 };
45
+ _dispatchCallback;
42
46
  _drawAnimationFrame;
43
47
  _duration;
44
- _engine;
45
48
  _eventListeners;
46
49
  _firstStart;
47
50
  _initialSourceOptions;
48
51
  _lastFrameTime;
49
52
  _lifeTime;
53
+ _onDestroy;
50
54
  _options;
51
55
  _paused;
56
+ _pluginManager;
52
57
  _smooth;
53
58
  _sourceOptions;
54
- constructor(engine, id, sourceOptions) {
55
- this._engine = engine;
59
+ constructor(params) {
60
+ const { dispatchCallback, pluginManager, id, onDestroy, sourceOptions } = params;
61
+ this._pluginManager = pluginManager;
62
+ this._dispatchCallback = dispatchCallback;
63
+ this._onDestroy = onDestroy;
56
64
  this.id = Symbol(id);
57
65
  this.fpsLimit = 120;
58
66
  this.hdr = false;
@@ -69,17 +77,20 @@ export class Container {
69
77
  this.pageHidden = false;
70
78
  this._sourceOptions = sourceOptions;
71
79
  this._initialSourceOptions = sourceOptions;
80
+ this.effectDrawers = new Map();
81
+ this.shapeDrawers = new Map();
82
+ this.particleUpdaters = [];
72
83
  this.retina = new Retina(this);
73
- this.canvas = new Canvas(this, this._engine);
74
- this.particles = new Particles(this._engine, this);
84
+ this.canvas = new CanvasManager(this._pluginManager, this);
85
+ this.particles = new ParticlesManager(this._pluginManager, this);
75
86
  this.plugins = [];
76
87
  this.particleDestroyedPlugins = [];
77
88
  this.particleCreatedPlugins = [];
78
89
  this.particlePositionPlugins = [];
79
- this._options = loadContainerOptions(this._engine, this);
80
- this.actualOptions = loadContainerOptions(this._engine, this);
90
+ this._options = loadContainerOptions(this._pluginManager, this);
91
+ this.actualOptions = loadContainerOptions(this._pluginManager, this);
81
92
  this._eventListeners = new EventListeners(this);
82
- this._engine.dispatchEvent(EventType.containerBuilt, { container: this });
93
+ this.dispatchEvent(EventType.containerBuilt);
83
94
  }
84
95
  get animationStatus() {
85
96
  return !this._paused && !this.pageHidden && guardCheck(this);
@@ -103,19 +114,29 @@ export class Container {
103
114
  this.stop();
104
115
  this.particles.destroy();
105
116
  this.canvas.destroy();
117
+ for (const [, effectDrawer] of this.effectDrawers) {
118
+ effectDrawer.destroy?.(this);
119
+ }
120
+ for (const [, shapeDrawer] of this.shapeDrawers) {
121
+ shapeDrawer.destroy?.(this);
122
+ }
106
123
  for (const plugin of this.plugins) {
107
124
  plugin.destroy?.();
108
125
  }
126
+ this.effectDrawers = new Map();
127
+ this.shapeDrawers = new Map();
128
+ this.particleUpdaters = [];
109
129
  this.plugins.length = 0;
110
- this._engine.clearPlugins(this);
130
+ this._pluginManager.clearPlugins(this);
111
131
  this.destroyed = true;
112
- if (remove) {
113
- const mainArr = this._engine.items, idx = mainArr.indexOf(this);
114
- if (idx >= removeMinIndex) {
115
- mainArr.splice(idx, removeDeleteCount);
116
- }
117
- }
118
- this._engine.dispatchEvent(EventType.containerDestroyed, { container: this });
132
+ this._onDestroy(remove);
133
+ this.dispatchEvent(EventType.containerDestroyed);
134
+ }
135
+ dispatchEvent(type, data) {
136
+ this._dispatchCallback(type, {
137
+ container: this,
138
+ data,
139
+ });
119
140
  }
120
141
  draw(force) {
121
142
  if (!guardCheck(this)) {
@@ -149,16 +170,16 @@ export class Container {
149
170
  return;
150
171
  }
151
172
  const allContainerPlugins = new Map();
152
- for (const plugin of this._engine.plugins) {
173
+ for (const plugin of this._pluginManager.plugins) {
153
174
  const containerPlugin = await plugin.getPlugin(this);
154
175
  if (containerPlugin.preInit) {
155
176
  await containerPlugin.preInit();
156
177
  }
157
178
  allContainerPlugins.set(plugin, containerPlugin);
158
179
  }
159
- await this.particles.initPlugins();
160
- this._options = loadContainerOptions(this._engine, this, this._initialSourceOptions, this.sourceOptions);
161
- this.actualOptions = loadContainerOptions(this._engine, this, this._options);
180
+ await this.initDrawersAndUpdaters();
181
+ this._options = loadContainerOptions(this._pluginManager, this, this._initialSourceOptions, this.sourceOptions);
182
+ this.actualOptions = loadContainerOptions(this._pluginManager, this, this._options);
162
183
  this.plugins.length = 0;
163
184
  this.particleDestroyedPlugins.length = 0;
164
185
  this.particleCreatedPlugins.length = 0;
@@ -194,12 +215,18 @@ export class Container {
194
215
  await plugin.init?.();
195
216
  }
196
217
  await this.particles.init();
197
- this._engine.dispatchEvent(EventType.containerInit, { container: this });
218
+ this.dispatchEvent(EventType.containerInit);
198
219
  this.particles.setDensity();
199
220
  for (const plugin of this.plugins) {
200
221
  plugin.particlesSetup?.();
201
222
  }
202
- this._engine.dispatchEvent(EventType.particlesSetup, { container: this });
223
+ this.dispatchEvent(EventType.particlesSetup);
224
+ }
225
+ async initDrawersAndUpdaters() {
226
+ const pluginManager = this._pluginManager;
227
+ this.effectDrawers = await pluginManager.getEffectDrawers(this, true);
228
+ this.shapeDrawers = await pluginManager.getShapeDrawers(this, true);
229
+ this.particleUpdaters = await pluginManager.getUpdaters(this, true);
203
230
  }
204
231
  pause() {
205
232
  if (!guardCheck(this)) {
@@ -218,7 +245,7 @@ export class Container {
218
245
  if (!this.pageHidden) {
219
246
  this._paused = true;
220
247
  }
221
- this._engine.dispatchEvent(EventType.containerPaused, { container: this });
248
+ this.dispatchEvent(EventType.containerPaused);
222
249
  }
223
250
  play(force) {
224
251
  if (!guardCheck(this)) {
@@ -239,7 +266,7 @@ export class Container {
239
266
  }
240
267
  }
241
268
  }
242
- this._engine.dispatchEvent(EventType.containerPlay, { container: this });
269
+ this.dispatchEvent(EventType.containerPlay);
243
270
  this.draw(needsUpdate ?? false);
244
271
  }
245
272
  async refresh() {
@@ -255,8 +282,8 @@ export class Container {
255
282
  }
256
283
  this._initialSourceOptions = sourceOptions;
257
284
  this._sourceOptions = sourceOptions;
258
- this._options = loadContainerOptions(this._engine, this, this._initialSourceOptions, this.sourceOptions);
259
- this.actualOptions = loadContainerOptions(this._engine, this, this._options);
285
+ this._options = loadContainerOptions(this._pluginManager, this, this._initialSourceOptions, this.sourceOptions);
286
+ this.actualOptions = loadContainerOptions(this._pluginManager, this, this._options);
260
287
  return this.refresh();
261
288
  }
262
289
  async start() {
@@ -271,7 +298,7 @@ export class Container {
271
298
  for (const plugin of this.plugins) {
272
299
  await plugin.start?.();
273
300
  }
274
- this._engine.dispatchEvent(EventType.containerStarted, { container: this });
301
+ this.dispatchEvent(EventType.containerStarted);
275
302
  this.play();
276
303
  resolve();
277
304
  };
@@ -299,7 +326,7 @@ export class Container {
299
326
  this.particleDestroyedPlugins.length = 0;
300
327
  this.particlePositionPlugins.length = 0;
301
328
  this._sourceOptions = this._options;
302
- this._engine.dispatchEvent(EventType.containerStopped, { container: this });
329
+ this.dispatchEvent(EventType.containerStopped);
303
330
  }
304
331
  updateActualOptions() {
305
332
  let refresh = false;
@@ -326,7 +353,7 @@ export class Container {
326
353
  this.draw(false);
327
354
  return;
328
355
  }
329
- this.canvas.drawParticles(this._delta);
356
+ this.canvas.render.drawParticles(this._delta);
330
357
  if (!this.alive()) {
331
358
  this.destroy();
332
359
  return;