@tsparticles/confetti 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
- /* tsParticles v4.3.1 */
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) :
@@ -332,6 +332,9 @@
332
332
  })(exports.PixelMode || (exports.PixelMode = {}));
333
333
 
334
334
  const minRadius = 0;
335
+ function isForbiddenKey(key) {
336
+ return key === "__proto__" || key === "constructor" || key === "prototype";
337
+ }
335
338
  function hasMatchMedia() {
336
339
  return typeof matchMedia !== "undefined";
337
340
  }
@@ -407,7 +410,7 @@
407
410
  if (!hasNested) {
408
411
  const sourceDict = source, destDict = destination;
409
412
  for (const key of sourceKeys) {
410
- if (key === "__proto__" || key === "constructor" || key === "prototype") {
413
+ if (isForbiddenKey(key)) {
411
414
  continue;
412
415
  }
413
416
  const v = sourceDict[key];
@@ -418,7 +421,7 @@
418
421
  continue;
419
422
  }
420
423
  for (const key of sourceKeys) {
421
- if (key === "__proto__" || key === "constructor" || key === "prototype") {
424
+ if (isForbiddenKey(key)) {
422
425
  continue;
423
426
  }
424
427
  const sourceDict = source, destDict = destination, value = sourceDict[key];
@@ -877,7 +880,7 @@
877
880
  return this.#domArray;
878
881
  }
879
882
  get version() {
880
- return "4.3.1";
883
+ return "4.4.0";
881
884
  }
882
885
  addEventListener(type, listener) {
883
886
  this.#eventDispatcher.addEventListener(type, listener);
@@ -958,6 +961,10 @@
958
961
  }
959
962
 
960
963
  function initEngine() {
964
+ const existing = globalThis.tsParticles;
965
+ if (existing?.pluginManager) {
966
+ return existing;
967
+ }
961
968
  return new Engine();
962
969
  }
963
970
 
@@ -1055,6 +1062,15 @@
1055
1062
  AnimationMode["random"] = "random";
1056
1063
  })(exports.AnimationMode || (exports.AnimationMode = {}));
1057
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
+
1058
1074
  exports.LimitMode = void 0;
1059
1075
  (function (LimitMode) {
1060
1076
  LimitMode["delete"] = "delete";
@@ -1160,7 +1176,12 @@
1160
1176
  }
1161
1177
  function loadExtendProperty(obj, key, value) {
1162
1178
  if (value !== undefined) {
1163
- obj[key] = deepExtend(obj[key] ?? {}, value);
1179
+ const keyStr = key;
1180
+ if (keyStr === "__proto__" || keyStr === "constructor" || keyStr === "prototype") {
1181
+ return;
1182
+ }
1183
+ const objRecord = obj, currentValue = Object.prototype.hasOwnProperty.call(objRecord, keyStr) ? objRecord[keyStr] : {};
1184
+ objRecord[keyStr] = deepExtend(currentValue, value);
1164
1185
  }
1165
1186
  }
1166
1187
  function loadOptionProperty(obj, key, optionClass, ...sources) {
@@ -1315,6 +1336,29 @@
1315
1336
  }
1316
1337
  }
1317
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
+
1318
1362
  class ResizeEvent extends OptionLoader {
1319
1363
  delay = 0.5;
1320
1364
  enable = true;
@@ -1758,7 +1802,7 @@
1758
1802
  duration = 0;
1759
1803
  fpsLimit = 120;
1760
1804
  fullScreen;
1761
- hdr = true;
1805
+ hdr;
1762
1806
  key;
1763
1807
  name;
1764
1808
  palette;
@@ -1778,6 +1822,7 @@
1778
1822
  this.#container = container;
1779
1823
  this.background = new Background();
1780
1824
  this.fullScreen = new FullScreen();
1825
+ this.hdr = new HDROptions();
1781
1826
  this.particles = loadParticlesOptions(this.#pluginManager, this.#container);
1782
1827
  this.resize = new ResizeEvent();
1783
1828
  }
@@ -1800,7 +1845,15 @@
1800
1845
  loadProperty(this, "detectRetina", data.detectRetina);
1801
1846
  loadRangeProperty(this, "duration", data.duration);
1802
1847
  loadProperty(this, "fpsLimit", data.fpsLimit);
1803
- 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
+ }
1804
1857
  loadProperty(this, "pauseOnBlur", data.pauseOnBlur);
1805
1858
  loadProperty(this, "pauseOnOutsideViewport", data.pauseOnOutsideViewport);
1806
1859
  loadProperty(this, "zLayers", data.zLayers);
@@ -1843,7 +1896,7 @@
1843
1896
  }
1844
1897
  }
1845
1898
 
1846
- 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;
1847
1900
  function getCachedStyle(key, generator) {
1848
1901
  let cached = styleCache.get(key);
1849
1902
  if (!cached) {
@@ -1855,6 +1908,48 @@
1855
1908
  }
1856
1909
  return cached;
1857
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
+ }
1858
1953
  function stringToRgba(pluginManager, input) {
1859
1954
  if (!input) {
1860
1955
  return;
@@ -2022,30 +2117,65 @@
2022
2117
  r: getRgbInRangeValue(),
2023
2118
  };
2024
2119
  }
2025
- function getStyleFromRgb(color, hdr, opacity) {
2026
- const rgbPrecision = hdr ? hdrRgbFixedPrecision : rgbFixedPrecision, op = opacity ?? defaultOpacity$2, key = `rgb-${color.r.toFixed(rgbPrecision)}-${color.g.toFixed(rgbPrecision)}-${color.b.toFixed(rgbPrecision)}-${hdr ? "hdr" : "sdr"}-${op.toString()}`;
2027
- 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$2, 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));
2028
2125
  }
2029
- function getHdrStyleFromRgb(color, opacity, peakNits = maxNits) {
2030
- const headroom = peakNits / sdrReferenceWhiteNits;
2031
- return `color(display-p3 ${((color.r / rgbMax) * headroom).toString()} ${((color.g / rgbMax) * headroom).toString()} ${((color.b / rgbMax) * headroom).toString()} / ${(opacity ?? defaultOpacity$2).toString()})`;
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$2).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);
2137
+ }
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);
2032
2144
  }
2033
2145
  function getSdrStyleFromRgb(color, opacity) {
2034
2146
  return `rgba(${color.r.toString()}, ${color.g.toString()}, ${color.b.toString()}, ${(opacity ?? defaultOpacity$2).toString()})`;
2035
2147
  }
2036
- function getStyleFromHsl(color, hdr, opacity) {
2037
- const hslPrecision = hdr ? hdrHslFixedPrecision : hslFixedPrecision, op = opacity ?? defaultOpacity$2, 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$2, 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()}`;
2038
2152
  return getCachedStyle(key, () => hdr
2039
- ? getStyleFromRgb(hslToRgbFloat(color), true, opacity)
2153
+ ? getStyleFromRgb(hslToRgbFloat(color), true, opacity, peakNits, mode)
2040
2154
  : `hsla(${color.h.toString()}, ${color.s.toString()}%, ${color.l.toString()}%, ${op.toString()})`);
2041
2155
  }
2042
- function colorMix(color1, color2, size1, size2) {
2156
+ function colorMix(color1, color2, size1, size2, hdr) {
2043
2157
  let rgb1 = color1, rgb2 = color2;
2044
2158
  if (!("r" in rgb1)) {
2045
- rgb1 = hslToRgb(color1);
2159
+ rgb1 = hdr ? hslToRgbFloat(color1) : hslToRgb(color1);
2046
2160
  }
2047
2161
  if (!("r" in rgb2)) {
2048
- 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
+ };
2049
2179
  }
2050
2180
  return {
2051
2181
  b: mix(rgb1.b, rgb2.b, size1, size2),
@@ -2053,14 +2183,14 @@
2053
2183
  r: mix(rgb1.r, rgb2.r, size1, size2),
2054
2184
  };
2055
2185
  }
2056
- function getLinkColor(p1, p2, linkColor) {
2186
+ function getLinkColor(p1, p2, linkColor, hdr) {
2057
2187
  if (linkColor === randomColorValue) {
2058
2188
  return getRandomRgbColor();
2059
2189
  }
2060
2190
  else if (linkColor === midColorValue) {
2061
2191
  const sourceColor = p1.getFillColor() ?? p1.getStrokeColor(), destColor = p2?.getFillColor() ?? p2?.getStrokeColor();
2062
2192
  if (sourceColor && destColor && p2) {
2063
- return colorMix(sourceColor, destColor, p1.getRadius(), p2.getRadius());
2193
+ return colorMix(sourceColor, destColor, p1.getRadius(), p2.getRadius(), hdr);
2064
2194
  }
2065
2195
  else {
2066
2196
  const hslColor = sourceColor ?? destColor;
@@ -2156,7 +2286,7 @@
2156
2286
  colorValue.velocity = defaultVelocity;
2157
2287
  }
2158
2288
  }
2159
- function updateColorValue(data, decrease, delta, hdr) {
2289
+ function updateColorValue(data, decrease, delta, _hdr) {
2160
2290
  const minLoops = 0, minDelay = 0, identity = 1, minVelocity = 0, minOffset = 0, velocityFactor = 3.6;
2161
2291
  if (!data.enable ||
2162
2292
  ((data.maxLoops ?? minLoops) > minLoops && (data.loops ?? minLoops) > (data.maxLoops ?? minLoops))) {
@@ -2169,7 +2299,7 @@
2169
2299
  if ((data.delayTime ?? minDelay) > minDelay && data.time < (data.delayTime ?? minDelay)) {
2170
2300
  return;
2171
2301
  }
2172
- 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;
2173
2303
  if (!decrease || data.status === exports.AnimationStatus.increasing) {
2174
2304
  data.value += velocity;
2175
2305
  if (data.value > max) {
@@ -2201,9 +2331,9 @@
2201
2331
  return;
2202
2332
  }
2203
2333
  const { h, s, l } = color;
2204
- updateColorValue(h, false, delta, hdr);
2205
- updateColorValue(s, true, delta, hdr);
2206
- updateColorValue(l, true, delta, hdr);
2334
+ updateColorValue(h, false, delta);
2335
+ updateColorValue(s, true, delta);
2336
+ updateColorValue(l, true, delta);
2207
2337
  }
2208
2338
  function alterHsl(color, type, value) {
2209
2339
  return {
@@ -2253,7 +2383,7 @@
2253
2383
  }
2254
2384
 
2255
2385
  async function loadBlendPlugin(engine) {
2256
- engine.checkVersion("4.3.1");
2386
+ engine.checkVersion("4.4.0");
2257
2387
  await engine.pluginManager.register(e => {
2258
2388
  e.pluginManager.addPlugin(new BlendPlugin());
2259
2389
  });
@@ -2290,7 +2420,7 @@
2290
2420
  }
2291
2421
 
2292
2422
  async function loadCircleShape(engine) {
2293
- engine.checkVersion("4.3.1");
2423
+ engine.checkVersion("4.4.0");
2294
2424
  await engine.pluginManager.register(e => {
2295
2425
  e.pluginManager.addShape(["circle"], () => {
2296
2426
  return Promise.resolve(new CircleDrawer());
@@ -2338,7 +2468,7 @@
2338
2468
  }
2339
2469
 
2340
2470
  async function loadHexColorPlugin(engine) {
2341
- engine.checkVersion("4.3.1");
2471
+ engine.checkVersion("4.4.0");
2342
2472
  await engine.pluginManager.register(e => {
2343
2473
  e.pluginManager.addColorManager("hex", new HexColorManager());
2344
2474
  });
@@ -2391,7 +2521,7 @@
2391
2521
  }
2392
2522
 
2393
2523
  async function loadHslColorPlugin(engine) {
2394
- engine.checkVersion("4.3.1");
2524
+ engine.checkVersion("4.4.0");
2395
2525
  await engine.pluginManager.register(e => {
2396
2526
  e.pluginManager.addColorManager("hsl", new HslColorManager());
2397
2527
  });
@@ -2415,7 +2545,7 @@
2415
2545
  }
2416
2546
 
2417
2547
  async function loadMovePlugin(engine) {
2418
- engine.checkVersion("4.3.1");
2548
+ engine.checkVersion("4.4.0");
2419
2549
  await engine.pluginManager.register(e => {
2420
2550
  const moveEngine = e, movePluginManager = moveEngine.pluginManager;
2421
2551
  movePluginManager.initializers.pathGenerators ??= new Map();
@@ -2631,7 +2761,7 @@
2631
2761
  }
2632
2762
 
2633
2763
  async function loadOpacityUpdater(engine) {
2634
- engine.checkVersion("4.3.1");
2764
+ engine.checkVersion("4.4.0");
2635
2765
  await engine.pluginManager.register(e => {
2636
2766
  e.pluginManager.addParticleUpdater("opacity", container => {
2637
2767
  return Promise.resolve(new OpacityUpdater(container));
@@ -2976,7 +3106,7 @@
2976
3106
  }
2977
3107
 
2978
3108
  async function loadOutModesUpdater(engine) {
2979
- engine.checkVersion("4.3.1");
3109
+ engine.checkVersion("4.4.0");
2980
3110
  await engine.pluginManager.register(e => {
2981
3111
  e.pluginManager.addParticleUpdater("outModes", container => {
2982
3112
  return Promise.resolve(new OutOfCanvasUpdater(container));
@@ -3047,7 +3177,7 @@
3047
3177
  }
3048
3178
 
3049
3179
  async function loadPaintUpdater(engine) {
3050
- engine.checkVersion("4.3.1");
3180
+ engine.checkVersion("4.4.0");
3051
3181
  await engine.pluginManager.register(e => {
3052
3182
  e.pluginManager.addParticleUpdater("paint", container => {
3053
3183
  return Promise.resolve(new PaintUpdater(e.pluginManager, container));
@@ -3102,7 +3232,7 @@
3102
3232
  }
3103
3233
 
3104
3234
  async function loadRgbColorPlugin(engine) {
3105
- engine.checkVersion("4.3.1");
3235
+ engine.checkVersion("4.4.0");
3106
3236
  await engine.pluginManager.register(e => {
3107
3237
  e.pluginManager.addColorManager("rgb", new RgbColorManager());
3108
3238
  });
@@ -3187,7 +3317,7 @@
3187
3317
  }
3188
3318
 
3189
3319
  async function loadSizeUpdater(engine) {
3190
- engine.checkVersion("4.3.1");
3320
+ engine.checkVersion("4.4.0");
3191
3321
  await engine.pluginManager.register(e => {
3192
3322
  e.pluginManager.addParticleUpdater("size", container => {
3193
3323
  return Promise.resolve(new SizeUpdater(container));
@@ -3196,7 +3326,7 @@
3196
3326
  }
3197
3327
 
3198
3328
  async function loadBasic(engine) {
3199
- engine.checkVersion("4.3.1");
3329
+ engine.checkVersion("4.4.0");
3200
3330
  await engine.pluginManager.register(async (e) => {
3201
3331
  await Promise.all([
3202
3332
  loadBlendPlugin(e),
@@ -3496,7 +3626,7 @@
3496
3626
  }
3497
3627
 
3498
3628
  async function loadClubsSuitShape(engine) {
3499
- engine.checkVersion("4.3.1");
3629
+ engine.checkVersion("4.4.0");
3500
3630
  await engine.pluginManager.register(e => {
3501
3631
  e.pluginManager.addShape(["club", "clubs"], () => Promise.resolve(new ClubDrawer()));
3502
3632
  });
@@ -3510,7 +3640,7 @@
3510
3640
  }
3511
3641
 
3512
3642
  async function loadDiamondsSuitShape(engine) {
3513
- engine.checkVersion("4.3.1");
3643
+ engine.checkVersion("4.4.0");
3514
3644
  await engine.pluginManager.register(e => {
3515
3645
  e.pluginManager.addShape(["diamond", "diamonds"], () => Promise.resolve(new DiamondDrawer()));
3516
3646
  });
@@ -3524,7 +3654,7 @@
3524
3654
  };
3525
3655
 
3526
3656
  async function loadHeartsSuitShape(engine) {
3527
- engine.checkVersion("4.3.1");
3657
+ engine.checkVersion("4.4.0");
3528
3658
  await engine.pluginManager.register(e => {
3529
3659
  e.pluginManager.addShape(["heart", "hearts"], () => Promise.resolve(new HeartDrawer$1()));
3530
3660
  });
@@ -3538,14 +3668,14 @@
3538
3668
  }
3539
3669
 
3540
3670
  async function loadSpadesSuitShape(engine) {
3541
- engine.checkVersion("4.3.1");
3671
+ engine.checkVersion("4.4.0");
3542
3672
  await engine.pluginManager.register(e => {
3543
3673
  e.pluginManager.addShape(["spade", "spades"], () => Promise.resolve(new SpadeDrawer()));
3544
3674
  });
3545
3675
  }
3546
3676
 
3547
3677
  async function loadCardSuitsShape(engine) {
3548
- engine.checkVersion("4.3.1");
3678
+ engine.checkVersion("4.4.0");
3549
3679
  await Promise.all([
3550
3680
  loadClubsSuitShape(engine),
3551
3681
  loadDiamondsSuitShape(engine),
@@ -3760,7 +3890,7 @@
3760
3890
  })(EmitterClickMode || (EmitterClickMode = {}));
3761
3891
 
3762
3892
  async function loadEmittersPluginSimple(engine) {
3763
- engine.checkVersion("4.3.1");
3893
+ engine.checkVersion("4.4.0");
3764
3894
  await engine.pluginManager.register(async (e) => {
3765
3895
  const instancesManager = await getEmittersInstancesManager(e);
3766
3896
  await addEmittersShapesManager(e);
@@ -3862,7 +3992,7 @@
3862
3992
  }
3863
3993
 
3864
3994
  async function loadEmojiShape(engine) {
3865
- engine.checkVersion("4.3.1");
3995
+ engine.checkVersion("4.4.0");
3866
3996
  await engine.pluginManager.register(e => {
3867
3997
  e.pluginManager.addShape(validTypes, () => Promise.resolve(new EmojiDrawer()));
3868
3998
  });
@@ -3888,7 +4018,7 @@
3888
4018
  }
3889
4019
 
3890
4020
  async function loadHeartShape(engine) {
3891
- engine.checkVersion("4.3.1");
4021
+ engine.checkVersion("4.4.0");
3892
4022
  await engine.pluginManager.register(e => {
3893
4023
  e.pluginManager.addShape(["heart"], () => Promise.resolve(new HeartDrawer()));
3894
4024
  });
@@ -3897,12 +4027,12 @@
3897
4027
  const shapeTypes = ["image", "images"];
3898
4028
  const stringStart = 0, defaultOpacity = 1;
3899
4029
  const currentColorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\((-?\d+%?[,\s]+){2,3}\s*[\d.]+%?\))|currentcolor/gi;
3900
- function replaceColorSvg(imageShape, color, opacity, hdr = false) {
4030
+ function replaceColorSvg(imageShape, color, opacity, hdr = false, peakNits, mode) {
3901
4031
  const { svgData } = imageShape;
3902
4032
  if (!svgData) {
3903
4033
  return "";
3904
4034
  }
3905
- const colorStyle = getStyleFromHsl(color, hdr, opacity);
4035
+ const colorStyle = getStyleFromHsl(color, hdr, opacity, peakNits, mode);
3906
4036
  if (svgData.includes("fill")) {
3907
4037
  return svgData.replaceAll(currentColorRegex, () => colorStyle);
3908
4038
  }
@@ -3944,8 +4074,8 @@
3944
4074
  }
3945
4075
  image.loading = false;
3946
4076
  }
3947
- function replaceImageColor(image, imageData, color, particle, hdr = false) {
3948
- const svgColoredData = replaceColorSvg(image, color, particle.opacity?.value ?? defaultOpacity, hdr), imageRes = {
4077
+ function replaceImageColor(image, imageData, color, particle, hdr = false, peakNits, mode) {
4078
+ const svgColoredData = replaceColorSvg(image, color, particle.opacity?.value ?? defaultOpacity, hdr, peakNits, mode), imageRes = {
3949
4079
  color,
3950
4080
  data: {
3951
4081
  ...image,
@@ -4057,7 +4187,7 @@
4057
4187
  void (async () => {
4058
4188
  let imageRes;
4059
4189
  if (image.svgData && color) {
4060
- imageRes = await replaceImageColor(image, imageData, color, particle, container.hdr);
4190
+ imageRes = await replaceImageColor(image, imageData, color, particle, container.hdr, container.peakNits, container.hdrMode);
4061
4191
  }
4062
4192
  else {
4063
4193
  imageRes = {
@@ -4194,7 +4324,7 @@
4194
4324
  };
4195
4325
  }
4196
4326
  async function loadImageShape(engine) {
4197
- engine.checkVersion("4.3.1");
4327
+ engine.checkVersion("4.4.0");
4198
4328
  await engine.pluginManager.register(e => {
4199
4329
  addLoadImageToEngine(e);
4200
4330
  e.pluginManager.addPlugin(new ImagePreloaderPlugin(e));
@@ -4339,7 +4469,7 @@
4339
4469
  }
4340
4470
 
4341
4471
  async function loadLifeUpdater(engine) {
4342
- engine.checkVersion("4.3.1");
4472
+ engine.checkVersion("4.4.0");
4343
4473
  await engine.pluginManager.register(e => {
4344
4474
  e.pluginManager.addParticleUpdater("life", container => {
4345
4475
  return Promise.resolve(new LifeUpdater(container));
@@ -4393,7 +4523,7 @@
4393
4523
  }
4394
4524
 
4395
4525
  async function loadMotionPlugin(engine) {
4396
- engine.checkVersion("4.3.1");
4526
+ engine.checkVersion("4.4.0");
4397
4527
  await engine.pluginManager.register(e => {
4398
4528
  e.pluginManager.addPlugin(new MotionPlugin());
4399
4529
  });
@@ -4478,19 +4608,19 @@
4478
4608
  }
4479
4609
 
4480
4610
  async function loadGenericPolygonShape(engine) {
4481
- engine.checkVersion("4.3.1");
4611
+ engine.checkVersion("4.4.0");
4482
4612
  await engine.pluginManager.register(e => {
4483
4613
  e.pluginManager.addShape(["polygon"], () => Promise.resolve(new PolygonDrawer()));
4484
4614
  });
4485
4615
  }
4486
4616
  async function loadTriangleShape(engine) {
4487
- engine.checkVersion("4.3.1");
4617
+ engine.checkVersion("4.4.0");
4488
4618
  await engine.pluginManager.register(e => {
4489
4619
  e.pluginManager.addShape(["triangle"], () => Promise.resolve(new TriangleDrawer()));
4490
4620
  });
4491
4621
  }
4492
4622
  async function loadPolygonShape(engine) {
4493
- engine.checkVersion("4.3.1");
4623
+ engine.checkVersion("4.4.0");
4494
4624
  await Promise.all([
4495
4625
  loadGenericPolygonShape(engine),
4496
4626
  loadTriangleShape(engine),
@@ -4624,7 +4754,7 @@
4624
4754
  }
4625
4755
 
4626
4756
  async function loadRollUpdater(engine) {
4627
- engine.checkVersion("4.3.1");
4757
+ engine.checkVersion("4.4.0");
4628
4758
  await engine.pluginManager.register(e => {
4629
4759
  e.pluginManager.addParticleUpdater("roll", () => {
4630
4760
  return Promise.resolve(new RollUpdater(e.pluginManager));
@@ -4730,7 +4860,7 @@
4730
4860
  }
4731
4861
 
4732
4862
  async function loadRotateUpdater(engine) {
4733
- engine.checkVersion("4.3.1");
4863
+ engine.checkVersion("4.4.0");
4734
4864
  await engine.pluginManager.register(e => {
4735
4865
  e.pluginManager.addParticleUpdater("rotate", container => {
4736
4866
  return Promise.resolve(new RotateUpdater(container));
@@ -4754,7 +4884,7 @@
4754
4884
  }
4755
4885
 
4756
4886
  async function loadSquareShape(engine) {
4757
- engine.checkVersion("4.3.1");
4887
+ engine.checkVersion("4.4.0");
4758
4888
  await engine.pluginManager.register(e => {
4759
4889
  e.pluginManager.addShape(["edge", "square"], () => Promise.resolve(new SquareDrawer()));
4760
4890
  });
@@ -4788,7 +4918,7 @@
4788
4918
  }
4789
4919
 
4790
4920
  async function loadStarShape(engine) {
4791
- engine.checkVersion("4.3.1");
4921
+ engine.checkVersion("4.4.0");
4792
4922
  await engine.pluginManager.register(e => {
4793
4923
  e.pluginManager.addShape(["star"], () => Promise.resolve(new StarDrawer()));
4794
4924
  });
@@ -4897,7 +5027,7 @@
4897
5027
  }
4898
5028
 
4899
5029
  async function loadTiltUpdater(engine) {
4900
- engine.checkVersion("4.3.1");
5030
+ engine.checkVersion("4.4.0");
4901
5031
  await engine.pluginManager.register(e => {
4902
5032
  e.pluginManager.addParticleUpdater("tilt", container => {
4903
5033
  return Promise.resolve(new TiltUpdater(container));
@@ -4999,7 +5129,7 @@
4999
5129
  }
5000
5130
 
5001
5131
  async function loadWobbleUpdater(engine) {
5002
- engine.checkVersion("4.3.1");
5132
+ engine.checkVersion("4.4.0");
5003
5133
  await engine.pluginManager.register(e => {
5004
5134
  e.pluginManager.addParticleUpdater("wobble", container => {
5005
5135
  return Promise.resolve(new WobbleUpdater(container));
@@ -5404,7 +5534,7 @@
5404
5534
 
5405
5535
  let initPromise = null;
5406
5536
  async function doInitPlugins(engine) {
5407
- engine.checkVersion("4.3.1");
5537
+ engine.checkVersion("4.4.0");
5408
5538
  await engine.pluginManager.register(async (e) => {
5409
5539
  await Promise.all([
5410
5540
  loadBasic(e),
@@ -5477,7 +5607,7 @@
5477
5607
  confetti.init = async () => {
5478
5608
  await initPlugins(tsParticles);
5479
5609
  };
5480
- confetti.version = "4.3.1";
5610
+ confetti.version = "4.4.0";
5481
5611
  globalThis.confetti = confetti;
5482
5612
 
5483
5613
  const globalObject = globalThis;
@@ -5602,7 +5732,11 @@
5602
5732
  if (!fColor && !sColor) {
5603
5733
  return;
5604
5734
  }
5605
- 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;
5735
+ 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
5736
+ ? getStyleFromHsl(fColor, container.hdr, fillOpacity * opacity, container.peakNits, container.hdrMode)
5737
+ : undefined, stroke = sColor
5738
+ ? getStyleFromHsl(sColor, container.hdr, strokeOpacity * opacity, container.peakNits, container.hdrMode)
5739
+ : fill;
5606
5740
  transform.a = transform.b = transform.c = transform.d = undefined;
5607
5741
  colorStyles.fill = fill;
5608
5742
  colorStyles.stroke = stroke;
@@ -5936,7 +6070,9 @@
5936
6070
  if (typeof background.element === "string") {
5937
6071
  if (typeof document !== "undefined") {
5938
6072
  const node = document.querySelector(background.element);
5939
- if (node instanceof HTMLCanvasElement || node instanceof HTMLVideoElement || node instanceof HTMLImageElement) {
6073
+ if ((typeof HTMLCanvasElement !== "undefined" && node instanceof HTMLCanvasElement) ||
6074
+ (typeof HTMLVideoElement !== "undefined" && node instanceof HTMLVideoElement) ||
6075
+ (typeof HTMLImageElement !== "undefined" && node instanceof HTMLImageElement)) {
5940
6076
  this.#backgroundElement = node;
5941
6077
  }
5942
6078
  else if (node) {
@@ -5947,10 +6083,10 @@
5947
6083
  }
5948
6084
  }
5949
6085
  }
5950
- else if (background.element instanceof HTMLCanvasElement ||
5951
- background.element instanceof OffscreenCanvas ||
5952
- background.element instanceof HTMLVideoElement ||
5953
- background.element instanceof HTMLImageElement) {
6086
+ else if ((typeof HTMLCanvasElement !== "undefined" && background.element instanceof HTMLCanvasElement) ||
6087
+ (typeof OffscreenCanvas !== "undefined" && background.element instanceof OffscreenCanvas) ||
6088
+ (typeof HTMLVideoElement !== "undefined" && background.element instanceof HTMLVideoElement) ||
6089
+ (typeof HTMLImageElement !== "undefined" && background.element instanceof HTMLImageElement)) {
5954
6090
  this.#backgroundElement = background.element;
5955
6091
  }
5956
6092
  }
@@ -6018,6 +6154,7 @@
6018
6154
  zoom = defaultZoom;
6019
6155
  #container;
6020
6156
  #generated;
6157
+ #hdrMediaListeners;
6021
6158
  #mutationObserver;
6022
6159
  #originalStyle;
6023
6160
  #pluginManager;
@@ -6082,7 +6219,6 @@
6082
6219
  });
6083
6220
  this.resize();
6084
6221
  this.#initStyle();
6085
- this.initBackground();
6086
6222
  this.#safeMutationObserver(obs => {
6087
6223
  const element = this.domElement;
6088
6224
  if (!element || !(element instanceof Node)) {
@@ -6092,6 +6228,8 @@
6092
6228
  });
6093
6229
  this.initPlugins();
6094
6230
  this.#initContext();
6231
+ this.initBackground();
6232
+ this.#initHdrListeners();
6095
6233
  this.render.init();
6096
6234
  }
6097
6235
  initBackground() {
@@ -6101,7 +6239,8 @@
6101
6239
  }
6102
6240
  const elementStyle = element.style, color = rangeColorToRgb(this.#pluginManager, background.color);
6103
6241
  if (color) {
6104
- elementStyle.backgroundColor = getStyleFromRgb(color, container.actualOptions.hdr, background.opacity);
6242
+ const hdrOptions = container.actualOptions.hdr;
6243
+ elementStyle.backgroundColor = getStyleFromRgb(color, container.hdr, background.opacity, hdrOptions.peakNits, hdrOptions.mode);
6105
6244
  }
6106
6245
  else {
6107
6246
  elementStyle.backgroundColor = "";
@@ -6198,6 +6337,7 @@
6198
6337
  obs.disconnect();
6199
6338
  });
6200
6339
  this.#mutationObserver = undefined;
6340
+ this.#removeHdrListeners();
6201
6341
  this.render.stop();
6202
6342
  }
6203
6343
  async windowResize() {
@@ -6217,9 +6357,16 @@
6217
6357
  }
6218
6358
  }
6219
6359
  #initContext() {
6220
- const container = this.#container, canSupportHdr = container.actualOptions.hdr &&
6360
+ const container = this.#container, canSupportHdr = container.actualOptions.hdr.enable &&
6221
6361
  safeMatchMedia("(color-gamut: p3)")?.matches &&
6222
6362
  safeMatchMedia("(dynamic-range: high)")?.matches;
6363
+ container.hdr = canSupportHdr ?? false;
6364
+ container.hdrMode = container.actualOptions.hdr.mode;
6365
+ container.peakNits = container.actualOptions.hdr.peakNits;
6366
+ const renderCanvas = this.renderCanvas;
6367
+ if (!renderCanvas) {
6368
+ return;
6369
+ }
6223
6370
  this.render.setContextSettings({
6224
6371
  alpha: true,
6225
6372
  desynchronized: true,
@@ -6228,11 +6375,47 @@
6228
6375
  ? { colorSpace: "display-p3", colorType: "float16" }
6229
6376
  : { colorSpace: "srgb" }),
6230
6377
  });
6231
- const renderCanvas = this.renderCanvas;
6232
- if (!renderCanvas) {
6233
- return;
6378
+ let context;
6379
+ try {
6380
+ context = renderCanvas.getContext("2d", this.render.settings);
6234
6381
  }
6235
- this.render.setContext(renderCanvas.getContext("2d", this.render.settings));
6382
+ catch {
6383
+ context = null;
6384
+ }
6385
+ if (canSupportHdr && !context) {
6386
+ container.hdr = false;
6387
+ const sdrSettings = {
6388
+ alpha: true,
6389
+ desynchronized: true,
6390
+ willReadFrequently: false,
6391
+ colorSpace: "srgb",
6392
+ };
6393
+ this.render.setContextSettings(sdrSettings);
6394
+ try {
6395
+ context = renderCanvas.getContext("2d", sdrSettings);
6396
+ }
6397
+ catch {
6398
+ context = null;
6399
+ }
6400
+ }
6401
+ this.render.setContext(context);
6402
+ }
6403
+ #initHdrListeners() {
6404
+ this.#removeHdrListeners();
6405
+ const p3Query = safeMatchMedia("(color-gamut: p3)"), hdrQuery = safeMatchMedia("(dynamic-range: high)"), handleChange = () => {
6406
+ this.#recreateRenderCanvas();
6407
+ this.#initContext();
6408
+ this.initBackground();
6409
+ }, listeners = [];
6410
+ if (p3Query) {
6411
+ p3Query.addEventListener("change", handleChange);
6412
+ listeners.push({ handler: handleChange, mql: p3Query });
6413
+ }
6414
+ if (hdrQuery) {
6415
+ hdrQuery.addEventListener("change", handleChange);
6416
+ listeners.push({ handler: handleChange, mql: hdrQuery });
6417
+ }
6418
+ this.#hdrMediaListeners = listeners;
6236
6419
  }
6237
6420
  #initStyle() {
6238
6421
  const element = this.domElement, options = this.#container.actualOptions;
@@ -6256,6 +6439,25 @@
6256
6439
  element.style.setProperty(key, value, "important");
6257
6440
  }
6258
6441
  }
6442
+ #recreateRenderCanvas() {
6443
+ const renderCanvas = this.renderCanvas;
6444
+ if (!renderCanvas) {
6445
+ return;
6446
+ }
6447
+ if (this.domElement) {
6448
+ return;
6449
+ }
6450
+ this.renderCanvas = new OffscreenCanvas(renderCanvas.width, renderCanvas.height);
6451
+ }
6452
+ #removeHdrListeners() {
6453
+ if (!this.#hdrMediaListeners) {
6454
+ return;
6455
+ }
6456
+ for (const { handler, mql } of this.#hdrMediaListeners) {
6457
+ mql.removeEventListener("change", handler);
6458
+ }
6459
+ this.#hdrMediaListeners = undefined;
6460
+ }
6259
6461
  #repairStyle() {
6260
6462
  const element = this.domElement;
6261
6463
  if (!element) {
@@ -6640,9 +6842,9 @@
6640
6842
  }
6641
6843
  getOpacity() {
6642
6844
  const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, baseOpacity = getRangeValue(this.opacity?.value ?? defaultOpacity$2), modifierOpacity = this.#applyModifiers(undefined, m => m.opacity), opacity = modifierOpacity ?? baseOpacity, fillOpacity = this.fillOpacity ?? defaultOpacity$2, strokeOpacity = this.strokeOpacity ?? defaultOpacity$2;
6643
- this.#cachedOpacityData.fillOpacity = opacity * fillOpacity * zOpacityFactor;
6845
+ this.#cachedOpacityData.fillOpacity = fillOpacity;
6644
6846
  this.#cachedOpacityData.opacity = opacity * zOpacityFactor;
6645
- this.#cachedOpacityData.strokeOpacity = opacity * strokeOpacity * zOpacityFactor;
6847
+ this.#cachedOpacityData.strokeOpacity = strokeOpacity;
6646
6848
  return this.#cachedOpacityData;
6647
6849
  }
6648
6850
  getPosition() {
@@ -7497,6 +7699,7 @@
7497
7699
  effectDrawers;
7498
7700
  fpsLimit;
7499
7701
  hdr;
7702
+ hdrMode;
7500
7703
  id;
7501
7704
  pageHidden;
7502
7705
  particleCreatedPlugins;
@@ -7504,6 +7707,7 @@
7504
7707
  particlePositionPlugins;
7505
7708
  particleUpdaters;
7506
7709
  particles;
7710
+ peakNits;
7507
7711
  plugins;
7508
7712
  retina;
7509
7713
  shapeDrawers;
@@ -7534,6 +7738,8 @@
7534
7738
  this.id = Symbol(id);
7535
7739
  this.fpsLimit = 120;
7536
7740
  this.hdr = false;
7741
+ this.hdrMode = exports.HdrMode.standard;
7742
+ this.peakNits = 400;
7537
7743
  this.#smooth = false;
7538
7744
  this.#delay = 0;
7539
7745
  this.#duration = 0;
@@ -7673,8 +7879,9 @@
7673
7879
  this.updateActualOptions();
7674
7880
  this.canvas.initBackground();
7675
7881
  this.canvas.resize();
7676
- const { delay, duration, fpsLimit, hdr, smooth, zLayers } = this.actualOptions;
7677
- this.hdr = hdr;
7882
+ const { delay, duration, fpsLimit, smooth, zLayers } = this.actualOptions, hdrOptions = this.actualOptions.hdr;
7883
+ this.hdrMode = hdrOptions.mode;
7884
+ this.peakNits = hdrOptions.peakNits;
7678
7885
  this.zLayers = zLayers;
7679
7886
  this.#duration = getRangeValue(duration) * millisecondsToSeconds;
7680
7887
  this.#delay = getRangeValue(delay) * millisecondsToSeconds;
@@ -8688,6 +8895,7 @@
8688
8895
  exports.ColorAnimation = ColorAnimation;
8689
8896
  exports.Fill = Fill;
8690
8897
  exports.FullScreen = FullScreen;
8898
+ exports.HDROptions = HDROptions;
8691
8899
  exports.HslAnimation = HslAnimation;
8692
8900
  exports.Move = Move;
8693
8901
  exports.MoveAngle = MoveAngle;