@tsparticles/ribbons 4.3.2 → 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.
- package/browser/ribbons.js +3 -3
- package/browser/ribbons.lazy.js +3 -3
- package/cjs/ribbons.js +3 -3
- package/cjs/ribbons.lazy.js +3 -3
- package/esm/ribbons.js +3 -3
- package/esm/ribbons.lazy.js +3 -3
- package/package.json +8 -8
- package/report.html +1 -1
- package/tsparticles.ribbons.bundle.js +319 -105
- package/tsparticles.ribbons.bundle.min.js +1 -1
- package/tsparticles.ribbons.js +4 -4
- package/tsparticles.ribbons.min.js +1 -1
|
@@ -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
|
-
/* tsParticles v4.
|
|
2
|
+
/* tsParticles 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) :
|
|
@@ -880,7 +880,7 @@
|
|
|
880
880
|
return this.#domArray;
|
|
881
881
|
}
|
|
882
882
|
get version() {
|
|
883
|
-
return "4.
|
|
883
|
+
return "4.4.0";
|
|
884
884
|
}
|
|
885
885
|
addEventListener(type, listener) {
|
|
886
886
|
this.#eventDispatcher.addEventListener(type, listener);
|
|
@@ -961,6 +961,10 @@
|
|
|
961
961
|
}
|
|
962
962
|
|
|
963
963
|
function initEngine() {
|
|
964
|
+
const existing = globalThis.tsParticles;
|
|
965
|
+
if (existing?.pluginManager) {
|
|
966
|
+
return existing;
|
|
967
|
+
}
|
|
964
968
|
return new Engine();
|
|
965
969
|
}
|
|
966
970
|
|
|
@@ -1058,6 +1062,15 @@
|
|
|
1058
1062
|
AnimationMode["random"] = "random";
|
|
1059
1063
|
})(exports.AnimationMode || (exports.AnimationMode = {}));
|
|
1060
1064
|
|
|
1065
|
+
exports.HdrMode = void 0;
|
|
1066
|
+
(function (HdrMode) {
|
|
1067
|
+
HdrMode["standard"] = "standard";
|
|
1068
|
+
HdrMode["natural"] = "natural";
|
|
1069
|
+
HdrMode["vivid"] = "vivid";
|
|
1070
|
+
HdrMode["cinematic"] = "cinematic";
|
|
1071
|
+
HdrMode["dynamic"] = "dynamic";
|
|
1072
|
+
})(exports.HdrMode || (exports.HdrMode = {}));
|
|
1073
|
+
|
|
1061
1074
|
exports.LimitMode = void 0;
|
|
1062
1075
|
(function (LimitMode) {
|
|
1063
1076
|
LimitMode["delete"] = "delete";
|
|
@@ -1323,6 +1336,29 @@
|
|
|
1323
1336
|
}
|
|
1324
1337
|
}
|
|
1325
1338
|
|
|
1339
|
+
const defaultPeakNits = 400, minPeakNits = 0, toStringValue = (value) => String(value);
|
|
1340
|
+
class HDROptions extends OptionLoader {
|
|
1341
|
+
enable = true;
|
|
1342
|
+
mode = exports.HdrMode.standard;
|
|
1343
|
+
peakNits = defaultPeakNits;
|
|
1344
|
+
doLoad(data) {
|
|
1345
|
+
if (data.enable !== undefined && !isBoolean(data.enable)) {
|
|
1346
|
+
throw new Error(`Invalid HDR "enable" value: expected a boolean, got "${String(data.enable)}"`);
|
|
1347
|
+
}
|
|
1348
|
+
if (data.mode !== undefined &&
|
|
1349
|
+
(typeof data.mode !== "string" || !Object.values(exports.HdrMode).includes(data.mode))) {
|
|
1350
|
+
throw new Error(`Invalid HDR "mode" value: expected one of ${Object.values(exports.HdrMode).join(", ")}, got "${toStringValue(data.mode)}"`);
|
|
1351
|
+
}
|
|
1352
|
+
if (data.peakNits !== undefined &&
|
|
1353
|
+
(!isNumber(data.peakNits) || !Number.isFinite(data.peakNits) || data.peakNits <= minPeakNits)) {
|
|
1354
|
+
throw new Error(`Invalid HDR "peakNits" value: expected a positive number, got "${String(data.peakNits)}"`);
|
|
1355
|
+
}
|
|
1356
|
+
loadProperty(this, "enable", data.enable);
|
|
1357
|
+
loadProperty(this, "mode", data.mode);
|
|
1358
|
+
loadProperty(this, "peakNits", data.peakNits);
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1326
1362
|
class ResizeEvent extends OptionLoader {
|
|
1327
1363
|
delay = 0.5;
|
|
1328
1364
|
enable = true;
|
|
@@ -1766,7 +1802,7 @@
|
|
|
1766
1802
|
duration = 0;
|
|
1767
1803
|
fpsLimit = 120;
|
|
1768
1804
|
fullScreen;
|
|
1769
|
-
hdr
|
|
1805
|
+
hdr;
|
|
1770
1806
|
key;
|
|
1771
1807
|
name;
|
|
1772
1808
|
palette;
|
|
@@ -1786,6 +1822,7 @@
|
|
|
1786
1822
|
this.#container = container;
|
|
1787
1823
|
this.background = new Background();
|
|
1788
1824
|
this.fullScreen = new FullScreen();
|
|
1825
|
+
this.hdr = new HDROptions();
|
|
1789
1826
|
this.particles = loadParticlesOptions(this.#pluginManager, this.#container);
|
|
1790
1827
|
this.resize = new ResizeEvent();
|
|
1791
1828
|
}
|
|
@@ -1808,7 +1845,15 @@
|
|
|
1808
1845
|
loadProperty(this, "detectRetina", data.detectRetina);
|
|
1809
1846
|
loadRangeProperty(this, "duration", data.duration);
|
|
1810
1847
|
loadProperty(this, "fpsLimit", data.fpsLimit);
|
|
1811
|
-
|
|
1848
|
+
const hdrData = data.hdr;
|
|
1849
|
+
if (isBoolean(hdrData)) {
|
|
1850
|
+
this.hdr.enable = hdrData;
|
|
1851
|
+
this.hdr.mode = exports.HdrMode.standard;
|
|
1852
|
+
this.hdr.peakNits = 400;
|
|
1853
|
+
}
|
|
1854
|
+
else {
|
|
1855
|
+
this.hdr.load(hdrData);
|
|
1856
|
+
}
|
|
1812
1857
|
loadProperty(this, "pauseOnBlur", data.pauseOnBlur);
|
|
1813
1858
|
loadProperty(this, "pauseOnOutsideViewport", data.pauseOnOutsideViewport);
|
|
1814
1859
|
loadProperty(this, "zLayers", data.zLayers);
|
|
@@ -1851,7 +1896,7 @@
|
|
|
1851
1896
|
}
|
|
1852
1897
|
}
|
|
1853
1898
|
|
|
1854
|
-
const styleCache = new Map(), maxStyleCacheSize = 2000, rgbFixedPrecision = 2, hslFixedPrecision = 2, hdrRgbFixedPrecision = 4, hdrHslFixedPrecision = 4, sdrReferenceWhiteNits = 203,
|
|
1899
|
+
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, srgbThreshold = 0.04045, srgbDivisor = 12.92, srgbOffset = 0.055, srgbScale = 1.055, srgbExponent = 2.4, linearThreshold = 0.0031308, linearScale = 12.92;
|
|
1855
1900
|
function getCachedStyle(key, generator) {
|
|
1856
1901
|
let cached = styleCache.get(key);
|
|
1857
1902
|
if (!cached) {
|
|
@@ -1863,6 +1908,48 @@
|
|
|
1863
1908
|
}
|
|
1864
1909
|
return cached;
|
|
1865
1910
|
}
|
|
1911
|
+
function acesFilmic(x) {
|
|
1912
|
+
return clamp((x * (acesA * x + acesB)) / (x * (acesC * x + acesD) + acesE), none, one);
|
|
1913
|
+
}
|
|
1914
|
+
function srgbToLinear(c) {
|
|
1915
|
+
return c <= srgbThreshold ? c / srgbDivisor : Math.pow((c + srgbOffset) / srgbScale, srgbExponent);
|
|
1916
|
+
}
|
|
1917
|
+
function linearToSrgb(c) {
|
|
1918
|
+
return c <= linearThreshold ? c * linearScale : srgbScale * Math.pow(c, one / srgbExponent) - srgbOffset;
|
|
1919
|
+
}
|
|
1920
|
+
function applyHdrModeAdjustments(r, g, b, mode, maxChannel) {
|
|
1921
|
+
switch (mode) {
|
|
1922
|
+
case exports.HdrMode.vivid: {
|
|
1923
|
+
const avg = (r + g + b) / channelCount;
|
|
1924
|
+
return {
|
|
1925
|
+
b: clamp(clamp(avg + (b - avg) * saturationBoost, none, maxChannel) * lightnessBoost, none, maxChannel),
|
|
1926
|
+
g: clamp(clamp(avg + (g - avg) * saturationBoost, none, maxChannel) * lightnessBoost, none, maxChannel),
|
|
1927
|
+
r: clamp(clamp(avg + (r - avg) * saturationBoost, none, maxChannel) * lightnessBoost, none, maxChannel),
|
|
1928
|
+
};
|
|
1929
|
+
}
|
|
1930
|
+
case exports.HdrMode.cinematic: {
|
|
1931
|
+
const tempR = r * temperatureR, tempB = b * temperatureB, avg = (tempR + g + tempB) / channelCount;
|
|
1932
|
+
return {
|
|
1933
|
+
b: clamp(avg + (tempB - avg) * contrastFactor, none, maxChannel),
|
|
1934
|
+
g: clamp(avg + (g - avg) * contrastFactor, none, maxChannel),
|
|
1935
|
+
r: clamp(avg + (tempR - avg) * contrastFactor, none, maxChannel),
|
|
1936
|
+
};
|
|
1937
|
+
}
|
|
1938
|
+
case exports.HdrMode.dynamic: {
|
|
1939
|
+
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;
|
|
1940
|
+
return {
|
|
1941
|
+
b: clamp(b * naturalWeight + vividB * vividWeight, none, maxChannel),
|
|
1942
|
+
g: clamp(g * naturalWeight + vividG * vividWeight, none, maxChannel),
|
|
1943
|
+
r: clamp(r * naturalWeight + vividR * vividWeight, none, maxChannel),
|
|
1944
|
+
};
|
|
1945
|
+
}
|
|
1946
|
+
case exports.HdrMode.standard:
|
|
1947
|
+
return { b, g, r };
|
|
1948
|
+
case exports.HdrMode.natural:
|
|
1949
|
+
default:
|
|
1950
|
+
return { b, g, r };
|
|
1951
|
+
}
|
|
1952
|
+
}
|
|
1866
1953
|
function stringToRgba(pluginManager, input) {
|
|
1867
1954
|
if (!input) {
|
|
1868
1955
|
return;
|
|
@@ -2030,30 +2117,65 @@
|
|
|
2030
2117
|
r: getRgbInRangeValue(),
|
|
2031
2118
|
};
|
|
2032
2119
|
}
|
|
2033
|
-
function getStyleFromRgb(color, hdr, opacity) {
|
|
2034
|
-
const rgbPrecision = hdr ? hdrRgbFixedPrecision : rgbFixedPrecision, op = opacity ?? defaultOpacity$1, key =
|
|
2035
|
-
|
|
2120
|
+
function getStyleFromRgb(color, hdr, opacity, peakNits, mode) {
|
|
2121
|
+
const rgbPrecision = hdr ? hdrRgbFixedPrecision : rgbFixedPrecision, op = opacity ?? defaultOpacity$1, key = hdr
|
|
2122
|
+
? `rgb-${color.r.toFixed(rgbPrecision)}-${color.g.toFixed(rgbPrecision)}-${color.b.toFixed(rgbPrecision)}-hdr-${op.toString()}-${(peakNits ?? maxNits).toString()}-${mode ?? exports.HdrMode.standard}`
|
|
2123
|
+
: `rgb-${color.r.toFixed(rgbPrecision)}-${color.g.toFixed(rgbPrecision)}-${color.b.toFixed(rgbPrecision)}-sdr-${op.toString()}`;
|
|
2124
|
+
return getCachedStyle(key, () => hdr ? getHdrStyleFromRgb(color, opacity, peakNits, mode) : getSdrStyleFromRgb(color, opacity));
|
|
2125
|
+
}
|
|
2126
|
+
function getHdrStyleFromRgb(color, opacity, peakNits = maxNits, mode = exports.HdrMode.standard) {
|
|
2127
|
+
const headroom = peakNits / sdrReferenceWhiteNits, middleGray = 0.18, mapped = hdrToneMapColor(color, headroom, middleGray, mode);
|
|
2128
|
+
return `color(display-p3 ${mapped.r.toString()} ${mapped.g.toString()} ${mapped.b.toString()} / ${(opacity ?? defaultOpacity$1).toString()})`;
|
|
2129
|
+
}
|
|
2130
|
+
function hdrToneMapColor(color, headroom, middleGray, mode) {
|
|
2131
|
+
const rNorm = color.r / rgbMax, gNorm = color.g / rgbMax, bNorm = color.b / rgbMax;
|
|
2132
|
+
if (mode !== exports.HdrMode.natural && mode !== exports.HdrMode.vivid && mode !== exports.HdrMode.cinematic && mode !== exports.HdrMode.dynamic) {
|
|
2133
|
+
return { b: bNorm, g: gNorm, r: rNorm };
|
|
2134
|
+
}
|
|
2135
|
+
const maxChannel = Math.max(one, headroom), luminance = luminanceR * rNorm + luminanceG * gNorm + luminanceB * bNorm, mappedLuminance = hdrToneMap(luminance, headroom, middleGray), scale = luminance > none ? mappedLuminance / luminance : one;
|
|
2136
|
+
return applyHdrModeAdjustments(clamp(rNorm * scale, none, maxChannel), clamp(gNorm * scale, none, maxChannel), clamp(bNorm * scale, none, maxChannel), mode, maxChannel);
|
|
2036
2137
|
}
|
|
2037
|
-
function
|
|
2038
|
-
|
|
2039
|
-
|
|
2138
|
+
function hdrToneMap(normalized, headroom, middleGray) {
|
|
2139
|
+
if (normalized <= middleGray) {
|
|
2140
|
+
return acesFilmic(normalized);
|
|
2141
|
+
}
|
|
2142
|
+
const expanded = normalized + (normalized - middleGray) * (headroom - one);
|
|
2143
|
+
return acesFilmic(expanded);
|
|
2040
2144
|
}
|
|
2041
2145
|
function getSdrStyleFromRgb(color, opacity) {
|
|
2042
2146
|
return `rgba(${color.r.toString()}, ${color.g.toString()}, ${color.b.toString()}, ${(opacity ?? defaultOpacity$1).toString()})`;
|
|
2043
2147
|
}
|
|
2044
|
-
function getStyleFromHsl(color, hdr, opacity) {
|
|
2045
|
-
const hslPrecision = hdr ? hdrHslFixedPrecision : hslFixedPrecision, op = opacity ?? defaultOpacity$1, key =
|
|
2148
|
+
function getStyleFromHsl(color, hdr, opacity, peakNits, mode) {
|
|
2149
|
+
const hslPrecision = hdr ? hdrHslFixedPrecision : hslFixedPrecision, op = opacity ?? defaultOpacity$1, key = hdr
|
|
2150
|
+
? `hsl-${color.h.toFixed(hslPrecision)}-${color.s.toFixed(hslPrecision)}-${color.l.toFixed(hslPrecision)}-hdr-${op.toString()}-${(peakNits ?? maxNits).toString()}-${mode ?? exports.HdrMode.standard}`
|
|
2151
|
+
: `hsl-${color.h.toFixed(hslPrecision)}-${color.s.toFixed(hslPrecision)}-${color.l.toFixed(hslPrecision)}-sdr-${op.toString()}`;
|
|
2046
2152
|
return getCachedStyle(key, () => hdr
|
|
2047
|
-
? getStyleFromRgb(hslToRgbFloat(color), true, opacity)
|
|
2153
|
+
? getStyleFromRgb(hslToRgbFloat(color), true, opacity, peakNits, mode)
|
|
2048
2154
|
: `hsla(${color.h.toString()}, ${color.s.toString()}%, ${color.l.toString()}%, ${op.toString()})`);
|
|
2049
2155
|
}
|
|
2050
|
-
function colorMix(color1, color2, size1, size2) {
|
|
2156
|
+
function colorMix(color1, color2, size1, size2, hdr) {
|
|
2051
2157
|
let rgb1 = color1, rgb2 = color2;
|
|
2052
2158
|
if (!("r" in rgb1)) {
|
|
2053
|
-
rgb1 = hslToRgb(color1);
|
|
2159
|
+
rgb1 = hdr ? hslToRgbFloat(color1) : hslToRgb(color1);
|
|
2054
2160
|
}
|
|
2055
2161
|
if (!("r" in rgb2)) {
|
|
2056
|
-
rgb2 = hslToRgb(color2);
|
|
2162
|
+
rgb2 = hdr ? hslToRgbFloat(color2) : hslToRgb(color2);
|
|
2163
|
+
}
|
|
2164
|
+
if (hdr) {
|
|
2165
|
+
const lin1 = {
|
|
2166
|
+
b: srgbToLinear(rgb1.b / rgbMax),
|
|
2167
|
+
g: srgbToLinear(rgb1.g / rgbMax),
|
|
2168
|
+
r: srgbToLinear(rgb1.r / rgbMax),
|
|
2169
|
+
}, lin2 = {
|
|
2170
|
+
b: srgbToLinear(rgb2.b / rgbMax),
|
|
2171
|
+
g: srgbToLinear(rgb2.g / rgbMax),
|
|
2172
|
+
r: srgbToLinear(rgb2.r / rgbMax),
|
|
2173
|
+
}, totalWeight = size1 + size2;
|
|
2174
|
+
return {
|
|
2175
|
+
b: linearToSrgb((lin1.b * size1 + lin2.b * size2) / totalWeight) * rgbMax,
|
|
2176
|
+
g: linearToSrgb((lin1.g * size1 + lin2.g * size2) / totalWeight) * rgbMax,
|
|
2177
|
+
r: linearToSrgb((lin1.r * size1 + lin2.r * size2) / totalWeight) * rgbMax,
|
|
2178
|
+
};
|
|
2057
2179
|
}
|
|
2058
2180
|
return {
|
|
2059
2181
|
b: mix(rgb1.b, rgb2.b, size1, size2),
|
|
@@ -2061,14 +2183,14 @@
|
|
|
2061
2183
|
r: mix(rgb1.r, rgb2.r, size1, size2),
|
|
2062
2184
|
};
|
|
2063
2185
|
}
|
|
2064
|
-
function getLinkColor(p1, p2, linkColor) {
|
|
2186
|
+
function getLinkColor(p1, p2, linkColor, hdr) {
|
|
2065
2187
|
if (linkColor === randomColorValue) {
|
|
2066
2188
|
return getRandomRgbColor();
|
|
2067
2189
|
}
|
|
2068
2190
|
else if (linkColor === midColorValue) {
|
|
2069
2191
|
const sourceColor = p1.getFillColor() ?? p1.getStrokeColor(), destColor = p2?.getFillColor() ?? p2?.getStrokeColor();
|
|
2070
2192
|
if (sourceColor && destColor && p2) {
|
|
2071
|
-
return colorMix(sourceColor, destColor, p1.getRadius(), p2.getRadius());
|
|
2193
|
+
return colorMix(sourceColor, destColor, p1.getRadius(), p2.getRadius(), hdr);
|
|
2072
2194
|
}
|
|
2073
2195
|
else {
|
|
2074
2196
|
const hslColor = sourceColor ?? destColor;
|
|
@@ -2164,7 +2286,7 @@
|
|
|
2164
2286
|
colorValue.velocity = defaultVelocity;
|
|
2165
2287
|
}
|
|
2166
2288
|
}
|
|
2167
|
-
function updateColorValue(data, decrease, delta,
|
|
2289
|
+
function updateColorValue(data, decrease, delta, _hdr) {
|
|
2168
2290
|
const minLoops = 0, minDelay = 0, identity = 1, minVelocity = 0, minOffset = 0, velocityFactor = 3.6;
|
|
2169
2291
|
if (!data.enable ||
|
|
2170
2292
|
((data.maxLoops ?? minLoops) > minLoops && (data.loops ?? minLoops) > (data.maxLoops ?? minLoops))) {
|
|
@@ -2177,7 +2299,7 @@
|
|
|
2177
2299
|
if ((data.delayTime ?? minDelay) > minDelay && data.time < (data.delayTime ?? minDelay)) {
|
|
2178
2300
|
return;
|
|
2179
2301
|
}
|
|
2180
|
-
const offset = data.offset ? randomInRangeValue(data.offset) : minOffset, velocity = (
|
|
2302
|
+
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;
|
|
2181
2303
|
if (!decrease || data.status === exports.AnimationStatus.increasing) {
|
|
2182
2304
|
data.value += velocity;
|
|
2183
2305
|
if (data.value > max) {
|
|
@@ -2209,9 +2331,9 @@
|
|
|
2209
2331
|
return;
|
|
2210
2332
|
}
|
|
2211
2333
|
const { h, s, l } = color;
|
|
2212
|
-
updateColorValue(h, false, delta
|
|
2213
|
-
updateColorValue(s, true, delta
|
|
2214
|
-
updateColorValue(l, true, delta
|
|
2334
|
+
updateColorValue(h, false, delta);
|
|
2335
|
+
updateColorValue(s, true, delta);
|
|
2336
|
+
updateColorValue(l, true, delta);
|
|
2215
2337
|
}
|
|
2216
2338
|
function alterHsl(color, type, value) {
|
|
2217
2339
|
return {
|
|
@@ -2261,7 +2383,7 @@
|
|
|
2261
2383
|
}
|
|
2262
2384
|
|
|
2263
2385
|
async function loadBlendPlugin(engine) {
|
|
2264
|
-
engine.checkVersion("4.
|
|
2386
|
+
engine.checkVersion("4.4.0");
|
|
2265
2387
|
await engine.pluginManager.register(e => {
|
|
2266
2388
|
e.pluginManager.addPlugin(new BlendPlugin());
|
|
2267
2389
|
});
|
|
@@ -2298,7 +2420,7 @@
|
|
|
2298
2420
|
}
|
|
2299
2421
|
|
|
2300
2422
|
async function loadCircleShape(engine) {
|
|
2301
|
-
engine.checkVersion("4.
|
|
2423
|
+
engine.checkVersion("4.4.0");
|
|
2302
2424
|
await engine.pluginManager.register(e => {
|
|
2303
2425
|
e.pluginManager.addShape(["circle"], () => {
|
|
2304
2426
|
return Promise.resolve(new CircleDrawer());
|
|
@@ -2346,7 +2468,7 @@
|
|
|
2346
2468
|
}
|
|
2347
2469
|
|
|
2348
2470
|
async function loadHexColorPlugin(engine) {
|
|
2349
|
-
engine.checkVersion("4.
|
|
2471
|
+
engine.checkVersion("4.4.0");
|
|
2350
2472
|
await engine.pluginManager.register(e => {
|
|
2351
2473
|
e.pluginManager.addColorManager("hex", new HexColorManager());
|
|
2352
2474
|
});
|
|
@@ -2399,7 +2521,7 @@
|
|
|
2399
2521
|
}
|
|
2400
2522
|
|
|
2401
2523
|
async function loadHslColorPlugin(engine) {
|
|
2402
|
-
engine.checkVersion("4.
|
|
2524
|
+
engine.checkVersion("4.4.0");
|
|
2403
2525
|
await engine.pluginManager.register(e => {
|
|
2404
2526
|
e.pluginManager.addColorManager("hsl", new HslColorManager());
|
|
2405
2527
|
});
|
|
@@ -2423,7 +2545,7 @@
|
|
|
2423
2545
|
}
|
|
2424
2546
|
|
|
2425
2547
|
async function loadMovePlugin(engine) {
|
|
2426
|
-
engine.checkVersion("4.
|
|
2548
|
+
engine.checkVersion("4.4.0");
|
|
2427
2549
|
await engine.pluginManager.register(e => {
|
|
2428
2550
|
const moveEngine = e, movePluginManager = moveEngine.pluginManager;
|
|
2429
2551
|
movePluginManager.initializers.pathGenerators ??= new Map();
|
|
@@ -2633,7 +2755,7 @@
|
|
|
2633
2755
|
}
|
|
2634
2756
|
|
|
2635
2757
|
async function loadOpacityUpdater(engine) {
|
|
2636
|
-
engine.checkVersion("4.
|
|
2758
|
+
engine.checkVersion("4.4.0");
|
|
2637
2759
|
await engine.pluginManager.register(e => {
|
|
2638
2760
|
e.pluginManager.addParticleUpdater("opacity", container => {
|
|
2639
2761
|
return Promise.resolve(new OpacityUpdater(container));
|
|
@@ -2978,7 +3100,7 @@
|
|
|
2978
3100
|
}
|
|
2979
3101
|
|
|
2980
3102
|
async function loadOutModesUpdater(engine) {
|
|
2981
|
-
engine.checkVersion("4.
|
|
3103
|
+
engine.checkVersion("4.4.0");
|
|
2982
3104
|
await engine.pluginManager.register(e => {
|
|
2983
3105
|
e.pluginManager.addParticleUpdater("outModes", container => {
|
|
2984
3106
|
return Promise.resolve(new OutOfCanvasUpdater(container));
|
|
@@ -3049,7 +3171,7 @@
|
|
|
3049
3171
|
}
|
|
3050
3172
|
|
|
3051
3173
|
async function loadPaintUpdater(engine) {
|
|
3052
|
-
engine.checkVersion("4.
|
|
3174
|
+
engine.checkVersion("4.4.0");
|
|
3053
3175
|
await engine.pluginManager.register(e => {
|
|
3054
3176
|
e.pluginManager.addParticleUpdater("paint", container => {
|
|
3055
3177
|
return Promise.resolve(new PaintUpdater(e.pluginManager, container));
|
|
@@ -3104,7 +3226,7 @@
|
|
|
3104
3226
|
}
|
|
3105
3227
|
|
|
3106
3228
|
async function loadRgbColorPlugin(engine) {
|
|
3107
|
-
engine.checkVersion("4.
|
|
3229
|
+
engine.checkVersion("4.4.0");
|
|
3108
3230
|
await engine.pluginManager.register(e => {
|
|
3109
3231
|
e.pluginManager.addColorManager("rgb", new RgbColorManager());
|
|
3110
3232
|
});
|
|
@@ -3189,7 +3311,7 @@
|
|
|
3189
3311
|
}
|
|
3190
3312
|
|
|
3191
3313
|
async function loadSizeUpdater(engine) {
|
|
3192
|
-
engine.checkVersion("4.
|
|
3314
|
+
engine.checkVersion("4.4.0");
|
|
3193
3315
|
await engine.pluginManager.register(e => {
|
|
3194
3316
|
e.pluginManager.addParticleUpdater("size", container => {
|
|
3195
3317
|
return Promise.resolve(new SizeUpdater(container));
|
|
@@ -3198,7 +3320,7 @@
|
|
|
3198
3320
|
}
|
|
3199
3321
|
|
|
3200
3322
|
async function loadBasic(engine) {
|
|
3201
|
-
engine.checkVersion("4.
|
|
3323
|
+
engine.checkVersion("4.4.0");
|
|
3202
3324
|
await engine.pluginManager.register(async (e) => {
|
|
3203
3325
|
await Promise.all([
|
|
3204
3326
|
loadBlendPlugin(e),
|
|
@@ -3438,7 +3560,7 @@
|
|
|
3438
3560
|
})(EmitterClickMode || (EmitterClickMode = {}));
|
|
3439
3561
|
|
|
3440
3562
|
async function loadEmittersPluginSimple(engine) {
|
|
3441
|
-
engine.checkVersion("4.
|
|
3563
|
+
engine.checkVersion("4.4.0");
|
|
3442
3564
|
await engine.pluginManager.register(async (e) => {
|
|
3443
3565
|
const instancesManager = await getEmittersInstancesManager(e);
|
|
3444
3566
|
await addEmittersShapesManager(e);
|
|
@@ -3526,7 +3648,7 @@
|
|
|
3526
3648
|
}
|
|
3527
3649
|
|
|
3528
3650
|
async function loadEmittersShapeSquare(engine) {
|
|
3529
|
-
engine.checkVersion("4.
|
|
3651
|
+
engine.checkVersion("4.4.0");
|
|
3530
3652
|
await engine.pluginManager.register((e) => {
|
|
3531
3653
|
ensureEmittersPluginLoaded(e);
|
|
3532
3654
|
e.pluginManager.addEmitterShapeGenerator?.("square", new EmittersSquareShapeGenerator());
|
|
@@ -3670,7 +3792,7 @@
|
|
|
3670
3792
|
}
|
|
3671
3793
|
|
|
3672
3794
|
async function loadLifeUpdater(engine) {
|
|
3673
|
-
engine.checkVersion("4.
|
|
3795
|
+
engine.checkVersion("4.4.0");
|
|
3674
3796
|
await engine.pluginManager.register(e => {
|
|
3675
3797
|
e.pluginManager.addParticleUpdater("life", container => {
|
|
3676
3798
|
return Promise.resolve(new LifeUpdater(container));
|
|
@@ -3724,7 +3846,7 @@
|
|
|
3724
3846
|
}
|
|
3725
3847
|
|
|
3726
3848
|
async function loadMotionPlugin(engine) {
|
|
3727
|
-
engine.checkVersion("4.
|
|
3849
|
+
engine.checkVersion("4.4.0");
|
|
3728
3850
|
await engine.pluginManager.register(e => {
|
|
3729
3851
|
e.pluginManager.addPlugin(new MotionPlugin());
|
|
3730
3852
|
});
|
|
@@ -3932,12 +4054,7 @@
|
|
|
3932
4054
|
context.fill();
|
|
3933
4055
|
}
|
|
3934
4056
|
}
|
|
3935
|
-
function
|
|
3936
|
-
const { context, particle, radius } = data, points = particle.ribbonPoints, offsets = particle.ribbonOffsets, bounds = particle.ribbonBounds, hasFill = data.fill, hasStroke = data.stroke;
|
|
3937
|
-
if (!points || !offsets || !bounds || points.length < minPointCount || (!hasFill && !hasStroke)) {
|
|
3938
|
-
return;
|
|
3939
|
-
}
|
|
3940
|
-
const drawOffsets = offsets.mult(radius), center = particle.position, frontFill = typeof context.fillStyle === "string" ? context.fillStyle : "", frontStroke = typeof context.strokeStyle === "string" ? context.strokeStyle : "", shapeData = particle.shapeData;
|
|
4057
|
+
function resolveBackFill(hasStroke, frontFill, frontStroke, shapeData, particle, hdr, peakNits, mode) {
|
|
3941
4058
|
let backFill = hasStroke ? frontStroke : frontFill;
|
|
3942
4059
|
if (shapeData?.backColor) {
|
|
3943
4060
|
backFill = shapeData.backColor;
|
|
@@ -3946,16 +4063,68 @@
|
|
|
3946
4063
|
const frontHsl = getHslFromAnimation(particle.fillColor);
|
|
3947
4064
|
if (frontHsl) {
|
|
3948
4065
|
const altered = alterHsl(frontHsl, exports.AlterType.darken, getRangeValue(shapeData.darken.value));
|
|
3949
|
-
backFill = getStyleFromHsl(altered, hdr);
|
|
4066
|
+
backFill = getStyleFromHsl(altered, hdr, undefined, peakNits, mode);
|
|
3950
4067
|
}
|
|
3951
4068
|
}
|
|
3952
4069
|
else if (shapeData?.enlighten?.enable) {
|
|
3953
4070
|
const frontHsl = getHslFromAnimation(particle.fillColor);
|
|
3954
4071
|
if (frontHsl) {
|
|
3955
4072
|
const altered = alterHsl(frontHsl, exports.AlterType.enlighten, getRangeValue(shapeData.enlighten.value));
|
|
3956
|
-
backFill = getStyleFromHsl(altered, hdr);
|
|
4073
|
+
backFill = getStyleFromHsl(altered, hdr, undefined, peakNits, mode);
|
|
3957
4074
|
}
|
|
3958
4075
|
}
|
|
4076
|
+
return backFill;
|
|
4077
|
+
}
|
|
4078
|
+
function drawEdgeSegments(context, currentBase, nextBase, currentSide, nextSide, isFirst, isLast, hasFill, hasStroke) {
|
|
4079
|
+
if (isFirst) {
|
|
4080
|
+
drawPolygonSegment(context, {
|
|
4081
|
+
a: currentBase,
|
|
4082
|
+
b: nextBase,
|
|
4083
|
+
c: getMidpoint(nextBase, nextSide),
|
|
4084
|
+
fill: hasFill,
|
|
4085
|
+
stroke: hasStroke,
|
|
4086
|
+
});
|
|
4087
|
+
drawPolygonSegment(context, {
|
|
4088
|
+
a: nextSide,
|
|
4089
|
+
b: currentSide,
|
|
4090
|
+
c: getMidpoint(nextBase, nextSide),
|
|
4091
|
+
fill: hasFill,
|
|
4092
|
+
stroke: hasStroke,
|
|
4093
|
+
});
|
|
4094
|
+
}
|
|
4095
|
+
else if (isLast) {
|
|
4096
|
+
drawPolygonSegment(context, {
|
|
4097
|
+
a: currentBase,
|
|
4098
|
+
b: nextBase,
|
|
4099
|
+
c: getMidpoint(currentBase, currentSide),
|
|
4100
|
+
fill: hasFill,
|
|
4101
|
+
stroke: hasStroke,
|
|
4102
|
+
});
|
|
4103
|
+
drawPolygonSegment(context, {
|
|
4104
|
+
a: nextSide,
|
|
4105
|
+
b: currentSide,
|
|
4106
|
+
c: getMidpoint(currentBase, currentSide),
|
|
4107
|
+
fill: hasFill,
|
|
4108
|
+
stroke: hasStroke,
|
|
4109
|
+
});
|
|
4110
|
+
}
|
|
4111
|
+
else {
|
|
4112
|
+
drawPolygonSegment(context, {
|
|
4113
|
+
a: currentBase,
|
|
4114
|
+
b: nextBase,
|
|
4115
|
+
c: nextSide,
|
|
4116
|
+
d: currentSide,
|
|
4117
|
+
fill: hasFill,
|
|
4118
|
+
stroke: hasStroke,
|
|
4119
|
+
});
|
|
4120
|
+
}
|
|
4121
|
+
}
|
|
4122
|
+
function drawRibbon(data, hdr, peakNits, mode) {
|
|
4123
|
+
const { context, particle, radius } = data, points = particle.ribbonPoints, offsets = particle.ribbonOffsets, bounds = particle.ribbonBounds, hasFill = data.fill, hasStroke = data.stroke;
|
|
4124
|
+
if (!points || !offsets || !bounds || points.length < minPointCount || (!hasFill && !hasStroke)) {
|
|
4125
|
+
return;
|
|
4126
|
+
}
|
|
4127
|
+
const drawOffsets = offsets.mult(radius), center = particle.position, frontFill = typeof context.fillStyle === "string" ? context.fillStyle : "", frontStroke = typeof context.strokeStyle === "string" ? context.strokeStyle : "", shapeData = particle.shapeData, backFill = resolveBackFill(hasStroke, frontFill, frontStroke, shapeData, particle, hdr, peakNits, mode);
|
|
3959
4128
|
context.lineWidth = lineWidth;
|
|
3960
4129
|
context.lineJoin = "round";
|
|
3961
4130
|
context.lineCap = "round";
|
|
@@ -3973,46 +4142,13 @@
|
|
|
3973
4142
|
context.strokeStyle = segmentStyle;
|
|
3974
4143
|
}
|
|
3975
4144
|
if (i === noPoint) {
|
|
3976
|
-
|
|
3977
|
-
a: currentBase,
|
|
3978
|
-
b: nextBase,
|
|
3979
|
-
c: getMidpoint(nextBase, nextSide),
|
|
3980
|
-
fill: hasFill,
|
|
3981
|
-
stroke: hasStroke,
|
|
3982
|
-
});
|
|
3983
|
-
drawPolygonSegment(context, {
|
|
3984
|
-
a: nextSide,
|
|
3985
|
-
b: currentSide,
|
|
3986
|
-
c: getMidpoint(nextBase, nextSide),
|
|
3987
|
-
fill: hasFill,
|
|
3988
|
-
stroke: hasStroke,
|
|
3989
|
-
});
|
|
4145
|
+
drawEdgeSegments(context, currentBase, nextBase, currentSide, nextSide, true, false, hasFill, hasStroke);
|
|
3990
4146
|
}
|
|
3991
4147
|
else if (i === points.length - secondPoint) {
|
|
3992
|
-
|
|
3993
|
-
a: currentBase,
|
|
3994
|
-
b: nextBase,
|
|
3995
|
-
c: getMidpoint(currentBase, currentSide),
|
|
3996
|
-
fill: hasFill,
|
|
3997
|
-
stroke: hasStroke,
|
|
3998
|
-
});
|
|
3999
|
-
drawPolygonSegment(context, {
|
|
4000
|
-
a: nextSide,
|
|
4001
|
-
b: currentSide,
|
|
4002
|
-
c: getMidpoint(currentBase, currentSide),
|
|
4003
|
-
fill: hasFill,
|
|
4004
|
-
stroke: hasStroke,
|
|
4005
|
-
});
|
|
4148
|
+
drawEdgeSegments(context, currentBase, nextBase, currentSide, nextSide, false, true, hasFill, hasStroke);
|
|
4006
4149
|
}
|
|
4007
4150
|
else {
|
|
4008
|
-
|
|
4009
|
-
a: currentBase,
|
|
4010
|
-
b: nextBase,
|
|
4011
|
-
c: nextSide,
|
|
4012
|
-
d: currentSide,
|
|
4013
|
-
fill: hasFill,
|
|
4014
|
-
stroke: hasStroke,
|
|
4015
|
-
});
|
|
4151
|
+
drawEdgeSegments(context, currentBase, nextBase, currentSide, nextSide, false, false, hasFill, hasStroke);
|
|
4016
4152
|
}
|
|
4017
4153
|
}
|
|
4018
4154
|
context.fillStyle = frontFill;
|
|
@@ -4060,7 +4196,7 @@
|
|
|
4060
4196
|
createRibbonState(data.particle);
|
|
4061
4197
|
}
|
|
4062
4198
|
updateRibbon(data);
|
|
4063
|
-
drawRibbon(data, this.#container.hdr);
|
|
4199
|
+
drawRibbon(data, this.#container.hdr, this.#container.peakNits, this.#container.hdrMode);
|
|
4064
4200
|
}
|
|
4065
4201
|
getSidesCount(particle) {
|
|
4066
4202
|
const pointsLen = particle.ribbonPoints?.length;
|
|
@@ -4122,7 +4258,7 @@
|
|
|
4122
4258
|
}
|
|
4123
4259
|
|
|
4124
4260
|
async function loadRibbonShape(engine) {
|
|
4125
|
-
engine.checkVersion("4.
|
|
4261
|
+
engine.checkVersion("4.4.0");
|
|
4126
4262
|
await engine.pluginManager.register(e => {
|
|
4127
4263
|
e.pluginManager.addShape(["ribbon"], (container) => Promise.resolve(new RibbonDrawer(container)));
|
|
4128
4264
|
});
|
|
@@ -4442,7 +4578,7 @@
|
|
|
4442
4578
|
|
|
4443
4579
|
let initPromise = null;
|
|
4444
4580
|
async function doInitPlugins(engine) {
|
|
4445
|
-
engine.checkVersion("4.
|
|
4581
|
+
engine.checkVersion("4.4.0");
|
|
4446
4582
|
await engine.pluginManager.register(async (e) => {
|
|
4447
4583
|
const emittersRegister = async (engine) => {
|
|
4448
4584
|
await loadEmittersPluginSimple(engine);
|
|
@@ -4497,7 +4633,7 @@
|
|
|
4497
4633
|
}
|
|
4498
4634
|
else {
|
|
4499
4635
|
subId = id;
|
|
4500
|
-
subOptions = idOrOptions ??
|
|
4636
|
+
subOptions = idOrOptions ?? options;
|
|
4501
4637
|
}
|
|
4502
4638
|
return setRibbons(tsParticles, {
|
|
4503
4639
|
id: subId,
|
|
@@ -4509,7 +4645,7 @@
|
|
|
4509
4645
|
ribbons.init = async () => {
|
|
4510
4646
|
await initPlugins(tsParticles);
|
|
4511
4647
|
};
|
|
4512
|
-
ribbons.version = "4.
|
|
4648
|
+
ribbons.version = "4.4.0";
|
|
4513
4649
|
globalThis.ribbons = ribbons;
|
|
4514
4650
|
|
|
4515
4651
|
const globalObject = globalThis;
|
|
@@ -4634,7 +4770,11 @@
|
|
|
4634
4770
|
if (!fColor && !sColor) {
|
|
4635
4771
|
return;
|
|
4636
4772
|
}
|
|
4637
|
-
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
|
|
4773
|
+
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
|
|
4774
|
+
? getStyleFromHsl(fColor, container.hdr, fillOpacity * opacity, container.peakNits, container.hdrMode)
|
|
4775
|
+
: undefined, stroke = sColor
|
|
4776
|
+
? getStyleFromHsl(sColor, container.hdr, strokeOpacity * opacity, container.peakNits, container.hdrMode)
|
|
4777
|
+
: fill;
|
|
4638
4778
|
transform.a = transform.b = transform.c = transform.d = undefined;
|
|
4639
4779
|
colorStyles.fill = fill;
|
|
4640
4780
|
colorStyles.stroke = stroke;
|
|
@@ -4968,7 +5108,9 @@
|
|
|
4968
5108
|
if (typeof background.element === "string") {
|
|
4969
5109
|
if (typeof document !== "undefined") {
|
|
4970
5110
|
const node = document.querySelector(background.element);
|
|
4971
|
-
if (
|
|
5111
|
+
if ((typeof HTMLCanvasElement !== "undefined" && node instanceof HTMLCanvasElement) ||
|
|
5112
|
+
(typeof HTMLVideoElement !== "undefined" && node instanceof HTMLVideoElement) ||
|
|
5113
|
+
(typeof HTMLImageElement !== "undefined" && node instanceof HTMLImageElement)) {
|
|
4972
5114
|
this.#backgroundElement = node;
|
|
4973
5115
|
}
|
|
4974
5116
|
else if (node) {
|
|
@@ -4979,10 +5121,10 @@
|
|
|
4979
5121
|
}
|
|
4980
5122
|
}
|
|
4981
5123
|
}
|
|
4982
|
-
else if (background.element instanceof HTMLCanvasElement ||
|
|
4983
|
-
background.element instanceof OffscreenCanvas ||
|
|
4984
|
-
background.element instanceof HTMLVideoElement ||
|
|
4985
|
-
background.element instanceof HTMLImageElement) {
|
|
5124
|
+
else if ((typeof HTMLCanvasElement !== "undefined" && background.element instanceof HTMLCanvasElement) ||
|
|
5125
|
+
(typeof OffscreenCanvas !== "undefined" && background.element instanceof OffscreenCanvas) ||
|
|
5126
|
+
(typeof HTMLVideoElement !== "undefined" && background.element instanceof HTMLVideoElement) ||
|
|
5127
|
+
(typeof HTMLImageElement !== "undefined" && background.element instanceof HTMLImageElement)) {
|
|
4986
5128
|
this.#backgroundElement = background.element;
|
|
4987
5129
|
}
|
|
4988
5130
|
}
|
|
@@ -5050,6 +5192,7 @@
|
|
|
5050
5192
|
zoom = defaultZoom;
|
|
5051
5193
|
#container;
|
|
5052
5194
|
#generated;
|
|
5195
|
+
#hdrMediaListeners;
|
|
5053
5196
|
#mutationObserver;
|
|
5054
5197
|
#originalStyle;
|
|
5055
5198
|
#pluginManager;
|
|
@@ -5114,7 +5257,6 @@
|
|
|
5114
5257
|
});
|
|
5115
5258
|
this.resize();
|
|
5116
5259
|
this.#initStyle();
|
|
5117
|
-
this.initBackground();
|
|
5118
5260
|
this.#safeMutationObserver(obs => {
|
|
5119
5261
|
const element = this.domElement;
|
|
5120
5262
|
if (!element || !(element instanceof Node)) {
|
|
@@ -5124,6 +5266,8 @@
|
|
|
5124
5266
|
});
|
|
5125
5267
|
this.initPlugins();
|
|
5126
5268
|
this.#initContext();
|
|
5269
|
+
this.initBackground();
|
|
5270
|
+
this.#initHdrListeners();
|
|
5127
5271
|
this.render.init();
|
|
5128
5272
|
}
|
|
5129
5273
|
initBackground() {
|
|
@@ -5133,7 +5277,8 @@
|
|
|
5133
5277
|
}
|
|
5134
5278
|
const elementStyle = element.style, color = rangeColorToRgb(this.#pluginManager, background.color);
|
|
5135
5279
|
if (color) {
|
|
5136
|
-
|
|
5280
|
+
const hdrOptions = container.actualOptions.hdr;
|
|
5281
|
+
elementStyle.backgroundColor = getStyleFromRgb(color, container.hdr, background.opacity, hdrOptions.peakNits, hdrOptions.mode);
|
|
5137
5282
|
}
|
|
5138
5283
|
else {
|
|
5139
5284
|
elementStyle.backgroundColor = "";
|
|
@@ -5230,6 +5375,7 @@
|
|
|
5230
5375
|
obs.disconnect();
|
|
5231
5376
|
});
|
|
5232
5377
|
this.#mutationObserver = undefined;
|
|
5378
|
+
this.#removeHdrListeners();
|
|
5233
5379
|
this.render.stop();
|
|
5234
5380
|
}
|
|
5235
5381
|
async windowResize() {
|
|
@@ -5249,9 +5395,16 @@
|
|
|
5249
5395
|
}
|
|
5250
5396
|
}
|
|
5251
5397
|
#initContext() {
|
|
5252
|
-
const container = this.#container, canSupportHdr = container.actualOptions.hdr &&
|
|
5398
|
+
const container = this.#container, canSupportHdr = container.actualOptions.hdr.enable &&
|
|
5253
5399
|
safeMatchMedia("(color-gamut: p3)")?.matches &&
|
|
5254
5400
|
safeMatchMedia("(dynamic-range: high)")?.matches;
|
|
5401
|
+
container.hdr = canSupportHdr ?? false;
|
|
5402
|
+
container.hdrMode = container.actualOptions.hdr.mode;
|
|
5403
|
+
container.peakNits = container.actualOptions.hdr.peakNits;
|
|
5404
|
+
const renderCanvas = this.renderCanvas;
|
|
5405
|
+
if (!renderCanvas) {
|
|
5406
|
+
return;
|
|
5407
|
+
}
|
|
5255
5408
|
this.render.setContextSettings({
|
|
5256
5409
|
alpha: true,
|
|
5257
5410
|
desynchronized: true,
|
|
@@ -5260,11 +5413,47 @@
|
|
|
5260
5413
|
? { colorSpace: "display-p3", colorType: "float16" }
|
|
5261
5414
|
: { colorSpace: "srgb" }),
|
|
5262
5415
|
});
|
|
5263
|
-
|
|
5264
|
-
|
|
5265
|
-
|
|
5416
|
+
let context;
|
|
5417
|
+
try {
|
|
5418
|
+
context = renderCanvas.getContext("2d", this.render.settings);
|
|
5419
|
+
}
|
|
5420
|
+
catch {
|
|
5421
|
+
context = null;
|
|
5422
|
+
}
|
|
5423
|
+
if (canSupportHdr && !context) {
|
|
5424
|
+
container.hdr = false;
|
|
5425
|
+
const sdrSettings = {
|
|
5426
|
+
alpha: true,
|
|
5427
|
+
desynchronized: true,
|
|
5428
|
+
willReadFrequently: false,
|
|
5429
|
+
colorSpace: "srgb",
|
|
5430
|
+
};
|
|
5431
|
+
this.render.setContextSettings(sdrSettings);
|
|
5432
|
+
try {
|
|
5433
|
+
context = renderCanvas.getContext("2d", sdrSettings);
|
|
5434
|
+
}
|
|
5435
|
+
catch {
|
|
5436
|
+
context = null;
|
|
5437
|
+
}
|
|
5438
|
+
}
|
|
5439
|
+
this.render.setContext(context);
|
|
5440
|
+
}
|
|
5441
|
+
#initHdrListeners() {
|
|
5442
|
+
this.#removeHdrListeners();
|
|
5443
|
+
const p3Query = safeMatchMedia("(color-gamut: p3)"), hdrQuery = safeMatchMedia("(dynamic-range: high)"), handleChange = () => {
|
|
5444
|
+
this.#recreateRenderCanvas();
|
|
5445
|
+
this.#initContext();
|
|
5446
|
+
this.initBackground();
|
|
5447
|
+
}, listeners = [];
|
|
5448
|
+
if (p3Query) {
|
|
5449
|
+
p3Query.addEventListener("change", handleChange);
|
|
5450
|
+
listeners.push({ handler: handleChange, mql: p3Query });
|
|
5451
|
+
}
|
|
5452
|
+
if (hdrQuery) {
|
|
5453
|
+
hdrQuery.addEventListener("change", handleChange);
|
|
5454
|
+
listeners.push({ handler: handleChange, mql: hdrQuery });
|
|
5266
5455
|
}
|
|
5267
|
-
this
|
|
5456
|
+
this.#hdrMediaListeners = listeners;
|
|
5268
5457
|
}
|
|
5269
5458
|
#initStyle() {
|
|
5270
5459
|
const element = this.domElement, options = this.#container.actualOptions;
|
|
@@ -5288,6 +5477,25 @@
|
|
|
5288
5477
|
element.style.setProperty(key, value, "important");
|
|
5289
5478
|
}
|
|
5290
5479
|
}
|
|
5480
|
+
#recreateRenderCanvas() {
|
|
5481
|
+
const renderCanvas = this.renderCanvas;
|
|
5482
|
+
if (!renderCanvas) {
|
|
5483
|
+
return;
|
|
5484
|
+
}
|
|
5485
|
+
if (this.domElement) {
|
|
5486
|
+
return;
|
|
5487
|
+
}
|
|
5488
|
+
this.renderCanvas = new OffscreenCanvas(renderCanvas.width, renderCanvas.height);
|
|
5489
|
+
}
|
|
5490
|
+
#removeHdrListeners() {
|
|
5491
|
+
if (!this.#hdrMediaListeners) {
|
|
5492
|
+
return;
|
|
5493
|
+
}
|
|
5494
|
+
for (const { handler, mql } of this.#hdrMediaListeners) {
|
|
5495
|
+
mql.removeEventListener("change", handler);
|
|
5496
|
+
}
|
|
5497
|
+
this.#hdrMediaListeners = undefined;
|
|
5498
|
+
}
|
|
5291
5499
|
#repairStyle() {
|
|
5292
5500
|
const element = this.domElement;
|
|
5293
5501
|
if (!element) {
|
|
@@ -5672,9 +5880,9 @@
|
|
|
5672
5880
|
}
|
|
5673
5881
|
getOpacity() {
|
|
5674
5882
|
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;
|
|
5675
|
-
this.#cachedOpacityData.fillOpacity =
|
|
5883
|
+
this.#cachedOpacityData.fillOpacity = fillOpacity;
|
|
5676
5884
|
this.#cachedOpacityData.opacity = opacity * zOpacityFactor;
|
|
5677
|
-
this.#cachedOpacityData.strokeOpacity =
|
|
5885
|
+
this.#cachedOpacityData.strokeOpacity = strokeOpacity;
|
|
5678
5886
|
return this.#cachedOpacityData;
|
|
5679
5887
|
}
|
|
5680
5888
|
getPosition() {
|
|
@@ -6529,6 +6737,7 @@
|
|
|
6529
6737
|
effectDrawers;
|
|
6530
6738
|
fpsLimit;
|
|
6531
6739
|
hdr;
|
|
6740
|
+
hdrMode;
|
|
6532
6741
|
id;
|
|
6533
6742
|
pageHidden;
|
|
6534
6743
|
particleCreatedPlugins;
|
|
@@ -6536,6 +6745,7 @@
|
|
|
6536
6745
|
particlePositionPlugins;
|
|
6537
6746
|
particleUpdaters;
|
|
6538
6747
|
particles;
|
|
6748
|
+
peakNits;
|
|
6539
6749
|
plugins;
|
|
6540
6750
|
retina;
|
|
6541
6751
|
shapeDrawers;
|
|
@@ -6566,6 +6776,8 @@
|
|
|
6566
6776
|
this.id = Symbol(id);
|
|
6567
6777
|
this.fpsLimit = 120;
|
|
6568
6778
|
this.hdr = false;
|
|
6779
|
+
this.hdrMode = exports.HdrMode.standard;
|
|
6780
|
+
this.peakNits = 400;
|
|
6569
6781
|
this.#smooth = false;
|
|
6570
6782
|
this.#delay = 0;
|
|
6571
6783
|
this.#duration = 0;
|
|
@@ -6705,8 +6917,9 @@
|
|
|
6705
6917
|
this.updateActualOptions();
|
|
6706
6918
|
this.canvas.initBackground();
|
|
6707
6919
|
this.canvas.resize();
|
|
6708
|
-
const { delay, duration, fpsLimit,
|
|
6709
|
-
this.
|
|
6920
|
+
const { delay, duration, fpsLimit, smooth, zLayers } = this.actualOptions, hdrOptions = this.actualOptions.hdr;
|
|
6921
|
+
this.hdrMode = hdrOptions.mode;
|
|
6922
|
+
this.peakNits = hdrOptions.peakNits;
|
|
6710
6923
|
this.zLayers = zLayers;
|
|
6711
6924
|
this.#duration = getRangeValue(duration) * millisecondsToSeconds$1;
|
|
6712
6925
|
this.#delay = getRangeValue(delay) * millisecondsToSeconds$1;
|
|
@@ -7703,6 +7916,7 @@
|
|
|
7703
7916
|
exports.ColorAnimation = ColorAnimation;
|
|
7704
7917
|
exports.Fill = Fill;
|
|
7705
7918
|
exports.FullScreen = FullScreen;
|
|
7919
|
+
exports.HDROptions = HDROptions;
|
|
7706
7920
|
exports.HslAnimation = HslAnimation;
|
|
7707
7921
|
exports.Move = Move;
|
|
7708
7922
|
exports.MoveAngle = MoveAngle;
|