@tsparticles/interaction-external-bounce 3.0.3 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  import { Circle, ExternalInteractorBase, Rectangle, Vector, calculateBounds, circleBounce, circleBounceDataFromParticle, divModeExecute, isDivModeEnabled, isInArray, mouseMoveEvent, rectBounce, } from "@tsparticles/engine";
2
2
  import { Bounce } from "./Options/Classes/Bounce.js";
3
- const bounceMode = "bounce";
3
+ const bounceMode = "bounce", squareExp = 2, double = 2, half = 0.5, halfPI = Math.PI * half, toleranceFactor = 10, minRadius = 0;
4
4
  export class Bouncer extends ExternalInteractorBase {
5
5
  constructor(container) {
6
6
  super(container);
@@ -11,7 +11,7 @@ export class Bouncer extends ExternalInteractorBase {
11
11
  circleBounce(circleBounceDataFromParticle(particle), {
12
12
  position,
13
13
  radius,
14
- mass: (radius ** 2 * Math.PI) / 2,
14
+ mass: radius ** squareExp * halfPI,
15
15
  velocity: Vector.origin,
16
16
  factor: Vector.origin,
17
17
  });
@@ -22,8 +22,8 @@ export class Bouncer extends ExternalInteractorBase {
22
22
  }
23
23
  };
24
24
  this._processMouseBounce = () => {
25
- const container = this.container, pxRatio = container.retina.pixelRatio, tolerance = 10 * pxRatio, mousePos = container.interactivity.mouse.position, radius = container.retina.bounceModeDistance;
26
- if (!radius || radius < 0 || !mousePos) {
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
27
  return;
28
28
  }
29
29
  this._processBounce(mousePos, radius, new Circle(mousePos.x, mousePos.y, radius + tolerance));
@@ -35,11 +35,11 @@ export class Bouncer extends ExternalInteractorBase {
35
35
  }
36
36
  query.forEach((item) => {
37
37
  const elem = item, pxRatio = container.retina.pixelRatio, pos = {
38
- x: (elem.offsetLeft + elem.offsetWidth / 2) * pxRatio,
39
- y: (elem.offsetTop + elem.offsetHeight / 2) * pxRatio,
40
- }, radius = (elem.offsetWidth / 2) * pxRatio, tolerance = 10 * pxRatio, area = div.type === "circle"
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
41
  ? new Circle(pos.x, pos.y, radius + tolerance)
42
- : new Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * 2, elem.offsetHeight * pxRatio + tolerance * 2);
42
+ : new Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * double, elem.offsetHeight * pxRatio + tolerance * double);
43
43
  this._processBounce(pos, radius, area);
44
44
  });
45
45
  };
@@ -61,10 +61,11 @@ export class Bouncer extends ExternalInteractorBase {
61
61
  else {
62
62
  divModeExecute(bounceMode, divs, (selector, div) => this._singleSelectorBounce(selector, div));
63
63
  }
64
+ await Promise.resolve();
64
65
  }
65
66
  isEnabled(particle) {
66
67
  const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = (particle?.interactivity ?? options.interactivity).events, divs = events.onDiv;
67
- return ((mouse.position && events.onHover.enable && isInArray(bounceMode, events.onHover.mode)) ||
68
+ return ((!!mouse.position && events.onHover.enable && isInArray(bounceMode, events.onHover.mode)) ||
68
69
  isDivModeEnabled(bounceMode, divs));
69
70
  }
70
71
  loadModeOptions(options, ...sources) {
package/cjs/Bouncer.js CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Bouncer = void 0;
4
4
  const engine_1 = require("@tsparticles/engine");
5
5
  const Bounce_js_1 = require("./Options/Classes/Bounce.js");
6
- const bounceMode = "bounce";
6
+ const bounceMode = "bounce", squareExp = 2, double = 2, half = 0.5, halfPI = Math.PI * half, toleranceFactor = 10, minRadius = 0;
7
7
  class Bouncer extends engine_1.ExternalInteractorBase {
8
8
  constructor(container) {
9
9
  super(container);
@@ -14,7 +14,7 @@ class Bouncer extends engine_1.ExternalInteractorBase {
14
14
  (0, engine_1.circleBounce)((0, engine_1.circleBounceDataFromParticle)(particle), {
15
15
  position,
16
16
  radius,
17
- mass: (radius ** 2 * Math.PI) / 2,
17
+ mass: radius ** squareExp * halfPI,
18
18
  velocity: engine_1.Vector.origin,
19
19
  factor: engine_1.Vector.origin,
20
20
  });
@@ -25,8 +25,8 @@ class Bouncer extends engine_1.ExternalInteractorBase {
25
25
  }
26
26
  };
27
27
  this._processMouseBounce = () => {
28
- const container = this.container, pxRatio = container.retina.pixelRatio, tolerance = 10 * pxRatio, mousePos = container.interactivity.mouse.position, radius = container.retina.bounceModeDistance;
29
- if (!radius || radius < 0 || !mousePos) {
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
30
  return;
31
31
  }
32
32
  this._processBounce(mousePos, radius, new engine_1.Circle(mousePos.x, mousePos.y, radius + tolerance));
@@ -38,11 +38,11 @@ class Bouncer extends engine_1.ExternalInteractorBase {
38
38
  }
39
39
  query.forEach((item) => {
40
40
  const elem = item, pxRatio = container.retina.pixelRatio, pos = {
41
- x: (elem.offsetLeft + elem.offsetWidth / 2) * pxRatio,
42
- y: (elem.offsetTop + elem.offsetHeight / 2) * pxRatio,
43
- }, radius = (elem.offsetWidth / 2) * pxRatio, tolerance = 10 * pxRatio, area = div.type === "circle"
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
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 * 2, elem.offsetHeight * pxRatio + tolerance * 2);
45
+ : new engine_1.Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * double, elem.offsetHeight * pxRatio + tolerance * double);
46
46
  this._processBounce(pos, radius, area);
47
47
  });
48
48
  };
@@ -64,10 +64,11 @@ class Bouncer extends engine_1.ExternalInteractorBase {
64
64
  else {
65
65
  (0, engine_1.divModeExecute)(bounceMode, divs, (selector, div) => this._singleSelectorBounce(selector, div));
66
66
  }
67
+ await Promise.resolve();
67
68
  }
68
69
  isEnabled(particle) {
69
70
  const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = (particle?.interactivity ?? options.interactivity).events, divs = events.onDiv;
70
- return ((mouse.position && events.onHover.enable && (0, engine_1.isInArray)(bounceMode, events.onHover.mode)) ||
71
+ return ((!!mouse.position && events.onHover.enable && (0, engine_1.isInArray)(bounceMode, events.onHover.mode)) ||
71
72
  (0, engine_1.isDivModeEnabled)(bounceMode, divs));
72
73
  }
73
74
  loadModeOptions(options, ...sources) {
package/esm/Bouncer.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Circle, ExternalInteractorBase, Rectangle, Vector, calculateBounds, circleBounce, circleBounceDataFromParticle, divModeExecute, isDivModeEnabled, isInArray, mouseMoveEvent, rectBounce, } from "@tsparticles/engine";
2
2
  import { Bounce } from "./Options/Classes/Bounce.js";
3
- const bounceMode = "bounce";
3
+ const bounceMode = "bounce", squareExp = 2, double = 2, half = 0.5, halfPI = Math.PI * half, toleranceFactor = 10, minRadius = 0;
4
4
  export class Bouncer extends ExternalInteractorBase {
5
5
  constructor(container) {
6
6
  super(container);
@@ -11,7 +11,7 @@ export class Bouncer extends ExternalInteractorBase {
11
11
  circleBounce(circleBounceDataFromParticle(particle), {
12
12
  position,
13
13
  radius,
14
- mass: (radius ** 2 * Math.PI) / 2,
14
+ mass: radius ** squareExp * halfPI,
15
15
  velocity: Vector.origin,
16
16
  factor: Vector.origin,
17
17
  });
@@ -22,8 +22,8 @@ export class Bouncer extends ExternalInteractorBase {
22
22
  }
23
23
  };
24
24
  this._processMouseBounce = () => {
25
- const container = this.container, pxRatio = container.retina.pixelRatio, tolerance = 10 * pxRatio, mousePos = container.interactivity.mouse.position, radius = container.retina.bounceModeDistance;
26
- if (!radius || radius < 0 || !mousePos) {
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
27
  return;
28
28
  }
29
29
  this._processBounce(mousePos, radius, new Circle(mousePos.x, mousePos.y, radius + tolerance));
@@ -35,11 +35,11 @@ export class Bouncer extends ExternalInteractorBase {
35
35
  }
36
36
  query.forEach((item) => {
37
37
  const elem = item, pxRatio = container.retina.pixelRatio, pos = {
38
- x: (elem.offsetLeft + elem.offsetWidth / 2) * pxRatio,
39
- y: (elem.offsetTop + elem.offsetHeight / 2) * pxRatio,
40
- }, radius = (elem.offsetWidth / 2) * pxRatio, tolerance = 10 * pxRatio, area = div.type === "circle"
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
41
  ? new Circle(pos.x, pos.y, radius + tolerance)
42
- : new Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * 2, elem.offsetHeight * pxRatio + tolerance * 2);
42
+ : new Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * double, elem.offsetHeight * pxRatio + tolerance * double);
43
43
  this._processBounce(pos, radius, area);
44
44
  });
45
45
  };
@@ -61,10 +61,11 @@ export class Bouncer extends ExternalInteractorBase {
61
61
  else {
62
62
  divModeExecute(bounceMode, divs, (selector, div) => this._singleSelectorBounce(selector, div));
63
63
  }
64
+ await Promise.resolve();
64
65
  }
65
66
  isEnabled(particle) {
66
67
  const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = (particle?.interactivity ?? options.interactivity).events, divs = events.onDiv;
67
- return ((mouse.position && events.onHover.enable && isInArray(bounceMode, events.onHover.mode)) ||
68
+ return ((!!mouse.position && events.onHover.enable && isInArray(bounceMode, events.onHover.mode)) ||
68
69
  isDivModeEnabled(bounceMode, divs));
69
70
  }
70
71
  loadModeOptions(options, ...sources) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsparticles/interaction-external-bounce",
3
- "version": "3.0.3",
3
+ "version": "3.1.0",
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.0.3"
90
+ "@tsparticles/engine": "^3.1.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-bounce [26 Dec 2023 at 19:25]</title>
6
+ <title>@tsparticles/interaction-external-bounce [13 Jan 2024 at 22:58]</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,7 +31,7 @@
31
31
  <body>
32
32
  <div id="app"></div>
33
33
  <script>
34
- window.chartData = [{"label":"tsparticles.interaction.external.bounce.js","isAsset":true,"statSize":4344,"parsedSize":8308,"gzipSize":2458,"groups":[{"label":"dist/browser","path":"./dist/browser","statSize":4302,"groups":[{"id":398,"label":"index.js + 2 modules (concatenated)","path":"./dist/browser/index.js + 2 modules (concatenated)","statSize":4302,"parsedSize":8308,"gzipSize":2458,"concatenated":true,"groups":[{"label":"dist/browser","path":"./dist/browser/index.js + 2 modules (concatenated)/dist/browser","statSize":4302,"groups":[{"id":null,"label":"index.js","path":"./dist/browser/index.js + 2 modules (concatenated)/dist/browser/index.js","statSize":307,"parsedSize":592,"gzipSize":175,"inaccurateSizes":true},{"id":null,"label":"Bouncer.js","path":"./dist/browser/index.js + 2 modules (concatenated)/dist/browser/Bouncer.js","statSize":3787,"parsedSize":7313,"gzipSize":2163,"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":401,"gzipSize":118,"inaccurateSizes":true}],"parsedSize":401,"gzipSize":118,"inaccurateSizes":true}],"parsedSize":8308,"gzipSize":2458,"inaccurateSizes":true}]}],"parsedSize":8308,"gzipSize":2458},{"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}}];
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
35
  window.entrypoints = ["tsparticles.interaction.external.bounce","tsparticles.interaction.external.bounce.min"];
36
36
  window.defaultSizes = "parsed";
37
37
  </script>
@@ -4,7 +4,7 @@
4
4
  * Demo / Generator : https://particles.js.org/
5
5
  * GitHub : https://www.github.com/matteobruni/tsparticles
6
6
  * How to use? : Check the GitHub README
7
- * v3.0.3
7
+ * v3.1.0
8
8
  */
9
9
  (function webpackUniversalModuleDefinition(root, factory) {
10
10
  if(typeof exports === 'object' && typeof module === 'object')
@@ -114,7 +114,13 @@ class Bounce {
114
114
  ;// CONCATENATED MODULE: ./dist/browser/Bouncer.js
115
115
 
116
116
 
117
- const bounceMode = "bounce";
117
+ const bounceMode = "bounce",
118
+ squareExp = 2,
119
+ Bouncer_double = 2,
120
+ half = 0.5,
121
+ halfPI = Math.PI * half,
122
+ toleranceFactor = 10,
123
+ minRadius = 0;
118
124
  class Bouncer extends engine_root_window_.ExternalInteractorBase {
119
125
  constructor(container) {
120
126
  super(container);
@@ -125,7 +131,7 @@ class Bouncer extends engine_root_window_.ExternalInteractorBase {
125
131
  (0,engine_root_window_.circleBounce)((0,engine_root_window_.circleBounceDataFromParticle)(particle), {
126
132
  position,
127
133
  radius,
128
- mass: radius ** 2 * Math.PI / 2,
134
+ mass: radius ** squareExp * halfPI,
129
135
  velocity: engine_root_window_.Vector.origin,
130
136
  factor: engine_root_window_.Vector.origin
131
137
  });
@@ -137,10 +143,10 @@ class Bouncer extends engine_root_window_.ExternalInteractorBase {
137
143
  this._processMouseBounce = () => {
138
144
  const container = this.container,
139
145
  pxRatio = container.retina.pixelRatio,
140
- tolerance = 10 * pxRatio,
146
+ tolerance = toleranceFactor * pxRatio,
141
147
  mousePos = container.interactivity.mouse.position,
142
148
  radius = container.retina.bounceModeDistance;
143
- if (!radius || radius < 0 || !mousePos) {
149
+ if (!radius || radius < minRadius || !mousePos) {
144
150
  return;
145
151
  }
146
152
  this._processBounce(mousePos, radius, new engine_root_window_.Circle(mousePos.x, mousePos.y, radius + tolerance));
@@ -155,12 +161,12 @@ class Bouncer extends engine_root_window_.ExternalInteractorBase {
155
161
  const elem = item,
156
162
  pxRatio = container.retina.pixelRatio,
157
163
  pos = {
158
- x: (elem.offsetLeft + elem.offsetWidth / 2) * pxRatio,
159
- y: (elem.offsetTop + elem.offsetHeight / 2) * pxRatio
164
+ x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,
165
+ y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio
160
166
  },
161
- radius = elem.offsetWidth / 2 * pxRatio,
162
- tolerance = 10 * pxRatio,
163
- area = div.type === "circle" ? new engine_root_window_.Circle(pos.x, pos.y, radius + tolerance) : new engine_root_window_.Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * 2, elem.offsetHeight * pxRatio + tolerance * 2);
167
+ radius = elem.offsetWidth * half * pxRatio,
168
+ tolerance = toleranceFactor * pxRatio,
169
+ area = div.type === "circle" ? new engine_root_window_.Circle(pos.x, pos.y, radius + tolerance) : new engine_root_window_.Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * Bouncer_double, elem.offsetHeight * pxRatio + tolerance * Bouncer_double);
164
170
  this._processBounce(pos, radius, area);
165
171
  });
166
172
  };
@@ -187,6 +193,7 @@ class Bouncer extends engine_root_window_.ExternalInteractorBase {
187
193
  } else {
188
194
  (0,engine_root_window_.divModeExecute)(bounceMode, divs, (selector, div) => this._singleSelectorBounce(selector, div));
189
195
  }
196
+ await Promise.resolve();
190
197
  }
191
198
  isEnabled(particle) {
192
199
  const container = this.container,
@@ -194,7 +201,7 @@ class Bouncer extends engine_root_window_.ExternalInteractorBase {
194
201
  mouse = container.interactivity.mouse,
195
202
  events = (particle?.interactivity ?? options.interactivity).events,
196
203
  divs = events.onDiv;
197
- return mouse.position && events.onHover.enable && (0,engine_root_window_.isInArray)(bounceMode, events.onHover.mode) || (0,engine_root_window_.isDivModeEnabled)(bounceMode, divs);
204
+ return !!mouse.position && events.onHover.enable && (0,engine_root_window_.isInArray)(bounceMode, events.onHover.mode) || (0,engine_root_window_.isDivModeEnabled)(bounceMode, divs);
198
205
  }
199
206
  loadModeOptions(options, ...sources) {
200
207
  if (!options.bounce) {
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see tsparticles.interaction.external.bounce.min.js.LICENSE.txt */
2
- !function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("@tsparticles/engine"));else if("function"==typeof define&&define.amd)define(["@tsparticles/engine"],t);else{var o="object"==typeof exports?t(require("@tsparticles/engine")):t(e.window);for(var n in o)("object"==typeof exports?exports:e)[n]=o[n]}}(this,(e=>(()=>{"use strict";var t={533:t=>{t.exports=e}},o={};function n(e){var i=o[e];if(void 0!==i)return i.exports;var r=o[e]={exports:{}};return t[e](r,r.exports,n),r.exports}n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};return(()=>{n.r(i),n.d(i,{Bounce:()=>t,loadExternalBounceInteraction:()=>s});var e=n(533);class t{constructor(){this.distance=200}load(e){e&&void 0!==e.distance&&(this.distance=e.distance)}}const o="bounce";class r extends e.ExternalInteractorBase{constructor(t){super(t),this._processBounce=(t,o,n)=>{const i=this.container.particles.quadTree.query(n,(e=>this.isEnabled(e)));for(const r of i)n instanceof e.Circle?(0,e.circleBounce)((0,e.circleBounceDataFromParticle)(r),{position:t,radius:o,mass:o**2*Math.PI/2,velocity:e.Vector.origin,factor:e.Vector.origin}):n instanceof e.Rectangle&&(0,e.rectBounce)(r,(0,e.calculateBounds)(t,o))},this._processMouseBounce=()=>{const t=this.container,o=10*t.retina.pixelRatio,n=t.interactivity.mouse.position,i=t.retina.bounceModeDistance;!i||i<0||!n||this._processBounce(n,i,new e.Circle(n.x,n.y,i+o))},this._singleSelectorBounce=(t,o)=>{const n=this.container,i=document.querySelectorAll(t);i.length&&i.forEach((t=>{const i=t,r=n.retina.pixelRatio,s={x:(i.offsetLeft+i.offsetWidth/2)*r,y:(i.offsetTop+i.offsetHeight/2)*r},c=i.offsetWidth/2*r,a=10*r,u="circle"===o.type?new e.Circle(s.x,s.y,c+a):new e.Rectangle(i.offsetLeft*r-a,i.offsetTop*r-a,i.offsetWidth*r+2*a,i.offsetHeight*r+2*a);this._processBounce(s,c,u)}))}}clear(){}init(){const e=this.container,t=e.actualOptions.interactivity.modes.bounce;t&&(e.retina.bounceModeDistance=t.distance*e.retina.pixelRatio)}async interact(){const t=this.container,n=t.actualOptions.interactivity.events,i=t.interactivity.status===e.mouseMoveEvent,r=n.onHover.enable,s=n.onHover.mode,c=n.onDiv;i&&r&&(0,e.isInArray)(o,s)?this._processMouseBounce():(0,e.divModeExecute)(o,c,((e,t)=>this._singleSelectorBounce(e,t)))}isEnabled(t){const n=this.container,i=n.actualOptions,r=n.interactivity.mouse,s=(t?.interactivity??i.interactivity).events,c=s.onDiv;return r.position&&s.onHover.enable&&(0,e.isInArray)(o,s.onHover.mode)||(0,e.isDivModeEnabled)(o,c)}loadModeOptions(e,...o){e.bounce||(e.bounce=new t);for(const t of o)e.bounce.load(t?.bounce)}reset(){}}async function s(e,t=!0){await e.addInteractor("externalBounce",(e=>new r(e)),t)}})(),i})()));
2
+ !function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("@tsparticles/engine"));else if("function"==typeof define&&define.amd)define(["@tsparticles/engine"],t);else{var o="object"==typeof exports?t(require("@tsparticles/engine")):t(e.window);for(var n in o)("object"==typeof exports?exports:e)[n]=o[n]}}(this,(e=>(()=>{"use strict";var t={533:t=>{t.exports=e}},o={};function n(e){var i=o[e];if(void 0!==i)return i.exports;var r=o[e]={exports:{}};return t[e](r,r.exports,n),r.exports}n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};return(()=>{n.r(i),n.d(i,{Bounce:()=>t,loadExternalBounceInteraction:()=>a});var e=n(533);class t{constructor(){this.distance=200}load(e){e&&void 0!==e.distance&&(this.distance=e.distance)}}const o="bounce",r=.5,s=Math.PI*r;class c extends e.ExternalInteractorBase{constructor(t){super(t),this._processBounce=(t,o,n)=>{const i=this.container.particles.quadTree.query(n,(e=>this.isEnabled(e)));for(const r of i)n instanceof e.Circle?(0,e.circleBounce)((0,e.circleBounceDataFromParticle)(r),{position:t,radius:o,mass:o**2*s,velocity:e.Vector.origin,factor:e.Vector.origin}):n instanceof e.Rectangle&&(0,e.rectBounce)(r,(0,e.calculateBounds)(t,o))},this._processMouseBounce=()=>{const t=this.container,o=10*t.retina.pixelRatio,n=t.interactivity.mouse.position,i=t.retina.bounceModeDistance;!i||i<0||!n||this._processBounce(n,i,new e.Circle(n.x,n.y,i+o))},this._singleSelectorBounce=(t,o)=>{const n=this.container,i=document.querySelectorAll(t);i.length&&i.forEach((t=>{const i=t,s=n.retina.pixelRatio,c={x:(i.offsetLeft+i.offsetWidth*r)*s,y:(i.offsetTop+i.offsetHeight*r)*s},a=i.offsetWidth*r*s,l=10*s,u="circle"===o.type?new e.Circle(c.x,c.y,a+l):new e.Rectangle(i.offsetLeft*s-l,i.offsetTop*s-l,i.offsetWidth*s+2*l,i.offsetHeight*s+2*l);this._processBounce(c,a,u)}))}}clear(){}init(){const e=this.container,t=e.actualOptions.interactivity.modes.bounce;t&&(e.retina.bounceModeDistance=t.distance*e.retina.pixelRatio)}async interact(){const t=this.container,n=t.actualOptions.interactivity.events,i=t.interactivity.status===e.mouseMoveEvent,r=n.onHover.enable,s=n.onHover.mode,c=n.onDiv;i&&r&&(0,e.isInArray)(o,s)?this._processMouseBounce():(0,e.divModeExecute)(o,c,((e,t)=>this._singleSelectorBounce(e,t))),await Promise.resolve()}isEnabled(t){const n=this.container,i=n.actualOptions,r=n.interactivity.mouse,s=(t?.interactivity??i.interactivity).events,c=s.onDiv;return!!r.position&&s.onHover.enable&&(0,e.isInArray)(o,s.onHover.mode)||(0,e.isDivModeEnabled)(o,c)}loadModeOptions(e,...o){e.bounce||(e.bounce=new t);for(const t of o)e.bounce.load(t?.bounce)}reset(){}}async function a(e,t=!0){await e.addInteractor("externalBounce",(e=>new c(e)),t)}})(),i})()));
@@ -1 +1 @@
1
- /*! tsParticles Bounce External Interaction v3.0.3 by Matteo Bruni */
1
+ /*! tsParticles Bounce External Interaction v3.1.0 by Matteo Bruni */
package/types/Types.d.ts CHANGED
@@ -2,12 +2,12 @@ import type { Bounce } from "./Options/Classes/Bounce.js";
2
2
  import type { BounceOptions } from "./Options/Classes/BounceOptions.js";
3
3
  import type { Container } from "@tsparticles/engine";
4
4
  import type { IBounce } from "./Options/Interfaces/IBounce.js";
5
- export type IBounceMode = {
5
+ export interface IBounceMode {
6
6
  bounce: IBounce;
7
- };
8
- export type BounceMode = {
7
+ }
8
+ export interface BounceMode {
9
9
  bounce?: Bounce;
10
- };
10
+ }
11
11
  export type BounceContainer = Container & {
12
12
  actualOptions: BounceOptions;
13
13
  retina: {
package/umd/Bouncer.js CHANGED
@@ -12,7 +12,7 @@
12
12
  exports.Bouncer = void 0;
13
13
  const engine_1 = require("@tsparticles/engine");
14
14
  const Bounce_js_1 = require("./Options/Classes/Bounce.js");
15
- const bounceMode = "bounce";
15
+ const bounceMode = "bounce", squareExp = 2, double = 2, half = 0.5, halfPI = Math.PI * half, toleranceFactor = 10, minRadius = 0;
16
16
  class Bouncer extends engine_1.ExternalInteractorBase {
17
17
  constructor(container) {
18
18
  super(container);
@@ -23,7 +23,7 @@
23
23
  (0, engine_1.circleBounce)((0, engine_1.circleBounceDataFromParticle)(particle), {
24
24
  position,
25
25
  radius,
26
- mass: (radius ** 2 * Math.PI) / 2,
26
+ mass: radius ** squareExp * halfPI,
27
27
  velocity: engine_1.Vector.origin,
28
28
  factor: engine_1.Vector.origin,
29
29
  });
@@ -34,8 +34,8 @@
34
34
  }
35
35
  };
36
36
  this._processMouseBounce = () => {
37
- const container = this.container, pxRatio = container.retina.pixelRatio, tolerance = 10 * pxRatio, mousePos = container.interactivity.mouse.position, radius = container.retina.bounceModeDistance;
38
- if (!radius || radius < 0 || !mousePos) {
37
+ const container = this.container, pxRatio = container.retina.pixelRatio, tolerance = toleranceFactor * pxRatio, mousePos = container.interactivity.mouse.position, radius = container.retina.bounceModeDistance;
38
+ if (!radius || radius < minRadius || !mousePos) {
39
39
  return;
40
40
  }
41
41
  this._processBounce(mousePos, radius, new engine_1.Circle(mousePos.x, mousePos.y, radius + tolerance));
@@ -47,11 +47,11 @@
47
47
  }
48
48
  query.forEach((item) => {
49
49
  const elem = item, pxRatio = container.retina.pixelRatio, pos = {
50
- x: (elem.offsetLeft + elem.offsetWidth / 2) * pxRatio,
51
- y: (elem.offsetTop + elem.offsetHeight / 2) * pxRatio,
52
- }, radius = (elem.offsetWidth / 2) * pxRatio, tolerance = 10 * pxRatio, area = div.type === "circle"
50
+ x: (elem.offsetLeft + elem.offsetWidth * half) * pxRatio,
51
+ y: (elem.offsetTop + elem.offsetHeight * half) * pxRatio,
52
+ }, radius = elem.offsetWidth * half * pxRatio, tolerance = toleranceFactor * pxRatio, area = div.type === "circle"
53
53
  ? new engine_1.Circle(pos.x, pos.y, radius + tolerance)
54
- : new engine_1.Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * 2, elem.offsetHeight * pxRatio + tolerance * 2);
54
+ : new engine_1.Rectangle(elem.offsetLeft * pxRatio - tolerance, elem.offsetTop * pxRatio - tolerance, elem.offsetWidth * pxRatio + tolerance * double, elem.offsetHeight * pxRatio + tolerance * double);
55
55
  this._processBounce(pos, radius, area);
56
56
  });
57
57
  };
@@ -73,10 +73,11 @@
73
73
  else {
74
74
  (0, engine_1.divModeExecute)(bounceMode, divs, (selector, div) => this._singleSelectorBounce(selector, div));
75
75
  }
76
+ await Promise.resolve();
76
77
  }
77
78
  isEnabled(particle) {
78
79
  const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = (particle?.interactivity ?? options.interactivity).events, divs = events.onDiv;
79
- return ((mouse.position && events.onHover.enable && (0, engine_1.isInArray)(bounceMode, events.onHover.mode)) ||
80
+ return ((!!mouse.position && events.onHover.enable && (0, engine_1.isInArray)(bounceMode, events.onHover.mode)) ||
80
81
  (0, engine_1.isDivModeEnabled)(bounceMode, divs));
81
82
  }
82
83
  loadModeOptions(options, ...sources) {