@tsparticles/all 4.0.0-beta.15 → 4.0.0-beta.17

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,5 +1,5 @@
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);g.tsparticlesInternalExports=g.tsparticlesInternalExports||{};})(typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:this);
2
- /* tsParticles v4.0.0-beta.15 */
2
+ /* tsParticles v4.0.0-beta.17 */
3
3
  (function (global, factory) {
4
4
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
5
5
  typeof define === 'function' && define.amd ? define(['exports'], factory) :
@@ -1081,7 +1081,7 @@
1081
1081
  }
1082
1082
  }
1083
1083
  else {
1084
- const existingCanvases = domContainer.getElementsByTagName(canvasTag), foundCanvas = existingCanvases[canvasFirstIndex];
1084
+ const existingCanvases = domContainer.getElementsByTagName(canvasTag), foundCanvas = existingCanvases.item(canvasFirstIndex);
1085
1085
  if (foundCanvas) {
1086
1086
  canvasEl = foundCanvas;
1087
1087
  canvasEl.dataset[generatedAttribute] = generatedFalse;
@@ -1118,7 +1118,7 @@
1118
1118
  return this._domArray;
1119
1119
  }
1120
1120
  get version() {
1121
- return "4.0.0-beta.15";
1121
+ return "4.0.0-beta.17";
1122
1122
  }
1123
1123
  addEventListener(type, listener) {
1124
1124
  this._eventDispatcher.addEventListener(type, listener);
@@ -1149,7 +1149,11 @@
1149
1149
  }
1150
1150
  async load(params) {
1151
1151
  await this.init();
1152
- const { Container } = await Promise.resolve().then(function () { return Container$1; }), id = params.id ?? params.element?.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({
1152
+ let domSourceElement;
1153
+ if (typeof HTMLElement !== "undefined" && params.element instanceof HTMLElement) {
1154
+ domSourceElement = params.element;
1155
+ }
1156
+ 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({
1153
1157
  dispatchCallback: (eventType, args) => {
1154
1158
  this.dispatchEvent(eventType, args);
1155
1159
  },
@@ -1176,8 +1180,10 @@
1176
1180
  else {
1177
1181
  items.push(newItem);
1178
1182
  }
1179
- const domContainer = getDomContainer(id, params.element), canvasEl = getCanvasFromContainer(domContainer);
1180
- newItem.canvas.loadCanvas(canvasEl);
1183
+ const sourceCanvas = typeof OffscreenCanvas !== "undefined" && params.element instanceof OffscreenCanvas
1184
+ ? params.element
1185
+ : getCanvasFromContainer(getDomContainer(id, domSourceElement));
1186
+ newItem.canvas.loadCanvas(sourceCanvas);
1181
1187
  await newItem.start();
1182
1188
  return newItem;
1183
1189
  }
@@ -3031,7 +3037,7 @@
3031
3037
  }
3032
3038
 
3033
3039
  async function loadArrowShape(engine) {
3034
- engine.checkVersion("4.0.0-beta.15");
3040
+ engine.checkVersion("4.0.0-beta.17");
3035
3041
  await engine.pluginManager.register(e => {
3036
3042
  e.pluginManager.addShape(["arrow"], () => Promise.resolve(new ArrowDrawer()));
3037
3043
  });
@@ -3112,7 +3118,7 @@
3112
3118
  }
3113
3119
 
3114
3120
  async function loadBackgroundMaskPlugin(engine) {
3115
- engine.checkVersion("4.0.0-beta.15");
3121
+ engine.checkVersion("4.0.0-beta.17");
3116
3122
  await engine.pluginManager.register(e => {
3117
3123
  e.pluginManager.addPlugin(new BackgroundMaskPlugin(e.pluginManager));
3118
3124
  });
@@ -3164,7 +3170,7 @@
3164
3170
  }
3165
3171
 
3166
3172
  async function loadBlendPlugin(engine) {
3167
- engine.checkVersion("4.0.0-beta.15");
3173
+ engine.checkVersion("4.0.0-beta.17");
3168
3174
  await engine.pluginManager.register(e => {
3169
3175
  e.pluginManager.addPlugin(new BlendPlugin());
3170
3176
  });
@@ -3188,7 +3194,7 @@
3188
3194
  }
3189
3195
 
3190
3196
  async function loadMovePlugin(engine) {
3191
- engine.checkVersion("4.0.0-beta.15");
3197
+ engine.checkVersion("4.0.0-beta.17");
3192
3198
  await engine.pluginManager.register(e => {
3193
3199
  const moveEngine = e, movePluginManager = moveEngine.pluginManager;
3194
3200
  movePluginManager.initializers.pathGenerators ??= new Map();
@@ -3289,7 +3295,7 @@
3289
3295
 
3290
3296
  const branchingPathName = "branchesPathGenerator";
3291
3297
  async function loadBranchesPath(engine) {
3292
- engine.checkVersion("4.0.0-beta.15");
3298
+ engine.checkVersion("4.0.0-beta.17");
3293
3299
  await engine.pluginManager.register((e) => {
3294
3300
  ensureBaseMoverLoaded(e);
3295
3301
  e.pluginManager.addPathGenerator?.(branchingPathName, container => {
@@ -3338,7 +3344,7 @@
3338
3344
 
3339
3345
  const brownianPathName = "brownianPathGenerator";
3340
3346
  async function loadBrownianPath(engine) {
3341
- engine.checkVersion("4.0.0-beta.15");
3347
+ engine.checkVersion("4.0.0-beta.17");
3342
3348
  await engine.pluginManager.register((e) => {
3343
3349
  ensureBaseMoverLoaded(e);
3344
3350
  e.pluginManager.addPathGenerator?.(brownianPathName, container => {
@@ -3360,7 +3366,7 @@
3360
3366
  }
3361
3367
 
3362
3368
  async function loadBubbleEffect(engine) {
3363
- engine.checkVersion("4.0.0-beta.15");
3369
+ engine.checkVersion("4.0.0-beta.17");
3364
3370
  await engine.pluginManager.register(e => {
3365
3371
  e.pluginManager.addEffect("bubble", () => {
3366
3372
  return Promise.resolve(new BubbleDrawer());
@@ -3597,7 +3603,7 @@
3597
3603
  }
3598
3604
 
3599
3605
  async function loadCanvasMaskPlugin(engine) {
3600
- engine.checkVersion("4.0.0-beta.15");
3606
+ engine.checkVersion("4.0.0-beta.17");
3601
3607
  await engine.pluginManager.register(e => {
3602
3608
  e.pluginManager.addPlugin(new CanvasMaskPlugin());
3603
3609
  });
@@ -3886,7 +3892,7 @@
3886
3892
  }
3887
3893
 
3888
3894
  async function loadClubsSuitShape(engine) {
3889
- engine.checkVersion("4.0.0-beta.15");
3895
+ engine.checkVersion("4.0.0-beta.17");
3890
3896
  await engine.pluginManager.register(e => {
3891
3897
  e.pluginManager.addShape(["club", "clubs"], () => Promise.resolve(new ClubDrawer()));
3892
3898
  });
@@ -3900,7 +3906,7 @@
3900
3906
  }
3901
3907
 
3902
3908
  async function loadDiamondsSuitShape(engine) {
3903
- engine.checkVersion("4.0.0-beta.15");
3909
+ engine.checkVersion("4.0.0-beta.17");
3904
3910
  await engine.pluginManager.register(e => {
3905
3911
  e.pluginManager.addShape(["diamond", "diamonds"], () => Promise.resolve(new DiamondDrawer()));
3906
3912
  });
@@ -3914,7 +3920,7 @@
3914
3920
  };
3915
3921
 
3916
3922
  async function loadHeartsSuitShape(engine) {
3917
- engine.checkVersion("4.0.0-beta.15");
3923
+ engine.checkVersion("4.0.0-beta.17");
3918
3924
  await engine.pluginManager.register(e => {
3919
3925
  e.pluginManager.addShape(["heart", "hearts"], () => Promise.resolve(new HeartDrawer$1()));
3920
3926
  });
@@ -3928,14 +3934,14 @@
3928
3934
  }
3929
3935
 
3930
3936
  async function loadSpadesSuitShape(engine) {
3931
- engine.checkVersion("4.0.0-beta.15");
3937
+ engine.checkVersion("4.0.0-beta.17");
3932
3938
  await engine.pluginManager.register(e => {
3933
3939
  e.pluginManager.addShape(["spade", "spades"], () => Promise.resolve(new SpadeDrawer()));
3934
3940
  });
3935
3941
  }
3936
3942
 
3937
3943
  async function loadCardSuitsShape(engine) {
3938
- engine.checkVersion("4.0.0-beta.15");
3944
+ engine.checkVersion("4.0.0-beta.17");
3939
3945
  await Promise.all([
3940
3946
  loadClubsSuitShape(engine),
3941
3947
  loadDiamondsSuitShape(engine),
@@ -3953,17 +3959,7 @@
3953
3959
  const cacheKey = getCacheKey(radius, hdr, cardData), cardWidth = radius * cardWidthRatio, cardHeight = radius * cardHeightRatio, halfWidth = cardWidth * half$2, halfHeight = cardHeight * half$2;
3954
3960
  let cachedData = cardsCache.get(cacheKey);
3955
3961
  if (!cachedData) {
3956
- let cacheCanvas, cacheCtx;
3957
- if (typeof OffscreenCanvas === "undefined") {
3958
- cacheCanvas = safeDocument().createElement("canvas");
3959
- cacheCanvas.width = cardWidth;
3960
- cacheCanvas.height = cardHeight;
3961
- cacheCtx = cacheCanvas.getContext("2d", canvasSettings);
3962
- }
3963
- else {
3964
- cacheCanvas = new OffscreenCanvas(cardWidth, cardHeight);
3965
- cacheCtx = cacheCanvas.getContext("2d", canvasSettings);
3966
- }
3962
+ const cacheCanvas = new OffscreenCanvas(cardWidth, cardHeight), cacheCtx = cacheCanvas.getContext("2d", canvasSettings);
3967
3963
  if (cacheCtx) {
3968
3964
  cacheCtx.translate(halfWidth, halfHeight);
3969
3965
  drawRoundedCardFront(cacheCtx, radius, cardData, hdr);
@@ -4066,14 +4062,14 @@
4066
4062
  }
4067
4063
 
4068
4064
  async function loadFullCardsShape(engine) {
4069
- engine.checkVersion("4.0.0-beta.15");
4065
+ engine.checkVersion("4.0.0-beta.17");
4070
4066
  await engine.pluginManager.register(e => {
4071
4067
  e.pluginManager.addShape(["card"], container => Promise.resolve(new CardDrawer(container)));
4072
4068
  });
4073
4069
  }
4074
4070
 
4075
4071
  async function loadCardsShape(engine) {
4076
- engine.checkVersion("4.0.0-beta.15");
4072
+ engine.checkVersion("4.0.0-beta.17");
4077
4073
  await Promise.all([
4078
4074
  loadFullCardsShape(engine),
4079
4075
  loadCardSuitsShape(engine),
@@ -4143,7 +4139,7 @@
4143
4139
  }
4144
4140
 
4145
4141
  async function loadCogShape(engine) {
4146
- engine.checkVersion("4.0.0-beta.15");
4142
+ engine.checkVersion("4.0.0-beta.17");
4147
4143
  await engine.pluginManager.register(e => {
4148
4144
  e.pluginManager.addShape(["cog"], () => Promise.resolve(new CogDrawer()));
4149
4145
  });
@@ -7783,7 +7779,7 @@
7783
7779
 
7784
7780
  const curlNoisePathName = "curlNoise";
7785
7781
  async function loadCurlNoisePath(engine) {
7786
- engine.checkVersion("4.0.0-beta.15");
7782
+ engine.checkVersion("4.0.0-beta.17");
7787
7783
  await engine.pluginManager.register((e) => {
7788
7784
  ensureBaseMoverLoaded(e);
7789
7785
  e.pluginManager.addPathGenerator?.(curlNoisePathName, container => {
@@ -7886,7 +7882,7 @@
7886
7882
 
7887
7883
  const curvesPathName = "curvesPathGenerator";
7888
7884
  async function loadCurvesPath(engine) {
7889
- engine.checkVersion("4.0.0-beta.15");
7885
+ engine.checkVersion("4.0.0-beta.17");
7890
7886
  await engine.pluginManager.register((e) => {
7891
7887
  ensureBaseMoverLoaded(e);
7892
7888
  e.pluginManager.addPathGenerator?.(curvesPathName, container => {
@@ -7912,7 +7908,7 @@
7912
7908
  });
7913
7909
 
7914
7910
  async function loadEasingBackPlugin(engine) {
7915
- engine.checkVersion("4.0.0-beta.15");
7911
+ engine.checkVersion("4.0.0-beta.17");
7916
7912
  await engine.pluginManager.register(e => {
7917
7913
  for (const [easing, easingFn] of easingsFunctions$d) {
7918
7914
  e.pluginManager.addEasing(easing, easingFn);
@@ -7943,7 +7939,7 @@
7943
7939
  easingsFunctions$c.set(exports.EasingType.easeInOutBounce, value => value < 0.5 ? (1 - bounceOut(1 - value * 2)) / 2 : (1 + bounceOut(value * 2 - 1)) / 2);
7944
7940
 
7945
7941
  async function loadEasingBouncePlugin(engine) {
7946
- engine.checkVersion("4.0.0-beta.15");
7942
+ engine.checkVersion("4.0.0-beta.17");
7947
7943
  await engine.pluginManager.register(e => {
7948
7944
  for (const [easing, easingFn] of easingsFunctions$c) {
7949
7945
  e.pluginManager.addEasing(easing, easingFn);
@@ -7957,7 +7953,7 @@
7957
7953
  easingsFunctions$b.set(exports.EasingType.easeInOutCirc, value => value < 0.5 ? (1 - Math.sqrt(1 - (2 * value) ** 2)) / 2 : (Math.sqrt(1 - (-2 * value + 2) ** 2) + 1) / 2);
7958
7954
 
7959
7955
  async function loadEasingCircPlugin(engine) {
7960
- engine.checkVersion("4.0.0-beta.15");
7956
+ engine.checkVersion("4.0.0-beta.17");
7961
7957
  await engine.pluginManager.register(e => {
7962
7958
  for (const [easing, easingFn] of easingsFunctions$b) {
7963
7959
  e.pluginManager.addEasing(easing, easingFn);
@@ -7971,7 +7967,7 @@
7971
7967
  easingsFunctions$a.set(exports.EasingType.easeInOutCubic, value => value < 0.5 ? 4 * value ** 3 : 1 - (-2 * value + 2) ** 3 / 2);
7972
7968
 
7973
7969
  async function loadEasingCubicPlugin(engine) {
7974
- engine.checkVersion("4.0.0-beta.15");
7970
+ engine.checkVersion("4.0.0-beta.17");
7975
7971
  await engine.pluginManager.register(e => {
7976
7972
  for (const [easing, easingFn] of easingsFunctions$a) {
7977
7973
  e.pluginManager.addEasing(easing, easingFn);
@@ -8004,7 +8000,7 @@
8004
8000
  });
8005
8001
 
8006
8002
  async function loadEasingElasticPlugin(engine) {
8007
- engine.checkVersion("4.0.0-beta.15");
8003
+ engine.checkVersion("4.0.0-beta.17");
8008
8004
  await engine.pluginManager.register(e => {
8009
8005
  for (const [easing, easingFn] of easingsFunctions$9) {
8010
8006
  e.pluginManager.addEasing(easing, easingFn);
@@ -8028,7 +8024,7 @@
8028
8024
  });
8029
8025
 
8030
8026
  async function loadEasingExpoPlugin(engine) {
8031
- engine.checkVersion("4.0.0-beta.15");
8027
+ engine.checkVersion("4.0.0-beta.17");
8032
8028
  await engine.pluginManager.register(e => {
8033
8029
  for (const [easing, easingFn] of easingsFunctions$8) {
8034
8030
  e.pluginManager.addEasing(easing, easingFn);
@@ -8042,7 +8038,7 @@
8042
8038
  easingsFunctions$7.set(exports.EasingType.easeInOutGaussian, value => gaussian(value));
8043
8039
 
8044
8040
  async function loadEasingGaussianPlugin(engine) {
8045
- engine.checkVersion("4.0.0-beta.15");
8041
+ engine.checkVersion("4.0.0-beta.17");
8046
8042
  await engine.pluginManager.register(e => {
8047
8043
  for (const [easing, easingFn] of easingsFunctions$7) {
8048
8044
  e.pluginManager.addEasing(easing, easingFn);
@@ -8056,7 +8052,7 @@
8056
8052
  easingsFunctions$6.set(exports.EasingType.easeInOutLinear, value => value);
8057
8053
 
8058
8054
  async function loadEasingLinearPlugin(engine) {
8059
- engine.checkVersion("4.0.0-beta.15");
8055
+ engine.checkVersion("4.0.0-beta.17");
8060
8056
  await engine.pluginManager.register(e => {
8061
8057
  for (const [easing, easingFn] of easingsFunctions$6) {
8062
8058
  e.pluginManager.addEasing(easing, easingFn);
@@ -8070,7 +8066,7 @@
8070
8066
  easingsFunctions$5.set(exports.EasingType.easeInOutQuart, value => value < 0.5 ? 8 * value ** 4 : 1 - (-2 * value + 2) ** 4 / 2);
8071
8067
 
8072
8068
  async function loadEasingQuartPlugin(engine) {
8073
- engine.checkVersion("4.0.0-beta.15");
8069
+ engine.checkVersion("4.0.0-beta.17");
8074
8070
  await engine.pluginManager.register(e => {
8075
8071
  for (const [easing, easingFn] of easingsFunctions$5) {
8076
8072
  e.pluginManager.addEasing(easing, easingFn);
@@ -8084,7 +8080,7 @@
8084
8080
  easingsFunctions$4.set(exports.EasingType.easeInOutQuint, value => value < 0.5 ? 16 * value ** 5 : 1 - (-2 * value + 2) ** 5 / 2);
8085
8081
 
8086
8082
  async function loadEasingQuintPlugin(engine) {
8087
- engine.checkVersion("4.0.0-beta.15");
8083
+ engine.checkVersion("4.0.0-beta.17");
8088
8084
  await engine.pluginManager.register(e => {
8089
8085
  for (const [easing, easingFn] of easingsFunctions$4) {
8090
8086
  e.pluginManager.addEasing(easing, easingFn);
@@ -8098,7 +8094,7 @@
8098
8094
  easingsFunctions$3.set(exports.EasingType.easeInOutSigmoid, value => sigmoid(value));
8099
8095
 
8100
8096
  async function loadEasingSigmoidPlugin(engine) {
8101
- engine.checkVersion("4.0.0-beta.15");
8097
+ engine.checkVersion("4.0.0-beta.17");
8102
8098
  await engine.pluginManager.register(e => {
8103
8099
  for (const [easing, easingFn] of easingsFunctions$3) {
8104
8100
  e.pluginManager.addEasing(easing, easingFn);
@@ -8112,7 +8108,7 @@
8112
8108
  easingsFunctions$2.set(exports.EasingType.easeInOutSine, value => -(Math.cos(Math.PI * value) - 1) / 2);
8113
8109
 
8114
8110
  async function loadEasingSinePlugin(engine) {
8115
- engine.checkVersion("4.0.0-beta.15");
8111
+ engine.checkVersion("4.0.0-beta.17");
8116
8112
  await engine.pluginManager.register(e => {
8117
8113
  for (const [easing, easingFn] of easingsFunctions$2) {
8118
8114
  e.pluginManager.addEasing(easing, easingFn);
@@ -8126,7 +8122,7 @@
8126
8122
  easingsFunctions$1.set(exports.EasingType.easeInOutSmoothstep, value => smoothstep$1(value));
8127
8123
 
8128
8124
  async function loadEasingSmoothstepPlugin(engine) {
8129
- engine.checkVersion("4.0.0-beta.15");
8125
+ engine.checkVersion("4.0.0-beta.17");
8130
8126
  await engine.pluginManager.register(e => {
8131
8127
  for (const [easing, easingFn] of easingsFunctions$1) {
8132
8128
  e.pluginManager.addEasing(easing, easingFn);
@@ -8395,7 +8391,7 @@
8395
8391
  }
8396
8392
 
8397
8393
  async function loadInteractivityPlugin(engine) {
8398
- engine.checkVersion("4.0.0-beta.15");
8394
+ engine.checkVersion("4.0.0-beta.17");
8399
8395
  await engine.pluginManager.register(e => {
8400
8396
  const interactivityEngine = e, interactivityPluginManager = interactivityEngine.pluginManager;
8401
8397
  interactivityPluginManager.addPlugin(new InteractivityPlugin(interactivityPluginManager));
@@ -8800,7 +8796,7 @@
8800
8796
  })(EmitterClickMode || (EmitterClickMode = {}));
8801
8797
 
8802
8798
  async function loadEmittersInteraction(engine) {
8803
- engine.checkVersion("4.0.0-beta.15");
8799
+ engine.checkVersion("4.0.0-beta.17");
8804
8800
  await engine.pluginManager.register(async (e) => {
8805
8801
  const instancesManager = await getEmittersInstancesManager(e);
8806
8802
  ensureInteractivityPluginLoaded(e);
@@ -8843,7 +8839,7 @@
8843
8839
  }
8844
8840
 
8845
8841
  async function loadEmittersPluginSimple(engine) {
8846
- engine.checkVersion("4.0.0-beta.15");
8842
+ engine.checkVersion("4.0.0-beta.17");
8847
8843
  await engine.pluginManager.register(async (e) => {
8848
8844
  const instancesManager = await getEmittersInstancesManager(e);
8849
8845
  await addEmittersShapesManager(e);
@@ -9210,7 +9206,7 @@
9210
9206
  }
9211
9207
 
9212
9208
  async function loadEmittersShapeCanvas(engine) {
9213
- engine.checkVersion("4.0.0-beta.15");
9209
+ engine.checkVersion("4.0.0-beta.17");
9214
9210
  await engine.pluginManager.register((e) => {
9215
9211
  ensureEmittersPluginLoaded(e);
9216
9212
  e.pluginManager.addEmitterShapeGenerator?.("canvas", new EmittersCanvasShapeGenerator());
@@ -9350,7 +9346,7 @@
9350
9346
  }
9351
9347
 
9352
9348
  async function loadEmittersShapePath(engine) {
9353
- engine.checkVersion("4.0.0-beta.15");
9349
+ engine.checkVersion("4.0.0-beta.17");
9354
9350
  await engine.pluginManager.register((e) => {
9355
9351
  ensureEmittersPluginLoaded(e);
9356
9352
  e.pluginManager.addEmitterShapeGenerator?.("path", new EmittersPathShapeGenerator());
@@ -9481,7 +9477,7 @@
9481
9477
  }
9482
9478
 
9483
9479
  async function loadEmittersShapePolygon(engine) {
9484
- engine.checkVersion("4.0.0-beta.15");
9480
+ engine.checkVersion("4.0.0-beta.17");
9485
9481
  await engine.pluginManager.register((e) => {
9486
9482
  ensureEmittersPluginLoaded(e);
9487
9483
  e.pluginManager.addEmitterShapeGenerator?.("polygon", new EmittersPolygonShapeGenerator());
@@ -9502,7 +9498,7 @@
9502
9498
  }
9503
9499
 
9504
9500
  async function loadExportImagePlugin(engine) {
9505
- engine.checkVersion("4.0.0-beta.15");
9501
+ engine.checkVersion("4.0.0-beta.17");
9506
9502
  await engine.pluginManager.register(e => {
9507
9503
  e.pluginManager.addPlugin(new ExportImagePlugin());
9508
9504
  });
@@ -9522,7 +9518,7 @@
9522
9518
  }
9523
9519
 
9524
9520
  async function loadExportJSONPlugin(engine) {
9525
- engine.checkVersion("4.0.0-beta.15");
9521
+ engine.checkVersion("4.0.0-beta.17");
9526
9522
  await engine.pluginManager.register(e => {
9527
9523
  e.pluginManager.addPlugin(new ExportJSONPlugin());
9528
9524
  });
@@ -9542,7 +9538,7 @@
9542
9538
  }
9543
9539
 
9544
9540
  async function loadExportVideoPlugin(engine) {
9545
- engine.checkVersion("4.0.0-beta.15");
9541
+ engine.checkVersion("4.0.0-beta.17");
9546
9542
  await engine.pluginManager.register(e => {
9547
9543
  e.pluginManager.addPlugin(new ExportVideoPlugin());
9548
9544
  });
@@ -9720,7 +9716,7 @@
9720
9716
  }
9721
9717
 
9722
9718
  async function loadExternalCannonInteraction(engine) {
9723
- engine.checkVersion("4.0.0-beta.15");
9719
+ engine.checkVersion("4.0.0-beta.17");
9724
9720
  await engine.pluginManager.register((e) => {
9725
9721
  ensureInteractivityPluginLoaded(e);
9726
9722
  e.pluginManager.addInteractor?.("externalCannon", container => {
@@ -9863,7 +9859,7 @@
9863
9859
  }
9864
9860
 
9865
9861
  async function loadExternalParticleInteraction(engine) {
9866
- engine.checkVersion("4.0.0-beta.15");
9862
+ engine.checkVersion("4.0.0-beta.17");
9867
9863
  await engine.pluginManager.register((e) => {
9868
9864
  ensureInteractivityPluginLoaded(e);
9869
9865
  e.pluginManager.addInteractor?.("externalParticle", container => {
@@ -9911,7 +9907,7 @@
9911
9907
  }
9912
9908
 
9913
9909
  async function loadExternalPopInteraction(engine) {
9914
- engine.checkVersion("4.0.0-beta.15");
9910
+ engine.checkVersion("4.0.0-beta.17");
9915
9911
  await engine.pluginManager.register((e) => {
9916
9912
  ensureInteractivityPluginLoaded(e);
9917
9913
  e.pluginManager.addInteractor?.("externalPop", container => {
@@ -9952,7 +9948,7 @@
9952
9948
  }
9953
9949
 
9954
9950
  async function loadFilterEffect(engine) {
9955
- engine.checkVersion("4.0.0-beta.15");
9951
+ engine.checkVersion("4.0.0-beta.17");
9956
9952
  await engine.pluginManager.register(e => {
9957
9953
  e.pluginManager.addEffect("filter", () => {
9958
9954
  return Promise.resolve(new FilterDrawer());
@@ -10234,7 +10230,7 @@
10234
10230
 
10235
10231
  const fractalNoisePathName = "fractalNoise";
10236
10232
  async function loadFractalNoisePath(engine) {
10237
- engine.checkVersion("4.0.0-beta.15");
10233
+ engine.checkVersion("4.0.0-beta.17");
10238
10234
  await engine.pluginManager.register((e) => {
10239
10235
  ensureBaseMoverLoaded(e);
10240
10236
  e.pluginManager.addPathGenerator?.(fractalNoisePathName, container => {
@@ -10484,7 +10480,7 @@
10484
10480
  }
10485
10481
 
10486
10482
  async function loadAbsorbersInteraction(engine) {
10487
- engine.checkVersion("4.0.0-beta.15");
10483
+ engine.checkVersion("4.0.0-beta.17");
10488
10484
  await engine.pluginManager.register(async (e) => {
10489
10485
  const pluginManager = e.pluginManager, instancesManager = await getAbsorbersInstancesManager(e);
10490
10486
  ensureInteractivityPluginLoaded(e);
@@ -10532,7 +10528,7 @@
10532
10528
  }
10533
10529
 
10534
10530
  async function loadAbsorbersPluginSimple(engine) {
10535
- engine.checkVersion("4.0.0-beta.15");
10531
+ engine.checkVersion("4.0.0-beta.17");
10536
10532
  await engine.pluginManager.register(async (e) => {
10537
10533
  const pluginManager = e.pluginManager, instancesManager = await getAbsorbersInstancesManager(e);
10538
10534
  pluginManager.addPlugin(new AbsorbersPlugin(instancesManager));
@@ -10897,7 +10893,7 @@
10897
10893
  }
10898
10894
 
10899
10895
  async function loadDestroyUpdater(engine) {
10900
- engine.checkVersion("4.0.0-beta.15");
10896
+ engine.checkVersion("4.0.0-beta.17");
10901
10897
  await engine.pluginManager.register(e => {
10902
10898
  e.pluginManager.addParticleUpdater("destroy", container => {
10903
10899
  return Promise.resolve(new DestroyUpdater(e.pluginManager, container));
@@ -10944,7 +10940,7 @@
10944
10940
  }
10945
10941
 
10946
10942
  async function loadEmittersShapeCircle(engine) {
10947
- engine.checkVersion("4.0.0-beta.15");
10943
+ engine.checkVersion("4.0.0-beta.17");
10948
10944
  await engine.pluginManager.register((e) => {
10949
10945
  ensureEmittersPluginLoaded(e);
10950
10946
  e.pluginManager.addEmitterShapeGenerator?.("circle", new EmittersCircleShapeGenerator());
@@ -11025,7 +11021,7 @@
11025
11021
  }
11026
11022
 
11027
11023
  async function loadEmittersShapeSquare(engine) {
11028
- engine.checkVersion("4.0.0-beta.15");
11024
+ engine.checkVersion("4.0.0-beta.17");
11029
11025
  await engine.pluginManager.register((e) => {
11030
11026
  ensureEmittersPluginLoaded(e);
11031
11027
  e.pluginManager.addEmitterShapeGenerator?.("square", new EmittersSquareShapeGenerator());
@@ -11218,7 +11214,7 @@
11218
11214
  }
11219
11215
 
11220
11216
  async function loadExternalDragInteraction(engine) {
11221
- engine.checkVersion("4.0.0-beta.15");
11217
+ engine.checkVersion("4.0.0-beta.17");
11222
11218
  await engine.pluginManager.register((e) => {
11223
11219
  ensureInteractivityPluginLoaded(e);
11224
11220
  e.pluginManager.addInteractor?.("externalDrag", container => {
@@ -11422,7 +11418,7 @@
11422
11418
  }
11423
11419
 
11424
11420
  async function loadExternalTrailInteraction(engine) {
11425
- engine.checkVersion("4.0.0-beta.15");
11421
+ engine.checkVersion("4.0.0-beta.17");
11426
11422
  await engine.pluginManager.register((e) => {
11427
11423
  ensureInteractivityPluginLoaded(e);
11428
11424
  e.pluginManager.addInteractor?.("externalTrail", container => {
@@ -11582,7 +11578,7 @@
11582
11578
  }
11583
11579
 
11584
11580
  async function loadRollUpdater(engine) {
11585
- engine.checkVersion("4.0.0-beta.15");
11581
+ engine.checkVersion("4.0.0-beta.17");
11586
11582
  await engine.pluginManager.register(e => {
11587
11583
  e.pluginManager.addParticleUpdater("roll", () => {
11588
11584
  return Promise.resolve(new RollUpdater(e.pluginManager));
@@ -11621,7 +11617,7 @@
11621
11617
  }
11622
11618
 
11623
11619
  async function loadCircleShape(engine) {
11624
- engine.checkVersion("4.0.0-beta.15");
11620
+ engine.checkVersion("4.0.0-beta.17");
11625
11621
  await engine.pluginManager.register(e => {
11626
11622
  e.pluginManager.addShape(["circle"], () => {
11627
11623
  return Promise.resolve(new CircleDrawer());
@@ -11669,7 +11665,7 @@
11669
11665
  }
11670
11666
 
11671
11667
  async function loadHexColorPlugin(engine) {
11672
- engine.checkVersion("4.0.0-beta.15");
11668
+ engine.checkVersion("4.0.0-beta.17");
11673
11669
  await engine.pluginManager.register(e => {
11674
11670
  e.pluginManager.addColorManager("hex", new HexColorManager());
11675
11671
  });
@@ -11722,7 +11718,7 @@
11722
11718
  }
11723
11719
 
11724
11720
  async function loadHslColorPlugin(engine) {
11725
- engine.checkVersion("4.0.0-beta.15");
11721
+ engine.checkVersion("4.0.0-beta.17");
11726
11722
  await engine.pluginManager.register(e => {
11727
11723
  e.pluginManager.addColorManager("hsl", new HslColorManager());
11728
11724
  });
@@ -11771,7 +11767,7 @@
11771
11767
  }
11772
11768
 
11773
11769
  async function loadOpacityUpdater(engine) {
11774
- engine.checkVersion("4.0.0-beta.15");
11770
+ engine.checkVersion("4.0.0-beta.17");
11775
11771
  await engine.pluginManager.register(e => {
11776
11772
  e.pluginManager.addParticleUpdater("opacity", container => {
11777
11773
  return Promise.resolve(new OpacityUpdater(container));
@@ -12123,7 +12119,7 @@
12123
12119
  }
12124
12120
 
12125
12121
  async function loadOutModesUpdater(engine) {
12126
- engine.checkVersion("4.0.0-beta.15");
12122
+ engine.checkVersion("4.0.0-beta.17");
12127
12123
  await engine.pluginManager.register(e => {
12128
12124
  e.pluginManager.addParticleUpdater("outModes", container => {
12129
12125
  return Promise.resolve(new OutOfCanvasUpdater(container));
@@ -12194,7 +12190,7 @@
12194
12190
  }
12195
12191
 
12196
12192
  async function loadPaintUpdater(engine) {
12197
- engine.checkVersion("4.0.0-beta.15");
12193
+ engine.checkVersion("4.0.0-beta.17");
12198
12194
  await engine.pluginManager.register(e => {
12199
12195
  e.pluginManager.addParticleUpdater("paint", container => {
12200
12196
  return Promise.resolve(new PaintUpdater(e.pluginManager, container));
@@ -12249,7 +12245,7 @@
12249
12245
  }
12250
12246
 
12251
12247
  async function loadRgbColorPlugin(engine) {
12252
- engine.checkVersion("4.0.0-beta.15");
12248
+ engine.checkVersion("4.0.0-beta.17");
12253
12249
  await engine.pluginManager.register(e => {
12254
12250
  e.pluginManager.addColorManager("rgb", new RgbColorManager());
12255
12251
  });
@@ -12292,7 +12288,7 @@
12292
12288
  }
12293
12289
 
12294
12290
  async function loadSizeUpdater(engine) {
12295
- engine.checkVersion("4.0.0-beta.15");
12291
+ engine.checkVersion("4.0.0-beta.17");
12296
12292
  await engine.pluginManager.register(e => {
12297
12293
  e.pluginManager.addParticleUpdater("size", container => {
12298
12294
  return Promise.resolve(new SizeUpdater(container));
@@ -12301,7 +12297,7 @@
12301
12297
  }
12302
12298
 
12303
12299
  async function loadBasic(engine) {
12304
- engine.checkVersion("4.0.0-beta.15");
12300
+ engine.checkVersion("4.0.0-beta.17");
12305
12301
  await engine.pluginManager.register(async (e) => {
12306
12302
  await Promise.all([
12307
12303
  loadHexColorPlugin(e),
@@ -12323,7 +12319,7 @@
12323
12319
  easingsFunctions.set(exports.EasingType.easeInOutQuad, value => (value < 0.5 ? 2 * value ** 2 : 1 - (-2 * value + 2) ** 2 / 2));
12324
12320
 
12325
12321
  async function loadEasingQuadPlugin(engine) {
12326
- engine.checkVersion("4.0.0-beta.15");
12322
+ engine.checkVersion("4.0.0-beta.17");
12327
12323
  await engine.pluginManager.register(e => {
12328
12324
  for (const [easing, easingFn] of easingsFunctions) {
12329
12325
  e.pluginManager.addEasing(easing, easingFn);
@@ -12402,19 +12398,7 @@
12402
12398
  particle.emojiDataKey = cacheKey;
12403
12399
  return;
12404
12400
  }
12405
- const padding = emojiOptions.padding * double, maxSize = getRangeMax(particle.size.value), fullSize = maxSize + padding, canvasSize = fullSize * double;
12406
- let cacheCanvas, context;
12407
- if (typeof OffscreenCanvas === "undefined") {
12408
- const canvas = safeDocument().createElement("canvas");
12409
- canvas.width = canvasSize;
12410
- canvas.height = canvasSize;
12411
- context = canvas.getContext("2d", container.canvas.render.settings);
12412
- cacheCanvas = canvas;
12413
- }
12414
- else {
12415
- cacheCanvas = new OffscreenCanvas(canvasSize, canvasSize);
12416
- context = cacheCanvas.getContext("2d", container.canvas.render.settings);
12417
- }
12401
+ const padding = emojiOptions.padding * double, maxSize = getRangeMax(particle.size.value), fullSize = maxSize + padding, canvasSize = fullSize * double, cacheCanvas = new OffscreenCanvas(canvasSize, canvasSize), context = cacheCanvas.getContext("2d", container.canvas.render.settings);
12418
12402
  if (!context) {
12419
12403
  return;
12420
12404
  }
@@ -12429,14 +12413,14 @@
12429
12413
  }
12430
12414
 
12431
12415
  async function loadEmojiShape(engine) {
12432
- engine.checkVersion("4.0.0-beta.15");
12416
+ engine.checkVersion("4.0.0-beta.17");
12433
12417
  await engine.pluginManager.register(e => {
12434
12418
  e.pluginManager.addShape(validTypes$1, () => Promise.resolve(new EmojiDrawer()));
12435
12419
  });
12436
12420
  }
12437
12421
 
12438
12422
  const minFactor = 1, minRadius$6 = 0, updateVector = Vector.origin;
12439
- function processAttract(pluginManager, container, position, attractRadius, area, queryCb) {
12423
+ function processAttract(pluginManager, container, position, attractRadius, area, queryCb, onAttractParticle) {
12440
12424
  const attractOptions = container.actualOptions.interactivity?.modes.attract;
12441
12425
  if (!attractOptions) {
12442
12426
  return;
@@ -12446,10 +12430,11 @@
12446
12430
  const { dx, dy, distance } = getDistances(particle.position, position), velocity = attractOptions.speed * attractOptions.factor, attractFactor = clamp(pluginManager.getEasing(attractOptions.easing)(identity$5 - distance / attractRadius) * velocity, minFactor, attractOptions.maxSpeed);
12447
12431
  updateVector.x = !distance ? velocity : (dx / distance) * attractFactor;
12448
12432
  updateVector.y = !distance ? velocity : (dy / distance) * attractFactor;
12433
+ onAttractParticle?.(particle);
12449
12434
  particle.position.subFrom(updateVector);
12450
12435
  }
12451
12436
  }
12452
- function clickAttract(pluginManager, container, interactivityData, enabledCb) {
12437
+ function clickAttract(pluginManager, container, interactivityData, enabledCb, onAttractParticle) {
12453
12438
  container.attract ??= { particles: [] };
12454
12439
  const { attract } = container;
12455
12440
  if (!attract.finish) {
@@ -12464,18 +12449,18 @@
12464
12449
  if (!attractRadius || attractRadius < minRadius$6 || !mousePos) {
12465
12450
  return;
12466
12451
  }
12467
- processAttract(pluginManager, container, mousePos, attractRadius, new Circle(mousePos.x, mousePos.y, attractRadius), (p) => enabledCb(p));
12452
+ processAttract(pluginManager, container, mousePos, attractRadius, new Circle(mousePos.x, mousePos.y, attractRadius), (p) => enabledCb(p), onAttractParticle);
12468
12453
  }
12469
12454
  else if (attract.clicking === false) {
12470
12455
  attract.particles = [];
12471
12456
  }
12472
12457
  }
12473
- function hoverAttract(pluginManager, container, interactivityData, enabledCb) {
12458
+ function hoverAttract(pluginManager, container, interactivityData, enabledCb, onAttractParticle) {
12474
12459
  const mousePos = interactivityData.mouse.position, attractRadius = container.retina.attractModeDistance;
12475
12460
  if (!attractRadius || attractRadius < minRadius$6 || !mousePos) {
12476
12461
  return;
12477
12462
  }
12478
- processAttract(pluginManager, container, mousePos, attractRadius, new Circle(mousePos.x, mousePos.y, attractRadius), (p) => enabledCb(p));
12463
+ processAttract(pluginManager, container, mousePos, attractRadius, new Circle(mousePos.x, mousePos.y, attractRadius), (p) => enabledCb(p), onAttractParticle);
12479
12464
  }
12480
12465
 
12481
12466
  let Attract$1 = class Attract {
@@ -12484,6 +12469,7 @@
12484
12469
  easing;
12485
12470
  factor;
12486
12471
  maxSpeed;
12472
+ restore;
12487
12473
  speed;
12488
12474
  constructor() {
12489
12475
  this.distance = 200;
@@ -12492,6 +12478,12 @@
12492
12478
  this.factor = 1;
12493
12479
  this.maxSpeed = 50;
12494
12480
  this.speed = 1;
12481
+ this.restore = {
12482
+ enable: false,
12483
+ delay: 0,
12484
+ speed: 0.08,
12485
+ follow: true,
12486
+ };
12495
12487
  }
12496
12488
  load(data) {
12497
12489
  if (isNull(data)) {
@@ -12515,18 +12507,28 @@
12515
12507
  if (data.speed !== undefined) {
12516
12508
  this.speed = data.speed;
12517
12509
  }
12510
+ if (data.restore !== undefined) {
12511
+ this.restore.enable = data.restore.enable ?? this.restore.enable;
12512
+ this.restore.delay = data.restore.delay ?? this.restore.delay;
12513
+ this.restore.speed = data.restore.speed ?? this.restore.speed;
12514
+ this.restore.follow = data.restore.follow ?? this.restore.follow;
12515
+ }
12518
12516
  }
12519
12517
  };
12520
12518
 
12521
- const attractMode = "attract";
12519
+ const attractMode = "attract", minVelocityLengthSq = 0, minRestoreSpeed$1 = 0.001, maxRestoreSpeed$1 = 1, restoreEpsilon$1 = 0.5;
12522
12520
  let Attractor$1 = class Attractor extends ExternalInteractorBase {
12523
12521
  handleClickMode;
12522
+ _interactedThisFrame;
12524
12523
  _maxDistance;
12525
12524
  _pluginManager;
12525
+ _restoreData;
12526
12526
  constructor(pluginManager, container) {
12527
12527
  super(container);
12528
12528
  this._pluginManager = pluginManager;
12529
12529
  this._maxDistance = 0;
12530
+ this._interactedThisFrame = new Set();
12531
+ this._restoreData = new Map();
12530
12532
  container.attract ??= { particles: [] };
12531
12533
  this.handleClickMode = (mode, interactivityData) => {
12532
12534
  const options = this.container.actualOptions, attract = options.interactivity?.modes.attract;
@@ -12567,17 +12569,23 @@
12567
12569
  container.retina.attractModeDistance = attract.distance * container.retina.pixelRatio;
12568
12570
  }
12569
12571
  interact(interactivityData) {
12572
+ this._interactedThisFrame.clear();
12570
12573
  const container = this.container, options = container.actualOptions, mouseMoveStatus = interactivityData.status === mouseMoveEvent, events = options.interactivity?.events;
12571
12574
  if (!events) {
12572
12575
  return;
12573
12576
  }
12574
12577
  const { enable: hoverEnabled, mode: hoverMode } = events.onHover, { enable: clickEnabled, mode: clickMode } = events.onClick;
12575
12578
  if (mouseMoveStatus && hoverEnabled && isInArray(attractMode, hoverMode)) {
12576
- hoverAttract(this._pluginManager, this.container, interactivityData, p => this.isEnabled(interactivityData, p));
12579
+ hoverAttract(this._pluginManager, this.container, interactivityData, p => this.isEnabled(interactivityData, p), p => {
12580
+ this._trackInteractedParticle(p);
12581
+ });
12577
12582
  }
12578
12583
  else if (clickEnabled && isInArray(attractMode, clickMode)) {
12579
- clickAttract(this._pluginManager, this.container, interactivityData, p => this.isEnabled(interactivityData, p));
12584
+ clickAttract(this._pluginManager, this.container, interactivityData, p => this.isEnabled(interactivityData, p), p => {
12585
+ this._trackInteractedParticle(p);
12586
+ });
12580
12587
  }
12588
+ this._restoreParticles();
12581
12589
  }
12582
12590
  isEnabled(interactivityData, particle) {
12583
12591
  const container = this.container, options = container.actualOptions, mouse = interactivityData.mouse, events = (particle?.interactivity ?? options.interactivity)?.events;
@@ -12595,10 +12603,67 @@
12595
12603
  }
12596
12604
  reset() {
12597
12605
  }
12606
+ _restoreParticles() {
12607
+ const restore = this.container.actualOptions.interactivity?.modes.attract?.restore;
12608
+ if (!restore?.enable || !this._restoreData.size) {
12609
+ return;
12610
+ }
12611
+ const now = Date.now(), restoreDelay = restore.delay * millisecondsToSeconds, restoreSpeed = Math.max(minRestoreSpeed$1, Math.min(maxRestoreSpeed$1, restore.speed));
12612
+ for (const [particle, restoreData] of this._restoreData) {
12613
+ if (this._interactedThisFrame.has(particle)) {
12614
+ continue;
12615
+ }
12616
+ if (particle.destroyed) {
12617
+ this._restoreData.delete(particle);
12618
+ continue;
12619
+ }
12620
+ const target = restoreData.target;
12621
+ if (now - restoreData.lastInteractionTime < restoreDelay) {
12622
+ continue;
12623
+ }
12624
+ let dx = target.x - particle.position.x, dy = target.y - particle.position.y, dz = target.z - particle.position.z;
12625
+ if (restore.follow && particle.options.move.enable) {
12626
+ const { x: vx, y: vy, z: vz } = particle.velocity, velocityLengthSq = vx * vx + vy * vy + vz * vz;
12627
+ if (velocityLengthSq > minVelocityLengthSq) {
12628
+ const parallelScale = (dx * vx + dy * vy + dz * vz) / velocityLengthSq;
12629
+ dx -= vx * parallelScale;
12630
+ dy -= vy * parallelScale;
12631
+ dz -= vz * parallelScale;
12632
+ }
12633
+ }
12634
+ particle.position.x += dx * restoreSpeed;
12635
+ particle.position.y += dy * restoreSpeed;
12636
+ particle.position.z += dz * restoreSpeed;
12637
+ if (Math.abs(dx) <= restoreEpsilon$1 && Math.abs(dy) <= restoreEpsilon$1) {
12638
+ particle.position.x = target.x;
12639
+ particle.position.y = target.y;
12640
+ particle.position.z = target.z;
12641
+ this._restoreData.delete(particle);
12642
+ continue;
12643
+ }
12644
+ }
12645
+ }
12646
+ _trackInteractedParticle(particle) {
12647
+ this._interactedThisFrame.add(particle);
12648
+ const restore = this.container.actualOptions.interactivity?.modes.attract?.restore;
12649
+ if (!restore?.enable) {
12650
+ return;
12651
+ }
12652
+ const now = Date.now();
12653
+ let restoreData = this._restoreData.get(particle);
12654
+ if (!restoreData) {
12655
+ restoreData = {
12656
+ target: particle.position.copy(),
12657
+ lastInteractionTime: now,
12658
+ };
12659
+ this._restoreData.set(particle, restoreData);
12660
+ }
12661
+ restoreData.lastInteractionTime = now;
12662
+ }
12598
12663
  };
12599
12664
 
12600
12665
  async function loadExternalAttractInteraction(engine) {
12601
- engine.checkVersion("4.0.0-beta.15");
12666
+ engine.checkVersion("4.0.0-beta.17");
12602
12667
  await engine.pluginManager.register((e) => {
12603
12668
  ensureInteractivityPluginLoaded(e);
12604
12669
  e.pluginManager.addInteractor?.("externalAttract", container => {
@@ -12795,7 +12860,7 @@
12795
12860
  }
12796
12861
 
12797
12862
  async function loadExternalBounceInteraction(engine) {
12798
- engine.checkVersion("4.0.0-beta.15");
12863
+ engine.checkVersion("4.0.0-beta.17");
12799
12864
  await engine.pluginManager.register((e) => {
12800
12865
  ensureInteractivityPluginLoaded(e);
12801
12866
  e.pluginManager.addInteractor?.("externalBounce", container => {
@@ -13175,7 +13240,7 @@
13175
13240
  }
13176
13241
 
13177
13242
  async function loadExternalBubbleInteraction(engine) {
13178
- engine.checkVersion("4.0.0-beta.15");
13243
+ engine.checkVersion("4.0.0-beta.17");
13179
13244
  await engine.pluginManager.register((e) => {
13180
13245
  ensureInteractivityPluginLoaded(e);
13181
13246
  e.pluginManager.addInteractor?.("externalBubble", container => {
@@ -13320,7 +13385,7 @@
13320
13385
  }
13321
13386
 
13322
13387
  async function loadExternalConnectInteraction(engine) {
13323
- engine.checkVersion("4.0.0-beta.15");
13388
+ engine.checkVersion("4.0.0-beta.17");
13324
13389
  await engine.pluginManager.register((e) => {
13325
13390
  ensureInteractivityPluginLoaded(e);
13326
13391
  e.pluginManager.addInteractor?.("externalConnect", container => {
@@ -13432,7 +13497,7 @@
13432
13497
  }
13433
13498
 
13434
13499
  async function loadExternalDestroyInteraction(engine) {
13435
- engine.checkVersion("4.0.0-beta.15");
13500
+ engine.checkVersion("4.0.0-beta.17");
13436
13501
  await engine.pluginManager.register((e) => {
13437
13502
  ensureInteractivityPluginLoaded(e);
13438
13503
  e.pluginManager.addInteractor?.("externalDestroy", async (container) => {
@@ -13576,7 +13641,7 @@
13576
13641
  }
13577
13642
 
13578
13643
  async function loadExternalGrabInteraction(engine) {
13579
- engine.checkVersion("4.0.0-beta.15");
13644
+ engine.checkVersion("4.0.0-beta.17");
13580
13645
  await engine.pluginManager.register((e) => {
13581
13646
  ensureInteractivityPluginLoaded(e);
13582
13647
  e.pluginManager.addInteractor?.("externalGrab", container => {
@@ -13657,7 +13722,7 @@
13657
13722
  }
13658
13723
 
13659
13724
  async function loadExternalParallaxInteraction(engine) {
13660
- engine.checkVersion("4.0.0-beta.15");
13725
+ engine.checkVersion("4.0.0-beta.17");
13661
13726
  await engine.pluginManager.register((e) => {
13662
13727
  ensureInteractivityPluginLoaded(e);
13663
13728
  e.pluginManager.addInteractor?.("externalParallax", container => {
@@ -13700,7 +13765,7 @@
13700
13765
  }
13701
13766
 
13702
13767
  async function loadExternalPauseInteraction(engine) {
13703
- engine.checkVersion("4.0.0-beta.15");
13768
+ engine.checkVersion("4.0.0-beta.17");
13704
13769
  await engine.pluginManager.register((e) => {
13705
13770
  ensureInteractivityPluginLoaded(e);
13706
13771
  e.pluginManager.addInteractor?.("externalPause", container => {
@@ -13785,7 +13850,7 @@
13785
13850
  }
13786
13851
 
13787
13852
  async function loadExternalPushInteraction(engine) {
13788
- engine.checkVersion("4.0.0-beta.15");
13853
+ engine.checkVersion("4.0.0-beta.17");
13789
13854
  await engine.pluginManager.register((e) => {
13790
13855
  ensureInteractivityPluginLoaded(e);
13791
13856
  e.pluginManager.addInteractor?.("externalPush", container => {
@@ -13848,7 +13913,7 @@
13848
13913
  }
13849
13914
 
13850
13915
  async function loadExternalRemoveInteraction(engine) {
13851
- engine.checkVersion("4.0.0-beta.15");
13916
+ engine.checkVersion("4.0.0-beta.17");
13852
13917
  await engine.pluginManager.register((e) => {
13853
13918
  ensureInteractivityPluginLoaded(e);
13854
13919
  e.pluginManager.addInteractor?.("externalRemove", container => {
@@ -13863,6 +13928,7 @@
13863
13928
  easing;
13864
13929
  factor;
13865
13930
  maxSpeed;
13931
+ restore;
13866
13932
  speed;
13867
13933
  constructor() {
13868
13934
  this.distance = 200;
@@ -13871,6 +13937,12 @@
13871
13937
  this.speed = 1;
13872
13938
  this.maxSpeed = 50;
13873
13939
  this.easing = exports.EasingType.easeOutQuad;
13940
+ this.restore = {
13941
+ enable: false,
13942
+ delay: 0,
13943
+ speed: 0.08,
13944
+ follow: true,
13945
+ };
13874
13946
  }
13875
13947
  load(data) {
13876
13948
  if (isNull(data)) {
@@ -13894,6 +13966,12 @@
13894
13966
  if (data.maxSpeed !== undefined) {
13895
13967
  this.maxSpeed = data.maxSpeed;
13896
13968
  }
13969
+ if (data.restore !== undefined) {
13970
+ this.restore.enable = data.restore.enable ?? this.restore.enable;
13971
+ this.restore.delay = data.restore.delay ?? this.restore.delay;
13972
+ this.restore.speed = data.restore.speed ?? this.restore.speed;
13973
+ this.restore.follow = data.restore.follow ?? this.restore.follow;
13974
+ }
13897
13975
  }
13898
13976
  }
13899
13977
 
@@ -13929,19 +14007,23 @@
13929
14007
  }
13930
14008
  }
13931
14009
 
13932
- const repulseMode = "repulse", minDistance$3 = 0, repulseRadiusFactor = 6, repulseRadiusPower = 3, squarePower = 2, minRadius$3 = 0, minSpeed = 0, easingOffset = 1;
14010
+ const repulseMode = "repulse", minDistance$3 = 0, repulseRadiusFactor = 6, repulseRadiusPower = 3, squarePower = 2, minRadius$3 = 0, minSpeed = 0, easingOffset = 1, minRestoreSpeed = 0.001, maxRestoreSpeed = 1, restoreEpsilon = 0.5;
13933
14011
  let Repulser$1 = class Repulser extends ExternalInteractorBase {
13934
14012
  handleClickMode;
13935
14013
  _clickVec;
14014
+ _interactedThisFrame;
13936
14015
  _maxDistance;
13937
14016
  _normVec;
13938
14017
  _pluginManager;
14018
+ _restoreData;
13939
14019
  constructor(pluginManager, container) {
13940
14020
  super(container);
13941
14021
  this._pluginManager = pluginManager;
13942
14022
  this._maxDistance = 0;
13943
14023
  this._normVec = Vector.origin;
14024
+ this._interactedThisFrame = new Set();
13944
14025
  this._clickVec = Vector.origin;
14026
+ this._restoreData = new Map();
13945
14027
  container.repulse ??= { particles: [] };
13946
14028
  this.handleClickMode = (mode, interactivityData) => {
13947
14029
  const options = this.container.actualOptions, repulseOpts = options.interactivity?.modes.repulse;
@@ -13982,6 +14064,7 @@
13982
14064
  container.retina.repulseModeDistance = repulse.distance * container.retina.pixelRatio;
13983
14065
  }
13984
14066
  interact(interactivityData) {
14067
+ this._interactedThisFrame.clear();
13985
14068
  const container = this.container, options = container.actualOptions, mouseMoveStatus = interactivityData.status === mouseMoveEvent, events = options.interactivity?.events;
13986
14069
  if (!events) {
13987
14070
  return;
@@ -13998,6 +14081,7 @@
13998
14081
  this._singleSelectorRepulse(interactivityData, selector, div);
13999
14082
  });
14000
14083
  }
14084
+ this._restoreParticles();
14001
14085
  }
14002
14086
  isEnabled(interactivityData, particle) {
14003
14087
  const container = this.container, options = container.actualOptions, mouse = interactivityData.mouse, events = (particle?.interactivity ?? options.interactivity)?.events;
@@ -14045,6 +14129,7 @@
14045
14129
  for (const particle of query) {
14046
14130
  const { dx, dy, distance } = getDistances(mouseClickPos, particle.position), d = distance ** squarePower, velocity = repulseOptions.speed, force = (-repulseRadius * velocity) / d;
14047
14131
  if (d <= repulseRadius) {
14132
+ this._trackInteractedParticle(particle);
14048
14133
  repulse.particles.push(particle);
14049
14134
  this._clickVec.x = dx;
14050
14135
  this._clickVec.y = dy;
@@ -14077,9 +14162,46 @@
14077
14162
  const { dx, dy, distance } = getDistances(particle.position, position), repulseFactor = clamp(easingFunc(easingOffset - distance / repulseRadius) * velocity, minSpeed, maxSpeed);
14078
14163
  this._normVec.x = !distance ? velocity : (dx / distance) * repulseFactor;
14079
14164
  this._normVec.y = !distance ? velocity : (dy / distance) * repulseFactor;
14165
+ this._trackInteractedParticle(particle);
14080
14166
  particle.position.addTo(this._normVec);
14081
14167
  }
14082
14168
  };
14169
+ _restoreParticles() {
14170
+ const restore = this.container.actualOptions.interactivity?.modes.repulse?.restore;
14171
+ if (!restore?.enable || !this._restoreData.size) {
14172
+ return;
14173
+ }
14174
+ const now = Date.now(), restoreDelay = restore.delay * millisecondsToSeconds, restoreSpeed = Math.max(minRestoreSpeed, Math.min(maxRestoreSpeed, restore.speed));
14175
+ for (const [particle, restoreData] of this._restoreData) {
14176
+ if (this._interactedThisFrame.has(particle)) {
14177
+ continue;
14178
+ }
14179
+ if (particle.destroyed) {
14180
+ this._restoreData.delete(particle);
14181
+ continue;
14182
+ }
14183
+ const target = restoreData.target;
14184
+ if (now - restoreData.lastInteractionTime < restoreDelay) {
14185
+ continue;
14186
+ }
14187
+ if (restore.follow && particle.options.move.enable) {
14188
+ target.x += particle.velocity.x;
14189
+ target.y += particle.velocity.y;
14190
+ target.z += particle.velocity.z;
14191
+ }
14192
+ const dx = target.x - particle.position.x, dy = target.y - particle.position.y, dz = target.z - particle.position.z;
14193
+ particle.position.x += dx * restoreSpeed;
14194
+ particle.position.y += dy * restoreSpeed;
14195
+ particle.position.z += dz * restoreSpeed;
14196
+ if (Math.abs(dx) <= restoreEpsilon && Math.abs(dy) <= restoreEpsilon) {
14197
+ particle.position.x = target.x;
14198
+ particle.position.y = target.y;
14199
+ particle.position.z = target.z;
14200
+ this._restoreData.delete(particle);
14201
+ continue;
14202
+ }
14203
+ }
14204
+ }
14083
14205
  _singleSelectorRepulse = (interactivityData, selector, div) => {
14084
14206
  const container = this.container, repulse = container.actualOptions.interactivity?.modes.repulse;
14085
14207
  if (!repulse) {
@@ -14099,10 +14221,32 @@
14099
14221
  this._processRepulse(interactivityData, pos, repulseRadius, area, divRepulse);
14100
14222
  });
14101
14223
  };
14224
+ _trackInteractedParticle(particle) {
14225
+ this._interactedThisFrame.add(particle);
14226
+ const restore = this.container.actualOptions.interactivity?.modes.repulse?.restore;
14227
+ if (!restore?.enable) {
14228
+ return;
14229
+ }
14230
+ const now = Date.now();
14231
+ let restoreData = this._restoreData.get(particle);
14232
+ if (!restoreData) {
14233
+ restoreData = {
14234
+ target: particle.position.copy(),
14235
+ lastInteractionTime: now,
14236
+ };
14237
+ this._restoreData.set(particle, restoreData);
14238
+ }
14239
+ restoreData.lastInteractionTime = now;
14240
+ if (restore.follow && particle.options.move.enable) {
14241
+ restoreData.target.x += particle.velocity.x;
14242
+ restoreData.target.y += particle.velocity.y;
14243
+ restoreData.target.z += particle.velocity.z;
14244
+ }
14245
+ }
14102
14246
  };
14103
14247
 
14104
14248
  async function loadExternalRepulseInteraction(engine) {
14105
- engine.checkVersion("4.0.0-beta.15");
14249
+ engine.checkVersion("4.0.0-beta.17");
14106
14250
  await engine.pluginManager.register((e) => {
14107
14251
  ensureInteractivityPluginLoaded(e);
14108
14252
  const pluginManager = e.pluginManager;
@@ -14184,7 +14328,7 @@
14184
14328
  }
14185
14329
 
14186
14330
  async function loadExternalSlowInteraction(engine) {
14187
- engine.checkVersion("4.0.0-beta.15");
14331
+ engine.checkVersion("4.0.0-beta.17");
14188
14332
  await engine.pluginManager.register((e) => {
14189
14333
  ensureInteractivityPluginLoaded(e);
14190
14334
  e.pluginManager.addInteractor?.("externalSlow", container => {
@@ -15012,7 +15156,7 @@
15012
15156
  };
15013
15157
  }
15014
15158
  async function loadImageShape(engine) {
15015
- engine.checkVersion("4.0.0-beta.15");
15159
+ engine.checkVersion("4.0.0-beta.17");
15016
15160
  await engine.pluginManager.register(e => {
15017
15161
  addLoadImageToEngine(e);
15018
15162
  e.pluginManager.addPlugin(new ImagePreloaderPlugin(e));
@@ -15179,7 +15323,7 @@
15179
15323
  }
15180
15324
 
15181
15325
  async function loadLifeUpdater(engine) {
15182
- engine.checkVersion("4.0.0-beta.15");
15326
+ engine.checkVersion("4.0.0-beta.17");
15183
15327
  await engine.pluginManager.register(e => {
15184
15328
  e.pluginManager.addParticleUpdater("life", container => {
15185
15329
  return Promise.resolve(new LifeUpdater(container));
@@ -15205,7 +15349,7 @@
15205
15349
  }
15206
15350
 
15207
15351
  async function loadLineShape(engine) {
15208
- engine.checkVersion("4.0.0-beta.15");
15352
+ engine.checkVersion("4.0.0-beta.17");
15209
15353
  await engine.pluginManager.register(e => {
15210
15354
  e.pluginManager.addShape(["line"], () => Promise.resolve(new LineDrawer()));
15211
15355
  });
@@ -15298,7 +15442,7 @@
15298
15442
  }
15299
15443
 
15300
15444
  async function loadParticlesAttractInteraction(engine) {
15301
- engine.checkVersion("4.0.0-beta.15");
15445
+ engine.checkVersion("4.0.0-beta.17");
15302
15446
  await engine.pluginManager.register((e) => {
15303
15447
  ensureInteractivityPluginLoaded(e);
15304
15448
  e.pluginManager.addInteractor?.("particlesAttract", container => {
@@ -15538,7 +15682,7 @@
15538
15682
  }
15539
15683
 
15540
15684
  async function loadParticlesCollisionsInteraction(engine) {
15541
- engine.checkVersion("4.0.0-beta.15");
15685
+ engine.checkVersion("4.0.0-beta.17");
15542
15686
  await engine.pluginManager.register((e) => {
15543
15687
  ensureInteractivityPluginLoaded(e);
15544
15688
  e.pluginManager.addPlugin(new OverlapPlugin());
@@ -15841,7 +15985,7 @@
15841
15985
  }
15842
15986
 
15843
15987
  async function loadParticlesLinksInteraction(engine) {
15844
- engine.checkVersion("4.0.0-beta.15");
15988
+ engine.checkVersion("4.0.0-beta.17");
15845
15989
  await engine.pluginManager.register((e) => {
15846
15990
  const pluginManager = e.pluginManager;
15847
15991
  ensureInteractivityPluginLoaded(e);
@@ -15931,19 +16075,19 @@
15931
16075
  }
15932
16076
 
15933
16077
  async function loadGenericPolygonShape(engine) {
15934
- engine.checkVersion("4.0.0-beta.15");
16078
+ engine.checkVersion("4.0.0-beta.17");
15935
16079
  await engine.pluginManager.register(e => {
15936
16080
  e.pluginManager.addShape(["polygon"], () => Promise.resolve(new PolygonDrawer()));
15937
16081
  });
15938
16082
  }
15939
16083
  async function loadTriangleShape(engine) {
15940
- engine.checkVersion("4.0.0-beta.15");
16084
+ engine.checkVersion("4.0.0-beta.17");
15941
16085
  await engine.pluginManager.register(e => {
15942
16086
  e.pluginManager.addShape(["triangle"], () => Promise.resolve(new TriangleDrawer()));
15943
16087
  });
15944
16088
  }
15945
16089
  async function loadPolygonShape(engine) {
15946
- engine.checkVersion("4.0.0-beta.15");
16090
+ engine.checkVersion("4.0.0-beta.17");
15947
16091
  await Promise.all([
15948
16092
  loadGenericPolygonShape(engine),
15949
16093
  loadTriangleShape(engine),
@@ -16076,7 +16220,7 @@
16076
16220
  }
16077
16221
 
16078
16222
  async function loadRotateUpdater(engine) {
16079
- engine.checkVersion("4.0.0-beta.15");
16223
+ engine.checkVersion("4.0.0-beta.17");
16080
16224
  await engine.pluginManager.register(e => {
16081
16225
  e.pluginManager.addParticleUpdater("rotate", container => {
16082
16226
  return Promise.resolve(new RotateUpdater(container));
@@ -16100,7 +16244,7 @@
16100
16244
  }
16101
16245
 
16102
16246
  async function loadSquareShape(engine) {
16103
- engine.checkVersion("4.0.0-beta.15");
16247
+ engine.checkVersion("4.0.0-beta.17");
16104
16248
  await engine.pluginManager.register(e => {
16105
16249
  e.pluginManager.addShape(["edge", "square"], () => Promise.resolve(new SquareDrawer()));
16106
16250
  });
@@ -16134,14 +16278,14 @@
16134
16278
  }
16135
16279
 
16136
16280
  async function loadStarShape(engine) {
16137
- engine.checkVersion("4.0.0-beta.15");
16281
+ engine.checkVersion("4.0.0-beta.17");
16138
16282
  await engine.pluginManager.register(e => {
16139
16283
  e.pluginManager.addShape(["star"], () => Promise.resolve(new StarDrawer()));
16140
16284
  });
16141
16285
  }
16142
16286
 
16143
16287
  async function loadSlim(engine) {
16144
- engine.checkVersion("4.0.0-beta.15");
16288
+ engine.checkVersion("4.0.0-beta.17");
16145
16289
  await engine.pluginManager.register(async (e) => {
16146
16290
  const loadInteractivityForSlim = async (e) => {
16147
16291
  await loadInteractivityPlugin(e);
@@ -16258,7 +16402,7 @@
16258
16402
  }
16259
16403
 
16260
16404
  async function loadTextShape(engine) {
16261
- engine.checkVersion("4.0.0-beta.15");
16405
+ engine.checkVersion("4.0.0-beta.17");
16262
16406
  await engine.pluginManager.register(e => {
16263
16407
  e.pluginManager.addShape(validTypes, () => Promise.resolve(new TextDrawer()));
16264
16408
  });
@@ -16395,7 +16539,7 @@
16395
16539
  }
16396
16540
 
16397
16541
  async function loadTiltUpdater(engine) {
16398
- engine.checkVersion("4.0.0-beta.15");
16542
+ engine.checkVersion("4.0.0-beta.17");
16399
16543
  await engine.pluginManager.register(e => {
16400
16544
  e.pluginManager.addParticleUpdater("tilt", container => {
16401
16545
  return Promise.resolve(new TiltUpdater(container));
@@ -16528,7 +16672,7 @@
16528
16672
  }
16529
16673
 
16530
16674
  async function loadTwinkleUpdater(engine) {
16531
- engine.checkVersion("4.0.0-beta.15");
16675
+ engine.checkVersion("4.0.0-beta.17");
16532
16676
  await engine.pluginManager.register(e => {
16533
16677
  e.pluginManager.addParticleUpdater("twinkle", container => {
16534
16678
  return Promise.resolve(new TwinkleUpdater(e.pluginManager, container));
@@ -16650,7 +16794,7 @@
16650
16794
  }
16651
16795
 
16652
16796
  async function loadWobbleUpdater(engine) {
16653
- engine.checkVersion("4.0.0-beta.15");
16797
+ engine.checkVersion("4.0.0-beta.17");
16654
16798
  await engine.pluginManager.register(e => {
16655
16799
  e.pluginManager.addParticleUpdater("wobble", container => {
16656
16800
  return Promise.resolve(new WobbleUpdater(container));
@@ -16659,7 +16803,7 @@
16659
16803
  }
16660
16804
 
16661
16805
  async function loadFull(engine) {
16662
- engine.checkVersion("4.0.0-beta.15");
16806
+ engine.checkVersion("4.0.0-beta.17");
16663
16807
  await engine.pluginManager.register(async (e) => {
16664
16808
  const loadEmittersPluginBundle = async (e) => {
16665
16809
  await loadEmittersPlugin(e);
@@ -17013,7 +17157,7 @@
17013
17157
  }
17014
17158
 
17015
17159
  async function loadGradientUpdater(engine) {
17016
- engine.checkVersion("4.0.0-beta.15");
17160
+ engine.checkVersion("4.0.0-beta.17");
17017
17161
  await engine.pluginManager.register(e => {
17018
17162
  e.pluginManager.addParticleUpdater("gradient", container => {
17019
17163
  return Promise.resolve(new GradientUpdater(e.pluginManager, container));
@@ -17133,7 +17277,7 @@
17133
17277
 
17134
17278
  const gridPathName = "gridPathGenerator";
17135
17279
  async function loadGridPath(engine) {
17136
- engine.checkVersion("4.0.0-beta.15");
17280
+ engine.checkVersion("4.0.0-beta.17");
17137
17281
  await engine.pluginManager.register((e) => {
17138
17282
  ensureBaseMoverLoaded(e);
17139
17283
  e.pluginManager.addPathGenerator?.(gridPathName, container => {
@@ -17162,7 +17306,7 @@
17162
17306
  }
17163
17307
 
17164
17308
  async function loadHeartShape(engine) {
17165
- engine.checkVersion("4.0.0-beta.15");
17309
+ engine.checkVersion("4.0.0-beta.17");
17166
17310
  await engine.pluginManager.register(e => {
17167
17311
  e.pluginManager.addShape(["heart"], () => Promise.resolve(new HeartDrawer()));
17168
17312
  });
@@ -17278,7 +17422,7 @@
17278
17422
  }
17279
17423
 
17280
17424
  async function loadHsvColorPlugin(engine) {
17281
- engine.checkVersion("4.0.0-beta.15");
17425
+ engine.checkVersion("4.0.0-beta.17");
17282
17426
  await engine.pluginManager.register(e => {
17283
17427
  e.pluginManager.addColorManager("hsv", new HsvColorManager());
17284
17428
  });
@@ -17363,7 +17507,7 @@
17363
17507
  }
17364
17508
 
17365
17509
  async function loadHwbColorPlugin(engine) {
17366
- engine.checkVersion("4.0.0-beta.15");
17510
+ engine.checkVersion("4.0.0-beta.17");
17367
17511
  await engine.pluginManager.register(e => {
17368
17512
  e.pluginManager.addColorManager("hwb", new HwbColorManager());
17369
17513
  });
@@ -17526,7 +17670,7 @@
17526
17670
  }
17527
17671
 
17528
17672
  async function loadInfectionPlugin(engine) {
17529
- engine.checkVersion("4.0.0-beta.15");
17673
+ engine.checkVersion("4.0.0-beta.17");
17530
17674
  await engine.pluginManager.register((e) => {
17531
17675
  ensureInteractivityPluginLoaded(e);
17532
17676
  e.pluginManager.addPlugin(new InfectionPlugin());
@@ -17552,7 +17696,7 @@
17552
17696
  }
17553
17697
 
17554
17698
  async function loadInfinityShape(engine) {
17555
- engine.checkVersion("4.0.0-beta.15");
17699
+ engine.checkVersion("4.0.0-beta.17");
17556
17700
  await engine.pluginManager.register(e => {
17557
17701
  e.pluginManager.addShape(["infinity"], () => Promise.resolve(new InfinityDrawer()));
17558
17702
  });
@@ -17653,7 +17797,7 @@
17653
17797
  }
17654
17798
 
17655
17799
  async function loadLabColorPlugin(engine) {
17656
- engine.checkVersion("4.0.0-beta.15");
17800
+ engine.checkVersion("4.0.0-beta.17");
17657
17801
  await engine.pluginManager.register(e => {
17658
17802
  e.pluginManager.addColorManager("lab", new LabColorManager());
17659
17803
  });
@@ -17754,7 +17898,7 @@
17754
17898
  }
17755
17899
 
17756
17900
  async function loadLchColorPlugin(engine) {
17757
- engine.checkVersion("4.0.0-beta.15");
17901
+ engine.checkVersion("4.0.0-beta.17");
17758
17902
  await engine.pluginManager.register(e => {
17759
17903
  e.pluginManager.addColorManager("lch", new LchColorManager());
17760
17904
  });
@@ -17808,7 +17952,7 @@
17808
17952
 
17809
17953
  const levyPathName = "levyPathGenerator";
17810
17954
  async function loadLevyPath(engine) {
17811
- engine.checkVersion("4.0.0-beta.15");
17955
+ engine.checkVersion("4.0.0-beta.17");
17812
17956
  await engine.pluginManager.register((e) => {
17813
17957
  ensureBaseMoverLoaded(e);
17814
17958
  e.pluginManager.addPathGenerator?.(levyPathName, container => {
@@ -18043,7 +18187,7 @@
18043
18187
  }
18044
18188
 
18045
18189
  async function loadLightInteraction(engine) {
18046
- engine.checkVersion("4.0.0-beta.15");
18190
+ engine.checkVersion("4.0.0-beta.17");
18047
18191
  await engine.pluginManager.register((e) => {
18048
18192
  ensureInteractivityPluginLoaded(e);
18049
18193
  e.pluginManager.addInteractor?.("externalLight", container => {
@@ -18101,7 +18245,7 @@
18101
18245
  }
18102
18246
 
18103
18247
  async function loadManualParticlesPlugin(engine) {
18104
- engine.checkVersion("4.0.0-beta.15");
18248
+ engine.checkVersion("4.0.0-beta.17");
18105
18249
  await engine.pluginManager.register(e => {
18106
18250
  e.pluginManager.addPlugin(new ManualParticlesPlugin());
18107
18251
  });
@@ -18322,7 +18466,7 @@
18322
18466
  }
18323
18467
 
18324
18468
  async function loadMatrixShape(engine) {
18325
- engine.checkVersion("4.0.0-beta.15");
18469
+ engine.checkVersion("4.0.0-beta.17");
18326
18470
  await engine.pluginManager.register(e => {
18327
18471
  e.pluginManager.addShape(["matrix"], () => Promise.resolve(new MatrixDrawer()));
18328
18472
  });
@@ -18388,7 +18532,7 @@
18388
18532
  }
18389
18533
 
18390
18534
  async function loadMotionPlugin(engine) {
18391
- engine.checkVersion("4.0.0-beta.15");
18535
+ engine.checkVersion("4.0.0-beta.17");
18392
18536
  await engine.pluginManager.register(e => {
18393
18537
  e.pluginManager.addPlugin(new MotionPlugin());
18394
18538
  });
@@ -18571,7 +18715,7 @@
18571
18715
  }
18572
18716
 
18573
18717
  async function loadNamedColorPlugin(engine) {
18574
- engine.checkVersion("4.0.0-beta.15");
18718
+ engine.checkVersion("4.0.0-beta.17");
18575
18719
  await engine.pluginManager.register(e => {
18576
18720
  e.pluginManager.addColorManager("named", new NamedColorManager());
18577
18721
  });
@@ -18654,7 +18798,7 @@
18654
18798
  }
18655
18799
 
18656
18800
  async function loadOklabColorPlugin(engine) {
18657
- engine.checkVersion("4.0.0-beta.15");
18801
+ engine.checkVersion("4.0.0-beta.17");
18658
18802
  await engine.pluginManager.register(e => {
18659
18803
  e.pluginManager.addColorManager("oklab", new OklabColorManager());
18660
18804
  });
@@ -18737,7 +18881,7 @@
18737
18881
  }
18738
18882
 
18739
18883
  async function loadOklchColorPlugin(engine) {
18740
- engine.checkVersion("4.0.0-beta.15");
18884
+ engine.checkVersion("4.0.0-beta.17");
18741
18885
  await engine.pluginManager.register(e => {
18742
18886
  e.pluginManager.addColorManager("oklch", new OklchColorManager());
18743
18887
  });
@@ -18893,7 +19037,7 @@
18893
19037
  }
18894
19038
 
18895
19039
  async function loadOrbitUpdater(engine) {
18896
- engine.checkVersion("4.0.0-beta.15");
19040
+ engine.checkVersion("4.0.0-beta.17");
18897
19041
  await engine.pluginManager.register(e => {
18898
19042
  e.pluginManager.addParticleUpdater("orbit", container => {
18899
19043
  return Promise.resolve(new OrbitUpdater(e.pluginManager, container));
@@ -18933,7 +19077,7 @@
18933
19077
  }
18934
19078
 
18935
19079
  async function loadParticlesEffect(engine) {
18936
- engine.checkVersion("4.0.0-beta.15");
19080
+ engine.checkVersion("4.0.0-beta.17");
18937
19081
  await engine.pluginManager.register(e => {
18938
19082
  e.pluginManager.addEffect("particles", container => {
18939
19083
  return Promise.resolve(new ParticlesDrawer(container));
@@ -19047,7 +19191,7 @@
19047
19191
  }
19048
19192
 
19049
19193
  async function loadParticlesRepulseInteraction(engine) {
19050
- engine.checkVersion("4.0.0-beta.15");
19194
+ engine.checkVersion("4.0.0-beta.17");
19051
19195
  await engine.pluginManager.register((e) => {
19052
19196
  ensureInteractivityPluginLoaded(e);
19053
19197
  e.pluginManager.addInteractor?.("particlesRepulse", container => {
@@ -19074,7 +19218,7 @@
19074
19218
  }
19075
19219
 
19076
19220
  async function loadPathShape(engine) {
19077
- engine.checkVersion("4.0.0-beta.15");
19221
+ engine.checkVersion("4.0.0-beta.17");
19078
19222
  await engine.pluginManager.register(e => {
19079
19223
  e.pluginManager.addShape(["path"], () => Promise.resolve(new PathDrawer()));
19080
19224
  });
@@ -19478,7 +19622,7 @@
19478
19622
 
19479
19623
  const perlinNoisePathName = "perlinNoise";
19480
19624
  async function loadPerlinNoisePath(engine) {
19481
- engine.checkVersion("4.0.0-beta.15");
19625
+ engine.checkVersion("4.0.0-beta.17");
19482
19626
  await engine.pluginManager.register((e) => {
19483
19627
  ensureBaseMoverLoaded(e);
19484
19628
  e.pluginManager.addPathGenerator?.(perlinNoisePathName, container => {
@@ -19541,7 +19685,7 @@
19541
19685
  }
19542
19686
 
19543
19687
  async function loadPoissonDiscPlugin(engine) {
19544
- engine.checkVersion("4.0.0-beta.15");
19688
+ engine.checkVersion("4.0.0-beta.17");
19545
19689
  await engine.pluginManager.register(e => {
19546
19690
  e.pluginManager.addPlugin(new PoissonDiscPlugin());
19547
19691
  });
@@ -19762,7 +19906,7 @@
19762
19906
  }
19763
19907
 
19764
19908
  async function loadPolygonMaskPlugin(engine) {
19765
- engine.checkVersion("4.0.0-beta.15");
19909
+ engine.checkVersion("4.0.0-beta.17");
19766
19910
  await engine.pluginManager.register(e => {
19767
19911
  e.pluginManager.addPlugin(new PolygonMaskPlugin(e.pluginManager));
19768
19912
  });
@@ -19828,7 +19972,7 @@
19828
19972
 
19829
19973
  const polygonPathName = "polygonPathGenerator";
19830
19974
  async function loadPolygonPath(engine) {
19831
- engine.checkVersion("4.0.0-beta.15");
19975
+ engine.checkVersion("4.0.0-beta.17");
19832
19976
  await engine.pluginManager.register((e) => {
19833
19977
  ensureBaseMoverLoaded(e);
19834
19978
  e.pluginManager.addPathGenerator?.(polygonPathName, container => {
@@ -19858,7 +20002,7 @@
19858
20002
 
19859
20003
  const randomPathName = "randomPathGenerator";
19860
20004
  async function loadRandomPath(engine) {
19861
- engine.checkVersion("4.0.0-beta.15");
20005
+ engine.checkVersion("4.0.0-beta.17");
19862
20006
  await engine.pluginManager.register((e) => {
19863
20007
  ensureBaseMoverLoaded(e);
19864
20008
  e.pluginManager.addPathGenerator?.(randomPathName, () => {
@@ -19943,7 +20087,7 @@
19943
20087
  }
19944
20088
 
19945
20089
  async function loadResponsivePlugin(engine) {
19946
- engine.checkVersion("4.0.0-beta.15");
20090
+ engine.checkVersion("4.0.0-beta.17");
19947
20091
  await engine.pluginManager.register(e => {
19948
20092
  e.pluginManager.addPlugin(new ResponsivePlugin());
19949
20093
  });
@@ -19992,7 +20136,7 @@
19992
20136
  }
19993
20137
 
19994
20138
  async function loadRoundedPolygonShape(engine) {
19995
- engine.checkVersion("4.0.0-beta.15");
20139
+ engine.checkVersion("4.0.0-beta.17");
19996
20140
  await engine.pluginManager.register(e => {
19997
20141
  e.pluginManager.addShape(["rounded-polygon"], () => Promise.resolve(new RoundedPolygonDrawer()));
19998
20142
  });
@@ -20039,7 +20183,7 @@
20039
20183
  }
20040
20184
 
20041
20185
  async function loadRoundedRectShape(engine) {
20042
- engine.checkVersion("4.0.0-beta.15");
20186
+ engine.checkVersion("4.0.0-beta.17");
20043
20187
  await engine.pluginManager.register(e => {
20044
20188
  e.pluginManager.addShape(["rounded-rect"], () => Promise.resolve(new RoundedRectDrawer()));
20045
20189
  });
@@ -20197,7 +20341,7 @@
20197
20341
 
20198
20342
  const svgPathName = "svgPathGenerator";
20199
20343
  async function loadSVGPath(engine) {
20200
- engine.checkVersion("4.0.0-beta.15");
20344
+ engine.checkVersion("4.0.0-beta.17");
20201
20345
  await engine.pluginManager.register((e) => {
20202
20346
  ensureBaseMoverLoaded(e);
20203
20347
  e.pluginManager.addPathGenerator?.(svgPathName, container => {
@@ -20238,7 +20382,7 @@
20238
20382
  }
20239
20383
 
20240
20384
  async function loadShadowEffect(engine) {
20241
- engine.checkVersion("4.0.0-beta.15");
20385
+ engine.checkVersion("4.0.0-beta.17");
20242
20386
  await engine.pluginManager.register(e => {
20243
20387
  e.pluginManager.addEffect("shadow", container => {
20244
20388
  return Promise.resolve(new ShadowDrawer(e.pluginManager, container));
@@ -20260,7 +20404,7 @@
20260
20404
 
20261
20405
  const simplexNoisePathName = "simplexNoise";
20262
20406
  async function loadSimplexNoisePath(engine) {
20263
- engine.checkVersion("4.0.0-beta.15");
20407
+ engine.checkVersion("4.0.0-beta.17");
20264
20408
  await engine.pluginManager.register((e) => {
20265
20409
  ensureBaseMoverLoaded(e);
20266
20410
  e.pluginManager.addPathGenerator?.(simplexNoisePathName, container => {
@@ -20642,7 +20786,7 @@
20642
20786
  }
20643
20787
 
20644
20788
  async function loadSoundsPlugin(engine) {
20645
- engine.checkVersion("4.0.0-beta.15");
20789
+ engine.checkVersion("4.0.0-beta.17");
20646
20790
  await engine.pluginManager.register(e => {
20647
20791
  e.pluginManager.addPlugin(new SoundsPlugin(e));
20648
20792
  });
@@ -20711,7 +20855,7 @@
20711
20855
 
20712
20856
  const spiralPathName = "spiralPathGenerator";
20713
20857
  async function loadSpiralPath(engine) {
20714
- engine.checkVersion("4.0.0-beta.15");
20858
+ engine.checkVersion("4.0.0-beta.17");
20715
20859
  await engine.pluginManager.register((e) => {
20716
20860
  ensureBaseMoverLoaded(e);
20717
20861
  e.pluginManager.addPathGenerator?.(spiralPathName, container => {
@@ -20751,7 +20895,7 @@
20751
20895
  }
20752
20896
 
20753
20897
  async function loadSpiralShape(engine) {
20754
- engine.checkVersion("4.0.0-beta.15");
20898
+ engine.checkVersion("4.0.0-beta.17");
20755
20899
  await engine.pluginManager.register(e => {
20756
20900
  e.pluginManager.addShape(["spiral"], () => Promise.resolve(new SpiralDrawer()));
20757
20901
  });
@@ -20795,7 +20939,7 @@
20795
20939
  }
20796
20940
 
20797
20941
  async function loadSquircleShape(engine) {
20798
- engine.checkVersion("4.0.0-beta.15");
20942
+ engine.checkVersion("4.0.0-beta.17");
20799
20943
  await engine.pluginManager.register(e => {
20800
20944
  e.pluginManager.addShape(["squircle"], () => Promise.resolve(new SquircleDrawer()));
20801
20945
  });
@@ -20916,7 +21060,7 @@
20916
21060
  }
20917
21061
 
20918
21062
  async function loadThemesPlugin(engine) {
20919
- engine.checkVersion("4.0.0-beta.15");
21063
+ engine.checkVersion("4.0.0-beta.17");
20920
21064
  await engine.pluginManager.register(e => {
20921
21065
  e.pluginManager.addPlugin(new ThemesPlugin());
20922
21066
  });
@@ -20999,7 +21143,7 @@
20999
21143
  }
21000
21144
 
21001
21145
  async function loadTrailEffect(engine) {
21002
- engine.checkVersion("4.0.0-beta.15");
21146
+ engine.checkVersion("4.0.0-beta.17");
21003
21147
  await engine.pluginManager.register(e => {
21004
21148
  e.pluginManager.addEffect("trail", container => {
21005
21149
  return Promise.resolve(new TrailDrawer(container));
@@ -21074,7 +21218,7 @@
21074
21218
  }
21075
21219
 
21076
21220
  async function loadTrailPlugin(engine) {
21077
- engine.checkVersion("4.0.0-beta.15");
21221
+ engine.checkVersion("4.0.0-beta.17");
21078
21222
  await engine.pluginManager.register(e => {
21079
21223
  e.pluginManager.addPlugin(new TrailPlugin(e.pluginManager));
21080
21224
  });
@@ -21123,7 +21267,7 @@
21123
21267
 
21124
21268
  const zigZagPathName = "zigZagPathGenerator";
21125
21269
  async function loadZigZagPath(engine) {
21126
- engine.checkVersion("4.0.0-beta.15");
21270
+ engine.checkVersion("4.0.0-beta.17");
21127
21271
  await engine.pluginManager.register((e) => {
21128
21272
  ensureBaseMoverLoaded(e);
21129
21273
  e.pluginManager.addPathGenerator?.(zigZagPathName, container => {
@@ -21191,14 +21335,14 @@
21191
21335
  }
21192
21336
 
21193
21337
  async function loadZoomPlugin(engine) {
21194
- engine.checkVersion("4.0.0-beta.15");
21338
+ engine.checkVersion("4.0.0-beta.17");
21195
21339
  await engine.pluginManager.register(e => {
21196
21340
  e.pluginManager.addPlugin(new ZoomPlugin());
21197
21341
  });
21198
21342
  }
21199
21343
 
21200
21344
  async function loadAll(engine) {
21201
- engine.checkVersion("4.0.0-beta.15");
21345
+ engine.checkVersion("4.0.0-beta.17");
21202
21346
  await engine.pluginManager.register(async (e) => {
21203
21347
  const loadInteractionsForAll = async (e) => {
21204
21348
  await loadFull(e);
@@ -21592,6 +21736,25 @@
21592
21736
  };
21593
21737
  }
21594
21738
 
21739
+ const transferredCanvases = new WeakMap(), getTransferredCanvas = (canvas) => {
21740
+ const transferredCanvas = transferredCanvases.get(canvas);
21741
+ if (transferredCanvas) {
21742
+ return transferredCanvas;
21743
+ }
21744
+ if (typeof canvas.transferControlToOffscreen !== "function") {
21745
+ throw new TypeError("OffscreenCanvas is required but not supported by this browser");
21746
+ }
21747
+ try {
21748
+ const offscreenCanvas = canvas.transferControlToOffscreen();
21749
+ transferredCanvases.set(canvas, offscreenCanvas);
21750
+ return offscreenCanvas;
21751
+ }
21752
+ catch {
21753
+ throw new TypeError("OffscreenCanvas transfer failed");
21754
+ }
21755
+ }, isHtmlCanvasElement = (canvas) => {
21756
+ return typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement;
21757
+ };
21595
21758
  function setStyle(canvas, style, important = false) {
21596
21759
  if (!style) {
21597
21760
  return;
@@ -21622,8 +21785,9 @@
21622
21785
  }
21623
21786
  }
21624
21787
  class CanvasManager {
21625
- element;
21788
+ domElement;
21626
21789
  render;
21790
+ renderCanvas;
21627
21791
  size;
21628
21792
  zoom = defaultZoom;
21629
21793
  _container;
@@ -21658,9 +21822,10 @@
21658
21822
  destroy() {
21659
21823
  this.stop();
21660
21824
  if (this._generated) {
21661
- const element = this.element;
21825
+ const element = this.domElement;
21662
21826
  element?.remove();
21663
- this.element = undefined;
21827
+ this.domElement = undefined;
21828
+ this.renderCanvas = undefined;
21664
21829
  }
21665
21830
  else {
21666
21831
  this._resetOriginalStyle();
@@ -21693,16 +21858,17 @@
21693
21858
  this._initStyle();
21694
21859
  this.initBackground();
21695
21860
  this._safeMutationObserver(obs => {
21696
- if (!this.element || !(this.element instanceof Node)) {
21861
+ const element = this.domElement;
21862
+ if (!element || !(element instanceof Node)) {
21697
21863
  return;
21698
21864
  }
21699
- obs.observe(this.element, { attributes: true });
21865
+ obs.observe(element, { attributes: true });
21700
21866
  });
21701
21867
  this.initPlugins();
21702
21868
  this.render.init();
21703
21869
  }
21704
21870
  initBackground() {
21705
- const { _container } = this, options = _container.actualOptions, background = options.background, element = this.element;
21871
+ const { _container } = this, options = _container.actualOptions, background = options.background, element = this.domElement;
21706
21872
  if (!element) {
21707
21873
  return;
21708
21874
  }
@@ -21727,21 +21893,30 @@
21727
21893
  }
21728
21894
  }
21729
21895
  loadCanvas(canvas) {
21730
- if (this._generated && this.element) {
21731
- this.element.remove();
21896
+ if (this._generated && this.domElement) {
21897
+ this.domElement.remove();
21898
+ }
21899
+ const container = this._container, domCanvas = isHtmlCanvasElement(canvas) ? canvas : undefined;
21900
+ this.domElement = domCanvas;
21901
+ this._generated = domCanvas ? domCanvas.dataset[generatedAttribute] === "true" : false;
21902
+ this.renderCanvas = domCanvas ? getTransferredCanvas(domCanvas) : canvas;
21903
+ const domElement = this.domElement;
21904
+ if (domElement) {
21905
+ domElement.ariaHidden = "true";
21906
+ this._originalStyle = cloneStyle(domElement.style);
21907
+ }
21908
+ const standardSize = this._standardSize, renderCanvas = this.renderCanvas;
21909
+ if (domElement) {
21910
+ standardSize.height = domElement.offsetHeight;
21911
+ standardSize.width = domElement.offsetWidth;
21912
+ }
21913
+ else {
21914
+ standardSize.height = renderCanvas.height;
21915
+ standardSize.width = renderCanvas.width;
21732
21916
  }
21733
- const container = this._container;
21734
- this._generated =
21735
- generatedAttribute in canvas.dataset ? canvas.dataset[generatedAttribute] === "true" : this._generated;
21736
- this.element = canvas;
21737
- this.element.ariaHidden = "true";
21738
- this._originalStyle = cloneStyle(this.element.style);
21739
- const standardSize = this._standardSize;
21740
- standardSize.height = canvas.offsetHeight;
21741
- standardSize.width = canvas.offsetWidth;
21742
21917
  const pxRatio = this._container.retina.pixelRatio, retinaSize = this.size;
21743
- canvas.height = retinaSize.height = standardSize.height * pxRatio;
21744
- canvas.width = retinaSize.width = standardSize.width * pxRatio;
21918
+ renderCanvas.height = retinaSize.height = standardSize.height * pxRatio;
21919
+ renderCanvas.width = retinaSize.width = standardSize.width * pxRatio;
21745
21920
  const canSupportHdrQuery = safeMatchMedia("(color-gamut: p3)");
21746
21921
  this.render.setContextSettings({
21747
21922
  alpha: true,
@@ -21749,42 +21924,48 @@
21749
21924
  desynchronized: true,
21750
21925
  willReadFrequently: false,
21751
21926
  });
21752
- this.render.setContext(this.element.getContext("2d", this.render.settings));
21927
+ this.render.setContext(renderCanvas.getContext("2d", this.render.settings));
21753
21928
  this._safeMutationObserver(obs => {
21754
21929
  obs.disconnect();
21755
21930
  });
21756
21931
  container.retina.init();
21757
21932
  this.initBackground();
21758
21933
  this._safeMutationObserver(obs => {
21759
- if (!this.element || !(this.element instanceof Node)) {
21934
+ const element = this.domElement;
21935
+ if (!element || !(element instanceof Node)) {
21760
21936
  return;
21761
21937
  }
21762
- obs.observe(this.element, { attributes: true });
21938
+ obs.observe(element, { attributes: true });
21763
21939
  });
21764
21940
  }
21765
21941
  resize() {
21766
- if (!this.element) {
21942
+ const element = this.domElement;
21943
+ if (!element) {
21944
+ return false;
21945
+ }
21946
+ const container = this._container, renderCanvas = this.renderCanvas;
21947
+ if (renderCanvas === undefined) {
21767
21948
  return false;
21768
21949
  }
21769
- const container = this._container, currentSize = container.canvas._standardSize, newSize = {
21770
- width: this.element.offsetWidth,
21771
- height: this.element.offsetHeight,
21950
+ const currentSize = container.canvas._standardSize, newSize = {
21951
+ width: element.offsetWidth,
21952
+ height: element.offsetHeight,
21772
21953
  }, pxRatio = container.retina.pixelRatio, retinaSize = {
21773
21954
  width: newSize.width * pxRatio,
21774
21955
  height: newSize.height * pxRatio,
21775
21956
  };
21776
21957
  if (newSize.height === currentSize.height &&
21777
21958
  newSize.width === currentSize.width &&
21778
- retinaSize.height === this.element.height &&
21779
- retinaSize.width === this.element.width) {
21959
+ retinaSize.height === renderCanvas.height &&
21960
+ retinaSize.width === renderCanvas.width) {
21780
21961
  return false;
21781
21962
  }
21782
21963
  const oldSize = { ...currentSize };
21783
21964
  currentSize.height = newSize.height;
21784
21965
  currentSize.width = newSize.width;
21785
21966
  const canvasSize = this.size;
21786
- this.element.width = canvasSize.width = retinaSize.width;
21787
- this.element.height = canvasSize.height = retinaSize.height;
21967
+ renderCanvas.width = canvasSize.width = retinaSize.width;
21968
+ renderCanvas.height = canvasSize.height = retinaSize.height;
21788
21969
  if (this._container.started) {
21789
21970
  container.particles.setResizeFactor({
21790
21971
  width: currentSize.width / oldSize.width,
@@ -21794,7 +21975,7 @@
21794
21975
  return true;
21795
21976
  }
21796
21977
  setPointerEvents(type) {
21797
- const element = this.element;
21978
+ const element = this.domElement;
21798
21979
  if (!element) {
21799
21980
  return;
21800
21981
  }
@@ -21813,7 +21994,7 @@
21813
21994
  this.render.stop();
21814
21995
  }
21815
21996
  async windowResize() {
21816
- if (!this.element || !this.resize()) {
21997
+ if (!this.domElement || !this.resize()) {
21817
21998
  return;
21818
21999
  }
21819
22000
  const container = this._container, needsRefresh = container.updateActualOptions();
@@ -21829,7 +22010,7 @@
21829
22010
  }
21830
22011
  };
21831
22012
  _initStyle = () => {
21832
- const element = this.element, options = this._container.actualOptions;
22013
+ const element = this.domElement, options = this._container.actualOptions;
21833
22014
  if (!element) {
21834
22015
  return;
21835
22016
  }
@@ -21851,7 +22032,7 @@
21851
22032
  }
21852
22033
  };
21853
22034
  _repairStyle = () => {
21854
- const element = this.element;
22035
+ const element = this.domElement;
21855
22036
  if (!element) {
21856
22037
  return;
21857
22038
  }
@@ -21871,7 +22052,7 @@
21871
22052
  });
21872
22053
  };
21873
22054
  _resetOriginalStyle = () => {
21874
- const element = this.element, originalStyle = this._originalStyle;
22055
+ const element = this.domElement, originalStyle = this._originalStyle;
21875
22056
  if (!element || !originalStyle) {
21876
22057
  return;
21877
22058
  }
@@ -21884,7 +22065,7 @@
21884
22065
  callback(this._mutationObserver);
21885
22066
  };
21886
22067
  _setFullScreenStyle = () => {
21887
- const element = this.element;
22068
+ const element = this.domElement;
21888
22069
  if (!element) {
21889
22070
  return;
21890
22071
  }
@@ -21958,7 +22139,7 @@
21958
22139
  manageListener(globalThis, resizeEvent, handlers.resize, add);
21959
22140
  return;
21960
22141
  }
21961
- const canvasEl = container.canvas.element;
22142
+ const canvasEl = container.canvas.domElement;
21962
22143
  if (this._resizeObserver && !add) {
21963
22144
  if (canvasEl) {
21964
22145
  this._resizeObserver.unobserve(canvasEl);
@@ -22213,8 +22394,6 @@
22213
22394
  this._initPosition(position);
22214
22395
  this.initialVelocity = this._calculateVelocity();
22215
22396
  this.velocity = this.initialVelocity.copy();
22216
- const particles = container.particles;
22217
- particles.setLastZIndex(this.position.z);
22218
22397
  this.zIndexFactor = this.position.z / container.zLayers;
22219
22398
  this.sides = 24;
22220
22399
  let effectDrawer, shapeDrawer;
@@ -22364,7 +22543,7 @@
22364
22543
  return color;
22365
22544
  };
22366
22545
  _initPosition = position => {
22367
- const container = this._container, zIndexValue = getRangeValue(this.options.zIndex.value), initialPosition = this._calcPosition(position, clamp(zIndexValue, minZ, container.zLayers));
22546
+ const container = this._container, zIndexValue = Math.floor(getRangeValue(this.options.zIndex.value)), initialPosition = this._calcPosition(position, clamp(zIndexValue, minZ, container.zLayers));
22368
22547
  if (!initialPosition) {
22369
22548
  throw new Error("a valid position cannot be found for particle");
22370
22549
  }
@@ -22498,10 +22677,8 @@
22498
22677
  _container;
22499
22678
  _groupLimits;
22500
22679
  _limit;
22501
- _maxZIndex;
22502
- _minZIndex;
22503
- _needsSort;
22504
22680
  _nextId;
22681
+ _particleBuckets;
22505
22682
  _particleResetPlugins;
22506
22683
  _particleUpdatePlugins;
22507
22684
  _pluginManager;
@@ -22510,19 +22687,17 @@
22510
22687
  _postUpdatePlugins;
22511
22688
  _resizeFactor;
22512
22689
  _updatePlugins;
22513
- _zArray;
22690
+ _zBuckets;
22514
22691
  constructor(pluginManager, container) {
22515
22692
  this._pluginManager = pluginManager;
22516
22693
  this._container = container;
22517
22694
  this._nextId = 0;
22518
22695
  this._array = [];
22519
- this._zArray = [];
22520
22696
  this._pool = [];
22521
22697
  this._limit = 0;
22522
22698
  this._groupLimits = new Map();
22523
- this._needsSort = false;
22524
- this._minZIndex = 0;
22525
- this._maxZIndex = 0;
22699
+ this._particleBuckets = new Map();
22700
+ this._zBuckets = this._createBuckets(this._container.zLayers);
22526
22701
  this.grid = new SpatialHashGrid(spatialHashGridCellSize);
22527
22702
  this.checkParticlePositionPlugins = [];
22528
22703
  this._particleResetPlugins = [];
@@ -22564,7 +22739,7 @@
22564
22739
  return;
22565
22740
  }
22566
22741
  this._array.push(particle);
22567
- this._zArray.push(particle);
22742
+ this._insertParticleIntoBucket(particle);
22568
22743
  this._nextId++;
22569
22744
  this._container.dispatchEvent(exports.EventType.particleAdded, {
22570
22745
  particle,
@@ -22578,12 +22753,14 @@
22578
22753
  }
22579
22754
  clear() {
22580
22755
  this._array = [];
22581
- this._zArray = [];
22756
+ this._particleBuckets.clear();
22757
+ this._resetBuckets(this._container.zLayers);
22582
22758
  }
22583
22759
  destroy() {
22584
22760
  this._array = [];
22585
22761
  this._pool.length = 0;
22586
- this._zArray = [];
22762
+ this._particleBuckets.clear();
22763
+ this._zBuckets = [];
22587
22764
  this.checkParticlePositionPlugins = [];
22588
22765
  this._particleResetPlugins = [];
22589
22766
  this._particleUpdatePlugins = [];
@@ -22592,8 +22769,14 @@
22592
22769
  this._updatePlugins = [];
22593
22770
  }
22594
22771
  drawParticles(delta) {
22595
- for (const particle of this._zArray) {
22596
- particle.draw(delta);
22772
+ for (let i = this._zBuckets.length - one; i >= minIndex$1; i--) {
22773
+ const bucket = this._zBuckets[i];
22774
+ if (!bucket) {
22775
+ continue;
22776
+ }
22777
+ for (const particle of bucket) {
22778
+ particle.draw(delta);
22779
+ }
22597
22780
  }
22598
22781
  }
22599
22782
  filter(condition) {
@@ -22607,15 +22790,14 @@
22607
22790
  }
22608
22791
  async init() {
22609
22792
  const container = this._container, options = container.actualOptions;
22610
- this._minZIndex = 0;
22611
- this._maxZIndex = 0;
22612
- this._needsSort = false;
22613
22793
  this.checkParticlePositionPlugins = [];
22614
22794
  this._updatePlugins = [];
22615
22795
  this._particleUpdatePlugins = [];
22616
22796
  this._postUpdatePlugins = [];
22617
22797
  this._particleResetPlugins = [];
22618
22798
  this._postParticleUpdatePlugins = [];
22799
+ this._particleBuckets.clear();
22800
+ this._resetBuckets(container.zLayers);
22619
22801
  this.grid = new SpatialHashGrid(spatialHashGridCellSize * container.retina.pixelRatio);
22620
22802
  for (const plugin of container.plugins) {
22621
22803
  if (plugin.redrawInit) {
@@ -22716,79 +22898,25 @@
22716
22898
  }
22717
22899
  this._applyDensity(options.particles, pluginsCount);
22718
22900
  }
22719
- setLastZIndex(zIndex) {
22720
- this._needsSort ||= zIndex >= this._maxZIndex || (zIndex > this._minZIndex && zIndex < this._maxZIndex);
22721
- }
22722
22901
  setResizeFactor(factor) {
22723
22902
  this._resizeFactor = factor;
22724
22903
  }
22725
22904
  update(delta) {
22726
- const particlesToDelete = new Set();
22727
22905
  this.grid.clear();
22728
22906
  for (const plugin of this._updatePlugins) {
22729
22907
  plugin.update?.(delta);
22730
22908
  }
22731
- const resizeFactor = this._resizeFactor;
22732
- for (const particle of this._array) {
22733
- if (resizeFactor && !particle.ignoresResizeRatio) {
22734
- particle.position.x *= resizeFactor.width;
22735
- particle.position.y *= resizeFactor.height;
22736
- particle.initialPosition.x *= resizeFactor.width;
22737
- particle.initialPosition.y *= resizeFactor.height;
22738
- }
22739
- particle.ignoresResizeRatio = false;
22740
- for (const plugin of this._particleResetPlugins) {
22741
- plugin.particleReset?.(particle);
22742
- }
22743
- for (const plugin of this._particleUpdatePlugins) {
22744
- if (particle.destroyed) {
22745
- break;
22746
- }
22747
- plugin.particleUpdate?.(particle, delta);
22748
- }
22749
- if (particle.destroyed) {
22750
- particlesToDelete.add(particle);
22751
- continue;
22752
- }
22753
- this.grid.insert(particle);
22754
- }
22909
+ const particlesToDelete = this._updateParticlesPhase1(delta);
22755
22910
  for (const plugin of this._postUpdatePlugins) {
22756
22911
  plugin.postUpdate?.(delta);
22757
22912
  }
22758
- for (const particle of this._array) {
22759
- if (particle.destroyed) {
22760
- particlesToDelete.add(particle);
22761
- continue;
22762
- }
22763
- for (const updater of this._container.particleUpdaters) {
22764
- updater.update(particle, delta);
22765
- }
22766
- if (!particle.destroyed && !particle.spawning) {
22767
- for (const plugin of this._postParticleUpdatePlugins) {
22768
- plugin.postParticleUpdate?.(particle, delta);
22769
- }
22770
- }
22771
- else if (particle.destroyed) {
22772
- particlesToDelete.add(particle);
22773
- }
22774
- }
22913
+ this._updateParticlesPhase2(delta, particlesToDelete);
22775
22914
  if (particlesToDelete.size) {
22776
22915
  for (const particle of particlesToDelete) {
22777
22916
  this.remove(particle);
22778
22917
  }
22779
22918
  }
22780
22919
  delete this._resizeFactor;
22781
- if (this._needsSort) {
22782
- const zArray = this._zArray;
22783
- zArray.sort((a, b) => b.position.z - a.position.z || a.id - b.id);
22784
- const firstItem = zArray[minIndex$1], lastItem = zArray[zArray.length - lengthOffset];
22785
- if (!firstItem || !lastItem) {
22786
- return;
22787
- }
22788
- this._maxZIndex = firstItem.position.z;
22789
- this._minZIndex = lastItem.position.z;
22790
- this._needsSort = false;
22791
- }
22792
22920
  }
22793
22921
  _addToPool = (...particles) => {
22794
22922
  this._pool.push(...particles);
@@ -22818,13 +22946,52 @@
22818
22946
  this.removeQuantity(particlesCount - particlesNumber, group);
22819
22947
  }
22820
22948
  };
22949
+ _createBuckets = (zLayers) => {
22950
+ const bucketCount = Math.max(Math.floor(zLayers), one);
22951
+ return Array.from({ length: bucketCount }, () => []);
22952
+ };
22953
+ _getBucketIndex = (zIndex) => {
22954
+ const maxBucketIndex = this._zBuckets.length - one;
22955
+ if (maxBucketIndex <= minIndex$1) {
22956
+ return minIndex$1;
22957
+ }
22958
+ return Math.min(Math.max(Math.floor(zIndex), minIndex$1), maxBucketIndex);
22959
+ };
22960
+ _getParticleInsertIndex = (bucket, particleId) => {
22961
+ let start = minIndex$1, end = bucket.length;
22962
+ while (start < end) {
22963
+ const middle = Math.floor((start + end) / double), middleParticle = bucket[middle];
22964
+ if (!middleParticle) {
22965
+ end = middle;
22966
+ continue;
22967
+ }
22968
+ if (middleParticle.id < particleId) {
22969
+ start = middle + one;
22970
+ }
22971
+ else {
22972
+ end = middle;
22973
+ }
22974
+ }
22975
+ return start;
22976
+ };
22821
22977
  _initDensityFactor = densityOptions => {
22822
22978
  const container = this._container;
22823
- if (!container.canvas.element || !densityOptions.enable) {
22979
+ if (!densityOptions.enable) {
22980
+ return defaultDensityFactor;
22981
+ }
22982
+ const canvasSize = container.canvas.size, pxRatio = container.retina.pixelRatio;
22983
+ if (!canvasSize.width || !canvasSize.height) {
22824
22984
  return defaultDensityFactor;
22825
22985
  }
22826
- const canvas = container.canvas.element, pxRatio = container.retina.pixelRatio;
22827
- return (canvas.width * canvas.height) / (densityOptions.height * densityOptions.width * pxRatio ** squareExp$5);
22986
+ return ((canvasSize.width * canvasSize.height) / (densityOptions.height * densityOptions.width * pxRatio ** squareExp$5));
22987
+ };
22988
+ _insertParticleIntoBucket = (particle) => {
22989
+ const bucketIndex = this._getBucketIndex(particle.position.z), bucket = this._zBuckets[bucketIndex];
22990
+ if (!bucket) {
22991
+ return;
22992
+ }
22993
+ bucket.splice(this._getParticleInsertIndex(bucket, particle.id), empty$1, particle);
22994
+ this._particleBuckets.set(particle.id, bucketIndex);
22828
22995
  };
22829
22996
  _removeParticle = (index, group, override) => {
22830
22997
  const particle = this._array[index];
@@ -22834,9 +23001,8 @@
22834
23001
  if (particle.group !== group) {
22835
23002
  return false;
22836
23003
  }
22837
- const zIdx = this._zArray.indexOf(particle);
22838
23004
  this._array.splice(index, deleteCount);
22839
- this._zArray.splice(zIdx, deleteCount);
23005
+ this._removeParticleFromBucket(particle);
22840
23006
  particle.destroy(override);
22841
23007
  this._container.dispatchEvent(exports.EventType.particleRemoved, {
22842
23008
  particle,
@@ -22844,6 +23010,98 @@
22844
23010
  this._addToPool(particle);
22845
23011
  return true;
22846
23012
  };
23013
+ _removeParticleFromBucket = (particle) => {
23014
+ const bucketIndex = this._particleBuckets.get(particle.id) ?? this._getBucketIndex(particle.position.z), bucket = this._zBuckets[bucketIndex];
23015
+ if (!bucket) {
23016
+ this._particleBuckets.delete(particle.id);
23017
+ return;
23018
+ }
23019
+ const particleIndex = this._getParticleInsertIndex(bucket, particle.id);
23020
+ if (bucket[particleIndex]?.id !== particle.id) {
23021
+ this._particleBuckets.delete(particle.id);
23022
+ return;
23023
+ }
23024
+ bucket.splice(particleIndex, deleteCount);
23025
+ this._particleBuckets.delete(particle.id);
23026
+ };
23027
+ _resetBuckets = (zLayers) => {
23028
+ const bucketCount = Math.max(Math.floor(zLayers), one);
23029
+ if (this._zBuckets.length !== bucketCount) {
23030
+ this._zBuckets = this._createBuckets(bucketCount);
23031
+ return;
23032
+ }
23033
+ for (const bucket of this._zBuckets) {
23034
+ bucket.length = minIndex$1;
23035
+ }
23036
+ };
23037
+ _updateParticleBucket = (particle) => {
23038
+ const newBucketIndex = this._getBucketIndex(particle.position.z), currentBucketIndex = this._particleBuckets.get(particle.id);
23039
+ if (currentBucketIndex === undefined) {
23040
+ this._insertParticleIntoBucket(particle);
23041
+ return;
23042
+ }
23043
+ if (currentBucketIndex === newBucketIndex) {
23044
+ return;
23045
+ }
23046
+ const currentBucket = this._zBuckets[currentBucketIndex];
23047
+ if (currentBucket) {
23048
+ const particleIndex = this._getParticleInsertIndex(currentBucket, particle.id);
23049
+ if (currentBucket[particleIndex]?.id === particle.id) {
23050
+ currentBucket.splice(particleIndex, deleteCount);
23051
+ }
23052
+ }
23053
+ const newBucket = this._zBuckets[newBucketIndex];
23054
+ if (!newBucket) {
23055
+ this._particleBuckets.set(particle.id, newBucketIndex);
23056
+ return;
23057
+ }
23058
+ newBucket.splice(this._getParticleInsertIndex(newBucket, particle.id), empty$1, particle);
23059
+ this._particleBuckets.set(particle.id, newBucketIndex);
23060
+ };
23061
+ _updateParticlesPhase1 = (delta) => {
23062
+ const particlesToDelete = new Set(), resizeFactor = this._resizeFactor;
23063
+ for (const particle of this._array) {
23064
+ if (resizeFactor && !particle.ignoresResizeRatio) {
23065
+ particle.position.x *= resizeFactor.width;
23066
+ particle.position.y *= resizeFactor.height;
23067
+ particle.initialPosition.x *= resizeFactor.width;
23068
+ particle.initialPosition.y *= resizeFactor.height;
23069
+ }
23070
+ particle.ignoresResizeRatio = false;
23071
+ for (const plugin of this._particleResetPlugins) {
23072
+ plugin.particleReset?.(particle);
23073
+ }
23074
+ for (const plugin of this._particleUpdatePlugins) {
23075
+ if (particle.destroyed) {
23076
+ break;
23077
+ }
23078
+ plugin.particleUpdate?.(particle, delta);
23079
+ }
23080
+ if (particle.destroyed) {
23081
+ particlesToDelete.add(particle);
23082
+ continue;
23083
+ }
23084
+ this.grid.insert(particle);
23085
+ }
23086
+ return particlesToDelete;
23087
+ };
23088
+ _updateParticlesPhase2 = (delta, particlesToDelete) => {
23089
+ for (const particle of this._array) {
23090
+ if (particle.destroyed) {
23091
+ particlesToDelete.add(particle);
23092
+ continue;
23093
+ }
23094
+ for (const updater of this._container.particleUpdaters) {
23095
+ updater.update(particle, delta);
23096
+ }
23097
+ if (!particle.spawning) {
23098
+ for (const plugin of this._postParticleUpdatePlugins) {
23099
+ plugin.postParticleUpdate?.(particle, delta);
23100
+ }
23101
+ }
23102
+ this._updateParticleBucket(particle);
23103
+ }
23104
+ };
22847
23105
  }
22848
23106
 
22849
23107
  class Retina {
@@ -22859,9 +23117,8 @@
22859
23117
  const container = this.container, options = container.actualOptions;
22860
23118
  this.pixelRatio = options.detectRetina ? devicePixelRatio : defaultRatio$1;
22861
23119
  this.reduceFactor = defaultReduceFactor;
22862
- const ratio = this.pixelRatio, canvas = container.canvas;
22863
- if (canvas.element) {
22864
- const element = canvas.element;
23120
+ const ratio = this.pixelRatio, canvas = container.canvas, element = canvas.domElement;
23121
+ if (element) {
22865
23122
  canvas.size.width = element.offsetWidth * ratio;
22866
23123
  canvas.size.height = element.offsetHeight * ratio;
22867
23124
  }
@@ -23785,7 +24042,7 @@
23785
24042
  return;
23786
24043
  }
23787
24044
  const html = interactivityEl, canvas = container.canvas;
23788
- canvas.setPointerEvents(html === canvas.element ? "initial" : "none");
24045
+ canvas.setPointerEvents(html === canvas.domElement ? "initial" : "none");
23789
24046
  if (add && !(options.interactivity?.events.onHover.enable || options.interactivity?.events.onClick.enable)) {
23790
24047
  return;
23791
24048
  }
@@ -23812,7 +24069,7 @@
23812
24069
  manageListener(interactivityEl, touchCancelEvent, handlers.touchCancel, add);
23813
24070
  };
23814
24071
  _manageListeners = add => {
23815
- const handlers = this._handlers, container = this._container, interactionManager = this._interactionManager, options = container.actualOptions, detectType = options.interactivity?.detectsOn, canvasEl = container.canvas.element;
24072
+ const handlers = this._handlers, container = this._container, interactionManager = this._interactionManager, options = container.actualOptions, detectType = options.interactivity?.detectsOn, canvasEl = container.canvas.domElement;
23816
24073
  if (detectType === InteractivityDetect.window) {
23817
24074
  interactionManager.interactivityData.element = safeDocument();
23818
24075
  }
@@ -23859,7 +24116,7 @@
23859
24116
  mouse.clicking = false;
23860
24117
  };
23861
24118
  _mouseTouchMove = e => {
23862
- const container = this._container, interactionManager = this._interactionManager, options = container.actualOptions, interactivity = interactionManager.interactivityData, canvasEl = container.canvas.element;
24119
+ const container = this._container, interactionManager = this._interactionManager, options = container.actualOptions, interactivity = interactionManager.interactivityData, canvasEl = container.canvas.domElement;
23863
24120
  if (!interactivity.element) {
23864
24121
  return;
23865
24122
  }
@@ -24020,7 +24277,7 @@
24020
24277
  if (!lastTouch) {
24021
24278
  return;
24022
24279
  }
24023
- const element = container.canvas.element, canvasRect = element ? element.getBoundingClientRect() : undefined, pos = {
24280
+ const element = container.canvas.domElement, canvasRect = element ? element.getBoundingClientRect() : undefined, pos = {
24024
24281
  x: lastTouch.clientX - (canvasRect ? canvasRect.left : minCoordinate),
24025
24282
  y: lastTouch.clientY - (canvasRect ? canvasRect.top : minCoordinate),
24026
24283
  };
@@ -24390,7 +24647,7 @@
24390
24647
  return res;
24391
24648
  }
24392
24649
  _exportImage = async (data) => {
24393
- const element = this._container.canvas.element;
24650
+ const element = this._container.canvas.domElement;
24394
24651
  if (!element) {
24395
24652
  return;
24396
24653
  }
@@ -24502,7 +24759,7 @@
24502
24759
  return res;
24503
24760
  }
24504
24761
  _exportVideo = async (data) => {
24505
- const element = this._container.canvas.element;
24762
+ const element = this._container.canvas.domElement;
24506
24763
  if (!element) {
24507
24764
  return;
24508
24765
  }
@@ -27197,7 +27454,7 @@
27197
27454
  setIconStyle(img, pos.top + margin, pos.right -
27198
27455
  (margin * (rightOffsets.length + rightOffset) + width + rightOffsets.reduce((a, b) => a + b, defaultAccumulator)), display, options.fullScreen.zIndex + zIndexOffset, width, margin, style);
27199
27456
  img.src = path ?? (svg ? `data:image/svg+xml;base64,${btoa(svg)}` : "");
27200
- const parent = container.canvas.element?.parentNode ?? safeDocument().body;
27457
+ const parent = container.canvas.domElement?.parentNode ?? safeDocument().body;
27201
27458
  parent.append(img);
27202
27459
  img.addEventListener("click", () => {
27203
27460
  void clickCb();
@@ -27285,11 +27542,11 @@
27285
27542
  }
27286
27543
  async start() {
27287
27544
  const container = this._container, options = container.actualOptions, soundsOptions = options.sounds;
27288
- if (!soundsOptions?.enable || !container.canvas.element) {
27545
+ if (!soundsOptions?.enable || !container.canvas.domElement) {
27289
27546
  return;
27290
27547
  }
27291
27548
  container.muted = true;
27292
- const canvas = container.canvas.element, pos = {
27549
+ const canvas = container.canvas.domElement, pos = {
27293
27550
  top: canvas.offsetTop,
27294
27551
  right: canvas.offsetLeft + canvas.offsetWidth,
27295
27552
  }, { mute, unmute, volumeDown, volumeUp } = soundsOptions.icons, margin = 10, toggleMute = async () => {
@@ -27400,7 +27657,7 @@
27400
27657
  }
27401
27658
  _initEvents = () => {
27402
27659
  const container = this._container, soundsOptions = container.actualOptions.sounds;
27403
- if (!soundsOptions?.enable || !container.canvas.element) {
27660
+ if (!soundsOptions?.enable || !container.canvas.domElement) {
27404
27661
  return;
27405
27662
  }
27406
27663
  for (const event of soundsOptions.events) {
@@ -27812,7 +28069,7 @@
27812
28069
  this._manageListeners(false);
27813
28070
  }
27814
28071
  _handleGestureChange = (event) => {
27815
- const container = this.container, canvas = container.canvas, canvasEl = canvas.element;
28072
+ const container = this.container, canvas = container.canvas, canvasEl = canvas.domElement;
27816
28073
  if (!canvasEl) {
27817
28074
  return;
27818
28075
  }
@@ -27833,7 +28090,7 @@
27833
28090
  this._gestureScale = scale;
27834
28091
  };
27835
28092
  _handleGestureEnd = (event) => {
27836
- const container = this.container, canvas = container.canvas, canvasEl = canvas.element;
28093
+ const container = this.container, canvas = container.canvas, canvasEl = canvas.domElement;
27837
28094
  if (!canvasEl) {
27838
28095
  return;
27839
28096
  }
@@ -27848,7 +28105,7 @@
27848
28105
  this._gestureScale = defaultZoom;
27849
28106
  };
27850
28107
  _handleGestureStart = (event) => {
27851
- const container = this.container, canvas = container.canvas, canvasEl = canvas.element;
28108
+ const container = this.container, canvas = container.canvas, canvasEl = canvas.domElement;
27852
28109
  if (!canvasEl) {
27853
28110
  return;
27854
28111
  }
@@ -27866,7 +28123,7 @@
27866
28123
  if (!event.ctrlKey && !event.metaKey) {
27867
28124
  return;
27868
28125
  }
27869
- const container = this.container, zoomOptions = container.actualOptions.zoom, canvas = container.canvas, canvasEl = canvas.element;
28126
+ const container = this.container, zoomOptions = container.actualOptions.zoom, canvas = container.canvas, canvasEl = canvas.domElement;
27870
28127
  if (!canvasEl) {
27871
28128
  return;
27872
28129
  }
@@ -27897,7 +28154,7 @@
27897
28154
  this._touchDistance = distance;
27898
28155
  return;
27899
28156
  }
27900
- const container = this.container, zoomOptions = container.actualOptions.zoom, canvas = container.canvas, canvasEl = canvas.element;
28157
+ const container = this.container, zoomOptions = container.actualOptions.zoom, canvas = container.canvas, canvasEl = canvas.domElement;
27901
28158
  if (!canvasEl) {
27902
28159
  return;
27903
28160
  }
@@ -27927,7 +28184,7 @@
27927
28184
  return false;
27928
28185
  };
27929
28186
  _manageListeners = add => {
27930
- const handlers = this._handlers, canvas = this.container.canvas.element, options = this.container.actualOptions, doc = safeDocument();
28187
+ const handlers = this._handlers, canvas = this.container.canvas.domElement, options = this.container.actualOptions, doc = safeDocument();
27931
28188
  if (!canvas) {
27932
28189
  return;
27933
28190
  }