@tsparticles/engine 3.3.0 → 3.5.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/README.md +0 -4
- package/browser/Core/Canvas.js +27 -22
- package/browser/Core/Container.js +57 -44
- package/browser/Core/Engine.js +82 -74
- package/browser/Core/Particle.js +29 -15
- package/browser/Core/Particles.js +23 -24
- package/browser/Core/Utils/EventListeners.js +18 -17
- package/browser/Core/Utils/ExternalInteractorBase.js +2 -1
- package/browser/Core/Utils/InteractionManager.js +3 -2
- package/browser/Core/Utils/ParticlesInteractorBase.js +2 -1
- package/browser/Core/Utils/QuadTree.js +1 -1
- package/browser/Core/Utils/Ranges.js +5 -4
- package/browser/Enums/AnimationStatus.js +5 -1
- package/browser/Enums/Directions/MoveDirection.js +14 -1
- package/browser/Enums/Directions/OutModeDirection.js +7 -1
- package/browser/Enums/Directions/RotateDirection.js +6 -1
- package/browser/Enums/InteractivityDetect.js +6 -1
- package/browser/Enums/Modes/AnimationMode.js +7 -1
- package/browser/Enums/Modes/CollisionMode.js +6 -1
- package/browser/Enums/Modes/LimitMode.js +5 -1
- package/browser/Enums/Modes/OutMode.js +8 -1
- package/browser/Enums/Modes/PixelMode.js +5 -1
- package/browser/Enums/Modes/ResponsiveMode.js +5 -1
- package/browser/Enums/Modes/ThemeMode.js +6 -1
- package/browser/Enums/Types/AlterType.js +5 -1
- package/browser/Enums/Types/DestroyType.js +6 -1
- package/browser/Enums/Types/DivType.js +5 -1
- package/browser/Enums/Types/EasingType.js +30 -1
- package/browser/Enums/Types/EventType.js +15 -1
- package/browser/Enums/Types/GradientType.js +6 -1
- package/browser/Enums/Types/InteractorType.js +5 -1
- package/browser/Enums/Types/ParticleOutType.js +6 -1
- package/browser/Enums/Types/StartValueType.js +6 -1
- package/browser/Options/Classes/AnimationOptions.js +4 -2
- package/browser/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
- package/browser/Options/Classes/Interactivity/Events/Events.js +1 -1
- package/browser/Options/Classes/Interactivity/Interactivity.js +2 -1
- package/browser/Options/Classes/ManualParticle.js +2 -1
- package/browser/Options/Classes/Options.js +14 -12
- package/browser/Options/Classes/Particles/Collisions/Collisions.js +2 -1
- package/browser/Options/Classes/Particles/Move/Move.js +2 -1
- package/browser/Options/Classes/Particles/Move/MoveCenter.js +2 -1
- package/browser/Options/Classes/Particles/Move/OutModes.js +2 -1
- package/browser/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
- package/browser/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
- package/browser/Options/Classes/Particles/ParticlesOptions.js +1 -1
- package/browser/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
- package/browser/Options/Classes/Responsive.js +5 -4
- package/browser/Options/Classes/Theme/ThemeDefault.js +2 -1
- package/browser/Types/RangeType.js +5 -1
- package/browser/Utils/CanvasUtils.js +13 -7
- package/browser/Utils/ColorUtils.js +17 -9
- package/browser/Utils/EventDispatcher.js +1 -1
- package/browser/Utils/HslColorManager.js +11 -4
- package/browser/Utils/NumberUtils.js +28 -14
- package/browser/Utils/RgbColorManager.js +11 -4
- package/browser/Utils/Utils.js +37 -31
- package/cjs/Core/Canvas.js +27 -22
- package/cjs/Core/Container.js +57 -44
- package/cjs/Core/Engine.js +82 -74
- package/cjs/Core/Particle.js +29 -15
- package/cjs/Core/Particles.js +23 -24
- package/cjs/Core/Utils/EventListeners.js +18 -17
- package/cjs/Core/Utils/ExternalInteractorBase.js +2 -1
- package/cjs/Core/Utils/InteractionManager.js +3 -2
- package/cjs/Core/Utils/ParticlesInteractorBase.js +2 -1
- package/cjs/Core/Utils/QuadTree.js +1 -1
- package/cjs/Core/Utils/Ranges.js +5 -4
- package/cjs/Enums/AnimationStatus.js +6 -0
- package/cjs/Enums/Directions/MoveDirection.js +15 -0
- package/cjs/Enums/Directions/OutModeDirection.js +8 -0
- package/cjs/Enums/Directions/RotateDirection.js +7 -0
- package/cjs/Enums/InteractivityDetect.js +7 -0
- package/cjs/Enums/Modes/AnimationMode.js +8 -0
- package/cjs/Enums/Modes/CollisionMode.js +7 -0
- package/cjs/Enums/Modes/LimitMode.js +6 -0
- package/cjs/Enums/Modes/OutMode.js +9 -0
- package/cjs/Enums/Modes/PixelMode.js +6 -0
- package/cjs/Enums/Modes/ResponsiveMode.js +6 -0
- package/cjs/Enums/Modes/ThemeMode.js +7 -0
- package/cjs/Enums/Types/AlterType.js +6 -0
- package/cjs/Enums/Types/DestroyType.js +7 -0
- package/cjs/Enums/Types/DivType.js +6 -0
- package/cjs/Enums/Types/EasingType.js +31 -0
- package/cjs/Enums/Types/EventType.js +16 -0
- package/cjs/Enums/Types/GradientType.js +7 -0
- package/cjs/Enums/Types/InteractorType.js +6 -0
- package/cjs/Enums/Types/ParticleOutType.js +7 -0
- package/cjs/Enums/Types/StartValueType.js +7 -0
- package/cjs/Options/Classes/AnimationOptions.js +4 -2
- package/cjs/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
- package/cjs/Options/Classes/Interactivity/Events/Events.js +1 -1
- package/cjs/Options/Classes/Interactivity/Interactivity.js +2 -1
- package/cjs/Options/Classes/ManualParticle.js +2 -1
- package/cjs/Options/Classes/Options.js +14 -12
- package/cjs/Options/Classes/Particles/Collisions/Collisions.js +2 -1
- package/cjs/Options/Classes/Particles/Move/Move.js +2 -1
- package/cjs/Options/Classes/Particles/Move/MoveCenter.js +2 -1
- package/cjs/Options/Classes/Particles/Move/OutModes.js +2 -1
- package/cjs/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
- package/cjs/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
- package/cjs/Options/Classes/Particles/ParticlesOptions.js +1 -1
- package/cjs/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
- package/cjs/Options/Classes/Responsive.js +5 -4
- package/cjs/Options/Classes/Theme/ThemeDefault.js +2 -1
- package/cjs/Types/RangeType.js +6 -0
- package/cjs/Utils/CanvasUtils.js +24 -19
- package/cjs/Utils/ColorUtils.js +37 -30
- package/cjs/Utils/EventDispatcher.js +1 -1
- package/cjs/Utils/HslColorManager.js +11 -4
- package/cjs/Utils/NumberUtils.js +54 -38
- package/cjs/Utils/OptionsUtils.js +2 -3
- package/cjs/Utils/RgbColorManager.js +11 -4
- package/cjs/Utils/TypeUtils.js +6 -7
- package/cjs/Utils/Utils.js +66 -61
- package/cjs/init.js +1 -2
- package/esm/Core/Canvas.js +27 -22
- package/esm/Core/Container.js +57 -44
- package/esm/Core/Engine.js +82 -74
- package/esm/Core/Particle.js +29 -15
- package/esm/Core/Particles.js +23 -24
- package/esm/Core/Utils/EventListeners.js +18 -17
- package/esm/Core/Utils/ExternalInteractorBase.js +2 -1
- package/esm/Core/Utils/InteractionManager.js +3 -2
- package/esm/Core/Utils/ParticlesInteractorBase.js +2 -1
- package/esm/Core/Utils/QuadTree.js +1 -1
- package/esm/Core/Utils/Ranges.js +5 -4
- package/esm/Enums/AnimationStatus.js +5 -1
- package/esm/Enums/Directions/MoveDirection.js +14 -1
- package/esm/Enums/Directions/OutModeDirection.js +7 -1
- package/esm/Enums/Directions/RotateDirection.js +6 -1
- package/esm/Enums/InteractivityDetect.js +6 -1
- package/esm/Enums/Modes/AnimationMode.js +7 -1
- package/esm/Enums/Modes/CollisionMode.js +6 -1
- package/esm/Enums/Modes/LimitMode.js +5 -1
- package/esm/Enums/Modes/OutMode.js +8 -1
- package/esm/Enums/Modes/PixelMode.js +5 -1
- package/esm/Enums/Modes/ResponsiveMode.js +5 -1
- package/esm/Enums/Modes/ThemeMode.js +6 -1
- package/esm/Enums/Types/AlterType.js +5 -1
- package/esm/Enums/Types/DestroyType.js +6 -1
- package/esm/Enums/Types/DivType.js +5 -1
- package/esm/Enums/Types/EasingType.js +30 -1
- package/esm/Enums/Types/EventType.js +15 -1
- package/esm/Enums/Types/GradientType.js +6 -1
- package/esm/Enums/Types/InteractorType.js +5 -1
- package/esm/Enums/Types/ParticleOutType.js +6 -1
- package/esm/Enums/Types/StartValueType.js +6 -1
- package/esm/Options/Classes/AnimationOptions.js +4 -2
- package/esm/Options/Classes/Interactivity/Events/DivEvent.js +2 -1
- package/esm/Options/Classes/Interactivity/Events/Events.js +1 -1
- package/esm/Options/Classes/Interactivity/Interactivity.js +2 -1
- package/esm/Options/Classes/ManualParticle.js +2 -1
- package/esm/Options/Classes/Options.js +14 -12
- package/esm/Options/Classes/Particles/Collisions/Collisions.js +2 -1
- package/esm/Options/Classes/Particles/Move/Move.js +2 -1
- package/esm/Options/Classes/Particles/Move/MoveCenter.js +2 -1
- package/esm/Options/Classes/Particles/Move/OutModes.js +2 -1
- package/esm/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -1
- package/esm/Options/Classes/Particles/Opacity/OpacityAnimation.js +2 -1
- package/esm/Options/Classes/Particles/ParticlesOptions.js +1 -1
- package/esm/Options/Classes/Particles/Size/SizeAnimation.js +2 -1
- package/esm/Options/Classes/Responsive.js +5 -4
- package/esm/Options/Classes/Theme/ThemeDefault.js +2 -1
- package/esm/Types/RangeType.js +5 -1
- package/esm/Utils/CanvasUtils.js +13 -7
- package/esm/Utils/ColorUtils.js +17 -9
- package/esm/Utils/EventDispatcher.js +1 -1
- package/esm/Utils/HslColorManager.js +11 -4
- package/esm/Utils/NumberUtils.js +28 -14
- package/esm/Utils/RgbColorManager.js +11 -4
- package/esm/Utils/Utils.js +37 -31
- package/package.json +1 -1
- package/report.html +1 -1
- package/tsparticles.engine.js +327 -225
- package/tsparticles.engine.min.js +1 -1
- package/tsparticles.engine.min.js.LICENSE.txt +1 -1
- package/types/Core/Container.d.ts +4 -2
- package/types/Core/Engine.d.ts +6 -5
- package/types/Core/Interfaces/IPlugin.d.ts +3 -4
- package/types/Core/Interfaces/IShapeDrawer.d.ts +1 -0
- package/types/Core/Particle.d.ts +1 -0
- package/types/Enums/AnimationStatus.d.ts +1 -1
- package/types/Enums/Directions/MoveDirection.d.ts +1 -1
- package/types/Enums/Directions/OutModeDirection.d.ts +1 -1
- package/types/Enums/Directions/RotateDirection.d.ts +1 -1
- package/types/Enums/InteractivityDetect.d.ts +1 -1
- package/types/Enums/Modes/AnimationMode.d.ts +1 -1
- package/types/Enums/Modes/CollisionMode.d.ts +1 -1
- package/types/Enums/Modes/LimitMode.d.ts +1 -1
- package/types/Enums/Modes/OutMode.d.ts +1 -1
- package/types/Enums/Modes/PixelMode.d.ts +1 -1
- package/types/Enums/Modes/ResponsiveMode.d.ts +1 -1
- package/types/Enums/Modes/ThemeMode.d.ts +1 -1
- package/types/Enums/Types/AlterType.d.ts +1 -1
- package/types/Enums/Types/DestroyType.d.ts +1 -1
- package/types/Enums/Types/DivType.d.ts +1 -1
- package/types/Enums/Types/EasingType.d.ts +1 -1
- package/types/Enums/Types/EventType.d.ts +1 -1
- package/types/Enums/Types/GradientType.d.ts +1 -1
- package/types/Enums/Types/InteractorType.d.ts +1 -1
- package/types/Enums/Types/ParticleOutType.d.ts +1 -1
- package/types/Enums/Types/StartValueType.d.ts +1 -1
- package/types/Options/Classes/Options.d.ts +2 -1
- package/types/Options/Classes/Responsive.d.ts +2 -2
- package/types/Options/Classes/Theme/Theme.d.ts +2 -2
- package/types/Options/Interfaces/IResponsive.d.ts +2 -3
- package/types/Options/Interfaces/Theme/ITheme.d.ts +2 -3
- package/types/Types/RangeType.d.ts +1 -1
- package/types/Utils/NumberUtils.d.ts +3 -0
- package/umd/Core/Canvas.js +27 -22
- package/umd/Core/Container.js +58 -45
- package/umd/Core/Engine.js +83 -99
- package/umd/Core/Particle.js +30 -16
- package/umd/Core/Particles.js +24 -25
- package/umd/Core/Utils/EventListeners.js +19 -18
- package/umd/Core/Utils/ExternalInteractorBase.js +3 -2
- package/umd/Core/Utils/InteractionManager.js +4 -3
- package/umd/Core/Utils/ParticlesInteractorBase.js +3 -2
- package/umd/Core/Utils/QuadTree.js +1 -1
- package/umd/Core/Utils/Ranges.js +6 -5
- package/umd/Enums/AnimationStatus.js +6 -0
- package/umd/Enums/Directions/MoveDirection.js +15 -0
- package/umd/Enums/Directions/OutModeDirection.js +8 -0
- package/umd/Enums/Directions/RotateDirection.js +7 -0
- package/umd/Enums/InteractivityDetect.js +7 -0
- package/umd/Enums/Modes/AnimationMode.js +8 -0
- package/umd/Enums/Modes/CollisionMode.js +7 -0
- package/umd/Enums/Modes/LimitMode.js +6 -0
- package/umd/Enums/Modes/OutMode.js +9 -0
- package/umd/Enums/Modes/PixelMode.js +6 -0
- package/umd/Enums/Modes/ResponsiveMode.js +6 -0
- package/umd/Enums/Modes/ThemeMode.js +7 -0
- package/umd/Enums/Types/AlterType.js +6 -0
- package/umd/Enums/Types/DestroyType.js +7 -0
- package/umd/Enums/Types/DivType.js +6 -0
- package/umd/Enums/Types/EasingType.js +31 -0
- package/umd/Enums/Types/EventType.js +16 -0
- package/umd/Enums/Types/GradientType.js +7 -0
- package/umd/Enums/Types/InteractorType.js +6 -0
- package/umd/Enums/Types/ParticleOutType.js +7 -0
- package/umd/Enums/Types/StartValueType.js +7 -0
- package/umd/Options/Classes/AnimationOptions.js +5 -3
- package/umd/Options/Classes/Interactivity/Events/DivEvent.js +3 -2
- package/umd/Options/Classes/Interactivity/Events/Events.js +1 -1
- package/umd/Options/Classes/Interactivity/Interactivity.js +3 -2
- package/umd/Options/Classes/ManualParticle.js +3 -2
- package/umd/Options/Classes/Options.js +15 -13
- package/umd/Options/Classes/Particles/Collisions/Collisions.js +3 -2
- package/umd/Options/Classes/Particles/Move/Move.js +3 -2
- package/umd/Options/Classes/Particles/Move/MoveCenter.js +3 -2
- package/umd/Options/Classes/Particles/Move/OutModes.js +3 -2
- package/umd/Options/Classes/Particles/Number/ParticlesNumberLimit.js +3 -2
- package/umd/Options/Classes/Particles/Opacity/OpacityAnimation.js +3 -2
- package/umd/Options/Classes/Particles/ParticlesOptions.js +1 -1
- package/umd/Options/Classes/Particles/Size/SizeAnimation.js +3 -2
- package/umd/Options/Classes/Responsive.js +6 -5
- package/umd/Options/Classes/Theme/ThemeDefault.js +3 -2
- package/umd/Types/RangeType.js +6 -0
- package/umd/Utils/CanvasUtils.js +25 -20
- package/umd/Utils/ColorUtils.js +38 -31
- package/umd/Utils/EventDispatcher.js +1 -1
- package/umd/Utils/HslColorManager.js +11 -4
- package/umd/Utils/NumberUtils.js +55 -39
- package/umd/Utils/OptionsUtils.js +2 -3
- package/umd/Utils/RgbColorManager.js +11 -4
- package/umd/Utils/TypeUtils.js +6 -7
- package/umd/Utils/Utils.js +67 -62
- package/umd/init.js +1 -2
- package/174.min.js +0 -2
- package/174.min.js.LICENSE.txt +0 -1
- package/dist_browser_Core_Container_js.js +0 -102
package/browser/Core/Engine.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { errorPrefix, generatedAttribute } from "./Utils/Constants.js";
|
|
2
2
|
import { executeOnSingleOrMultiple, getLogger, itemFromSingleOrMultiple } from "../Utils/Utils.js";
|
|
3
|
+
import { Container } from "./Container.js";
|
|
3
4
|
import { EventDispatcher } from "../Utils/EventDispatcher.js";
|
|
5
|
+
import { EventType } from "../Enums/Types/EventType.js";
|
|
4
6
|
import { getRandom } from "../Utils/NumberUtils.js";
|
|
5
7
|
async function getItemsFromInitializer(container, map, initializers, force = false) {
|
|
6
8
|
let res = map.get(container);
|
|
7
9
|
if (!res || force) {
|
|
8
|
-
res = await Promise.all([...initializers.values()].map(
|
|
10
|
+
res = await Promise.all([...initializers.values()].map(t => t(container)));
|
|
9
11
|
map.set(container, res);
|
|
10
12
|
}
|
|
11
13
|
return res;
|
|
@@ -22,6 +24,46 @@ async function getDataFromUrl(data) {
|
|
|
22
24
|
getLogger().error(`${errorPrefix} ${response.status} while retrieving config file`);
|
|
23
25
|
return data.fallback;
|
|
24
26
|
}
|
|
27
|
+
const generatedTrue = "true", generatedFalse = "false", canvasTag = "canvas", getCanvasFromContainer = (domContainer) => {
|
|
28
|
+
let canvasEl;
|
|
29
|
+
if (domContainer instanceof HTMLCanvasElement || domContainer.tagName.toLowerCase() === canvasTag) {
|
|
30
|
+
canvasEl = domContainer;
|
|
31
|
+
if (!canvasEl.dataset[generatedAttribute]) {
|
|
32
|
+
canvasEl.dataset[generatedAttribute] = generatedFalse;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const existingCanvases = domContainer.getElementsByTagName(canvasTag);
|
|
37
|
+
if (existingCanvases.length) {
|
|
38
|
+
const firstIndex = 0;
|
|
39
|
+
canvasEl = existingCanvases[firstIndex];
|
|
40
|
+
canvasEl.dataset[generatedAttribute] = generatedFalse;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
canvasEl = document.createElement(canvasTag);
|
|
44
|
+
canvasEl.dataset[generatedAttribute] = generatedTrue;
|
|
45
|
+
domContainer.appendChild(canvasEl);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const fullPercent = "100%";
|
|
49
|
+
if (!canvasEl.style.width) {
|
|
50
|
+
canvasEl.style.width = fullPercent;
|
|
51
|
+
}
|
|
52
|
+
if (!canvasEl.style.height) {
|
|
53
|
+
canvasEl.style.height = fullPercent;
|
|
54
|
+
}
|
|
55
|
+
return canvasEl;
|
|
56
|
+
}, getDomContainer = (id, source) => {
|
|
57
|
+
let domContainer = source ?? document.getElementById(id);
|
|
58
|
+
if (domContainer) {
|
|
59
|
+
return domContainer;
|
|
60
|
+
}
|
|
61
|
+
domContainer = document.createElement("div");
|
|
62
|
+
domContainer.id = id;
|
|
63
|
+
domContainer.dataset[generatedAttribute] = generatedTrue;
|
|
64
|
+
document.body.append(domContainer);
|
|
65
|
+
return domContainer;
|
|
66
|
+
};
|
|
25
67
|
export class Engine {
|
|
26
68
|
constructor() {
|
|
27
69
|
this._configs = new Map();
|
|
@@ -49,16 +91,19 @@ export class Engine {
|
|
|
49
91
|
}
|
|
50
92
|
return res;
|
|
51
93
|
}
|
|
94
|
+
get items() {
|
|
95
|
+
return this._domArray;
|
|
96
|
+
}
|
|
52
97
|
get version() {
|
|
53
|
-
return "3.
|
|
98
|
+
return "3.5.0";
|
|
54
99
|
}
|
|
55
100
|
addConfig(config) {
|
|
56
101
|
const key = config.key ?? config.name ?? "default";
|
|
57
102
|
this._configs.set(key, config);
|
|
58
|
-
this._eventDispatcher.dispatchEvent(
|
|
103
|
+
this._eventDispatcher.dispatchEvent(EventType.configAdded, { data: { name: key, config } });
|
|
59
104
|
}
|
|
60
105
|
async addEffect(effect, drawer, refresh = true) {
|
|
61
|
-
executeOnSingleOrMultiple(effect,
|
|
106
|
+
executeOnSingleOrMultiple(effect, type => {
|
|
62
107
|
if (!this.getEffectDrawer(type)) {
|
|
63
108
|
this.effectDrawers.set(type, drawer);
|
|
64
109
|
}
|
|
@@ -98,12 +143,13 @@ export class Engine {
|
|
|
98
143
|
}
|
|
99
144
|
await this.refresh(refresh);
|
|
100
145
|
}
|
|
101
|
-
async addShape(
|
|
102
|
-
|
|
103
|
-
if (
|
|
104
|
-
|
|
146
|
+
async addShape(drawer, refresh = true) {
|
|
147
|
+
for (const validType of drawer.validTypes) {
|
|
148
|
+
if (this.getShapeDrawer(validType)) {
|
|
149
|
+
continue;
|
|
105
150
|
}
|
|
106
|
-
|
|
151
|
+
this.shapeDrawers.set(validType, drawer);
|
|
152
|
+
}
|
|
107
153
|
await this.refresh(refresh);
|
|
108
154
|
}
|
|
109
155
|
clearPlugins(container) {
|
|
@@ -115,16 +161,10 @@ export class Engine {
|
|
|
115
161
|
this._eventDispatcher.dispatchEvent(type, args);
|
|
116
162
|
}
|
|
117
163
|
dom() {
|
|
118
|
-
return this.
|
|
164
|
+
return this.items;
|
|
119
165
|
}
|
|
120
166
|
domItem(index) {
|
|
121
|
-
|
|
122
|
-
if (!item || item.destroyed) {
|
|
123
|
-
const deleteCount = 1;
|
|
124
|
-
dom.splice(index, deleteCount);
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
return item;
|
|
167
|
+
return this.item(index);
|
|
128
168
|
}
|
|
129
169
|
async getAvailablePlugins(container) {
|
|
130
170
|
const res = new Map();
|
|
@@ -139,16 +179,16 @@ export class Engine {
|
|
|
139
179
|
return this.effectDrawers.get(type);
|
|
140
180
|
}
|
|
141
181
|
async getInteractors(container, force = false) {
|
|
142
|
-
return
|
|
182
|
+
return getItemsFromInitializer(container, this.interactors, this._initializers.interactors, force);
|
|
143
183
|
}
|
|
144
184
|
async getMovers(container, force = false) {
|
|
145
|
-
return
|
|
185
|
+
return getItemsFromInitializer(container, this.movers, this._initializers.movers, force);
|
|
146
186
|
}
|
|
147
187
|
getPathGenerator(type) {
|
|
148
188
|
return this.pathGenerators.get(type);
|
|
149
189
|
}
|
|
150
190
|
getPlugin(plugin) {
|
|
151
|
-
return this.plugins.find(
|
|
191
|
+
return this.plugins.find(t => t.id === plugin);
|
|
152
192
|
}
|
|
153
193
|
getPreset(preset) {
|
|
154
194
|
return this.presets.get(preset);
|
|
@@ -163,7 +203,7 @@ export class Engine {
|
|
|
163
203
|
return this.shapeDrawers.keys();
|
|
164
204
|
}
|
|
165
205
|
async getUpdaters(container, force = false) {
|
|
166
|
-
return
|
|
206
|
+
return getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
|
|
167
207
|
}
|
|
168
208
|
init() {
|
|
169
209
|
if (this._initialized) {
|
|
@@ -171,89 +211,57 @@ export class Engine {
|
|
|
171
211
|
}
|
|
172
212
|
this._initialized = true;
|
|
173
213
|
}
|
|
214
|
+
item(index) {
|
|
215
|
+
const { items } = this, item = items[index];
|
|
216
|
+
if (!item || item.destroyed) {
|
|
217
|
+
const deleteCount = 1;
|
|
218
|
+
items.splice(index, deleteCount);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
return item;
|
|
222
|
+
}
|
|
174
223
|
async load(params) {
|
|
175
224
|
const randomFactor = 10000, id = params.id ?? params.element?.id ?? `tsparticles${Math.floor(getRandom() * randomFactor)}`, { index, url } = params, options = url ? await getDataFromUrl({ fallback: params.options, url, index }) : params.options;
|
|
176
|
-
|
|
177
|
-
if (!domContainer) {
|
|
178
|
-
domContainer = document.createElement("div");
|
|
179
|
-
domContainer.id = id;
|
|
180
|
-
document.body.append(domContainer);
|
|
181
|
-
}
|
|
182
|
-
const currentOptions = itemFromSingleOrMultiple(options, index), dom = this.dom(), oldIndex = dom.findIndex((v) => v.id.description === id), minIndex = 0;
|
|
225
|
+
const currentOptions = itemFromSingleOrMultiple(options, index), { items } = this, oldIndex = items.findIndex(v => v.id.description === id), minIndex = 0, newItem = new Container(this, id, currentOptions);
|
|
183
226
|
if (oldIndex >= minIndex) {
|
|
184
|
-
const old = this.
|
|
227
|
+
const old = this.item(oldIndex), one = 1, none = 0, deleteCount = old ? one : none;
|
|
185
228
|
if (old && !old.destroyed) {
|
|
186
|
-
old.destroy();
|
|
187
|
-
const deleteCount = 1;
|
|
188
|
-
dom.splice(oldIndex, deleteCount);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
let canvasEl;
|
|
192
|
-
if (domContainer.tagName.toLowerCase() === "canvas") {
|
|
193
|
-
canvasEl = domContainer;
|
|
194
|
-
canvasEl.dataset[generatedAttribute] = "false";
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
const existingCanvases = domContainer.getElementsByTagName("canvas");
|
|
198
|
-
if (existingCanvases.length) {
|
|
199
|
-
const firstIndex = 0;
|
|
200
|
-
canvasEl = existingCanvases[firstIndex];
|
|
201
|
-
canvasEl.dataset[generatedAttribute] = "false";
|
|
229
|
+
old.destroy(false);
|
|
202
230
|
}
|
|
203
|
-
|
|
204
|
-
canvasEl = document.createElement("canvas");
|
|
205
|
-
canvasEl.dataset[generatedAttribute] = "true";
|
|
206
|
-
domContainer.appendChild(canvasEl);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
if (!canvasEl.style.width) {
|
|
210
|
-
canvasEl.style.width = "100%";
|
|
211
|
-
}
|
|
212
|
-
if (!canvasEl.style.height) {
|
|
213
|
-
canvasEl.style.height = "100%";
|
|
214
|
-
}
|
|
215
|
-
const { Container } = await import("./Container.js"), newItem = new Container(this, id, currentOptions);
|
|
216
|
-
if (oldIndex >= minIndex) {
|
|
217
|
-
const deleteCount = 0;
|
|
218
|
-
dom.splice(oldIndex, deleteCount, newItem);
|
|
231
|
+
items.splice(oldIndex, deleteCount, newItem);
|
|
219
232
|
}
|
|
220
233
|
else {
|
|
221
|
-
|
|
234
|
+
items.push(newItem);
|
|
222
235
|
}
|
|
236
|
+
const domContainer = getDomContainer(id, params.element), canvasEl = getCanvasFromContainer(domContainer);
|
|
223
237
|
newItem.canvas.loadCanvas(canvasEl);
|
|
224
238
|
await newItem.start();
|
|
225
239
|
return newItem;
|
|
226
240
|
}
|
|
227
241
|
loadOptions(options, sourceOptions) {
|
|
228
|
-
|
|
229
|
-
plugin.loadOptions(options, sourceOptions);
|
|
230
|
-
}
|
|
242
|
+
this.plugins.forEach(plugin => plugin.loadOptions?.(options, sourceOptions));
|
|
231
243
|
}
|
|
232
244
|
loadParticlesOptions(container, options, ...sourceOptions) {
|
|
233
245
|
const updaters = this.updaters.get(container);
|
|
234
246
|
if (!updaters) {
|
|
235
247
|
return;
|
|
236
248
|
}
|
|
237
|
-
|
|
238
|
-
updater.loadOptions?.(options, ...sourceOptions);
|
|
239
|
-
}
|
|
249
|
+
updaters.forEach(updater => updater.loadOptions?.(options, ...sourceOptions));
|
|
240
250
|
}
|
|
241
251
|
async refresh(refresh = true) {
|
|
242
252
|
if (!refresh) {
|
|
243
253
|
return;
|
|
244
254
|
}
|
|
245
|
-
await Promise.all(this.
|
|
255
|
+
await Promise.all(this.items.map(t => t.refresh()));
|
|
246
256
|
}
|
|
247
257
|
removeEventListener(type, listener) {
|
|
248
258
|
this._eventDispatcher.removeEventListener(type, listener);
|
|
249
259
|
}
|
|
250
260
|
setOnClickHandler(callback) {
|
|
251
|
-
const
|
|
252
|
-
if (!
|
|
261
|
+
const { items } = this;
|
|
262
|
+
if (!items.length) {
|
|
253
263
|
throw new Error(`${errorPrefix} can only set click handlers after calling tsParticles.load()`);
|
|
254
264
|
}
|
|
255
|
-
|
|
256
|
-
domItem.addClickHandler(callback);
|
|
257
|
-
}
|
|
265
|
+
items.forEach(item => item.addClickHandler(callback));
|
|
258
266
|
}
|
|
259
267
|
}
|
package/browser/Core/Particle.js
CHANGED
|
@@ -3,10 +3,15 @@ import { calcExactPositionOrRandomFromSize, clamp, degToRad, getDistance, getPar
|
|
|
3
3
|
import { deepExtend, getPosition, initParticleNumericAnimationValue, isInArray, itemFromSingleOrMultiple, } from "../Utils/Utils.js";
|
|
4
4
|
import { errorPrefix, millisecondsToSeconds } from "./Utils/Constants.js";
|
|
5
5
|
import { getHslFromAnimation, rangeColorToRgb } from "../Utils/ColorUtils.js";
|
|
6
|
+
import { EventType } from "../Enums/Types/EventType.js";
|
|
6
7
|
import { Interactivity } from "../Options/Classes/Interactivity/Interactivity.js";
|
|
8
|
+
import { MoveDirection } from "../Enums/Directions/MoveDirection.js";
|
|
9
|
+
import { OutMode } from "../Enums/Modes/OutMode.js";
|
|
10
|
+
import { ParticleOutType } from "../Enums/Types/ParticleOutType.js";
|
|
11
|
+
import { PixelMode } from "../Enums/Modes/PixelMode.js";
|
|
7
12
|
import { alterHsl } from "../Utils/CanvasUtils.js";
|
|
8
13
|
import { loadParticlesOptions } from "../Utils/OptionsUtils.js";
|
|
9
|
-
const defaultRetryCount = 0, double = 2, half = 0.5, squareExp = 2;
|
|
14
|
+
const defaultRetryCount = 0, double = 2, half = 0.5, squareExp = 2, randomString = "random";
|
|
10
15
|
function loadEffectData(effect, effectOptions, id, reduceDuplicates) {
|
|
11
16
|
const effectData = effectOptions.options[effect];
|
|
12
17
|
if (!effectData) {
|
|
@@ -55,7 +60,7 @@ export class Particle {
|
|
|
55
60
|
}), pos = Vector3d.create(exactPosition.x, exactPosition.y, zIndex), radius = this.getRadius(), outModes = this.options.move.outModes, fixHorizontal = (outMode) => {
|
|
56
61
|
fixOutMode({
|
|
57
62
|
outMode,
|
|
58
|
-
checkModes: [
|
|
63
|
+
checkModes: [OutMode.bounce],
|
|
59
64
|
coord: pos.x,
|
|
60
65
|
maxCoord: container.canvas.size.width,
|
|
61
66
|
setCb: (value) => (pos.x += value),
|
|
@@ -64,7 +69,7 @@ export class Particle {
|
|
|
64
69
|
}, fixVertical = (outMode) => {
|
|
65
70
|
fixOutMode({
|
|
66
71
|
outMode,
|
|
67
|
-
checkModes: [
|
|
72
|
+
checkModes: [OutMode.bounce],
|
|
68
73
|
coord: pos.y,
|
|
69
74
|
maxCoord: container.canvas.size.height,
|
|
70
75
|
setCb: (value) => (pos.y += value),
|
|
@@ -83,7 +88,7 @@ export class Particle {
|
|
|
83
88
|
};
|
|
84
89
|
this._calculateVelocity = () => {
|
|
85
90
|
const baseVelocity = getParticleBaseVelocity(this.direction), res = baseVelocity.copy(), moveOptions = this.options.move;
|
|
86
|
-
if (moveOptions.direction ===
|
|
91
|
+
if (moveOptions.direction === MoveDirection.inside || moveOptions.direction === MoveDirection.outside) {
|
|
87
92
|
return res;
|
|
88
93
|
}
|
|
89
94
|
const rad = degToRad(getRangeValue(moveOptions.angle.value)), radOffset = degToRad(getRangeValue(moveOptions.angle.offset)), range = {
|
|
@@ -111,9 +116,9 @@ export class Particle {
|
|
|
111
116
|
if (retries >= minRetries && tryCount > retries) {
|
|
112
117
|
throw new Error(`${errorPrefix} particle is overlapping and can't be placed`);
|
|
113
118
|
}
|
|
114
|
-
return !!this.container.particles.find(
|
|
119
|
+
return !!this.container.particles.find(particle => getDistance(pos, particle.position) < radius + particle.getRadius());
|
|
115
120
|
};
|
|
116
|
-
this._getRollColor =
|
|
121
|
+
this._getRollColor = color => {
|
|
117
122
|
if (!color || !this.roll || (!this.backColor && !this.roll.alter)) {
|
|
118
123
|
return color;
|
|
119
124
|
}
|
|
@@ -129,7 +134,7 @@ export class Particle {
|
|
|
129
134
|
}
|
|
130
135
|
return color;
|
|
131
136
|
};
|
|
132
|
-
this._initPosition =
|
|
137
|
+
this._initPosition = position => {
|
|
133
138
|
const container = this.container, zIndexValue = getRangeValue(this.options.zIndex.value), minZ = 0;
|
|
134
139
|
this.position = this._calcPosition(container, position, clamp(zIndexValue, minZ, container.zLayers));
|
|
135
140
|
this.initialPosition = this.position.copy();
|
|
@@ -137,15 +142,15 @@ export class Particle {
|
|
|
137
142
|
this.moveCenter = {
|
|
138
143
|
...getPosition(this.options.move.center, canvasSize),
|
|
139
144
|
radius: this.options.move.center.radius ?? defaultRadius,
|
|
140
|
-
mode: this.options.move.center.mode ??
|
|
145
|
+
mode: this.options.move.center.mode ?? PixelMode.percent,
|
|
141
146
|
};
|
|
142
147
|
this.direction = getParticleDirectionAngle(this.options.move.direction, this.position, this.moveCenter);
|
|
143
148
|
switch (this.options.move.direction) {
|
|
144
|
-
case
|
|
145
|
-
this.outType =
|
|
149
|
+
case MoveDirection.inside:
|
|
150
|
+
this.outType = ParticleOutType.inside;
|
|
146
151
|
break;
|
|
147
|
-
case
|
|
148
|
-
this.outType =
|
|
152
|
+
case MoveDirection.outside:
|
|
153
|
+
this.outType = ParticleOutType.outside;
|
|
149
154
|
break;
|
|
150
155
|
}
|
|
151
156
|
this.offset = Vector.origin;
|
|
@@ -168,7 +173,7 @@ export class Particle {
|
|
|
168
173
|
updater.particleDestroyed?.(this, override);
|
|
169
174
|
}
|
|
170
175
|
pathGenerator?.reset(this);
|
|
171
|
-
this._engine.dispatchEvent(
|
|
176
|
+
this._engine.dispatchEvent(EventType.particleDestroyed, {
|
|
172
177
|
container: this.container,
|
|
173
178
|
data: {
|
|
174
179
|
particle: this,
|
|
@@ -213,14 +218,15 @@ export class Particle {
|
|
|
213
218
|
this.lastPathTime = 0;
|
|
214
219
|
this.destroyed = false;
|
|
215
220
|
this.unbreakable = false;
|
|
221
|
+
this.isRotating = false;
|
|
216
222
|
this.rotation = 0;
|
|
217
223
|
this.misplaced = false;
|
|
218
224
|
this.retina = {
|
|
219
225
|
maxDistance: {},
|
|
220
226
|
};
|
|
221
|
-
this.outType =
|
|
227
|
+
this.outType = ParticleOutType.normal;
|
|
222
228
|
this.ignoresResizeRatio = true;
|
|
223
|
-
const pxRatio = container.retina.pixelRatio, mainOptions = container.actualOptions, particlesOptions = loadParticlesOptions(this._engine, container, mainOptions.particles), effectType = particlesOptions.effect.type, shapeType = particlesOptions.shape.type
|
|
229
|
+
const pxRatio = container.retina.pixelRatio, mainOptions = container.actualOptions, particlesOptions = loadParticlesOptions(this._engine, container, mainOptions.particles), { reduceDuplicates } = particlesOptions, effectType = particlesOptions.effect.type, shapeType = particlesOptions.shape.type;
|
|
224
230
|
this.effect = itemFromSingleOrMultiple(effectType, this.id, reduceDuplicates);
|
|
225
231
|
this.shape = itemFromSingleOrMultiple(shapeType, this.id, reduceDuplicates);
|
|
226
232
|
const effectOptions = particlesOptions.effect, shapeOptions = particlesOptions.shape;
|
|
@@ -240,6 +246,14 @@ export class Particle {
|
|
|
240
246
|
}
|
|
241
247
|
}
|
|
242
248
|
}
|
|
249
|
+
if (this.effect === randomString) {
|
|
250
|
+
const availableEffects = [...this.container.effectDrawers.keys()];
|
|
251
|
+
this.effect = availableEffects[Math.floor(Math.random() * availableEffects.length)];
|
|
252
|
+
}
|
|
253
|
+
if (this.shape === randomString) {
|
|
254
|
+
const availableShapes = [...this.container.shapeDrawers.keys()];
|
|
255
|
+
this.shape = availableShapes[Math.floor(Math.random() * availableShapes.length)];
|
|
256
|
+
}
|
|
243
257
|
this.effectData = loadEffectData(this.effect, effectOptions, this.id, reduceDuplicates);
|
|
244
258
|
this.shapeData = loadShapeData(this.shape, shapeOptions, this.id, reduceDuplicates);
|
|
245
259
|
particlesOptions.load(overrideOptions);
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { getLogger, getPosition } from "../Utils/Utils.js";
|
|
2
|
+
import { EventType } from "../Enums/Types/EventType.js";
|
|
2
3
|
import { InteractionManager } from "./Utils/InteractionManager.js";
|
|
4
|
+
import { LimitMode } from "../Enums/Modes/LimitMode.js";
|
|
3
5
|
import { Particle } from "./Particle.js";
|
|
4
6
|
import { Point } from "./Utils/Point.js";
|
|
5
7
|
import { QuadTree } from "./Utils/QuadTree.js";
|
|
@@ -13,9 +15,7 @@ const qTreeRectangle = (canvasSize) => {
|
|
|
13
15
|
export class Particles {
|
|
14
16
|
constructor(engine, container) {
|
|
15
17
|
this._addToPool = (...particles) => {
|
|
16
|
-
|
|
17
|
-
this._pool.push(particle);
|
|
18
|
-
}
|
|
18
|
+
this._pool.push(...particles);
|
|
19
19
|
};
|
|
20
20
|
this._applyDensity = (options, manualCount, group) => {
|
|
21
21
|
const numberOptions = options.number;
|
|
@@ -28,7 +28,7 @@ export class Particles {
|
|
|
28
28
|
}
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
|
-
const densityFactor = this._initDensityFactor(numberOptions.density), optParticlesNumber = numberOptions.value, minLimit = 0, optParticlesLimit = numberOptions.limit.value > minLimit ? numberOptions.limit.value : optParticlesNumber, particlesNumber = Math.min(optParticlesNumber, optParticlesLimit) * densityFactor + manualCount, particlesCount = Math.min(this.count, this.filter(
|
|
31
|
+
const densityFactor = this._initDensityFactor(numberOptions.density), optParticlesNumber = numberOptions.value, minLimit = 0, optParticlesLimit = numberOptions.limit.value > minLimit ? numberOptions.limit.value : optParticlesNumber, particlesNumber = Math.min(optParticlesNumber, optParticlesLimit) * densityFactor + manualCount, particlesCount = Math.min(this.count, this.filter(t => t.group === group).length);
|
|
32
32
|
if (group === undefined) {
|
|
33
33
|
this._limit = numberOptions.limit.value * densityFactor;
|
|
34
34
|
}
|
|
@@ -42,7 +42,7 @@ export class Particles {
|
|
|
42
42
|
this.removeQuantity(particlesCount - particlesNumber, group);
|
|
43
43
|
}
|
|
44
44
|
};
|
|
45
|
-
this._initDensityFactor =
|
|
45
|
+
this._initDensityFactor = densityOptions => {
|
|
46
46
|
const container = this._container, defaultFactor = 1;
|
|
47
47
|
if (!container.canvas.element || !densityOptions.enable) {
|
|
48
48
|
return defaultFactor;
|
|
@@ -67,7 +67,7 @@ export class Particles {
|
|
|
67
67
|
this._array.push(particle);
|
|
68
68
|
this._zArray.push(particle);
|
|
69
69
|
this._nextId++;
|
|
70
|
-
this._engine.dispatchEvent(
|
|
70
|
+
this._engine.dispatchEvent(EventType.particleAdded, {
|
|
71
71
|
container: this._container,
|
|
72
72
|
data: {
|
|
73
73
|
particle,
|
|
@@ -88,7 +88,7 @@ export class Particles {
|
|
|
88
88
|
this._array.splice(index, deleteCount);
|
|
89
89
|
this._zArray.splice(zIdx, deleteCount);
|
|
90
90
|
particle.destroy(override);
|
|
91
|
-
this._engine.dispatchEvent(
|
|
91
|
+
this._engine.dispatchEvent(EventType.particleRemoved, {
|
|
92
92
|
container: this._container,
|
|
93
93
|
data: {
|
|
94
94
|
particle,
|
|
@@ -119,23 +119,24 @@ export class Particles {
|
|
|
119
119
|
}
|
|
120
120
|
addManualParticles() {
|
|
121
121
|
const container = this._container, options = container.actualOptions;
|
|
122
|
-
|
|
123
|
-
this.addParticle(particle.position ? getPosition(particle.position, container.canvas.size) : undefined, particle.options);
|
|
124
|
-
}
|
|
122
|
+
options.manualParticles.forEach(p => this.addParticle(p.position ? getPosition(p.position, container.canvas.size) : undefined, p.options));
|
|
125
123
|
}
|
|
126
124
|
addParticle(position, overrideOptions, group, initializer) {
|
|
127
|
-
const
|
|
125
|
+
const limitMode = this._container.actualOptions.particles.number.limit.mode, limit = group === undefined ? this._limit : this._groupLimits.get(group) ?? this._limit, currentCount = this.count, minLimit = 0;
|
|
128
126
|
if (limit > minLimit) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if (currentCount >= limit) {
|
|
137
|
-
return;
|
|
127
|
+
switch (limitMode) {
|
|
128
|
+
case LimitMode.delete: {
|
|
129
|
+
const countOffset = 1, minCount = 0, countToRemove = currentCount + countOffset - limit;
|
|
130
|
+
if (countToRemove > minCount) {
|
|
131
|
+
this.removeQuantity(countToRemove);
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
138
134
|
}
|
|
135
|
+
case LimitMode.wait:
|
|
136
|
+
if (currentCount >= limit) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
break;
|
|
139
140
|
}
|
|
140
141
|
}
|
|
141
142
|
return this._pushParticle(position, overrideOptions, group, initializer);
|
|
@@ -181,9 +182,7 @@ export class Particles {
|
|
|
181
182
|
await this.initPlugins();
|
|
182
183
|
let handled = false;
|
|
183
184
|
for (const [, plugin] of container.plugins) {
|
|
184
|
-
|
|
185
|
-
handled = plugin.particlesInitialization();
|
|
186
|
-
}
|
|
185
|
+
handled = plugin.particlesInitialization?.() ?? handled;
|
|
187
186
|
if (handled) {
|
|
188
187
|
break;
|
|
189
188
|
}
|
|
@@ -298,7 +297,7 @@ export class Particles {
|
|
|
298
297
|
this._array = this.filter(checkDelete);
|
|
299
298
|
this._zArray = this._zArray.filter(checkDelete);
|
|
300
299
|
for (const particle of particlesToDelete) {
|
|
301
|
-
this._engine.dispatchEvent(
|
|
300
|
+
this._engine.dispatchEvent(EventType.particleRemoved, {
|
|
302
301
|
container: this._container,
|
|
303
302
|
data: {
|
|
304
303
|
particle,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { executeOnSingleOrMultiple, safeMatchMedia } from "../../Utils/Utils.js";
|
|
2
2
|
import { millisecondsToSeconds, mouseDownEvent, mouseLeaveEvent, mouseMoveEvent, mouseOutEvent, mouseUpEvent, resizeEvent, touchCancelEvent, touchEndEvent, touchMoveEvent, touchStartEvent, visibilityChangeEvent, } from "./Constants.js";
|
|
3
|
+
import { InteractivityDetect } from "../../Enums/InteractivityDetect.js";
|
|
3
4
|
import { isBoolean } from "../../Utils/TypeUtils.js";
|
|
4
5
|
const double = 2;
|
|
5
6
|
function manageListener(element, event, handler, add, options) {
|
|
@@ -21,7 +22,7 @@ function manageListener(element, event, handler, add, options) {
|
|
|
21
22
|
export class EventListeners {
|
|
22
23
|
constructor(container) {
|
|
23
24
|
this.container = container;
|
|
24
|
-
this._doMouseTouchClick =
|
|
25
|
+
this._doMouseTouchClick = e => {
|
|
25
26
|
const container = this.container, options = container.actualOptions;
|
|
26
27
|
if (this._canPush) {
|
|
27
28
|
const mouseInteractivity = container.interactivity.mouse, mousePos = mouseInteractivity.position;
|
|
@@ -31,7 +32,7 @@ export class EventListeners {
|
|
|
31
32
|
mouseInteractivity.clickPosition = { ...mousePos };
|
|
32
33
|
mouseInteractivity.clickTime = new Date().getTime();
|
|
33
34
|
const onClick = options.interactivity.events.onClick;
|
|
34
|
-
executeOnSingleOrMultiple(onClick.mode,
|
|
35
|
+
executeOnSingleOrMultiple(onClick.mode, mode => this.container.handleClickMode(mode));
|
|
35
36
|
}
|
|
36
37
|
if (e.type === "touchend") {
|
|
37
38
|
const touchDelay = 500;
|
|
@@ -39,8 +40,8 @@ export class EventListeners {
|
|
|
39
40
|
}
|
|
40
41
|
};
|
|
41
42
|
this._handleThemeChange = (e) => {
|
|
42
|
-
const mediaEvent = e, container = this.container, options = container.options, defaultThemes = options.defaultThemes, themeName = mediaEvent.matches ? defaultThemes.dark : defaultThemes.light, theme = options.themes.find(
|
|
43
|
-
if (theme
|
|
43
|
+
const mediaEvent = e, container = this.container, options = container.options, defaultThemes = options.defaultThemes, themeName = mediaEvent.matches ? defaultThemes.dark : defaultThemes.light, theme = options.themes.find(theme => theme.name === themeName);
|
|
44
|
+
if (theme?.default.auto) {
|
|
44
45
|
void container.loadTheme(themeName);
|
|
45
46
|
}
|
|
46
47
|
};
|
|
@@ -50,7 +51,7 @@ export class EventListeners {
|
|
|
50
51
|
if (!options.pauseOnBlur) {
|
|
51
52
|
return;
|
|
52
53
|
}
|
|
53
|
-
if (document
|
|
54
|
+
if (document?.hidden) {
|
|
54
55
|
container.pageHidden = true;
|
|
55
56
|
container.pause();
|
|
56
57
|
}
|
|
@@ -102,14 +103,14 @@ export class EventListeners {
|
|
|
102
103
|
manageListener(interactivityEl, mouseLeaveTmpEvent, handlers.mouseLeave, add);
|
|
103
104
|
manageListener(interactivityEl, touchCancelEvent, handlers.touchCancel, add);
|
|
104
105
|
};
|
|
105
|
-
this._manageListeners =
|
|
106
|
+
this._manageListeners = add => {
|
|
106
107
|
const handlers = this._handlers, container = this.container, options = container.actualOptions, detectType = options.interactivity.detectsOn, canvasEl = container.canvas.element;
|
|
107
108
|
let mouseLeaveTmpEvent = mouseLeaveEvent;
|
|
108
|
-
if (detectType ===
|
|
109
|
+
if (detectType === InteractivityDetect.window) {
|
|
109
110
|
container.interactivity.element = window;
|
|
110
111
|
mouseLeaveTmpEvent = mouseOutEvent;
|
|
111
112
|
}
|
|
112
|
-
else if (detectType ===
|
|
113
|
+
else if (detectType === InteractivityDetect.parent && canvasEl) {
|
|
113
114
|
container.interactivity.element = canvasEl.parentElement ?? canvasEl.parentNode;
|
|
114
115
|
}
|
|
115
116
|
else {
|
|
@@ -122,7 +123,7 @@ export class EventListeners {
|
|
|
122
123
|
manageListener(document, visibilityChangeEvent, handlers.visibilityChange, add, false);
|
|
123
124
|
}
|
|
124
125
|
};
|
|
125
|
-
this._manageMediaMatch =
|
|
126
|
+
this._manageMediaMatch = add => {
|
|
126
127
|
const handlers = this._handlers, mediaMatch = safeMatchMedia("(prefers-color-scheme: dark)");
|
|
127
128
|
if (!mediaMatch) {
|
|
128
129
|
return;
|
|
@@ -141,7 +142,7 @@ export class EventListeners {
|
|
|
141
142
|
mediaMatch.removeListener(handlers.oldThemeChange);
|
|
142
143
|
}
|
|
143
144
|
};
|
|
144
|
-
this._manageResize =
|
|
145
|
+
this._manageResize = add => {
|
|
145
146
|
const handlers = this._handlers, container = this.container, options = container.actualOptions;
|
|
146
147
|
if (!options.interactivity.events.resize) {
|
|
147
148
|
return;
|
|
@@ -160,7 +161,7 @@ export class EventListeners {
|
|
|
160
161
|
}
|
|
161
162
|
else if (!this._resizeObserver && add && canvasEl) {
|
|
162
163
|
this._resizeObserver = new ResizeObserver((entries) => {
|
|
163
|
-
const entry = entries.find(
|
|
164
|
+
const entry = entries.find(e => e.target === canvasEl);
|
|
164
165
|
if (!entry) {
|
|
165
166
|
return;
|
|
166
167
|
}
|
|
@@ -178,7 +179,7 @@ export class EventListeners {
|
|
|
178
179
|
mouse.clicking = true;
|
|
179
180
|
mouse.downPosition = mouse.position;
|
|
180
181
|
};
|
|
181
|
-
this._mouseTouchClick =
|
|
182
|
+
this._mouseTouchClick = e => {
|
|
182
183
|
const container = this.container, options = container.actualOptions, { mouse } = container.interactivity;
|
|
183
184
|
mouse.inside = true;
|
|
184
185
|
let handled = false;
|
|
@@ -213,7 +214,7 @@ export class EventListeners {
|
|
|
213
214
|
mouse.inside = false;
|
|
214
215
|
mouse.clicking = false;
|
|
215
216
|
};
|
|
216
|
-
this._mouseTouchMove =
|
|
217
|
+
this._mouseTouchMove = e => {
|
|
217
218
|
const container = this.container, options = container.actualOptions, interactivity = container.interactivity, canvasEl = container.canvas.element;
|
|
218
219
|
if (!interactivity?.element) {
|
|
219
220
|
return;
|
|
@@ -232,7 +233,7 @@ export class EventListeners {
|
|
|
232
233
|
};
|
|
233
234
|
}
|
|
234
235
|
}
|
|
235
|
-
else if (options.interactivity.detectsOn ===
|
|
236
|
+
else if (options.interactivity.detectsOn === InteractivityDetect.parent) {
|
|
236
237
|
const source = mouseEvent.target, target = mouseEvent.currentTarget;
|
|
237
238
|
if (source && target && canvasEl) {
|
|
238
239
|
const sourceRect = source.getBoundingClientRect(), targetRect = target.getBoundingClientRect(), canvasRect = canvasEl.getBoundingClientRect();
|
|
@@ -273,21 +274,21 @@ export class EventListeners {
|
|
|
273
274
|
interactivity.mouse.position = pos;
|
|
274
275
|
interactivity.status = mouseMoveEvent;
|
|
275
276
|
};
|
|
276
|
-
this._touchEnd =
|
|
277
|
+
this._touchEnd = e => {
|
|
277
278
|
const evt = e, touches = Array.from(evt.changedTouches);
|
|
278
279
|
for (const touch of touches) {
|
|
279
280
|
this._touches.delete(touch.identifier);
|
|
280
281
|
}
|
|
281
282
|
this._mouseTouchFinish();
|
|
282
283
|
};
|
|
283
|
-
this._touchEndClick =
|
|
284
|
+
this._touchEndClick = e => {
|
|
284
285
|
const evt = e, touches = Array.from(evt.changedTouches);
|
|
285
286
|
for (const touch of touches) {
|
|
286
287
|
this._touches.delete(touch.identifier);
|
|
287
288
|
}
|
|
288
289
|
this._mouseTouchClick(e);
|
|
289
290
|
};
|
|
290
|
-
this._touchStart =
|
|
291
|
+
this._touchStart = e => {
|
|
291
292
|
const evt = e, touches = Array.from(evt.changedTouches);
|
|
292
293
|
for (const touch of touches) {
|
|
293
294
|
this._touches.set(touch.identifier, performance.now());
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { InteractorType } from "../../Enums/Types/InteractorType.js";
|
|
1
2
|
export class InteractionManager {
|
|
2
3
|
constructor(engine, container) {
|
|
3
4
|
this.container = container;
|
|
@@ -24,10 +25,10 @@ export class InteractionManager {
|
|
|
24
25
|
this._particleInteractors = [];
|
|
25
26
|
for (const interactor of this._interactors) {
|
|
26
27
|
switch (interactor.type) {
|
|
27
|
-
case
|
|
28
|
+
case InteractorType.external:
|
|
28
29
|
this._externalInteractors.push(interactor);
|
|
29
30
|
break;
|
|
30
|
-
case
|
|
31
|
+
case InteractorType.particles:
|
|
31
32
|
this._particleInteractors.push(interactor);
|
|
32
33
|
break;
|
|
33
34
|
}
|