@tsparticles/engine 4.0.0-alpha.26 → 4.0.0-alpha.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/164.min.js +1 -0
  2. package/README.md +39 -5
  3. package/browser/Core/Canvas.js +7 -4
  4. package/browser/Core/Engine.js +8 -1
  5. package/browser/Core/Interfaces/IPalette.js +1 -0
  6. package/browser/Core/Particle.js +8 -12
  7. package/browser/Core/Utils/Constants.js +1 -1
  8. package/browser/Options/Classes/ColorAnimation.js +11 -1
  9. package/browser/Options/Classes/HslAnimation.js +4 -3
  10. package/browser/Options/Classes/Options.js +38 -1
  11. package/browser/Options/Classes/Particles/Effect/Effect.js +0 -5
  12. package/browser/Options/Classes/Particles/Fill.js +28 -0
  13. package/browser/Options/Classes/Particles/ParticlesOptions.js +12 -6
  14. package/browser/Options/Classes/Particles/Shape/Shape.js +0 -5
  15. package/browser/Options/Interfaces/Particles/IFill.js +1 -0
  16. package/browser/Utils/CanvasUtils.js +5 -5
  17. package/browser/Utils/ColorUtils.js +22 -19
  18. package/browser/Utils/Utils.js +86 -13
  19. package/browser/exports.js +1 -0
  20. package/cjs/Core/Canvas.js +7 -4
  21. package/cjs/Core/Engine.js +8 -1
  22. package/cjs/Core/Interfaces/IPalette.js +1 -0
  23. package/cjs/Core/Particle.js +8 -12
  24. package/cjs/Core/Utils/Constants.js +1 -1
  25. package/cjs/Options/Classes/ColorAnimation.js +11 -1
  26. package/cjs/Options/Classes/HslAnimation.js +4 -3
  27. package/cjs/Options/Classes/Options.js +38 -1
  28. package/cjs/Options/Classes/Particles/Effect/Effect.js +0 -5
  29. package/cjs/Options/Classes/Particles/Fill.js +28 -0
  30. package/cjs/Options/Classes/Particles/ParticlesOptions.js +12 -6
  31. package/cjs/Options/Classes/Particles/Shape/Shape.js +0 -5
  32. package/cjs/Options/Interfaces/Particles/IFill.js +1 -0
  33. package/cjs/Utils/CanvasUtils.js +5 -5
  34. package/cjs/Utils/ColorUtils.js +22 -19
  35. package/cjs/Utils/Utils.js +86 -13
  36. package/cjs/exports.js +1 -0
  37. package/dist_browser_Core_Container_js.js +3 -3
  38. package/esm/Core/Canvas.js +7 -4
  39. package/esm/Core/Engine.js +8 -1
  40. package/esm/Core/Interfaces/IPalette.js +1 -0
  41. package/esm/Core/Particle.js +8 -12
  42. package/esm/Core/Utils/Constants.js +1 -1
  43. package/esm/Options/Classes/ColorAnimation.js +11 -1
  44. package/esm/Options/Classes/HslAnimation.js +4 -3
  45. package/esm/Options/Classes/Options.js +38 -1
  46. package/esm/Options/Classes/Particles/Effect/Effect.js +0 -5
  47. package/esm/Options/Classes/Particles/Fill.js +28 -0
  48. package/esm/Options/Classes/Particles/ParticlesOptions.js +12 -6
  49. package/esm/Options/Classes/Particles/Shape/Shape.js +0 -5
  50. package/esm/Options/Interfaces/Particles/IFill.js +1 -0
  51. package/esm/Utils/CanvasUtils.js +5 -5
  52. package/esm/Utils/ColorUtils.js +22 -19
  53. package/esm/Utils/Utils.js +86 -13
  54. package/esm/exports.js +1 -0
  55. package/package.json +1 -1
  56. package/report.html +1 -1
  57. package/scripts/install.js +2 -18
  58. package/tsparticles.engine.js +30 -20
  59. package/tsparticles.engine.min.js +2 -2
  60. package/types/Core/Engine.d.ts +4 -0
  61. package/types/Core/Interfaces/IPalette.d.ts +7 -0
  62. package/types/Core/Interfaces/IParticleOpacityData.d.ts +1 -0
  63. package/types/Core/Interfaces/IParticleValueAnimation.d.ts +3 -3
  64. package/types/Core/Interfaces/IShapeValues.d.ts +0 -1
  65. package/types/Core/Particle.d.ts +3 -3
  66. package/types/Core/Utils/Constants.d.ts +1 -1
  67. package/types/Options/Classes/ColorAnimation.d.ts +3 -1
  68. package/types/Options/Classes/Options.d.ts +2 -0
  69. package/types/Options/Classes/Particles/Effect/Effect.d.ts +0 -1
  70. package/types/Options/Classes/Particles/Fill.d.ts +12 -0
  71. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +2 -2
  72. package/types/Options/Classes/Particles/Shape/Shape.d.ts +0 -1
  73. package/types/Options/Interfaces/IColorAnimation.d.ts +2 -0
  74. package/types/Options/Interfaces/IOptions.d.ts +1 -0
  75. package/types/Options/Interfaces/Particles/Effect/IEffect.d.ts +0 -1
  76. package/types/Options/Interfaces/Particles/IFill.d.ts +9 -0
  77. package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +2 -2
  78. package/types/Options/Interfaces/Particles/IStroke.d.ts +2 -2
  79. package/types/Options/Interfaces/Particles/Shape/IShape.d.ts +0 -1
  80. package/types/Utils/ColorUtils.d.ts +1 -2
  81. package/types/Utils/Utils.d.ts +7 -0
  82. package/types/export-types.d.ts +2 -1
  83. package/types/exports.d.ts +1 -0
  84. package/umd/Core/Canvas.js +6 -3
  85. package/umd/Core/Engine.js +8 -1
  86. package/umd/Core/Interfaces/IPalette.js +12 -0
  87. package/umd/Core/Particle.js +8 -12
  88. package/umd/Core/Utils/Constants.js +2 -2
  89. package/umd/Options/Classes/ColorAnimation.js +11 -1
  90. package/umd/Options/Classes/HslAnimation.js +5 -4
  91. package/umd/Options/Classes/Options.js +38 -1
  92. package/umd/Options/Classes/Particles/Effect/Effect.js +0 -5
  93. package/umd/Options/Classes/Particles/Fill.js +42 -0
  94. package/umd/Options/Classes/Particles/ParticlesOptions.js +13 -7
  95. package/umd/Options/Classes/Particles/Shape/Shape.js +0 -5
  96. package/umd/Options/Interfaces/Particles/IFill.js +12 -0
  97. package/umd/Utils/CanvasUtils.js +5 -5
  98. package/umd/Utils/ColorUtils.js +21 -18
  99. package/umd/Utils/Utils.js +87 -13
  100. package/umd/exports.js +2 -1
  101. package/622.min.js +0 -1
@@ -8,16 +8,70 @@ import { OutModeDirection } from "../Enums/Directions/OutModeDirection.js";
8
8
  import { PixelMode } from "../Enums/Modes/PixelMode.js";
9
9
  import { StartValueType } from "../Enums/Types/StartValueType.js";
10
10
  import { Vector } from "../Core/Utils/Vectors.js";
11
- const minRadius = 0;
12
- function memoize(fn) {
13
- const cache = new Map();
11
+ const minRadius = 0, minMemoizeSize = 0;
12
+ export function memoize(fn, options) {
13
+ const cache = new Map(), maxSize = options?.maxSize, ttlMs = options?.ttlMs, keyFn = options?.keyFn, stableStringify = (obj, seen = new WeakSet()) => {
14
+ if (obj === null) {
15
+ return "null";
16
+ }
17
+ const t = typeof obj;
18
+ if (t === "undefined") {
19
+ return "undefined";
20
+ }
21
+ if (t === "number" || t === "boolean" || t === "string") {
22
+ return JSON.stringify(obj);
23
+ }
24
+ if (t === "function") {
25
+ try {
26
+ const fn = obj;
27
+ return fn.toString();
28
+ }
29
+ catch {
30
+ return '"[Function]"';
31
+ }
32
+ }
33
+ if (t === "symbol") {
34
+ try {
35
+ return obj.toString();
36
+ }
37
+ catch {
38
+ return '"[Symbol]"';
39
+ }
40
+ }
41
+ if (Array.isArray(obj)) {
42
+ return `[${obj.map(i => stableStringify(i, seen)).join(",")}]`;
43
+ }
44
+ if (seen.has(obj)) {
45
+ return '"[Circular]"';
46
+ }
47
+ seen.add(obj);
48
+ const keys = Object.keys(obj).sort();
49
+ return `{${keys.map(k => `${JSON.stringify(k)}:${stableStringify(obj[k], seen)}`).join(",")}}`;
50
+ }, defaultKeyer = (args) => stableStringify(args), makeKey = (args) => (keyFn ? keyFn(args) : defaultKeyer(args)), ensureBounds = () => {
51
+ if (typeof maxSize === "number" && maxSize >= minMemoizeSize) {
52
+ while (cache.size > maxSize) {
53
+ const firstKey = cache.keys().next().value;
54
+ if (firstKey === undefined)
55
+ break;
56
+ cache.delete(firstKey);
57
+ }
58
+ }
59
+ };
14
60
  return (...args) => {
15
- const key = JSON.stringify(args);
16
- if (cache.has(key)) {
17
- return cache.get(key);
61
+ const key = makeKey(args), now = Date.now(), entry = cache.get(key);
62
+ if (entry !== undefined) {
63
+ if (ttlMs && now - entry.ts > ttlMs) {
64
+ cache.delete(key);
65
+ }
66
+ else {
67
+ cache.delete(key);
68
+ cache.set(key, { value: entry.value, ts: entry.ts });
69
+ return entry.value;
70
+ }
18
71
  }
19
72
  const result = fn(...args);
20
- cache.set(key, result);
73
+ cache.set(key, { value: result, ts: now });
74
+ ensureBounds();
21
75
  return result;
22
76
  };
23
77
  }
@@ -98,8 +152,27 @@ export function deepExtend(destination, ...sources) {
98
152
  else if (!isObject(destination) || Array.isArray(destination)) {
99
153
  destination = {};
100
154
  }
101
- for (const key of Object.keys(source)) {
102
- if (key === "__proto__" || key === "constructor" || key === "prototype") {
155
+ const sourceKeys = Object.keys(source), dangerousKeys = new Set(["__proto__", "constructor", "prototype"]), hasNested = sourceKeys.some(k => {
156
+ const v = source[k];
157
+ return isObject(v) || Array.isArray(v);
158
+ });
159
+ if (!hasNested) {
160
+ const sourceDict = source, destDict = destination;
161
+ for (const key of sourceKeys) {
162
+ if (dangerousKeys.has(key)) {
163
+ continue;
164
+ }
165
+ if (key in sourceDict) {
166
+ const v = sourceDict[key];
167
+ if (v !== undefined) {
168
+ destDict[key] = v;
169
+ }
170
+ }
171
+ }
172
+ continue;
173
+ }
174
+ for (const key of sourceKeys) {
175
+ if (dangerousKeys.has(key)) {
103
176
  continue;
104
177
  }
105
178
  const sourceDict = source, destDict = destination, value = sourceDict[key];
@@ -297,7 +370,7 @@ export function cloneStyle(style) {
297
370
  const clonedStyle = safeDocument().createElement("div").style;
298
371
  for (const key in style) {
299
372
  const styleKey = style[key];
300
- if (!Object.hasOwn(style, key) || isNull(styleKey)) {
373
+ if (!(key in style) || isNull(styleKey)) {
301
374
  continue;
302
375
  }
303
376
  const styleValue = style.getPropertyValue?.(styleKey);
@@ -305,11 +378,11 @@ export function cloneStyle(style) {
305
378
  continue;
306
379
  }
307
380
  const stylePriority = style.getPropertyPriority?.(styleKey);
308
- if (!stylePriority) {
309
- clonedStyle.setProperty(styleKey, styleValue);
381
+ if (stylePriority) {
382
+ clonedStyle.setProperty(styleKey, styleValue, stylePriority);
310
383
  }
311
384
  else {
312
- clonedStyle.setProperty(styleKey, styleValue, stylePriority);
385
+ clonedStyle.setProperty(styleKey, styleValue);
313
386
  }
314
387
  }
315
388
  return clonedStyle;
package/esm/exports.js CHANGED
@@ -27,6 +27,7 @@ export * from "./Options/Classes/OptionsColor.js";
27
27
  export * from "./Options/Classes/Particles/Bounce/ParticlesBounce.js";
28
28
  export * from "./Options/Classes/Particles/Bounce/ParticlesBounceFactor.js";
29
29
  export * from "./Options/Classes/Particles/ParticlesOptions.js";
30
+ export * from "./Options/Classes/Particles/Fill.js";
30
31
  export * from "./Options/Classes/Particles/Stroke.js";
31
32
  export * from "./Options/Classes/Particles/Move/Move.js";
32
33
  export * from "./Options/Classes/Particles/Move/MoveAngle.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsparticles/engine",
3
- "version": "4.0.0-alpha.26",
3
+ "version": "4.0.0-alpha.28",
4
4
  "description": "Easily create highly customizable particle, confetti and fireworks animations and use them as animated backgrounds for your website. Ready to use components available also for React, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Riot.js, Inferno.",
5
5
  "homepage": "https://particles.js.org",
6
6
  "scripts": {
package/report.html CHANGED
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8"/>
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
6
- <title>@tsparticles/engine [26 Feb 2026 at 17:54]</title>
6
+ <title>@tsparticles/engine [15 Mar 2026 at 13:46]</title>
7
7
  <link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABrVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+O1foceMD///+J0/qK1Pr7/v8Xdr/9///W8P4UdL7L7P0Scr2r4Pyj3vwad8D5/f/2/f+55f3E6f34+/2H0/ojfMKpzOd0rNgQcb3F3O/j9f7c8v6g3Pz0/P/w+v/q+P7n9v6T1/uQ1vuE0vqLut/y+v+Z2fvt+f+15Pzv9fuc2/vR7v2V2Pvd6/bg9P7I6/285/2y4/yp3/zp8vk8i8kqgMT7/P31+fyv4vxGkcz6/P6/6P3j7vfS5PNnpNUxhcbO7f7F6v3O4vHK3/DA2u631Ouy0eqXweKJud5wqthfoNMMbLvY8f73+v2dxeR8sNtTmdDx9/zX6PSjyeaCtd1YnNGX2PuQveCGt95Nls42h8dLlM3F4vBtAAAAM3RSTlMAAyOx0/sKBvik8opWGBMOAe3l1snDm2E9LSb06eHcu5JpHbarfHZCN9CBb08zzkdNS0kYaptYAAAFV0lEQVRYw92X51/aYBDHHS2O2qqttVbrqNq9m+TJIAYIShBkWwqIiCgoWvfeq7Z2/s29hyQNyUcR7LveGwVyXy6XH8/9rqxglLfUPLxVduUor3h0rfp2TYvpivk37929TkG037hffoX0+peVtZQc1589rigVUdXS/ABSAyEmGIO/1XfvldSK8vs3OqB6u3m0nxmIrvgB0dj7rr7Y9IbuF68hnfFaiHA/sxqm0wciIG43P60qKv9WXWc1RXGh/mFESFABTSBi0sNAKzqet17eCtOb3kZIDwxEEU0oAIJGYxNBDhBND29e0rtXXbcpuPmED9IhEAAQ/AXEaF8EPmnrrKsv0LvWR3fg5sWDNAFZOgAgaKvZDogHNU9MFwnnYROkc56RD5CjAbQX9Ow4g7upCsvYu55aSI/Nj0H1akgKQEUM94dwK65hYRmFU9MIcH/fqJYOZYcnuJSU/waKDgTOEVaVKhwrTRP5XzgSpAITYzom7UvkhFX5VutmxeNnWDjjswTKTyfgluNDGbUpWissXhF3s7mlSml+czWkg3D0l1nNjGNjz3myOQOa1KM/jOS6ebdbAVTCi4gljHSFrviza7tOgRWcS0MOUX9zdNgag5w7rRqA44Lzw0hr1WqES36dFliSJFlh2rXIae3FFcDDgKdxrUIDePr8jGcSClV1u7A9xeN0ModY/pHMxmR1EzRh8TJiwqsHmKW0l4FCEZI+jHio+JdPPE9qwQtTRxku2D8sIeRL2LnxWSllANCQGOIiqVHAz2ye2JR0DcH+HoxDkaADLjgxjKQ+AwCX/g0+DNgdG0ukYCONAe+dbc2IAc6fwt1ARoDSezNHxV2Cmzwv3O6lDMV55edBGwGK9n1+x2F8EDfAGCxug8MhpsMEcTEAWf3rx2vZhe/LAmtIn/6apE6PN0ULKgywD9mmdxbmFl3OvD5AS5fW5zLbv/YHmcsBTjf/afDz3MaZTVCfAP9z6/Bw6ycv8EUBWJIn9zYcoAWWlW9+OzO3vkTy8H+RANLmdrpOuYWdZYEXpo+TlCJrW5EARb7fF+bWdqf3hhyZI1nWJQHgznErZhbjoEsWqi8dQNoE294aldzFurwSABL2XXMf9+H1VQGke9exw5P/AnA5Pv5ngMul7LOvO922iwACu8WkCwLCafvM4CeWPxfA8lNHcWZSoi8EwMAIciKX2Z4SWCMAa3snCZ/G4EA8D6CMLNFsGQhkkz/gQNEBbPCbWsxGUpYVu3z8IyNAknwJkfPMEhLyrdi5RTyUVACkw4GSFRNWJNEW+fgPGwHD8/JxnRuLabN4CGNRkAE23na2+VmEAUmrYymSGjMAYqH84YUIyzgzs3XC7gNgH36Vcc4zKY9o9fgPBXUAiHHwVboBHGLiX6Zcjp1f2wu4tvzZKo0ecPnDtQYDQvJXaBeNzce45Fp28ZQLrEZVuFqgBwOalArKXnW1UzlnSusQKJqKYNuz4tOnI6sZG4zanpemv+7ySU2jbA9h6uhcgpfy6G2PahirDZ6zvq6zDduMVFTKvzw8wgyEdelwY9in3XkEPs3osJuwRQ4qTkfzifndg9Gfc4pdsu82+tTnHZTBa2EAMrqr2t43pguc8tNm7JQVQ2S0ukj2d22dhXYP0/veWtwKrCkNoNimAN5+Xr/oLrxswKbVJjteWrX7eR63o4j9q0GxnaBdWgGA5VStpanIjQmEhV0/nVt5VOFUvix6awJhPcAaTEShgrG+iGyvb5a0Ndb1YGHFPEwoqAinoaykaID1o1pdPNu7XsnCKQ3R+hwWIIhGvORcJUBYXe3Xa3vq/mF/N9V13ugufMkfXn+KHsRD0B8AAAAASUVORK5CYII=" type="image/x-icon" />
8
8
 
9
9
  <script>
@@ -8,7 +8,6 @@ async function checkErrors() {
8
8
  reactParticlesJsFoundError = "react-particles-js-found",
9
9
  reactParticlesFoundError = "react-particles-found",
10
10
  reactTsParticlesFoundError = "react-tsparticles-found",
11
- svelteParticlesFoundError = "svelte-particles-found",
12
11
  vue2ParticlesFoundError = "vue2-particles-found",
13
12
  vue3ParticlesFoundError = "vue3-particles-found";
14
13
 
@@ -187,20 +186,6 @@ async function checkErrors() {
187
186
  }
188
187
 
189
188
  if (dependencies["svelte"]) {
190
- if (dependencies["svelte-particles"]) {
191
- console.error(
192
- "\x1b[31m%s\x1b[0m",
193
- "The package svelte-particles has been deprecated and is not supported anymore."
194
- );
195
- console.error("\x1b[31m%s\x1b[0m", "Please consider switching to @tsparticles/svelte package.");
196
- console.error(
197
- "\x1b[31m%s\x1b[0m",
198
- "This error will be fixed once svelte-particles is removed from the package.json file."
199
- );
200
-
201
- throw new Error(svelteParticlesFoundError);
202
- }
203
-
204
189
  if (!dependencies["@tsparticles/svelte"]) {
205
190
  console.warn(
206
191
  "\x1b[43m\x1b[30m%s\x1b[0m",
@@ -254,8 +239,7 @@ async function checkErrors() {
254
239
  error.message === reactTsParticlesFoundError ||
255
240
  error.message === angularParticlesFoundError ||
256
241
  error.message === vue2ParticlesFoundError ||
257
- error.message === vue3ParticlesFoundError ||
258
- error.message === svelteParticlesFoundError
242
+ error.message === vue3ParticlesFoundError
259
243
  ) {
260
244
  throw error;
261
245
  }
@@ -264,4 +248,4 @@ async function checkErrors() {
264
248
  }
265
249
  }
266
250
 
267
- checkErrors();
251
+ checkErrors();