@tsparticles/engine 4.0.0-alpha.26 → 4.0.0-alpha.28
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/164.min.js +1 -0
- package/README.md +39 -5
- package/browser/Core/Canvas.js +7 -4
- package/browser/Core/Engine.js +8 -1
- package/browser/Core/Interfaces/IPalette.js +1 -0
- package/browser/Core/Particle.js +8 -12
- package/browser/Core/Utils/Constants.js +1 -1
- package/browser/Options/Classes/ColorAnimation.js +11 -1
- package/browser/Options/Classes/HslAnimation.js +4 -3
- package/browser/Options/Classes/Options.js +38 -1
- package/browser/Options/Classes/Particles/Effect/Effect.js +0 -5
- package/browser/Options/Classes/Particles/Fill.js +28 -0
- package/browser/Options/Classes/Particles/ParticlesOptions.js +12 -6
- package/browser/Options/Classes/Particles/Shape/Shape.js +0 -5
- package/browser/Options/Interfaces/Particles/IFill.js +1 -0
- package/browser/Utils/CanvasUtils.js +5 -5
- package/browser/Utils/ColorUtils.js +22 -19
- package/browser/Utils/Utils.js +86 -13
- package/browser/exports.js +1 -0
- package/cjs/Core/Canvas.js +7 -4
- package/cjs/Core/Engine.js +8 -1
- package/cjs/Core/Interfaces/IPalette.js +1 -0
- package/cjs/Core/Particle.js +8 -12
- package/cjs/Core/Utils/Constants.js +1 -1
- package/cjs/Options/Classes/ColorAnimation.js +11 -1
- package/cjs/Options/Classes/HslAnimation.js +4 -3
- package/cjs/Options/Classes/Options.js +38 -1
- package/cjs/Options/Classes/Particles/Effect/Effect.js +0 -5
- package/cjs/Options/Classes/Particles/Fill.js +28 -0
- package/cjs/Options/Classes/Particles/ParticlesOptions.js +12 -6
- package/cjs/Options/Classes/Particles/Shape/Shape.js +0 -5
- package/cjs/Options/Interfaces/Particles/IFill.js +1 -0
- package/cjs/Utils/CanvasUtils.js +5 -5
- package/cjs/Utils/ColorUtils.js +22 -19
- package/cjs/Utils/Utils.js +86 -13
- package/cjs/exports.js +1 -0
- package/dist_browser_Core_Container_js.js +3 -3
- package/esm/Core/Canvas.js +7 -4
- package/esm/Core/Engine.js +8 -1
- package/esm/Core/Interfaces/IPalette.js +1 -0
- package/esm/Core/Particle.js +8 -12
- package/esm/Core/Utils/Constants.js +1 -1
- package/esm/Options/Classes/ColorAnimation.js +11 -1
- package/esm/Options/Classes/HslAnimation.js +4 -3
- package/esm/Options/Classes/Options.js +38 -1
- package/esm/Options/Classes/Particles/Effect/Effect.js +0 -5
- package/esm/Options/Classes/Particles/Fill.js +28 -0
- package/esm/Options/Classes/Particles/ParticlesOptions.js +12 -6
- package/esm/Options/Classes/Particles/Shape/Shape.js +0 -5
- package/esm/Options/Interfaces/Particles/IFill.js +1 -0
- package/esm/Utils/CanvasUtils.js +5 -5
- package/esm/Utils/ColorUtils.js +22 -19
- package/esm/Utils/Utils.js +86 -13
- package/esm/exports.js +1 -0
- package/package.json +1 -1
- package/report.html +1 -1
- package/scripts/install.js +2 -18
- package/tsparticles.engine.js +30 -20
- package/tsparticles.engine.min.js +2 -2
- package/types/Core/Engine.d.ts +4 -0
- package/types/Core/Interfaces/IPalette.d.ts +7 -0
- package/types/Core/Interfaces/IParticleOpacityData.d.ts +1 -0
- package/types/Core/Interfaces/IParticleValueAnimation.d.ts +3 -3
- package/types/Core/Interfaces/IShapeValues.d.ts +0 -1
- package/types/Core/Particle.d.ts +3 -3
- package/types/Core/Utils/Constants.d.ts +1 -1
- package/types/Options/Classes/ColorAnimation.d.ts +3 -1
- package/types/Options/Classes/Options.d.ts +2 -0
- package/types/Options/Classes/Particles/Effect/Effect.d.ts +0 -1
- package/types/Options/Classes/Particles/Fill.d.ts +12 -0
- package/types/Options/Classes/Particles/ParticlesOptions.d.ts +2 -2
- package/types/Options/Classes/Particles/Shape/Shape.d.ts +0 -1
- package/types/Options/Interfaces/IColorAnimation.d.ts +2 -0
- package/types/Options/Interfaces/IOptions.d.ts +1 -0
- package/types/Options/Interfaces/Particles/Effect/IEffect.d.ts +0 -1
- package/types/Options/Interfaces/Particles/IFill.d.ts +9 -0
- package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +2 -2
- package/types/Options/Interfaces/Particles/IStroke.d.ts +2 -2
- package/types/Options/Interfaces/Particles/Shape/IShape.d.ts +0 -1
- package/types/Utils/ColorUtils.d.ts +1 -2
- package/types/Utils/Utils.d.ts +7 -0
- package/types/export-types.d.ts +2 -1
- package/types/exports.d.ts +1 -0
- package/umd/Core/Canvas.js +6 -3
- package/umd/Core/Engine.js +8 -1
- package/umd/Core/Interfaces/IPalette.js +12 -0
- package/umd/Core/Particle.js +8 -12
- package/umd/Core/Utils/Constants.js +2 -2
- package/umd/Options/Classes/ColorAnimation.js +11 -1
- package/umd/Options/Classes/HslAnimation.js +5 -4
- package/umd/Options/Classes/Options.js +38 -1
- package/umd/Options/Classes/Particles/Effect/Effect.js +0 -5
- package/umd/Options/Classes/Particles/Fill.js +42 -0
- package/umd/Options/Classes/Particles/ParticlesOptions.js +13 -7
- package/umd/Options/Classes/Particles/Shape/Shape.js +0 -5
- package/umd/Options/Interfaces/Particles/IFill.js +12 -0
- package/umd/Utils/CanvasUtils.js +5 -5
- package/umd/Utils/ColorUtils.js +21 -18
- package/umd/Utils/Utils.js +87 -13
- package/umd/exports.js +2 -1
- package/622.min.js +0 -1
package/esm/Core/Canvas.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { clear, drawParticle, drawParticlePlugin, paintBase, paintImage } from "../Utils/CanvasUtils.js";
|
|
2
2
|
import { cloneStyle, getFullScreenStyle, safeMatchMedia, safeMutationObserver } from "../Utils/Utils.js";
|
|
3
|
-
import { defaultTransformValue, defaultZoom, generatedAttribute, half, minimumSize, zIndexFactorOffset, } from "./Utils/Constants.js";
|
|
3
|
+
import { defaultCompositeValue, defaultTransformValue, defaultZoom, generatedAttribute, half, minimumSize, zIndexFactorOffset, } from "./Utils/Constants.js";
|
|
4
4
|
import { getStyleFromHsl, getStyleFromRgb, rangeColorToHsl, rangeColorToRgb } from "../Utils/ColorUtils.js";
|
|
5
5
|
const fColorIndex = 0, sColorIndex = 1;
|
|
6
6
|
function setTransformValue(factor, newFactor, key) {
|
|
@@ -163,14 +163,14 @@ export class Canvas {
|
|
|
163
163
|
if (radius <= minimumSize) {
|
|
164
164
|
return;
|
|
165
165
|
}
|
|
166
|
-
const pfColor = particle.getFillColor(), psColor = particle.getStrokeColor()
|
|
166
|
+
const pfColor = particle.getFillColor(), psColor = particle.getStrokeColor();
|
|
167
167
|
let [fColor, sColor] = this._getPluginParticleColors(particle);
|
|
168
168
|
fColor ??= pfColor;
|
|
169
169
|
sColor ??= psColor;
|
|
170
170
|
if (!fColor && !sColor) {
|
|
171
171
|
return;
|
|
172
172
|
}
|
|
173
|
-
const container = this.container, zIndexOptions = particle.options.zIndex, zIndexFactor = zIndexFactorOffset - particle.zIndexFactor, { opacity, strokeOpacity } = particle.getOpacity(), transform = this._reusableTransform, colorStyles = this._reusableColorStyles, fill = fColor ? getStyleFromHsl(fColor, container.hdr, opacity) : undefined, stroke = sColor ? getStyleFromHsl(sColor, container.hdr, strokeOpacity) : fill;
|
|
173
|
+
const container = this.container, zIndexOptions = particle.options.zIndex, zIndexFactor = zIndexFactorOffset - particle.zIndexFactor, { fillOpacity, opacity, strokeOpacity } = particle.getOpacity(), transform = this._reusableTransform, colorStyles = this._reusableColorStyles, fill = fColor ? getStyleFromHsl(fColor, container.hdr, fillOpacity * opacity) : undefined, stroke = sColor ? getStyleFromHsl(sColor, container.hdr, strokeOpacity * opacity) : fill;
|
|
174
174
|
transform.a = transform.b = transform.c = transform.d = undefined;
|
|
175
175
|
colorStyles.fill = fill;
|
|
176
176
|
colorStyles.stroke = stroke;
|
|
@@ -357,6 +357,9 @@ export class Canvas {
|
|
|
357
357
|
willReadFrequently: false,
|
|
358
358
|
};
|
|
359
359
|
this._context = this.element.getContext("2d", this._canvasSettings);
|
|
360
|
+
if (this._context) {
|
|
361
|
+
this._context.globalCompositeOperation = defaultCompositeValue;
|
|
362
|
+
}
|
|
360
363
|
this._safeMutationObserver(obs => {
|
|
361
364
|
obs.disconnect();
|
|
362
365
|
});
|
|
@@ -514,7 +517,7 @@ export class Canvas {
|
|
|
514
517
|
this._resetOriginalStyle();
|
|
515
518
|
}
|
|
516
519
|
for (const key in options.style) {
|
|
517
|
-
if (!key || !
|
|
520
|
+
if (!key || !(key in options.style)) {
|
|
518
521
|
continue;
|
|
519
522
|
}
|
|
520
523
|
const value = options.style[key];
|
package/esm/Core/Engine.js
CHANGED
|
@@ -60,6 +60,7 @@ export class Engine {
|
|
|
60
60
|
shapes: new Map(),
|
|
61
61
|
updaters: new Map(),
|
|
62
62
|
};
|
|
63
|
+
palettes = new Map();
|
|
63
64
|
plugins = [];
|
|
64
65
|
presets = new Map();
|
|
65
66
|
shapeDrawers = new Map();
|
|
@@ -83,7 +84,7 @@ export class Engine {
|
|
|
83
84
|
return this._domArray;
|
|
84
85
|
}
|
|
85
86
|
get version() {
|
|
86
|
-
return "4.0.0-alpha.
|
|
87
|
+
return "4.0.0-alpha.28";
|
|
87
88
|
}
|
|
88
89
|
addColorManager(name, manager) {
|
|
89
90
|
this.colorManagers.set(name, manager);
|
|
@@ -105,6 +106,9 @@ export class Engine {
|
|
|
105
106
|
addEventListener(type, listener) {
|
|
106
107
|
this._eventDispatcher.addEventListener(type, listener);
|
|
107
108
|
}
|
|
109
|
+
addPalette(name, palette) {
|
|
110
|
+
this.palettes.set(name, palette);
|
|
111
|
+
}
|
|
108
112
|
addParticleUpdater(name, updaterInitializer) {
|
|
109
113
|
this.initializers.updaters.set(name, updaterInitializer);
|
|
110
114
|
}
|
|
@@ -145,6 +149,9 @@ export class Engine {
|
|
|
145
149
|
getEffectDrawers(container, force = false) {
|
|
146
150
|
return getItemMapFromInitializer(container, this.effectDrawers, this.initializers.effects, force);
|
|
147
151
|
}
|
|
152
|
+
getPalette(name) {
|
|
153
|
+
return this.palettes.get(name);
|
|
154
|
+
}
|
|
148
155
|
getPlugin(plugin) {
|
|
149
156
|
return this.plugins.find(t => t.id === plugin);
|
|
150
157
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/esm/Core/Particle.js
CHANGED
|
@@ -12,14 +12,12 @@ function loadEffectData(effect, effectOptions, id, reduceDuplicates) {
|
|
|
12
12
|
const effectData = effectOptions.options[effect];
|
|
13
13
|
return deepExtend({
|
|
14
14
|
close: effectOptions.close,
|
|
15
|
-
fill: effectOptions.fill,
|
|
16
15
|
}, itemFromSingleOrMultiple(effectData, id, reduceDuplicates));
|
|
17
16
|
}
|
|
18
17
|
function loadShapeData(shape, shapeOptions, id, reduceDuplicates) {
|
|
19
18
|
const shapeData = shapeOptions.options[shape];
|
|
20
19
|
return deepExtend({
|
|
21
20
|
close: shapeOptions.close,
|
|
22
|
-
fill: shapeOptions.fill,
|
|
23
21
|
}, itemFromSingleOrMultiple(shapeData, id, reduceDuplicates));
|
|
24
22
|
}
|
|
25
23
|
function fixOutMode(data) {
|
|
@@ -38,13 +36,14 @@ export class Particle {
|
|
|
38
36
|
container;
|
|
39
37
|
backColor;
|
|
40
38
|
bubble;
|
|
41
|
-
color;
|
|
42
39
|
destroyed;
|
|
43
40
|
direction;
|
|
44
41
|
effect;
|
|
45
42
|
effectClose;
|
|
46
43
|
effectData;
|
|
47
|
-
|
|
44
|
+
fillColor;
|
|
45
|
+
fillEnabled;
|
|
46
|
+
fillOpacity;
|
|
48
47
|
group;
|
|
49
48
|
id;
|
|
50
49
|
ignoresResizeRatio;
|
|
@@ -67,7 +66,6 @@ export class Particle {
|
|
|
67
66
|
shape;
|
|
68
67
|
shapeClose;
|
|
69
68
|
shapeData;
|
|
70
|
-
shapeFill;
|
|
71
69
|
sides;
|
|
72
70
|
size;
|
|
73
71
|
slow;
|
|
@@ -79,6 +77,7 @@ export class Particle {
|
|
|
79
77
|
velocity;
|
|
80
78
|
zIndexFactor;
|
|
81
79
|
_cachedOpacityData = {
|
|
80
|
+
fillOpacity: defaultOpacity,
|
|
82
81
|
opacity: defaultOpacity,
|
|
83
82
|
strokeOpacity: defaultOpacity,
|
|
84
83
|
};
|
|
@@ -126,15 +125,16 @@ export class Particle {
|
|
|
126
125
|
return this.rotation + (this.pathRotation ? this.velocity.angle : defaultAngle);
|
|
127
126
|
}
|
|
128
127
|
getFillColor() {
|
|
129
|
-
return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.
|
|
128
|
+
return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.fillColor));
|
|
130
129
|
}
|
|
131
130
|
getMass() {
|
|
132
131
|
return this.getRadius() ** squareExp * Math.PI * half;
|
|
133
132
|
}
|
|
134
133
|
getOpacity() {
|
|
135
|
-
const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, opacity = this.bubble.opacity ?? getRangeValue(this.opacity?.value ?? defaultOpacity), strokeOpacity = this.strokeOpacity ??
|
|
134
|
+
const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, opacity = this.bubble.opacity ?? getRangeValue(this.opacity?.value ?? defaultOpacity), fillOpacity = this.fillOpacity ?? defaultOpacity, strokeOpacity = this.strokeOpacity ?? defaultOpacity;
|
|
135
|
+
this._cachedOpacityData.fillOpacity = opacity * fillOpacity * zOpacityFactor;
|
|
136
136
|
this._cachedOpacityData.opacity = opacity * zOpacityFactor;
|
|
137
|
-
this._cachedOpacityData.strokeOpacity = strokeOpacity * zOpacityFactor;
|
|
137
|
+
this._cachedOpacityData.strokeOpacity = opacity * strokeOpacity * zOpacityFactor;
|
|
138
138
|
return this._cachedOpacityData;
|
|
139
139
|
}
|
|
140
140
|
getPosition() {
|
|
@@ -172,9 +172,7 @@ export class Particle {
|
|
|
172
172
|
this.id = id;
|
|
173
173
|
this.group = group;
|
|
174
174
|
this.effectClose = true;
|
|
175
|
-
this.effectFill = true;
|
|
176
175
|
this.shapeClose = true;
|
|
177
|
-
this.shapeFill = true;
|
|
178
176
|
this.pathRotation = false;
|
|
179
177
|
this.lastPathTime = 0;
|
|
180
178
|
this.destroyed = false;
|
|
@@ -226,9 +224,7 @@ export class Particle {
|
|
|
226
224
|
if (shapeData) {
|
|
227
225
|
particlesOptions.load(shapeData.particles);
|
|
228
226
|
}
|
|
229
|
-
this.effectFill = effectData?.fill ?? particlesOptions.effect.fill;
|
|
230
227
|
this.effectClose = effectData?.close ?? particlesOptions.effect.close;
|
|
231
|
-
this.shapeFill = shapeData?.fill ?? particlesOptions.shape.fill;
|
|
232
228
|
this.shapeClose = shapeData?.close ?? particlesOptions.shape.close;
|
|
233
229
|
this.options = particlesOptions;
|
|
234
230
|
container.retina.initParticle(this);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const generatedAttribute = "generated", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
|
|
1
|
+
export const generatedAttribute = "generated", defaultCompositeValue = "source-over", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
|
|
2
2
|
x: 0,
|
|
3
3
|
y: 0,
|
|
4
4
|
z: 0,
|
|
@@ -2,9 +2,13 @@ import { AnimationOptions } from "./AnimationOptions.js";
|
|
|
2
2
|
import { isNull } from "../../Utils/TypeUtils.js";
|
|
3
3
|
import { setRangeValue } from "../../Utils/MathUtils.js";
|
|
4
4
|
export class ColorAnimation extends AnimationOptions {
|
|
5
|
+
max;
|
|
6
|
+
min;
|
|
5
7
|
offset;
|
|
6
|
-
constructor() {
|
|
8
|
+
constructor(min, max) {
|
|
7
9
|
super();
|
|
10
|
+
this.min = min;
|
|
11
|
+
this.max = max;
|
|
8
12
|
this.offset = 0;
|
|
9
13
|
this.sync = true;
|
|
10
14
|
}
|
|
@@ -13,6 +17,12 @@ export class ColorAnimation extends AnimationOptions {
|
|
|
13
17
|
if (isNull(data)) {
|
|
14
18
|
return;
|
|
15
19
|
}
|
|
20
|
+
if (data.max !== undefined) {
|
|
21
|
+
this.max = data.max;
|
|
22
|
+
}
|
|
23
|
+
if (data.min !== undefined) {
|
|
24
|
+
this.min = data.min;
|
|
25
|
+
}
|
|
16
26
|
if (data.offset !== undefined) {
|
|
17
27
|
this.offset = setRangeValue(data.offset);
|
|
18
28
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { hMax, hMin, lMax, lMin, sMax, sMin } from "../../Core/Utils/Constants.js";
|
|
1
2
|
import { ColorAnimation } from "./ColorAnimation.js";
|
|
2
3
|
import { isNull } from "../../Utils/TypeUtils.js";
|
|
3
4
|
export class HslAnimation {
|
|
4
|
-
h = new ColorAnimation();
|
|
5
|
-
l = new ColorAnimation();
|
|
6
|
-
s = new ColorAnimation();
|
|
5
|
+
h = new ColorAnimation(hMin, hMax);
|
|
6
|
+
l = new ColorAnimation(lMin, lMax);
|
|
7
|
+
s = new ColorAnimation(sMin, sMax);
|
|
7
8
|
load(data) {
|
|
8
9
|
if (isNull(data)) {
|
|
9
10
|
return;
|
|
@@ -18,6 +18,7 @@ export class Options {
|
|
|
18
18
|
hdr;
|
|
19
19
|
key;
|
|
20
20
|
name;
|
|
21
|
+
palette;
|
|
21
22
|
particles;
|
|
22
23
|
pauseOnBlur;
|
|
23
24
|
pauseOnOutsideViewport;
|
|
@@ -54,10 +55,15 @@ export class Options {
|
|
|
54
55
|
return;
|
|
55
56
|
}
|
|
56
57
|
if (data.preset !== undefined) {
|
|
57
|
-
|
|
58
|
+
this.preset = data.preset;
|
|
59
|
+
executeOnSingleOrMultiple(this.preset, preset => {
|
|
58
60
|
this._importPreset(preset);
|
|
59
61
|
});
|
|
60
62
|
}
|
|
63
|
+
if (data.palette !== undefined) {
|
|
64
|
+
this.palette = data.palette;
|
|
65
|
+
this._importPalette(this.palette);
|
|
66
|
+
}
|
|
61
67
|
if (data.autoPlay !== undefined) {
|
|
62
68
|
this.autoPlay = data.autoPlay;
|
|
63
69
|
}
|
|
@@ -114,6 +120,37 @@ export class Options {
|
|
|
114
120
|
plugin.loadOptions(this._container, this, data);
|
|
115
121
|
});
|
|
116
122
|
}
|
|
123
|
+
_importPalette = palette => {
|
|
124
|
+
const paletteData = this._engine.getPalette(palette);
|
|
125
|
+
if (!paletteData) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.load({
|
|
129
|
+
background: {
|
|
130
|
+
color: paletteData.background,
|
|
131
|
+
},
|
|
132
|
+
blend: {
|
|
133
|
+
enable: true,
|
|
134
|
+
mode: paletteData.blendMode,
|
|
135
|
+
},
|
|
136
|
+
particles: {
|
|
137
|
+
fill: {
|
|
138
|
+
color: paletteData.fill
|
|
139
|
+
? {
|
|
140
|
+
value: paletteData.colors,
|
|
141
|
+
}
|
|
142
|
+
: undefined,
|
|
143
|
+
enable: paletteData.fill,
|
|
144
|
+
},
|
|
145
|
+
stroke: !paletteData.fill
|
|
146
|
+
? paletteData.colors.map(color => ({
|
|
147
|
+
color: { value: color },
|
|
148
|
+
width: 1,
|
|
149
|
+
}))
|
|
150
|
+
: undefined,
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
};
|
|
117
154
|
_importPreset = preset => {
|
|
118
155
|
this.load(this._engine.getPreset(preset));
|
|
119
156
|
};
|
|
@@ -2,12 +2,10 @@ import { deepExtend } from "../../../../Utils/Utils.js";
|
|
|
2
2
|
import { isNull } from "../../../../Utils/TypeUtils.js";
|
|
3
3
|
export class Effect {
|
|
4
4
|
close;
|
|
5
|
-
fill;
|
|
6
5
|
options;
|
|
7
6
|
type;
|
|
8
7
|
constructor() {
|
|
9
8
|
this.close = true;
|
|
10
|
-
this.fill = true;
|
|
11
9
|
this.options = {};
|
|
12
10
|
this.type = [];
|
|
13
11
|
}
|
|
@@ -27,9 +25,6 @@ export class Effect {
|
|
|
27
25
|
if (data.close !== undefined) {
|
|
28
26
|
this.close = data.close;
|
|
29
27
|
}
|
|
30
|
-
if (data.fill !== undefined) {
|
|
31
|
-
this.fill = data.fill;
|
|
32
|
-
}
|
|
33
28
|
if (data.type !== undefined) {
|
|
34
29
|
this.type = data.type;
|
|
35
30
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AnimatableColor } from "../AnimatableColor.js";
|
|
2
|
+
import { isNull } from "../../../Utils/TypeUtils.js";
|
|
3
|
+
import { setRangeValue } from "../../../Utils/MathUtils.js";
|
|
4
|
+
export class Fill {
|
|
5
|
+
color;
|
|
6
|
+
enable;
|
|
7
|
+
opacity;
|
|
8
|
+
constructor() {
|
|
9
|
+
this.enable = true;
|
|
10
|
+
this.color = new AnimatableColor();
|
|
11
|
+
this.color.value = "#fff";
|
|
12
|
+
this.opacity = 1;
|
|
13
|
+
}
|
|
14
|
+
load(data) {
|
|
15
|
+
if (isNull(data)) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (data.color !== undefined) {
|
|
19
|
+
this.color = AnimatableColor.create(this.color, data.color);
|
|
20
|
+
}
|
|
21
|
+
if (data.enable !== undefined) {
|
|
22
|
+
this.enable = data.enable;
|
|
23
|
+
}
|
|
24
|
+
if (data.opacity !== undefined) {
|
|
25
|
+
this.opacity = setRangeValue(data.opacity);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { deepExtend, executeOnSingleOrMultiple } from "../../../Utils/Utils.js";
|
|
2
|
-
import { AnimatableColor } from "../AnimatableColor.js";
|
|
3
2
|
import { Effect } from "./Effect/Effect.js";
|
|
3
|
+
import { Fill } from "./Fill.js";
|
|
4
4
|
import { Move } from "./Move/Move.js";
|
|
5
5
|
import { Opacity } from "./Opacity/Opacity.js";
|
|
6
6
|
import { ParticlesBounce } from "./Bounce/ParticlesBounce.js";
|
|
@@ -12,8 +12,8 @@ import { ZIndex } from "./ZIndex/ZIndex.js";
|
|
|
12
12
|
import { isNull } from "../../../Utils/TypeUtils.js";
|
|
13
13
|
export class ParticlesOptions {
|
|
14
14
|
bounce;
|
|
15
|
-
color;
|
|
16
15
|
effect;
|
|
16
|
+
fill;
|
|
17
17
|
groups;
|
|
18
18
|
move;
|
|
19
19
|
number;
|
|
@@ -29,9 +29,8 @@ export class ParticlesOptions {
|
|
|
29
29
|
this._engine = engine;
|
|
30
30
|
this._container = container;
|
|
31
31
|
this.bounce = new ParticlesBounce();
|
|
32
|
-
this.color = new AnimatableColor();
|
|
33
|
-
this.color.value = "#fff";
|
|
34
32
|
this.effect = new Effect();
|
|
33
|
+
this.fill = new Fill();
|
|
35
34
|
this.groups = {};
|
|
36
35
|
this.move = new Move();
|
|
37
36
|
this.number = new ParticlesNumber();
|
|
@@ -48,7 +47,7 @@ export class ParticlesOptions {
|
|
|
48
47
|
}
|
|
49
48
|
if (data.groups !== undefined) {
|
|
50
49
|
for (const group of Object.keys(data.groups)) {
|
|
51
|
-
if (!
|
|
50
|
+
if (!(group in data.groups)) {
|
|
52
51
|
continue;
|
|
53
52
|
}
|
|
54
53
|
const item = data.groups[group];
|
|
@@ -61,7 +60,6 @@ export class ParticlesOptions {
|
|
|
61
60
|
this.reduceDuplicates = data.reduceDuplicates;
|
|
62
61
|
}
|
|
63
62
|
this.bounce.load(data.bounce);
|
|
64
|
-
this.color.load(AnimatableColor.create(this.color, data.color));
|
|
65
63
|
this.effect.load(data.effect);
|
|
66
64
|
this.move.load(data.move);
|
|
67
65
|
this.number.load(data.number);
|
|
@@ -69,6 +67,14 @@ export class ParticlesOptions {
|
|
|
69
67
|
this.shape.load(data.shape);
|
|
70
68
|
this.size.load(data.size);
|
|
71
69
|
this.zIndex.load(data.zIndex);
|
|
70
|
+
const fillToLoad = data.fill;
|
|
71
|
+
if (fillToLoad) {
|
|
72
|
+
this.fill = executeOnSingleOrMultiple(fillToLoad, t => {
|
|
73
|
+
const tmp = new Fill();
|
|
74
|
+
tmp.load(t);
|
|
75
|
+
return tmp;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
72
78
|
const strokeToLoad = data.stroke;
|
|
73
79
|
if (strokeToLoad) {
|
|
74
80
|
this.stroke = executeOnSingleOrMultiple(strokeToLoad, t => {
|
|
@@ -2,12 +2,10 @@ import { deepExtend } from "../../../../Utils/Utils.js";
|
|
|
2
2
|
import { isNull } from "../../../../Utils/TypeUtils.js";
|
|
3
3
|
export class Shape {
|
|
4
4
|
close;
|
|
5
|
-
fill;
|
|
6
5
|
options;
|
|
7
6
|
type;
|
|
8
7
|
constructor() {
|
|
9
8
|
this.close = true;
|
|
10
|
-
this.fill = true;
|
|
11
9
|
this.options = {};
|
|
12
10
|
this.type = "circle";
|
|
13
11
|
}
|
|
@@ -27,9 +25,6 @@ export class Shape {
|
|
|
27
25
|
if (data.close !== undefined) {
|
|
28
26
|
this.close = data.close;
|
|
29
27
|
}
|
|
30
|
-
if (data.fill !== undefined) {
|
|
31
|
-
this.fill = data.fill;
|
|
32
|
-
}
|
|
33
28
|
if (data.type !== undefined) {
|
|
34
29
|
this.type = data.type;
|
|
35
30
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/esm/Utils/CanvasUtils.js
CHANGED
|
@@ -24,7 +24,7 @@ export function drawParticle(data) {
|
|
|
24
24
|
if (colorStyles.fill) {
|
|
25
25
|
context.fillStyle = colorStyles.fill;
|
|
26
26
|
}
|
|
27
|
-
const strokeWidth = particle.strokeWidth ?? minStrokeWidth;
|
|
27
|
+
const fillEnabled = !!particle.fillEnabled, strokeWidth = particle.strokeWidth ?? minStrokeWidth;
|
|
28
28
|
context.lineWidth = strokeWidth;
|
|
29
29
|
if (colorStyles.stroke) {
|
|
30
30
|
context.strokeStyle = colorStyles.stroke;
|
|
@@ -37,8 +37,8 @@ export function drawParticle(data) {
|
|
|
37
37
|
opacity,
|
|
38
38
|
delta,
|
|
39
39
|
pixelRatio: container.retina.pixelRatio,
|
|
40
|
-
fill:
|
|
41
|
-
stroke: strokeWidth > minStrokeWidth
|
|
40
|
+
fill: fillEnabled,
|
|
41
|
+
stroke: strokeWidth > minStrokeWidth,
|
|
42
42
|
transformData,
|
|
43
43
|
position: { ...pos },
|
|
44
44
|
drawPosition,
|
|
@@ -79,7 +79,7 @@ export function drawShape(drawer, data) {
|
|
|
79
79
|
if (!drawer) {
|
|
80
80
|
return;
|
|
81
81
|
}
|
|
82
|
-
const { context, particle, stroke } = data;
|
|
82
|
+
const { context, fill, particle, stroke } = data;
|
|
83
83
|
if (!particle.shape) {
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
@@ -91,7 +91,7 @@ export function drawShape(drawer, data) {
|
|
|
91
91
|
if (stroke) {
|
|
92
92
|
context.stroke();
|
|
93
93
|
}
|
|
94
|
-
if (
|
|
94
|
+
if (fill) {
|
|
95
95
|
context.fill();
|
|
96
96
|
}
|
|
97
97
|
}
|
package/esm/Utils/ColorUtils.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { clamp, getRandom, getRandomInRange,
|
|
1
|
+
import { clamp, getRandom, getRandomInRange, getRangeValue, mix, randomInRangeValue, setRangeValue, } from "./MathUtils.js";
|
|
2
2
|
import { decayOffset, defaultLoops, defaultOpacity, defaultRgbMin, defaultTime, defaultVelocity, double, hMax, hMin, hPhase, half, identity, lFactor, lMax, lMin, midColorValue, millisecondsToSeconds, percentDenominator, phaseNumerator, randomColorValue, rgbMax, sMax, sMin, sNormalizedOffset, sextuple, triple, } from "../Core/Utils/Constants.js";
|
|
3
3
|
import { isArray, isString } from "./TypeUtils.js";
|
|
4
4
|
import { AlterType } from "../Enums/Types/AlterType.js";
|
|
@@ -190,10 +190,10 @@ function getSdrStyleFromHsl(color, opacity) {
|
|
|
190
190
|
}
|
|
191
191
|
export function colorMix(color1, color2, size1, size2) {
|
|
192
192
|
let rgb1 = color1, rgb2 = color2;
|
|
193
|
-
if (!
|
|
193
|
+
if (!("r" in rgb1)) {
|
|
194
194
|
rgb1 = hslToRgb(color1);
|
|
195
195
|
}
|
|
196
|
-
if (!
|
|
196
|
+
if (!("r" in rgb2)) {
|
|
197
197
|
rgb2 = hslToRgb(color2);
|
|
198
198
|
}
|
|
199
199
|
return {
|
|
@@ -246,27 +246,33 @@ export function getLinkRandomColor(engine, optColor, blink, consent) {
|
|
|
246
246
|
}
|
|
247
247
|
}
|
|
248
248
|
export function getHslFromAnimation(animation) {
|
|
249
|
-
return animation
|
|
250
|
-
?
|
|
249
|
+
return animation === undefined
|
|
250
|
+
? undefined
|
|
251
|
+
: {
|
|
251
252
|
h: animation.h.value,
|
|
252
253
|
s: animation.s.value,
|
|
253
254
|
l: animation.l.value,
|
|
254
|
-
}
|
|
255
|
-
: undefined;
|
|
255
|
+
};
|
|
256
256
|
}
|
|
257
257
|
export function getHslAnimationFromHsl(hsl, animationOptions, reduceFactor) {
|
|
258
258
|
const resColor = {
|
|
259
259
|
h: {
|
|
260
260
|
enable: false,
|
|
261
261
|
value: hsl.h,
|
|
262
|
+
min: hMin,
|
|
263
|
+
max: hMax,
|
|
262
264
|
},
|
|
263
265
|
s: {
|
|
264
266
|
enable: false,
|
|
265
267
|
value: hsl.s,
|
|
268
|
+
min: sMin,
|
|
269
|
+
max: sMax,
|
|
266
270
|
},
|
|
267
271
|
l: {
|
|
268
272
|
enable: false,
|
|
269
273
|
value: hsl.l,
|
|
274
|
+
min: lMin,
|
|
275
|
+
max: lMax,
|
|
270
276
|
},
|
|
271
277
|
};
|
|
272
278
|
if (animationOptions) {
|
|
@@ -278,6 +284,8 @@ export function getHslAnimationFromHsl(hsl, animationOptions, reduceFactor) {
|
|
|
278
284
|
}
|
|
279
285
|
function setColorAnimation(colorValue, colorAnimation, reduceFactor) {
|
|
280
286
|
colorValue.enable = colorAnimation.enable;
|
|
287
|
+
colorValue.min = colorAnimation.min;
|
|
288
|
+
colorValue.max = colorAnimation.max;
|
|
281
289
|
if (colorValue.enable) {
|
|
282
290
|
colorValue.velocity = (getRangeValue(colorAnimation.speed) / percentDenominator) * reduceFactor;
|
|
283
291
|
colorValue.decay = decayOffset - getRangeValue(colorAnimation.decay);
|
|
@@ -297,7 +305,7 @@ function setColorAnimation(colorValue, colorAnimation, reduceFactor) {
|
|
|
297
305
|
colorValue.velocity = defaultVelocity;
|
|
298
306
|
}
|
|
299
307
|
}
|
|
300
|
-
export function updateColorValue(data,
|
|
308
|
+
export function updateColorValue(data, decrease, delta) {
|
|
301
309
|
const minLoops = 0, minDelay = 0, identity = 1, minVelocity = 0, minOffset = 0, velocityFactor = 3.6;
|
|
302
310
|
if (!data.enable ||
|
|
303
311
|
((data.maxLoops ?? minLoops) > minLoops && (data.loops ?? minLoops) > (data.maxLoops ?? minLoops))) {
|
|
@@ -310,7 +318,7 @@ export function updateColorValue(data, range, decrease, delta) {
|
|
|
310
318
|
if ((data.delayTime ?? minDelay) > minDelay && data.time < (data.delayTime ?? minDelay)) {
|
|
311
319
|
return;
|
|
312
320
|
}
|
|
313
|
-
const offset = data.offset ? randomInRangeValue(data.offset) : minOffset, velocity = (data.velocity ?? minVelocity) * delta.factor + offset * velocityFactor, decay = data.decay ?? identity, max =
|
|
321
|
+
const offset = data.offset ? randomInRangeValue(data.offset) : minOffset, velocity = (data.velocity ?? minVelocity) * delta.factor + offset * velocityFactor, decay = data.decay ?? identity, max = data.max, min = data.min;
|
|
314
322
|
if (!decrease || data.status === AnimationStatus.increasing) {
|
|
315
323
|
data.value += velocity;
|
|
316
324
|
if (data.value > max) {
|
|
@@ -326,8 +334,7 @@ export function updateColorValue(data, range, decrease, delta) {
|
|
|
326
334
|
}
|
|
327
335
|
else {
|
|
328
336
|
data.value -= velocity;
|
|
329
|
-
|
|
330
|
-
if (data.value < minValue) {
|
|
337
|
+
if (data.value < min) {
|
|
331
338
|
data.loops ??= 0;
|
|
332
339
|
data.loops++;
|
|
333
340
|
data.status = AnimationStatus.increasing;
|
|
@@ -342,14 +349,10 @@ export function updateColor(color, delta) {
|
|
|
342
349
|
if (!color) {
|
|
343
350
|
return;
|
|
344
351
|
}
|
|
345
|
-
const { h, s, l } = color
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
};
|
|
350
|
-
updateColorValue(h, ranges.h, false, delta);
|
|
351
|
-
updateColorValue(s, ranges.s, true, delta);
|
|
352
|
-
updateColorValue(l, ranges.l, true, delta);
|
|
352
|
+
const { h, s, l } = color;
|
|
353
|
+
updateColorValue(h, false, delta);
|
|
354
|
+
updateColorValue(s, true, delta);
|
|
355
|
+
updateColorValue(l, true, delta);
|
|
353
356
|
}
|
|
354
357
|
export function alterHsl(color, type, value) {
|
|
355
358
|
return {
|