@tsparticles/engine 3.0.0-beta.2 → 3.0.0-beta.4

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 (186) hide show
  1. package/browser/Core/Canvas.js +2 -2
  2. package/browser/Core/Container.js +39 -24
  3. package/browser/Core/Engine.js +26 -53
  4. package/browser/Core/Particle.js +88 -53
  5. package/browser/Core/Particles.js +51 -26
  6. package/browser/Core/Retina.js +0 -2
  7. package/browser/Core/Utils/QuadTree.js +1 -1
  8. package/browser/Options/Classes/BackgroundMask/BackgroundMask.js +1 -2
  9. package/browser/Options/Classes/ColorAnimation.js +4 -24
  10. package/browser/Options/Classes/Particles/Bounce/ParticlesBounceFactor.js +0 -1
  11. package/browser/Options/Classes/Particles/Effect/Effect.js +32 -0
  12. package/browser/Options/Classes/Particles/Number/ParticlesNumber.js +3 -5
  13. package/browser/Options/Classes/Particles/Number/ParticlesNumberLimit.js +17 -0
  14. package/browser/Options/Classes/Particles/Opacity/Opacity.js +2 -3
  15. package/browser/Options/Classes/Particles/ParticlesOptions.js +3 -0
  16. package/browser/Options/Classes/Particles/Size/Size.js +2 -3
  17. package/browser/Options/Classes/ValueWithRandom.js +1 -10
  18. package/browser/Utils/CanvasUtils.js +29 -21
  19. package/browser/Utils/ColorUtils.js +24 -38
  20. package/browser/Utils/NumberUtils.js +7 -16
  21. package/browser/Utils/Utils.js +13 -7
  22. package/browser/export-types.js +4 -2
  23. package/browser/exports.js +2 -3
  24. package/cjs/Core/Canvas.js +2 -2
  25. package/cjs/Core/Container.js +39 -24
  26. package/cjs/Core/Engine.js +25 -52
  27. package/cjs/Core/Particle.js +87 -52
  28. package/cjs/Core/Particles.js +51 -26
  29. package/cjs/Core/Retina.js +0 -2
  30. package/cjs/Core/Utils/QuadTree.js +1 -1
  31. package/cjs/Options/Classes/BackgroundMask/BackgroundMask.js +1 -2
  32. package/cjs/Options/Classes/ColorAnimation.js +4 -24
  33. package/cjs/Options/Classes/Particles/Bounce/ParticlesBounceFactor.js +0 -1
  34. package/cjs/Options/Classes/Particles/Effect/Effect.js +36 -0
  35. package/cjs/Options/Classes/Particles/Number/ParticlesNumber.js +3 -5
  36. package/cjs/Options/Classes/Particles/Number/ParticlesNumberLimit.js +21 -0
  37. package/cjs/Options/Classes/Particles/Opacity/Opacity.js +1 -2
  38. package/cjs/Options/Classes/Particles/ParticlesOptions.js +3 -0
  39. package/cjs/Options/Classes/Particles/Size/Size.js +2 -3
  40. package/cjs/Options/Classes/ValueWithRandom.js +1 -10
  41. package/cjs/Utils/CanvasUtils.js +32 -24
  42. package/cjs/Utils/ColorUtils.js +24 -38
  43. package/cjs/Utils/NumberUtils.js +8 -18
  44. package/cjs/Utils/Utils.js +14 -7
  45. package/cjs/export-types.js +4 -2
  46. package/cjs/exports.js +2 -3
  47. package/esm/Core/Canvas.js +2 -2
  48. package/esm/Core/Container.js +39 -24
  49. package/esm/Core/Engine.js +26 -53
  50. package/esm/Core/Particle.js +88 -53
  51. package/esm/Core/Particles.js +51 -26
  52. package/esm/Core/Retina.js +0 -2
  53. package/esm/Core/Utils/QuadTree.js +1 -1
  54. package/esm/Options/Classes/BackgroundMask/BackgroundMask.js +1 -2
  55. package/esm/Options/Classes/ColorAnimation.js +4 -24
  56. package/esm/Options/Classes/Particles/Bounce/ParticlesBounceFactor.js +0 -1
  57. package/esm/Options/Classes/Particles/Effect/Effect.js +32 -0
  58. package/esm/Options/Classes/Particles/Number/ParticlesNumber.js +3 -5
  59. package/esm/Options/Classes/Particles/Number/ParticlesNumberLimit.js +17 -0
  60. package/esm/Options/Classes/Particles/Opacity/Opacity.js +2 -3
  61. package/esm/Options/Classes/Particles/ParticlesOptions.js +3 -0
  62. package/esm/Options/Classes/Particles/Size/Size.js +2 -3
  63. package/esm/Options/Classes/ValueWithRandom.js +1 -10
  64. package/esm/Utils/CanvasUtils.js +29 -21
  65. package/esm/Utils/ColorUtils.js +24 -38
  66. package/esm/Utils/NumberUtils.js +7 -16
  67. package/esm/Utils/Utils.js +13 -7
  68. package/esm/export-types.js +4 -2
  69. package/esm/exports.js +2 -3
  70. package/package.json +1 -1
  71. package/report.html +4 -22
  72. package/tsparticles.engine.js +461 -347
  73. package/tsparticles.engine.min.js +1 -1
  74. package/tsparticles.engine.min.js.LICENSE.txt +1 -1
  75. package/types/Core/Canvas.d.ts +0 -1
  76. package/types/Core/Container.d.ts +9 -8
  77. package/types/Core/Engine.d.ts +9 -5
  78. package/types/Core/Interfaces/IContainerPlugin.d.ts +2 -3
  79. package/types/Core/Interfaces/IEffectDrawer.d.ts +10 -0
  80. package/types/Core/Interfaces/IExternalInteractor.d.ts +3 -4
  81. package/types/Core/Interfaces/IInteractor.d.ts +3 -3
  82. package/types/Core/Interfaces/IParticleRetinaProps.d.ts +0 -1
  83. package/types/Core/Interfaces/IParticlesInteractor.d.ts +3 -3
  84. package/types/Core/Interfaces/IShapeDrawData.d.ts +10 -0
  85. package/types/Core/Interfaces/IShapeDrawer.d.ts +11 -9
  86. package/types/Core/Particle.d.ts +7 -5
  87. package/types/Core/Particles.d.ts +10 -7
  88. package/types/Core/Retina.d.ts +0 -1
  89. package/types/Core/Utils/ExternalInteractorBase.d.ts +4 -4
  90. package/types/Core/Utils/InteractionManager.d.ts +1 -2
  91. package/types/Core/Utils/ParticlesInteractorBase.d.ts +5 -5
  92. package/types/Enums/Modes/LimitMode.d.ts +4 -0
  93. package/types/Enums/Types/EasingType.d.ts +3 -0
  94. package/types/Enums/Types/EventType.d.ts +1 -0
  95. package/types/Options/Classes/BackgroundMask/BackgroundMask.d.ts +1 -1
  96. package/types/Options/Classes/ColorAnimation.d.ts +2 -7
  97. package/types/Options/Classes/Interactivity/Events/ClickEvent.d.ts +1 -2
  98. package/types/Options/Classes/Interactivity/Events/DivEvent.d.ts +1 -2
  99. package/types/Options/Classes/Interactivity/Events/Events.d.ts +3 -3
  100. package/types/Options/Classes/Interactivity/Events/HoverEvent.d.ts +2 -3
  101. package/types/Options/Classes/Interactivity/Interactivity.d.ts +2 -2
  102. package/types/Options/Classes/Options.d.ts +6 -6
  103. package/types/Options/Classes/Particles/Bounce/ParticlesBounce.d.ts +2 -2
  104. package/types/Options/Classes/Particles/Collisions/Collisions.d.ts +3 -3
  105. package/types/Options/Classes/Particles/Effect/Effect.d.ts +13 -0
  106. package/types/Options/Classes/Particles/Move/Move.d.ts +8 -8
  107. package/types/Options/Classes/Particles/Move/MoveTrail.d.ts +1 -1
  108. package/types/Options/Classes/Particles/Number/ParticlesNumber.d.ts +3 -2
  109. package/types/Options/Classes/Particles/Number/ParticlesNumberLimit.d.ts +10 -0
  110. package/types/Options/Classes/Particles/Opacity/Opacity.d.ts +3 -3
  111. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +12 -10
  112. package/types/Options/Classes/Particles/Size/Size.d.ts +3 -3
  113. package/types/Options/Classes/Theme/Theme.d.ts +1 -1
  114. package/types/Options/Classes/ValueWithRandom.d.ts +2 -4
  115. package/types/Options/Interfaces/IValueWithRandom.d.ts +0 -2
  116. package/types/Options/Interfaces/Interactivity/Events/IClickEvent.d.ts +1 -2
  117. package/types/Options/Interfaces/Interactivity/Events/IDivEvent.d.ts +1 -2
  118. package/types/Options/Interfaces/Interactivity/Events/IHoverEvent.d.ts +1 -2
  119. package/types/Options/Interfaces/Particles/Effect/IEffect.d.ts +8 -0
  120. package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +2 -0
  121. package/types/Options/Interfaces/Particles/Number/IParticlesNumber.d.ts +2 -1
  122. package/types/Options/Interfaces/Particles/Number/IParticlesNumberLimit.d.ts +5 -0
  123. package/types/Types/CustomEventArgs.d.ts +1 -1
  124. package/types/Utils/CanvasUtils.d.ts +12 -3
  125. package/types/Utils/ColorUtils.d.ts +2 -2
  126. package/types/Utils/NumberUtils.d.ts +0 -2
  127. package/types/Utils/Utils.d.ts +6 -6
  128. package/types/export-types.d.ts +5 -2
  129. package/types/exports.d.ts +2 -3
  130. package/umd/Core/Canvas.js +2 -2
  131. package/umd/Core/Container.js +40 -25
  132. package/umd/Core/Engine.js +25 -52
  133. package/umd/Core/Particle.js +87 -52
  134. package/umd/Core/Particles.js +51 -26
  135. package/umd/Core/Retina.js +0 -2
  136. package/umd/Core/Utils/QuadTree.js +1 -1
  137. package/umd/Options/Classes/BackgroundMask/BackgroundMask.js +1 -2
  138. package/umd/Options/Classes/ColorAnimation.js +5 -25
  139. package/umd/Options/Classes/Particles/Bounce/ParticlesBounceFactor.js +0 -1
  140. package/umd/Options/Classes/Particles/Effect/Effect.js +46 -0
  141. package/umd/Options/Classes/Particles/Number/ParticlesNumber.js +4 -6
  142. package/umd/Options/Classes/{Random.js → Particles/Number/ParticlesNumberLimit.js} +9 -9
  143. package/umd/Options/Classes/Particles/Opacity/Opacity.js +1 -2
  144. package/umd/Options/Classes/Particles/ParticlesOptions.js +4 -1
  145. package/umd/Options/Classes/Particles/Size/Size.js +3 -4
  146. package/umd/Options/Classes/ValueWithRandom.js +2 -11
  147. package/umd/Utils/CanvasUtils.js +32 -24
  148. package/umd/Utils/ColorUtils.js +24 -38
  149. package/umd/Utils/NumberUtils.js +9 -19
  150. package/umd/Utils/Utils.js +14 -7
  151. package/umd/export-types.js +5 -3
  152. package/umd/exports.js +3 -4
  153. package/browser/Options/Classes/Random.js +0 -17
  154. package/cjs/Options/Classes/Random.js +0 -21
  155. package/cjs/Types/ShapeDrawerFunctions.js +0 -2
  156. package/esm/Options/Classes/Random.js +0 -17
  157. package/esm/Options/Interfaces/IRandom.js +0 -1
  158. package/esm/Types/ShapeDrawerFunctions.js +0 -1
  159. package/types/Core/Interfaces/IParticle.d.ts +0 -48
  160. package/types/Enums/Modes/ClickMode.d.ts +0 -9
  161. package/types/Enums/Modes/DivMode.d.ts +0 -5
  162. package/types/Enums/Modes/HoverMode.d.ts +0 -11
  163. package/types/Options/Classes/Random.d.ts +0 -9
  164. package/types/Options/Interfaces/IRandom.d.ts +0 -4
  165. package/types/Types/ShapeDrawerFunctions.d.ts +0 -10
  166. package/umd/Types/ShapeDrawerFunctions.js +0 -12
  167. /package/browser/Core/Interfaces/{IParticle.js → IEffectDrawer.js} +0 -0
  168. /package/browser/{Enums/Modes/ClickMode.js → Core/Interfaces/IShapeDrawData.js} +0 -0
  169. /package/browser/Enums/Modes/{DivMode.js → LimitMode.js} +0 -0
  170. /package/browser/{Enums/Modes/HoverMode.js → Options/Interfaces/Particles/Effect/IEffect.js} +0 -0
  171. /package/browser/Options/Interfaces/{IRandom.js → Particles/Number/IParticlesNumberLimit.js} +0 -0
  172. /package/cjs/Core/Interfaces/{IParticle.js → IEffectDrawer.js} +0 -0
  173. /package/cjs/{Enums/Modes/ClickMode.js → Core/Interfaces/IShapeDrawData.js} +0 -0
  174. /package/cjs/Enums/Modes/{DivMode.js → LimitMode.js} +0 -0
  175. /package/cjs/{Enums/Modes/HoverMode.js → Options/Interfaces/Particles/Effect/IEffect.js} +0 -0
  176. /package/cjs/Options/Interfaces/{IRandom.js → Particles/Number/IParticlesNumberLimit.js} +0 -0
  177. /package/{browser/Types/ShapeDrawerFunctions.js → esm/Core/Interfaces/IEffectDrawer.js} +0 -0
  178. /package/esm/Core/Interfaces/{IParticle.js → IShapeDrawData.js} +0 -0
  179. /package/esm/Enums/Modes/{ClickMode.js → LimitMode.js} +0 -0
  180. /package/esm/{Enums/Modes/DivMode.js → Options/Interfaces/Particles/Effect/IEffect.js} +0 -0
  181. /package/esm/{Enums/Modes/HoverMode.js → Options/Interfaces/Particles/Number/IParticlesNumberLimit.js} +0 -0
  182. /package/umd/Core/Interfaces/{IParticle.js → IEffectDrawer.js} +0 -0
  183. /package/umd/{Enums/Modes/ClickMode.js → Core/Interfaces/IShapeDrawData.js} +0 -0
  184. /package/umd/Enums/Modes/{DivMode.js → LimitMode.js} +0 -0
  185. /package/umd/{Enums/Modes/HoverMode.js → Options/Interfaces/Particles/Effect/IEffect.js} +0 -0
  186. /package/umd/Options/Interfaces/{IRandom.js → Particles/Number/IParticlesNumberLimit.js} +0 -0
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseAlpha = exports.calcExactPositionOrRandomFromSizeRanged = exports.calcExactPositionOrRandomFromSize = exports.calcPositionOrRandomFromSizeRanged = exports.calcPositionOrRandomFromSize = exports.calcPositionFromSize = exports.collisionVelocity = exports.getParticleBaseVelocity = exports.getParticleDirectionAngle = exports.getDistance = exports.getDistances = exports.getValue = exports.setRangeValue = exports.getRangeMax = exports.getRangeMin = exports.getRangeValue = exports.randomInRange = exports.mix = exports.clamp = exports.getRandom = exports.setRandom = exports.getEasing = exports.addEasing = void 0;
4
- const Utils_js_1 = require("./Utils.js");
3
+ exports.parseAlpha = exports.calcExactPositionOrRandomFromSizeRanged = exports.calcExactPositionOrRandomFromSize = exports.calcPositionOrRandomFromSizeRanged = exports.calcPositionOrRandomFromSize = exports.calcPositionFromSize = exports.collisionVelocity = exports.getParticleBaseVelocity = exports.getParticleDirectionAngle = exports.getDistance = exports.getDistances = exports.setRangeValue = exports.getRangeMax = exports.getRangeMin = exports.getRangeValue = exports.randomInRange = exports.mix = exports.clamp = exports.getRandom = exports.setRandom = exports.getEasing = exports.addEasing = void 0;
5
4
  const Vector_js_1 = require("../Core/Utils/Vector.js");
5
+ const Utils_js_1 = require("./Utils.js");
6
6
  let _random = Math.random;
7
7
  const easings = new Map();
8
8
  function addEasing(name, easing) {
@@ -66,16 +66,6 @@ function setRangeValue(source, value) {
66
66
  : setRangeValue(min, max);
67
67
  }
68
68
  exports.setRangeValue = setRangeValue;
69
- function getValue(options) {
70
- const random = options.random, { enable, minimumValue } = (0, Utils_js_1.isBoolean)(random)
71
- ? {
72
- enable: random,
73
- minimumValue: 0,
74
- }
75
- : random;
76
- return enable ? getRangeValue(setRangeValue(options.value, minimumValue)) : getRangeValue(options.value);
77
- }
78
- exports.getValue = getValue;
79
69
  function getDistances(pointA, pointB) {
80
70
  const dx = pointA.x - pointB.x, dy = pointA.y - pointB.y;
81
71
  return { dx: dx, dy: dy, distance: Math.sqrt(dx ** 2 + dy ** 2) };
@@ -91,21 +81,21 @@ function getParticleDirectionAngle(direction, position, center) {
91
81
  }
92
82
  switch (direction) {
93
83
  case "top":
94
- return -Math.PI / 2;
84
+ return -Math.PI * 0.5;
95
85
  case "top-right":
96
- return -Math.PI / 4;
86
+ return -Math.PI * 0.25;
97
87
  case "right":
98
88
  return 0;
99
89
  case "bottom-right":
100
- return Math.PI / 4;
90
+ return Math.PI * 0.25;
101
91
  case "bottom":
102
- return Math.PI / 2;
92
+ return Math.PI * 0.5;
103
93
  case "bottom-left":
104
- return (3 * Math.PI) / 4;
94
+ return Math.PI * 0.75;
105
95
  case "left":
106
96
  return Math.PI;
107
97
  case "top-left":
108
- return (-3 * Math.PI) / 4;
98
+ return -Math.PI * 0.75;
109
99
  case "inside":
110
100
  return Math.atan2(center.y - position.y, center.x - position.x);
111
101
  case "outside":
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isArray = exports.isObject = exports.isFunction = exports.isNumber = exports.isString = exports.isBoolean = exports.getSize = exports.getPosition = exports.initParticleNumericAnimationValue = exports.findItemFromSingleOrMultiple = exports.itemFromSingleOrMultiple = exports.executeOnSingleOrMultiple = exports.rectBounce = exports.circleBounce = exports.circleBounceDataFromParticle = exports.divMode = exports.singleDivModeExecute = exports.divModeExecute = exports.isDivModeEnabled = exports.deepExtend = exports.calculateBounds = exports.areBoundsInside = exports.isPointInside = exports.itemFromArray = exports.arrayRandomIndex = exports.loadFont = exports.isInArray = exports.safeMutationObserver = exports.safeMatchMedia = exports.hasMatchMedia = exports.isSsr = exports.getLogger = exports.setLogger = void 0;
3
+ exports.isArray = exports.isObject = exports.isFunction = exports.isNumber = exports.isString = exports.isBoolean = exports.getSize = exports.getPosition = exports.initParticleNumericAnimationValue = exports.findItemFromSingleOrMultiple = exports.itemFromSingleOrMultiple = exports.executeOnSingleOrMultiple = exports.rectBounce = exports.circleBounce = exports.circleBounceDataFromParticle = exports.divMode = exports.singleDivModeExecute = exports.divModeExecute = exports.isDivModeEnabled = exports.deepExtend = exports.calculateBounds = exports.areBoundsInside = exports.isPointInside = exports.itemFromArray = exports.arrayRandomIndex = exports.loadFont = exports.isInArray = exports.safeMutationObserver = exports.safeIntersectionObserver = exports.safeMatchMedia = exports.hasMatchMedia = exports.isSsr = exports.getLogger = exports.setLogger = void 0;
4
4
  const NumberUtils_js_1 = require("./NumberUtils.js");
5
5
  const Vector_js_1 = require("../Core/Utils/Vector.js");
6
6
  const _logger = {
@@ -32,8 +32,8 @@ function rectSideBounce(data) {
32
32
  pOtherSide.max > rectOtherSide.max) {
33
33
  return res;
34
34
  }
35
- if ((pSide.max >= rectSide.min && pSide.max <= (rectSide.max + rectSide.min) / 2 && velocity > 0) ||
36
- (pSide.min <= rectSide.max && pSide.min > (rectSide.max + rectSide.min) / 2 && velocity < 0)) {
35
+ if ((pSide.max >= rectSide.min && pSide.max <= (rectSide.max + rectSide.min) * 0.5 && velocity > 0) ||
36
+ (pSide.min <= rectSide.max && pSide.min > (rectSide.max + rectSide.min) * 0.5 && velocity < 0)) {
37
37
  res.velocity = velocity * -factor;
38
38
  res.bounced = true;
39
39
  }
@@ -60,6 +60,13 @@ function safeMatchMedia(query) {
60
60
  return matchMedia(query);
61
61
  }
62
62
  exports.safeMatchMedia = safeMatchMedia;
63
+ function safeIntersectionObserver(callback) {
64
+ if (isSsr() || typeof IntersectionObserver === "undefined") {
65
+ return;
66
+ }
67
+ return new IntersectionObserver(callback);
68
+ }
69
+ exports.safeIntersectionObserver = safeIntersectionObserver;
63
70
  function safeMutationObserver(callback) {
64
71
  if (isSsr() || typeof MutationObserver === "undefined") {
65
72
  return;
@@ -182,7 +189,7 @@ function circleBounceDataFromParticle(p) {
182
189
  radius: p.getRadius(),
183
190
  mass: p.getMass(),
184
191
  velocity: p.velocity,
185
- factor: Vector_js_1.Vector.create((0, NumberUtils_js_1.getValue)(p.options.bounce.horizontal), (0, NumberUtils_js_1.getValue)(p.options.bounce.vertical)),
192
+ factor: Vector_js_1.Vector.create((0, NumberUtils_js_1.getRangeValue)(p.options.bounce.horizontal.value), (0, NumberUtils_js_1.getRangeValue)(p.options.bounce.vertical.value)),
186
193
  };
187
194
  }
188
195
  exports.circleBounceDataFromParticle = circleBounceDataFromParticle;
@@ -199,7 +206,7 @@ function circleBounce(p1, p2) {
199
206
  }
200
207
  exports.circleBounce = circleBounce;
201
208
  function rectBounce(particle, divBounds) {
202
- const pPos = particle.getPosition(), size = particle.getRadius(), bounds = calculateBounds(pPos, size), resH = rectSideBounce({
209
+ const pPos = particle.getPosition(), size = particle.getRadius(), bounds = calculateBounds(pPos, size), bounceOptions = particle.options.bounce, resH = rectSideBounce({
203
210
  pSide: {
204
211
  min: bounds.left,
205
212
  max: bounds.right,
@@ -217,7 +224,7 @@ function rectBounce(particle, divBounds) {
217
224
  max: divBounds.bottom,
218
225
  },
219
226
  velocity: particle.velocity.x,
220
- factor: (0, NumberUtils_js_1.getValue)(particle.options.bounce.horizontal),
227
+ factor: (0, NumberUtils_js_1.getRangeValue)(bounceOptions.horizontal.value),
221
228
  });
222
229
  if (resH.bounced) {
223
230
  if (resH.velocity !== undefined) {
@@ -245,7 +252,7 @@ function rectBounce(particle, divBounds) {
245
252
  max: divBounds.right,
246
253
  },
247
254
  velocity: particle.velocity.y,
248
- factor: (0, NumberUtils_js_1.getValue)(particle.options.bounce.vertical),
255
+ factor: (0, NumberUtils_js_1.getRangeValue)(bounceOptions.vertical.value),
249
256
  });
250
257
  if (resV.bounced) {
251
258
  if (resV.velocity !== undefined) {
@@ -26,12 +26,12 @@ __exportStar(require("./Core/Interfaces/IDelta.js"), exports);
26
26
  __exportStar(require("./Core/Interfaces/IDimension.js"), exports);
27
27
  __exportStar(require("./Core/Interfaces/IDistance.js"), exports);
28
28
  __exportStar(require("./Core/Interfaces/IDrawParticleParams.js"), exports);
29
+ __exportStar(require("./Core/Interfaces/IEffectDrawer.js"), exports);
29
30
  __exportStar(require("./Core/Interfaces/IExternalInteractor.js"), exports);
30
31
  __exportStar(require("./Core/Interfaces/IInteractor.js"), exports);
31
32
  __exportStar(require("./Core/Interfaces/ILoadParams.js"), exports);
32
33
  __exportStar(require("./Core/Interfaces/IMouseData.js"), exports);
33
34
  __exportStar(require("./Core/Interfaces/IMovePathGenerator.js"), exports);
34
- __exportStar(require("./Core/Interfaces/IParticle.js"), exports);
35
35
  __exportStar(require("./Core/Interfaces/IParticleColorStyle.js"), exports);
36
36
  __exportStar(require("./Core/Interfaces/IParticleHslAnimation.js"), exports);
37
37
  __exportStar(require("./Core/Interfaces/IParticleLife.js"), exports);
@@ -46,6 +46,7 @@ __exportStar(require("./Core/Interfaces/IPlugin.js"), exports);
46
46
  __exportStar(require("./Core/Interfaces/IPositionFromSizeParams.js"), exports);
47
47
  __exportStar(require("./Core/Interfaces/IRangeValue.js"), exports);
48
48
  __exportStar(require("./Core/Interfaces/IRectSideResult.js"), exports);
49
+ __exportStar(require("./Core/Interfaces/IShapeDrawData.js"), exports);
49
50
  __exportStar(require("./Core/Interfaces/IShapeDrawer.js"), exports);
50
51
  __exportStar(require("./Core/Interfaces/IShapeValues.js"), exports);
51
52
  __exportStar(require("./Core/Interfaces/ISlowParticleData.js"), exports);
@@ -78,6 +79,7 @@ __exportStar(require("./Options/Interfaces/Particles/Bounce/IParticlesBounce.js"
78
79
  __exportStar(require("./Options/Interfaces/Particles/Collisions/ICollisions.js"), exports);
79
80
  __exportStar(require("./Options/Interfaces/Particles/Collisions/ICollisionsAbsorb.js"), exports);
80
81
  __exportStar(require("./Options/Interfaces/Particles/Collisions/ICollisionsOverlap.js"), exports);
82
+ __exportStar(require("./Options/Interfaces/Particles/Effect/IEffect.js"), exports);
81
83
  __exportStar(require("./Options/Interfaces/Particles/IParticlesOptions.js"), exports);
82
84
  __exportStar(require("./Options/Interfaces/Particles/IShadow.js"), exports);
83
85
  __exportStar(require("./Options/Interfaces/Particles/IStroke.js"), exports);
@@ -92,6 +94,7 @@ __exportStar(require("./Options/Interfaces/Particles/Move/ISpin.js"), exports);
92
94
  __exportStar(require("./Options/Interfaces/Particles/Move/IMoveTrail.js"), exports);
93
95
  __exportStar(require("./Options/Interfaces/Particles/Number/IParticlesDensity.js"), exports);
94
96
  __exportStar(require("./Options/Interfaces/Particles/Number/IParticlesNumber.js"), exports);
97
+ __exportStar(require("./Options/Interfaces/Particles/Number/IParticlesNumberLimit.js"), exports);
95
98
  __exportStar(require("./Options/Interfaces/Particles/Opacity/IOpacity.js"), exports);
96
99
  __exportStar(require("./Options/Interfaces/Particles/Opacity/IOpacityAnimation.js"), exports);
97
100
  __exportStar(require("./Options/Interfaces/Particles/Shape/IShape.js"), exports);
@@ -109,5 +112,4 @@ __exportStar(require("./Types/PathOptions.js"), exports);
109
112
  __exportStar(require("./Types/RangeValue.js"), exports);
110
113
  __exportStar(require("./Types/RecursivePartial.js"), exports);
111
114
  __exportStar(require("./Types/ShapeData.js"), exports);
112
- __exportStar(require("./Types/ShapeDrawerFunctions.js"), exports);
113
115
  __exportStar(require("./Types/SingleOrMultiple.js"), exports);
package/cjs/exports.js CHANGED
@@ -27,10 +27,8 @@ __exportStar(require("./Enums/Directions/MoveDirection.js"), exports);
27
27
  __exportStar(require("./Enums/Directions/RotateDirection.js"), exports);
28
28
  __exportStar(require("./Enums/Directions/OutModeDirection.js"), exports);
29
29
  __exportStar(require("./Enums/Modes/AnimationMode.js"), exports);
30
- __exportStar(require("./Enums/Modes/ClickMode.js"), exports);
31
- __exportStar(require("./Enums/Modes/DivMode.js"), exports);
32
- __exportStar(require("./Enums/Modes/HoverMode.js"), exports);
33
30
  __exportStar(require("./Enums/Modes/CollisionMode.js"), exports);
31
+ __exportStar(require("./Enums/Modes/LimitMode.js"), exports);
34
32
  __exportStar(require("./Enums/Modes/OutMode.js"), exports);
35
33
  __exportStar(require("./Enums/Modes/PixelMode.js"), exports);
36
34
  __exportStar(require("./Enums/Modes/ThemeMode.js"), exports);
@@ -85,6 +83,7 @@ __exportStar(require("./Options/Classes/Particles/Move/Path/MovePath.js"), expor
85
83
  __exportStar(require("./Options/Classes/Particles/Move/Spin.js"), exports);
86
84
  __exportStar(require("./Options/Classes/Particles/Move/MoveTrail.js"), exports);
87
85
  __exportStar(require("./Options/Classes/Particles/Number/ParticlesNumber.js"), exports);
86
+ __exportStar(require("./Options/Classes/Particles/Number/ParticlesNumberLimit.js"), exports);
88
87
  __exportStar(require("./Options/Classes/Particles/Number/ParticlesDensity.js"), exports);
89
88
  __exportStar(require("./Options/Classes/Particles/Opacity/Opacity.js"), exports);
90
89
  __exportStar(require("./Options/Classes/Particles/Opacity/OpacityAnimation.js"), exports);
@@ -402,10 +402,10 @@ export class Canvas {
402
402
  this.element.width = size.width = this.element.offsetWidth * pxRatio;
403
403
  this.element.height = size.height = this.element.offsetHeight * pxRatio;
404
404
  if (this.container.started) {
405
- this.resizeFactor = {
405
+ container.particles.setResizeFactor({
406
406
  width: size.width / oldSize.width,
407
407
  height: size.height / oldSize.height,
408
- };
408
+ });
409
409
  }
410
410
  return true;
411
411
  }
@@ -1,10 +1,10 @@
1
+ import { getLogger, safeIntersectionObserver } from "../Utils/Utils.js";
1
2
  import { Canvas } from "./Canvas.js";
2
3
  import { EventListeners } from "./Utils/EventListeners.js";
3
4
  import { Options } from "../Options/Classes/Options.js";
4
5
  import { Particles } from "./Particles.js";
5
6
  import { Retina } from "./Retina.js";
6
7
  import { errorPrefix } from "./Utils/Constants.js";
7
- import { getLogger } from "../Utils/Utils.js";
8
8
  import { getRangeValue } from "../Utils/NumberUtils.js";
9
9
  import { loadOptions } from "../Utils/OptionsUtils.js";
10
10
  function guardCheck(container) {
@@ -23,7 +23,6 @@ function loadContainerOptions(engine, container, ...sourceOptionsArr) {
23
23
  }
24
24
  export class Container {
25
25
  constructor(engine, id, sourceOptions) {
26
- this.id = id;
27
26
  this._intersectionManager = (entries) => {
28
27
  if (!guardCheck(this) || !this.actualOptions.pauseOnOutsideViewport) {
29
28
  return;
@@ -37,16 +36,16 @@ export class Container {
37
36
  };
38
37
  this._nextFrame = async (timestamp) => {
39
38
  try {
40
- if (!this.smooth &&
41
- this.lastFrameTime !== undefined &&
42
- timestamp < this.lastFrameTime + 1000 / this.fpsLimit) {
39
+ if (!this._smooth &&
40
+ this._lastFrameTime !== undefined &&
41
+ timestamp < this._lastFrameTime + 1000 / this.fpsLimit) {
43
42
  this.draw(false);
44
43
  return;
45
44
  }
46
- this.lastFrameTime ??= timestamp;
47
- const delta = initDelta(timestamp - this.lastFrameTime, this.fpsLimit, this.smooth);
45
+ this._lastFrameTime ??= timestamp;
46
+ const delta = initDelta(timestamp - this._lastFrameTime, this.fpsLimit, this._smooth);
48
47
  this.addLifeTime(delta.value);
49
- this.lastFrameTime = timestamp;
48
+ this._lastFrameTime = timestamp;
50
49
  if (delta.value > 1000) {
51
50
  this.draw(false);
52
51
  return;
@@ -65,8 +64,9 @@ export class Container {
65
64
  }
66
65
  };
67
66
  this._engine = engine;
67
+ this.id = Symbol(id);
68
68
  this.fpsLimit = 120;
69
- this.smooth = false;
69
+ this._smooth = false;
70
70
  this._delay = 0;
71
71
  this._duration = 0;
72
72
  this._lifeTime = 0;
@@ -74,7 +74,7 @@ export class Container {
74
74
  this.started = false;
75
75
  this.destroyed = false;
76
76
  this._paused = true;
77
- this.lastFrameTime = 0;
77
+ this._lastFrameTime = 0;
78
78
  this.zLayers = 100;
79
79
  this.pageHidden = false;
80
80
  this._sourceOptions = sourceOptions;
@@ -90,13 +90,12 @@ export class Container {
90
90
  },
91
91
  };
92
92
  this.plugins = new Map();
93
- this.drawers = new Map();
93
+ this.effectDrawers = new Map();
94
+ this.shapeDrawers = new Map();
94
95
  this._options = loadContainerOptions(this._engine, this);
95
96
  this.actualOptions = loadContainerOptions(this._engine, this);
96
97
  this._eventListeners = new EventListeners(this);
97
- if (typeof IntersectionObserver !== "undefined" && IntersectionObserver) {
98
- this._intersectionObserver = new IntersectionObserver((entries) => this._intersectionManager(entries));
99
- }
98
+ this._intersectionObserver = safeIntersectionObserver((entries) => this._intersectionManager(entries));
100
99
  this._engine.dispatchEvent("containerBuilt", { container: this });
101
100
  }
102
101
  get options() {
@@ -202,11 +201,17 @@ export class Container {
202
201
  this.stop();
203
202
  this.particles.destroy();
204
203
  this.canvas.destroy();
205
- for (const [, drawer] of this.drawers) {
206
- drawer.destroy && drawer.destroy(this);
204
+ for (const [, effectDrawer] of this.effectDrawers) {
205
+ effectDrawer.destroy && effectDrawer.destroy(this);
206
+ }
207
+ for (const [, shapeDrawer] of this.shapeDrawers) {
208
+ shapeDrawer.destroy && shapeDrawer.destroy(this);
207
209
  }
208
- for (const key of this.drawers.keys()) {
209
- this.drawers.delete(key);
210
+ for (const key of this.effectDrawers.keys()) {
211
+ this.effectDrawers.delete(key);
212
+ }
213
+ for (const key of this.shapeDrawers.keys()) {
214
+ this.shapeDrawers.delete(key);
210
215
  }
211
216
  this._engine.clearPlugins(this);
212
217
  this.destroyed = true;
@@ -223,7 +228,7 @@ export class Container {
223
228
  let refreshTime = force;
224
229
  this._drawAnimationFrame = requestAnimationFrame(async (timestamp) => {
225
230
  if (refreshTime) {
226
- this.lastFrameTime = undefined;
231
+ this._lastFrameTime = undefined;
227
232
  refreshTime = false;
228
233
  }
229
234
  await this._nextFrame(timestamp);
@@ -258,11 +263,18 @@ export class Container {
258
263
  if (!guardCheck(this)) {
259
264
  return;
260
265
  }
266
+ const effects = this._engine.getSupportedEffects();
267
+ for (const type of effects) {
268
+ const drawer = this._engine.getEffectDrawer(type);
269
+ if (drawer) {
270
+ this.effectDrawers.set(type, drawer);
271
+ }
272
+ }
261
273
  const shapes = this._engine.getSupportedShapes();
262
274
  for (const type of shapes) {
263
275
  const drawer = this._engine.getShapeDrawer(type);
264
276
  if (drawer) {
265
- this.drawers.set(type, drawer);
277
+ this.shapeDrawers.set(type, drawer);
266
278
  }
267
279
  }
268
280
  this._options = loadContainerOptions(this._engine, this, this._initialSourceOptions, this.sourceOptions);
@@ -281,8 +293,11 @@ export class Container {
281
293
  this._delay = getRangeValue(this.actualOptions.delay) * 1000;
282
294
  this._lifeTime = 0;
283
295
  this.fpsLimit = this.actualOptions.fpsLimit > 0 ? this.actualOptions.fpsLimit : 120;
284
- this.smooth = this.actualOptions.smooth;
285
- for (const [, drawer] of this.drawers) {
296
+ this._smooth = this.actualOptions.smooth;
297
+ for (const [, drawer] of this.effectDrawers) {
298
+ drawer.init && (await drawer.init(this));
299
+ }
300
+ for (const [, drawer] of this.shapeDrawers) {
286
301
  drawer.init && (await drawer.init(this));
287
302
  }
288
303
  for (const [, plugin] of this.plugins) {
@@ -411,10 +426,10 @@ export class Container {
411
426
  this.actualOptions.responsive = [];
412
427
  const newMaxWidth = this.actualOptions.setResponsive(this.canvas.size.width, this.retina.pixelRatio, this._options);
413
428
  this.actualOptions.setTheme(this._currentTheme);
414
- if (this.responsiveMaxWidth === newMaxWidth) {
429
+ if (this._responsiveMaxWidth === newMaxWidth) {
415
430
  return false;
416
431
  }
417
- this.responsiveMaxWidth = newMaxWidth;
432
+ this._responsiveMaxWidth = newMaxWidth;
418
433
  return true;
419
434
  }
420
435
  }
@@ -1,5 +1,5 @@
1
1
  import { errorPrefix, generatedAttribute } from "./Utils/Constants.js";
2
- import { executeOnSingleOrMultiple, getLogger, isBoolean, isFunction, isString, itemFromSingleOrMultiple, } from "../Utils/Utils.js";
2
+ import { executeOnSingleOrMultiple, getLogger, itemFromSingleOrMultiple } from "../Utils/Utils.js";
3
3
  import { Container } from "./Container.js";
4
4
  import { EventDispatcher } from "../Utils/EventDispatcher.js";
5
5
  import { getRandom } from "../Utils/NumberUtils.js";
@@ -39,7 +39,8 @@ export class Engine {
39
39
  this.movers = new Map();
40
40
  this.updaters = new Map();
41
41
  this.presets = new Map();
42
- this.drawers = new Map();
42
+ this.effectDrawers = new Map();
43
+ this.shapeDrawers = new Map();
43
44
  this.pathGenerators = new Map();
44
45
  }
45
46
  get configs() {
@@ -50,18 +51,18 @@ export class Engine {
50
51
  return res;
51
52
  }
52
53
  get version() {
53
- return "3.0.0-beta.2";
54
+ return "3.0.0-beta.4";
54
55
  }
55
- addConfig(nameOrConfig, config) {
56
- if (isString(nameOrConfig)) {
57
- if (config) {
58
- config.name = nameOrConfig;
59
- this._configs.set(nameOrConfig, config);
60
- }
61
- }
62
- else {
63
- this._configs.set(nameOrConfig.name ?? "default", nameOrConfig);
64
- }
56
+ addConfig(config) {
57
+ const name = config.name ?? "default";
58
+ this._configs.set(name, config);
59
+ this._eventDispatcher.dispatchEvent("configAdded", { data: { name, config } });
60
+ }
61
+ async addEffect(effect, drawer, refresh = true) {
62
+ executeOnSingleOrMultiple(effect, (type) => {
63
+ !this.getEffectDrawer(type) && this.effectDrawers.set(type, drawer);
64
+ });
65
+ await this.refresh(refresh);
65
66
  }
66
67
  addEventListener(type, listener) {
67
68
  this._eventDispatcher.addEventListener(type, listener);
@@ -90,45 +91,11 @@ export class Engine {
90
91
  (override || !this.getPreset(preset)) && this.presets.set(preset, options);
91
92
  await this.refresh(refresh);
92
93
  }
93
- async addShape(shape, drawer, initOrRefresh, afterEffectOrRefresh, destroyOrRefresh, refresh = true) {
94
- let customDrawer;
95
- let realRefresh = refresh, realInit, realAfterEffect, realDestroy;
96
- if (isBoolean(initOrRefresh)) {
97
- realRefresh = initOrRefresh;
98
- realInit = undefined;
99
- }
100
- else {
101
- realInit = initOrRefresh;
102
- }
103
- if (isBoolean(afterEffectOrRefresh)) {
104
- realRefresh = afterEffectOrRefresh;
105
- realAfterEffect = undefined;
106
- }
107
- else {
108
- realAfterEffect = afterEffectOrRefresh;
109
- }
110
- if (isBoolean(destroyOrRefresh)) {
111
- realRefresh = destroyOrRefresh;
112
- realDestroy = undefined;
113
- }
114
- else {
115
- realDestroy = destroyOrRefresh;
116
- }
117
- if (isFunction(drawer)) {
118
- customDrawer = {
119
- afterEffect: realAfterEffect,
120
- destroy: realDestroy,
121
- draw: drawer,
122
- init: realInit,
123
- };
124
- }
125
- else {
126
- customDrawer = drawer;
127
- }
94
+ async addShape(shape, drawer, refresh = true) {
128
95
  executeOnSingleOrMultiple(shape, (type) => {
129
- !this.getShapeDrawer(type) && this.drawers.set(type, customDrawer);
96
+ !this.getShapeDrawer(type) && this.shapeDrawers.set(type, drawer);
130
97
  });
131
- await this.refresh(realRefresh);
98
+ await this.refresh(refresh);
132
99
  }
133
100
  clearPlugins(container) {
134
101
  this.updaters.delete(container);
@@ -156,6 +123,9 @@ export class Engine {
156
123
  }
157
124
  return res;
158
125
  }
126
+ getEffectDrawer(type) {
127
+ return this.effectDrawers.get(type);
128
+ }
159
129
  getInteractors(container, force = false) {
160
130
  return getItemsFromInitializer(container, this.interactors, this._initializers.interactors, force);
161
131
  }
@@ -172,10 +142,13 @@ export class Engine {
172
142
  return this.presets.get(preset);
173
143
  }
174
144
  getShapeDrawer(type) {
175
- return this.drawers.get(type);
145
+ return this.shapeDrawers.get(type);
146
+ }
147
+ getSupportedEffects() {
148
+ return this.effectDrawers.keys();
176
149
  }
177
150
  getSupportedShapes() {
178
- return this.drawers.keys();
151
+ return this.shapeDrawers.keys();
179
152
  }
180
153
  getUpdaters(container, force = false) {
181
154
  return getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
@@ -194,7 +167,7 @@ export class Engine {
194
167
  domContainer.id = id;
195
168
  document.body.append(domContainer);
196
169
  }
197
- const currentOptions = itemFromSingleOrMultiple(options, index), dom = this.dom(), oldIndex = dom.findIndex((v) => v.id === id);
170
+ const currentOptions = itemFromSingleOrMultiple(options, index), dom = this.dom(), oldIndex = dom.findIndex((v) => v.id.description === id);
198
171
  if (oldIndex >= 0) {
199
172
  const old = this.domItem(oldIndex);
200
173
  if (old && !old.destroyed) {