@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.
@@ -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.3.2 */
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.3.2";
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 = true;
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
- loadProperty(this, "hdr", data.hdr);
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, hdrAnimationScale = sdrReferenceWhiteNits / maxNits;
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 = `rgb-${color.r.toFixed(rgbPrecision)}-${color.g.toFixed(rgbPrecision)}-${color.b.toFixed(rgbPrecision)}-${hdr ? "hdr" : "sdr"}-${op.toString()}`;
2035
- return getCachedStyle(key, () => (hdr ? getHdrStyleFromRgb(color, opacity) : getSdrStyleFromRgb(color, opacity)));
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 getHdrStyleFromRgb(color, opacity, peakNits = maxNits) {
2038
- const headroom = peakNits / sdrReferenceWhiteNits;
2039
- return `color(display-p3 ${((color.r / rgbMax) * headroom).toString()} ${((color.g / rgbMax) * headroom).toString()} ${((color.b / rgbMax) * headroom).toString()} / ${(opacity ?? defaultOpacity$1).toString()})`;
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 = `hsl-${color.h.toFixed(hslPrecision)}-${color.s.toFixed(hslPrecision)}-${color.l.toFixed(hslPrecision)}-${hdr ? "hdr" : "sdr"}-${op.toString()}`;
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, hdr) {
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 = ((data.velocity ?? minVelocity) * delta.factor + offset * velocityFactor) * (hdr ? hdrAnimationScale : identity), decay = data.decay ?? identity, max = data.max, min = data.min;
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, hdr);
2213
- updateColorValue(s, true, delta, hdr);
2214
- updateColorValue(l, true, delta, hdr);
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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.3.2");
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 drawRibbon(data, hdr) {
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
- drawPolygonSegment(context, {
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
- drawPolygonSegment(context, {
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
- drawPolygonSegment(context, {
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.3.2");
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.3.2");
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.3.2";
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 ? getStyleFromHsl(fColor, container.hdr, fillOpacity * opacity) : undefined, stroke = sColor ? getStyleFromHsl(sColor, container.hdr, strokeOpacity * opacity) : fill;
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 (node instanceof HTMLCanvasElement || node instanceof HTMLVideoElement || node instanceof HTMLImageElement) {
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
- elementStyle.backgroundColor = getStyleFromRgb(color, container.actualOptions.hdr, background.opacity);
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
- const renderCanvas = this.renderCanvas;
5264
- if (!renderCanvas) {
5265
- return;
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.render.setContext(renderCanvas.getContext("2d", this.render.settings));
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 = opacity * fillOpacity * zOpacityFactor;
5883
+ this.#cachedOpacityData.fillOpacity = fillOpacity;
5676
5884
  this.#cachedOpacityData.opacity = opacity * zOpacityFactor;
5677
- this.#cachedOpacityData.strokeOpacity = opacity * strokeOpacity * zOpacityFactor;
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, hdr, smooth, zLayers } = this.actualOptions;
6709
- this.hdr = hdr;
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;