@tsparticles/engine 4.0.0-alpha.25 → 4.0.0-alpha.27

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 (140) hide show
  1. package/164.min.js +1 -0
  2. package/README.md +3 -3
  3. package/browser/Core/Canvas.js +7 -4
  4. package/browser/Core/Engine.js +6 -16
  5. package/browser/Core/Particle.js +10 -35
  6. package/browser/Core/Particles.js +0 -23
  7. package/browser/Core/Utils/Constants.js +1 -1
  8. package/browser/Core/Utils/Ranges.js +2 -2
  9. package/browser/Core/Utils/Vectors.js +10 -7
  10. package/browser/Options/Classes/ColorAnimation.js +11 -1
  11. package/browser/Options/Classes/HslAnimation.js +4 -3
  12. package/browser/Options/Classes/Options.js +38 -1
  13. package/browser/Options/Classes/Particles/Effect/Effect.js +0 -5
  14. package/browser/Options/Classes/Particles/Fill.js +28 -0
  15. package/browser/Options/Classes/Particles/Move/Move.js +0 -4
  16. package/browser/Options/Classes/Particles/ParticlesOptions.js +12 -6
  17. package/browser/Options/Classes/Particles/Shape/Shape.js +0 -5
  18. package/browser/Utils/CanvasUtils.js +33 -36
  19. package/browser/Utils/ColorUtils.js +22 -19
  20. package/browser/Utils/MathUtils.js +8 -1
  21. package/browser/Utils/Utils.js +93 -24
  22. package/browser/exports.js +1 -1
  23. package/cjs/Core/Canvas.js +7 -4
  24. package/cjs/Core/Engine.js +6 -16
  25. package/cjs/Core/Particle.js +10 -35
  26. package/cjs/Core/Particles.js +0 -23
  27. package/cjs/Core/Utils/Constants.js +1 -1
  28. package/cjs/Core/Utils/Ranges.js +2 -2
  29. package/cjs/Core/Utils/Vectors.js +10 -7
  30. package/cjs/Options/Classes/ColorAnimation.js +11 -1
  31. package/cjs/Options/Classes/HslAnimation.js +4 -3
  32. package/cjs/Options/Classes/Options.js +38 -1
  33. package/cjs/Options/Classes/Particles/Effect/Effect.js +0 -5
  34. package/cjs/Options/Classes/Particles/Fill.js +28 -0
  35. package/cjs/Options/Classes/Particles/Move/Move.js +0 -4
  36. package/cjs/Options/Classes/Particles/ParticlesOptions.js +12 -6
  37. package/cjs/Options/Classes/Particles/Shape/Shape.js +0 -5
  38. package/cjs/Utils/CanvasUtils.js +33 -36
  39. package/cjs/Utils/ColorUtils.js +22 -19
  40. package/cjs/Utils/MathUtils.js +8 -1
  41. package/cjs/Utils/Utils.js +93 -24
  42. package/cjs/exports.js +1 -1
  43. package/dist_browser_Core_Container_js.js +4 -4
  44. package/esm/Core/Canvas.js +7 -4
  45. package/esm/Core/Engine.js +6 -16
  46. package/esm/Core/Particle.js +10 -35
  47. package/esm/Core/Particles.js +0 -23
  48. package/esm/Core/Utils/Constants.js +1 -1
  49. package/esm/Core/Utils/Ranges.js +2 -2
  50. package/esm/Core/Utils/Vectors.js +10 -7
  51. package/esm/Options/Classes/ColorAnimation.js +11 -1
  52. package/esm/Options/Classes/HslAnimation.js +4 -3
  53. package/esm/Options/Classes/Options.js +38 -1
  54. package/esm/Options/Classes/Particles/Effect/Effect.js +0 -5
  55. package/esm/Options/Classes/Particles/Fill.js +28 -0
  56. package/esm/Options/Classes/Particles/Move/Move.js +0 -4
  57. package/esm/Options/Classes/Particles/ParticlesOptions.js +12 -6
  58. package/esm/Options/Classes/Particles/Shape/Shape.js +0 -5
  59. package/esm/Utils/CanvasUtils.js +33 -36
  60. package/esm/Utils/ColorUtils.js +22 -19
  61. package/esm/Utils/MathUtils.js +8 -1
  62. package/esm/Utils/Utils.js +93 -24
  63. package/esm/exports.js +1 -1
  64. package/package.json +1 -1
  65. package/report.html +1 -1
  66. package/scripts/install.js +4 -20
  67. package/tsparticles.engine.js +34 -34
  68. package/tsparticles.engine.min.js +2 -2
  69. package/types/Core/Engine.d.ts +5 -9
  70. package/types/Core/Interfaces/IPalette.d.ts +7 -0
  71. package/types/Core/Interfaces/IParticleOpacityData.d.ts +1 -0
  72. package/types/Core/Interfaces/IParticleValueAnimation.d.ts +3 -3
  73. package/types/Core/Interfaces/IShapeValues.d.ts +0 -1
  74. package/types/Core/Particle.d.ts +3 -7
  75. package/types/Core/Particles.d.ts +0 -5
  76. package/types/Core/Utils/Constants.d.ts +1 -1
  77. package/types/Core/Utils/Vectors.d.ts +6 -6
  78. package/types/Options/Classes/ColorAnimation.d.ts +3 -1
  79. package/types/Options/Classes/Options.d.ts +2 -0
  80. package/types/Options/Classes/Particles/Effect/Effect.d.ts +0 -1
  81. package/types/Options/Classes/Particles/Fill.d.ts +12 -0
  82. package/types/Options/Classes/Particles/Move/Move.d.ts +0 -2
  83. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +2 -2
  84. package/types/Options/Classes/Particles/Shape/Shape.d.ts +0 -1
  85. package/types/Options/Interfaces/IColorAnimation.d.ts +2 -0
  86. package/types/Options/Interfaces/IOptions.d.ts +1 -0
  87. package/types/Options/Interfaces/Particles/Effect/IEffect.d.ts +0 -1
  88. package/types/Options/Interfaces/Particles/IFill.d.ts +9 -0
  89. package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +2 -2
  90. package/types/Options/Interfaces/Particles/IStroke.d.ts +2 -2
  91. package/types/Options/Interfaces/Particles/Move/IMove.d.ts +0 -2
  92. package/types/Options/Interfaces/Particles/Shape/IShape.d.ts +0 -1
  93. package/types/Types/EngineInitializers.d.ts +0 -6
  94. package/types/Utils/CanvasUtils.d.ts +6 -7
  95. package/types/Utils/ColorUtils.d.ts +1 -2
  96. package/types/Utils/MathUtils.d.ts +2 -0
  97. package/types/Utils/Utils.d.ts +7 -0
  98. package/types/export-types.d.ts +2 -4
  99. package/types/exports.d.ts +1 -1
  100. package/umd/Core/Canvas.js +6 -3
  101. package/umd/Core/Engine.js +6 -16
  102. package/umd/Core/Particle.js +11 -36
  103. package/umd/Core/Particles.js +0 -23
  104. package/umd/Core/Utils/Constants.js +2 -2
  105. package/umd/Core/Utils/Ranges.js +1 -1
  106. package/umd/Core/Utils/Vectors.js +10 -7
  107. package/umd/Options/Classes/ColorAnimation.js +11 -1
  108. package/umd/Options/Classes/HslAnimation.js +5 -4
  109. package/umd/Options/Classes/Options.js +38 -1
  110. package/umd/Options/Classes/Particles/Effect/Effect.js +0 -5
  111. package/umd/Options/Classes/Particles/Fill.js +42 -0
  112. package/umd/Options/Classes/Particles/Move/Move.js +1 -5
  113. package/umd/Options/Classes/Particles/ParticlesOptions.js +13 -7
  114. package/umd/Options/Classes/Particles/Shape/Shape.js +0 -5
  115. package/umd/Utils/CanvasUtils.js +33 -36
  116. package/umd/Utils/ColorUtils.js +21 -18
  117. package/umd/Utils/MathUtils.js +10 -1
  118. package/umd/Utils/Utils.js +94 -24
  119. package/umd/exports.js +2 -2
  120. package/152.min.js +0 -1
  121. package/browser/Options/Classes/Particles/Move/MoveAttract.js +0 -36
  122. package/cjs/Options/Classes/Particles/Move/MoveAttract.js +0 -36
  123. package/esm/Core/Interfaces/IMovePathGenerator.js +0 -1
  124. package/esm/Core/Interfaces/IParticleMover.js +0 -1
  125. package/esm/Options/Classes/Particles/Move/MoveAttract.js +0 -36
  126. package/esm/Options/Interfaces/Particles/Move/IMoveAttract.js +0 -1
  127. package/types/Core/Interfaces/IMovePathGenerator.d.ts +0 -9
  128. package/types/Core/Interfaces/IParticleMover.d.ts +0 -7
  129. package/types/Options/Classes/Particles/Move/MoveAttract.d.ts +0 -12
  130. package/types/Options/Interfaces/Particles/Move/IMoveAttract.d.ts +0 -7
  131. package/umd/Options/Classes/Particles/Move/MoveAttract.js +0 -50
  132. package/umd/Options/Interfaces/Particles/Move/IMoveAttract.js +0 -12
  133. /package/browser/Core/Interfaces/{IMovePathGenerator.js → IPalette.js} +0 -0
  134. /package/browser/{Core/Interfaces/IParticleMover.js → Options/Interfaces/Particles/IFill.js} +0 -0
  135. /package/{browser/Options/Interfaces/Particles/Move/IMoveAttract.js → cjs/Core/Interfaces/IPalette.js} +0 -0
  136. /package/cjs/{Core/Interfaces/IMovePathGenerator.js → Options/Interfaces/Particles/IFill.js} +0 -0
  137. /package/{cjs/Core/Interfaces/IParticleMover.js → esm/Core/Interfaces/IPalette.js} +0 -0
  138. /package/{cjs/Options/Interfaces/Particles/Move/IMoveAttract.js → esm/Options/Interfaces/Particles/IFill.js} +0 -0
  139. /package/umd/Core/Interfaces/{IMovePathGenerator.js → IPalette.js} +0 -0
  140. /package/umd/{Core/Interfaces/IParticleMover.js → Options/Interfaces/Particles/IFill.js} +0 -0
@@ -57,13 +57,10 @@ export class Engine {
57
57
  effectDrawers = new Map();
58
58
  initializers = {
59
59
  effects: new Map(),
60
- movers: new Map(),
61
- pathGenerators: new Map(),
62
60
  shapes: new Map(),
63
61
  updaters: new Map(),
64
62
  };
65
- movers = new Map();
66
- pathGenerators = new Map();
63
+ palettes = new Map();
67
64
  plugins = [];
68
65
  presets = new Map();
69
66
  shapeDrawers = new Map();
@@ -87,7 +84,7 @@ export class Engine {
87
84
  return this._domArray;
88
85
  }
89
86
  get version() {
90
- return "4.0.0-alpha.25";
87
+ return "4.0.0-alpha.27";
91
88
  }
92
89
  addColorManager(name, manager) {
93
90
  this.colorManagers.set(name, manager);
@@ -109,15 +106,12 @@ export class Engine {
109
106
  addEventListener(type, listener) {
110
107
  this._eventDispatcher.addEventListener(type, listener);
111
108
  }
112
- addMover(name, moverInitializer) {
113
- this.initializers.movers.set(name, moverInitializer);
109
+ addPalette(name, palette) {
110
+ this.palettes.set(name, palette);
114
111
  }
115
112
  addParticleUpdater(name, updaterInitializer) {
116
113
  this.initializers.updaters.set(name, updaterInitializer);
117
114
  }
118
- addPathGenerator(name, generator) {
119
- this.initializers.pathGenerators.set(name, generator);
120
- }
121
115
  addPlugin(plugin) {
122
116
  if (this.getPlugin(plugin.id)) {
123
117
  return;
@@ -143,7 +137,6 @@ export class Engine {
143
137
  }
144
138
  clearPlugins(container) {
145
139
  this.effectDrawers.delete(container);
146
- this.movers.delete(container);
147
140
  this.shapeDrawers.delete(container);
148
141
  this.updaters.delete(container);
149
142
  }
@@ -156,11 +149,8 @@ export class Engine {
156
149
  getEffectDrawers(container, force = false) {
157
150
  return getItemMapFromInitializer(container, this.effectDrawers, this.initializers.effects, force);
158
151
  }
159
- getMovers(container, force = false) {
160
- return getItemsFromInitializer(container, this.movers, this.initializers.movers, force);
161
- }
162
- getPathGenerators(container, force = false) {
163
- return getItemMapFromInitializer(container, this.pathGenerators, this.initializers.pathGenerators, force);
152
+ getPalette(name) {
153
+ return this.palettes.get(name);
164
154
  }
165
155
  getPlugin(plugin) {
166
156
  return this.plugins.find(t => t.id === plugin);
@@ -1,8 +1,8 @@
1
1
  import { Vector, Vector3d } from "./Utils/Vectors.js";
2
2
  import { alterHsl, getHslFromAnimation } from "../Utils/ColorUtils.js";
3
3
  import { calcExactPositionOrRandomFromSize, clamp, degToRad, getParticleBaseVelocity, getParticleDirectionAngle, getRandom, getRangeValue, randomInRangeValue, setRangeValue, } from "../Utils/MathUtils.js";
4
- import { decayOffset, defaultAngle, defaultOpacity, defaultRetryCount, defaultTransform, double, doublePI, half, identity, millisecondsToSeconds, minZ, randomColorValue, squareExp, triple, tryCountIncrement, zIndexFactorOffset, } from "./Utils/Constants.js";
5
4
  import { deepExtend, getPosition, initParticleNumericAnimationValue, isInArray, itemFromSingleOrMultiple, } from "../Utils/Utils.js";
5
+ import { defaultAngle, defaultOpacity, defaultRetryCount, defaultTransform, double, doublePI, half, identity, minZ, randomColorValue, squareExp, triple, tryCountIncrement, zIndexFactorOffset, } from "./Utils/Constants.js";
6
6
  import { EventType } from "../Enums/Types/EventType.js";
7
7
  import { MoveDirection } from "../Enums/Directions/MoveDirection.js";
8
8
  import { OutMode } from "../Enums/Modes/OutMode.js";
@@ -12,14 +12,12 @@ function loadEffectData(effect, effectOptions, id, reduceDuplicates) {
12
12
  const effectData = effectOptions.options[effect];
13
13
  return deepExtend({
14
14
  close: effectOptions.close,
15
- fill: effectOptions.fill,
16
15
  }, itemFromSingleOrMultiple(effectData, id, reduceDuplicates));
17
16
  }
18
17
  function loadShapeData(shape, shapeOptions, id, reduceDuplicates) {
19
18
  const shapeData = shapeOptions.options[shape];
20
19
  return deepExtend({
21
20
  close: shapeOptions.close,
22
- fill: shapeOptions.fill,
23
21
  }, itemFromSingleOrMultiple(shapeData, id, reduceDuplicates));
24
22
  }
25
23
  function fixOutMode(data) {
@@ -38,13 +36,14 @@ export class Particle {
38
36
  container;
39
37
  backColor;
40
38
  bubble;
41
- color;
42
39
  destroyed;
43
40
  direction;
44
41
  effect;
45
42
  effectClose;
46
43
  effectData;
47
- effectFill;
44
+ fillColor;
45
+ fillEnabled;
46
+ fillOpacity;
48
47
  group;
49
48
  id;
50
49
  ignoresResizeRatio;
@@ -54,13 +53,10 @@ export class Particle {
54
53
  lastPathTime;
55
54
  misplaced;
56
55
  moveCenter;
57
- moveDecay;
58
56
  offset;
59
57
  opacity;
60
58
  options;
61
59
  outType;
62
- pathDelay;
63
- pathGenerator;
64
60
  pathRotation;
65
61
  position;
66
62
  randomIndexData;
@@ -70,7 +66,6 @@ export class Particle {
70
66
  shape;
71
67
  shapeClose;
72
68
  shapeData;
73
- shapeFill;
74
69
  sides;
75
70
  size;
76
71
  slow;
@@ -82,6 +77,7 @@ export class Particle {
82
77
  velocity;
83
78
  zIndexFactor;
84
79
  _cachedOpacityData = {
80
+ fillOpacity: defaultOpacity,
85
81
  opacity: defaultOpacity,
86
82
  strokeOpacity: defaultOpacity,
87
83
  };
@@ -105,7 +101,7 @@ export class Particle {
105
101
  this.destroyed = true;
106
102
  this.bubble.inRange = false;
107
103
  this.slow.inRange = false;
108
- const container = this.container, pathGenerator = this.pathGenerator, shapeDrawer = this.shape ? container.particles.shapeDrawers.get(this.shape) : undefined;
104
+ const container = this.container, shapeDrawer = this.shape ? container.particles.shapeDrawers.get(this.shape) : undefined;
109
105
  shapeDrawer?.particleDestroy?.(this);
110
106
  for (const plugin of container.particleDestroyedPlugins) {
111
107
  plugin.particleDestroyed?.(this, override);
@@ -113,7 +109,6 @@ export class Particle {
113
109
  for (const updater of container.particles.updaters) {
114
110
  updater.particleDestroyed?.(this, override);
115
111
  }
116
- pathGenerator?.reset(this);
117
112
  this._engine.dispatchEvent(EventType.particleDestroyed, {
118
113
  container: this.container,
119
114
  data: {
@@ -130,15 +125,16 @@ export class Particle {
130
125
  return this.rotation + (this.pathRotation ? this.velocity.angle : defaultAngle);
131
126
  }
132
127
  getFillColor() {
133
- return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.color));
128
+ return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.fillColor));
134
129
  }
135
130
  getMass() {
136
131
  return this.getRadius() ** squareExp * Math.PI * half;
137
132
  }
138
133
  getOpacity() {
139
- const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, opacity = this.bubble.opacity ?? getRangeValue(this.opacity?.value ?? defaultOpacity), strokeOpacity = this.strokeOpacity ?? opacity;
134
+ const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, opacity = this.bubble.opacity ?? getRangeValue(this.opacity?.value ?? defaultOpacity), fillOpacity = this.fillOpacity ?? defaultOpacity, strokeOpacity = this.strokeOpacity ?? defaultOpacity;
135
+ this._cachedOpacityData.fillOpacity = opacity * fillOpacity * zOpacityFactor;
140
136
  this._cachedOpacityData.opacity = opacity * zOpacityFactor;
141
- this._cachedOpacityData.strokeOpacity = strokeOpacity * zOpacityFactor;
137
+ this._cachedOpacityData.strokeOpacity = opacity * strokeOpacity * zOpacityFactor;
142
138
  return this._cachedOpacityData;
143
139
  }
144
140
  getPosition() {
@@ -176,9 +172,7 @@ export class Particle {
176
172
  this.id = id;
177
173
  this.group = group;
178
174
  this.effectClose = true;
179
- this.effectFill = true;
180
175
  this.shapeClose = true;
181
- this.shapeFill = true;
182
176
  this.pathRotation = false;
183
177
  this.lastPathTime = 0;
184
178
  this.destroyed = false;
@@ -230,24 +224,9 @@ export class Particle {
230
224
  if (shapeData) {
231
225
  particlesOptions.load(shapeData.particles);
232
226
  }
233
- this.effectFill = effectData?.fill ?? particlesOptions.effect.fill;
234
227
  this.effectClose = effectData?.close ?? particlesOptions.effect.close;
235
- this.shapeFill = shapeData?.fill ?? particlesOptions.shape.fill;
236
228
  this.shapeClose = shapeData?.close ?? particlesOptions.shape.close;
237
229
  this.options = particlesOptions;
238
- const pathOptions = this.options.move.path;
239
- this.pathDelay = getRangeValue(pathOptions.delay.value) * millisecondsToSeconds;
240
- if (pathOptions.generator) {
241
- let pathGenerator = this.container.particles.pathGenerators.get(pathOptions.generator);
242
- if (!pathGenerator) {
243
- pathGenerator = this.container.particles.availablePathGenerators.get(pathOptions.generator);
244
- if (pathGenerator) {
245
- this.container.particles.pathGenerators.set(pathOptions.generator, pathGenerator);
246
- pathGenerator.init();
247
- }
248
- }
249
- this.pathGenerator = pathGenerator;
250
- }
251
230
  container.retina.initParticle(this);
252
231
  this.size = initParticleNumericAnimationValue(this.options.size, pxRatio);
253
232
  this.bubble = {
@@ -260,7 +239,6 @@ export class Particle {
260
239
  this._initPosition(position);
261
240
  this.initialVelocity = this._calculateVelocity();
262
241
  this.velocity = this.initialVelocity.copy();
263
- this.moveDecay = decayOffset - getRangeValue(this.options.move.decay);
264
242
  const particles = container.particles;
265
243
  particles.setLastZIndex(this.position.z);
266
244
  this.zIndexFactor = this.position.z / container.zLayers;
@@ -286,9 +264,6 @@ export class Particle {
286
264
  for (const updater of particles.updaters) {
287
265
  updater.init(this);
288
266
  }
289
- for (const mover of particles.movers) {
290
- mover.init(this);
291
- }
292
267
  effectDrawer?.particleInit?.(container, this);
293
268
  shapeDrawer?.particleInit?.(container, this);
294
269
  for (const plugin of container.particleCreatedPlugins) {
@@ -6,12 +6,9 @@ import { SpatialHashGrid } from "./Utils/SpatialHashGrid.js";
6
6
  import { getLogger } from "../Utils/LogUtils.js";
7
7
  import { loadParticlesOptions } from "../Utils/OptionsUtils.js";
8
8
  export class Particles {
9
- availablePathGenerators;
10
9
  checkParticlePositionPlugins;
11
10
  effectDrawers;
12
11
  grid;
13
- movers;
14
- pathGenerators;
15
12
  shapeDrawers;
16
13
  updaters;
17
14
  _array;
@@ -45,9 +42,6 @@ export class Particles {
45
42
  this._maxZIndex = 0;
46
43
  this.grid = new SpatialHashGrid(spatialHashGridCellSize);
47
44
  this.effectDrawers = new Map();
48
- this.movers = [];
49
- this.availablePathGenerators = new Map();
50
- this.pathGenerators = new Map();
51
45
  this.shapeDrawers = new Map();
52
46
  this.updaters = [];
53
47
  this.checkParticlePositionPlugins = [];
@@ -123,9 +117,6 @@ export class Particles {
123
117
  this._pool.length = 0;
124
118
  this._zArray = [];
125
119
  this.effectDrawers = new Map();
126
- this.movers = [];
127
- this.availablePathGenerators = new Map();
128
- this.pathGenerators = new Map();
129
120
  this.shapeDrawers = new Map();
130
121
  this.updaters = [];
131
122
  this.checkParticlePositionPlugins = [];
@@ -217,14 +208,8 @@ export class Particles {
217
208
  async initPlugins() {
218
209
  const container = this._container;
219
210
  this.effectDrawers = await this._engine.getEffectDrawers(container, true);
220
- this.movers = await this._engine.getMovers(container, true);
221
- this.availablePathGenerators = await this._engine.getPathGenerators(container, true);
222
- this.pathGenerators = new Map();
223
211
  this.shapeDrawers = await this._engine.getShapeDrawers(container, true);
224
212
  this.updaters = await this._engine.getUpdaters(container, true);
225
- for (const pathGenerator of this.pathGenerators.values()) {
226
- pathGenerator.init();
227
- }
228
213
  }
229
214
  push(nb, position, overrideOptions, group) {
230
215
  for (let i = 0; i < nb; i++) {
@@ -281,9 +266,6 @@ export class Particles {
281
266
  update(delta) {
282
267
  const particlesToDelete = new Set();
283
268
  this.grid.clear();
284
- for (const pathGenerator of this.pathGenerators.values()) {
285
- pathGenerator.update();
286
- }
287
269
  for (const plugin of this._updatePlugins) {
288
270
  plugin.update?.(delta);
289
271
  }
@@ -305,11 +287,6 @@ export class Particles {
305
287
  }
306
288
  plugin.particleUpdate?.(particle, delta);
307
289
  }
308
- for (const mover of this.movers) {
309
- if (mover.isEnabled(particle)) {
310
- mover.move(particle, delta);
311
- }
312
- }
313
290
  if (particle.destroyed) {
314
291
  particlesToDelete.add(particle);
315
292
  continue;
@@ -1,4 +1,4 @@
1
- export const generatedAttribute = "generated", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
1
+ export const generatedAttribute = "generated", defaultCompositeValue = "source-over", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
2
2
  x: 0,
3
3
  y: 0,
4
4
  z: 0,
@@ -1,5 +1,5 @@
1
1
  import { RangeType } from "../../Enums/RangeType.js";
2
- import { getDistance } from "../../Utils/MathUtils.js";
2
+ import { checkDistance } from "../../Utils/MathUtils.js";
3
3
  import { squareExp } from "./Constants.js";
4
4
  export class BaseRange {
5
5
  position;
@@ -19,7 +19,7 @@ export class Circle extends BaseRange {
19
19
  this.radius = radius;
20
20
  }
21
21
  contains(point) {
22
- return getDistance(point, this.position) <= this.radius;
22
+ return checkDistance(point, this.position, this.radius);
23
23
  }
24
24
  intersects(range) {
25
25
  const pos1 = this.position, pos2 = range.position, distPos = { x: Math.abs(pos2.x - pos1.x), y: Math.abs(pos2.y - pos1.y) }, r = this.radius;
@@ -1,4 +1,7 @@
1
1
  import { inverseFactorNumerator, none, originPoint, squareExp } from "./Constants.js";
2
+ function getZ(source) {
3
+ return "z" in source ? source.z : originPoint.z;
4
+ }
2
5
  export class Vector3d {
3
6
  x;
4
7
  y;
@@ -24,21 +27,21 @@ export class Vector3d {
24
27
  this._updateFromAngle(this.angle, length);
25
28
  }
26
29
  static clone(source) {
27
- return Vector3d.create(source.x, source.y, source.z);
30
+ return Vector3d.create(source.x, source.y, getZ(source));
28
31
  }
29
32
  static create(x, y, z) {
30
33
  if (typeof x === "number") {
31
34
  return new Vector3d(x, y ?? originPoint.y, z ?? originPoint.z);
32
35
  }
33
- return new Vector3d(x.x, x.y, Object.hasOwn(x, "z") ? x.z : originPoint.z);
36
+ return new Vector3d(x.x, x.y, getZ(x));
34
37
  }
35
38
  add(v) {
36
- return Vector3d.create(this.x + v.x, this.y + v.y, this.z + v.z);
39
+ return Vector3d.create(this.x + v.x, this.y + v.y, this.z + getZ(v));
37
40
  }
38
41
  addTo(v) {
39
42
  this.x += v.x;
40
43
  this.y += v.y;
41
- this.z += v.z;
44
+ this.z += getZ(v);
42
45
  }
43
46
  copy() {
44
47
  return Vector3d.clone(this);
@@ -74,15 +77,15 @@ export class Vector3d {
74
77
  setTo(c) {
75
78
  this.x = c.x;
76
79
  this.y = c.y;
77
- this.z = "z" in c ? c.z : originPoint.z;
80
+ this.z = getZ(c);
78
81
  }
79
82
  sub(v) {
80
- return Vector3d.create(this.x - v.x, this.y - v.y, this.z - v.z);
83
+ return Vector3d.create(this.x - v.x, this.y - v.y, this.z - getZ(v));
81
84
  }
82
85
  subFrom(v) {
83
86
  this.x -= v.x;
84
87
  this.y -= v.y;
85
- this.z -= v.z;
88
+ this.z -= getZ(v);
86
89
  }
87
90
  _updateFromAngle(angle, length) {
88
91
  this.x = Math.cos(angle) * length;
@@ -2,9 +2,13 @@ import { AnimationOptions } from "./AnimationOptions.js";
2
2
  import { isNull } from "../../Utils/TypeUtils.js";
3
3
  import { setRangeValue } from "../../Utils/MathUtils.js";
4
4
  export class ColorAnimation extends AnimationOptions {
5
+ max;
6
+ min;
5
7
  offset;
6
- constructor() {
8
+ constructor(min, max) {
7
9
  super();
10
+ this.min = min;
11
+ this.max = max;
8
12
  this.offset = 0;
9
13
  this.sync = true;
10
14
  }
@@ -13,6 +17,12 @@ export class ColorAnimation extends AnimationOptions {
13
17
  if (isNull(data)) {
14
18
  return;
15
19
  }
20
+ if (data.max !== undefined) {
21
+ this.max = data.max;
22
+ }
23
+ if (data.min !== undefined) {
24
+ this.min = data.min;
25
+ }
16
26
  if (data.offset !== undefined) {
17
27
  this.offset = setRangeValue(data.offset);
18
28
  }
@@ -1,9 +1,10 @@
1
+ import { hMax, hMin, lMax, lMin, sMax, sMin } from "../../Core/Utils/Constants.js";
1
2
  import { ColorAnimation } from "./ColorAnimation.js";
2
3
  import { isNull } from "../../Utils/TypeUtils.js";
3
4
  export class HslAnimation {
4
- h = new ColorAnimation();
5
- l = new ColorAnimation();
6
- s = new ColorAnimation();
5
+ h = new ColorAnimation(hMin, hMax);
6
+ l = new ColorAnimation(lMin, lMax);
7
+ s = new ColorAnimation(sMin, sMax);
7
8
  load(data) {
8
9
  if (isNull(data)) {
9
10
  return;
@@ -18,6 +18,7 @@ export class Options {
18
18
  hdr;
19
19
  key;
20
20
  name;
21
+ palette;
21
22
  particles;
22
23
  pauseOnBlur;
23
24
  pauseOnOutsideViewport;
@@ -54,10 +55,15 @@ export class Options {
54
55
  return;
55
56
  }
56
57
  if (data.preset !== undefined) {
57
- executeOnSingleOrMultiple(data.preset, preset => {
58
+ this.preset = data.preset;
59
+ executeOnSingleOrMultiple(this.preset, preset => {
58
60
  this._importPreset(preset);
59
61
  });
60
62
  }
63
+ if (data.palette !== undefined) {
64
+ this.palette = data.palette;
65
+ this._importPalette(this.palette);
66
+ }
61
67
  if (data.autoPlay !== undefined) {
62
68
  this.autoPlay = data.autoPlay;
63
69
  }
@@ -114,6 +120,37 @@ export class Options {
114
120
  plugin.loadOptions(this._container, this, data);
115
121
  });
116
122
  }
123
+ _importPalette = palette => {
124
+ const paletteData = this._engine.getPalette(palette);
125
+ if (!paletteData) {
126
+ return;
127
+ }
128
+ this.load({
129
+ background: {
130
+ color: paletteData.background,
131
+ },
132
+ blend: {
133
+ enable: true,
134
+ mode: paletteData.blendMode,
135
+ },
136
+ particles: {
137
+ fill: {
138
+ color: paletteData.fill
139
+ ? {
140
+ value: paletteData.colors,
141
+ }
142
+ : undefined,
143
+ enable: paletteData.fill,
144
+ },
145
+ stroke: !paletteData.fill
146
+ ? paletteData.colors.map(color => ({
147
+ color: { value: color },
148
+ width: 1,
149
+ }))
150
+ : undefined,
151
+ },
152
+ });
153
+ };
117
154
  _importPreset = preset => {
118
155
  this.load(this._engine.getPreset(preset));
119
156
  };
@@ -2,12 +2,10 @@ import { deepExtend } from "../../../../Utils/Utils.js";
2
2
  import { isNull } from "../../../../Utils/TypeUtils.js";
3
3
  export class Effect {
4
4
  close;
5
- fill;
6
5
  options;
7
6
  type;
8
7
  constructor() {
9
8
  this.close = true;
10
- this.fill = true;
11
9
  this.options = {};
12
10
  this.type = [];
13
11
  }
@@ -27,9 +25,6 @@ export class Effect {
27
25
  if (data.close !== undefined) {
28
26
  this.close = data.close;
29
27
  }
30
- if (data.fill !== undefined) {
31
- this.fill = data.fill;
32
- }
33
28
  if (data.type !== undefined) {
34
29
  this.type = data.type;
35
30
  }
@@ -0,0 +1,28 @@
1
+ import { AnimatableColor } from "../AnimatableColor.js";
2
+ import { isNull } from "../../../Utils/TypeUtils.js";
3
+ import { setRangeValue } from "../../../Utils/MathUtils.js";
4
+ export class Fill {
5
+ color;
6
+ enable;
7
+ opacity;
8
+ constructor() {
9
+ this.enable = true;
10
+ this.color = new AnimatableColor();
11
+ this.color.value = "#fff";
12
+ this.opacity = 1;
13
+ }
14
+ load(data) {
15
+ if (isNull(data)) {
16
+ return;
17
+ }
18
+ if (data.color !== undefined) {
19
+ this.color = AnimatableColor.create(this.color, data.color);
20
+ }
21
+ if (data.enable !== undefined) {
22
+ this.enable = data.enable;
23
+ }
24
+ if (data.opacity !== undefined) {
25
+ this.opacity = setRangeValue(data.opacity);
26
+ }
27
+ }
28
+ }
@@ -1,7 +1,6 @@
1
1
  import { MoveDirection } from "../../../../Enums/Directions/MoveDirection.js";
2
2
  import { isNull, isNumber, isObject } from "../../../../Utils/TypeUtils.js";
3
3
  import { MoveAngle } from "./MoveAngle.js";
4
- import { MoveAttract } from "./MoveAttract.js";
5
4
  import { MoveCenter } from "./MoveCenter.js";
6
5
  import { MoveGravity } from "./MoveGravity.js";
7
6
  import { MovePath } from "./Path/MovePath.js";
@@ -10,7 +9,6 @@ import { Spin } from "./Spin.js";
10
9
  import { setRangeValue } from "../../../../Utils/MathUtils.js";
11
10
  export class Move {
12
11
  angle;
13
- attract;
14
12
  center;
15
13
  decay;
16
14
  direction;
@@ -29,7 +27,6 @@ export class Move {
29
27
  warp;
30
28
  constructor() {
31
29
  this.angle = new MoveAngle();
32
- this.attract = new MoveAttract();
33
30
  this.center = new MoveCenter();
34
31
  this.decay = 0;
35
32
  this.distance = {};
@@ -52,7 +49,6 @@ export class Move {
52
49
  return;
53
50
  }
54
51
  this.angle.load(isNumber(data.angle) ? { value: data.angle } : data.angle);
55
- this.attract.load(data.attract);
56
52
  this.center.load(data.center);
57
53
  if (data.decay !== undefined) {
58
54
  this.decay = setRangeValue(data.decay);
@@ -1,6 +1,6 @@
1
1
  import { deepExtend, executeOnSingleOrMultiple } from "../../../Utils/Utils.js";
2
- import { AnimatableColor } from "../AnimatableColor.js";
3
2
  import { Effect } from "./Effect/Effect.js";
3
+ import { Fill } from "./Fill.js";
4
4
  import { Move } from "./Move/Move.js";
5
5
  import { Opacity } from "./Opacity/Opacity.js";
6
6
  import { ParticlesBounce } from "./Bounce/ParticlesBounce.js";
@@ -12,8 +12,8 @@ import { ZIndex } from "./ZIndex/ZIndex.js";
12
12
  import { isNull } from "../../../Utils/TypeUtils.js";
13
13
  export class ParticlesOptions {
14
14
  bounce;
15
- color;
16
15
  effect;
16
+ fill;
17
17
  groups;
18
18
  move;
19
19
  number;
@@ -29,9 +29,8 @@ export class ParticlesOptions {
29
29
  this._engine = engine;
30
30
  this._container = container;
31
31
  this.bounce = new ParticlesBounce();
32
- this.color = new AnimatableColor();
33
- this.color.value = "#fff";
34
32
  this.effect = new Effect();
33
+ this.fill = new Fill();
35
34
  this.groups = {};
36
35
  this.move = new Move();
37
36
  this.number = new ParticlesNumber();
@@ -48,7 +47,7 @@ export class ParticlesOptions {
48
47
  }
49
48
  if (data.groups !== undefined) {
50
49
  for (const group of Object.keys(data.groups)) {
51
- if (!Object.hasOwn(data.groups, group)) {
50
+ if (!(group in data.groups)) {
52
51
  continue;
53
52
  }
54
53
  const item = data.groups[group];
@@ -61,7 +60,6 @@ export class ParticlesOptions {
61
60
  this.reduceDuplicates = data.reduceDuplicates;
62
61
  }
63
62
  this.bounce.load(data.bounce);
64
- this.color.load(AnimatableColor.create(this.color, data.color));
65
63
  this.effect.load(data.effect);
66
64
  this.move.load(data.move);
67
65
  this.number.load(data.number);
@@ -69,6 +67,14 @@ export class ParticlesOptions {
69
67
  this.shape.load(data.shape);
70
68
  this.size.load(data.size);
71
69
  this.zIndex.load(data.zIndex);
70
+ const fillToLoad = data.fill;
71
+ if (fillToLoad) {
72
+ this.fill = executeOnSingleOrMultiple(fillToLoad, t => {
73
+ const tmp = new Fill();
74
+ tmp.load(t);
75
+ return tmp;
76
+ });
77
+ }
72
78
  const strokeToLoad = data.stroke;
73
79
  if (strokeToLoad) {
74
80
  this.stroke = executeOnSingleOrMultiple(strokeToLoad, t => {
@@ -2,12 +2,10 @@ import { deepExtend } from "../../../../Utils/Utils.js";
2
2
  import { isNull } from "../../../../Utils/TypeUtils.js";
3
3
  export class Shape {
4
4
  close;
5
- fill;
6
5
  options;
7
6
  type;
8
7
  constructor() {
9
8
  this.close = true;
10
- this.fill = true;
11
9
  this.options = {};
12
10
  this.type = "circle";
13
11
  }
@@ -27,9 +25,6 @@ export class Shape {
27
25
  if (data.close !== undefined) {
28
26
  this.close = data.close;
29
27
  }
30
- if (data.fill !== undefined) {
31
- this.fill = data.fill;
32
- }
33
28
  if (data.type !== undefined) {
34
29
  this.type = data.type;
35
30
  }