@tsparticles/preset-confetti-falling 4.3.1 → 4.4.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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
(function(g){g.__tsParticlesInternals=g.__tsParticlesInternals||{};g.__tsParticlesInternals.bundles=g.__tsParticlesInternals.bundles||{};g.__tsParticlesInternals.effects=g.__tsParticlesInternals.effects||{};g.__tsParticlesInternals.engine=g.__tsParticlesInternals.engine||{};g.__tsParticlesInternals.interactions=g.__tsParticlesInternals.interactions||{};g.__tsParticlesInternals.palettes=g.__tsParticlesInternals.palettes||{};g.__tsParticlesInternals.paths=g.__tsParticlesInternals.paths||{};g.__tsParticlesInternals.plugins=g.__tsParticlesInternals.plugins||{};g.__tsParticlesInternals.plugins=g.__tsParticlesInternals.plugins||{};g.__tsParticlesInternals.plugins.emittersShapes=g.__tsParticlesInternals.plugins.emittersShapes||{};g.__tsParticlesInternals.presets=g.__tsParticlesInternals.presets||{};g.__tsParticlesInternals.shapes=g.__tsParticlesInternals.shapes||{};g.__tsParticlesInternals.updaters=g.__tsParticlesInternals.updaters||{};g.__tsParticlesInternals.utils=g.__tsParticlesInternals.utils||{};g.__tsParticlesInternals.canvas=g.__tsParticlesInternals.canvas||{};g.__tsParticlesInternals.canvas=g.__tsParticlesInternals.canvas||{};g.__tsParticlesInternals.canvas.utils=g.__tsParticlesInternals.canvas.utils||{};g.__tsParticlesInternals.path=g.__tsParticlesInternals.path||{};g.__tsParticlesInternals.path=g.__tsParticlesInternals.path||{};g.__tsParticlesInternals.path.utils=g.__tsParticlesInternals.path.utils||{};var __tsProxyFactory=typeof Proxy!=="undefined"?function(obj){return new Proxy(obj,{get:function(target,key){if(!(key in target)){target[key]={};}return target[key];}});}:function(obj){return obj;};g.__tsParticlesInternals.bundles=__tsProxyFactory(g.__tsParticlesInternals.bundles);g.__tsParticlesInternals.effects=__tsProxyFactory(g.__tsParticlesInternals.effects);g.__tsParticlesInternals.interactions=__tsProxyFactory(g.__tsParticlesInternals.interactions);g.__tsParticlesInternals.palettes=__tsProxyFactory(g.__tsParticlesInternals.palettes);g.__tsParticlesInternals.paths=__tsProxyFactory(g.__tsParticlesInternals.paths);g.__tsParticlesInternals.plugins=__tsProxyFactory(g.__tsParticlesInternals.plugins);g.__tsParticlesInternals.plugins.emittersShapes=__tsProxyFactory(g.__tsParticlesInternals.plugins.emittersShapes);g.__tsParticlesInternals.presets=__tsProxyFactory(g.__tsParticlesInternals.presets);g.__tsParticlesInternals.shapes=__tsProxyFactory(g.__tsParticlesInternals.shapes);g.__tsParticlesInternals.updaters=__tsProxyFactory(g.__tsParticlesInternals.updaters);g.__tsParticlesInternals.utils=__tsProxyFactory(g.__tsParticlesInternals.utils);g.__tsParticlesInternals.canvas=__tsProxyFactory(g.__tsParticlesInternals.canvas);g.__tsParticlesInternals.path=__tsProxyFactory(g.__tsParticlesInternals.path);g.tsparticlesInternalExports=g.tsparticlesInternalExports||{};})(typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:this);
|
|
2
|
-
/* Preset v4.
|
|
2
|
+
/* Preset v4.4.0 */
|
|
3
3
|
(function (global, factory) {
|
|
4
4
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
5
5
|
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
@@ -292,6 +292,9 @@
|
|
|
292
292
|
})(PixelMode || (PixelMode = {}));
|
|
293
293
|
|
|
294
294
|
const minRadius = 0;
|
|
295
|
+
function isForbiddenKey(key) {
|
|
296
|
+
return key === "__proto__" || key === "constructor" || key === "prototype";
|
|
297
|
+
}
|
|
295
298
|
function hasMatchMedia() {
|
|
296
299
|
return typeof matchMedia !== "undefined";
|
|
297
300
|
}
|
|
@@ -367,7 +370,7 @@
|
|
|
367
370
|
if (!hasNested) {
|
|
368
371
|
const sourceDict = source, destDict = destination;
|
|
369
372
|
for (const key of sourceKeys) {
|
|
370
|
-
if (key
|
|
373
|
+
if (isForbiddenKey(key)) {
|
|
371
374
|
continue;
|
|
372
375
|
}
|
|
373
376
|
const v = sourceDict[key];
|
|
@@ -378,7 +381,7 @@
|
|
|
378
381
|
continue;
|
|
379
382
|
}
|
|
380
383
|
for (const key of sourceKeys) {
|
|
381
|
-
if (key
|
|
384
|
+
if (isForbiddenKey(key)) {
|
|
382
385
|
continue;
|
|
383
386
|
}
|
|
384
387
|
const sourceDict = source, destDict = destination, value = sourceDict[key];
|
|
@@ -794,7 +797,7 @@
|
|
|
794
797
|
return this.#domArray;
|
|
795
798
|
}
|
|
796
799
|
get version() {
|
|
797
|
-
return "4.
|
|
800
|
+
return "4.4.0";
|
|
798
801
|
}
|
|
799
802
|
addEventListener(type, listener) {
|
|
800
803
|
this.#eventDispatcher.addEventListener(type, listener);
|
|
@@ -875,6 +878,10 @@
|
|
|
875
878
|
}
|
|
876
879
|
|
|
877
880
|
function initEngine() {
|
|
881
|
+
const existing = globalThis.tsParticles;
|
|
882
|
+
if (existing?.pluginManager) {
|
|
883
|
+
return existing;
|
|
884
|
+
}
|
|
878
885
|
return new Engine();
|
|
879
886
|
}
|
|
880
887
|
|
|
@@ -972,6 +979,15 @@
|
|
|
972
979
|
AnimationMode["random"] = "random";
|
|
973
980
|
})(AnimationMode || (AnimationMode = {}));
|
|
974
981
|
|
|
982
|
+
var HdrMode;
|
|
983
|
+
(function (HdrMode) {
|
|
984
|
+
HdrMode["standard"] = "standard";
|
|
985
|
+
HdrMode["natural"] = "natural";
|
|
986
|
+
HdrMode["vivid"] = "vivid";
|
|
987
|
+
HdrMode["cinematic"] = "cinematic";
|
|
988
|
+
HdrMode["dynamic"] = "dynamic";
|
|
989
|
+
})(HdrMode || (HdrMode = {}));
|
|
990
|
+
|
|
975
991
|
var LimitMode;
|
|
976
992
|
(function (LimitMode) {
|
|
977
993
|
LimitMode["delete"] = "delete";
|
|
@@ -1227,6 +1243,29 @@
|
|
|
1227
1243
|
}
|
|
1228
1244
|
}
|
|
1229
1245
|
|
|
1246
|
+
const defaultPeakNits = 400, minPeakNits = 0, toStringValue = (value) => String(value);
|
|
1247
|
+
class HDROptions extends OptionLoader {
|
|
1248
|
+
enable = true;
|
|
1249
|
+
mode = HdrMode.standard;
|
|
1250
|
+
peakNits = defaultPeakNits;
|
|
1251
|
+
doLoad(data) {
|
|
1252
|
+
if (data.enable !== undefined && !isBoolean(data.enable)) {
|
|
1253
|
+
throw new Error(`Invalid HDR "enable" value: expected a boolean, got "${String(data.enable)}"`);
|
|
1254
|
+
}
|
|
1255
|
+
if (data.mode !== undefined &&
|
|
1256
|
+
(typeof data.mode !== "string" || !Object.values(HdrMode).includes(data.mode))) {
|
|
1257
|
+
throw new Error(`Invalid HDR "mode" value: expected one of ${Object.values(HdrMode).join(", ")}, got "${toStringValue(data.mode)}"`);
|
|
1258
|
+
}
|
|
1259
|
+
if (data.peakNits !== undefined &&
|
|
1260
|
+
(!isNumber(data.peakNits) || !Number.isFinite(data.peakNits) || data.peakNits <= minPeakNits)) {
|
|
1261
|
+
throw new Error(`Invalid HDR "peakNits" value: expected a positive number, got "${String(data.peakNits)}"`);
|
|
1262
|
+
}
|
|
1263
|
+
loadProperty(this, "enable", data.enable);
|
|
1264
|
+
loadProperty(this, "mode", data.mode);
|
|
1265
|
+
loadProperty(this, "peakNits", data.peakNits);
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
|
|
1230
1269
|
class ResizeEvent extends OptionLoader {
|
|
1231
1270
|
delay = 0.5;
|
|
1232
1271
|
enable = true;
|
|
@@ -1670,7 +1709,7 @@
|
|
|
1670
1709
|
duration = 0;
|
|
1671
1710
|
fpsLimit = 120;
|
|
1672
1711
|
fullScreen;
|
|
1673
|
-
hdr
|
|
1712
|
+
hdr;
|
|
1674
1713
|
key;
|
|
1675
1714
|
name;
|
|
1676
1715
|
palette;
|
|
@@ -1690,6 +1729,7 @@
|
|
|
1690
1729
|
this.#container = container;
|
|
1691
1730
|
this.background = new Background();
|
|
1692
1731
|
this.fullScreen = new FullScreen();
|
|
1732
|
+
this.hdr = new HDROptions();
|
|
1693
1733
|
this.particles = loadParticlesOptions(this.#pluginManager, this.#container);
|
|
1694
1734
|
this.resize = new ResizeEvent();
|
|
1695
1735
|
}
|
|
@@ -1712,7 +1752,15 @@
|
|
|
1712
1752
|
loadProperty(this, "detectRetina", data.detectRetina);
|
|
1713
1753
|
loadRangeProperty(this, "duration", data.duration);
|
|
1714
1754
|
loadProperty(this, "fpsLimit", data.fpsLimit);
|
|
1715
|
-
|
|
1755
|
+
const hdrData = data.hdr;
|
|
1756
|
+
if (isBoolean(hdrData)) {
|
|
1757
|
+
this.hdr.enable = hdrData;
|
|
1758
|
+
this.hdr.mode = HdrMode.standard;
|
|
1759
|
+
this.hdr.peakNits = 400;
|
|
1760
|
+
}
|
|
1761
|
+
else {
|
|
1762
|
+
this.hdr.load(hdrData);
|
|
1763
|
+
}
|
|
1716
1764
|
loadProperty(this, "pauseOnBlur", data.pauseOnBlur);
|
|
1717
1765
|
loadProperty(this, "pauseOnOutsideViewport", data.pauseOnOutsideViewport);
|
|
1718
1766
|
loadProperty(this, "zLayers", data.zLayers);
|
|
@@ -1755,7 +1803,7 @@
|
|
|
1755
1803
|
}
|
|
1756
1804
|
}
|
|
1757
1805
|
|
|
1758
|
-
const styleCache = new Map(), maxStyleCacheSize = 2000, rgbFixedPrecision = 2, hslFixedPrecision = 2, hdrRgbFixedPrecision = 4, hdrHslFixedPrecision = 4, sdrReferenceWhiteNits = 203,
|
|
1806
|
+
const styleCache = new Map(), maxStyleCacheSize = 2000, rgbFixedPrecision = 2, hslFixedPrecision = 2, hdrRgbFixedPrecision = 4, hdrHslFixedPrecision = 4, sdrReferenceWhiteNits = 203, acesA = 2.51, acesB = 0.03, acesC = 2.43, acesD = 0.59, acesE = 0.14, saturationBoost = 1.15, lightnessBoost = 1.05, temperatureR = 1.05, temperatureB = 0.95, contrastFactor = 1.1, luminanceR = 0.2126, luminanceG = 0.7152, luminanceB = 0.0722, dynamicLuminanceFactor = 2, channelCount = 3;
|
|
1759
1807
|
function getCachedStyle(key, generator) {
|
|
1760
1808
|
let cached = styleCache.get(key);
|
|
1761
1809
|
if (!cached) {
|
|
@@ -1767,6 +1815,42 @@
|
|
|
1767
1815
|
}
|
|
1768
1816
|
return cached;
|
|
1769
1817
|
}
|
|
1818
|
+
function acesFilmic(x) {
|
|
1819
|
+
return clamp((x * (acesA * x + acesB)) / (x * (acesC * x + acesD) + acesE), none, one);
|
|
1820
|
+
}
|
|
1821
|
+
function applyHdrModeAdjustments(r, g, b, mode, maxChannel) {
|
|
1822
|
+
switch (mode) {
|
|
1823
|
+
case HdrMode.vivid: {
|
|
1824
|
+
const avg = (r + g + b) / channelCount;
|
|
1825
|
+
return {
|
|
1826
|
+
b: clamp(clamp(avg + (b - avg) * saturationBoost, none, maxChannel) * lightnessBoost, none, maxChannel),
|
|
1827
|
+
g: clamp(clamp(avg + (g - avg) * saturationBoost, none, maxChannel) * lightnessBoost, none, maxChannel),
|
|
1828
|
+
r: clamp(clamp(avg + (r - avg) * saturationBoost, none, maxChannel) * lightnessBoost, none, maxChannel),
|
|
1829
|
+
};
|
|
1830
|
+
}
|
|
1831
|
+
case HdrMode.cinematic: {
|
|
1832
|
+
const tempR = r * temperatureR, tempB = b * temperatureB, avg = (tempR + g + tempB) / channelCount;
|
|
1833
|
+
return {
|
|
1834
|
+
b: clamp(avg + (tempB - avg) * contrastFactor, none, maxChannel),
|
|
1835
|
+
g: clamp(avg + (g - avg) * contrastFactor, none, maxChannel),
|
|
1836
|
+
r: clamp(avg + (tempR - avg) * contrastFactor, none, maxChannel),
|
|
1837
|
+
};
|
|
1838
|
+
}
|
|
1839
|
+
case HdrMode.dynamic: {
|
|
1840
|
+
const luminance = luminanceR * r + luminanceG * g + luminanceB * b, vividWeight = Math.min(one, luminance * dynamicLuminanceFactor), naturalWeight = one - vividWeight, avg = (r + g + b) / channelCount, vividR = clamp(avg + (r - avg) * saturationBoost, none, maxChannel) * lightnessBoost, vividG = clamp(avg + (g - avg) * saturationBoost, none, maxChannel) * lightnessBoost, vividB = clamp(avg + (b - avg) * saturationBoost, none, maxChannel) * lightnessBoost;
|
|
1841
|
+
return {
|
|
1842
|
+
b: clamp(b * naturalWeight + vividB * vividWeight, none, maxChannel),
|
|
1843
|
+
g: clamp(g * naturalWeight + vividG * vividWeight, none, maxChannel),
|
|
1844
|
+
r: clamp(r * naturalWeight + vividR * vividWeight, none, maxChannel),
|
|
1845
|
+
};
|
|
1846
|
+
}
|
|
1847
|
+
case HdrMode.standard:
|
|
1848
|
+
return { b, g, r };
|
|
1849
|
+
case HdrMode.natural:
|
|
1850
|
+
default:
|
|
1851
|
+
return { b, g, r };
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1770
1854
|
function stringToRgba(pluginManager, input) {
|
|
1771
1855
|
if (!input) {
|
|
1772
1856
|
return;
|
|
@@ -1924,21 +2008,40 @@
|
|
|
1924
2008
|
r: getRgbInRangeValue(),
|
|
1925
2009
|
};
|
|
1926
2010
|
}
|
|
1927
|
-
function getStyleFromRgb(color, hdr, opacity) {
|
|
1928
|
-
const rgbPrecision = hdr ? hdrRgbFixedPrecision : rgbFixedPrecision, op = opacity ?? defaultOpacity$1, key =
|
|
1929
|
-
|
|
2011
|
+
function getStyleFromRgb(color, hdr, opacity, peakNits, mode) {
|
|
2012
|
+
const rgbPrecision = hdr ? hdrRgbFixedPrecision : rgbFixedPrecision, op = opacity ?? defaultOpacity$1, key = hdr
|
|
2013
|
+
? `rgb-${color.r.toFixed(rgbPrecision)}-${color.g.toFixed(rgbPrecision)}-${color.b.toFixed(rgbPrecision)}-hdr-${op.toString()}-${(peakNits ?? maxNits).toString()}-${mode ?? HdrMode.standard}`
|
|
2014
|
+
: `rgb-${color.r.toFixed(rgbPrecision)}-${color.g.toFixed(rgbPrecision)}-${color.b.toFixed(rgbPrecision)}-sdr-${op.toString()}`;
|
|
2015
|
+
return getCachedStyle(key, () => hdr ? getHdrStyleFromRgb(color, opacity, peakNits, mode) : getSdrStyleFromRgb(color, opacity));
|
|
1930
2016
|
}
|
|
1931
|
-
function getHdrStyleFromRgb(color, opacity, peakNits = maxNits) {
|
|
1932
|
-
const headroom = peakNits / sdrReferenceWhiteNits;
|
|
1933
|
-
return `color(display-p3 ${
|
|
2017
|
+
function getHdrStyleFromRgb(color, opacity, peakNits = maxNits, mode = HdrMode.standard) {
|
|
2018
|
+
const headroom = peakNits / sdrReferenceWhiteNits, middleGray = 0.18, mapped = hdrToneMapColor(color, headroom, middleGray, mode);
|
|
2019
|
+
return `color(display-p3 ${mapped.r.toString()} ${mapped.g.toString()} ${mapped.b.toString()} / ${(opacity ?? defaultOpacity$1).toString()})`;
|
|
2020
|
+
}
|
|
2021
|
+
function hdrToneMapColor(color, headroom, middleGray, mode) {
|
|
2022
|
+
const rNorm = color.r / rgbMax, gNorm = color.g / rgbMax, bNorm = color.b / rgbMax;
|
|
2023
|
+
if (mode !== HdrMode.natural && mode !== HdrMode.vivid && mode !== HdrMode.cinematic && mode !== HdrMode.dynamic) {
|
|
2024
|
+
return { b: bNorm, g: gNorm, r: rNorm };
|
|
2025
|
+
}
|
|
2026
|
+
const maxChannel = Math.max(one, headroom), luminance = luminanceR * rNorm + luminanceG * gNorm + luminanceB * bNorm, mappedLuminance = hdrToneMap(luminance, headroom, middleGray), scale = luminance > none ? mappedLuminance / luminance : one;
|
|
2027
|
+
return applyHdrModeAdjustments(clamp(rNorm * scale, none, maxChannel), clamp(gNorm * scale, none, maxChannel), clamp(bNorm * scale, none, maxChannel), mode, maxChannel);
|
|
2028
|
+
}
|
|
2029
|
+
function hdrToneMap(normalized, headroom, middleGray) {
|
|
2030
|
+
if (normalized <= middleGray) {
|
|
2031
|
+
return acesFilmic(normalized);
|
|
2032
|
+
}
|
|
2033
|
+
const expanded = normalized + (normalized - middleGray) * (headroom - one);
|
|
2034
|
+
return acesFilmic(expanded);
|
|
1934
2035
|
}
|
|
1935
2036
|
function getSdrStyleFromRgb(color, opacity) {
|
|
1936
2037
|
return `rgba(${color.r.toString()}, ${color.g.toString()}, ${color.b.toString()}, ${(opacity ?? defaultOpacity$1).toString()})`;
|
|
1937
2038
|
}
|
|
1938
|
-
function getStyleFromHsl(color, hdr, opacity) {
|
|
1939
|
-
const hslPrecision = hdr ? hdrHslFixedPrecision : hslFixedPrecision, op = opacity ?? defaultOpacity$1, key =
|
|
2039
|
+
function getStyleFromHsl(color, hdr, opacity, peakNits, mode) {
|
|
2040
|
+
const hslPrecision = hdr ? hdrHslFixedPrecision : hslFixedPrecision, op = opacity ?? defaultOpacity$1, key = hdr
|
|
2041
|
+
? `hsl-${color.h.toFixed(hslPrecision)}-${color.s.toFixed(hslPrecision)}-${color.l.toFixed(hslPrecision)}-hdr-${op.toString()}-${(peakNits ?? maxNits).toString()}-${mode ?? HdrMode.standard}`
|
|
2042
|
+
: `hsl-${color.h.toFixed(hslPrecision)}-${color.s.toFixed(hslPrecision)}-${color.l.toFixed(hslPrecision)}-sdr-${op.toString()}`;
|
|
1940
2043
|
return getCachedStyle(key, () => hdr
|
|
1941
|
-
? getStyleFromRgb(hslToRgbFloat(color), true, opacity)
|
|
2044
|
+
? getStyleFromRgb(hslToRgbFloat(color), true, opacity, peakNits, mode)
|
|
1942
2045
|
: `hsla(${color.h.toString()}, ${color.s.toString()}%, ${color.l.toString()}%, ${op.toString()})`);
|
|
1943
2046
|
}
|
|
1944
2047
|
function getHslFromAnimation(animation) {
|
|
@@ -2001,7 +2104,7 @@
|
|
|
2001
2104
|
colorValue.velocity = defaultVelocity;
|
|
2002
2105
|
}
|
|
2003
2106
|
}
|
|
2004
|
-
function updateColorValue(data, decrease, delta,
|
|
2107
|
+
function updateColorValue(data, decrease, delta, _hdr) {
|
|
2005
2108
|
const minLoops = 0, minDelay = 0, identity = 1, minVelocity = 0, minOffset = 0, velocityFactor = 3.6;
|
|
2006
2109
|
if (!data.enable ||
|
|
2007
2110
|
((data.maxLoops ?? minLoops) > minLoops && (data.loops ?? minLoops) > (data.maxLoops ?? minLoops))) {
|
|
@@ -2014,7 +2117,7 @@
|
|
|
2014
2117
|
if ((data.delayTime ?? minDelay) > minDelay && data.time < (data.delayTime ?? minDelay)) {
|
|
2015
2118
|
return;
|
|
2016
2119
|
}
|
|
2017
|
-
const offset = data.offset ? randomInRangeValue(data.offset) : minOffset, velocity = (
|
|
2120
|
+
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;
|
|
2018
2121
|
if (!decrease || data.status === AnimationStatus.increasing) {
|
|
2019
2122
|
data.value += velocity;
|
|
2020
2123
|
if (data.value > max) {
|
|
@@ -2046,9 +2149,9 @@
|
|
|
2046
2149
|
return;
|
|
2047
2150
|
}
|
|
2048
2151
|
const { h, s, l } = color;
|
|
2049
|
-
updateColorValue(h, false, delta
|
|
2050
|
-
updateColorValue(s, true, delta
|
|
2051
|
-
updateColorValue(l, true, delta
|
|
2152
|
+
updateColorValue(h, false, delta);
|
|
2153
|
+
updateColorValue(s, true, delta);
|
|
2154
|
+
updateColorValue(l, true, delta);
|
|
2052
2155
|
}
|
|
2053
2156
|
function alterHsl(color, type, value) {
|
|
2054
2157
|
return {
|
|
@@ -2098,7 +2201,7 @@
|
|
|
2098
2201
|
}
|
|
2099
2202
|
|
|
2100
2203
|
async function loadBlendPlugin(engine) {
|
|
2101
|
-
engine.checkVersion("4.
|
|
2204
|
+
engine.checkVersion("4.4.0");
|
|
2102
2205
|
await engine.pluginManager.register(e => {
|
|
2103
2206
|
e.pluginManager.addPlugin(new BlendPlugin());
|
|
2104
2207
|
});
|
|
@@ -2135,7 +2238,7 @@
|
|
|
2135
2238
|
}
|
|
2136
2239
|
|
|
2137
2240
|
async function loadCircleShape(engine) {
|
|
2138
|
-
engine.checkVersion("4.
|
|
2241
|
+
engine.checkVersion("4.4.0");
|
|
2139
2242
|
await engine.pluginManager.register(e => {
|
|
2140
2243
|
e.pluginManager.addShape(["circle"], () => {
|
|
2141
2244
|
return Promise.resolve(new CircleDrawer());
|
|
@@ -2183,7 +2286,7 @@
|
|
|
2183
2286
|
}
|
|
2184
2287
|
|
|
2185
2288
|
async function loadHexColorPlugin(engine) {
|
|
2186
|
-
engine.checkVersion("4.
|
|
2289
|
+
engine.checkVersion("4.4.0");
|
|
2187
2290
|
await engine.pluginManager.register(e => {
|
|
2188
2291
|
e.pluginManager.addColorManager("hex", new HexColorManager());
|
|
2189
2292
|
});
|
|
@@ -2236,7 +2339,7 @@
|
|
|
2236
2339
|
}
|
|
2237
2340
|
|
|
2238
2341
|
async function loadHslColorPlugin(engine) {
|
|
2239
|
-
engine.checkVersion("4.
|
|
2342
|
+
engine.checkVersion("4.4.0");
|
|
2240
2343
|
await engine.pluginManager.register(e => {
|
|
2241
2344
|
e.pluginManager.addColorManager("hsl", new HslColorManager());
|
|
2242
2345
|
});
|
|
@@ -2260,7 +2363,7 @@
|
|
|
2260
2363
|
}
|
|
2261
2364
|
|
|
2262
2365
|
async function loadMovePlugin(engine) {
|
|
2263
|
-
engine.checkVersion("4.
|
|
2366
|
+
engine.checkVersion("4.4.0");
|
|
2264
2367
|
await engine.pluginManager.register(e => {
|
|
2265
2368
|
const moveEngine = e, movePluginManager = moveEngine.pluginManager;
|
|
2266
2369
|
movePluginManager.initializers.pathGenerators ??= new Map();
|
|
@@ -2476,7 +2579,7 @@
|
|
|
2476
2579
|
}
|
|
2477
2580
|
|
|
2478
2581
|
async function loadOpacityUpdater(engine) {
|
|
2479
|
-
engine.checkVersion("4.
|
|
2582
|
+
engine.checkVersion("4.4.0");
|
|
2480
2583
|
await engine.pluginManager.register(e => {
|
|
2481
2584
|
e.pluginManager.addParticleUpdater("opacity", container => {
|
|
2482
2585
|
return Promise.resolve(new OpacityUpdater(container));
|
|
@@ -2821,7 +2924,7 @@
|
|
|
2821
2924
|
}
|
|
2822
2925
|
|
|
2823
2926
|
async function loadOutModesUpdater(engine) {
|
|
2824
|
-
engine.checkVersion("4.
|
|
2927
|
+
engine.checkVersion("4.4.0");
|
|
2825
2928
|
await engine.pluginManager.register(e => {
|
|
2826
2929
|
e.pluginManager.addParticleUpdater("outModes", container => {
|
|
2827
2930
|
return Promise.resolve(new OutOfCanvasUpdater(container));
|
|
@@ -2892,7 +2995,7 @@
|
|
|
2892
2995
|
}
|
|
2893
2996
|
|
|
2894
2997
|
async function loadPaintUpdater(engine) {
|
|
2895
|
-
engine.checkVersion("4.
|
|
2998
|
+
engine.checkVersion("4.4.0");
|
|
2896
2999
|
await engine.pluginManager.register(e => {
|
|
2897
3000
|
e.pluginManager.addParticleUpdater("paint", container => {
|
|
2898
3001
|
return Promise.resolve(new PaintUpdater(e.pluginManager, container));
|
|
@@ -2947,7 +3050,7 @@
|
|
|
2947
3050
|
}
|
|
2948
3051
|
|
|
2949
3052
|
async function loadRgbColorPlugin(engine) {
|
|
2950
|
-
engine.checkVersion("4.
|
|
3053
|
+
engine.checkVersion("4.4.0");
|
|
2951
3054
|
await engine.pluginManager.register(e => {
|
|
2952
3055
|
e.pluginManager.addColorManager("rgb", new RgbColorManager());
|
|
2953
3056
|
});
|
|
@@ -3032,7 +3135,7 @@
|
|
|
3032
3135
|
}
|
|
3033
3136
|
|
|
3034
3137
|
async function loadSizeUpdater(engine) {
|
|
3035
|
-
engine.checkVersion("4.
|
|
3138
|
+
engine.checkVersion("4.4.0");
|
|
3036
3139
|
await engine.pluginManager.register(e => {
|
|
3037
3140
|
e.pluginManager.addParticleUpdater("size", container => {
|
|
3038
3141
|
return Promise.resolve(new SizeUpdater(container));
|
|
@@ -3041,7 +3144,7 @@
|
|
|
3041
3144
|
}
|
|
3042
3145
|
|
|
3043
3146
|
async function loadBasic(engine) {
|
|
3044
|
-
engine.checkVersion("4.
|
|
3147
|
+
engine.checkVersion("4.4.0");
|
|
3045
3148
|
await engine.pluginManager.register(async (e) => {
|
|
3046
3149
|
await Promise.all([
|
|
3047
3150
|
loadBlendPlugin(e),
|
|
@@ -3134,7 +3237,7 @@
|
|
|
3134
3237
|
}
|
|
3135
3238
|
|
|
3136
3239
|
async function loadMotionPlugin(engine) {
|
|
3137
|
-
engine.checkVersion("4.
|
|
3240
|
+
engine.checkVersion("4.4.0");
|
|
3138
3241
|
await engine.pluginManager.register(e => {
|
|
3139
3242
|
e.pluginManager.addPlugin(new MotionPlugin());
|
|
3140
3243
|
});
|
|
@@ -3267,7 +3370,7 @@
|
|
|
3267
3370
|
}
|
|
3268
3371
|
|
|
3269
3372
|
async function loadRollUpdater(engine) {
|
|
3270
|
-
engine.checkVersion("4.
|
|
3373
|
+
engine.checkVersion("4.4.0");
|
|
3271
3374
|
await engine.pluginManager.register(e => {
|
|
3272
3375
|
e.pluginManager.addParticleUpdater("roll", () => {
|
|
3273
3376
|
return Promise.resolve(new RollUpdater(e.pluginManager));
|
|
@@ -3373,7 +3476,7 @@
|
|
|
3373
3476
|
}
|
|
3374
3477
|
|
|
3375
3478
|
async function loadRotateUpdater(engine) {
|
|
3376
|
-
engine.checkVersion("4.
|
|
3479
|
+
engine.checkVersion("4.4.0");
|
|
3377
3480
|
await engine.pluginManager.register(e => {
|
|
3378
3481
|
e.pluginManager.addParticleUpdater("rotate", container => {
|
|
3379
3482
|
return Promise.resolve(new RotateUpdater(container));
|
|
@@ -3397,7 +3500,7 @@
|
|
|
3397
3500
|
}
|
|
3398
3501
|
|
|
3399
3502
|
async function loadSquareShape(engine) {
|
|
3400
|
-
engine.checkVersion("4.
|
|
3503
|
+
engine.checkVersion("4.4.0");
|
|
3401
3504
|
await engine.pluginManager.register(e => {
|
|
3402
3505
|
e.pluginManager.addShape(["edge", "square"], () => Promise.resolve(new SquareDrawer()));
|
|
3403
3506
|
});
|
|
@@ -3506,7 +3609,7 @@
|
|
|
3506
3609
|
}
|
|
3507
3610
|
|
|
3508
3611
|
async function loadTiltUpdater(engine) {
|
|
3509
|
-
engine.checkVersion("4.
|
|
3612
|
+
engine.checkVersion("4.4.0");
|
|
3510
3613
|
await engine.pluginManager.register(e => {
|
|
3511
3614
|
e.pluginManager.addParticleUpdater("tilt", container => {
|
|
3512
3615
|
return Promise.resolve(new TiltUpdater(container));
|
|
@@ -3608,7 +3711,7 @@
|
|
|
3608
3711
|
}
|
|
3609
3712
|
|
|
3610
3713
|
async function loadWobbleUpdater(engine) {
|
|
3611
|
-
engine.checkVersion("4.
|
|
3714
|
+
engine.checkVersion("4.4.0");
|
|
3612
3715
|
await engine.pluginManager.register(e => {
|
|
3613
3716
|
e.pluginManager.addParticleUpdater("wobble", container => {
|
|
3614
3717
|
return Promise.resolve(new WobbleUpdater(container));
|
|
@@ -3845,7 +3948,11 @@
|
|
|
3845
3948
|
if (!fColor && !sColor) {
|
|
3846
3949
|
return;
|
|
3847
3950
|
}
|
|
3848
|
-
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
|
|
3951
|
+
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
|
|
3952
|
+
? getStyleFromHsl(fColor, container.hdr, fillOpacity * opacity, container.peakNits, container.hdrMode)
|
|
3953
|
+
: undefined, stroke = sColor
|
|
3954
|
+
? getStyleFromHsl(sColor, container.hdr, strokeOpacity * opacity, container.peakNits, container.hdrMode)
|
|
3955
|
+
: fill;
|
|
3849
3956
|
transform.a = transform.b = transform.c = transform.d = undefined;
|
|
3850
3957
|
colorStyles.fill = fill;
|
|
3851
3958
|
colorStyles.stroke = stroke;
|
|
@@ -4179,7 +4286,9 @@
|
|
|
4179
4286
|
if (typeof background.element === "string") {
|
|
4180
4287
|
if (typeof document !== "undefined") {
|
|
4181
4288
|
const node = document.querySelector(background.element);
|
|
4182
|
-
if (
|
|
4289
|
+
if ((typeof HTMLCanvasElement !== "undefined" && node instanceof HTMLCanvasElement) ||
|
|
4290
|
+
(typeof HTMLVideoElement !== "undefined" && node instanceof HTMLVideoElement) ||
|
|
4291
|
+
(typeof HTMLImageElement !== "undefined" && node instanceof HTMLImageElement)) {
|
|
4183
4292
|
this.#backgroundElement = node;
|
|
4184
4293
|
}
|
|
4185
4294
|
else if (node) {
|
|
@@ -4190,10 +4299,10 @@
|
|
|
4190
4299
|
}
|
|
4191
4300
|
}
|
|
4192
4301
|
}
|
|
4193
|
-
else if (background.element instanceof HTMLCanvasElement ||
|
|
4194
|
-
background.element instanceof OffscreenCanvas ||
|
|
4195
|
-
background.element instanceof HTMLVideoElement ||
|
|
4196
|
-
background.element instanceof HTMLImageElement) {
|
|
4302
|
+
else if ((typeof HTMLCanvasElement !== "undefined" && background.element instanceof HTMLCanvasElement) ||
|
|
4303
|
+
(typeof OffscreenCanvas !== "undefined" && background.element instanceof OffscreenCanvas) ||
|
|
4304
|
+
(typeof HTMLVideoElement !== "undefined" && background.element instanceof HTMLVideoElement) ||
|
|
4305
|
+
(typeof HTMLImageElement !== "undefined" && background.element instanceof HTMLImageElement)) {
|
|
4197
4306
|
this.#backgroundElement = background.element;
|
|
4198
4307
|
}
|
|
4199
4308
|
}
|
|
@@ -4261,6 +4370,7 @@
|
|
|
4261
4370
|
zoom = defaultZoom;
|
|
4262
4371
|
#container;
|
|
4263
4372
|
#generated;
|
|
4373
|
+
#hdrMediaListeners;
|
|
4264
4374
|
#mutationObserver;
|
|
4265
4375
|
#originalStyle;
|
|
4266
4376
|
#pluginManager;
|
|
@@ -4325,7 +4435,6 @@
|
|
|
4325
4435
|
});
|
|
4326
4436
|
this.resize();
|
|
4327
4437
|
this.#initStyle();
|
|
4328
|
-
this.initBackground();
|
|
4329
4438
|
this.#safeMutationObserver(obs => {
|
|
4330
4439
|
const element = this.domElement;
|
|
4331
4440
|
if (!element || !(element instanceof Node)) {
|
|
@@ -4335,6 +4444,8 @@
|
|
|
4335
4444
|
});
|
|
4336
4445
|
this.initPlugins();
|
|
4337
4446
|
this.#initContext();
|
|
4447
|
+
this.initBackground();
|
|
4448
|
+
this.#initHdrListeners();
|
|
4338
4449
|
this.render.init();
|
|
4339
4450
|
}
|
|
4340
4451
|
initBackground() {
|
|
@@ -4344,7 +4455,8 @@
|
|
|
4344
4455
|
}
|
|
4345
4456
|
const elementStyle = element.style, color = rangeColorToRgb(this.#pluginManager, background.color);
|
|
4346
4457
|
if (color) {
|
|
4347
|
-
|
|
4458
|
+
const hdrOptions = container.actualOptions.hdr;
|
|
4459
|
+
elementStyle.backgroundColor = getStyleFromRgb(color, container.hdr, background.opacity, hdrOptions.peakNits, hdrOptions.mode);
|
|
4348
4460
|
}
|
|
4349
4461
|
else {
|
|
4350
4462
|
elementStyle.backgroundColor = "";
|
|
@@ -4441,6 +4553,7 @@
|
|
|
4441
4553
|
obs.disconnect();
|
|
4442
4554
|
});
|
|
4443
4555
|
this.#mutationObserver = undefined;
|
|
4556
|
+
this.#removeHdrListeners();
|
|
4444
4557
|
this.render.stop();
|
|
4445
4558
|
}
|
|
4446
4559
|
async windowResize() {
|
|
@@ -4460,9 +4573,16 @@
|
|
|
4460
4573
|
}
|
|
4461
4574
|
}
|
|
4462
4575
|
#initContext() {
|
|
4463
|
-
const container = this.#container, canSupportHdr = container.actualOptions.hdr &&
|
|
4576
|
+
const container = this.#container, canSupportHdr = container.actualOptions.hdr.enable &&
|
|
4464
4577
|
safeMatchMedia("(color-gamut: p3)")?.matches &&
|
|
4465
4578
|
safeMatchMedia("(dynamic-range: high)")?.matches;
|
|
4579
|
+
container.hdr = canSupportHdr ?? false;
|
|
4580
|
+
container.hdrMode = container.actualOptions.hdr.mode;
|
|
4581
|
+
container.peakNits = container.actualOptions.hdr.peakNits;
|
|
4582
|
+
const renderCanvas = this.renderCanvas;
|
|
4583
|
+
if (!renderCanvas) {
|
|
4584
|
+
return;
|
|
4585
|
+
}
|
|
4466
4586
|
this.render.setContextSettings({
|
|
4467
4587
|
alpha: true,
|
|
4468
4588
|
desynchronized: true,
|
|
@@ -4471,11 +4591,47 @@
|
|
|
4471
4591
|
? { colorSpace: "display-p3", colorType: "float16" }
|
|
4472
4592
|
: { colorSpace: "srgb" }),
|
|
4473
4593
|
});
|
|
4474
|
-
|
|
4475
|
-
|
|
4476
|
-
|
|
4594
|
+
let context;
|
|
4595
|
+
try {
|
|
4596
|
+
context = renderCanvas.getContext("2d", this.render.settings);
|
|
4597
|
+
}
|
|
4598
|
+
catch {
|
|
4599
|
+
context = null;
|
|
4600
|
+
}
|
|
4601
|
+
if (canSupportHdr && !context) {
|
|
4602
|
+
container.hdr = false;
|
|
4603
|
+
const sdrSettings = {
|
|
4604
|
+
alpha: true,
|
|
4605
|
+
desynchronized: true,
|
|
4606
|
+
willReadFrequently: false,
|
|
4607
|
+
colorSpace: "srgb",
|
|
4608
|
+
};
|
|
4609
|
+
this.render.setContextSettings(sdrSettings);
|
|
4610
|
+
try {
|
|
4611
|
+
context = renderCanvas.getContext("2d", sdrSettings);
|
|
4612
|
+
}
|
|
4613
|
+
catch {
|
|
4614
|
+
context = null;
|
|
4615
|
+
}
|
|
4616
|
+
}
|
|
4617
|
+
this.render.setContext(context);
|
|
4618
|
+
}
|
|
4619
|
+
#initHdrListeners() {
|
|
4620
|
+
this.#removeHdrListeners();
|
|
4621
|
+
const p3Query = safeMatchMedia("(color-gamut: p3)"), hdrQuery = safeMatchMedia("(dynamic-range: high)"), handleChange = () => {
|
|
4622
|
+
this.#recreateRenderCanvas();
|
|
4623
|
+
this.#initContext();
|
|
4624
|
+
this.initBackground();
|
|
4625
|
+
}, listeners = [];
|
|
4626
|
+
if (p3Query) {
|
|
4627
|
+
p3Query.addEventListener("change", handleChange);
|
|
4628
|
+
listeners.push({ handler: handleChange, mql: p3Query });
|
|
4629
|
+
}
|
|
4630
|
+
if (hdrQuery) {
|
|
4631
|
+
hdrQuery.addEventListener("change", handleChange);
|
|
4632
|
+
listeners.push({ handler: handleChange, mql: hdrQuery });
|
|
4477
4633
|
}
|
|
4478
|
-
this
|
|
4634
|
+
this.#hdrMediaListeners = listeners;
|
|
4479
4635
|
}
|
|
4480
4636
|
#initStyle() {
|
|
4481
4637
|
const element = this.domElement, options = this.#container.actualOptions;
|
|
@@ -4499,6 +4655,25 @@
|
|
|
4499
4655
|
element.style.setProperty(key, value, "important");
|
|
4500
4656
|
}
|
|
4501
4657
|
}
|
|
4658
|
+
#recreateRenderCanvas() {
|
|
4659
|
+
const renderCanvas = this.renderCanvas;
|
|
4660
|
+
if (!renderCanvas) {
|
|
4661
|
+
return;
|
|
4662
|
+
}
|
|
4663
|
+
if (this.domElement) {
|
|
4664
|
+
return;
|
|
4665
|
+
}
|
|
4666
|
+
this.renderCanvas = new OffscreenCanvas(renderCanvas.width, renderCanvas.height);
|
|
4667
|
+
}
|
|
4668
|
+
#removeHdrListeners() {
|
|
4669
|
+
if (!this.#hdrMediaListeners) {
|
|
4670
|
+
return;
|
|
4671
|
+
}
|
|
4672
|
+
for (const { handler, mql } of this.#hdrMediaListeners) {
|
|
4673
|
+
mql.removeEventListener("change", handler);
|
|
4674
|
+
}
|
|
4675
|
+
this.#hdrMediaListeners = undefined;
|
|
4676
|
+
}
|
|
4502
4677
|
#repairStyle() {
|
|
4503
4678
|
const element = this.domElement;
|
|
4504
4679
|
if (!element) {
|
|
@@ -4883,9 +5058,9 @@
|
|
|
4883
5058
|
}
|
|
4884
5059
|
getOpacity() {
|
|
4885
5060
|
const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, baseOpacity = getRangeValue(this.opacity?.value ?? defaultOpacity$1), modifierOpacity = this.#applyModifiers(undefined, m => m.opacity), opacity = modifierOpacity ?? baseOpacity, fillOpacity = this.fillOpacity ?? defaultOpacity$1, strokeOpacity = this.strokeOpacity ?? defaultOpacity$1;
|
|
4886
|
-
this.#cachedOpacityData.fillOpacity =
|
|
5061
|
+
this.#cachedOpacityData.fillOpacity = fillOpacity;
|
|
4887
5062
|
this.#cachedOpacityData.opacity = opacity * zOpacityFactor;
|
|
4888
|
-
this.#cachedOpacityData.strokeOpacity =
|
|
5063
|
+
this.#cachedOpacityData.strokeOpacity = strokeOpacity;
|
|
4889
5064
|
return this.#cachedOpacityData;
|
|
4890
5065
|
}
|
|
4891
5066
|
getPosition() {
|
|
@@ -5740,6 +5915,7 @@
|
|
|
5740
5915
|
effectDrawers;
|
|
5741
5916
|
fpsLimit;
|
|
5742
5917
|
hdr;
|
|
5918
|
+
hdrMode;
|
|
5743
5919
|
id;
|
|
5744
5920
|
pageHidden;
|
|
5745
5921
|
particleCreatedPlugins;
|
|
@@ -5747,6 +5923,7 @@
|
|
|
5747
5923
|
particlePositionPlugins;
|
|
5748
5924
|
particleUpdaters;
|
|
5749
5925
|
particles;
|
|
5926
|
+
peakNits;
|
|
5750
5927
|
plugins;
|
|
5751
5928
|
retina;
|
|
5752
5929
|
shapeDrawers;
|
|
@@ -5777,6 +5954,8 @@
|
|
|
5777
5954
|
this.id = Symbol(id);
|
|
5778
5955
|
this.fpsLimit = 120;
|
|
5779
5956
|
this.hdr = false;
|
|
5957
|
+
this.hdrMode = HdrMode.standard;
|
|
5958
|
+
this.peakNits = 400;
|
|
5780
5959
|
this.#smooth = false;
|
|
5781
5960
|
this.#delay = 0;
|
|
5782
5961
|
this.#duration = 0;
|
|
@@ -5916,8 +6095,9 @@
|
|
|
5916
6095
|
this.updateActualOptions();
|
|
5917
6096
|
this.canvas.initBackground();
|
|
5918
6097
|
this.canvas.resize();
|
|
5919
|
-
const { delay, duration, fpsLimit,
|
|
5920
|
-
this.
|
|
6098
|
+
const { delay, duration, fpsLimit, smooth, zLayers } = this.actualOptions, hdrOptions = this.actualOptions.hdr;
|
|
6099
|
+
this.hdrMode = hdrOptions.mode;
|
|
6100
|
+
this.peakNits = hdrOptions.peakNits;
|
|
5921
6101
|
this.zLayers = zLayers;
|
|
5922
6102
|
this.#duration = getRangeValue(duration) * millisecondsToSeconds;
|
|
5923
6103
|
this.#delay = getRangeValue(delay) * millisecondsToSeconds;
|