@tsparticles/interaction-external-bounce 3.1.0 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
package/33.min.js ADDED
@@ -0,0 +1,2 @@
1
+ /*! For license information please see 33.min.js.LICENSE.txt */
2
+ (this.webpackChunk_tsparticles_interaction_external_bounce=this.webpackChunk_tsparticles_interaction_external_bounce||[]).push([[33],{33:(e,n,t)=>{t.d(n,{Bouncer:()=>s});var i=t(533),o=t(523);const a="bounce";class s extends i.ExternalInteractorBase{constructor(e){super(e)}clear(){}init(){const e=this.container,n=e.actualOptions.interactivity.modes.bounce;n&&(e.retina.bounceModeDistance=n.distance*e.retina.pixelRatio)}async interact(){const e=this.container,n=e.actualOptions.interactivity.events,o=e.interactivity.status===i.mouseMoveEvent,s=n.onHover.enable,c=n.onHover.mode,r=n.onDiv;if(o&&s&&(0,i.isInArray)(a,c)){const{mouseBounce:e}=await t.e(409).then(t.bind(t,409));e(this.container,(e=>this.isEnabled(e)))}else{const{divBounce:e}=await t.e(409).then(t.bind(t,409));e(this.container,r,a,(e=>this.isEnabled(e)))}}isEnabled(e){const n=this.container,t=n.actualOptions,o=n.interactivity.mouse,s=(e?.interactivity??t.interactivity).events,c=s.onDiv;return!!o.position&&s.onHover.enable&&(0,i.isInArray)(a,s.onHover.mode)||(0,i.isDivModeEnabled)(a,c)}loadModeOptions(e,...n){e.bounce||(e.bounce=new o.s);for(const t of n)e.bounce.load(t?.bounce)}reset(){}}}}]);
@@ -0,0 +1 @@
1
+ /*! tsParticles Bounce External Interaction v3.2.1 by Matteo Bruni */
package/409.min.js ADDED
@@ -0,0 +1,2 @@
1
+ /*! For license information please see 409.min.js.LICENSE.txt */
2
+ (this.webpackChunk_tsparticles_interaction_external_bounce=this.webpackChunk_tsparticles_interaction_external_bounce||[]).push([[409],{409:(e,t,o)=>{o.d(t,{divBounce:()=>l,mouseBounce:()=>h});var c=o(533);const n=2,i=.5,s=Math.PI*i,r=2,a=10,f=0;function u(e,t,o,i,r){const a=e.particles.quadTree.query(i,r);for(const e of a)i instanceof c.Circle?(0,c.circleBounce)((0,c.circleBounceDataFromParticle)(e),{position:t,radius:o,mass:o**n*s,velocity:c.Vector.origin,factor:c.Vector.origin}):i instanceof c.Rectangle&&(0,c.rectBounce)(e,(0,c.calculateBounds)(t,o))}function l(e,t,o,n){(0,c.divModeExecute)(o,t,((t,o)=>function(e,t,o,n){const s=document.querySelectorAll(t);s.length&&s.forEach((t=>{const s=t,f=e.retina.pixelRatio,u={x:(s.offsetLeft+s.offsetWidth*i)*f,y:(s.offsetTop+s.offsetHeight*i)*f},l=s.offsetWidth*i*f,h=a*f,p="circle"===o.type?new c.Circle(u.x,u.y,l+h):new c.Rectangle(s.offsetLeft*f-h,s.offsetTop*f-h,s.offsetWidth*f+h*r,s.offsetHeight*f+h*r);n(u,l,p)}))}(e,t,o,((t,o,c)=>u(e,t,o,c,n)))))}function h(e,t){const o=e.retina.pixelRatio,n=a*o,i=e.interactivity.mouse.position,s=e.retina.bounceModeDistance;!s||s<f||!i||u(e,i,s,new c.Circle(i.x,i.y,s+n),t)}}}]);
@@ -0,0 +1 @@
1
+ /*! tsParticles Bounce External Interaction v3.2.1 by Matteo Bruni */
@@ -1,48 +1,9 @@
1
- import { Circle, ExternalInteractorBase, Rectangle, Vector, calculateBounds, circleBounce, circleBounceDataFromParticle, divModeExecute, isDivModeEnabled, isInArray, mouseMoveEvent, rectBounce, } from "@tsparticles/engine";
1
+ import { ExternalInteractorBase, isDivModeEnabled, isInArray, mouseMoveEvent, } from "@tsparticles/engine";
2
2
  import { Bounce } from "./Options/Classes/Bounce.js";
3
- const bounceMode = "bounce", squareExp = 2, double = 2, half = 0.5, halfPI = Math.PI * half, toleranceFactor = 10, minRadius = 0;
3
+ const bounceMode = "bounce";
4
4
  export class Bouncer extends ExternalInteractorBase {
5
5
  constructor(container) {
6
6
  super(container);
7
- this._processBounce = (position, radius, area) => {
8
- const query = this.container.particles.quadTree.query(area, (p) => this.isEnabled(p));
9
- for (const particle of query) {
10
- if (area instanceof Circle) {
11
- circleBounce(circleBounceDataFromParticle(particle), {
12
- position,
13
- radius,
14
- mass: radius ** squareExp * halfPI,
15
- velocity: Vector.origin,
16
- factor: Vector.origin,
17
- });
18
- }
19
- else if (area instanceof Rectangle) {
20
- rectBounce(particle, calculateBounds(position, radius));
21
- }
22
- }
23
- };
24
- this._processMouseBounce = () => {
25
- const container = this.container, pxRatio = container.retina.pixelRatio, tolerance = toleranceFactor * pxRatio, mousePos = container.interactivity.mouse.position, radius = container.retina.bounceModeDistance;
26
- if (!radius || radius < minRadius || !mousePos) {
27
- return;
28
- }
29
- this._processBounce(mousePos, radius, new Circle(mousePos.x, mousePos.y, radius + tolerance));
30
- };
31
- this._singleSelectorBounce = (selector, div) => {
32
- const container = this.container, query = document.querySelectorAll(selector);
33
- if (!query.length) {
34
- return;
35
- }
36
- query.forEach((item) => {
37
- const elem = item, pxRatio = container.retina.pixelRatio, pos = {
38
- x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,
39
- y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio,
40
- }, radius = elem.offsetWidth * half * pxRatio, tolerance = toleranceFactor * pxRatio, area = div.type === "circle"
41
- ? new Circle(pos.x, pos.y, radius + tolerance)
42
- : new Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * double, elem.offsetHeight * pxRatio + tolerance * double);
43
- this._processBounce(pos, radius, area);
44
- });
45
- };
46
7
  }
47
8
  clear() {
48
9
  }
@@ -56,12 +17,13 @@ export class Bouncer extends ExternalInteractorBase {
56
17
  async interact() {
57
18
  const container = this.container, options = container.actualOptions, events = options.interactivity.events, mouseMoveStatus = container.interactivity.status === mouseMoveEvent, hoverEnabled = events.onHover.enable, hoverMode = events.onHover.mode, divs = events.onDiv;
58
19
  if (mouseMoveStatus && hoverEnabled && isInArray(bounceMode, hoverMode)) {
59
- this._processMouseBounce();
20
+ const { mouseBounce } = await import("./Utils.js");
21
+ mouseBounce(this.container, (p) => this.isEnabled(p));
60
22
  }
61
23
  else {
62
- divModeExecute(bounceMode, divs, (selector, div) => this._singleSelectorBounce(selector, div));
24
+ const { divBounce } = await import("./Utils.js");
25
+ divBounce(this.container, divs, bounceMode, (p) => this.isEnabled(p));
63
26
  }
64
- await Promise.resolve();
65
27
  }
66
28
  isEnabled(particle) {
67
29
  const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = (particle?.interactivity ?? options.interactivity).events, divs = events.onDiv;
@@ -0,0 +1,44 @@
1
+ import { Circle, Rectangle, Vector, calculateBounds, circleBounce, circleBounceDataFromParticle, divModeExecute, rectBounce, } from "@tsparticles/engine";
2
+ const squareExp = 2, half = 0.5, halfPI = Math.PI * half, double = 2, toleranceFactor = 10, minRadius = 0;
3
+ function processBounce(container, position, radius, area, enabledCb) {
4
+ const query = container.particles.quadTree.query(area, enabledCb);
5
+ for (const particle of query) {
6
+ if (area instanceof Circle) {
7
+ circleBounce(circleBounceDataFromParticle(particle), {
8
+ position,
9
+ radius,
10
+ mass: radius ** squareExp * halfPI,
11
+ velocity: Vector.origin,
12
+ factor: Vector.origin,
13
+ });
14
+ }
15
+ else if (area instanceof Rectangle) {
16
+ rectBounce(particle, calculateBounds(position, radius));
17
+ }
18
+ }
19
+ }
20
+ function singleSelectorBounce(container, selector, div, bounceCb) {
21
+ const query = document.querySelectorAll(selector);
22
+ if (!query.length) {
23
+ return;
24
+ }
25
+ query.forEach((item) => {
26
+ const elem = item, pxRatio = container.retina.pixelRatio, pos = {
27
+ x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,
28
+ y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio,
29
+ }, radius = elem.offsetWidth * half * pxRatio, tolerance = toleranceFactor * pxRatio, area = div.type === "circle"
30
+ ? new Circle(pos.x, pos.y, radius + tolerance)
31
+ : new Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * double, elem.offsetHeight * pxRatio + tolerance * double);
32
+ bounceCb(pos, radius, area);
33
+ });
34
+ }
35
+ export function divBounce(container, divs, bounceMode, enabledCb) {
36
+ divModeExecute(bounceMode, divs, (selector, div) => singleSelectorBounce(container, selector, div, (pos, radius, area) => processBounce(container, pos, radius, area, enabledCb)));
37
+ }
38
+ export function mouseBounce(container, enabledCb) {
39
+ const pxRatio = container.retina.pixelRatio, tolerance = toleranceFactor * pxRatio, mousePos = container.interactivity.mouse.position, radius = container.retina.bounceModeDistance;
40
+ if (!radius || radius < minRadius || !mousePos) {
41
+ return;
42
+ }
43
+ processBounce(container, mousePos, radius, new Circle(mousePos.x, mousePos.y, radius + tolerance), enabledCb);
44
+ }
package/browser/index.js CHANGED
@@ -1,6 +1,8 @@
1
- import { Bouncer } from "./Bouncer.js";
2
1
  export async function loadExternalBounceInteraction(engine, refresh = true) {
3
- await engine.addInteractor("externalBounce", (container) => new Bouncer(container), refresh);
2
+ await engine.addInteractor("externalBounce", async (container) => {
3
+ const { Bouncer } = await import("./Bouncer.js");
4
+ return new Bouncer(container);
5
+ }, refresh);
4
6
  }
5
7
  export * from "./Options/Classes/Bounce.js";
6
8
  export * from "./Options/Interfaces/IBounce.js";
package/cjs/Bouncer.js CHANGED
@@ -1,51 +1,35 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
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
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.Bouncer = void 0;
4
27
  const engine_1 = require("@tsparticles/engine");
5
28
  const Bounce_js_1 = require("./Options/Classes/Bounce.js");
6
- const bounceMode = "bounce", squareExp = 2, double = 2, half = 0.5, halfPI = Math.PI * half, toleranceFactor = 10, minRadius = 0;
29
+ const bounceMode = "bounce";
7
30
  class Bouncer extends engine_1.ExternalInteractorBase {
8
31
  constructor(container) {
9
32
  super(container);
10
- this._processBounce = (position, radius, area) => {
11
- const query = this.container.particles.quadTree.query(area, (p) => this.isEnabled(p));
12
- for (const particle of query) {
13
- if (area instanceof engine_1.Circle) {
14
- (0, engine_1.circleBounce)((0, engine_1.circleBounceDataFromParticle)(particle), {
15
- position,
16
- radius,
17
- mass: radius ** squareExp * halfPI,
18
- velocity: engine_1.Vector.origin,
19
- factor: engine_1.Vector.origin,
20
- });
21
- }
22
- else if (area instanceof engine_1.Rectangle) {
23
- (0, engine_1.rectBounce)(particle, (0, engine_1.calculateBounds)(position, radius));
24
- }
25
- }
26
- };
27
- this._processMouseBounce = () => {
28
- const container = this.container, pxRatio = container.retina.pixelRatio, tolerance = toleranceFactor * pxRatio, mousePos = container.interactivity.mouse.position, radius = container.retina.bounceModeDistance;
29
- if (!radius || radius < minRadius || !mousePos) {
30
- return;
31
- }
32
- this._processBounce(mousePos, radius, new engine_1.Circle(mousePos.x, mousePos.y, radius + tolerance));
33
- };
34
- this._singleSelectorBounce = (selector, div) => {
35
- const container = this.container, query = document.querySelectorAll(selector);
36
- if (!query.length) {
37
- return;
38
- }
39
- query.forEach((item) => {
40
- const elem = item, pxRatio = container.retina.pixelRatio, pos = {
41
- x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,
42
- y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio,
43
- }, radius = elem.offsetWidth * half * pxRatio, tolerance = toleranceFactor * pxRatio, area = div.type === "circle"
44
- ? new engine_1.Circle(pos.x, pos.y, radius + tolerance)
45
- : new engine_1.Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * double, elem.offsetHeight * pxRatio + tolerance * double);
46
- this._processBounce(pos, radius, area);
47
- });
48
- };
49
33
  }
50
34
  clear() {
51
35
  }
@@ -59,12 +43,13 @@ class Bouncer extends engine_1.ExternalInteractorBase {
59
43
  async interact() {
60
44
  const container = this.container, options = container.actualOptions, events = options.interactivity.events, mouseMoveStatus = container.interactivity.status === engine_1.mouseMoveEvent, hoverEnabled = events.onHover.enable, hoverMode = events.onHover.mode, divs = events.onDiv;
61
45
  if (mouseMoveStatus && hoverEnabled && (0, engine_1.isInArray)(bounceMode, hoverMode)) {
62
- this._processMouseBounce();
46
+ const { mouseBounce } = await Promise.resolve().then(() => __importStar(require("./Utils.js")));
47
+ mouseBounce(this.container, (p) => this.isEnabled(p));
63
48
  }
64
49
  else {
65
- (0, engine_1.divModeExecute)(bounceMode, divs, (selector, div) => this._singleSelectorBounce(selector, div));
50
+ const { divBounce } = await Promise.resolve().then(() => __importStar(require("./Utils.js")));
51
+ divBounce(this.container, divs, bounceMode, (p) => this.isEnabled(p));
66
52
  }
67
- await Promise.resolve();
68
53
  }
69
54
  isEnabled(particle) {
70
55
  const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = (particle?.interactivity ?? options.interactivity).events, divs = events.onDiv;
package/cjs/Utils.js ADDED
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mouseBounce = exports.divBounce = void 0;
4
+ const engine_1 = require("@tsparticles/engine");
5
+ const squareExp = 2, half = 0.5, halfPI = Math.PI * half, double = 2, toleranceFactor = 10, minRadius = 0;
6
+ function processBounce(container, position, radius, area, enabledCb) {
7
+ const query = container.particles.quadTree.query(area, enabledCb);
8
+ for (const particle of query) {
9
+ if (area instanceof engine_1.Circle) {
10
+ (0, engine_1.circleBounce)((0, engine_1.circleBounceDataFromParticle)(particle), {
11
+ position,
12
+ radius,
13
+ mass: radius ** squareExp * halfPI,
14
+ velocity: engine_1.Vector.origin,
15
+ factor: engine_1.Vector.origin,
16
+ });
17
+ }
18
+ else if (area instanceof engine_1.Rectangle) {
19
+ (0, engine_1.rectBounce)(particle, (0, engine_1.calculateBounds)(position, radius));
20
+ }
21
+ }
22
+ }
23
+ function singleSelectorBounce(container, selector, div, bounceCb) {
24
+ const query = document.querySelectorAll(selector);
25
+ if (!query.length) {
26
+ return;
27
+ }
28
+ query.forEach((item) => {
29
+ const elem = item, pxRatio = container.retina.pixelRatio, pos = {
30
+ x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,
31
+ y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio,
32
+ }, radius = elem.offsetWidth * half * pxRatio, tolerance = toleranceFactor * pxRatio, area = div.type === "circle"
33
+ ? new engine_1.Circle(pos.x, pos.y, radius + tolerance)
34
+ : new engine_1.Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * double, elem.offsetHeight * pxRatio + tolerance * double);
35
+ bounceCb(pos, radius, area);
36
+ });
37
+ }
38
+ function divBounce(container, divs, bounceMode, enabledCb) {
39
+ (0, engine_1.divModeExecute)(bounceMode, divs, (selector, div) => singleSelectorBounce(container, selector, div, (pos, radius, area) => processBounce(container, pos, radius, area, enabledCb)));
40
+ }
41
+ exports.divBounce = divBounce;
42
+ function mouseBounce(container, enabledCb) {
43
+ const pxRatio = container.retina.pixelRatio, tolerance = toleranceFactor * pxRatio, mousePos = container.interactivity.mouse.position, radius = container.retina.bounceModeDistance;
44
+ if (!radius || radius < minRadius || !mousePos) {
45
+ return;
46
+ }
47
+ processBounce(container, mousePos, radius, new engine_1.Circle(mousePos.x, mousePos.y, radius + tolerance), enabledCb);
48
+ }
49
+ exports.mouseBounce = mouseBounce;
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.loadExternalBounceInteraction = void 0;
18
- const Bouncer_js_1 = require("./Bouncer.js");
19
30
  async function loadExternalBounceInteraction(engine, refresh = true) {
20
- await engine.addInteractor("externalBounce", (container) => new Bouncer_js_1.Bouncer(container), refresh);
31
+ await engine.addInteractor("externalBounce", async (container) => {
32
+ const { Bouncer } = await Promise.resolve().then(() => __importStar(require("./Bouncer.js")));
33
+ return new Bouncer(container);
34
+ }, refresh);
21
35
  }
22
36
  exports.loadExternalBounceInteraction = loadExternalBounceInteraction;
23
37
  __exportStar(require("./Options/Classes/Bounce.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.1
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_bounce"] = this["webpackChunk_tsparticles_interaction_external_bounce"] || []).push([["dist_browser_Bouncer_js"],{
19
+
20
+ /***/ "./dist/browser/Bouncer.js":
21
+ /*!*********************************!*\
22
+ !*** ./dist/browser/Bouncer.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 */ Bouncer: () => (/* binding */ Bouncer)\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_Bounce_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Bounce.js */ \"./dist/browser/Options/Classes/Bounce.js\");\n\n\nconst bounceMode = \"bounce\";\nclass Bouncer extends _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.ExternalInteractorBase {\n constructor(container) {\n super(container);\n }\n clear() {}\n init() {\n const container = this.container,\n bounce = container.actualOptions.interactivity.modes.bounce;\n if (!bounce) {\n return;\n }\n container.retina.bounceModeDistance = bounce.distance * container.retina.pixelRatio;\n }\n async interact() {\n const container = this.container,\n options = container.actualOptions,\n events = options.interactivity.events,\n mouseMoveStatus = container.interactivity.status === _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.mouseMoveEvent,\n hoverEnabled = events.onHover.enable,\n hoverMode = events.onHover.mode,\n divs = events.onDiv;\n if (mouseMoveStatus && hoverEnabled && (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isInArray)(bounceMode, hoverMode)) {\n const {\n mouseBounce\n } = await __webpack_require__.e(/*! import() */ \"dist_browser_Utils_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./Utils.js */ \"./dist/browser/Utils.js\"));\n mouseBounce(this.container, p => this.isEnabled(p));\n } else {\n const {\n divBounce\n } = await __webpack_require__.e(/*! import() */ \"dist_browser_Utils_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./Utils.js */ \"./dist/browser/Utils.js\"));\n divBounce(this.container, divs, bounceMode, p => this.isEnabled(p));\n }\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 return !!mouse.position && events.onHover.enable && (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isInArray)(bounceMode, events.onHover.mode) || (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isDivModeEnabled)(bounceMode, divs);\n }\n loadModeOptions(options, ...sources) {\n if (!options.bounce) {\n options.bounce = new _Options_Classes_Bounce_js__WEBPACK_IMPORTED_MODULE_1__.Bounce();\n }\n for (const source of sources) {\n options.bounce.load(source?.bounce);\n }\n }\n reset() {}\n}\n\n//# sourceURL=webpack://@tsparticles/interaction-external-bounce/./dist/browser/Bouncer.js?");
27
+
28
+ /***/ })
29
+
30
+ }]);
@@ -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.1
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_bounce"] = this["webpackChunk_tsparticles_interaction_external_bounce"] || []).push([["dist_browser_Utils_js"],{
19
+
20
+ /***/ "./dist/browser/Utils.js":
21
+ /*!*******************************!*\
22
+ !*** ./dist/browser/Utils.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 */ divBounce: () => (/* binding */ divBounce),\n/* harmony export */ mouseBounce: () => (/* binding */ mouseBounce)\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\nconst squareExp = 2,\n half = 0.5,\n halfPI = Math.PI * half,\n double = 2,\n toleranceFactor = 10,\n minRadius = 0;\nfunction processBounce(container, position, radius, area, enabledCb) {\n const query = container.particles.quadTree.query(area, enabledCb);\n for (const particle of query) {\n if (area instanceof _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Circle) {\n (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.circleBounce)((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.circleBounceDataFromParticle)(particle), {\n position,\n radius,\n mass: radius ** squareExp * halfPI,\n velocity: _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin,\n factor: _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin\n });\n } else if (area instanceof _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Rectangle) {\n (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.rectBounce)(particle, (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.calculateBounds)(position, radius));\n }\n }\n}\nfunction singleSelectorBounce(container, selector, div, bounceCb) {\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 radius = elem.offsetWidth * half * pxRatio,\n tolerance = toleranceFactor * pxRatio,\n area = div.type === \"circle\" ? new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Circle(pos.x, pos.y, radius + tolerance) : new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * double, elem.offsetHeight * pxRatio + tolerance * double);\n bounceCb(pos, radius, area);\n });\n}\nfunction divBounce(container, divs, bounceMode, enabledCb) {\n (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.divModeExecute)(bounceMode, divs, (selector, div) => singleSelectorBounce(container, selector, div, (pos, radius, area) => processBounce(container, pos, radius, area, enabledCb)));\n}\nfunction mouseBounce(container, enabledCb) {\n const pxRatio = container.retina.pixelRatio,\n tolerance = toleranceFactor * pxRatio,\n mousePos = container.interactivity.mouse.position,\n radius = container.retina.bounceModeDistance;\n if (!radius || radius < minRadius || !mousePos) {\n return;\n }\n processBounce(container, mousePos, radius, new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Circle(mousePos.x, mousePos.y, radius + tolerance), enabledCb);\n}\n\n//# sourceURL=webpack://@tsparticles/interaction-external-bounce/./dist/browser/Utils.js?");
27
+
28
+ /***/ })
29
+
30
+ }]);
package/esm/Bouncer.js CHANGED
@@ -1,48 +1,9 @@
1
- import { Circle, ExternalInteractorBase, Rectangle, Vector, calculateBounds, circleBounce, circleBounceDataFromParticle, divModeExecute, isDivModeEnabled, isInArray, mouseMoveEvent, rectBounce, } from "@tsparticles/engine";
1
+ import { ExternalInteractorBase, isDivModeEnabled, isInArray, mouseMoveEvent, } from "@tsparticles/engine";
2
2
  import { Bounce } from "./Options/Classes/Bounce.js";
3
- const bounceMode = "bounce", squareExp = 2, double = 2, half = 0.5, halfPI = Math.PI * half, toleranceFactor = 10, minRadius = 0;
3
+ const bounceMode = "bounce";
4
4
  export class Bouncer extends ExternalInteractorBase {
5
5
  constructor(container) {
6
6
  super(container);
7
- this._processBounce = (position, radius, area) => {
8
- const query = this.container.particles.quadTree.query(area, (p) => this.isEnabled(p));
9
- for (const particle of query) {
10
- if (area instanceof Circle) {
11
- circleBounce(circleBounceDataFromParticle(particle), {
12
- position,
13
- radius,
14
- mass: radius ** squareExp * halfPI,
15
- velocity: Vector.origin,
16
- factor: Vector.origin,
17
- });
18
- }
19
- else if (area instanceof Rectangle) {
20
- rectBounce(particle, calculateBounds(position, radius));
21
- }
22
- }
23
- };
24
- this._processMouseBounce = () => {
25
- const container = this.container, pxRatio = container.retina.pixelRatio, tolerance = toleranceFactor * pxRatio, mousePos = container.interactivity.mouse.position, radius = container.retina.bounceModeDistance;
26
- if (!radius || radius < minRadius || !mousePos) {
27
- return;
28
- }
29
- this._processBounce(mousePos, radius, new Circle(mousePos.x, mousePos.y, radius + tolerance));
30
- };
31
- this._singleSelectorBounce = (selector, div) => {
32
- const container = this.container, query = document.querySelectorAll(selector);
33
- if (!query.length) {
34
- return;
35
- }
36
- query.forEach((item) => {
37
- const elem = item, pxRatio = container.retina.pixelRatio, pos = {
38
- x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,
39
- y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio,
40
- }, radius = elem.offsetWidth * half * pxRatio, tolerance = toleranceFactor * pxRatio, area = div.type === "circle"
41
- ? new Circle(pos.x, pos.y, radius + tolerance)
42
- : new Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * double, elem.offsetHeight * pxRatio + tolerance * double);
43
- this._processBounce(pos, radius, area);
44
- });
45
- };
46
7
  }
47
8
  clear() {
48
9
  }
@@ -56,12 +17,13 @@ export class Bouncer extends ExternalInteractorBase {
56
17
  async interact() {
57
18
  const container = this.container, options = container.actualOptions, events = options.interactivity.events, mouseMoveStatus = container.interactivity.status === mouseMoveEvent, hoverEnabled = events.onHover.enable, hoverMode = events.onHover.mode, divs = events.onDiv;
58
19
  if (mouseMoveStatus && hoverEnabled && isInArray(bounceMode, hoverMode)) {
59
- this._processMouseBounce();
20
+ const { mouseBounce } = await import("./Utils.js");
21
+ mouseBounce(this.container, (p) => this.isEnabled(p));
60
22
  }
61
23
  else {
62
- divModeExecute(bounceMode, divs, (selector, div) => this._singleSelectorBounce(selector, div));
24
+ const { divBounce } = await import("./Utils.js");
25
+ divBounce(this.container, divs, bounceMode, (p) => this.isEnabled(p));
63
26
  }
64
- await Promise.resolve();
65
27
  }
66
28
  isEnabled(particle) {
67
29
  const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = (particle?.interactivity ?? options.interactivity).events, divs = events.onDiv;
package/esm/Utils.js ADDED
@@ -0,0 +1,44 @@
1
+ import { Circle, Rectangle, Vector, calculateBounds, circleBounce, circleBounceDataFromParticle, divModeExecute, rectBounce, } from "@tsparticles/engine";
2
+ const squareExp = 2, half = 0.5, halfPI = Math.PI * half, double = 2, toleranceFactor = 10, minRadius = 0;
3
+ function processBounce(container, position, radius, area, enabledCb) {
4
+ const query = container.particles.quadTree.query(area, enabledCb);
5
+ for (const particle of query) {
6
+ if (area instanceof Circle) {
7
+ circleBounce(circleBounceDataFromParticle(particle), {
8
+ position,
9
+ radius,
10
+ mass: radius ** squareExp * halfPI,
11
+ velocity: Vector.origin,
12
+ factor: Vector.origin,
13
+ });
14
+ }
15
+ else if (area instanceof Rectangle) {
16
+ rectBounce(particle, calculateBounds(position, radius));
17
+ }
18
+ }
19
+ }
20
+ function singleSelectorBounce(container, selector, div, bounceCb) {
21
+ const query = document.querySelectorAll(selector);
22
+ if (!query.length) {
23
+ return;
24
+ }
25
+ query.forEach((item) => {
26
+ const elem = item, pxRatio = container.retina.pixelRatio, pos = {
27
+ x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,
28
+ y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio,
29
+ }, radius = elem.offsetWidth * half * pxRatio, tolerance = toleranceFactor * pxRatio, area = div.type === "circle"
30
+ ? new Circle(pos.x, pos.y, radius + tolerance)
31
+ : new Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * double, elem.offsetHeight * pxRatio + tolerance * double);
32
+ bounceCb(pos, radius, area);
33
+ });
34
+ }
35
+ export function divBounce(container, divs, bounceMode, enabledCb) {
36
+ divModeExecute(bounceMode, divs, (selector, div) => singleSelectorBounce(container, selector, div, (pos, radius, area) => processBounce(container, pos, radius, area, enabledCb)));
37
+ }
38
+ export function mouseBounce(container, enabledCb) {
39
+ const pxRatio = container.retina.pixelRatio, tolerance = toleranceFactor * pxRatio, mousePos = container.interactivity.mouse.position, radius = container.retina.bounceModeDistance;
40
+ if (!radius || radius < minRadius || !mousePos) {
41
+ return;
42
+ }
43
+ processBounce(container, mousePos, radius, new Circle(mousePos.x, mousePos.y, radius + tolerance), enabledCb);
44
+ }
package/esm/index.js CHANGED
@@ -1,6 +1,8 @@
1
- import { Bouncer } from "./Bouncer.js";
2
1
  export async function loadExternalBounceInteraction(engine, refresh = true) {
3
- await engine.addInteractor("externalBounce", (container) => new Bouncer(container), refresh);
2
+ await engine.addInteractor("externalBounce", async (container) => {
3
+ const { Bouncer } = await import("./Bouncer.js");
4
+ return new Bouncer(container);
5
+ }, refresh);
4
6
  }
5
7
  export * from "./Options/Classes/Bounce.js";
6
8
  export * from "./Options/Interfaces/IBounce.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsparticles/interaction-external-bounce",
3
- "version": "3.1.0",
3
+ "version": "3.2.1",
4
4
  "description": "tsParticles bounce 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.1.0"
90
+ "@tsparticles/engine": "^3.2.1"
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-bounce [13 Jan 2024 at 22:58]</title>
6
+ <title>@tsparticles/interaction-external-bounce [31 Jan 2024 at 09:48]</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.bounce.js","isAsset":true,"statSize":4544,"parsedSize":8532,"gzipSize":2539,"groups":[{"label":"dist/browser","path":"./dist/browser","statSize":4502,"groups":[{"id":199,"label":"index.js + 2 modules (concatenated)","path":"./dist/browser/index.js + 2 modules (concatenated)","statSize":4502,"parsedSize":8532,"gzipSize":2539,"concatenated":true,"groups":[{"label":"dist/browser","path":"./dist/browser/index.js + 2 modules (concatenated)/dist/browser","statSize":4502,"groups":[{"id":null,"label":"index.js","path":"./dist/browser/index.js + 2 modules (concatenated)/dist/browser/index.js","statSize":307,"parsedSize":581,"gzipSize":173,"inaccurateSizes":true},{"id":null,"label":"Bouncer.js","path":"./dist/browser/index.js + 2 modules (concatenated)/dist/browser/Bouncer.js","statSize":3987,"parsedSize":7555,"gzipSize":2248,"inaccurateSizes":true},{"label":"Options/Classes","path":"./dist/browser/index.js + 2 modules (concatenated)/dist/browser/Options/Classes","statSize":208,"groups":[{"id":null,"label":"Bounce.js","path":"./dist/browser/index.js + 2 modules (concatenated)/dist/browser/Options/Classes/Bounce.js","statSize":208,"parsedSize":394,"gzipSize":117,"inaccurateSizes":true}],"parsedSize":394,"gzipSize":117,"inaccurateSizes":true}],"parsedSize":8532,"gzipSize":2539,"inaccurateSizes":true}]}],"parsedSize":8532,"gzipSize":2539},{"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.bounce":true}}];
35
- window.entrypoints = ["tsparticles.interaction.external.bounce","tsparticles.interaction.external.bounce.min"];
34
+ window.chartData = [];
35
+ window.entrypoints = ["tsparticles.interaction.external.bounce.min"];
36
36
  window.defaultSizes = "parsed";
37
37
  </script>
38
38
  </body>