@tsparticles/plugin-absorbers 4.0.0-alpha.8 → 4.0.0-beta.1

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 (79) hide show
  1. package/122.min.js +1 -0
  2. package/285.min.js +1 -0
  3. package/677.min.js +1 -0
  4. package/698.min.js +1 -0
  5. package/998.min.js +1 -0
  6. package/README.md +5 -0
  7. package/browser/AbsorberInstance.js +126 -59
  8. package/browser/AbsorbersInstancesManager.js +5 -3
  9. package/browser/AbsorbersInteractor.js +11 -6
  10. package/browser/AbsorbersPlugin.js +2 -1
  11. package/browser/AbsorbersPluginInstance.js +2 -0
  12. package/browser/Options/Classes/Absorber.js +14 -0
  13. package/browser/Options/Classes/AbsorberLife.js +27 -0
  14. package/browser/Options/Classes/AbsorberSize.js +2 -0
  15. package/browser/Options/Classes/AbsorberSizeLimit.js +2 -0
  16. package/browser/Options/Interfaces/IAbsorberLife.js +1 -0
  17. package/browser/index.js +10 -6
  18. package/cjs/AbsorberInstance.js +126 -59
  19. package/cjs/AbsorbersInstancesManager.js +5 -3
  20. package/cjs/AbsorbersInteractor.js +11 -6
  21. package/cjs/AbsorbersPlugin.js +2 -1
  22. package/cjs/AbsorbersPluginInstance.js +2 -0
  23. package/cjs/Options/Classes/Absorber.js +14 -0
  24. package/cjs/Options/Classes/AbsorberLife.js +27 -0
  25. package/cjs/Options/Classes/AbsorberSize.js +2 -0
  26. package/cjs/Options/Classes/AbsorberSizeLimit.js +2 -0
  27. package/cjs/Options/Interfaces/IAbsorberLife.js +1 -0
  28. package/cjs/index.js +10 -6
  29. package/dist_browser_AbsorberInstance_js.js +15 -5
  30. package/dist_browser_AbsorbersInstancesManager_js.js +2 -2
  31. package/dist_browser_AbsorbersInteractor_js.js +15 -5
  32. package/dist_browser_AbsorbersPluginInstance_js.js +2 -2
  33. package/dist_browser_AbsorbersPlugin_js.js +15 -5
  34. package/esm/AbsorberInstance.js +126 -59
  35. package/esm/AbsorbersInstancesManager.js +5 -3
  36. package/esm/AbsorbersInteractor.js +11 -6
  37. package/esm/AbsorbersPlugin.js +2 -1
  38. package/esm/AbsorbersPluginInstance.js +2 -0
  39. package/esm/Options/Classes/Absorber.js +14 -0
  40. package/esm/Options/Classes/AbsorberLife.js +27 -0
  41. package/esm/Options/Classes/AbsorberSize.js +2 -0
  42. package/esm/Options/Classes/AbsorberSizeLimit.js +2 -0
  43. package/esm/Options/Interfaces/IAbsorberLife.js +1 -0
  44. package/esm/index.js +10 -6
  45. package/package.json +3 -3
  46. package/report.html +84 -29
  47. package/tsparticles.plugin.absorbers.js +31 -19
  48. package/tsparticles.plugin.absorbers.min.js +2 -2
  49. package/types/AbsorberInstance.d.ts +14 -4
  50. package/types/AbsorbersInstancesManager.d.ts +3 -3
  51. package/types/AbsorbersInteractor.d.ts +3 -2
  52. package/types/AbsorbersPlugin.d.ts +1 -1
  53. package/types/AbsorbersPluginInstance.d.ts +2 -2
  54. package/types/Options/Classes/Absorber.d.ts +2 -0
  55. package/types/Options/Classes/AbsorberLife.d.ts +10 -0
  56. package/types/Options/Interfaces/IAbsorber.d.ts +2 -0
  57. package/types/Options/Interfaces/IAbsorberLife.d.ts +7 -0
  58. package/umd/AbsorberInstance.js +125 -58
  59. package/umd/AbsorbersInstancesManager.js +5 -3
  60. package/umd/AbsorbersInteractor.js +11 -6
  61. package/umd/AbsorbersPlugin.js +2 -1
  62. package/umd/AbsorbersPluginInstance.js +2 -0
  63. package/umd/Options/Classes/Absorber.js +15 -1
  64. package/umd/Options/Classes/AbsorberLife.js +41 -0
  65. package/umd/Options/Classes/AbsorberSize.js +2 -0
  66. package/umd/Options/Classes/AbsorberSizeLimit.js +2 -0
  67. package/umd/Options/Interfaces/IAbsorberLife.js +12 -0
  68. package/umd/index.js +10 -6
  69. package/215.min.js +0 -2
  70. package/215.min.js.LICENSE.txt +0 -1
  71. package/384.min.js +0 -2
  72. package/384.min.js.LICENSE.txt +0 -1
  73. package/688.min.js +0 -2
  74. package/688.min.js.LICENSE.txt +0 -1
  75. package/903.min.js +0 -2
  76. package/903.min.js.LICENSE.txt +0 -1
  77. package/980.min.js +0 -2
  78. package/980.min.js.LICENSE.txt +0 -1
  79. package/tsparticles.plugin.absorbers.min.js.LICENSE.txt +0 -1
@@ -1,61 +1,30 @@
1
- import { RotateDirection, Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, doublePI, getDistance, getDistances, getRandom, getRangeValue, getStyleFromRgb, isPointInside, originPoint, percentDenominator, rangeColorToRgb, } from "@tsparticles/engine";
1
+ import { RotateDirection, Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, doublePI, getDistance, getDistances, getRandom, getRangeMax, getRangeValue, getStyleFromRgb, half, identity, isPointInside, millisecondsToSeconds, originPoint, rangeColorToRgb, } from "@tsparticles/engine";
2
2
  import { Absorber } from "./Options/Classes/Absorber.js";
3
- const squareExp = 2, absorbFactor = 0.033, minOrbitLength = 0, minRadius = 0, minMass = 0, minAngle = 0, maxAngle = doublePI, minVelocity = 0;
3
+ const squareExp = 2, absorbFactor = 0.033, minOrbitLength = 0, minRadius = 0, minMass = 0, minAngle = 0, maxAngle = doublePI, maxDegreeAngle = 360, angleIncrementFactor = identity / maxDegreeAngle, minVelocity = 0, defaultLifeDelay = 0, minLifeCount = 0, defaultSpawnDelay = 0, defaultLifeCount = -1;
4
4
  export class AbsorberInstance {
5
- constructor(engine, container, options, position) {
6
- this._calcPosition = () => {
7
- const exactPosition = calcPositionOrRandomFromSizeRanged({
8
- size: this._container.canvas.size,
9
- position: this.options.position,
10
- });
11
- return Vector.create(exactPosition.x, exactPosition.y);
12
- };
13
- this._updateParticlePosition = (particle, v) => {
14
- if (particle.destroyed) {
15
- return;
16
- }
17
- const container = this._container, canvasSize = container.canvas.size;
18
- if (particle.needsNewPosition) {
19
- const newPosition = calcPositionOrRandomFromSize({ size: canvasSize });
20
- particle.position.setTo(newPosition);
21
- particle.velocity.setTo(particle.initialVelocity);
22
- particle.absorberOrbit = undefined;
23
- particle.needsNewPosition = false;
24
- }
25
- if (this.options.orbits) {
26
- if (particle.absorberOrbit === undefined) {
27
- particle.absorberOrbit = Vector.origin;
28
- particle.absorberOrbit.length = getDistance(particle.getPosition(), this.position);
29
- particle.absorberOrbit.angle = getRandom() * maxAngle;
30
- }
31
- if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
32
- const minSize = Math.min(canvasSize.width, canvasSize.height), offset = 1, randomOffset = 0.1, randomFactor = 0.2;
33
- particle.absorberOrbit.length = minSize * (offset + (getRandom() * randomFactor - randomOffset));
34
- }
35
- particle.absorberOrbitDirection ??=
36
- particle.velocity.x >= minVelocity ? RotateDirection.clockwise : RotateDirection.counterClockwise;
37
- const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;
38
- particle.velocity.setTo(Vector.origin);
39
- const updateFunc = {
40
- x: orbitDirection === RotateDirection.clockwise ? Math.cos : Math.sin,
41
- y: orbitDirection === RotateDirection.clockwise ? Math.sin : Math.cos,
42
- };
43
- particle.position.x = this.position.x + orbitRadius * updateFunc.x(orbitAngle);
44
- particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
45
- particle.absorberOrbit.length -= v.length;
46
- particle.absorberOrbit.angle +=
47
- (((particle.retina.moveSpeed ?? minVelocity) * container.retina.pixelRatio) / percentDenominator) *
48
- container.retina.reduceFactor;
49
- }
50
- else {
51
- const addV = Vector.origin;
52
- addV.length = v.length;
53
- addV.angle = v.angle;
54
- particle.velocity.addTo(addV);
55
- }
56
- };
5
+ color;
6
+ limit;
7
+ mass;
8
+ name;
9
+ opacity;
10
+ options;
11
+ position;
12
+ size;
13
+ _container;
14
+ _currentDuration;
15
+ _currentSpawnDelay;
16
+ _duration;
17
+ _firstSpawn;
18
+ _immortal;
19
+ _lifeCount;
20
+ _pluginManager;
21
+ _spawnDelay;
22
+ initialPosition;
23
+ constructor(pluginManager, container, options, position) {
57
24
  this._container = container;
58
- this._engine = engine;
25
+ this._pluginManager = pluginManager;
26
+ this._currentDuration = 0;
27
+ this._currentSpawnDelay = 0;
59
28
  this.initialPosition = position ? Vector.create(position.x, position.y) : undefined;
60
29
  if (options instanceof Absorber) {
61
30
  this.options = options;
@@ -73,12 +42,19 @@ export class AbsorberInstance {
73
42
  radius: limit.radius * container.retina.pixelRatio * container.retina.reduceFactor,
74
43
  mass: limit.mass,
75
44
  };
76
- this.color = rangeColorToRgb(this._engine, this.options.color) ?? {
45
+ this.color = rangeColorToRgb(this._pluginManager, this.options.color) ?? {
77
46
  b: 0,
78
47
  g: 0,
79
48
  r: 0,
80
49
  };
81
50
  this.position = this.initialPosition?.copy() ?? this._calcPosition();
51
+ this._firstSpawn = !this.options.life.wait;
52
+ this._lifeCount = this.options.life.count ?? defaultLifeCount;
53
+ this._immortal = this._lifeCount <= minLifeCount;
54
+ this._spawnDelay = container.retina.reduceFactor
55
+ ? (getRangeValue(this.options.life.delay ?? defaultLifeDelay) * millisecondsToSeconds) /
56
+ container.retina.reduceFactor
57
+ : Infinity;
82
58
  }
83
59
  attract(particle, delta) {
84
60
  const container = this._container, options = this.options, pos = particle.getPosition(), { dx, dy, distance } = getDistances(this.position, pos), v = Vector.create(dx, dy);
@@ -92,14 +68,14 @@ export class AbsorberInstance {
92
68
  }
93
69
  else {
94
70
  particle.needsNewPosition = true;
95
- this._updateParticlePosition(particle, v);
71
+ this._updateParticlePosition(particle, delta, v);
96
72
  }
97
73
  }
98
74
  else {
99
75
  if (options.destroy) {
100
76
  particle.size.value -= sizeFactor;
101
77
  }
102
- this._updateParticlePosition(particle, v);
78
+ this._updateParticlePosition(particle, delta, v);
103
79
  }
104
80
  if (this.limit.radius <= minRadius || this.size < this.limit.radius) {
105
81
  this.size += sizeFactor;
@@ -109,7 +85,7 @@ export class AbsorberInstance {
109
85
  }
110
86
  }
111
87
  else {
112
- this._updateParticlePosition(particle, v);
88
+ this._updateParticlePosition(particle, delta, v);
113
89
  }
114
90
  }
115
91
  draw(context) {
@@ -127,4 +103,95 @@ export class AbsorberInstance {
127
103
  ? initialPosition
128
104
  : this._calcPosition();
129
105
  }
106
+ update(delta) {
107
+ if (this._firstSpawn) {
108
+ this._firstSpawn = false;
109
+ this._currentSpawnDelay = this._spawnDelay ?? defaultSpawnDelay;
110
+ }
111
+ if (this._duration !== undefined) {
112
+ this._currentDuration += delta.value;
113
+ if (this._currentDuration >= this._duration) {
114
+ if (!this._immortal) {
115
+ this._lifeCount--;
116
+ }
117
+ if (this._lifeCount > minLifeCount || this._immortal) {
118
+ this.position = this._calcPosition();
119
+ this._spawnDelay = this._container.retina.reduceFactor
120
+ ? (getRangeValue(this.options.life.delay ?? defaultLifeDelay) * millisecondsToSeconds) /
121
+ this._container.retina.reduceFactor
122
+ : Infinity;
123
+ }
124
+ this._currentDuration -= this._duration;
125
+ delete this._duration;
126
+ }
127
+ }
128
+ if (this._spawnDelay !== undefined) {
129
+ this._currentSpawnDelay += delta.value;
130
+ if (this._currentSpawnDelay >= this._spawnDelay) {
131
+ this.play();
132
+ this._currentSpawnDelay -= this._spawnDelay;
133
+ delete this._spawnDelay;
134
+ }
135
+ }
136
+ }
137
+ _calcPosition = () => {
138
+ const exactPosition = calcPositionOrRandomFromSizeRanged({
139
+ size: this._container.canvas.size,
140
+ position: this.options.position,
141
+ });
142
+ return Vector.create(exactPosition.x, exactPosition.y);
143
+ };
144
+ _prepareToDie = () => {
145
+ const duration = this.options.life.duration !== undefined ? getRangeValue(this.options.life.duration) : undefined, minDuration = 0;
146
+ if ((this._lifeCount > minLifeCount || this._immortal) && duration !== undefined && duration > minDuration) {
147
+ this._duration = duration * millisecondsToSeconds;
148
+ }
149
+ };
150
+ _updateParticlePosition = (particle, delta, v) => {
151
+ if (particle.destroyed) {
152
+ return;
153
+ }
154
+ const container = this._container, canvasSize = container.canvas.size;
155
+ if (particle.needsNewPosition) {
156
+ const newPosition = calcPositionOrRandomFromSize({ size: canvasSize });
157
+ particle.position.setTo(newPosition);
158
+ particle.velocity.setTo(particle.initialVelocity);
159
+ particle.absorberOrbit = undefined;
160
+ particle.needsNewPosition = false;
161
+ }
162
+ if (this.options.orbits) {
163
+ if (particle.absorberOrbit === undefined) {
164
+ particle.absorberOrbit = Vector.origin;
165
+ particle.absorberOrbit.length = getDistance(particle.getPosition(), this.position);
166
+ particle.absorberOrbit.angle = getRandom() * maxAngle;
167
+ }
168
+ if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
169
+ const minSize = Math.min(canvasSize.width, canvasSize.height), offset = 1, randomOffset = 0.1, randomFactor = 0.2;
170
+ particle.absorberOrbit.length = minSize * (offset + (getRandom() * randomFactor - randomOffset));
171
+ }
172
+ particle.absorberOrbitDirection ??=
173
+ particle.velocity.x >= minVelocity ? RotateDirection.clockwise : RotateDirection.counterClockwise;
174
+ const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;
175
+ particle.velocity.setTo(Vector.origin);
176
+ const maxSize = getRangeMax(particle.options.size.value) * container.retina.pixelRatio, sizeFactor = particle.options.move.size ? particle.getRadius() / maxSize : identity, deltaFactor = delta.factor || identity, baseSpeed = particle.retina.moveSpeed, moveSpeed = baseSpeed * sizeFactor * deltaFactor * half;
177
+ particle.position.x = this.position.x + orbitRadius * Math.cos(orbitAngle);
178
+ particle.position.y =
179
+ this.position.y +
180
+ orbitRadius * (orbitDirection === RotateDirection.clockwise ? identity : -identity) * Math.sin(orbitAngle);
181
+ particle.absorberOrbit.length = Math.max(minOrbitLength, particle.absorberOrbit.length - v.length);
182
+ particle.absorberOrbit.angle += moveSpeed * angleIncrementFactor * container.retina.reduceFactor;
183
+ }
184
+ else {
185
+ particle.velocity.addTo(v);
186
+ }
187
+ };
188
+ play = () => {
189
+ if (!((this._lifeCount > minLifeCount || this._immortal || !this.options.life.count) &&
190
+ (this._firstSpawn || this._currentSpawnDelay >= (this._spawnDelay ?? defaultSpawnDelay)))) {
191
+ return;
192
+ }
193
+ if (this._lifeCount > minLifeCount || this._immortal) {
194
+ this._prepareToDie();
195
+ }
196
+ };
130
197
  }
@@ -1,12 +1,14 @@
1
1
  import { isNumber } from "@tsparticles/engine";
2
2
  const defaultIndex = 0;
3
3
  export class AbsorbersInstancesManager {
4
- constructor(engine) {
4
+ _containerArrays;
5
+ _pluginManager;
6
+ constructor(pluginManager) {
7
+ this._pluginManager = pluginManager;
5
8
  this._containerArrays = new Map();
6
- this._engine = engine;
7
9
  }
8
10
  async addAbsorber(container, options, position) {
9
- const { AbsorberInstance } = await import("./AbsorberInstance.js"), absorber = new AbsorberInstance(this._engine, container, options, position), array = this.getArray(container);
11
+ const { AbsorberInstance } = await import("./AbsorberInstance.js"), absorber = new AbsorberInstance(this._pluginManager, container, options, position), array = this.getArray(container);
10
12
  array.push(absorber);
11
13
  return absorber;
12
14
  }
@@ -3,9 +3,14 @@ import { getDistance, isArray, isInArray, itemFromArray, } from "@tsparticles/en
3
3
  import { Absorber } from "./Options/Classes/Absorber.js";
4
4
  const absorbersMode = "absorbers";
5
5
  export class AbsorbersInteractor extends ExternalInteractorBase {
6
+ handleClickMode;
7
+ maxDistance;
8
+ _dragging = false;
9
+ _draggingAbsorber;
10
+ _instancesManager;
6
11
  constructor(container, instancesManager) {
7
12
  super(container);
8
- this.dragging = false;
13
+ this.maxDistance = 0;
9
14
  this._instancesManager = instancesManager;
10
15
  this._instancesManager.initContainer(container);
11
16
  this.handleClickMode = (mode, interactivityData) => {
@@ -38,15 +43,15 @@ export class AbsorbersInteractor extends ExternalInteractorBase {
38
43
  if (mouse.clicking && mouse.downPosition) {
39
44
  const mouseDist = getDistance(absorber.position, mouse.downPosition);
40
45
  if (mouseDist <= absorber.size) {
41
- this.dragging = true;
42
- this.draggingAbsorber = absorber;
46
+ this._dragging = true;
47
+ this._draggingAbsorber = absorber;
43
48
  }
44
49
  }
45
50
  else {
46
- this.dragging = false;
47
- this.draggingAbsorber = undefined;
51
+ this._dragging = false;
52
+ this._draggingAbsorber = undefined;
48
53
  }
49
- if (this.dragging && this.draggingAbsorber == absorber && mouse.position) {
54
+ if (this._dragging && this._draggingAbsorber == absorber && mouse.position) {
50
55
  absorber.position.x = mouse.position.x;
51
56
  absorber.position.y = mouse.position.y;
52
57
  }
@@ -1,8 +1,9 @@
1
1
  import { executeOnSingleOrMultiple, isArray, } from "@tsparticles/engine";
2
2
  import { Absorber } from "./Options/Classes/Absorber.js";
3
3
  export class AbsorbersPlugin {
4
+ id = "absorbers";
5
+ _instancesManager;
4
6
  constructor(instancesManager) {
5
- this.id = "absorbers";
6
7
  this._instancesManager = instancesManager;
7
8
  }
8
9
  async getPlugin(container) {
@@ -1,5 +1,7 @@
1
1
  import { executeOnSingleOrMultiple, isArray, } from "@tsparticles/engine";
2
2
  export class AbsorbersPluginInstance {
3
+ _container;
4
+ _instancesManager;
3
5
  constructor(container, instancesManager) {
4
6
  this._container = container;
5
7
  this._instancesManager = instancesManager;
@@ -1,6 +1,16 @@
1
1
  import { OptionsColor, isNull, setRangeValue, } from "@tsparticles/engine";
2
+ import { AbsorberLife } from "./AbsorberLife.js";
2
3
  import { AbsorberSize } from "./AbsorberSize.js";
3
4
  export class Absorber {
5
+ color;
6
+ destroy;
7
+ draggable;
8
+ life;
9
+ name;
10
+ opacity;
11
+ orbits;
12
+ position;
13
+ size;
4
14
  constructor() {
5
15
  this.color = new OptionsColor();
6
16
  this.color.value = "#000000";
@@ -8,6 +18,7 @@ export class Absorber {
8
18
  this.opacity = 1;
9
19
  this.destroy = true;
10
20
  this.orbits = false;
21
+ this.life = new AbsorberLife();
11
22
  this.size = new AbsorberSize();
12
23
  }
13
24
  load(data) {
@@ -20,6 +31,9 @@ export class Absorber {
20
31
  if (data.draggable !== undefined) {
21
32
  this.draggable = data.draggable;
22
33
  }
34
+ if (data.life !== undefined) {
35
+ this.life.load(data.life);
36
+ }
23
37
  this.name = data.name;
24
38
  if (data.opacity !== undefined) {
25
39
  this.opacity = data.opacity;
@@ -0,0 +1,27 @@
1
+ import { isNull, setRangeValue } from "@tsparticles/engine";
2
+ export class AbsorberLife {
3
+ count;
4
+ delay;
5
+ duration;
6
+ wait;
7
+ constructor() {
8
+ this.wait = false;
9
+ }
10
+ load(data) {
11
+ if (isNull(data)) {
12
+ return;
13
+ }
14
+ if (data.count !== undefined) {
15
+ this.count = data.count;
16
+ }
17
+ if (data.delay !== undefined) {
18
+ this.delay = setRangeValue(data.delay);
19
+ }
20
+ if (data.duration !== undefined) {
21
+ this.duration = setRangeValue(data.duration);
22
+ }
23
+ if (data.wait !== undefined) {
24
+ this.wait = data.wait;
25
+ }
26
+ }
27
+ }
@@ -1,6 +1,8 @@
1
1
  import { ValueWithRandom, isNull, isNumber } from "@tsparticles/engine";
2
2
  import { AbsorberSizeLimit } from "./AbsorberSizeLimit.js";
3
3
  export class AbsorberSize extends ValueWithRandom {
4
+ density;
5
+ limit;
4
6
  constructor() {
5
7
  super();
6
8
  this.density = 5;
@@ -1,5 +1,7 @@
1
1
  import { isNull } from "@tsparticles/engine";
2
2
  export class AbsorberSizeLimit {
3
+ mass;
4
+ radius;
3
5
  constructor() {
4
6
  this.radius = 0;
5
7
  this.mass = 0;
@@ -0,0 +1 @@
1
+ export {};
package/cjs/index.js CHANGED
@@ -1,10 +1,14 @@
1
1
  export async function loadAbsorbersPlugin(engine) {
2
- engine.checkVersion("4.0.0-alpha.8");
3
- await engine.register(async (e) => {
4
- const { loadInteractivityPlugin } = await import("@tsparticles/plugin-interactivity"), { AbsorbersInstancesManager } = await import("./AbsorbersInstancesManager.js"), { AbsorbersPlugin } = await import("./AbsorbersPlugin.js"), instancesManager = new AbsorbersInstancesManager(e);
5
- await loadInteractivityPlugin(e);
6
- e.addPlugin(new AbsorbersPlugin(instancesManager));
7
- e.addInteractor?.("externalAbsorbers", async (container) => {
2
+ engine.checkVersion("4.0.0-beta.1");
3
+ await engine.pluginManager.register(async (e) => {
4
+ const [{ ensureInteractivityPluginLoaded }, { AbsorbersInstancesManager }, { AbsorbersPlugin },] = await Promise.all([
5
+ import("@tsparticles/plugin-interactivity"),
6
+ import("./AbsorbersInstancesManager.js"),
7
+ import("./AbsorbersPlugin.js"),
8
+ ]), pluginManager = e.pluginManager, instancesManager = new AbsorbersInstancesManager(pluginManager);
9
+ ensureInteractivityPluginLoaded(e);
10
+ pluginManager.addPlugin(new AbsorbersPlugin(instancesManager));
11
+ pluginManager.addInteractor?.("externalAbsorbers", async (container) => {
8
12
  const { AbsorbersInteractor } = await import("./AbsorbersInteractor.js");
9
13
  return new AbsorbersInteractor(container, instancesManager);
10
14
  });
@@ -4,7 +4,7 @@
4
4
  * Demo / Generator : https://particles.js.org/
5
5
  * GitHub : https://www.github.com/matteobruni/tsparticles
6
6
  * How to use? : Check the GitHub README
7
- * v4.0.0-alpha.8
7
+ * v4.0.0-beta.1
8
8
  */
9
9
  "use strict";
10
10
  /*
@@ -23,7 +23,7 @@
23
23
  \******************************************/
24
24
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
25
25
 
26
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberInstance: () => (/* binding */ AbsorberInstance)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Absorber.js */ \"./dist/browser/Options/Classes/Absorber.js\");\n\n\nconst squareExp = 2,\n absorbFactor = 0.033,\n minOrbitLength = 0,\n minRadius = 0,\n minMass = 0,\n minAngle = 0,\n maxAngle = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.doublePI,\n minVelocity = 0;\nclass AbsorberInstance {\n constructor(engine, container, options, position) {\n this._calcPosition = () => {\n const exactPosition = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.calcPositionOrRandomFromSizeRanged)({\n size: this._container.canvas.size,\n position: this.options.position\n });\n return _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.create(exactPosition.x, exactPosition.y);\n };\n this._updateParticlePosition = (particle, v) => {\n if (particle.destroyed) {\n return;\n }\n const container = this._container,\n canvasSize = container.canvas.size;\n if (particle.needsNewPosition) {\n const newPosition = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.calcPositionOrRandomFromSize)({\n size: canvasSize\n });\n particle.position.setTo(newPosition);\n particle.velocity.setTo(particle.initialVelocity);\n particle.absorberOrbit = undefined;\n particle.needsNewPosition = false;\n }\n if (this.options.orbits) {\n if (particle.absorberOrbit === undefined) {\n particle.absorberOrbit = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin;\n particle.absorberOrbit.length = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getDistance)(particle.getPosition(), this.position);\n particle.absorberOrbit.angle = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRandom)() * maxAngle;\n }\n if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {\n const minSize = Math.min(canvasSize.width, canvasSize.height),\n offset = 1,\n randomOffset = 0.1,\n randomFactor = 0.2;\n particle.absorberOrbit.length = minSize * (offset + ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRandom)() * randomFactor - randomOffset));\n }\n particle.absorberOrbitDirection ??= particle.velocity.x >= minVelocity ? _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.RotateDirection.clockwise : _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.RotateDirection.counterClockwise;\n const orbitRadius = particle.absorberOrbit.length,\n orbitAngle = particle.absorberOrbit.angle,\n orbitDirection = particle.absorberOrbitDirection;\n particle.velocity.setTo(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin);\n const updateFunc = {\n x: orbitDirection === _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.RotateDirection.clockwise ? Math.cos : Math.sin,\n y: orbitDirection === _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.RotateDirection.clockwise ? Math.sin : Math.cos\n };\n particle.position.x = this.position.x + orbitRadius * updateFunc.x(orbitAngle);\n particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);\n particle.absorberOrbit.length -= v.length;\n particle.absorberOrbit.angle += (particle.retina.moveSpeed ?? minVelocity) * container.retina.pixelRatio / _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.percentDenominator * container.retina.reduceFactor;\n } else {\n const addV = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin;\n addV.length = v.length;\n addV.angle = v.angle;\n particle.velocity.addTo(addV);\n }\n };\n this._container = container;\n this._engine = engine;\n this.initialPosition = position ? _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.create(position.x, position.y) : undefined;\n if (options instanceof _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__.Absorber) {\n this.options = options;\n } else {\n this.options = new _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__.Absorber();\n this.options.load(options);\n }\n this.name = this.options.name;\n this.opacity = this.options.opacity;\n this.size = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.size.value) * container.retina.pixelRatio;\n this.mass = this.size * this.options.size.density * container.retina.reduceFactor;\n const limit = this.options.size.limit;\n this.limit = {\n radius: limit.radius * container.retina.pixelRatio * container.retina.reduceFactor,\n mass: limit.mass\n };\n this.color = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.rangeColorToRgb)(this._engine, this.options.color) ?? {\n b: 0,\n g: 0,\n r: 0\n };\n this.position = this.initialPosition?.copy() ?? this._calcPosition();\n }\n attract(particle, delta) {\n const container = this._container,\n options = this.options,\n pos = particle.getPosition(),\n {\n dx,\n dy,\n distance\n } = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getDistances)(this.position, pos),\n v = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.create(dx, dy);\n v.length = this.mass / Math.pow(distance, squareExp) * container.retina.reduceFactor;\n if (distance < this.size + particle.getRadius()) {\n const sizeFactor = particle.getRadius() * absorbFactor * container.retina.pixelRatio * delta.factor;\n if (this.size > particle.getRadius() && distance < this.size - particle.getRadius() || particle.absorberOrbit !== undefined && particle.absorberOrbit.length < minOrbitLength) {\n if (options.destroy) {\n particle.destroy();\n } else {\n particle.needsNewPosition = true;\n this._updateParticlePosition(particle, v);\n }\n } else {\n if (options.destroy) {\n particle.size.value -= sizeFactor;\n }\n this._updateParticlePosition(particle, v);\n }\n if (this.limit.radius <= minRadius || this.size < this.limit.radius) {\n this.size += sizeFactor;\n }\n if (this.limit.mass <= minMass || this.mass < this.limit.mass) {\n this.mass += sizeFactor * this.options.size.density * container.retina.reduceFactor;\n }\n } else {\n this._updateParticlePosition(particle, v);\n }\n }\n draw(context) {\n context.translate(this.position.x, this.position.y);\n context.beginPath();\n context.arc(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.originPoint.x, _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.originPoint.y, this.size, minAngle, maxAngle, false);\n context.closePath();\n context.fillStyle = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getStyleFromRgb)(this.color, this._container.hdr, this.opacity);\n context.fill();\n }\n resize() {\n const initialPosition = this.initialPosition;\n this.position = initialPosition && (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isPointInside)(initialPosition, this._container.canvas.size, _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin) ? initialPosition : this._calcPosition();\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/AbsorberInstance.js?\n}");
26
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberInstance: () => (/* binding */ AbsorberInstance)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Absorber.js */ \"./dist/browser/Options/Classes/Absorber.js\");\n\n\nconst squareExp = 2, absorbFactor = 0.033, minOrbitLength = 0, minRadius = 0, minMass = 0, minAngle = 0, maxAngle = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.doublePI, maxDegreeAngle = 360, angleIncrementFactor = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.identity / maxDegreeAngle, minVelocity = 0, defaultLifeDelay = 0, minLifeCount = 0, defaultSpawnDelay = 0, defaultLifeCount = -1;\nclass AbsorberInstance {\n color;\n limit;\n mass;\n name;\n opacity;\n options;\n position;\n size;\n _container;\n _currentDuration;\n _currentSpawnDelay;\n _duration;\n _firstSpawn;\n _immortal;\n _lifeCount;\n _pluginManager;\n _spawnDelay;\n initialPosition;\n constructor(pluginManager, container, options, position){\n this._container = container;\n this._pluginManager = pluginManager;\n this._currentDuration = 0;\n this._currentSpawnDelay = 0;\n this.initialPosition = position ? _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.create(position.x, position.y) : undefined;\n if (options instanceof _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__.Absorber) {\n this.options = options;\n } else {\n this.options = new _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__.Absorber();\n this.options.load(options);\n }\n this.name = this.options.name;\n this.opacity = this.options.opacity;\n this.size = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.size.value) * container.retina.pixelRatio;\n this.mass = this.size * this.options.size.density * container.retina.reduceFactor;\n const limit = this.options.size.limit;\n this.limit = {\n radius: limit.radius * container.retina.pixelRatio * container.retina.reduceFactor,\n mass: limit.mass\n };\n this.color = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.rangeColorToRgb)(this._pluginManager, this.options.color) ?? {\n b: 0,\n g: 0,\n r: 0\n };\n this.position = this.initialPosition?.copy() ?? this._calcPosition();\n this._firstSpawn = !this.options.life.wait;\n this._lifeCount = this.options.life.count ?? defaultLifeCount;\n this._immortal = this._lifeCount <= minLifeCount;\n this._spawnDelay = container.retina.reduceFactor ? (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.life.delay ?? defaultLifeDelay) * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.millisecondsToSeconds / container.retina.reduceFactor : Infinity;\n }\n attract(particle, delta) {\n const container = this._container, options = this.options, pos = particle.getPosition(), { dx, dy, distance } = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getDistances)(this.position, pos), v = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.create(dx, dy);\n v.length = this.mass / Math.pow(distance, squareExp) * container.retina.reduceFactor;\n if (distance < this.size + particle.getRadius()) {\n const sizeFactor = particle.getRadius() * absorbFactor * container.retina.pixelRatio * delta.factor;\n if (this.size > particle.getRadius() && distance < this.size - particle.getRadius() || particle.absorberOrbit !== undefined && particle.absorberOrbit.length < minOrbitLength) {\n if (options.destroy) {\n particle.destroy();\n } else {\n particle.needsNewPosition = true;\n this._updateParticlePosition(particle, delta, v);\n }\n } else {\n if (options.destroy) {\n particle.size.value -= sizeFactor;\n }\n this._updateParticlePosition(particle, delta, v);\n }\n if (this.limit.radius <= minRadius || this.size < this.limit.radius) {\n this.size += sizeFactor;\n }\n if (this.limit.mass <= minMass || this.mass < this.limit.mass) {\n this.mass += sizeFactor * this.options.size.density * container.retina.reduceFactor;\n }\n } else {\n this._updateParticlePosition(particle, delta, v);\n }\n }\n draw(context) {\n context.translate(this.position.x, this.position.y);\n context.beginPath();\n context.arc(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.originPoint.x, _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.originPoint.y, this.size, minAngle, maxAngle, false);\n context.closePath();\n context.fillStyle = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getStyleFromRgb)(this.color, this._container.hdr, this.opacity);\n context.fill();\n }\n resize() {\n const initialPosition = this.initialPosition;\n this.position = initialPosition && (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isPointInside)(initialPosition, this._container.canvas.size, _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin) ? initialPosition : this._calcPosition();\n }\n update(delta) {\n if (this._firstSpawn) {\n this._firstSpawn = false;\n this._currentSpawnDelay = this._spawnDelay ?? defaultSpawnDelay;\n }\n if (this._duration !== undefined) {\n this._currentDuration += delta.value;\n if (this._currentDuration >= this._duration) {\n if (!this._immortal) {\n this._lifeCount--;\n }\n if (this._lifeCount > minLifeCount || this._immortal) {\n this.position = this._calcPosition();\n this._spawnDelay = this._container.retina.reduceFactor ? (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.life.delay ?? defaultLifeDelay) * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.millisecondsToSeconds / this._container.retina.reduceFactor : Infinity;\n }\n this._currentDuration -= this._duration;\n delete this._duration;\n }\n }\n if (this._spawnDelay !== undefined) {\n this._currentSpawnDelay += delta.value;\n if (this._currentSpawnDelay >= this._spawnDelay) {\n this.play();\n this._currentSpawnDelay -= this._spawnDelay;\n delete this._spawnDelay;\n }\n }\n }\n _calcPosition = ()=>{\n const exactPosition = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.calcPositionOrRandomFromSizeRanged)({\n size: this._container.canvas.size,\n position: this.options.position\n });\n return _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.create(exactPosition.x, exactPosition.y);\n };\n _prepareToDie = ()=>{\n const duration = this.options.life.duration !== undefined ? (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.life.duration) : undefined, minDuration = 0;\n if ((this._lifeCount > minLifeCount || this._immortal) && duration !== undefined && duration > minDuration) {\n this._duration = duration * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.millisecondsToSeconds;\n }\n };\n _updateParticlePosition = (particle, delta, v)=>{\n if (particle.destroyed) {\n return;\n }\n const container = this._container, canvasSize = container.canvas.size;\n if (particle.needsNewPosition) {\n const newPosition = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.calcPositionOrRandomFromSize)({\n size: canvasSize\n });\n particle.position.setTo(newPosition);\n particle.velocity.setTo(particle.initialVelocity);\n particle.absorberOrbit = undefined;\n particle.needsNewPosition = false;\n }\n if (this.options.orbits) {\n if (particle.absorberOrbit === undefined) {\n particle.absorberOrbit = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin;\n particle.absorberOrbit.length = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getDistance)(particle.getPosition(), this.position);\n particle.absorberOrbit.angle = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRandom)() * maxAngle;\n }\n if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {\n const minSize = Math.min(canvasSize.width, canvasSize.height), offset = 1, randomOffset = 0.1, randomFactor = 0.2;\n particle.absorberOrbit.length = minSize * (offset + ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRandom)() * randomFactor - randomOffset));\n }\n particle.absorberOrbitDirection ??= particle.velocity.x >= minVelocity ? _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.RotateDirection.clockwise : _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.RotateDirection.counterClockwise;\n const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;\n particle.velocity.setTo(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin);\n const maxSize = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeMax)(particle.options.size.value) * container.retina.pixelRatio, sizeFactor = particle.options.move.size ? particle.getRadius() / maxSize : _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.identity, deltaFactor = delta.factor || _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.identity, baseSpeed = particle.retina.moveSpeed, moveSpeed = baseSpeed * sizeFactor * deltaFactor * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.half;\n particle.position.x = this.position.x + orbitRadius * Math.cos(orbitAngle);\n particle.position.y = this.position.y + orbitRadius * (orbitDirection === _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.RotateDirection.clockwise ? _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.identity : -_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.identity) * Math.sin(orbitAngle);\n particle.absorberOrbit.length = Math.max(minOrbitLength, particle.absorberOrbit.length - v.length);\n particle.absorberOrbit.angle += moveSpeed * angleIncrementFactor * container.retina.reduceFactor;\n } else {\n particle.velocity.addTo(v);\n }\n };\n play = ()=>{\n if (!((this._lifeCount > minLifeCount || this._immortal || !this.options.life.count) && (this._firstSpawn || this._currentSpawnDelay >= (this._spawnDelay ?? defaultSpawnDelay)))) {\n return;\n }\n if (this._lifeCount > minLifeCount || this._immortal) {\n this._prepareToDie();\n }\n };\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/AbsorberInstance.js?\n}");
27
27
 
28
28
  /***/ },
29
29
 
@@ -33,7 +33,17 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
33
33
  \**************************************************/
34
34
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
35
35
 
36
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Absorber: () => (/* binding */ Absorber)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _AbsorberSize_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberSize.js */ \"./dist/browser/Options/Classes/AbsorberSize.js\");\n\n\nclass Absorber {\n constructor() {\n this.color = new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.OptionsColor();\n this.color.value = \"#000000\";\n this.draggable = false;\n this.opacity = 1;\n this.destroy = true;\n this.orbits = false;\n this.size = new _AbsorberSize_js__WEBPACK_IMPORTED_MODULE_1__.AbsorberSize();\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n if (data.color !== undefined) {\n this.color = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.OptionsColor.create(this.color, data.color);\n }\n if (data.draggable !== undefined) {\n this.draggable = data.draggable;\n }\n this.name = data.name;\n if (data.opacity !== undefined) {\n this.opacity = data.opacity;\n }\n if (data.position !== undefined) {\n this.position = {};\n if (data.position.x !== undefined) {\n this.position.x = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.position.x);\n }\n if (data.position.y !== undefined) {\n this.position.y = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.position.y);\n }\n }\n if (data.size !== undefined) {\n this.size.load(data.size);\n }\n if (data.destroy !== undefined) {\n this.destroy = data.destroy;\n }\n if (data.orbits !== undefined) {\n this.orbits = data.orbits;\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/Absorber.js?\n}");
36
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Absorber: () => (/* binding */ Absorber)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _AbsorberLife_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberLife.js */ \"./dist/browser/Options/Classes/AbsorberLife.js\");\n/* harmony import */ var _AbsorberSize_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbsorberSize.js */ \"./dist/browser/Options/Classes/AbsorberSize.js\");\n\n\n\nclass Absorber {\n color;\n destroy;\n draggable;\n life;\n name;\n opacity;\n orbits;\n position;\n size;\n constructor(){\n this.color = new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.OptionsColor();\n this.color.value = \"#000000\";\n this.draggable = false;\n this.opacity = 1;\n this.destroy = true;\n this.orbits = false;\n this.life = new _AbsorberLife_js__WEBPACK_IMPORTED_MODULE_1__.AbsorberLife();\n this.size = new _AbsorberSize_js__WEBPACK_IMPORTED_MODULE_2__.AbsorberSize();\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n if (data.color !== undefined) {\n this.color = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.OptionsColor.create(this.color, data.color);\n }\n if (data.draggable !== undefined) {\n this.draggable = data.draggable;\n }\n if (data.life !== undefined) {\n this.life.load(data.life);\n }\n this.name = data.name;\n if (data.opacity !== undefined) {\n this.opacity = data.opacity;\n }\n if (data.position !== undefined) {\n this.position = {};\n if (data.position.x !== undefined) {\n this.position.x = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.position.x);\n }\n if (data.position.y !== undefined) {\n this.position.y = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.position.y);\n }\n }\n if (data.size !== undefined) {\n this.size.load(data.size);\n }\n if (data.destroy !== undefined) {\n this.destroy = data.destroy;\n }\n if (data.orbits !== undefined) {\n this.orbits = data.orbits;\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/Absorber.js?\n}");
37
+
38
+ /***/ },
39
+
40
+ /***/ "./dist/browser/Options/Classes/AbsorberLife.js"
41
+ /*!******************************************************!*\
42
+ !*** ./dist/browser/Options/Classes/AbsorberLife.js ***!
43
+ \******************************************************/
44
+ (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
45
+
46
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberLife: () => (/* binding */ AbsorberLife)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nclass AbsorberLife {\n count;\n delay;\n duration;\n wait;\n constructor(){\n this.wait = false;\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n if (data.count !== undefined) {\n this.count = data.count;\n }\n if (data.delay !== undefined) {\n this.delay = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.delay);\n }\n if (data.duration !== undefined) {\n this.duration = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.duration);\n }\n if (data.wait !== undefined) {\n this.wait = data.wait;\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberLife.js?\n}");
37
47
 
38
48
  /***/ },
39
49
 
@@ -43,7 +53,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
43
53
  \******************************************************/
44
54
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
45
55
 
46
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSize: () => (/* binding */ AbsorberSize)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberSizeLimit.js */ \"./dist/browser/Options/Classes/AbsorberSizeLimit.js\");\n\n\nclass AbsorberSize extends _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.ValueWithRandom {\n constructor() {\n super();\n this.density = 5;\n this.value = 50;\n this.limit = new _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__.AbsorberSizeLimit();\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n super.load(data);\n if (data.density !== undefined) {\n this.density = data.density;\n }\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNumber)(data.limit)) {\n this.limit.radius = data.limit;\n } else {\n this.limit.load(data.limit);\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberSize.js?\n}");
56
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSize: () => (/* binding */ AbsorberSize)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberSizeLimit.js */ \"./dist/browser/Options/Classes/AbsorberSizeLimit.js\");\n\n\nclass AbsorberSize extends _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.ValueWithRandom {\n density;\n limit;\n constructor(){\n super();\n this.density = 5;\n this.value = 50;\n this.limit = new _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__.AbsorberSizeLimit();\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n super.load(data);\n if (data.density !== undefined) {\n this.density = data.density;\n }\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNumber)(data.limit)) {\n this.limit.radius = data.limit;\n } else {\n this.limit.load(data.limit);\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberSize.js?\n}");
47
57
 
48
58
  /***/ },
49
59
 
@@ -53,7 +63,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
53
63
  \***********************************************************/
54
64
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
55
65
 
56
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSizeLimit: () => (/* binding */ AbsorberSizeLimit)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nclass AbsorberSizeLimit {\n constructor() {\n this.radius = 0;\n this.mass = 0;\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n if (data.mass !== undefined) {\n this.mass = data.mass;\n }\n if (data.radius !== undefined) {\n this.radius = data.radius;\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberSizeLimit.js?\n}");
66
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSizeLimit: () => (/* binding */ AbsorberSizeLimit)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nclass AbsorberSizeLimit {\n mass;\n radius;\n constructor(){\n this.radius = 0;\n this.mass = 0;\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n if (data.mass !== undefined) {\n this.mass = data.mass;\n }\n if (data.radius !== undefined) {\n this.radius = data.radius;\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberSizeLimit.js?\n}");
57
67
 
58
68
  /***/ }
59
69
 
@@ -4,7 +4,7 @@
4
4
  * Demo / Generator : https://particles.js.org/
5
5
  * GitHub : https://www.github.com/matteobruni/tsparticles
6
6
  * How to use? : Check the GitHub README
7
- * v4.0.0-alpha.8
7
+ * v4.0.0-beta.1
8
8
  */
9
9
  "use strict";
10
10
  /*
@@ -23,7 +23,7 @@
23
23
  \***************************************************/
24
24
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
25
25
 
26
- eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorbersInstancesManager: () => (/* binding */ AbsorbersInstancesManager)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nconst defaultIndex = 0;\nclass AbsorbersInstancesManager {\n constructor(engine) {\n this._containerArrays = new Map();\n this._engine = engine;\n }\n async addAbsorber(container, options, position) {\n const {\n AbsorberInstance\n } = await __webpack_require__.e(/*! import() */ \"dist_browser_AbsorberInstance_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./AbsorberInstance.js */ \"./dist/browser/AbsorberInstance.js\")),\n absorber = new AbsorberInstance(this._engine, container, options, position),\n array = this.getArray(container);\n array.push(absorber);\n return absorber;\n }\n clear(container) {\n this.initContainer(container);\n this._containerArrays.set(container, []);\n }\n getArray(container) {\n this.initContainer(container);\n let array = this._containerArrays.get(container);\n if (!array) {\n array = [];\n this._containerArrays.set(container, array);\n }\n return array;\n }\n initContainer(container) {\n if (this._containerArrays.has(container)) {\n return;\n }\n this._containerArrays.set(container, []);\n container.getAbsorber ??= idxOrName => {\n const array = this.getArray(container);\n return idxOrName === undefined || (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNumber)(idxOrName) ? array[idxOrName ?? defaultIndex] : array.find(t => t.name === idxOrName);\n };\n container.addAbsorber ??= (options, position) => {\n return this.addAbsorber(container, options, position);\n };\n }\n removeAbsorber(container, absorber) {\n const index = this.getArray(container).indexOf(absorber),\n deleteCount = 1;\n if (index >= defaultIndex) {\n this.getArray(container).splice(index, deleteCount);\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/AbsorbersInstancesManager.js?\n}");
26
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorbersInstancesManager: () => (/* binding */ AbsorbersInstancesManager)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nconst defaultIndex = 0;\nclass AbsorbersInstancesManager {\n _containerArrays;\n _pluginManager;\n constructor(pluginManager){\n this._pluginManager = pluginManager;\n this._containerArrays = new Map();\n }\n async addAbsorber(container, options, position) {\n const { AbsorberInstance } = await __webpack_require__.e(/*! import() */ \"dist_browser_AbsorberInstance_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./AbsorberInstance.js */ \"./dist/browser/AbsorberInstance.js\")), absorber = new AbsorberInstance(this._pluginManager, container, options, position), array = this.getArray(container);\n array.push(absorber);\n return absorber;\n }\n clear(container) {\n this.initContainer(container);\n this._containerArrays.set(container, []);\n }\n getArray(container) {\n this.initContainer(container);\n let array = this._containerArrays.get(container);\n if (!array) {\n array = [];\n this._containerArrays.set(container, array);\n }\n return array;\n }\n initContainer(container) {\n if (this._containerArrays.has(container)) {\n return;\n }\n this._containerArrays.set(container, []);\n container.getAbsorber ??= (idxOrName)=>{\n const array = this.getArray(container);\n return idxOrName === undefined || (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNumber)(idxOrName) ? array[idxOrName ?? defaultIndex] : array.find((t)=>t.name === idxOrName);\n };\n container.addAbsorber ??= (options, position)=>{\n return this.addAbsorber(container, options, position);\n };\n }\n removeAbsorber(container, absorber) {\n const index = this.getArray(container).indexOf(absorber), deleteCount = 1;\n if (index >= defaultIndex) {\n this.getArray(container).splice(index, deleteCount);\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/AbsorbersInstancesManager.js?\n}");
27
27
 
28
28
  /***/ }
29
29