@tsparticles/interaction-external-repulse 3.0.3 → 3.2.0

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.
package/858.min.js ADDED
@@ -0,0 +1,2 @@
1
+ /*! For license information please see 858.min.js.LICENSE.txt */
2
+ (this.webpackChunk_tsparticles_interaction_external_repulse=this.webpackChunk_tsparticles_interaction_external_repulse||[]).push([[858],{858:(e,t,i)=>{i.d(t,{Repulser:()=>c});var s=i(533),n=i(378);const o="repulse";class c extends s.ExternalInteractorBase{constructor(e,t){super(t),this._clickRepulse=()=>{const e=this.container,t=e.actualOptions.interactivity.modes.repulse;if(!t)return;const i=e.repulse??{particles:[]};if(i.finish||(i.count||(i.count=0),i.count++,i.count===e.particles.count&&(i.finish=!0)),i.clicking){const n=e.retina.repulseModeDistance;if(!n||n<0)return;const o=Math.pow(n/6,3),c=e.interactivity.mouse.clickPosition;if(void 0===c)return;const r=new s.Circle(c.x,c.y,o),a=e.particles.quadTree.query(r,(e=>this.isEnabled(e)));for(const e of a){const{dx:n,dy:r,distance:a}=(0,s.getDistances)(c,e.position),l=a**2,p=-o*t.speed/l;if(l<=o){i.particles.push(e);const t=s.Vector.create(n,r);t.length=p,e.velocity.setTo(t)}}}else if(!1===i.clicking){for(const e of i.particles)e.velocity.setTo(e.initialVelocity);i.particles=[]}},this._hoverRepulse=()=>{const e=this.container,t=e.interactivity.mouse.position,i=e.retina.repulseModeDistance;!i||i<0||!t||this._processRepulse(t,i,new s.Circle(t.x,t.y,i))},this._processRepulse=(e,t,i,n)=>{const o=this.container,c=o.particles.quadTree.query(i,(e=>this.isEnabled(e))),r=o.actualOptions.interactivity.modes.repulse;if(!r)return;const{easing:a,speed:l,factor:p,maxSpeed:u}=r,d=(0,s.getEasing)(a),f=(n?.speed??l)*p;for(const i of c){const{dx:n,dy:o,distance:c}=(0,s.getDistances)(i.position,e),r=(0,s.clamp)(d(1-c/t)*f,0,u),a=s.Vector.create(c?n/c*r:f,c?o/c*r:f);i.position.addTo(a)}},this._singleSelectorRepulse=(e,t)=>{const i=this.container,n=i.actualOptions.interactivity.modes.repulse;if(!n)return;const o=document.querySelectorAll(e);o.length&&o.forEach((e=>{const o=e,c=i.retina.pixelRatio,r={x:(o.offsetLeft+.5*o.offsetWidth)*c,y:(o.offsetTop+.5*o.offsetHeight)*c},a=.5*o.offsetWidth*c,l="circle"===t.type?new s.Circle(r.x,r.y,a):new s.Rectangle(o.offsetLeft*c,o.offsetTop*c,o.offsetWidth*c,o.offsetHeight*c),p=n.divs,u=(0,s.divMode)(p,o);this._processRepulse(r,a,l,u)}))},this._engine=e,t.repulse||(t.repulse={particles:[]}),this.handleClickMode=e=>{const i=this.container.actualOptions.interactivity.modes.repulse;if(!i||e!==o)return;t.repulse||(t.repulse={particles:[]});const n=t.repulse;n.clicking=!0,n.count=0;for(const e of t.repulse.particles)this.isEnabled(e)&&e.velocity.setTo(e.initialVelocity);n.particles=[],n.finish=!1,setTimeout((()=>{t.destroyed||(n.clicking=!1)}),i.duration*s.millisecondsToSeconds)}}clear(){}init(){const e=this.container,t=e.actualOptions.interactivity.modes.repulse;t&&(e.retina.repulseModeDistance=t.distance*e.retina.pixelRatio)}async interact(){const e=this.container,t=e.actualOptions,i=e.interactivity.status===s.mouseMoveEvent,n=t.interactivity.events,c=n.onHover,r=c.enable,a=c.mode,l=n.onClick,p=l.enable,u=l.mode,d=n.onDiv;i&&r&&(0,s.isInArray)(o,a)?this._hoverRepulse():p&&(0,s.isInArray)(o,u)?this._clickRepulse():(0,s.divModeExecute)(o,d,((e,t)=>this._singleSelectorRepulse(e,t))),await Promise.resolve()}isEnabled(e){const t=this.container,i=t.actualOptions,n=t.interactivity.mouse,c=(e?.interactivity??i.interactivity).events,r=c.onDiv,a=c.onHover,l=c.onClick,p=(0,s.isDivModeEnabled)(o,r);if(!(p||a.enable&&n.position||l.enable&&n.clickPosition))return!1;const u=a.mode,d=l.mode;return(0,s.isInArray)(o,u)||(0,s.isInArray)(o,d)||p}loadModeOptions(e,...t){e.repulse||(e.repulse=new n.H);for(const i of t)e.repulse.load(i?.repulse)}reset(){}}}}]);
@@ -0,0 +1 @@
1
+ /*! tsParticles Repulse External Interaction v3.2.0 by Matteo Bruni */
@@ -1,6 +1,6 @@
1
- import { Circle, ExternalInteractorBase, Rectangle, Vector, clamp, divMode, divModeExecute, getDistances, getEasing, isDivModeEnabled, isInArray, mouseMoveEvent, } from "@tsparticles/engine";
1
+ import { Circle, ExternalInteractorBase, Rectangle, Vector, clamp, divMode, divModeExecute, getDistances, getEasing, isDivModeEnabled, isInArray, millisecondsToSeconds, mouseMoveEvent, } from "@tsparticles/engine";
2
2
  import { Repulse } from "./Options/Classes/Repulse.js";
3
- const repulseMode = "repulse";
3
+ const repulseMode = "repulse", minDistance = 0, repulseRadiusFactor = 6, repulseRadiusPower = 3, squarePower = 2, minRadius = 0, minSpeed = 0, easingOffset = 1, half = 0.5;
4
4
  export class Repulser extends ExternalInteractorBase {
5
5
  constructor(engine, container) {
6
6
  super(container);
@@ -9,7 +9,7 @@ export class Repulser extends ExternalInteractorBase {
9
9
  if (!repulseOptions) {
10
10
  return;
11
11
  }
12
- const repulse = container.repulse || { particles: [] };
12
+ const repulse = container.repulse ?? { particles: [] };
13
13
  if (!repulse.finish) {
14
14
  if (!repulse.count) {
15
15
  repulse.count = 0;
@@ -21,16 +21,16 @@ export class Repulser extends ExternalInteractorBase {
21
21
  }
22
22
  if (repulse.clicking) {
23
23
  const repulseDistance = container.retina.repulseModeDistance;
24
- if (!repulseDistance || repulseDistance < 0) {
24
+ if (!repulseDistance || repulseDistance < minDistance) {
25
25
  return;
26
26
  }
27
- const repulseRadius = Math.pow(repulseDistance / 6, 3), mouseClickPos = container.interactivity.mouse.clickPosition;
27
+ const repulseRadius = Math.pow(repulseDistance / repulseRadiusFactor, repulseRadiusPower), mouseClickPos = container.interactivity.mouse.clickPosition;
28
28
  if (mouseClickPos === undefined) {
29
29
  return;
30
30
  }
31
31
  const range = new Circle(mouseClickPos.x, mouseClickPos.y, repulseRadius), query = container.particles.quadTree.query(range, (p) => this.isEnabled(p));
32
32
  for (const particle of query) {
33
- const { dx, dy, distance } = getDistances(mouseClickPos, particle.position), d = distance ** 2, velocity = repulseOptions.speed, force = (-repulseRadius * velocity) / d;
33
+ const { dx, dy, distance } = getDistances(mouseClickPos, particle.position), d = distance ** squarePower, velocity = repulseOptions.speed, force = (-repulseRadius * velocity) / d;
34
34
  if (d <= repulseRadius) {
35
35
  repulse.particles.push(particle);
36
36
  const vect = Vector.create(dx, dy);
@@ -48,7 +48,7 @@ export class Repulser extends ExternalInteractorBase {
48
48
  };
49
49
  this._hoverRepulse = () => {
50
50
  const container = this.container, mousePos = container.interactivity.mouse.position, repulseRadius = container.retina.repulseModeDistance;
51
- if (!repulseRadius || repulseRadius < 0 || !mousePos) {
51
+ if (!repulseRadius || repulseRadius < minRadius || !mousePos) {
52
52
  return;
53
53
  }
54
54
  this._processRepulse(mousePos, repulseRadius, new Circle(mousePos.x, mousePos.y, repulseRadius));
@@ -60,7 +60,7 @@ export class Repulser extends ExternalInteractorBase {
60
60
  }
61
61
  const { easing, speed, factor, maxSpeed } = repulseOptions, easingFunc = getEasing(easing), velocity = (divRepulse?.speed ?? speed) * factor;
62
62
  for (const particle of query) {
63
- const { dx, dy, distance } = getDistances(particle.position, position), repulseFactor = clamp(easingFunc(1 - distance / repulseRadius) * velocity, 0, maxSpeed), normVec = Vector.create(distance === 0 ? velocity : (dx / distance) * repulseFactor, distance === 0 ? velocity : (dy / distance) * repulseFactor);
63
+ const { dx, dy, distance } = getDistances(particle.position, position), repulseFactor = clamp(easingFunc(easingOffset - distance / repulseRadius) * velocity, minSpeed, maxSpeed), normVec = Vector.create(!distance ? velocity : (dx / distance) * repulseFactor, !distance ? velocity : (dy / distance) * repulseFactor);
64
64
  particle.position.addTo(normVec);
65
65
  }
66
66
  };
@@ -75,9 +75,9 @@ export class Repulser extends ExternalInteractorBase {
75
75
  }
76
76
  query.forEach((item) => {
77
77
  const elem = item, pxRatio = container.retina.pixelRatio, pos = {
78
- x: (elem.offsetLeft + elem.offsetWidth / 2) * pxRatio,
79
- y: (elem.offsetTop + elem.offsetHeight / 2) * pxRatio,
80
- }, repulseRadius = (elem.offsetWidth / 2) * pxRatio, area = div.type === "circle"
78
+ x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,
79
+ y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio,
80
+ }, repulseRadius = elem.offsetWidth * half * pxRatio, area = div.type === "circle"
81
81
  ? new Circle(pos.x, pos.y, repulseRadius)
82
82
  : new Rectangle(elem.offsetLeft * pxRatio, elem.offsetTop * pxRatio, elem.offsetWidth * pxRatio, elem.offsetHeight * pxRatio), divs = repulse.divs, divRepulse = divMode(divs, elem);
83
83
  this._processRepulse(pos, repulseRadius, area, divRepulse);
@@ -111,7 +111,7 @@ export class Repulser extends ExternalInteractorBase {
111
111
  return;
112
112
  }
113
113
  repulse.clicking = false;
114
- }, repulseOpts.duration * 1000);
114
+ }, repulseOpts.duration * millisecondsToSeconds);
115
115
  };
116
116
  }
117
117
  clear() {
@@ -134,10 +134,11 @@ export class Repulser extends ExternalInteractorBase {
134
134
  else {
135
135
  divModeExecute(repulseMode, divs, (selector, div) => this._singleSelectorRepulse(selector, div));
136
136
  }
137
+ await Promise.resolve();
137
138
  }
138
139
  isEnabled(particle) {
139
140
  const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = (particle?.interactivity ?? options.interactivity).events, divs = events.onDiv, hover = events.onHover, click = events.onClick, divRepulse = isDivModeEnabled(repulseMode, divs);
140
- if (!(divRepulse || (hover.enable && mouse.position) || (click.enable && mouse.clickPosition))) {
141
+ if (!(divRepulse || (hover.enable && !!mouse.position) || (click.enable && mouse.clickPosition))) {
141
142
  return false;
142
143
  }
143
144
  const hoverMode = hover.mode, clickMode = click.mode;
package/browser/index.js CHANGED
@@ -1,6 +1,8 @@
1
- import { Repulser } from "./Repulser.js";
2
1
  export async function loadExternalRepulseInteraction(engine, refresh = true) {
3
- await engine.addInteractor("externalRepulse", (container) => new Repulser(engine, container), refresh);
2
+ await engine.addInteractor("externalRepulse", async (container) => {
3
+ const { Repulser } = await import("./Repulser.js");
4
+ return new Repulser(engine, container);
5
+ }, refresh);
4
6
  }
5
7
  export * from "./Options/Classes/RepulseBase.js";
6
8
  export * from "./Options/Classes/RepulseDiv.js";
package/cjs/Repulser.js CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Repulser = void 0;
4
4
  const engine_1 = require("@tsparticles/engine");
5
5
  const Repulse_js_1 = require("./Options/Classes/Repulse.js");
6
- const repulseMode = "repulse";
6
+ const repulseMode = "repulse", minDistance = 0, repulseRadiusFactor = 6, repulseRadiusPower = 3, squarePower = 2, minRadius = 0, minSpeed = 0, easingOffset = 1, half = 0.5;
7
7
  class Repulser extends engine_1.ExternalInteractorBase {
8
8
  constructor(engine, container) {
9
9
  super(container);
@@ -12,7 +12,7 @@ class Repulser extends engine_1.ExternalInteractorBase {
12
12
  if (!repulseOptions) {
13
13
  return;
14
14
  }
15
- const repulse = container.repulse || { particles: [] };
15
+ const repulse = container.repulse ?? { particles: [] };
16
16
  if (!repulse.finish) {
17
17
  if (!repulse.count) {
18
18
  repulse.count = 0;
@@ -24,16 +24,16 @@ class Repulser extends engine_1.ExternalInteractorBase {
24
24
  }
25
25
  if (repulse.clicking) {
26
26
  const repulseDistance = container.retina.repulseModeDistance;
27
- if (!repulseDistance || repulseDistance < 0) {
27
+ if (!repulseDistance || repulseDistance < minDistance) {
28
28
  return;
29
29
  }
30
- const repulseRadius = Math.pow(repulseDistance / 6, 3), mouseClickPos = container.interactivity.mouse.clickPosition;
30
+ const repulseRadius = Math.pow(repulseDistance / repulseRadiusFactor, repulseRadiusPower), mouseClickPos = container.interactivity.mouse.clickPosition;
31
31
  if (mouseClickPos === undefined) {
32
32
  return;
33
33
  }
34
34
  const range = new engine_1.Circle(mouseClickPos.x, mouseClickPos.y, repulseRadius), query = container.particles.quadTree.query(range, (p) => this.isEnabled(p));
35
35
  for (const particle of query) {
36
- const { dx, dy, distance } = (0, engine_1.getDistances)(mouseClickPos, particle.position), d = distance ** 2, velocity = repulseOptions.speed, force = (-repulseRadius * velocity) / d;
36
+ const { dx, dy, distance } = (0, engine_1.getDistances)(mouseClickPos, particle.position), d = distance ** squarePower, velocity = repulseOptions.speed, force = (-repulseRadius * velocity) / d;
37
37
  if (d <= repulseRadius) {
38
38
  repulse.particles.push(particle);
39
39
  const vect = engine_1.Vector.create(dx, dy);
@@ -51,7 +51,7 @@ class Repulser extends engine_1.ExternalInteractorBase {
51
51
  };
52
52
  this._hoverRepulse = () => {
53
53
  const container = this.container, mousePos = container.interactivity.mouse.position, repulseRadius = container.retina.repulseModeDistance;
54
- if (!repulseRadius || repulseRadius < 0 || !mousePos) {
54
+ if (!repulseRadius || repulseRadius < minRadius || !mousePos) {
55
55
  return;
56
56
  }
57
57
  this._processRepulse(mousePos, repulseRadius, new engine_1.Circle(mousePos.x, mousePos.y, repulseRadius));
@@ -63,7 +63,7 @@ class Repulser extends engine_1.ExternalInteractorBase {
63
63
  }
64
64
  const { easing, speed, factor, maxSpeed } = repulseOptions, easingFunc = (0, engine_1.getEasing)(easing), velocity = (divRepulse?.speed ?? speed) * factor;
65
65
  for (const particle of query) {
66
- const { dx, dy, distance } = (0, engine_1.getDistances)(particle.position, position), repulseFactor = (0, engine_1.clamp)(easingFunc(1 - distance / repulseRadius) * velocity, 0, maxSpeed), normVec = engine_1.Vector.create(distance === 0 ? velocity : (dx / distance) * repulseFactor, distance === 0 ? velocity : (dy / distance) * repulseFactor);
66
+ const { dx, dy, distance } = (0, engine_1.getDistances)(particle.position, position), repulseFactor = (0, engine_1.clamp)(easingFunc(easingOffset - distance / repulseRadius) * velocity, minSpeed, maxSpeed), normVec = engine_1.Vector.create(!distance ? velocity : (dx / distance) * repulseFactor, !distance ? velocity : (dy / distance) * repulseFactor);
67
67
  particle.position.addTo(normVec);
68
68
  }
69
69
  };
@@ -78,9 +78,9 @@ class Repulser extends engine_1.ExternalInteractorBase {
78
78
  }
79
79
  query.forEach((item) => {
80
80
  const elem = item, pxRatio = container.retina.pixelRatio, pos = {
81
- x: (elem.offsetLeft + elem.offsetWidth / 2) * pxRatio,
82
- y: (elem.offsetTop + elem.offsetHeight / 2) * pxRatio,
83
- }, repulseRadius = (elem.offsetWidth / 2) * pxRatio, area = div.type === "circle"
81
+ x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,
82
+ y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio,
83
+ }, repulseRadius = elem.offsetWidth * half * pxRatio, area = div.type === "circle"
84
84
  ? new engine_1.Circle(pos.x, pos.y, repulseRadius)
85
85
  : new engine_1.Rectangle(elem.offsetLeft * pxRatio, elem.offsetTop * pxRatio, elem.offsetWidth * pxRatio, elem.offsetHeight * pxRatio), divs = repulse.divs, divRepulse = (0, engine_1.divMode)(divs, elem);
86
86
  this._processRepulse(pos, repulseRadius, area, divRepulse);
@@ -114,7 +114,7 @@ class Repulser extends engine_1.ExternalInteractorBase {
114
114
  return;
115
115
  }
116
116
  repulse.clicking = false;
117
- }, repulseOpts.duration * 1000);
117
+ }, repulseOpts.duration * engine_1.millisecondsToSeconds);
118
118
  };
119
119
  }
120
120
  clear() {
@@ -137,10 +137,11 @@ class Repulser extends engine_1.ExternalInteractorBase {
137
137
  else {
138
138
  (0, engine_1.divModeExecute)(repulseMode, divs, (selector, div) => this._singleSelectorRepulse(selector, div));
139
139
  }
140
+ await Promise.resolve();
140
141
  }
141
142
  isEnabled(particle) {
142
143
  const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = (particle?.interactivity ?? options.interactivity).events, divs = events.onDiv, hover = events.onHover, click = events.onClick, divRepulse = (0, engine_1.isDivModeEnabled)(repulseMode, divs);
143
- if (!(divRepulse || (hover.enable && mouse.position) || (click.enable && mouse.clickPosition))) {
144
+ if (!(divRepulse || (hover.enable && !!mouse.position) || (click.enable && mouse.clickPosition))) {
144
145
  return false;
145
146
  }
146
147
  const hoverMode = hover.mode, clickMode = click.mode;
package/cjs/index.js CHANGED
@@ -10,14 +10,28 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
10
10
  if (k2 === undefined) k2 = k;
11
11
  o[k2] = m[k];
12
12
  }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
13
25
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
26
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
27
  };
16
28
  Object.defineProperty(exports, "__esModule", { value: true });
17
29
  exports.loadExternalRepulseInteraction = void 0;
18
- const Repulser_js_1 = require("./Repulser.js");
19
30
  async function loadExternalRepulseInteraction(engine, refresh = true) {
20
- await engine.addInteractor("externalRepulse", (container) => new Repulser_js_1.Repulser(engine, container), refresh);
31
+ await engine.addInteractor("externalRepulse", async (container) => {
32
+ const { Repulser } = await Promise.resolve().then(() => __importStar(require("./Repulser.js")));
33
+ return new Repulser(engine, container);
34
+ }, refresh);
21
35
  }
22
36
  exports.loadExternalRepulseInteraction = loadExternalRepulseInteraction;
23
37
  __exportStar(require("./Options/Classes/RepulseBase.js"), exports);
@@ -0,0 +1,30 @@
1
+ /*!
2
+ * Author : Matteo Bruni
3
+ * MIT license: https://opensource.org/licenses/MIT
4
+ * Demo / Generator : https://particles.js.org/
5
+ * GitHub : https://www.github.com/matteobruni/tsparticles
6
+ * How to use? : Check the GitHub README
7
+ * v3.2.0
8
+ */
9
+ "use strict";
10
+ /*
11
+ * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
12
+ * This devtool is neither made for production nor for readable output files.
13
+ * It uses "eval()" calls to create a separate source file in the browser devtools.
14
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
15
+ * or disable the default devtool with "devtool: false".
16
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
17
+ */
18
+ (this["webpackChunk_tsparticles_interaction_external_repulse"] = this["webpackChunk_tsparticles_interaction_external_repulse"] || []).push([["dist_browser_Repulser_js"],{
19
+
20
+ /***/ "./dist/browser/Repulser.js":
21
+ /*!**********************************!*\
22
+ !*** ./dist/browser/Repulser.js ***!
23
+ \**********************************/
24
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
25
+
26
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Repulser: () => (/* binding */ Repulser)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Options_Classes_Repulse_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Repulse.js */ \"./dist/browser/Options/Classes/Repulse.js\");\n\n\nconst repulseMode = \"repulse\",\n minDistance = 0,\n repulseRadiusFactor = 6,\n repulseRadiusPower = 3,\n squarePower = 2,\n minRadius = 0,\n minSpeed = 0,\n easingOffset = 1,\n half = 0.5;\nclass Repulser extends _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.ExternalInteractorBase {\n constructor(engine, container) {\n super(container);\n this._clickRepulse = () => {\n const container = this.container,\n repulseOptions = container.actualOptions.interactivity.modes.repulse;\n if (!repulseOptions) {\n return;\n }\n const repulse = container.repulse ?? {\n particles: []\n };\n if (!repulse.finish) {\n if (!repulse.count) {\n repulse.count = 0;\n }\n repulse.count++;\n if (repulse.count === container.particles.count) {\n repulse.finish = true;\n }\n }\n if (repulse.clicking) {\n const repulseDistance = container.retina.repulseModeDistance;\n if (!repulseDistance || repulseDistance < minDistance) {\n return;\n }\n const repulseRadius = Math.pow(repulseDistance / repulseRadiusFactor, repulseRadiusPower),\n mouseClickPos = container.interactivity.mouse.clickPosition;\n if (mouseClickPos === undefined) {\n return;\n }\n const range = new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Circle(mouseClickPos.x, mouseClickPos.y, repulseRadius),\n query = container.particles.quadTree.query(range, p => this.isEnabled(p));\n for (const particle of query) {\n const {\n dx,\n dy,\n distance\n } = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getDistances)(mouseClickPos, particle.position),\n d = distance ** squarePower,\n velocity = repulseOptions.speed,\n force = -repulseRadius * velocity / d;\n if (d <= repulseRadius) {\n repulse.particles.push(particle);\n const vect = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.create(dx, dy);\n vect.length = force;\n particle.velocity.setTo(vect);\n }\n }\n } else if (repulse.clicking === false) {\n for (const particle of repulse.particles) {\n particle.velocity.setTo(particle.initialVelocity);\n }\n repulse.particles = [];\n }\n };\n this._hoverRepulse = () => {\n const container = this.container,\n mousePos = container.interactivity.mouse.position,\n repulseRadius = container.retina.repulseModeDistance;\n if (!repulseRadius || repulseRadius < minRadius || !mousePos) {\n return;\n }\n this._processRepulse(mousePos, repulseRadius, new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Circle(mousePos.x, mousePos.y, repulseRadius));\n };\n this._processRepulse = (position, repulseRadius, area, divRepulse) => {\n const container = this.container,\n query = container.particles.quadTree.query(area, p => this.isEnabled(p)),\n repulseOptions = container.actualOptions.interactivity.modes.repulse;\n if (!repulseOptions) {\n return;\n }\n const {\n easing,\n speed,\n factor,\n maxSpeed\n } = repulseOptions,\n easingFunc = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getEasing)(easing),\n velocity = (divRepulse?.speed ?? speed) * factor;\n for (const particle of query) {\n const {\n dx,\n dy,\n distance\n } = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getDistances)(particle.position, position),\n repulseFactor = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.clamp)(easingFunc(easingOffset - distance / repulseRadius) * velocity, minSpeed, maxSpeed),\n normVec = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.create(!distance ? velocity : dx / distance * repulseFactor, !distance ? velocity : dy / distance * repulseFactor);\n particle.position.addTo(normVec);\n }\n };\n this._singleSelectorRepulse = (selector, div) => {\n const container = this.container,\n repulse = container.actualOptions.interactivity.modes.repulse;\n if (!repulse) {\n return;\n }\n const query = document.querySelectorAll(selector);\n if (!query.length) {\n return;\n }\n query.forEach(item => {\n const elem = item,\n pxRatio = container.retina.pixelRatio,\n pos = {\n x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,\n y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio\n },\n repulseRadius = elem.offsetWidth * half * pxRatio,\n area = div.type === \"circle\" ? new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Circle(pos.x, pos.y, repulseRadius) : new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Rectangle(elem.offsetLeft * pxRatio, elem.offsetTop * pxRatio, elem.offsetWidth * pxRatio, elem.offsetHeight * pxRatio),\n divs = repulse.divs,\n divRepulse = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.divMode)(divs, elem);\n this._processRepulse(pos, repulseRadius, area, divRepulse);\n });\n };\n this._engine = engine;\n if (!container.repulse) {\n container.repulse = {\n particles: []\n };\n }\n this.handleClickMode = mode => {\n const options = this.container.actualOptions,\n repulseOpts = options.interactivity.modes.repulse;\n if (!repulseOpts || mode !== repulseMode) {\n return;\n }\n if (!container.repulse) {\n container.repulse = {\n particles: []\n };\n }\n const repulse = container.repulse;\n repulse.clicking = true;\n repulse.count = 0;\n for (const particle of container.repulse.particles) {\n if (!this.isEnabled(particle)) {\n continue;\n }\n particle.velocity.setTo(particle.initialVelocity);\n }\n repulse.particles = [];\n repulse.finish = false;\n setTimeout(() => {\n if (container.destroyed) {\n return;\n }\n repulse.clicking = false;\n }, repulseOpts.duration * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.millisecondsToSeconds);\n };\n }\n clear() {}\n init() {\n const container = this.container,\n repulse = container.actualOptions.interactivity.modes.repulse;\n if (!repulse) {\n return;\n }\n container.retina.repulseModeDistance = repulse.distance * container.retina.pixelRatio;\n }\n async interact() {\n const container = this.container,\n options = container.actualOptions,\n mouseMoveStatus = container.interactivity.status === _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.mouseMoveEvent,\n events = options.interactivity.events,\n hover = events.onHover,\n hoverEnabled = hover.enable,\n hoverMode = hover.mode,\n click = events.onClick,\n clickEnabled = click.enable,\n clickMode = click.mode,\n divs = events.onDiv;\n if (mouseMoveStatus && hoverEnabled && (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isInArray)(repulseMode, hoverMode)) {\n this._hoverRepulse();\n } else if (clickEnabled && (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isInArray)(repulseMode, clickMode)) {\n this._clickRepulse();\n } else {\n (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.divModeExecute)(repulseMode, divs, (selector, div) => this._singleSelectorRepulse(selector, div));\n }\n await Promise.resolve();\n }\n isEnabled(particle) {\n const container = this.container,\n options = container.actualOptions,\n mouse = container.interactivity.mouse,\n events = (particle?.interactivity ?? options.interactivity).events,\n divs = events.onDiv,\n hover = events.onHover,\n click = events.onClick,\n divRepulse = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isDivModeEnabled)(repulseMode, divs);\n if (!(divRepulse || hover.enable && !!mouse.position || click.enable && mouse.clickPosition)) {\n return false;\n }\n const hoverMode = hover.mode,\n clickMode = click.mode;\n return (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isInArray)(repulseMode, hoverMode) || (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isInArray)(repulseMode, clickMode) || divRepulse;\n }\n loadModeOptions(options, ...sources) {\n if (!options.repulse) {\n options.repulse = new _Options_Classes_Repulse_js__WEBPACK_IMPORTED_MODULE_1__.Repulse();\n }\n for (const source of sources) {\n options.repulse.load(source?.repulse);\n }\n }\n reset() {}\n}\n\n//# sourceURL=webpack://@tsparticles/interaction-external-repulse/./dist/browser/Repulser.js?");
27
+
28
+ /***/ })
29
+
30
+ }]);
package/esm/Repulser.js CHANGED
@@ -1,6 +1,6 @@
1
- import { Circle, ExternalInteractorBase, Rectangle, Vector, clamp, divMode, divModeExecute, getDistances, getEasing, isDivModeEnabled, isInArray, mouseMoveEvent, } from "@tsparticles/engine";
1
+ import { Circle, ExternalInteractorBase, Rectangle, Vector, clamp, divMode, divModeExecute, getDistances, getEasing, isDivModeEnabled, isInArray, millisecondsToSeconds, mouseMoveEvent, } from "@tsparticles/engine";
2
2
  import { Repulse } from "./Options/Classes/Repulse.js";
3
- const repulseMode = "repulse";
3
+ const repulseMode = "repulse", minDistance = 0, repulseRadiusFactor = 6, repulseRadiusPower = 3, squarePower = 2, minRadius = 0, minSpeed = 0, easingOffset = 1, half = 0.5;
4
4
  export class Repulser extends ExternalInteractorBase {
5
5
  constructor(engine, container) {
6
6
  super(container);
@@ -9,7 +9,7 @@ export class Repulser extends ExternalInteractorBase {
9
9
  if (!repulseOptions) {
10
10
  return;
11
11
  }
12
- const repulse = container.repulse || { particles: [] };
12
+ const repulse = container.repulse ?? { particles: [] };
13
13
  if (!repulse.finish) {
14
14
  if (!repulse.count) {
15
15
  repulse.count = 0;
@@ -21,16 +21,16 @@ export class Repulser extends ExternalInteractorBase {
21
21
  }
22
22
  if (repulse.clicking) {
23
23
  const repulseDistance = container.retina.repulseModeDistance;
24
- if (!repulseDistance || repulseDistance < 0) {
24
+ if (!repulseDistance || repulseDistance < minDistance) {
25
25
  return;
26
26
  }
27
- const repulseRadius = Math.pow(repulseDistance / 6, 3), mouseClickPos = container.interactivity.mouse.clickPosition;
27
+ const repulseRadius = Math.pow(repulseDistance / repulseRadiusFactor, repulseRadiusPower), mouseClickPos = container.interactivity.mouse.clickPosition;
28
28
  if (mouseClickPos === undefined) {
29
29
  return;
30
30
  }
31
31
  const range = new Circle(mouseClickPos.x, mouseClickPos.y, repulseRadius), query = container.particles.quadTree.query(range, (p) => this.isEnabled(p));
32
32
  for (const particle of query) {
33
- const { dx, dy, distance } = getDistances(mouseClickPos, particle.position), d = distance ** 2, velocity = repulseOptions.speed, force = (-repulseRadius * velocity) / d;
33
+ const { dx, dy, distance } = getDistances(mouseClickPos, particle.position), d = distance ** squarePower, velocity = repulseOptions.speed, force = (-repulseRadius * velocity) / d;
34
34
  if (d <= repulseRadius) {
35
35
  repulse.particles.push(particle);
36
36
  const vect = Vector.create(dx, dy);
@@ -48,7 +48,7 @@ export class Repulser extends ExternalInteractorBase {
48
48
  };
49
49
  this._hoverRepulse = () => {
50
50
  const container = this.container, mousePos = container.interactivity.mouse.position, repulseRadius = container.retina.repulseModeDistance;
51
- if (!repulseRadius || repulseRadius < 0 || !mousePos) {
51
+ if (!repulseRadius || repulseRadius < minRadius || !mousePos) {
52
52
  return;
53
53
  }
54
54
  this._processRepulse(mousePos, repulseRadius, new Circle(mousePos.x, mousePos.y, repulseRadius));
@@ -60,7 +60,7 @@ export class Repulser extends ExternalInteractorBase {
60
60
  }
61
61
  const { easing, speed, factor, maxSpeed } = repulseOptions, easingFunc = getEasing(easing), velocity = (divRepulse?.speed ?? speed) * factor;
62
62
  for (const particle of query) {
63
- const { dx, dy, distance } = getDistances(particle.position, position), repulseFactor = clamp(easingFunc(1 - distance / repulseRadius) * velocity, 0, maxSpeed), normVec = Vector.create(distance === 0 ? velocity : (dx / distance) * repulseFactor, distance === 0 ? velocity : (dy / distance) * repulseFactor);
63
+ const { dx, dy, distance } = getDistances(particle.position, position), repulseFactor = clamp(easingFunc(easingOffset - distance / repulseRadius) * velocity, minSpeed, maxSpeed), normVec = Vector.create(!distance ? velocity : (dx / distance) * repulseFactor, !distance ? velocity : (dy / distance) * repulseFactor);
64
64
  particle.position.addTo(normVec);
65
65
  }
66
66
  };
@@ -75,9 +75,9 @@ export class Repulser extends ExternalInteractorBase {
75
75
  }
76
76
  query.forEach((item) => {
77
77
  const elem = item, pxRatio = container.retina.pixelRatio, pos = {
78
- x: (elem.offsetLeft + elem.offsetWidth / 2) * pxRatio,
79
- y: (elem.offsetTop + elem.offsetHeight / 2) * pxRatio,
80
- }, repulseRadius = (elem.offsetWidth / 2) * pxRatio, area = div.type === "circle"
78
+ x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,
79
+ y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio,
80
+ }, repulseRadius = elem.offsetWidth * half * pxRatio, area = div.type === "circle"
81
81
  ? new Circle(pos.x, pos.y, repulseRadius)
82
82
  : new Rectangle(elem.offsetLeft * pxRatio, elem.offsetTop * pxRatio, elem.offsetWidth * pxRatio, elem.offsetHeight * pxRatio), divs = repulse.divs, divRepulse = divMode(divs, elem);
83
83
  this._processRepulse(pos, repulseRadius, area, divRepulse);
@@ -111,7 +111,7 @@ export class Repulser extends ExternalInteractorBase {
111
111
  return;
112
112
  }
113
113
  repulse.clicking = false;
114
- }, repulseOpts.duration * 1000);
114
+ }, repulseOpts.duration * millisecondsToSeconds);
115
115
  };
116
116
  }
117
117
  clear() {
@@ -134,10 +134,11 @@ export class Repulser extends ExternalInteractorBase {
134
134
  else {
135
135
  divModeExecute(repulseMode, divs, (selector, div) => this._singleSelectorRepulse(selector, div));
136
136
  }
137
+ await Promise.resolve();
137
138
  }
138
139
  isEnabled(particle) {
139
140
  const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = (particle?.interactivity ?? options.interactivity).events, divs = events.onDiv, hover = events.onHover, click = events.onClick, divRepulse = isDivModeEnabled(repulseMode, divs);
140
- if (!(divRepulse || (hover.enable && mouse.position) || (click.enable && mouse.clickPosition))) {
141
+ if (!(divRepulse || (hover.enable && !!mouse.position) || (click.enable && mouse.clickPosition))) {
141
142
  return false;
142
143
  }
143
144
  const hoverMode = hover.mode, clickMode = click.mode;
package/esm/index.js CHANGED
@@ -1,6 +1,8 @@
1
- import { Repulser } from "./Repulser.js";
2
1
  export async function loadExternalRepulseInteraction(engine, refresh = true) {
3
- await engine.addInteractor("externalRepulse", (container) => new Repulser(engine, container), refresh);
2
+ await engine.addInteractor("externalRepulse", async (container) => {
3
+ const { Repulser } = await import("./Repulser.js");
4
+ return new Repulser(engine, container);
5
+ }, refresh);
4
6
  }
5
7
  export * from "./Options/Classes/RepulseBase.js";
6
8
  export * from "./Options/Classes/RepulseDiv.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsparticles/interaction-external-repulse",
3
- "version": "3.0.3",
3
+ "version": "3.2.0",
4
4
  "description": "tsParticles repulse external interaction",
5
5
  "homepage": "https://particles.js.org",
6
6
  "repository": {
@@ -87,7 +87,7 @@
87
87
  "./package.json": "./package.json"
88
88
  },
89
89
  "dependencies": {
90
- "@tsparticles/engine": "^3.0.3"
90
+ "@tsparticles/engine": "^3.2.0"
91
91
  },
92
92
  "publishConfig": {
93
93
  "access": "public"
package/report.html CHANGED
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8"/>
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
6
- <title>@tsparticles/interaction-external-repulse [26 Dec 2023 at 19:26]</title>
6
+ <title>@tsparticles/interaction-external-repulse [31 Jan 2024 at 02:04]</title>
7
7
  <link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABrVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+O1foceMD///+J0/qK1Pr7/v8Xdr/9///W8P4UdL7L7P0Scr2r4Pyj3vwad8D5/f/2/f+55f3E6f34+/2H0/ojfMKpzOd0rNgQcb3F3O/j9f7c8v6g3Pz0/P/w+v/q+P7n9v6T1/uQ1vuE0vqLut/y+v+Z2fvt+f+15Pzv9fuc2/vR7v2V2Pvd6/bg9P7I6/285/2y4/yp3/zp8vk8i8kqgMT7/P31+fyv4vxGkcz6/P6/6P3j7vfS5PNnpNUxhcbO7f7F6v3O4vHK3/DA2u631Ouy0eqXweKJud5wqthfoNMMbLvY8f73+v2dxeR8sNtTmdDx9/zX6PSjyeaCtd1YnNGX2PuQveCGt95Nls42h8dLlM3F4vBtAAAAM3RSTlMAAyOx0/sKBvik8opWGBMOAe3l1snDm2E9LSb06eHcu5JpHbarfHZCN9CBb08zzkdNS0kYaptYAAAFV0lEQVRYw92X51/aYBDHHS2O2qqttVbrqNq9m+TJIAYIShBkWwqIiCgoWvfeq7Z2/s29hyQNyUcR7LveGwVyXy6XH8/9rqxglLfUPLxVduUor3h0rfp2TYvpivk37929TkG037hffoX0+peVtZQc1589rigVUdXS/ABSAyEmGIO/1XfvldSK8vs3OqB6u3m0nxmIrvgB0dj7rr7Y9IbuF68hnfFaiHA/sxqm0wciIG43P60qKv9WXWc1RXGh/mFESFABTSBi0sNAKzqet17eCtOb3kZIDwxEEU0oAIJGYxNBDhBND29e0rtXXbcpuPmED9IhEAAQ/AXEaF8EPmnrrKsv0LvWR3fg5sWDNAFZOgAgaKvZDogHNU9MFwnnYROkc56RD5CjAbQX9Ow4g7upCsvYu55aSI/Nj0H1akgKQEUM94dwK65hYRmFU9MIcH/fqJYOZYcnuJSU/waKDgTOEVaVKhwrTRP5XzgSpAITYzom7UvkhFX5VutmxeNnWDjjswTKTyfgluNDGbUpWissXhF3s7mlSml+czWkg3D0l1nNjGNjz3myOQOa1KM/jOS6ebdbAVTCi4gljHSFrviza7tOgRWcS0MOUX9zdNgag5w7rRqA44Lzw0hr1WqES36dFliSJFlh2rXIae3FFcDDgKdxrUIDePr8jGcSClV1u7A9xeN0ModY/pHMxmR1EzRh8TJiwqsHmKW0l4FCEZI+jHio+JdPPE9qwQtTRxku2D8sIeRL2LnxWSllANCQGOIiqVHAz2ye2JR0DcH+HoxDkaADLjgxjKQ+AwCX/g0+DNgdG0ukYCONAe+dbc2IAc6fwt1ARoDSezNHxV2Cmzwv3O6lDMV55edBGwGK9n1+x2F8EDfAGCxug8MhpsMEcTEAWf3rx2vZhe/LAmtIn/6apE6PN0ULKgywD9mmdxbmFl3OvD5AS5fW5zLbv/YHmcsBTjf/afDz3MaZTVCfAP9z6/Bw6ycv8EUBWJIn9zYcoAWWlW9+OzO3vkTy8H+RANLmdrpOuYWdZYEXpo+TlCJrW5EARb7fF+bWdqf3hhyZI1nWJQHgznErZhbjoEsWqi8dQNoE294aldzFurwSABL2XXMf9+H1VQGke9exw5P/AnA5Pv5ngMul7LOvO922iwACu8WkCwLCafvM4CeWPxfA8lNHcWZSoi8EwMAIciKX2Z4SWCMAa3snCZ/G4EA8D6CMLNFsGQhkkz/gQNEBbPCbWsxGUpYVu3z8IyNAknwJkfPMEhLyrdi5RTyUVACkw4GSFRNWJNEW+fgPGwHD8/JxnRuLabN4CGNRkAE23na2+VmEAUmrYymSGjMAYqH84YUIyzgzs3XC7gNgH36Vcc4zKY9o9fgPBXUAiHHwVboBHGLiX6Zcjp1f2wu4tvzZKo0ecPnDtQYDQvJXaBeNzce45Fp28ZQLrEZVuFqgBwOalArKXnW1UzlnSusQKJqKYNuz4tOnI6sZG4zanpemv+7ySU2jbA9h6uhcgpfy6G2PahirDZ6zvq6zDduMVFTKvzw8wgyEdelwY9in3XkEPs3osJuwRQ4qTkfzifndg9Gfc4pdsu82+tTnHZTBa2EAMrqr2t43pguc8tNm7JQVQ2S0ukj2d22dhXYP0/veWtwKrCkNoNimAN5+Xr/oLrxswKbVJjteWrX7eR63o4j9q0GxnaBdWgGA5VStpanIjQmEhV0/nVt5VOFUvix6awJhPcAaTEShgrG+iGyvb5a0Ndb1YGHFPEwoqAinoaykaID1o1pdPNu7XsnCKQ3R+hwWIIhGvORcJUBYXe3Xa3vq/mF/N9V13ugufMkfXn+KHsRD0B8AAAAASUVORK5CYII=" type="image/x-icon" />
8
8
 
9
9
  <script>
@@ -31,8 +31,8 @@
31
31
  <body>
32
32
  <div id="app"></div>
33
33
  <script>
34
- window.chartData = [{"label":"tsparticles.interaction.external.repulse.js","isAsset":true,"statSize":9560,"parsedSize":13456,"gzipSize":3351,"groups":[{"label":"dist/browser","path":"./dist/browser","statSize":9518,"groups":[{"id":26,"label":"index.js + 4 modules (concatenated)","path":"./dist/browser/index.js + 4 modules (concatenated)","statSize":9518,"parsedSize":13456,"gzipSize":3351,"concatenated":true,"groups":[{"label":"dist/browser","path":"./dist/browser/index.js + 4 modules (concatenated)/dist/browser","statSize":9518,"groups":[{"id":null,"label":"index.js","path":"./dist/browser/index.js + 4 modules (concatenated)/dist/browser/index.js","statSize":528,"parsedSize":746,"gzipSize":185,"inaccurateSizes":true},{"id":null,"label":"Repulser.js","path":"./dist/browser/index.js + 4 modules (concatenated)/dist/browser/Repulser.js","statSize":7517,"parsedSize":10627,"gzipSize":2646,"inaccurateSizes":true},{"label":"Options/Classes","path":"./dist/browser/index.js + 4 modules (concatenated)/dist/browser/Options/Classes","statSize":1473,"groups":[{"id":null,"label":"Repulse.js","path":"./dist/browser/index.js + 4 modules (concatenated)/dist/browser/Options/Classes/Repulse.js","statSize":426,"parsedSize":602,"gzipSize":149,"inaccurateSizes":true},{"id":null,"label":"RepulseBase.js","path":"./dist/browser/index.js + 4 modules (concatenated)/dist/browser/Options/Classes/RepulseBase.js","statSize":729,"parsedSize":1030,"gzipSize":256,"inaccurateSizes":true},{"id":null,"label":"RepulseDiv.js","path":"./dist/browser/index.js + 4 modules (concatenated)/dist/browser/Options/Classes/RepulseDiv.js","statSize":318,"parsedSize":449,"gzipSize":111,"inaccurateSizes":true}],"parsedSize":2082,"gzipSize":518,"inaccurateSizes":true}],"parsedSize":13456,"gzipSize":3351,"inaccurateSizes":true}]}],"parsedSize":13456,"gzipSize":3351},{"label":"engine\",\"commonjs2\":\"@tsparticles/engine\",\"amd\":\"@tsparticles","path":"./engine\",\"commonjs2\":\"@tsparticles/engine\",\"amd\":\"@tsparticles","statSize":42,"groups":[{"id":533,"label":"engine\",\"root\":\"window\"}","path":"./engine\",\"commonjs2\":\"@tsparticles/engine\",\"amd\":\"@tsparticles/engine\",\"root\":\"window\"}","statSize":42}],"parsedSize":0,"gzipSize":0}],"isInitialByEntrypoint":{"tsparticles.interaction.external.repulse":true}}];
35
- window.entrypoints = ["tsparticles.interaction.external.repulse","tsparticles.interaction.external.repulse.min"];
34
+ window.chartData = [];
35
+ window.entrypoints = ["tsparticles.interaction.external.repulse.min"];
36
36
  window.defaultSizes = "parsed";
37
37
  </script>
38
38
  </body>