@tsparticles/preset-snow 4.5.1 → 4.5.2

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.
@@ -1,6 +1,6 @@
1
1
  (function(g){g.__tsParticlesInternals=g.__tsParticlesInternals||{};g.__tsParticlesInternals.bundles=g.__tsParticlesInternals.bundles||{};g.__tsParticlesInternals.effects=g.__tsParticlesInternals.effects||{};g.__tsParticlesInternals.engine=g.__tsParticlesInternals.engine||{};g.__tsParticlesInternals.interactions=g.__tsParticlesInternals.interactions||{};g.__tsParticlesInternals.palettes=g.__tsParticlesInternals.palettes||{};g.__tsParticlesInternals.paths=g.__tsParticlesInternals.paths||{};g.__tsParticlesInternals.plugins=g.__tsParticlesInternals.plugins||{};g.__tsParticlesInternals.plugins=g.__tsParticlesInternals.plugins||{};g.__tsParticlesInternals.plugins.emittersShapes=g.__tsParticlesInternals.plugins.emittersShapes||{};g.__tsParticlesInternals.presets=g.__tsParticlesInternals.presets||{};g.__tsParticlesInternals.shapes=g.__tsParticlesInternals.shapes||{};g.__tsParticlesInternals.updaters=g.__tsParticlesInternals.updaters||{};g.__tsParticlesInternals.utils=g.__tsParticlesInternals.utils||{};g.__tsParticlesInternals.canvas=g.__tsParticlesInternals.canvas||{};g.__tsParticlesInternals.canvas=g.__tsParticlesInternals.canvas||{};g.__tsParticlesInternals.canvas.utils=g.__tsParticlesInternals.canvas.utils||{};g.__tsParticlesInternals.path=g.__tsParticlesInternals.path||{};g.__tsParticlesInternals.path=g.__tsParticlesInternals.path||{};g.__tsParticlesInternals.path.utils=g.__tsParticlesInternals.path.utils||{};var __tsProxyFactory=typeof Proxy!=="undefined"?function(obj){return new Proxy(obj,{get:function(target,key){if(!(key in target)){target[key]={};}return target[key];}});}:function(obj){return obj;};g.__tsParticlesInternals.bundles=__tsProxyFactory(g.__tsParticlesInternals.bundles);g.__tsParticlesInternals.effects=__tsProxyFactory(g.__tsParticlesInternals.effects);g.__tsParticlesInternals.interactions=__tsProxyFactory(g.__tsParticlesInternals.interactions);g.__tsParticlesInternals.palettes=__tsProxyFactory(g.__tsParticlesInternals.palettes);g.__tsParticlesInternals.paths=__tsProxyFactory(g.__tsParticlesInternals.paths);g.__tsParticlesInternals.plugins=__tsProxyFactory(g.__tsParticlesInternals.plugins);g.__tsParticlesInternals.plugins.emittersShapes=__tsProxyFactory(g.__tsParticlesInternals.plugins.emittersShapes);g.__tsParticlesInternals.presets=__tsProxyFactory(g.__tsParticlesInternals.presets);g.__tsParticlesInternals.shapes=__tsProxyFactory(g.__tsParticlesInternals.shapes);g.__tsParticlesInternals.updaters=__tsProxyFactory(g.__tsParticlesInternals.updaters);g.__tsParticlesInternals.utils=__tsProxyFactory(g.__tsParticlesInternals.utils);g.__tsParticlesInternals.canvas=__tsProxyFactory(g.__tsParticlesInternals.canvas);g.__tsParticlesInternals.path=__tsProxyFactory(g.__tsParticlesInternals.path);})(typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:this);
2
2
  (function (g) {
3
- /* Preset v4.5.1 */
3
+ /* Preset v4.5.2 */
4
4
  g.__tsParticlesInternals = g.__tsParticlesInternals || {};
5
5
  g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
6
6
  (function (exports) {
@@ -120,7 +120,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
120
120
  }
121
121
  normalize() {
122
122
  const length = this.length;
123
- if (length != none) {
123
+ if (length !== none) {
124
124
  this.multTo(inverseFactorNumerator / length);
125
125
  }
126
126
  }
@@ -864,11 +864,13 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
864
864
  #domArray = [];
865
865
  #eventDispatcher = new EventDispatcher();
866
866
  #initialized = false;
867
+ #loadSequence = 0;
868
+ #loadSequences = new Map();
867
869
  get items() {
868
870
  return this.#domArray;
869
871
  }
870
872
  get version() {
871
- return "4.5.1";
873
+ return "4.5.2";
872
874
  }
873
875
  addEventListener(type, listener) {
874
876
  this.#eventDispatcher.addEventListener(type, listener);
@@ -898,44 +900,60 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
898
900
  return item;
899
901
  }
900
902
  async load(params) {
901
- await this.init();
902
903
  let domSourceElement;
903
904
  if (typeof HTMLElement !== "undefined" && params.element instanceof HTMLElement) {
904
905
  domSourceElement = params.element;
905
906
  }
906
- const { Container } = await Promise.resolve().then(function () { return Container$1; }), id = params.id ?? domSourceElement?.id ?? `tsparticles${Math.floor(getRandom() * loadRandomFactor).toString()}`, { index, url } = params, options = url ? await getDataFromUrl({ fallback: params.options, url, index }) : params.options, currentOptions = itemFromSingleOrMultiple(options, index), { items } = this, oldIndex = items.findIndex(v => v.id.description === id), newItem = new Container({
907
- dispatchCallback: (eventType, args) => {
908
- this.dispatchEvent(eventType, args);
909
- },
910
- id,
911
- onDestroy: (remove) => {
912
- if (!remove) {
913
- return;
914
- }
915
- const mainArr = this.items, idx = mainArr.indexOf(newItem);
916
- if (idx >= removeMinIndex) {
917
- mainArr.splice(idx, removeDeleteCount);
907
+ const id = params.id ?? domSourceElement?.id ?? `tsparticles${Math.floor(getRandom() * loadRandomFactor).toString()}`, loadSequence = ++this.#loadSequence;
908
+ this.#loadSequences.set(id, loadSequence);
909
+ try {
910
+ await this.init();
911
+ const { Container } = await Promise.resolve().then(function () { return Container$1; }), { index, url } = params, options = url ? await getDataFromUrl({ fallback: params.options, url, index }) : params.options;
912
+ if (this.#loadSequences.get(id) !== loadSequence) {
913
+ return undefined;
914
+ }
915
+ const currentOptions = itemFromSingleOrMultiple(options, index), { items } = this, oldIndex = items.findIndex(v => v.id.description === id), newItem = new Container({
916
+ dispatchCallback: (eventType, args) => {
917
+ this.dispatchEvent(eventType, args);
918
+ },
919
+ id,
920
+ onDestroy: (remove) => {
921
+ if (!remove) {
922
+ return;
923
+ }
924
+ const mainArr = this.items, idx = mainArr.indexOf(newItem);
925
+ if (idx >= removeMinIndex) {
926
+ mainArr.splice(idx, removeDeleteCount);
927
+ }
928
+ },
929
+ pluginManager: this.pluginManager,
930
+ sourceOptions: currentOptions,
931
+ });
932
+ if (oldIndex >= loadMinIndex) {
933
+ const old = this.item(oldIndex), deleteCount = old ? one : none;
934
+ if (old && !old.destroyed) {
935
+ old.destroy(false);
918
936
  }
919
- },
920
- pluginManager: this.pluginManager,
921
- sourceOptions: currentOptions,
922
- });
923
- if (oldIndex >= loadMinIndex) {
924
- const old = this.item(oldIndex), deleteCount = old ? one : none;
925
- if (old && !old.destroyed) {
926
- old.destroy(false);
937
+ items.splice(oldIndex, deleteCount, newItem);
938
+ }
939
+ else {
940
+ items.push(newItem);
927
941
  }
928
- items.splice(oldIndex, deleteCount, newItem);
942
+ const sourceCanvas = typeof OffscreenCanvas !== "undefined" && params.element instanceof OffscreenCanvas
943
+ ? params.element
944
+ : getCanvasFromContainer(getDomContainer(id, domSourceElement));
945
+ newItem.canvas.loadCanvas(sourceCanvas);
946
+ await newItem.start();
947
+ if (newItem.destroyed) {
948
+ return undefined;
949
+ }
950
+ return newItem;
929
951
  }
930
- else {
931
- items.push(newItem);
952
+ finally {
953
+ if (this.#loadSequences.get(id) === loadSequence) {
954
+ this.#loadSequences.delete(id);
955
+ }
932
956
  }
933
- const sourceCanvas = typeof OffscreenCanvas !== "undefined" && params.element instanceof OffscreenCanvas
934
- ? params.element
935
- : getCanvasFromContainer(getDomContainer(id, domSourceElement));
936
- newItem.canvas.loadCanvas(sourceCanvas);
937
- await newItem.start();
938
- return newItem;
939
957
  }
940
958
  async refresh(refresh = true) {
941
959
  if (!refresh) {
@@ -2243,6 +2261,13 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
2243
2261
  }
2244
2262
  }
2245
2263
 
2264
+ function hasEnabledBlend(particleOptions) {
2265
+ if (!particleOptions || typeof particleOptions !== "object" || !("blend" in particleOptions)) {
2266
+ return false;
2267
+ }
2268
+ const blend = particleOptions.blend;
2269
+ return !!blend && typeof blend === "object" && "enable" in blend && !!blend.enable;
2270
+ }
2246
2271
  class BlendPlugin {
2247
2272
  id = "blend";
2248
2273
  async getPlugin(container) {
@@ -2264,12 +2289,31 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
2264
2289
  options.blend.load(source?.blend);
2265
2290
  }
2266
2291
  needsPlugin(options) {
2267
- return !!options?.blend?.enable || !!options?.particles?.blend?.enable;
2292
+ if (options?.blend?.enable ||
2293
+ options?.particles?.blend?.enable ||
2294
+ Object.values(options?.particles?.groups ?? {}).some(hasEnabledBlend)) {
2295
+ return true;
2296
+ }
2297
+ const emitters = options?.["emitters"];
2298
+ let emitterList = [];
2299
+ if (Array.isArray(emitters)) {
2300
+ emitterList = emitters;
2301
+ }
2302
+ else if (emitters) {
2303
+ emitterList = [emitters];
2304
+ }
2305
+ return emitterList.some(emitter => {
2306
+ if (!emitter || typeof emitter !== "object" || !("particles" in emitter)) {
2307
+ return false;
2308
+ }
2309
+ const particles = emitter.particles;
2310
+ return Array.isArray(particles) ? particles.some(hasEnabledBlend) : hasEnabledBlend(particles);
2311
+ });
2268
2312
  }
2269
2313
  }
2270
2314
 
2271
2315
  async function loadBlendPlugin(engine) {
2272
- engine.checkVersion("4.5.1");
2316
+ engine.checkVersion("4.5.2");
2273
2317
  await engine.pluginManager.register(e => {
2274
2318
  e.pluginManager.addPlugin(new BlendPlugin());
2275
2319
  });
@@ -2306,7 +2350,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
2306
2350
  }
2307
2351
 
2308
2352
  async function loadCircleShape(engine) {
2309
- engine.checkVersion("4.5.1");
2353
+ engine.checkVersion("4.5.2");
2310
2354
  await engine.pluginManager.register(e => {
2311
2355
  e.pluginManager.addShape(["circle"], () => {
2312
2356
  return Promise.resolve(new CircleDrawer());
@@ -2354,7 +2398,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
2354
2398
  }
2355
2399
 
2356
2400
  async function loadHexColorPlugin(engine) {
2357
- engine.checkVersion("4.5.1");
2401
+ engine.checkVersion("4.5.2");
2358
2402
  await engine.pluginManager.register(e => {
2359
2403
  e.pluginManager.addColorManager("hex", new HexColorManager());
2360
2404
  });
@@ -2407,7 +2451,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
2407
2451
  }
2408
2452
 
2409
2453
  async function loadHslColorPlugin(engine) {
2410
- engine.checkVersion("4.5.1");
2454
+ engine.checkVersion("4.5.2");
2411
2455
  await engine.pluginManager.register(e => {
2412
2456
  e.pluginManager.addColorManager("hsl", new HslColorManager());
2413
2457
  });
@@ -2439,7 +2483,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
2439
2483
  }
2440
2484
 
2441
2485
  async function loadMovePlugin(engine) {
2442
- engine.checkVersion("4.5.1");
2486
+ engine.checkVersion("4.5.2");
2443
2487
  if (typeof process !== "undefined" && process.env.NODE_ENV !== "production") {
2444
2488
  addErrorMessages(ErrorMessages);
2445
2489
  }
@@ -2649,7 +2693,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
2649
2693
  }
2650
2694
 
2651
2695
  async function loadOpacityUpdater(engine) {
2652
- engine.checkVersion("4.5.1");
2696
+ engine.checkVersion("4.5.2");
2653
2697
  await engine.pluginManager.register(e => {
2654
2698
  e.pluginManager.addParticleUpdater("opacity", container => {
2655
2699
  return Promise.resolve(new OpacityUpdater(container));
@@ -2978,7 +3022,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
2978
3022
  }
2979
3023
 
2980
3024
  async function loadOutModesUpdater(engine) {
2981
- engine.checkVersion("4.5.1");
3025
+ engine.checkVersion("4.5.2");
2982
3026
  await engine.pluginManager.register(e => {
2983
3027
  e.pluginManager.addParticleUpdater("outModes", container => {
2984
3028
  return Promise.resolve(new OutOfCanvasUpdater(container));
@@ -3057,7 +3101,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
3057
3101
  }
3058
3102
 
3059
3103
  async function loadPaintUpdater(engine) {
3060
- engine.checkVersion("4.5.1");
3104
+ engine.checkVersion("4.5.2");
3061
3105
  await engine.pluginManager.register(e => {
3062
3106
  e.pluginManager.addParticleUpdater("paint", container => {
3063
3107
  return Promise.resolve(new PaintUpdater(e.pluginManager, container));
@@ -3112,7 +3156,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
3112
3156
  }
3113
3157
 
3114
3158
  async function loadRgbColorPlugin(engine) {
3115
- engine.checkVersion("4.5.1");
3159
+ engine.checkVersion("4.5.2");
3116
3160
  await engine.pluginManager.register(e => {
3117
3161
  e.pluginManager.addColorManager("rgb", new RgbColorManager());
3118
3162
  });
@@ -3197,7 +3241,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
3197
3241
  }
3198
3242
 
3199
3243
  async function loadSizeUpdater(engine) {
3200
- engine.checkVersion("4.5.1");
3244
+ engine.checkVersion("4.5.2");
3201
3245
  await engine.pluginManager.register(e => {
3202
3246
  e.pluginManager.addParticleUpdater("size", container => {
3203
3247
  return Promise.resolve(new SizeUpdater(container));
@@ -3206,7 +3250,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
3206
3250
  }
3207
3251
 
3208
3252
  async function loadBasic(engine) {
3209
- engine.checkVersion("4.5.1");
3253
+ engine.checkVersion("4.5.2");
3210
3254
  await engine.pluginManager.register(async (e) => {
3211
3255
  await Promise.all([
3212
3256
  loadBlendPlugin(e),
@@ -3342,7 +3386,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
3342
3386
  }
3343
3387
 
3344
3388
  async function loadWobbleUpdater(engine) {
3345
- engine.checkVersion("4.5.1");
3389
+ engine.checkVersion("4.5.2");
3346
3390
  await engine.pluginManager.register(e => {
3347
3391
  e.pluginManager.addParticleUpdater("wobble", container => {
3348
3392
  return Promise.resolve(new WobbleUpdater(container));
@@ -3553,7 +3597,8 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
3553
3597
  });
3554
3598
  }
3555
3599
  drawParticles(delta) {
3556
- const { particles, actualOptions } = this.#container, clearedPlugin = this.clear();
3600
+ const { particles, actualOptions } = this.#container;
3601
+ this.clear();
3557
3602
  particles.update(delta);
3558
3603
  this.draw(ctx => {
3559
3604
  const width = this.#canvasManager.size.width, height = this.#canvasManager.size.height;
@@ -3575,9 +3620,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
3575
3620
  }
3576
3621
  }
3577
3622
  for (const plugin of this.#getLayerPlugins(DrawLayer.BackgroundMask)) {
3578
- if (plugin !== clearedPlugin) {
3579
- plugin.canvasPaint?.();
3580
- }
3623
+ plugin.canvasPaint?.();
3581
3624
  }
3582
3625
  for (const plugin of this.#getLayerPlugins(DrawLayer.CanvasSetup)) {
3583
3626
  plugin.drawSettingsSetup?.(ctx, delta);
@@ -3667,6 +3710,9 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
3667
3710
  ctx.clearRect(originPoint.x, originPoint.y, this.#canvasManager.size.width, this.#canvasManager.size.height);
3668
3711
  });
3669
3712
  }
3713
+ updateBackgroundElement() {
3714
+ this.#resolveBackgroundElement();
3715
+ }
3670
3716
  #applyPostDrawUpdaters(particle) {
3671
3717
  for (const updater of this.#postDrawUpdaters) {
3672
3718
  updater.afterDraw?.(particle);
@@ -3865,7 +3911,14 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
3865
3911
  }
3866
3912
  if (typeof background.element === "string") {
3867
3913
  if (typeof document !== "undefined") {
3868
- const node = document.querySelector(background.element);
3914
+ let node;
3915
+ try {
3916
+ node = document.querySelector(background.element);
3917
+ }
3918
+ catch {
3919
+ this.#warnOnce("background-element-invalid-selector", `Background element selector "${background.element}" is invalid`);
3920
+ return;
3921
+ }
3869
3922
  if (node && this.#isSupportedElement(node)) {
3870
3923
  this.#backgroundElement = node;
3871
3924
  }
@@ -4689,10 +4742,10 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
4689
4742
  runParticleCreatedPlugins(container, this);
4690
4743
  }
4691
4744
  isInsideCanvas(direction) {
4692
- return this.#getInsideCanvasResult({ direction }).inside;
4745
+ return this.#getInsideCanvasResult(direction).inside;
4693
4746
  }
4694
4747
  isInsideCanvasForOutMode(outMode, direction) {
4695
- return this.#getInsideCanvasResult({ direction, outMode }).inside;
4748
+ return this.#getInsideCanvasResult(direction, outMode).inside;
4696
4749
  }
4697
4750
  isShowingBack() {
4698
4751
  if (!this.roll) {
@@ -4809,7 +4862,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
4809
4862
  });
4810
4863
  }
4811
4864
  #getDefaultInsideCanvasResult(direction, outMode) {
4812
- const radius = this.getRadius(), canvasSize = this.#container.canvas.size, position = this.position, isBounce = outMode === OutMode.bounce;
4865
+ const radius = this.getRadius(), canvasSize = this.#container.canvas.size, position = this.position, isBounce = outMode === OutMode.bounce || outMode === OutMode.split;
4813
4866
  if (direction === OutModeDirection.bottom) {
4814
4867
  return {
4815
4868
  inside: isBounce ? position.y + radius < canvasSize.height : position.y - radius < canvasSize.height,
@@ -4851,12 +4904,16 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
4851
4904
  radius: this.getRadius(),
4852
4905
  };
4853
4906
  }
4854
- #getInsideCanvasResult(data) {
4855
- const defaultResult = this.#getDefaultInsideCanvasResult(data.direction, data.outMode), container = this.#container, shapeDrawer = this.shape ? container.shapeDrawers.get(this.shape) : undefined, effectDrawer = this.effect ? container.effectDrawers.get(this.effect) : undefined, shapeCheck = shapeDrawer?.isInsideCanvas, effectCheck = effectDrawer?.isInsideCanvas;
4856
- if (!shapeCheck && !effectCheck) {
4907
+ #getInsideCanvasResult(direction, outMode) {
4908
+ const defaultResult = this.#getDefaultInsideCanvasResult(direction, outMode), container = this.#container, shapeDrawer = this.shape ? container.shapeDrawers.get(this.shape) : undefined, effectDrawer = this.effect ? container.effectDrawers.get(this.effect) : undefined;
4909
+ if (!shapeDrawer?.isInsideCanvas && !effectDrawer?.isInsideCanvas) {
4857
4910
  return defaultResult;
4858
4911
  }
4859
- const callbackData = this.#getInsideCanvasCallbackData(data.direction, data.outMode), shapeResult = shapeCheck ? this.#normalizeInsideCanvasResult(shapeCheck(callbackData), "shape") : undefined, effectResult = effectCheck ? this.#normalizeInsideCanvasResult(effectCheck(callbackData), "effect") : undefined;
4912
+ const callbackData = this.#getInsideCanvasCallbackData(direction, outMode), shapeResult = shapeDrawer?.isInsideCanvas
4913
+ ? this.#normalizeInsideCanvasResult(shapeDrawer.isInsideCanvas(callbackData), "shape")
4914
+ : undefined, effectResult = effectDrawer?.isInsideCanvas
4915
+ ? this.#normalizeInsideCanvasResult(effectDrawer.isInsideCanvas(callbackData), "effect")
4916
+ : undefined;
4860
4917
  if (shapeResult && effectResult) {
4861
4918
  const margin = Math.max(shapeResult.margin ?? defaultAngle, effectResult.margin ?? defaultAngle);
4862
4919
  return {
@@ -4922,8 +4979,8 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
4922
4979
  }
4923
4980
 
4924
4981
  class SpatialHashGrid {
4925
- #cellSize;
4926
4982
  #cells = new Map();
4983
+ #cellSize;
4927
4984
  #circlePool = [];
4928
4985
  #circlePoolIdx;
4929
4986
  #pendingCellSize;
@@ -5581,8 +5638,8 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
5581
5638
  particleCreatedPlugins;
5582
5639
  particleDestroyedPlugins;
5583
5640
  particlePositionPlugins;
5584
- particleUpdaters;
5585
5641
  particles;
5642
+ particleUpdaters;
5586
5643
  peakNits;
5587
5644
  plugins;
5588
5645
  retina;
@@ -5876,6 +5933,7 @@ g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
5876
5933
  refresh = plugin.updateActualOptions() || refresh;
5877
5934
  }
5878
5935
  }
5936
+ this.canvas.render.updateBackgroundElement();
5879
5937
  return refresh;
5880
5938
  }
5881
5939
  #initPlugins(allContainerPlugins) {