tsparticles 1.37.2 → 1.37.6
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/Plugins/Absorbers/AbsorberInstance.d.ts +2 -1
- package/Plugins/Absorbers/AbsorberInstance.js +21 -9
- package/Plugins/Absorbers/Options/Classes/AbsorberSize.d.ts +2 -1
- package/Plugins/Absorbers/Options/Classes/AbsorberSize.js +6 -4
- package/Plugins/Absorbers/Options/Classes/AbsorberSizeLimit.d.ts +9 -0
- package/Plugins/Absorbers/Options/Classes/AbsorberSizeLimit.js +21 -0
- package/Plugins/Absorbers/Options/Interfaces/IAbsorberSize.d.ts +3 -2
- package/Plugins/Absorbers/Options/Interfaces/IAbsorberSizeLimit.d.ts +4 -0
- package/Plugins/Absorbers/Options/Interfaces/IAbsorberSizeLimit.js +2 -0
- package/README.md +68 -0
- package/Utils/EventListeners.d.ts +1 -0
- package/Utils/EventListeners.js +13 -2
- package/Utils/Utils.js +4 -7
- package/browser/Plugins/Absorbers/AbsorberInstance.d.ts +2 -1
- package/browser/Plugins/Absorbers/AbsorberInstance.js +21 -9
- package/browser/Plugins/Absorbers/Options/Classes/AbsorberSize.d.ts +2 -1
- package/browser/Plugins/Absorbers/Options/Classes/AbsorberSize.js +6 -4
- package/browser/Plugins/Absorbers/Options/Classes/AbsorberSizeLimit.d.ts +9 -0
- package/browser/Plugins/Absorbers/Options/Classes/AbsorberSizeLimit.js +17 -0
- package/browser/Plugins/Absorbers/Options/Interfaces/IAbsorberSize.d.ts +3 -2
- package/browser/Plugins/Absorbers/Options/Interfaces/IAbsorberSizeLimit.d.ts +4 -0
- package/browser/Plugins/Absorbers/Options/Interfaces/IAbsorberSizeLimit.js +1 -0
- package/browser/Utils/EventListeners.d.ts +1 -0
- package/browser/Utils/EventListeners.js +14 -3
- package/browser/Utils/Utils.js +5 -8
- package/esm/Plugins/Absorbers/AbsorberInstance.d.ts +2 -1
- package/esm/Plugins/Absorbers/AbsorberInstance.js +21 -9
- package/esm/Plugins/Absorbers/Options/Classes/AbsorberSize.d.ts +2 -1
- package/esm/Plugins/Absorbers/Options/Classes/AbsorberSize.js +6 -4
- package/esm/Plugins/Absorbers/Options/Classes/AbsorberSizeLimit.d.ts +9 -0
- package/esm/Plugins/Absorbers/Options/Classes/AbsorberSizeLimit.js +17 -0
- package/esm/Plugins/Absorbers/Options/Interfaces/IAbsorberSize.d.ts +3 -2
- package/esm/Plugins/Absorbers/Options/Interfaces/IAbsorberSizeLimit.d.ts +4 -0
- package/esm/Plugins/Absorbers/Options/Interfaces/IAbsorberSizeLimit.js +1 -0
- package/esm/Utils/EventListeners.d.ts +1 -0
- package/esm/Utils/EventListeners.js +14 -3
- package/esm/Utils/Utils.js +5 -8
- package/package.json +1 -1
- package/report.html +2 -2
- package/report.slim.html +2 -2
- package/scripts/install.js +14 -3
- package/tsparticles.js +55 -23
- package/tsparticles.min.js +2 -2
- package/tsparticles.slim.js +15 -9
- package/tsparticles.slim.min.js +2 -2
|
@@ -3,7 +3,7 @@ import { Vector } from "../../Core/Particle/Vector";
|
|
|
3
3
|
import { RotateDirection } from "../../Enums";
|
|
4
4
|
export class AbsorberInstance {
|
|
5
5
|
constructor(absorbers, container, options, position) {
|
|
6
|
-
var _a, _b, _c;
|
|
6
|
+
var _a, _b, _c, _d, _e;
|
|
7
7
|
this.absorbers = absorbers;
|
|
8
8
|
this.container = container;
|
|
9
9
|
this.initialPosition = position ? Vector.create(position.x, position.y) : undefined;
|
|
@@ -14,14 +14,23 @@ export class AbsorberInstance {
|
|
|
14
14
|
this.size = getRangeValue(options.size.value) * container.retina.pixelRatio;
|
|
15
15
|
this.mass = this.size * options.size.density * container.retina.reduceFactor;
|
|
16
16
|
const limit = options.size.limit;
|
|
17
|
-
this.limit =
|
|
17
|
+
this.limit =
|
|
18
|
+
typeof limit === "number"
|
|
19
|
+
? {
|
|
20
|
+
radius: limit * container.retina.pixelRatio * container.retina.reduceFactor,
|
|
21
|
+
mass: 0,
|
|
22
|
+
}
|
|
23
|
+
: {
|
|
24
|
+
radius: ((_a = limit === null || limit === void 0 ? void 0 : limit.radius) !== null && _a !== void 0 ? _a : 0) * container.retina.pixelRatio * container.retina.reduceFactor,
|
|
25
|
+
mass: (_b = limit === null || limit === void 0 ? void 0 : limit.mass) !== null && _b !== void 0 ? _b : 0,
|
|
26
|
+
};
|
|
18
27
|
const color = typeof options.color === "string" ? { value: options.color } : options.color;
|
|
19
|
-
this.color = (
|
|
28
|
+
this.color = (_c = colorToRgb(color)) !== null && _c !== void 0 ? _c : {
|
|
20
29
|
b: 0,
|
|
21
30
|
g: 0,
|
|
22
31
|
r: 0,
|
|
23
32
|
};
|
|
24
|
-
this.position = (
|
|
33
|
+
this.position = (_e = (_d = this.initialPosition) === null || _d === void 0 ? void 0 : _d.copy()) !== null && _e !== void 0 ? _e : this.calcPosition();
|
|
25
34
|
}
|
|
26
35
|
attract(particle) {
|
|
27
36
|
const container = this.container;
|
|
@@ -64,10 +73,12 @@ export class AbsorberInstance {
|
|
|
64
73
|
}
|
|
65
74
|
this.updateParticlePosition(particle, v);
|
|
66
75
|
}
|
|
67
|
-
if (this.limit
|
|
76
|
+
if (this.limit.radius <= 0 || this.size < this.limit.radius) {
|
|
68
77
|
this.size += sizeFactor;
|
|
69
78
|
}
|
|
70
|
-
this.mass
|
|
79
|
+
if (this.limit.mass <= 0 || this.mass < this.limit.mass) {
|
|
80
|
+
this.mass += sizeFactor * this.options.size.density * container.retina.reduceFactor;
|
|
81
|
+
}
|
|
71
82
|
}
|
|
72
83
|
else {
|
|
73
84
|
this.updateParticlePosition(particle, v);
|
|
@@ -102,9 +113,10 @@ export class AbsorberInstance {
|
|
|
102
113
|
const container = this.container;
|
|
103
114
|
const canvasSize = container.canvas.size;
|
|
104
115
|
if (particle.needsNewPosition) {
|
|
105
|
-
|
|
106
|
-
particle.position.
|
|
107
|
-
particle.
|
|
116
|
+
particle.position.x = Math.floor(Math.random() * canvasSize.width);
|
|
117
|
+
particle.position.y = Math.floor(Math.random() * canvasSize.height);
|
|
118
|
+
particle.velocity.setTo(particle.initialVelocity);
|
|
119
|
+
particle.absorberOrbit = undefined;
|
|
108
120
|
particle.needsNewPosition = false;
|
|
109
121
|
}
|
|
110
122
|
if (this.options.orbits) {
|
|
@@ -2,9 +2,10 @@ import type { IAbsorberSize } from "../Interfaces/IAbsorberSize";
|
|
|
2
2
|
import type { RecursivePartial } from "../../../../Types";
|
|
3
3
|
import type { IOptionLoader } from "../../../../Options/Interfaces/IOptionLoader";
|
|
4
4
|
import { ValueWithRandom } from "../../../../Options/Classes/ValueWithRandom";
|
|
5
|
+
import { AbsorberSizeLimit } from "./AbsorberSizeLimit";
|
|
5
6
|
export declare class AbsorberSize extends ValueWithRandom implements IAbsorberSize, IOptionLoader<IAbsorberSize> {
|
|
6
7
|
density: number;
|
|
7
|
-
limit
|
|
8
|
+
limit: AbsorberSizeLimit;
|
|
8
9
|
constructor();
|
|
9
10
|
load(data?: RecursivePartial<IAbsorberSize>): void;
|
|
10
11
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { ValueWithRandom } from "../../../../Options/Classes/ValueWithRandom";
|
|
2
|
+
import { AbsorberSizeLimit } from "./AbsorberSizeLimit";
|
|
2
3
|
export class AbsorberSize extends ValueWithRandom {
|
|
3
4
|
constructor() {
|
|
4
5
|
super();
|
|
5
6
|
this.density = 5;
|
|
6
7
|
this.random.minimumValue = 1;
|
|
7
8
|
this.value = 50;
|
|
9
|
+
this.limit = new AbsorberSizeLimit();
|
|
8
10
|
}
|
|
9
11
|
load(data) {
|
|
10
12
|
if (!data) {
|
|
@@ -14,11 +16,11 @@ export class AbsorberSize extends ValueWithRandom {
|
|
|
14
16
|
if (data.density !== undefined) {
|
|
15
17
|
this.density = data.density;
|
|
16
18
|
}
|
|
17
|
-
if (data.limit
|
|
18
|
-
this.limit = data.limit;
|
|
19
|
+
if (typeof data.limit === "number") {
|
|
20
|
+
this.limit.radius = data.limit;
|
|
19
21
|
}
|
|
20
|
-
|
|
21
|
-
this.limit
|
|
22
|
+
else {
|
|
23
|
+
this.limit.load(data.limit);
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
26
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RecursivePartial } from "../../../../Types";
|
|
2
|
+
import type { IOptionLoader } from "../../../../Options/Interfaces/IOptionLoader";
|
|
3
|
+
import type { IAbsorberSizeLimit } from "../Interfaces/IAbsorberSizeLimit";
|
|
4
|
+
export declare class AbsorberSizeLimit implements IAbsorberSizeLimit, IOptionLoader<IAbsorberSizeLimit> {
|
|
5
|
+
radius: number;
|
|
6
|
+
mass: number;
|
|
7
|
+
constructor();
|
|
8
|
+
load(data?: RecursivePartial<IAbsorberSizeLimit>): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class AbsorberSizeLimit {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.radius = 0;
|
|
4
|
+
this.mass = 0;
|
|
5
|
+
}
|
|
6
|
+
load(data) {
|
|
7
|
+
if (!data) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (data.mass !== undefined) {
|
|
11
|
+
this.mass = data.mass;
|
|
12
|
+
}
|
|
13
|
+
if (data.radius !== undefined) {
|
|
14
|
+
this.radius = data.radius;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { IValueWithRandom } from "../../../../Options/Interfaces/IValueWithRandom";
|
|
1
|
+
import type { IValueWithRandom } from "../../../../Options/Interfaces/IValueWithRandom";
|
|
2
|
+
import type { IAbsorberSizeLimit } from "./IAbsorberSizeLimit";
|
|
2
3
|
export interface IAbsorberSize extends IValueWithRandom {
|
|
3
|
-
limit?: number;
|
|
4
|
+
limit?: number | IAbsorberSizeLimit;
|
|
4
5
|
density: number;
|
|
5
6
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -12,6 +12,7 @@ export declare class EventListeners {
|
|
|
12
12
|
private readonly mouseUpHandler;
|
|
13
13
|
private readonly visibilityChangeHandler;
|
|
14
14
|
private readonly themeChangeHandler;
|
|
15
|
+
private readonly oldThemeChangeHandler;
|
|
15
16
|
private readonly resizeHandler;
|
|
16
17
|
private canPush;
|
|
17
18
|
private resizeTimeout?;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ClickMode, InteractivityDetect } from "../Enums";
|
|
2
2
|
import { Constants } from "./Constants";
|
|
3
|
-
import { itemFromArray } from "./Utils";
|
|
3
|
+
import { isSsr, itemFromArray } from "./Utils";
|
|
4
4
|
function manageListener(element, event, handler, add, options) {
|
|
5
5
|
if (add) {
|
|
6
6
|
let addOptions = { passive: true };
|
|
@@ -32,6 +32,7 @@ export class EventListeners {
|
|
|
32
32
|
this.mouseDownHandler = () => this.mouseDown();
|
|
33
33
|
this.visibilityChangeHandler = () => this.handleVisibilityChange();
|
|
34
34
|
this.themeChangeHandler = (e) => this.handleThemeChange(e);
|
|
35
|
+
this.oldThemeChangeHandler = (e) => this.handleThemeChange(e);
|
|
35
36
|
this.resizeHandler = () => this.handleWindowResize();
|
|
36
37
|
}
|
|
37
38
|
addListeners() {
|
|
@@ -57,9 +58,19 @@ export class EventListeners {
|
|
|
57
58
|
else {
|
|
58
59
|
container.interactivity.element = container.canvas.element;
|
|
59
60
|
}
|
|
60
|
-
const mediaMatch = typeof matchMedia !== "undefined" && matchMedia("(prefers-color-scheme: dark)");
|
|
61
|
+
const mediaMatch = !isSsr() && typeof matchMedia !== "undefined" && matchMedia("(prefers-color-scheme: dark)");
|
|
61
62
|
if (mediaMatch) {
|
|
62
|
-
|
|
63
|
+
if (mediaMatch.addEventListener !== undefined) {
|
|
64
|
+
manageListener(mediaMatch, "change", this.themeChangeHandler, add);
|
|
65
|
+
}
|
|
66
|
+
else if (mediaMatch.addListener !== undefined) {
|
|
67
|
+
if (add) {
|
|
68
|
+
mediaMatch.addListener(this.oldThemeChangeHandler);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
mediaMatch.removeListener(this.oldThemeChangeHandler);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
63
74
|
}
|
|
64
75
|
const interactivityEl = container.interactivity.element;
|
|
65
76
|
if (!interactivityEl) {
|
package/esm/Utils/Utils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OutModeDirection } from "../Enums";
|
|
2
|
-
import { collisionVelocity, getValue } from "./NumberUtils";
|
|
2
|
+
import { collisionVelocity, getValue, getDistances } from "./NumberUtils";
|
|
3
3
|
import { Vector } from "../Core/Particle/Vector";
|
|
4
4
|
function rectSideBounce(pSide, pOtherSide, rectSide, rectOtherSide, velocity, factor) {
|
|
5
5
|
const res = { bounced: false };
|
|
@@ -181,14 +181,11 @@ export function circleBounceDataFromParticle(p) {
|
|
|
181
181
|
};
|
|
182
182
|
}
|
|
183
183
|
export function circleBounce(p1, p2) {
|
|
184
|
-
const xVelocityDiff = p1.velocity.
|
|
185
|
-
const
|
|
186
|
-
const
|
|
187
|
-
const pos2 = p2.position;
|
|
188
|
-
const xDist = pos2.x - pos1.x;
|
|
189
|
-
const yDist = pos2.y - pos1.y;
|
|
184
|
+
const { x: xVelocityDiff, y: yVelocityDiff } = p1.velocity.sub(p2.velocity);
|
|
185
|
+
const [pos1, pos2] = [p1.position, p2.position];
|
|
186
|
+
const { dx: xDist, dy: yDist } = getDistances(pos2, pos1);
|
|
190
187
|
if (xVelocityDiff * xDist + yVelocityDiff * yDist >= 0) {
|
|
191
|
-
const angle = -Math.atan2(
|
|
188
|
+
const angle = -Math.atan2(yDist, xDist);
|
|
192
189
|
const m1 = p1.mass;
|
|
193
190
|
const m2 = p2.mass;
|
|
194
191
|
const u1 = p1.velocity.rotate(angle);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tsparticles",
|
|
3
|
-
"version": "1.37.
|
|
3
|
+
"version": "1.37.6",
|
|
4
4
|
"description": "Easily create highly customizable particle animations and use them as animated backgrounds for your website. Ready to use components available also for React, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Riot.js, Inferno.",
|
|
5
5
|
"homepage": "https://particles.js.org/",
|
|
6
6
|
"scripts": {
|