diff --git a/demo/vanilla/public/javascripts/canvas.js b/demo/vanilla/public/javascripts/canvas.js
index 3e57008a80f..614195eaa9c 100644
--- a/demo/vanilla/public/javascripts/canvas.js
+++ b/demo/vanilla/public/javascripts/canvas.js
@@ -2,7 +2,7 @@ document.addEventListener("DOMContentLoaded", async () => {
const end = performance.now() + 15 * 1000,
colors = ["#bb0000", "#ffffff"],
canvas = document.getElementById("canvas"),
- fetti = async options => await confetti.create(canvas, options),
+ fetti = await confetti.create(canvas),
fworks = async options => await fireworks.create(canvas, options),
prtcls = async options => await particles.create(canvas, options),
standard = async options =>
diff --git a/nx.json b/nx.json
index 5ebe2df5b15..9ffa4f6bd6d 100644
--- a/nx.json
+++ b/nx.json
@@ -83,6 +83,7 @@
],
"production": [
"{projectRoot}/src/**/*",
+ "{projectRoot}/index.*",
"{projectRoot}/package.json",
"{projectRoot}/tsconfig*.json",
"sharedGlobals"
diff --git a/websites/confetti/src/main.js b/websites/confetti/src/main.js
index 7bd7e5b6575..2c2e5b78da0 100644
--- a/websites/confetti/src/main.js
+++ b/websites/confetti/src/main.js
@@ -683,7 +683,7 @@ const modes = [
},
],
fn: function () {
- var defaults = {
+ const defaults = {
scalar: 2,
spread: 270,
particleCount: 25,
@@ -738,11 +738,11 @@ const modes = [
(async () => {
const canvas = document.getElementById('my-canvas');
- canvas.confetti = canvas.confetti || (await confetti.create(canvas, { resize: true }));
+ canvas.confetti = canvas.confetti || (await confetti.create(canvas, {}));
canvas.confetti({
spread: 70,
- origin: { y: 1.2 },
+ origin: { y: 0.5 },
});
})();
},
@@ -805,10 +805,13 @@ function getCode(name) {
return pretty(code);
}
-document.addEventListener('DOMContentLoaded', () => {
+document.addEventListener('DOMContentLoaded', async () => {
+ await confetti.init();
+
updateShareLinks();
updateShareOrder();
setupShareActions();
+
window.addEventListener('resize', updateShareOrder);
Array.from(document.querySelectorAll('.html-group')).forEach(function (group) {
diff --git a/websites/website/.gitignore b/websites/website/.gitignore
index 087e83120cc..6826793b830 100644
--- a/websites/website/.gitignore
+++ b/websites/website/.gitignore
@@ -21,6 +21,7 @@ mono_crash.*
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
+!docs/releases/
x64/
x86/
[Aa][Rr][Mm]/
diff --git a/websites/website/docs/public/tsParticles-64.png b/websites/website/docs/public/tsParticles-64.png
new file mode 100644
index 00000000000..538ba26378b
Binary files /dev/null and b/websites/website/docs/public/tsParticles-64.png differ
diff --git a/websites/website/docs/releases/index.md b/websites/website/docs/releases/index.md
new file mode 100644
index 00000000000..ae8044f3a20
--- /dev/null
+++ b/websites/website/docs/releases/index.md
@@ -0,0 +1,26 @@
+# Releases and Versioning
+
+This project now ships from a single repository: `tsparticles/tsparticles`.
+
+
+
+## Where release work happens
+
+- Monorepo root:
+- Bundles:
+- Engine:
+- Wrappers:
+- Presets:
+- Palettes:
+
+## Version alignment rule
+
+- Keep all `@tsparticles/*` packages aligned to the same release line.
+- Avoid mixing different beta lines or major versions in one app.
+
+## Practical release checklist
+
+1. Verify target package versions in workspace `package.json` files.
+2. Build and test affected projects.
+3. Validate docs links and playground behavior.
+4. Publish from the monorepo release flow.
diff --git a/websites/website/package.json b/websites/website/package.json
index 19ea02245e8..fb145464ffb 100644
--- a/websites/website/package.json
+++ b/websites/website/package.json
@@ -254,7 +254,8 @@
"nx": {
"targets": {
"build": {
- "outputs": ["{projectRoot}/docs/.vitepress/dist"]
+ "outputs": ["{projectRoot}/docs/.vitepress/dist"],
+ "inputs": ["production", "^production", "{projectRoot}/docs/**/*"]
}
}
}
diff --git a/websites/website/scripts/sync-public-assets.mjs b/websites/website/scripts/sync-public-assets.mjs
index 7c917f0f2a6..6d780bb9ebb 100644
--- a/websites/website/scripts/sync-public-assets.mjs
+++ b/websites/website/scripts/sync-public-assets.mjs
@@ -7,6 +7,8 @@ const rootDir = resolve(__dirname, "..");
const docsPublicDir = resolve(rootDir, "docs", "public");
const rootCname = resolve(rootDir, "CNAME");
const docsCname = resolve(docsPublicDir, "CNAME");
+const iconName = resolve(rootDir, "tsParticles-64.png");
+const docsIconName = resolve(docsPublicDir, "tsParticles-64.png");
const assetsToSync = ["audio", "images", "videos"];
@@ -28,5 +30,8 @@ if (existsSync(rootCname)) {
cpSync(rootCname, docsCname);
}
-console.log(`[assets] synced ${assetsToSync.join(", ")} to docs/public`);
+if (existsSync(iconName)) {
+ cpSync(iconName, docsIconName);
+}
+console.log(`[assets] synced ${assetsToSync.join(", ")} to docs/public`);
diff --git a/wrappers/angular-confetti/package.json b/wrappers/angular-confetti/package.json
index dfe8416f023..046658e1d91 100644
--- a/wrappers/angular-confetti/package.json
+++ b/wrappers/angular-confetti/package.json
@@ -137,6 +137,13 @@
"prettier": "^3.8.3",
"typescript": "~5.9.3"
},
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/projects/**/src/**/*"]
+ }
+ }
+ },
"module": "dist/ng-confetti/fesm2015/ng-confetti.mjs",
"es2020": "dist/ng-confetti/fesm2020/ng-confetti.mjs",
"esm2020": "dist/ng-confetti/esm2020/ng-confetti.mjs",
diff --git a/wrappers/angular-fireworks/package.json b/wrappers/angular-fireworks/package.json
index 7167d9d11ae..4828752e90f 100644
--- a/wrappers/angular-fireworks/package.json
+++ b/wrappers/angular-fireworks/package.json
@@ -130,6 +130,13 @@
"prettier": "^3.8.3",
"typescript": "~5.9.3"
},
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/projects/**/src/**/*"]
+ }
+ }
+ },
"module": "dist/ng-fireworks/fesm2015/ng-fireworks.mjs",
"es2020": "dist/ng-fireworks/fesm2020/ng-fireworks.mjs",
"esm2020": "dist/ng-fireworks/esm2020/ng-fireworks.mjs",
diff --git a/wrappers/angular/package.json b/wrappers/angular/package.json
index 391206e2bce..1cc2a51230c 100644
--- a/wrappers/angular/package.json
+++ b/wrappers/angular/package.json
@@ -110,6 +110,13 @@
"prettier": "^3.8.3",
"typescript": "~5.9.3"
},
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/projects/**/src/**/*"]
+ }
+ }
+ },
"module": "dist/ng-particles/fesm2015/ng-particles.mjs",
"es2020": "dist/ng-particles/fesm2020/ng-particles.mjs",
"esm2020": "dist/ng-particles/esm2020/ng-particles.mjs",
diff --git a/wrappers/astro/package.json b/wrappers/astro/package.json
index 977786a18f2..00c02864f0d 100644
--- a/wrappers/astro/package.json
+++ b/wrappers/astro/package.json
@@ -118,6 +118,13 @@
"prettier-plugin-astro": "^0.14.1",
"typescript": "^5.9.3"
},
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/index.ts"]
+ }
+ }
+ },
"publishConfig": {
"access": "public"
}
diff --git a/wrappers/ember/package.json b/wrappers/ember/package.json
index 3314a24cbe6..f80671b3ce0 100644
--- a/wrappers/ember/package.json
+++ b/wrappers/ember/package.json
@@ -111,6 +111,13 @@
"ember": {
"edition": "octane"
},
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/addon/**/*", "{projectRoot}/app/**/*", "{projectRoot}/config/**/*", "{projectRoot}/index.js"]
+ }
+ }
+ },
"ember-addon": {
"configPath": "tests/dummy/config"
},
diff --git a/wrappers/nextjs/package.json b/wrappers/nextjs/package.json
index d5748c72079..1cb5fce96fa 100644
--- a/wrappers/nextjs/package.json
+++ b/wrappers/nextjs/package.json
@@ -53,6 +53,13 @@
"vite": "^8.0.8",
"vite-plugin-dts": "^4.5.4"
},
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/lib/**/*"]
+ }
+ }
+ },
"publishConfig": {
"access": "public"
}
diff --git a/wrappers/nuxt2/package.json b/wrappers/nuxt2/package.json
index d159caada68..67da4ce2535 100644
--- a/wrappers/nuxt2/package.json
+++ b/wrappers/nuxt2/package.json
@@ -37,6 +37,13 @@
"globals": "^17.5.0",
"typescript": "^6.0.2"
},
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/lib/**/*"]
+ }
+ }
+ },
"publishConfig": {
"access": "public"
}
diff --git a/wrappers/nuxt3/package.json b/wrappers/nuxt3/package.json
index c6fcb565341..23cadeaa79c 100644
--- a/wrappers/nuxt3/package.json
+++ b/wrappers/nuxt3/package.json
@@ -44,6 +44,13 @@
"globals": "^17.5.0",
"typescript": "^6.0.2"
},
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/lib/**/*"]
+ }
+ }
+ },
"publishConfig": {
"access": "public"
}
diff --git a/wrappers/nuxt4/package.json b/wrappers/nuxt4/package.json
index 3548e52cc05..3e3deb5f6a2 100644
--- a/wrappers/nuxt4/package.json
+++ b/wrappers/nuxt4/package.json
@@ -45,6 +45,13 @@
"nuxt": "^4.4.2",
"typescript": "^6.0.2"
},
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/lib/**/*"]
+ }
+ }
+ },
"publishConfig": {
"access": "public"
}
diff --git a/wrappers/preact/package.json b/wrappers/preact/package.json
index d33fadeb085..5ee0e296ecf 100644
--- a/wrappers/preact/package.json
+++ b/wrappers/preact/package.json
@@ -83,6 +83,13 @@
"license": "MIT",
"homepage": "https://particles.js.org",
"prettier": "@tsparticles/prettier-config",
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/src/**/*", "{projectRoot}/index.*"]
+ }
+ }
+ },
"publishConfig": {
"access": "public"
},
diff --git a/wrappers/react/package.json b/wrappers/react/package.json
index 882c083028a..b01f986c049 100644
--- a/wrappers/react/package.json
+++ b/wrappers/react/package.json
@@ -52,6 +52,13 @@
"vite-plugin-dts": "^4.5.4",
"vite-plugin-lib-inject-css": "^2.2.2"
},
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/lib/**/*"]
+ }
+ }
+ },
"publishConfig": {
"access": "public"
}
diff --git a/wrappers/svelte/CHANGELOG.md b/wrappers/svelte/CHANGELOG.md
index 29e161c2a85..eb0c627d8ba 100644
--- a/wrappers/svelte/CHANGELOG.md
+++ b/wrappers/svelte/CHANGELOG.md
@@ -7,10 +7,6 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
**Note:** Version bump only for package @tsparticles/svelte
-
-
-
-
# [4.0.0-beta.15](https://github.com/tsparticles/tsparticles/compare/v4.0.0-beta.14...v4.0.0-beta.15) (2026-05-09)
**Note:** Version bump only for package @tsparticles/svelte
diff --git a/wrappers/webcomponents/package.json b/wrappers/webcomponents/package.json
index 59945e9439d..a5cdfa0b30e 100644
--- a/wrappers/webcomponents/package.json
+++ b/wrappers/webcomponents/package.json
@@ -94,6 +94,13 @@
"prepack": "pnpm run build"
},
"prettier": "@tsparticles/prettier-config",
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/src/**/*", "{projectRoot}/build.ts"]
+ }
+ }
+ },
"dependencies": {
"@tsparticles/engine": "workspace:^"
},
diff --git a/wrappers/wordpress/package.json b/wrappers/wordpress/package.json
index b44f440cb0b..76370b1ec48 100644
--- a/wrappers/wordpress/package.json
+++ b/wrappers/wordpress/package.json
@@ -32,6 +32,13 @@
"publishConfig": {
"access": "public"
},
+ "nx": {
+ "targets": {
+ "build": {
+ "inputs": ["production", "^production", "{projectRoot}/src/**/*", "{projectRoot}/wordpress-particles.php", "{projectRoot}/readme.txt"]
+ }
+ }
+ },
"dependencies": {
"@tsparticles/all": "workspace:^",
"@tsparticles/basic": "workspace:^",